From 7b32b0fc0b59e9552d6f55d615f400a26d5f1903 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Sun, 22 Oct 2023 19:36:55 +0200 Subject: [PATCH 001/118] Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop --- .github/workflows/ci-default.yml | 2 + contracts/.gitignore | 1 + contracts/package.json | 24 ++-- contracts/src/index.ts | 1 - frontend/next.config.mjs | 1 - frontend/package.json | 4 +- pnpm-lock.yaml | 115 ++++++++++---------- sdk/package.json | 13 ++- sdk/{rollup.config.js => rollup.config.mjs} | 0 9 files changed, 87 insertions(+), 74 deletions(-) rename sdk/{rollup.config.js => rollup.config.mjs} (100%) diff --git a/.github/workflows/ci-default.yml b/.github/workflows/ci-default.yml index 6d05dd10..a7242d72 100644 --- a/.github/workflows/ci-default.yml +++ b/.github/workflows/ci-default.yml @@ -21,11 +21,13 @@ on: push: branches: - main + - develop # Or when a pull request event occurs for a pull request against one of the # matched branches. pull_request: branches: - main + - develop # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/contracts/.gitignore b/contracts/.gitignore index cd965d76..41c2623f 100644 --- a/contracts/.gitignore +++ b/contracts/.gitignore @@ -9,6 +9,7 @@ **/build **/cache **/coverage +**/contracts **/.coverage_artifacts **/.coverage_cache **/.coverage_contracts diff --git a/contracts/package.json b/contracts/package.json index 045e4139..a54becd4 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@hypercerts-org/contracts", "description": "EVM compatible protocol for managing impact claims", - "version": "0.8.7", + "version": "0.8.11", "author": { "name": "Hypercerts Foundation", "url": "https://github.com/hypercerts-org/hypercerts" @@ -17,10 +17,18 @@ "module": "./dist/esm/index.js", "types": "./dist/index.d.ts", "exports": { - "require": "./dist/cjs/index.js", - "import": "./dist/esm/index.js", - "types": "./dist/index.d.ts" + ".": { + "require": "./dist/cjs/index.js", + "import": "./dist/esm/index.js", + "types": "./dist/index.d.ts" + } }, + "files": [ + "dist", + "README.md", + "package.json", + "contracts" + ], "devDependencies": { "@commitlint/cli": "^17.1.2", "@commitlint/config-conventional": "^17.1.0", @@ -49,6 +57,7 @@ "@typescript-eslint/parser": "^5.38.0", "chai": "^4.3.7", "commitizen": "^4.2.5", + "copyfiles": "^2.4.1", "cross-env": "^7.0.3", "cz-conventional-changelog": "^3.3.0", "dotenv": "^16.0.2", @@ -88,14 +97,15 @@ "template" ], "scripts": { - "build": "pnpm clean && hardhat compile && pnpm tsc -p tsconfig.build.json && rollup -c", + "build": "hardhat compile && pnpm tsc -p tsconfig.build.json && rollup -c && pnpm copy:contracts", "build:forge": "forge build", - "build:hardhat": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat compile && pnpm build:declarations", - "build:declarations": "shx cp ./src/types/*.d.ts ./dist/index.d.ts", "clean": "rimraf cache out dist typechain abi", + "copy:contracts": "copyfiles -u 1 ./src/**/*.sol ./src/*.sol ./contracts", "docs": "hardhat dodoc", "lint": "pnpm lint:sol && pnpm prettier:check", "lint:sol": "solhint -w 5 \"./{src,test}/**/*.sol\"", + "prebuild": "pnpm clean", + "prepublish": "pnpm build", "prettier": "prettier --config \"./.prettierrc.yml\" --write \"**/*.{json,md,sol,yml}\"", "prettier:check": "prettier --config \"./.prettierrc.yml\" --check \"**/*.{json,md,sol,yml}\"", "slither": "slither ./src", diff --git a/contracts/src/index.ts b/contracts/src/index.ts index f24f6b7d..486b728b 100644 --- a/contracts/src/index.ts +++ b/contracts/src/index.ts @@ -5,7 +5,6 @@ import type { HypercertMinter } from "./types/src/HypercertMinter"; import type { IAllowlist } from "./types/src/interfaces/IAllowlist"; import type { IHypercertToken } from "./types/src/interfaces/IHypercertToken"; import type { Errors } from "./types/src/libs/Errors"; - /* in order to adjust the build folder: 1) import any files here you want in the final build package. diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs index c8d52715..beb093bd 100644 --- a/frontend/next.config.mjs +++ b/frontend/next.config.mjs @@ -15,7 +15,6 @@ const nextConfig = { config.resolve.fallback = { fs: false, net: false, tls: false }; return config; }, - transpilePackages: ["@hypercerts-org/sdk"], }; export default withSentryConfig( diff --git a/frontend/package.json b/frontend/package.json index 28f95301..975d0cff 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -22,9 +22,9 @@ "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@graphprotocol/client-cli": "^2.2.16", - "@hypercerts-org/contracts": "0.7.1", + "@hypercerts-org/contracts": "0.8.11", "@hypercerts-org/observabletreemap": "workspace: *", - "@hypercerts-org/sdk": "0.8.4", + "@hypercerts-org/sdk": "0.8.10", "@mui/icons-material": "^5.11.9", "@mui/material": "^5.11.2", "@mui/x-date-pickers": "^5.0.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 39adbe22..61a73b57 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -114,6 +114,9 @@ importers: commitizen: specifier: ^4.2.5 version: 4.3.0 + copyfiles: + specifier: ^2.4.1 + version: 2.4.1 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -324,14 +327,14 @@ importers: specifier: ^2.2.16 version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.5) '@hypercerts-org/contracts': - specifier: 0.7.1 - version: 0.7.1 + specifier: 0.8.11 + version: 0.8.11 '@hypercerts-org/observabletreemap': specifier: 'workspace: *' version: link:../vendor/observabletreemap '@hypercerts-org/sdk': - specifier: 0.8.4 - version: 0.8.4(@babel/core@7.23.2)(@envelop/core@3.0.6)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(mocha@10.2.0)(node-fetch@3.3.2)(react-native@0.72.5)(typescript@5.1.6)(uint8arraylist@2.4.3) + specifier: 0.8.10 + version: 0.8.10(@babel/core@7.23.2)(@envelop/core@3.0.6)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(node-fetch@3.3.2)(react-native@0.72.5)(typescript@5.1.6)(uint8arraylist@2.4.3) '@mui/icons-material': specifier: ^5.11.9 version: 5.14.13(@mui/material@5.14.13)(@types/react@18.2.28)(react@18.2.0) @@ -535,8 +538,8 @@ importers: specifier: ^2.2.15 version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.5) '@hypercerts-org/contracts': - specifier: 0.8.7 - version: 0.8.7 + specifier: 0.8.11 + version: 0.8.11 '@openzeppelin/merkle-tree': specifier: ^1.0.4 version: 1.0.5 @@ -7446,25 +7449,22 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@hypercerts-org/contracts@0.7.1: - resolution: {integrity: sha512-gJ+z9nW8aNO/HXLww58Y3jexsduPryeAJYoJf7mmTDPwBdbs9uJhl/7h+ln5I7aFeUI5Wyg7+zCI71PCG+mxsQ==} - dev: false - - /@hypercerts-org/contracts@0.8.7: - resolution: {integrity: sha512-vs4sC51cZT2t5/TOQh57Wqx9oofRFX3tLkAQbQ6737uqxFIKKZWAb3vgbSEHrch7gSxJMPIht4AxKqI/nbjzUg==} + /@hypercerts-org/contracts@0.8.11: + resolution: {integrity: sha512-n6fwMsaoR50VITM2upR4OOi4EZJmZvU6vvXrHWCSakP9e1OeDuAOk+kHiK+egqDRYj6uKtg9VTUFKZBYvu3jRg==} dev: false - /@hypercerts-org/sdk@0.8.4(@babel/core@7.23.2)(@envelop/core@3.0.6)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(mocha@10.2.0)(node-fetch@3.3.2)(react-native@0.72.5)(typescript@5.1.6)(uint8arraylist@2.4.3): - resolution: {integrity: sha512-qPycB3MklKP7s8s+1hN0vdttXUhkkBIkqEMJHUkNbSH142U3E22qll79VYVvK601FVYKel+eczoNcGTAJfWR3w==} + /@hypercerts-org/sdk@0.8.10(@babel/core@7.23.2)(@envelop/core@3.0.6)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(node-fetch@3.3.2)(react-native@0.72.5)(typescript@5.1.6)(uint8arraylist@2.4.3): + resolution: {integrity: sha512-shgYIhwG93RenegpIXVDMAGiFE0hpKZynMTl9qc0Q1RjWptX3+UvaeqYK4PfSxAS9LmN9lytXt3L8JOml3WWAQ==} dependencies: '@ethereum-attestation-service/eas-sdk': 0.28.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(typescript@5.1.6) + '@ethersproject/abstract-signer': 5.7.0 '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) '@graphprotocol/client-cli': 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.5) - '@hypercerts-org/contracts': 0.7.1 + '@hypercerts-org/contracts': 0.8.11 '@openzeppelin/merkle-tree': 1.0.5 - '@types/jest': 29.5.5 ajv: 8.12.0 axios: 1.5.1(debug@4.3.4) + dotenv: 16.3.1 ethers: 5.7.2 graphql: 16.8.1 ipfs-core: 0.17.0(uint8arraylist@2.4.3) @@ -7472,8 +7472,6 @@ packages: loglevel: 1.8.1 mime: 3.0.0 nft.storage: 7.1.1(node-fetch@3.3.2) - ts-jest: 29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@5.1.6) - ts-mocha: 10.0.0(mocha@10.2.0) web3.storage: 4.5.5(node-fetch@3.3.2) transitivePeerDependencies: - '@babel/core' @@ -7488,18 +7486,14 @@ packages: - '@graphql-tools/merge' - '@graphql-tools/utils' - '@graphql-tools/wrap' - - '@jest/types' - '@swc/core' - '@swc/wasm' - '@types/node' - - babel-jest - babel-plugin-macros - bufferutil - debug - encoding - - esbuild - graphql-tag - - mocha - node-fetch - node-notifier - react-native @@ -12206,6 +12200,7 @@ packages: dependencies: expect: 29.7.0 pretty-format: 29.7.0 + dev: true /@types/js-cookie@2.2.7: resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} @@ -12229,6 +12224,7 @@ packages: /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} requiresBuild: true + dev: true /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} @@ -15159,6 +15155,7 @@ packages: engines: {node: '>= 6'} dependencies: fast-json-stable-stringify: 2.1.0 + dev: true /bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} @@ -16231,6 +16228,19 @@ packages: webpack: 5.88.2(webpack-cli@5.1.4) dev: false + /copyfiles@2.4.1: + resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} + hasBin: true + dependencies: + glob: 7.2.3 + minimatch: 3.1.2 + mkdirp: 1.0.4 + noms: 0.0.0 + through2: 2.0.5 + untildify: 4.0.0 + yargs: 16.2.0 + dev: true + /core-js-compat@3.33.0: resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==} dependencies: @@ -17517,6 +17527,7 @@ packages: /diff@3.5.0: resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} engines: {node: '>=0.3.1'} + dev: true /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} @@ -23668,6 +23679,7 @@ packages: requiresBuild: true dependencies: minimist: 1.2.8 + dev: true /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -26061,6 +26073,13 @@ packages: engines: {node: '>=12.19'} dev: true + /noms@0.0.0: + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} + dependencies: + inherits: 2.0.4 + readable-stream: 1.0.34 + dev: true + /non-layered-tidy-tree-layout@2.0.2: resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} dev: false @@ -28481,6 +28500,15 @@ packages: parse-json: 5.2.0 type-fest: 0.6.0 + /readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: true + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: @@ -30353,6 +30381,10 @@ packages: es-abstract: 1.22.2 dev: true + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: true + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -30813,7 +30845,6 @@ packages: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - dev: false /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} @@ -31104,40 +31135,6 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@5.1.6): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.23.2 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(ts-node@10.9.1) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.1.6 - yargs-parser: 21.1.1 - dev: false - /ts-loader@9.5.0(typescript@4.9.5)(webpack@5.88.2): resolution: {integrity: sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==} engines: {node: '>=12.0.0'} @@ -31165,6 +31162,7 @@ packages: ts-node: 7.0.1 optionalDependencies: tsconfig-paths: 3.14.2 + dev: true /ts-node@10.9.1(@types/node@18.15.13)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} @@ -31271,6 +31269,7 @@ packages: mkdirp: 0.5.6 source-map-support: 0.5.21 yn: 2.0.0 + dev: true /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} @@ -31280,6 +31279,7 @@ packages: json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 + dev: true /tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} @@ -33370,6 +33370,7 @@ packages: /yn@2.0.0: resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} engines: {node: '>=4'} + dev: true /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} diff --git a/sdk/package.json b/sdk/package.json index c0d74697..e4cbc00c 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "0.8.8", + "version": "0.8.10", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -11,22 +11,23 @@ "module": "./dist/esm/index.js", "types": "./dist/index.d.ts", "exports": { - "require": "./dist/cjs/index.js", - "import": "./dist/esm/index.js", - "types": "./dist/index.d.ts" + ".": { + "require": "./dist/cjs/index.js", + "import": "./dist/esm/index.js", + "types": "./dist/index.d.ts" + } }, "files": [ "dist", "README.md", "package.json" ], - "type": "module", "dependencies": { "@ethereum-attestation-service/eas-sdk": "^0.28.3", "@ethersproject/abstract-signer": "^5.7.0", "@graphprotocol/client-add-source-name": "^1.0.16", "@graphprotocol/client-cli": "^2.2.15", - "@hypercerts-org/contracts": "0.8.7", + "@hypercerts-org/contracts": "0.8.11", "@openzeppelin/merkle-tree": "^1.0.4", "ajv": "^8.11.2", "axios": "^1.2.2", diff --git a/sdk/rollup.config.js b/sdk/rollup.config.mjs similarity index 100% rename from sdk/rollup.config.js rename to sdk/rollup.config.mjs From 6d75f0aa7e8b602e3cfad5c5aa05a185f54dcbc9 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 23 Oct 2023 23:07:58 +0200 Subject: [PATCH 002/118] Feat/deploy to celo (#1135) * Add HC contracts to OpenZeppelin Defender (#1134) * Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop * feat(defender): use hc packages in oz defender * feat(celo): graph deploy, sdk and defender config * chore(bump): SDK 0.8.14 Celo deployment * feat(celo): add celo support to frontend * chore(graph): fix turbo test flow * chore(graph): add comment to p.json --- README.md | 1 + contracts/.env.example | 2 + contracts/.openzeppelin/celo.json | 378 + contracts/contracts/AllowlistMinter.sol | 70 + contracts/contracts/HypercertMinter.sol | 229 + contracts/contracts/SemiFungible1155.sol | 433 ++ contracts/contracts/interfaces/IAllowlist.sol | 14 + .../contracts/interfaces/IHypercertToken.sol | 62 + contracts/contracts/libs/Errors.sol | 15 + contracts/hardhat.config.ts | 34 +- contracts/tasks/deploy.ts | 1 + defender/package.json | 15 +- .../batch-mint-claims-from-allowlists.ts | 10 +- .../auto-tasks/mint-claim-from-allowlist.ts | 4 +- .../src/auto-tasks/on-allowlist-created.ts | 15 +- defender/src/config.ts | 2 +- defender/src/create-autotask.ts | 2 +- defender/src/create-sentinel.ts | 2 +- defender/src/networks.ts | 6 + defender/src/reset.ts | 2 +- defender/src/rollout.ts | 8 +- defender/src/setup.ts | 12 +- defender/src/update.ts | 6 +- defender/tsconfig.json | 1 + defender/webpack.config.cjs | 17 +- frontend/components/dapp-context.tsx | 21 +- frontend/package.json | 4 +- graph/networks.json | 6 + graph/package.json | 20 +- graph/subgraph.yaml | 6 +- graph/tests/.latest.json | 4 +- pnpm-lock.yaml | 6917 +++++++++-------- pnpm-workspace.yaml | 3 +- sdk/package.json | 19 +- sdk/src/constants.ts | 6 + sdk/src/index.ts | 2 +- sdk/src/indexer.ts | 2 +- sdk/src/storage.ts | 4 - sdk/src/types/client.ts | 2 +- sdk/src/types/global.d.ts | 2 +- sdk/src/types/indexer.ts | 2 +- sdk/src/utils/config.ts | 5 +- sdk/tsconfig.json | 2 +- 43 files changed, 5204 insertions(+), 3164 deletions(-) create mode 100644 contracts/.openzeppelin/celo.json create mode 100644 contracts/contracts/AllowlistMinter.sol create mode 100644 contracts/contracts/HypercertMinter.sol create mode 100644 contracts/contracts/SemiFungible1155.sol create mode 100644 contracts/contracts/interfaces/IAllowlist.sol create mode 100644 contracts/contracts/interfaces/IHypercertToken.sol create mode 100644 contracts/contracts/libs/Errors.sol diff --git a/README.md b/README.md index d2bd54d3..d7eb1fad 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ For more details, check out our [website](https://hypercerts.org/). | -------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | Goerli | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [0x8CD35a62fF56A91485eBF97491612F1552dbc1c9](https://goerli.etherscan.io/address/0x8CD35a62fF56A91485eBF97491612F1552dbc1c9) | | Sepolia | [0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941](https://goerli.etherscan.io/address/0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941) | TBD | + | Celo | [0x16bA53B74c234C870c61EFC04cD418B8f2865959](https://celoscan.io/address/0x16bA53B74c234C870c61EFC04cD418B8f2865959) | TBD | | Optimism | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [0x560adA72a80b4707e493cA8c3B7B7528930E7Be5](https://optimistic.etherscan.io/address/0x560adA72a80b4707e493cA8c3B7B7528930E7Be5) | - `/cors-proxy`: CORS proxy for Cloudflare Workers diff --git a/contracts/.env.example b/contracts/.env.example index 46bc688d..b7c57fac 100644 --- a/contracts/.env.example +++ b/contracts/.env.example @@ -1,5 +1,6 @@ # Deploy keys MNEMONIC="test test test test test test test test test test test junk" +MNEMONIC_CELO=="test test test test test test test test test test test junk" INFURA_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" ALCHEMY_OPTIMISM_URL="https://opt-mainnet.g.alchemy.com/v2/zzzzzzzzzzzzzzzzzzz" @@ -10,6 +11,7 @@ OPENZEPPELIN_SECRET_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" # Block explorer API keys ETHERSCAN_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" OPTIMISTIC_ETHERSCAN_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" +CELOSCAN_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" # Unused, ignore below POLYGONSCAN_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" diff --git a/contracts/.openzeppelin/celo.json b/contracts/.openzeppelin/celo.json new file mode 100644 index 00000000..2d9a5c85 --- /dev/null +++ b/contracts/.openzeppelin/celo.json @@ -0,0 +1,378 @@ +{ + "manifestVersion": "3.2", + "proxies": [ + { + "address": "0x16bA53B74c234C870c61EFC04cD418B8f2865959", + "txHash": "0x1b0d8fcde0a9ff343fa1c7eea5b8fe4432eb10731ebfeb5dfcb6fa3b2cec0046", + "kind": "uups" + } + ], + "impls": { + "31f9c6a26cf17ca4bb624cde3829d09c9a5a4a1d419afe174e7bd6d46cc5c0d9": { + "address": "0x620257e9301a813bE7CC5B75AAe8DDA3F6A926D2", + "txHash": "0x479853237255ea63bb7f1cadd7b72cc793444811a425cac2d6e10e9277ba4c18", + "layout": { + "solcVersion": "0.8.16", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_balances", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:25" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:28" + }, + { + "label": "_uri", + "offset": 0, + "slot": "103", + "type": "t_string_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "104", + "type": "t_array(t_uint256)47_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:528" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1155BurnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol:52" + }, + { + "label": "_baseURI", + "offset": 0, + "slot": "201", + "type": "t_string_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:27" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "202", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:30" + }, + { + "label": "__gap", + "offset": 0, + "slot": "203", + "type": "t_array(t_uint256)48_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:77" + }, + { + "label": "_owner", + "offset": 0, + "slot": "251", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "351", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "typeCounter", + "offset": 0, + "slot": "401", + "type": "t_uint256", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:27" + }, + { + "label": "owners", + "offset": 0, + "slot": "402", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:38" + }, + { + "label": "creators", + "offset": 0, + "slot": "403", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:41" + }, + { + "label": "tokenValues", + "offset": 0, + "slot": "404", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:44" + }, + { + "label": "maxIndex", + "offset": 0, + "slot": "405", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:47" + }, + { + "label": "__gap", + "offset": 0, + "slot": "406", + "type": "t_array(t_uint256)25_storage", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:432" + }, + { + "label": "merkleRoots", + "offset": 0, + "slot": "431", + "type": "t_mapping(t_uint256,t_bytes32)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:17" + }, + { + "label": "hasBeenClaimed", + "offset": 0, + "slot": "432", + "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:18" + }, + { + "label": "maxUnits", + "offset": 0, + "slot": "433", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:19" + }, + { + "label": "minted", + "offset": 0, + "slot": "434", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "435", + "type": "t_array(t_uint256)26_storage", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:69" + }, + { + "label": "_paused", + "offset": 0, + "slot": "461", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "462", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:116" + }, + { + "label": "typeRestrictions", + "offset": 0, + "slot": "511", + "type": "t_mapping(t_uint256,t_enum(TransferRestrictions)6761)", + "contract": "HypercertMinter", + "src": "src/HypercertMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "512", + "type": "t_array(t_uint256)29_storage", + "contract": "HypercertMinter", + "src": "src/HypercertMinter.sol:228" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)25_storage": { + "label": "uint256[25]", + "numberOfBytes": "800" + }, + "t_array(t_uint256)26_storage": { + "label": "uint256[26]", + "numberOfBytes": "832" + }, + "t_array(t_uint256)29_storage": { + "label": "uint256[29]", + "numberOfBytes": "928" + }, + "t_array(t_uint256)47_storage": { + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_enum(TransferRestrictions)6761": { + "label": "enum IHypercertToken.TransferRestrictions", + "members": [ + "AllowAll", + "DisallowAll", + "FromCreatorOnly" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bytes32)": { + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_enum(TransferRestrictions)6761)": { + "label": "mapping(uint256 => enum IHypercertToken.TransferRestrictions)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))": { + "label": "mapping(uint256 => mapping(bytes32 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + } + } +} diff --git a/contracts/contracts/AllowlistMinter.sol b/contracts/contracts/AllowlistMinter.sol new file mode 100644 index 00000000..576b45ee --- /dev/null +++ b/contracts/contracts/AllowlistMinter.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.16; + +import { MerkleProofUpgradeable } from "oz-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; +import { IAllowlist } from "./interfaces/IAllowlist.sol"; + +import { Errors } from "./libs/Errors.sol"; + +/// @title Interface for hypercert token interactions +/// @author bitbeckers +/// @notice This interface declares the required functionality for a hypercert token +/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) +contract AllowlistMinter is IAllowlist { + event AllowlistCreated(uint256 tokenID, bytes32 root); + event LeafClaimed(uint256 tokenID, bytes32 leaf); + + mapping(uint256 => bytes32) internal merkleRoots; + mapping(uint256 => mapping(bytes32 => bool)) public hasBeenClaimed; + mapping(uint256 => uint256) internal maxUnits; + mapping(uint256 => uint256) internal minted; + + function isAllowedToClaim( + bytes32[] calldata proof, + uint256 claimID, + bytes32 leaf + ) external view returns (bool isAllowed) { + if (merkleRoots[claimID].length == 0) revert Errors.DoesNotExist(); + isAllowed = MerkleProofUpgradeable.verifyCalldata(proof, merkleRoots[claimID], leaf); + } + + function _createAllowlist(uint256 claimID, bytes32 merkleRoot, uint256 units) internal { + if (merkleRoot == "" || units == 0) revert Errors.Invalid(); + if (merkleRoots[claimID] != "") revert Errors.DuplicateEntry(); + + merkleRoots[claimID] = merkleRoot; + maxUnits[claimID] = units; + emit AllowlistCreated(claimID, merkleRoot); + } + + function _processClaim(bytes32[] calldata proof, uint256 claimID, uint256 amount) internal { + if (merkleRoots[claimID].length == 0) revert Errors.DoesNotExist(); + + bytes32 leaf = _calculateLeaf(msg.sender, amount); + + if (hasBeenClaimed[claimID][leaf]) revert Errors.AlreadyClaimed(); + if ( + !MerkleProofUpgradeable.verifyCalldata(proof, merkleRoots[claimID], leaf) || + (minted[claimID] + amount) > maxUnits[claimID] + ) revert Errors.Invalid(); + hasBeenClaimed[claimID][leaf] = true; + + emit LeafClaimed(claimID, leaf); + } + + function _calculateLeaf(address account, uint256 amount) internal pure returns (bytes32 leaf) { + leaf = keccak256(bytes.concat(keccak256(abi.encode(account, amount)))); + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + * Assuming 30 available slots (slots cost space, cost gas) + * 1. merkleRoots + * 2. hasBeenClaimed + * 3. maxUnits + * 4. minted + */ + uint256[26] private __gap; +} diff --git a/contracts/contracts/HypercertMinter.sol b/contracts/contracts/HypercertMinter.sol new file mode 100644 index 00000000..917c02c5 --- /dev/null +++ b/contracts/contracts/HypercertMinter.sol @@ -0,0 +1,229 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.16; + +import { IHypercertToken } from "./interfaces/IHypercertToken.sol"; +import { SemiFungible1155 } from "./SemiFungible1155.sol"; +import { AllowlistMinter } from "./AllowlistMinter.sol"; +import { PausableUpgradeable } from "oz-upgradeable/security/PausableUpgradeable.sol"; + +import { Errors } from "./libs/Errors.sol"; + +/// @title Contract for managing hypercert claims and whitelists +/// @author bitbeckers +/// @notice Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token. +/// @notice This contract supports whitelisted minting via { AllowlistMinter }. +/// @dev Wrapper contract to expose and chain functions. +contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, PausableUpgradeable { + // solhint-disable-next-line const-name-snakecase + string public constant name = "HypercertMinter"; + /// @dev from typeID to a transfer policy + mapping(uint256 => TransferRestrictions) internal typeRestrictions; + + /// INIT + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } + function initialize() public virtual initializer { + __SemiFungible1155_init(); + __Pausable_init(); + } + + /// EXTERNAL + + /// @notice Mint a semi-fungible token for the impact claim referenced via `uri` + /// @dev see {IHypercertToken} + function mintClaim( + address account, + uint256 units, + string memory _uri, + TransferRestrictions restrictions + ) external override whenNotPaused { + // This enables us to release this restriction in the future + if (msg.sender != account) revert Errors.NotAllowed(); + uint256 claimID = _mintNewTypeWithToken(account, units, _uri); + typeRestrictions[claimID] = restrictions; + emit ClaimStored(claimID, _uri, units); + } + + /// @notice Mint semi-fungible tokens for the impact claim referenced via `uri` + /// @dev see {IHypercertToken} + function mintClaimWithFractions( + address account, + uint256 units, + uint256[] calldata fractions, + string memory _uri, + TransferRestrictions restrictions + ) external override whenNotPaused { + // This enables us to release this restriction in the future + if (msg.sender != account) revert Errors.NotAllowed(); + //Using sum to compare units and fractions (sanity check) + if (_getSum(fractions) != units) revert Errors.Invalid(); + + uint256 claimID = _mintNewTypeWithTokens(account, fractions, _uri); + typeRestrictions[claimID] = restrictions; + emit ClaimStored(claimID, _uri, units); + } + + /// @notice Mint a semi-fungible token representing a fraction of the claim + /// @dev Calls AllowlistMinter to verify `proof`. + /// @dev Mints the `amount` of units for the hypercert stored under `claimID` + function mintClaimFromAllowlist( + address account, + bytes32[] calldata proof, + uint256 claimID, + uint256 units + ) external whenNotPaused { + _processClaim(proof, claimID, units); + _mintToken(account, claimID, units); + } + + /// @notice Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + /// @dev Calls AllowlistMinter to verify `proofs`. + /// @dev Mints the `amount` of units for the hypercert stored under `claimIDs` + function batchMintClaimsFromAllowlists( + address account, + bytes32[][] calldata proofs, + uint256[] calldata claimIDs, + uint256[] calldata units + ) external whenNotPaused { + uint256 len = claimIDs.length; + for (uint256 i; i < len; ) { + _processClaim(proofs[i], claimIDs[i], units[i]); + unchecked { + ++i; + } + } + _batchMintTokens(account, claimIDs, units); + } + + /// @notice Register a claim and the whitelist for minting token(s) belonging to that claim + /// @dev Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units` + /// @dev Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims + function createAllowlist( + address account, + uint256 units, + bytes32 merkleRoot, + string memory _uri, + TransferRestrictions restrictions + ) external whenNotPaused { + uint256 claimID = _createTokenType(account, units, _uri); + _createAllowlist(claimID, merkleRoot, units); + typeRestrictions[claimID] = restrictions; + emit ClaimStored(claimID, _uri, units); + } + + /// @notice Split a claimtokens value into parts with summed value equal to the original + /// @dev see {IHypercertToken} + function splitFraction( + address _account, + uint256 _tokenID, + uint256[] calldata _newFractions + ) external whenNotPaused { + _splitTokenUnits(_account, _tokenID, _newFractions); + } + + /// @notice Merge the value of tokens belonging to the same claim + /// @dev see {IHypercertToken} + function mergeFractions(address _account, uint256[] calldata _fractionIDs) external whenNotPaused { + _mergeTokensUnits(_account, _fractionIDs); + } + + /// @notice Burn a claimtoken + /// @dev see {IHypercertToken} + function burnFraction(address _account, uint256 _tokenID) external whenNotPaused { + _burnToken(_account, _tokenID); + } + + /// @dev see {IHypercertToken} + function unitsOf(uint256 tokenID) external view override returns (uint256 units) { + units = _unitsOf(tokenID); + } + + /// @dev see {IHypercertToken} + function unitsOf(address account, uint256 tokenID) external view override returns (uint256 units) { + units = _unitsOf(account, tokenID); + } + + /// PAUSABLE + + function pause() external onlyOwner { + _pause(); + } + + function unpause() external onlyOwner { + _unpause(); + } + + /// METADATA + + /// @dev see { IHypercertMetadata} + function uri(uint256 tokenID) public view override(IHypercertToken, SemiFungible1155) returns (string memory _uri) { + _uri = SemiFungible1155.uri(tokenID); + } + + /// TRANSFER RESTRICTIONS + + function readTransferRestriction(uint256 tokenID) external view returns (string memory) { + TransferRestrictions temp = typeRestrictions[getBaseType(tokenID)]; + if (temp == TransferRestrictions.AllowAll) return "AllowAll"; + if (temp == TransferRestrictions.DisallowAll) return "DisallowAll"; + if (temp == TransferRestrictions.FromCreatorOnly) return "FromCreatorOnly"; + return ""; + } + + /// INTERNAL + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol } + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { + // solhint-disable-previous-line no-empty-blocks + } + + function _beforeTokenTransfer( + address operator, + address from, + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) internal virtual override { + super._beforeTokenTransfer(operator, from, to, ids, amounts, data); + + // By-pass transfer restrictions for minting and burning + if (from == address(0)) { + // Minting + return; + } else if (to == address(0)) { + // Burning + return; + } + + // Transfer case, where to and from are non-zero + uint256 len = ids.length; + for (uint256 i; i < len; ) { + uint256 typeID = getBaseType(ids[i]); + TransferRestrictions policy = typeRestrictions[typeID]; + if (policy == TransferRestrictions.DisallowAll) { + revert Errors.TransfersNotAllowed(); + } else if (policy == TransferRestrictions.FromCreatorOnly && from != creators[typeID]) { + revert Errors.TransfersNotAllowed(); + } + unchecked { + ++i; + } + } + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + * Assuming 30 available slots (slots cost space, cost gas) + * 1. typeRestrictions + */ + uint256[29] private __gap; +} diff --git a/contracts/contracts/SemiFungible1155.sol b/contracts/contracts/SemiFungible1155.sol new file mode 100644 index 00000000..cd88714a --- /dev/null +++ b/contracts/contracts/SemiFungible1155.sol @@ -0,0 +1,433 @@ +// SPDX-License-Identifier: MIT +// Used components of Enjin example implementation for mixed fungibility +// https://github.com/enjin/erc-1155/blob/master/contracts/ERC1155MixedFungibleMintable.sol +pragma solidity 0.8.16; + +import { ERC1155Upgradeable } from "oz-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; +import { ERC1155BurnableUpgradeable } from "oz-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol"; +import { ERC1155URIStorageUpgradeable } from "oz-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol"; +import { OwnableUpgradeable } from "oz-upgradeable/access/OwnableUpgradeable.sol"; +import { Initializable } from "oz-upgradeable/proxy/utils/Initializable.sol"; +import { UUPSUpgradeable } from "oz-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { Errors } from "./libs/Errors.sol"; + +/// @title Contract for minting semi-fungible EIP1155 tokens +/// @author bitbeckers +/// @notice Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` +/// @dev Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens) +contract SemiFungible1155 is + Initializable, + ERC1155Upgradeable, + ERC1155BurnableUpgradeable, + ERC1155URIStorageUpgradeable, + OwnableUpgradeable, + UUPSUpgradeable +{ + /// @dev Counter used to generate next typeID. + uint256 internal typeCounter; + + /// @dev Bitmask used to expose only upper 128 bits of uint256 + uint256 internal constant TYPE_MASK = type(uint256).max << 128; + + /// @dev Bitmask used to expose only lower 128 bits of uint256 + uint256 internal constant NF_INDEX_MASK = type(uint256).max >> 128; + + uint256 internal constant FRACTION_LIMIT = 253; + + /// @dev Mapping of `tokenID` to address of `owner` + mapping(uint256 => address) internal owners; + + /// @dev Mapping of `tokenID` to address of `creator` + mapping(uint256 => address) internal creators; + + /// @dev Used to determine amount of `units` stored in token at `tokenID` + mapping(uint256 => uint256) internal tokenValues; + + /// @dev Used to find highest index of token belonging to token at `typeID` + mapping(uint256 => uint256) internal maxIndex; + + /// @dev Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID` + event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value); + + /// @dev Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs` + event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values); + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } + // solhint-disable-next-line func-name-mixedcase + function __SemiFungible1155_init() public virtual onlyInitializing { + __ERC1155_init(""); + __ERC1155Burnable_init(); + __ERC1155URIStorage_init(); + __Ownable_init(); + __UUPSUpgradeable_init(); + } + + /// @dev Get index of fractional token at `_id` by returning lower 128 bit values + /// @dev Returns 0 if `_id` is a baseType + function getItemIndex(uint256 tokenID) internal pure returns (uint256) { + return tokenID & NF_INDEX_MASK; + } + + /// @dev Get base type ID for token at `_id` by returning upper 128 bit values + function getBaseType(uint256 tokenID) internal pure returns (uint256) { + return tokenID & TYPE_MASK; + } + + /// @dev Identify that token at `_id` is base type. + /// @dev Upper 128 bits identify base type ID, lower bits should be 0 + function isBaseType(uint256 tokenID) internal pure returns (bool) { + return (tokenID & TYPE_MASK == tokenID) && (tokenID & NF_INDEX_MASK == 0); + } + + /// @dev Identify that token at `_id` is fraction of a claim. + /// @dev Upper 128 bits identify base type ID, lower bits should be > 0 + function isTypedItem(uint256 tokenID) internal pure returns (bool) { + return (tokenID & TYPE_MASK != 0) && (tokenID & NF_INDEX_MASK != 0); + } + + /// READ + function ownerOf(uint256 tokenID) public view returns (address _owner) { + _owner = owners[tokenID]; + } + + /// @dev see {IHypercertToken} + function _unitsOf(uint256 tokenID) internal view returns (uint256 units) { + units = tokenValues[tokenID]; + } + + /// @dev see {IHypercertToken} + function _unitsOf(address account, uint256 tokenID) internal view returns (uint256 units) { + // Check if fraction token and accounts owns it + if (ownerOf(tokenID) == account) { + units = tokenValues[tokenID]; + } + } + + /// MUTATE + + /// @dev create token type ID based of token counter + + function _createTokenType(address _account, uint256 units, string memory _uri) internal returns (uint256 typeID) { + _notMaxType(typeCounter); + typeID = ++typeCounter << 128; + + creators[typeID] = _account; + tokenValues[typeID] = units; + + _setURI(typeID, _uri); + + //Event emitted for indexing purposes + emit TransferSingle(_account, address(0), address(0), typeID, 0); + } + + /// @dev Mint a new token type and the initial units + function _mintNewTypeWithToken( + address _account, + uint256 _units, + string memory _uri + ) internal returns (uint256 typeID) { + if (_units == 0) { + revert Errors.NotAllowed(); + } + typeID = _createTokenType(_account, _units, _uri); + + uint256 tokenID = typeID + ++maxIndex[typeID]; //1 based indexing, 0 holds type data + + tokenValues[tokenID] = _units; + + _mint(_account, tokenID, 1, ""); + emit ValueTransfer(typeID, 0, tokenID, _units); + } + + /// @dev Mint a new token type and the initial fractions + function _mintNewTypeWithTokens( + address _account, + uint256[] calldata _fractions, + string memory _uri + ) internal returns (uint256 typeID) { + typeID = _mintNewTypeWithToken(_account, _getSum(_fractions), _uri); + _splitTokenUnits(_account, typeID + maxIndex[typeID], _fractions); + } + + /// @dev Mint a new token for an existing type + function _mintToken(address _account, uint256 _typeID, uint256 _units) internal returns (uint256 tokenID) { + if (!isBaseType(_typeID)) revert Errors.NotAllowed(); + + _notMaxItem(maxIndex[_typeID]); + + unchecked { + tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data + } + + tokenValues[tokenID] = _units; + + _mint(_account, tokenID, 1, ""); + emit ValueTransfer(_typeID, 0, tokenID, _units); + } + + /// @dev Mint new tokens for existing types + /// @notice Enables batch claiming from multiple allowlists + function _batchMintTokens( + address _account, + uint256[] calldata _typeIDs, + uint256[] calldata _units + ) internal returns (uint256[] memory tokenIDs) { + uint256 len = _typeIDs.length; + + tokenIDs = new uint256[](len); + uint256[] memory amounts = new uint256[](len); + uint256[] memory zeroes = new uint256[](len); + + for (uint256 i; i < len; ) { + uint256 _typeID = _typeIDs[i]; + if (!isBaseType(_typeID)) revert Errors.NotAllowed(); + _notMaxItem(maxIndex[_typeID]); + + unchecked { + uint256 tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data + tokenValues[tokenID] = _units[i]; + tokenIDs[i] = tokenID; + amounts[i] = 1; + ++i; + } + } + + _mintBatch(_account, tokenIDs, amounts, ""); + emit BatchValueTransfer(_typeIDs, zeroes, tokenIDs, _units); + } + + /// @dev Split the units of `_tokenID` owned by `account` across `_values` + /// @dev `_values` must sum to total `units` held at `_tokenID` + function _splitTokenUnits(address _account, uint256 _tokenID, uint256[] calldata _values) internal { + if (_values.length > FRACTION_LIMIT || _values.length < 2) revert Errors.ArraySize(); + if (tokenValues[_tokenID] != _getSum(_values)) revert Errors.NotAllowed(); + + // Current token + uint256 _typeID = getBaseType(_tokenID); + uint256 valueLeft = tokenValues[_tokenID]; + + // Prepare batch processing, we want to skip the first entry + uint256 len = _values.length - 1; + + uint256[] memory typeIDs = new uint256[](len); + uint256[] memory fromIDs = new uint256[](len); + uint256[] memory toIDs = new uint256[](len); + uint256[] memory amounts = new uint256[](len); + uint256[] memory values = new uint256[](len); + + { + uint256[] memory _valuesCache = _values; + uint256 swapValue = _valuesCache[len]; + _valuesCache[len] = _valuesCache[0]; + _valuesCache[0] = swapValue; + + for (uint256 i; i < len; ) { + _notMaxItem(maxIndex[_typeID]); + + typeIDs[i] = _typeID; + fromIDs[i] = _tokenID; + toIDs[i] = _typeID + ++maxIndex[_typeID]; + amounts[i] = 1; + values[i] = _valuesCache[i]; + + unchecked { + ++i; + } + } + } + + _beforeUnitTransfer(_msgSender(), _account, fromIDs, toIDs, values, ""); + + for (uint256 i; i < len; ) { + valueLeft -= values[i]; + + tokenValues[toIDs[i]] = values[i]; + + unchecked { + ++i; + } + } + + tokenValues[_tokenID] = valueLeft; + + _mintBatch(_account, toIDs, amounts, ""); + + emit BatchValueTransfer(typeIDs, fromIDs, toIDs, values); + } + + /// @dev Merge the units of `_fractionIDs`. + /// @dev Base type of `_fractionIDs` must be identical for all tokens. + function _mergeTokensUnits(address _account, uint256[] memory _fractionIDs) internal { + if (_fractionIDs.length > FRACTION_LIMIT || _fractionIDs.length < 2) { + revert Errors.ArraySize(); + } + uint256 len = _fractionIDs.length - 1; + + uint256 target = _fractionIDs[len]; + + uint256 _totalValue; + uint256[] memory fromIDs = new uint256[](len); + uint256[] memory toIDs = new uint256[](len); + uint256[] memory values = new uint256[](len); + uint256[] memory amounts = new uint256[](len); + + { + for (uint256 i; i < len; ) { + uint256 _fractionID = _fractionIDs[i]; + fromIDs[i] = _fractionID; + toIDs[i] = target; + amounts[i] = 1; + values[i] = tokenValues[_fractionID]; + + unchecked { + ++i; + } + } + } + + _beforeUnitTransfer(_msgSender(), _account, fromIDs, toIDs, values, ""); + + for (uint256 i; i < len; ) { + _totalValue += values[i]; + + delete tokenValues[fromIDs[i]]; + unchecked { + ++i; + } + } + + tokenValues[target] += _totalValue; + + _burnBatch(_account, fromIDs, amounts); + } + + /// @dev Burn the token at `_tokenID` owned by `_account` + /// @dev Not allowed to burn base type. + /// @dev `_tokenID` must hold all value declared at base type + function _burnToken(address _account, uint256 _tokenID) internal { + if (_account != _msgSender() && !isApprovedForAll(_account, _msgSender())) revert Errors.NotApprovedOrOwner(); + + uint256 value = tokenValues[_tokenID]; + + delete tokenValues[_tokenID]; + + _burn(_account, _tokenID, 1); + emit ValueTransfer(getBaseType(_tokenID), _tokenID, 0, value); + } + + /// TRANSFERS + + // The following functions are overrides required by Solidity. + function _afterTokenTransfer( + address operator, + address from, + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) internal virtual override { + super._afterTokenTransfer(operator, from, to, ids, amounts, data); + + uint256 len = ids.length; + + for (uint256 i; i < len; ) { + owners[ids[i]] = to; + unchecked { + ++i; + } + } + } + + function _beforeUnitTransfer( + address operator, + address from, + uint256[] memory fromIDs, + uint256[] memory toIDs, + uint256[] memory values, + bytes memory data + ) internal virtual { + uint256 len = fromIDs.length; + + for (uint256 i; i < len; ) { + uint256 _from = fromIDs[i]; + uint256 _to = toIDs[i]; + + if (isBaseType(_from)) revert Errors.NotAllowed(); + if (getBaseType(_from) != getBaseType(_to)) revert Errors.TypeMismatch(); + if (from != _msgSender() && !isApprovedForAll(from, _msgSender())) revert Errors.NotApprovedOrOwner(); + unchecked { + ++i; + } + } + } + + /// METADATA + + /// @dev see { openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol } + /// @dev Always returns the URI for the basetype so that it's managed in one place. + function uri( + uint256 tokenID + ) public view virtual override(ERC1155Upgradeable, ERC1155URIStorageUpgradeable) returns (string memory _uri) { + // All tokens share the same metadata at the moment + _uri = ERC1155URIStorageUpgradeable.uri(getBaseType(tokenID)); + } + + /// UTILS + + /** + * @dev Check if value is below max item index + */ + function _notMaxItem(uint256 tokenID) private pure { + uint128 _count = uint128(tokenID); + ++_count; + } + + /** + * @dev Check if value is below max type index + */ + function _notMaxType(uint256 tokenID) private pure { + uint128 _count = uint128(tokenID >> 128); + ++_count; + } + + /** + * @dev calculate the sum of the elements of an array + */ + function _getSum(uint256[] memory array) internal pure returns (uint256 sum) { + uint256 len = array.length; + for (uint256 i; i < len; ) { + if (array[i] == 0) revert Errors.NotAllowed(); + sum += array[i]; + unchecked { + ++i; + } + } + } + + function _getSingletonArray(uint256 element) private pure returns (uint256[] memory) { + uint256[] memory array = new uint256[](1); + array[0] = element; + + return array; + } + + // UUPS PROXY + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol } + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { + // solhint-disable-previous-line no-empty-blocks + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + * Assuming 30 available slots (slots cost space, cost gas) + * 1. typeCounter + * 2. owners + * 3. creators + * 4. tokenValues + * 5. maxIndex + */ + uint256[25] private __gap; +} diff --git a/contracts/contracts/interfaces/IAllowlist.sol b/contracts/contracts/interfaces/IAllowlist.sol new file mode 100644 index 00000000..fe4a9ec4 --- /dev/null +++ b/contracts/contracts/interfaces/IAllowlist.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.16; + +/// @title Interface for allowlist +/// @author bitbeckers +/// @notice This interface declares the required functionality for a hypercert token +/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) +interface IAllowlist { + function isAllowedToClaim( + bytes32[] calldata proof, + uint256 tokenID, + bytes32 leaf + ) external view returns (bool isAllowed); +} diff --git a/contracts/contracts/interfaces/IHypercertToken.sol b/contracts/contracts/interfaces/IHypercertToken.sol new file mode 100644 index 00000000..1ed1e34e --- /dev/null +++ b/contracts/contracts/interfaces/IHypercertToken.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.16; + +/// @title Interface for hypercert token interactions +/// @author bitbeckers +/// @notice This interface declares the required functionality for a hypercert token +/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) +interface IHypercertToken { + /** + * AllowAll = Unrestricted + * DisallowAll = Transfers disabled after minting + * FromCreatorOnly = Only the original creator can transfer + */ + /// @dev Transfer restriction policies on hypercerts + enum TransferRestrictions { + AllowAll, + DisallowAll, + FromCreatorOnly + } + + /// @dev Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`. + event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits); + + /// @dev Function called to store a claim referenced via `uri` with a maximum number of fractions `units`. + function mintClaim(address account, uint256 units, string memory uri, TransferRestrictions restrictions) external; + + /// @dev Function called to store a claim referenced via `uri` with a set of `fractions`. + /// @dev Fractions are internally summed to total units. + function mintClaimWithFractions( + address account, + uint256 units, + uint256[] memory fractions, + string memory uri, + TransferRestrictions restrictions + ) external; + + /// @dev Function called to split `tokenID` owned by `account` into units declared in `values`. + /// @notice The sum of `values` must equal the current value of `_tokenID`. + function splitFraction(address account, uint256 tokenID, uint256[] memory _values) external; + + /// @dev Function called to merge tokens within `tokenIDs`. + /// @notice Tokens that have been merged are burned. + function mergeFractions(address account, uint256[] memory tokenIDs) external; + + /// @dev Function to burn the token at `tokenID` for `account` + /// @notice Operator must be allowed by `creator` and the token must represent the total amount of available units. + function burnFraction(address account, uint256 tokenID) external; + + /// @dev Returns the `units` held by a (fractional) token at `claimID` + /// @dev If `tokenID` is a base type, the total amount of `units` for the claim is returned. + /// @dev If `tokenID` is a fractional token, the `units` held by the token is returned + function unitsOf(uint256 tokenID) external view returns (uint256 units); + + /// @dev Returns the `units` held by `account` of a (fractional) token at `claimID` + /// @dev If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned. + /// @dev If `tokenID` is a fractional token, the `units` held by `account` the token is returned + function unitsOf(address account, uint256 tokenID) external view returns (uint256 units); + + /// @dev Returns the `uri` for metadata of the claim represented by `tokenID` + /// @dev Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata) + function uri(uint256 tokenID) external view returns (string memory metadata); +} diff --git a/contracts/contracts/libs/Errors.sol b/contracts/contracts/libs/Errors.sol new file mode 100644 index 00000000..e19d6b5c --- /dev/null +++ b/contracts/contracts/libs/Errors.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.16; + +/// @author bitbeckers +library Errors { + error AlreadyClaimed(); + error ArraySize(); + error DoesNotExist(); + error DuplicateEntry(); + error Invalid(); + error NotAllowed(); + error NotApprovedOrOwner(); + error TransfersNotAllowed(); + error TypeMismatch(); +} diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 83a3b04c..48f3d3d6 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -9,7 +9,6 @@ import { config as dotenvConfig } from "dotenv"; import fs from "fs"; import "hardhat-abi-exporter"; import "hardhat-preprocessor"; -import { HardhatUserConfig } from "hardhat/config"; import { resolve } from "path"; import "./tasks"; @@ -36,10 +35,14 @@ dotenvConfig({ path: resolve(__dirname, dotenvConfigPath) }); // Ensure that we have all the environment variables we need. const mnemonic = requireEnv(process.env.MNEMONIC, "MNEMONIC"); +const mnemonic_celo = requireEnv(process.env.MNEMONIC_CELO, "MNEMONIC_CELO"); const infuraApiKey = requireEnv(process.env.INFURA_API_KEY, "INFURA_API_KEY"); const alchemyOptimismUrl = requireEnv(process.env.ALCHEMY_OPTIMISM_URL, "ALCHEMY_OPTIMISM_URL"); + const etherscanApiKey = requireEnv(process.env.ETHERSCAN_API_KEY, "ETHERSCAN_API_KEY"); const optimisticEtherscanApiKey = requireEnv(process.env.OPTIMISTIC_ETHERSCAN_API_KEY, "OPTIMISTIC_ETHERSCAN_API_KEY"); +const celoscanApiKey = requireEnv(process.env.CELOSCAN_API_KEY, "CELOSCAN_API_KEY"); + const ozApiKey = requireEnv(process.env.OPENZEPPELIN_API_KEY, "OPENZEPPELIN_API_KEY"); const ozSecretKey = requireEnv(process.env.OPENZEPPELIN_SECRET_KEY, "OPENZEPPELIN_SECRET_KEY"); @@ -56,11 +59,13 @@ const chainIds = { // Optimism: https://docs.infura.io/infura/networks/optimism/how-to/choose-a-network "optimism-mainnet": 10, "optimism-goerli": 420, + // Celo + "celo-mainnet": 42220, }; function getChainConfig(chain: keyof typeof chainIds) { const jsonRpcUrl = "https://" + chain + ".infura.io/v3/" + infuraApiKey; - return { + let config = { accounts: { count: 10, mnemonic, @@ -69,6 +74,19 @@ function getChainConfig(chain: keyof typeof chainIds) { chainId: chainIds[chain], url: jsonRpcUrl, }; + + if (chain === "celo-mainnet") { + config = { + ...config, + accounts: { + count: 10, + mnemonic: mnemonic_celo, + path: "m/44'/52752'/0'/0", + }, + }; + } + + return config; } const config = { @@ -96,7 +114,18 @@ const config = { goerli: etherscanApiKey!, sepolia: etherscanApiKey!, optimisticEthereum: optimisticEtherscanApiKey!, + celo: celoscanApiKey!, }, + customChains: [ + { + network: "celo", + chainId: 42220, + urls: { + apiURL: "https://api.celoscan.io/api", + browserURL: "https://celoscan.io/", + }, + }, + ], }, networks: { hardhat: { @@ -111,6 +140,7 @@ const config = { localhost: { url: process.env.LOCALHOST_NETWORK_URL || "http://127.0.0.1:8545", }, + "celo-mainnet": getChainConfig("celo-mainnet"), goerli: getChainConfig("goerli"), sepolia: getChainConfig("sepolia"), mainnet: getChainConfig("mainnet"), diff --git a/contracts/tasks/deploy.ts b/contracts/tasks/deploy.ts index ea63c113..30927db5 100644 --- a/contracts/tasks/deploy.ts +++ b/contracts/tasks/deploy.ts @@ -4,6 +4,7 @@ import { writeFile } from "node:fs/promises"; task("deploy", "Deploy contracts and verify") .addOptionalParam("output", "write the details of the deployment to this file if this is set") .setAction(async ({ output }, { ethers, upgrades, network, run }) => { + console.log("Using address: ", await ethers.getSigners().then((res) => res[0])); const HypercertMinter = await ethers.getContractFactory("HypercertMinter"); const hypercertMinter = await upgrades.deployProxy(HypercertMinter, { kind: "uups", diff --git a/defender/package.json b/defender/package.json index cfb411d3..f2da4c70 100644 --- a/defender/package.json +++ b/defender/package.json @@ -5,15 +5,15 @@ "author": "Hypercerts Foundation", "license": "Apache-2.0", "main": "index.js", - "type": "module", "scripts": { - "build": "webpack", + "build": "rimraf build && webpack", "deploy:test": "pnpm build && pnpm setup:test", "deploy:prod": "pnpm build && pnpm setup:prod", - "setup:test": "NODE_OPTIONS='--no-warnings --loader ts-node/esm' npx ts-node src/setup.ts TEST", - "setup:prod": "NODE_OPTIONS='--no-warnings --loader ts-node/esm' npx ts-node src/setup.ts PROD" + "setup:test": "npx tsx src/setup.ts TEST", + "setup:prod": "npx tsx src/setup.ts PROD" }, "dependencies": { + "@hypercerts-org/contracts": "0.8.11", "@openzeppelin/defender-autotask-client": "^1.48.0", "@openzeppelin/defender-autotask-utils": "^1.48.0", "@openzeppelin/defender-base-client": "^1.48.0", @@ -23,12 +23,15 @@ "axios": "^1.2.6", "dotenv": "^16.0.3", "ethers": "5.7.2", - "node-fetch": "^3.3.0", - "ts-node": "^10.9.1" + "node-fetch": "^3.3.0" }, "devDependencies": { "@types/node": "^18.11.18", + "rimraf": "^5.0.5", + "terser-webpack-plugin": "^5.3.9", "ts-loader": "^9.4.2", + "ts-node": "^10.9.1", + "tsx": "^3.14.0", "typescript": "^4.9.4", "webpack": "^5.75.0", "webpack-cli": "^5.0.1" diff --git a/defender/src/auto-tasks/batch-mint-claims-from-allowlists.ts b/defender/src/auto-tasks/batch-mint-claims-from-allowlists.ts index a3a2aea4..558983f6 100644 --- a/defender/src/auto-tasks/batch-mint-claims-from-allowlists.ts +++ b/defender/src/auto-tasks/batch-mint-claims-from-allowlists.ts @@ -2,14 +2,14 @@ import { AutotaskEvent, BlockTriggerEvent, } from "@openzeppelin/defender-autotask-utils"; -import { abi } from "../HypercertMinterABI"; +import { HypercertMinterAbi } from "@hypercerts-org/contracts"; import { MissingDataError, NotImplementedError } from "../errors"; import { getNetworkConfigFromName, SUPABASE_ALLOWLIST_TABLE_NAME, } from "../networks"; import { createClient } from "@supabase/supabase-js"; -import { ethers } from "ethers"; +import { BigNumber, ethers } from "ethers"; import fetch from "node-fetch"; export async function handler(event: AutotaskEvent) { @@ -69,7 +69,7 @@ export async function handler(event: AutotaskEvent) { console.log("Contract address", contractAddress); console.log("From address", fromAddress); - const contractInterface = new ethers.utils.Interface(abi); + const contractInterface = new ethers.utils.Interface(HypercertMinterAbi); // Parse events // Parse events @@ -97,8 +97,8 @@ export async function handler(event: AutotaskEvent) { } // Get claimIDs - const claimIds = batchTransferEvents[0].args["claimIDs"] as string[]; - console.log("ClaimIDs: ", batchTransferEvents[0].args["claimIDs"].toString()); + const claimIds = batchTransferEvents[0].args[0] as BigNumber[]; + console.log("ClaimIDs: ", claimIds.toString()); const formattedClaimIds = claimIds.map( (claimId) => `${contractAddress}-${claimId.toString().toLowerCase()}`, diff --git a/defender/src/auto-tasks/mint-claim-from-allowlist.ts b/defender/src/auto-tasks/mint-claim-from-allowlist.ts index 586c7fc0..b53ca014 100644 --- a/defender/src/auto-tasks/mint-claim-from-allowlist.ts +++ b/defender/src/auto-tasks/mint-claim-from-allowlist.ts @@ -1,4 +1,4 @@ -import { abi } from "../HypercertMinterABI"; +import { HypercertMinterAbi } from "@hypercerts-org/contracts"; import { MissingDataError, NotImplementedError } from "../errors"; import { getNetworkConfigFromName, @@ -70,7 +70,7 @@ export async function handler(event: AutotaskEvent) { console.log("Contract address", contractAddress); console.log("From address", fromAddress); - const contractInterface = new ethers.utils.Interface(abi); + const contractInterface = new ethers.utils.Interface(HypercertMinterAbi); // Parse events const batchTransferEvents = txnLogs diff --git a/defender/src/auto-tasks/on-allowlist-created.ts b/defender/src/auto-tasks/on-allowlist-created.ts index 2259bd92..0e73472b 100644 --- a/defender/src/auto-tasks/on-allowlist-created.ts +++ b/defender/src/auto-tasks/on-allowlist-created.ts @@ -1,4 +1,3 @@ -import { abi } from "../HypercertMinterABI"; import { MissingDataError, NotImplementedError } from "../errors"; import { AutotaskEvent, @@ -10,9 +9,10 @@ import { } from "../networks"; import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; import { createClient } from "@supabase/supabase-js"; -import axios from "axios"; import { ethers } from "ethers"; import fetch from "node-fetch"; +import axios from "axios"; +import { HypercertMinterAbi } from "@hypercerts-org/contracts"; const getIpfsGatewayUri = (cidOrIpfsUri: string) => { const NFT_STORAGE_IPFS_GATEWAY = "https://nftstorage.link/ipfs/{cid}"; @@ -72,14 +72,17 @@ export async function handler(event: AutotaskEvent) { throw new Error("No provider available"); } - const contractInterface = new ethers.utils.Interface(abi); - const contract = new ethers.Contract(contractAddress, abi, provider); + const contract = new ethers.Contract( + contractAddress, + HypercertMinterAbi, + provider, + ); //Ignore unknown events const allowlistCreatedEvents = txnLogs .map((l) => { try { - return contractInterface.parseLog(l); + return contract.interface.parseLog(l); } catch (e) { console.log("Failed to parse log", l); return null; @@ -98,7 +101,7 @@ export async function handler(event: AutotaskEvent) { ); } - const tokenId = allowlistCreatedEvents[0].args["tokenID"].toString(); + const tokenId = allowlistCreatedEvents[0].args[0].toString(); console.log("TokenId: ", tokenId); const metadataUri = await contract.functions.uri(tokenId); diff --git a/defender/src/config.ts b/defender/src/config.ts index 2d9372f4..09daf322 100644 --- a/defender/src/config.ts +++ b/defender/src/config.ts @@ -1,4 +1,4 @@ -import { NETWORKS, SupportedNetworks } from "./networks.js"; +import { NETWORKS, SupportedNetworks } from "./networks"; import * as dotenv from "dotenv"; dotenv.config(); diff --git a/defender/src/create-autotask.ts b/defender/src/create-autotask.ts index cc5de9dd..6cecaddd 100644 --- a/defender/src/create-autotask.ts +++ b/defender/src/create-autotask.ts @@ -1,4 +1,4 @@ -import config from "./config.js"; +import config from "./config"; import { AutotaskClient } from "@openzeppelin/defender-autotask-client"; import { SentinelTrigger } from "@openzeppelin/defender-autotask-client/lib/models/autotask.js"; diff --git a/defender/src/create-sentinel.ts b/defender/src/create-sentinel.ts index 107ad170..58acfd90 100644 --- a/defender/src/create-sentinel.ts +++ b/defender/src/create-sentinel.ts @@ -1,6 +1,6 @@ import { abi } from "./HypercertMinterABI.js"; import config from "./config.js"; -import { NetworkConfig } from "./networks.js"; +import { NetworkConfig } from "./networks"; import { SentinelClient } from "@openzeppelin/defender-sentinel-client"; import { EventCondition, diff --git a/defender/src/networks.ts b/defender/src/networks.ts index 8d49def0..ffbc1fba 100644 --- a/defender/src/networks.ts +++ b/defender/src/networks.ts @@ -42,6 +42,12 @@ export const NETWORKS: SupportedNetworks = { alchemyKeyEnvName: "ALCHEMY_OPTIMISM_KEY", chainId: 10, }, + { + networkKey: "celo", + contractAddress: "0x16ba53b74c234c870c61efc04cd418b8f2865959", + chainId: 42220, + rpc: "https://forno.celo.org", + }, ], }; diff --git a/defender/src/reset.ts b/defender/src/reset.ts index 8cac156c..010d86e1 100644 --- a/defender/src/reset.ts +++ b/defender/src/reset.ts @@ -1,4 +1,4 @@ -import config from "./config.js"; +import config from "./config"; import { AutotaskClient } from "@openzeppelin/defender-autotask-client"; import { SentinelClient } from "@openzeppelin/defender-sentinel-client"; diff --git a/defender/src/rollout.ts b/defender/src/rollout.ts index 2c535de2..3904cd36 100644 --- a/defender/src/rollout.ts +++ b/defender/src/rollout.ts @@ -1,7 +1,7 @@ -import { createTask } from "./create-autotask.js"; -import { createSentinel } from "./create-sentinel.js"; -import { ApiError } from "./errors.js"; -import { NetworkConfig, encodeName } from "./networks.js"; +import { createTask } from "./create-autotask"; +import { createSentinel } from "./create-sentinel"; +import { ApiError } from "./errors"; +import { NetworkConfig, encodeName } from "./networks"; export const rollOut = async (networks: NetworkConfig[]) => { return await Promise.all( diff --git a/defender/src/setup.ts b/defender/src/setup.ts index 9d5683b6..0d56ee67 100644 --- a/defender/src/setup.ts +++ b/defender/src/setup.ts @@ -1,9 +1,9 @@ -import config from "./config.js"; -import { ApiError, ConfigError } from "./errors.js"; -import { NETWORKS } from "./networks.js"; -import { reset } from "./reset.js"; -import { rollOut } from "./rollout.js"; -import { updateAutotask, updateSentinel } from "./update.js"; +import config from "./config"; +import { ApiError, ConfigError } from "./errors"; +import { NETWORKS } from "./networks"; +import { reset } from "./reset"; +import { rollOut } from "./rollout"; +import { updateAutotask, updateSentinel } from "./update"; import { AutotaskClient } from "@openzeppelin/defender-autotask-client"; import { SentinelClient } from "@openzeppelin/defender-sentinel-client"; diff --git a/defender/src/update.ts b/defender/src/update.ts index 66cf5e50..874b2d00 100644 --- a/defender/src/update.ts +++ b/defender/src/update.ts @@ -1,6 +1,6 @@ -import { abi } from "./HypercertMinterABI.js"; -import config from "./config.js"; -import { NetworkConfig, decodeName } from "./networks.js"; +import { abi } from "./HypercertMinterABI"; +import config from "./config"; +import { NetworkConfig, decodeName } from "./networks"; import { AutotaskClient } from "@openzeppelin/defender-autotask-client"; import { SentinelClient } from "@openzeppelin/defender-sentinel-client"; diff --git a/defender/tsconfig.json b/defender/tsconfig.json index c23008ac..7a1fd6c3 100644 --- a/defender/tsconfig.json +++ b/defender/tsconfig.json @@ -15,6 +15,7 @@ "noImplicitAny": true, "removeComments": true, "resolveJsonModule": true, + "skipLibCheck": true, "sourceMap": false, "strict": false, "target": "es6" diff --git a/defender/webpack.config.cjs b/defender/webpack.config.cjs index b077fddc..bf701568 100644 --- a/defender/webpack.config.cjs +++ b/defender/webpack.config.cjs @@ -1,15 +1,18 @@ const path = require("path"); const webpack = require("webpack"); +const TerserPlugin = require("terser-webpack-plugin"); module.exports = { entry: { - 'batch-mint-claims-from-allowlists': "./src/auto-tasks/batch-mint-claims-from-allowlists.ts", - 'on-allowlist-created': "./src/auto-tasks/on-allowlist-created.ts", - 'mint-claim-from-allowlist': "./src/auto-tasks/mint-claim-from-allowlist.ts" + "batch-mint-claims-from-allowlists": + "./src/auto-tasks/batch-mint-claims-from-allowlists.ts", + "on-allowlist-created": "./src/auto-tasks/on-allowlist-created.ts", + "mint-claim-from-allowlist": + "./src/auto-tasks/mint-claim-from-allowlist.ts", }, target: "node", mode: "development", - devtool: 'cheap-module-source-map', + devtool: "cheap-module-source-map", module: { rules: [{ test: /\.tsx?$/, use: "ts-loader", exclude: /node_modules/ }], }, @@ -32,10 +35,14 @@ module.exports = { // List here all dependencies that are not run in the Autotask environment new webpack.IgnorePlugin({ resourceRegExp: /dotenv/ }), ], + optimization: { + minimize: true, + minimizer: [new TerserPlugin()], + }, output: { filename: "[name]/index.js", path: path.resolve(__dirname, "build", "relay"), - sourceMapFilename: '[file].map', + sourceMapFilename: "[file].map", library: { type: "commonjs2" }, }, }; diff --git a/frontend/components/dapp-context.tsx b/frontend/components/dapp-context.tsx index 86d1cf4b..e0d4c179 100644 --- a/frontend/components/dapp-context.tsx +++ b/frontend/components/dapp-context.tsx @@ -31,14 +31,21 @@ import { import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import React, { ReactNode, useEffect } from "react"; -import { Chain, goerli, optimism, sepolia } from "viem/chains"; +import { celo, Chain, goerli, optimism, sepolia } from "viem/chains"; import { configureChains, WagmiConfig, createConfig } from "wagmi"; import { publicProvider } from "wagmi/providers/public"; +import { + Valora, + CeloWallet, + CeloTerminal, + MetaMask as CeloMetaMask, +} from "@celo/rainbowkit-celo/wallets"; + const queryClient = new QueryClient(); const TEST_CHAINS = [goerli, sepolia]; -const PROD_CHAINS = [optimism]; +const PROD_CHAINS = [optimism, celo]; export const CHAINS = (isProduction ? PROD_CHAINS : TEST_CHAINS) as Chain[]; @@ -72,6 +79,16 @@ const connectors = connectorsForWallets([ zerionWallet({ chains, projectId }), ], }, + { + groupName: "Recommended with CELO", + wallets: [ + Valora({ chains, projectId }), + CeloWallet({ chains, projectId }), + CeloTerminal({ chains, projectId }), + CeloMetaMask({ chains, projectId }), + walletConnectWallet({ projectId, chains }), + ], + }, { groupName: "Injected", wallets: [injectedWallet({ chains })], diff --git a/frontend/package.json b/frontend/package.json index 975d0cff..3630a308 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,12 +19,14 @@ }, "dependencies": { "@apollo/client": "^3.7.4", + "@celo/rainbowkit-celo": "^1.1.0", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@graphprotocol/client-cli": "^2.2.16", "@hypercerts-org/contracts": "0.8.11", + "@hypercerts-org/contracts": "0.8.11", "@hypercerts-org/observabletreemap": "workspace: *", - "@hypercerts-org/sdk": "0.8.10", + "@hypercerts-org/sdk": "0.8.16", "@mui/icons-material": "^5.11.9", "@mui/material": "^5.11.2", "@mui/x-date-pickers": "^5.0.12", diff --git a/graph/networks.json b/graph/networks.json index 6e001089..28925338 100644 --- a/graph/networks.json +++ b/graph/networks.json @@ -1,4 +1,10 @@ { + "celo": { + "HypercertMinter": { + "address": "0x16ba53b74c234c870c61efc04cd418b8f2865959", + "startBlock": 22079542 + } + }, "goerli": { "HypercertMinter": { "address": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", diff --git a/graph/package.json b/graph/package.json index 1eb107be..c6ab7e5f 100644 --- a/graph/package.json +++ b/graph/package.json @@ -3,11 +3,6 @@ "license": "Apache-2.0", "version": "0.0.1", "private": true, - "workspaces": { - "nohoist": [ - "**" - ] - }, "scripts": { "auth": "graph auth --product hosted-service $SUBGRAPH_ACCESS_TOKEN", "coverage": "graph test -- -c", @@ -15,7 +10,8 @@ "build:graph": "graph build", "build:codegen": "graph codegen", "deploy:test": "pnpm auth && pnpm deploy:goerli && pnpm deploy:sepolia", - "deploy:prod": "pnpm auth && pnpm deploy:optimism", + "deploy:prod": "pnpm auth && pnpm deploy:optimism && pnpm deploy:celo", + "deploy:celo": "graph deploy --node https://api.thegraph.com/deploy/ --network celo hypercerts-admin/hypercerts-celo", "deploy:goerli": "graph deploy --node https://api.thegraph.com/deploy/ --network goerli hypercerts-admin/hypercerts-testnet", "deploy:optimism": "graph deploy --node https://api.thegraph.com/deploy/ --network optimism hypercerts-admin/hypercerts-optimism-mainnet", "deploy:sepolia": "graph deploy --node https://api.thegraph.com/deploy/ --network sepolia hypercerts-admin/hypercerts-sepolia", @@ -25,11 +21,13 @@ "graph": "graph", "test": "graph test" }, - "dependencies": { - "@graphprotocol/graph-cli": "0.57.0" - }, "devDependencies": { + "@graphprotocol/graph-cli": "0.60.0", "@graphprotocol/graph-ts": "0.31.0", - "matchstick-as": "0.5.2" - } + "assemblyscript": "0.19.23", + "matchstick-as": "0.6.0" + }, + "//": [ + "Pinned assemblyscript verion: https://github.com/LimeChain/matchstick/issues/324" + ] } diff --git a/graph/subgraph.yaml b/graph/subgraph.yaml index 38924776..ada9aab5 100644 --- a/graph/subgraph.yaml +++ b/graph/subgraph.yaml @@ -4,11 +4,11 @@ schema: dataSources: - kind: ethereum/contract name: HypercertMinter - network: sepolia + network: celo source: abi: HypercertMinter - address: "0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941" - startBlock: 4421942 + address: "0x16ba53b74c234c870c61efc04cd418b8f2865959" + startBlock: 22079542 mapping: kind: ethereum/events apiVersion: 0.0.7 diff --git a/graph/tests/.latest.json b/graph/tests/.latest.json index 1402a72b..4651dd06 100644 --- a/graph/tests/.latest.json +++ b/graph/tests/.latest.json @@ -1,4 +1,4 @@ { - "version": "0.5.4", - "timestamp": 1697021487648 + "version": "0.6.0", + "timestamp": 1698094053842 } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 61a73b57..531025b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,10 +14,10 @@ importers: devDependencies: '@playwright/test': specifier: ^1.35.1 - version: 1.38.1 + version: 1.39.0 '@synthetixio/synpress': specifier: ^3.7.1 - version: 3.7.1(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(webpack@5.88.2) + version: 3.7.1(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(webpack@5.89.0) husky: specifier: ^8.0.3 version: 8.0.3 @@ -29,16 +29,16 @@ importers: version: 2.8.8 turbo: specifier: ^1.10.15 - version: 1.10.15 + version: 1.10.16 contracts: devDependencies: '@commitlint/cli': specifier: ^17.1.2 - version: 17.8.0 + version: 17.8.1 '@commitlint/config-conventional': specifier: ^17.1.0 - version: 17.8.0 + version: 17.8.1 '@dlsl/hardhat-markup': specifier: ^1.0.0-rc.7 version: 1.0.0-rc.14(hardhat@2.13.1)(prettier@2.8.8) @@ -59,7 +59,7 @@ importers: version: 1.0.9(hardhat@2.13.1) '@nomicfoundation/hardhat-toolbox': specifier: ^2.0.0 - version: 2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(@typechain/ethers-v5@11.1.2)(@typechain/hardhat@9.1.0)(@types/chai@4.3.7)(@types/mocha@9.1.0)(@types/node@18.15.13)(chai@4.3.10)(ethers@5.7.2)(hardhat-gas-reporter@1.0.9)(hardhat@2.13.1)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.1)(typescript@4.9.5) + version: 2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(@typechain/ethers-v5@11.1.2)(@typechain/hardhat@9.1.0)(@types/chai@4.3.9)(@types/mocha@9.1.0)(@types/node@18.18.6)(chai@4.3.10)(ethers@5.7.2)(hardhat-gas-reporter@1.0.9)(hardhat@2.13.1)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.2)(typescript@4.9.5) '@nomiclabs/hardhat-ethers': specifier: ^2.2.1 version: 2.2.3(ethers@5.7.2)(hardhat@2.13.1) @@ -89,25 +89,25 @@ importers: version: 3.4.0(prettier@2.8.8) '@typechain/ethers-v5': specifier: ^11.1.1 - version: 11.1.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@4.9.5) + version: 11.1.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.1) + version: 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2) '@types/chai': specifier: ^4.3.4 - version: 4.3.7 + version: 4.3.9 '@types/mocha': specifier: 9.1.0 version: 9.1.0 '@types/node': specifier: ^18.11.11 - version: 18.15.13 + version: 18.18.6 '@typescript-eslint/eslint-plugin': specifier: ^5.38.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@4.9.5) + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.52.0)(typescript@4.9.5) '@typescript-eslint/parser': specifier: ^5.38.0 - version: 5.62.0(eslint@8.51.0)(typescript@4.9.5) + version: 5.62.0(eslint@8.52.0)(typescript@4.9.5) chai: specifier: ^4.3.7 version: 4.3.10 @@ -128,10 +128,10 @@ importers: version: 16.3.1 eslint: specifier: ^8.23.1 - version: 8.51.0 + version: 8.52.0 eslint-config-prettier: specifier: ^8.5.0 - version: 8.10.0(eslint@8.51.0) + version: 8.10.0(eslint@8.52.0) ethers: specifier: ^5.7.2 version: 5.7.2 @@ -173,7 +173,7 @@ importers: version: 6.1.0(rollup@4.1.4)(typescript@4.9.5) rollup-plugin-esbuild: specifier: ^6.1.0 - version: 6.1.0(esbuild@0.18.20)(rollup@4.1.4) + version: 6.1.0(esbuild@0.19.5)(rollup@4.1.4) rollup-plugin-node-polyfills: specifier: ^0.2.1 version: 0.2.1 @@ -191,10 +191,10 @@ importers: version: 0.8.5(hardhat@2.13.1) ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@18.15.13)(typescript@4.9.5) + version: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) typechain: specifier: ^8.3.1 - version: 8.3.1(typescript@4.9.5) + version: 8.3.2(typescript@4.9.5) typescript: specifier: ^4.9.4 version: 4.9.5 @@ -203,7 +203,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: ^4.20230115.0 - version: 4.20231002.0 + version: 4.20231016.0 typescript: specifier: ^4.9.5 version: 4.9.5 @@ -216,6 +216,9 @@ importers: defender: dependencies: + '@hypercerts-org/contracts': + specifier: 0.8.11 + version: 0.8.11 '@openzeppelin/defender-autotask-client': specifier: ^1.48.0 version: 1.49.0 @@ -233,7 +236,7 @@ importers: version: 1.0.5 '@supabase/supabase-js': specifier: ^2.4.1 - version: 2.38.0 + version: 2.38.2 axios: specifier: ^1.2.6 version: 1.5.1(debug@4.3.4) @@ -246,25 +249,34 @@ importers: node-fetch: specifier: ^3.3.0 version: 3.3.2 - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@18.15.13)(typescript@4.9.5) devDependencies: '@types/node': specifier: ^18.11.18 - version: 18.15.13 + version: 18.18.6 + rimraf: + specifier: ^5.0.5 + version: 5.0.5 + terser-webpack-plugin: + specifier: ^5.3.9 + version: 5.3.9(webpack@5.89.0) ts-loader: specifier: ^9.4.2 - version: 9.5.0(typescript@4.9.5)(webpack@5.88.2) + version: 9.5.0(typescript@4.9.5)(webpack@5.89.0) + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + tsx: + specifier: ^3.14.0 + version: 3.14.0 typescript: specifier: ^4.9.4 version: 4.9.5 webpack: specifier: ^5.75.0 - version: 5.88.2(webpack-cli@5.1.4) + version: 5.89.0(webpack-cli@5.1.4) webpack-cli: specifier: ^5.0.1 - version: 5.1.4(webpack@5.88.2) + version: 5.1.4(webpack@5.89.0) docs: dependencies: @@ -273,7 +285,7 @@ importers: version: 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/preset-classic': specifier: ^2.4.1 - version: 2.4.3(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.8.3)(typescript@4.9.5) + version: 2.4.3(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5) '@docusaurus/theme-mermaid': specifier: ^2.4.1 version: 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) @@ -316,16 +328,19 @@ importers: dependencies: '@apollo/client': specifier: ^3.7.4 - version: 3.8.5(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + version: 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + '@celo/rainbowkit-celo': + specifier: ^1.1.0 + version: 1.1.0(@rainbow-me/rainbowkit@1.0.8)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(wagmi@1.3.9)(zod@3.22.4) '@emotion/react': specifier: ^11.10.5 - version: 11.11.1(@types/react@18.2.28)(react@18.2.0) + version: 11.11.1(@types/react@18.2.31)(react@18.2.0) '@emotion/styled': specifier: ^11.10.5 - version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.28)(react@18.2.0) + version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) '@graphprotocol/client-cli': specifier: ^2.2.16 - version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.5) + version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': specifier: 0.8.11 version: 0.8.11 @@ -333,56 +348,56 @@ importers: specifier: 'workspace: *' version: link:../vendor/observabletreemap '@hypercerts-org/sdk': - specifier: 0.8.10 - version: 0.8.10(@babel/core@7.23.2)(@envelop/core@3.0.6)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(node-fetch@3.3.2)(react-native@0.72.5)(typescript@5.1.6)(uint8arraylist@2.4.3) + specifier: 0.8.16 + version: 0.8.16(@envelop/core@3.0.6)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3) '@mui/icons-material': specifier: ^5.11.9 - version: 5.14.13(@mui/material@5.14.13)(@types/react@18.2.28)(react@18.2.0) + version: 5.14.14(@mui/material@5.14.14)(@types/react@18.2.31)(react@18.2.0) '@mui/material': specifier: ^5.11.2 - version: 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0) + version: 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) '@mui/x-date-pickers': specifier: ^5.0.12 - version: 5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.13)(@mui/system@5.14.13)(@types/react@18.2.28)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + version: 5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(@mui/system@5.14.14)(@types/react@18.2.31)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@next/eslint-plugin-next': specifier: ^13.4.12 - version: 13.5.4 + version: 13.5.6 '@observablehq/runtime': specifier: '5' - version: 5.9.3 + version: 5.9.4 '@openzeppelin/merkle-tree': specifier: ^1.0.2 version: 1.0.5 '@plasmicapp/host': specifier: ^1.0.171 - version: 1.0.171(react-dom@18.2.0)(react@18.2.0) + version: 1.0.177(react-dom@18.2.0)(react@18.2.0) '@plasmicapp/loader-nextjs': specifier: ^1.0.284 - version: 1.0.321(next@13.5.4)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.333(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) '@rainbow-me/rainbowkit': specifier: 1.0.8 - version: 1.0.8(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0)(viem@1.5.3)(wagmi@1.3.9) + version: 1.0.8(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0)(viem@1.5.3)(wagmi@1.3.9) '@sentry/nextjs': specifier: ^7.73.0 - version: 7.73.0(next@13.5.4)(react@18.2.0)(webpack@5.88.2) + version: 7.74.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0) '@sentry/utils': specifier: ^7.73.0 - version: 7.73.0 + version: 7.74.1 '@supabase/supabase-js': specifier: ^2.1.2 - version: 2.38.0 + version: 2.38.2 '@tanstack/react-query': specifier: ^4.36.1 - version: 4.36.1(react-dom@18.2.0)(react-native@0.72.5)(react@18.2.0) + version: 4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0) '@tanstack/react-query-devtools': specifier: ^4.29.12 version: 4.36.1(@tanstack/react-query@4.36.1)(react-dom@18.2.0)(react@18.2.0) '@types/bn.js': specifier: ^5.1.2 - version: 5.1.2 + version: 5.1.3 '@types/lodash': specifier: ^4.14.199 - version: 4.14.199 + version: 4.14.200 bn.js: specifier: ^5.2.1 version: 5.2.1 @@ -403,10 +418,10 @@ importers: version: 2.4.5(react@18.2.0) formik-mui: specifier: ^5.0.0-alpha.0 - version: 5.0.0-alpha.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.13)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3) + version: 5.0.0-alpha.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3) formik-mui-x-date-pickers: specifier: ^0.0.1 - version: 0.0.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.13)(@mui/system@5.14.13)(@mui/x-date-pickers@5.0.20)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3) + version: 0.0.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(@mui/system@5.14.14)(@mui/x-date-pickers@5.0.20)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3) graphql: specifier: ^16.6.0 version: 16.8.1 @@ -421,16 +436,16 @@ importers: version: 4.17.21 next: specifier: latest - version: 13.5.4(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + version: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) papaparse: specifier: ^5.4.1 version: 5.4.1 primereact: specifier: ^9.6.0 - version: 9.6.2(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0) + version: 9.6.3(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) qs: specifier: ^6.11.0 - version: 6.11.0 + version: 6.11.2 random-words: specifier: ^2.0.0 version: 2.0.0 @@ -445,7 +460,7 @@ importers: version: 14.2.3(react@18.2.0) react-markdown: specifier: ^8.0.7 - version: 8.0.7(@types/react@18.2.28)(react@18.2.0) + version: 8.0.7(@types/react@18.2.31)(react@18.2.0) react-toastify: specifier: ^9.1.1 version: 9.1.3(react-dom@18.2.0)(react@18.2.0) @@ -460,7 +475,7 @@ importers: version: 1.5.3(typescript@5.1.6)(zod@3.22.4) wagmi: specifier: 1.3.9 - version: 1.3.9(@types/react@18.2.28)(react-dom@18.2.0)(react-native@0.72.5)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) + version: 1.3.9(@types/react@18.2.31)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) yup: specifier: ^0.32.11 version: 0.32.11 @@ -479,19 +494,19 @@ importers: version: 14.5.1(@testing-library/dom@9.3.3) '@types/node': specifier: ^18.0.0 - version: 18.15.13 + version: 18.18.6 '@types/papaparse': specifier: ^5.3.7 - version: 5.3.9 + version: 5.3.10 '@types/qs': specifier: ^6.9.7 - version: 6.9.8 + version: 6.9.9 '@types/react': specifier: ^18.0.14 - version: 18.2.28 + version: 18.2.31 '@types/react-dom': specifier: ^18.0.5 - version: 18.2.13 + version: 18.2.14 '@types/testing-library__jest-dom': specifier: ^5.14.5 version: 5.14.9 @@ -515,7 +530,7 @@ importers: version: 1.1.7 jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@18.15.13)(ts-node@10.9.1) + version: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) jest-environment-jsdom: specifier: ^29.5.0 version: 29.7.0 @@ -523,6 +538,21 @@ importers: specifier: 5.1.6 version: 5.1.6 + graph: + devDependencies: + '@graphprotocol/graph-cli': + specifier: 0.60.0 + version: 0.60.0(@types/node@18.18.6)(node-fetch@3.3.2)(typescript@4.9.5) + '@graphprotocol/graph-ts': + specifier: 0.31.0 + version: 0.31.0 + assemblyscript: + specifier: 0.19.23 + version: 0.19.23 + matchstick-as: + specifier: 0.6.0 + version: 0.6.0 + sdk: dependencies: '@ethereum-attestation-service/eas-sdk': @@ -533,16 +563,49 @@ importers: version: 5.7.0 '@graphprotocol/client-add-source-name': specifier: ^1.0.16 - version: 1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-cli': - specifier: ^2.2.15 - version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.5) + version: 1.0.20(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-polling-live': + specifier: ^2.0.0 + version: 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) + '@graphql-mesh/cache-localforage': + specifier: ^0.95.7 + version: 0.95.7(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/cross-helpers': + specifier: ^0.4.1 + version: 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/graphql': + specifier: ^0.95.7 + version: 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) + '@graphql-mesh/http': + specifier: ^0.96.13 + version: 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.12)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/merger-bare': + specifier: ^0.95.7 + version: 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': + specifier: ^0.96.12 + version: 0.96.12(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': + specifier: ^0.95.7 + version: 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': + specifier: ^0.95.7 + version: 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': + specifier: ^0.95.7 + version: 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-typed-document-node/core': + specifier: ^3.2.0 + version: 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': specifier: 0.8.11 version: 0.8.11 '@openzeppelin/merkle-tree': specifier: ^1.0.4 version: 1.0.5 + '@whatwg-node/fetch': + specifier: ^0.9.13 + version: 0.9.13 ajv: specifier: ^8.11.2 version: 8.12.0 @@ -563,7 +626,7 @@ importers: version: 0.17.0(uint8arraylist@2.4.3) jest: specifier: ^29.3.1 - version: 29.7.0(@types/node@18.15.13)(ts-node@10.9.1) + version: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) loglevel: specifier: ^1.8.1 version: 1.8.1 @@ -589,6 +652,9 @@ importers: '@faker-js/faker': specifier: ^8.0.2 version: 8.2.0 + '@graphprotocol/client-cli': + specifier: ^3.0.0 + version: 3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@jest/globals': specifier: ^29.7.0 version: 29.7.0 @@ -603,19 +669,19 @@ importers: version: 15.2.3(rollup@3.29.4) '@types/chai': specifier: ^4.3.4 - version: 4.3.7 + version: 4.3.9 '@types/chai-subset': specifier: ^1.3.3 - version: 1.3.3 + version: 1.3.4 '@types/jest': specifier: ^29.2.5 - version: 29.5.5 + version: 29.5.6 '@types/node': specifier: ^18.11.17 - version: 18.15.13 + version: 18.18.6 '@types/sinon': specifier: ^10.0.15 - version: 10.0.19 + version: 10.0.20 babel-jest: specifier: ^29.7.0 version: 29.7.0(@babel/core@7.23.2) @@ -681,10 +747,13 @@ importers: version: 10.0.0(mocha@10.2.0) ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@18.15.13)(typescript@4.9.5) + version: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) tslib: specifier: ^2.5.0 version: 2.6.2 + tsx: + specifier: ^3.14.0 + version: 3.14.0 typedoc: specifier: ^0.23.25 version: 0.23.28(typescript@4.9.5) @@ -702,7 +771,7 @@ importers: dependencies: '@observablehq/runtime': specifier: 4 - 5 - version: 5.9.3 + version: 5.9.4 packages: @@ -719,11 +788,10 @@ packages: sprintf-js: 1.1.2 dev: false - /@achingbrain/nat-port-mapper@1.0.11: - resolution: {integrity: sha512-Y2lwx0zmrwEl+IGu+V/QiVBdcdsWscYq1PMMEjvyuuaXnmnppbLWilO8LK1yoLdncxwJBuS0zZtHbpFeWBusRg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + /@achingbrain/nat-port-mapper@1.0.12: + resolution: {integrity: sha512-rU4G75TEOTIPlkeDnPEVwx/VmMMFta42kY2SMmVobRkrtNLnxtU08Yhriu6tSBc9oO0wXdfNNeuLnNnEnL7w/A==} dependencies: - '@achingbrain/ssdp': 4.0.4 + '@achingbrain/ssdp': 4.0.6 '@libp2p/logger': 3.0.3 default-gateway: 7.2.2 err-code: 3.0.1 @@ -735,14 +803,13 @@ packages: - supports-color dev: false - /@achingbrain/ssdp@4.0.4: - resolution: {integrity: sha512-fY/ShiYJmhLdr45Vn2+f88xTqZjBSH3X3F+EJu/89cjB1JIkMCVtD5CQaaS38YknIL8cEcNhjMZM4cdE3ckSSQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + /@achingbrain/ssdp@4.0.6: + resolution: {integrity: sha512-Y4JE2L9150i50V6lg/Y8+ilhxRpUZKKv+PKo68Aj7MjPfaUAar6ZHilF9h4/Zb3q0fqGMXNc9o11cQLNI8J8bA==} dependencies: event-iterator: 2.0.0 freeport-promise: 2.0.0 merge-options: 3.0.4 - xml2js: 0.5.0 + xml2js: 0.6.2 dev: false /@adobe/css-tools@4.3.1: @@ -752,10 +819,10 @@ packages: /@adraffy/ens-normalize@1.9.0: resolution: {integrity: sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ==} - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.8.3): + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.8.3) + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0) '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) transitivePeerDependencies: - '@algolia/client-search' @@ -763,13 +830,13 @@ packages: - search-insights dev: false - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.8.3): + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0): resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} peerDependencies: search-insights: '>= 1 < 3' dependencies: '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) - search-insights: 2.8.3 + search-insights: 2.9.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch @@ -895,10 +962,10 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 - /@apollo/client@3.8.5(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-/ueWC3f1pFeH+tWbM1phz6pzUGGijyml6oQ+LKUcQzpXF6tVFPrb6oUIUQCbZpr6Xmv/dtNiFDohc39ra7Solg==} + /@apollo/client@3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FnHg3vhQP8tQzgBs6oTJCFFIbovelDGYujj6MK7CJneiHf62TJstCIO0Ot4A1h7XrgFEtgl8a/OgajQWqrTuYw==} peerDependencies: graphql: ^16.6.0 graphql-ws: ^5.5.5 @@ -944,7 +1011,6 @@ packages: ajv-formats: 2.1.1(ajv@8.12.0) fast-deep-equal: 3.1.3 rfdc: 1.3.0 - dev: false /@ardatan/relay-compiler@12.0.0(graphql@16.8.1): resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} @@ -955,7 +1021,7 @@ packages: '@babel/core': 7.23.2 '@babel/generator': 7.23.0 '@babel/parser': 7.23.0 - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 babel-preset-fbjs: 3.4.0(@babel/core@7.23.2) @@ -973,7 +1039,6 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false /@ardatan/sync-fetch@0.0.1: resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==} @@ -982,7 +1047,6 @@ packages: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: false /@assemblyscript/loader@0.9.4: resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} @@ -992,21 +1056,21 @@ packages: resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} dependencies: '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.425.0 + '@aws-sdk/types': 3.433.0 tslib: 1.14.1 /@aws-crypto/util@1.2.2: resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} dependencies: - '@aws-sdk/types': 3.425.0 + '@aws-sdk/types': 3.433.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 - /@aws-sdk/types@3.425.0: - resolution: {integrity: sha512-6lqbmorwerN4v+J5dqbHPAsjynI0mkEF+blf+69QTaKKGaxBBVaXgqoqul9RXYcK5MMrrYRbQIMd0zYOoy90kA==} + /@aws-sdk/types@3.433.0: + resolution: {integrity: sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.3.5 + '@smithy/types': 2.4.0 tslib: 2.6.2 /@aws-sdk/util-utf8-browser@3.259.0: @@ -1021,10 +1085,6 @@ packages: '@babel/highlight': 7.22.20 chalk: 2.4.2 - /@babel/compat-data@7.22.20: - resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} - engines: {node: '>=6.9.0'} - /@babel/compat-data@7.23.2: resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} engines: {node: '>=6.9.0'} @@ -1036,10 +1096,10 @@ packages: '@babel/code-frame': 7.22.13 '@babel/generator': 7.23.0 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.12.9) - '@babel/helpers': 7.23.1 + '@babel/helpers': 7.23.2 '@babel/parser': 7.23.0 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 + '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@8.1.1) @@ -1059,14 +1119,14 @@ packages: dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 + '@babel/generator': 7.17.7 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.17.8) '@babel/helpers': 7.23.2 - '@babel/parser': 7.23.0 + '@babel/parser': 7.18.9 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/traverse': 7.17.3 + '@babel/types': 7.17.0 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -1076,29 +1136,6 @@ packages: - supports-color dev: true - /@babel/core@7.23.0: - resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helpers': 7.23.1 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 - '@babel/types': 7.23.0 - convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/core@7.23.2: resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} engines: {node: '>=6.9.0'} @@ -1125,7 +1162,7 @@ packages: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.17.0 jsesc: 2.5.2 source-map: 0.5.7 dev: true @@ -1136,7 +1173,7 @@ packages: dependencies: '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 /@babel/helper-annotate-as-pure@7.22.5: @@ -1161,24 +1198,6 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - dev: false - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} engines: {node: '>=6.9.0'} @@ -1196,18 +1215,6 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: false - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} @@ -1219,21 +1226,6 @@ packages: regexpu-core: 5.3.2 semver: 6.3.1 - /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.0): - resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2): resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} peerDependencies: @@ -1305,20 +1297,6 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: false - /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} @@ -1346,18 +1324,6 @@ packages: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.0): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 - dev: false - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.2): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} @@ -1369,18 +1335,6 @@ packages: '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.0): - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - dev: false - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} @@ -1430,17 +1384,6 @@ packages: '@babel/template': 7.22.15 '@babel/types': 7.23.0 - /@babel/helpers@7.23.1: - resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 - '@babel/types': 7.23.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helpers@7.23.2: resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} engines: {node: '>=6.9.0'} @@ -1454,7 +1397,6 @@ packages: /@babel/highlight@7.22.20: resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} - requiresBuild: true dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 @@ -1465,7 +1407,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.17.0 dev: true /@babel/parser@7.23.0: @@ -1475,16 +1417,6 @@ packages: dependencies: '@babel/types': 7.23.0 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} engines: {node: '>=6.9.0'} @@ -1494,18 +1426,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) - dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} engines: {node: '>=6.9.0'} @@ -1529,7 +1449,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) - dev: false /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} @@ -1541,7 +1460,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-proposal-export-default-from@7.22.17(@babel/core@7.23.2): resolution: {integrity: sha512-cop/3quQBVvdz6X5SJC6AhUv3C9DrVTM06LUEXimEdWAhCSyOJIr9NiZDU9leHZ0/aiG0Sh7Zmvaku5TWYNgbA==} @@ -1552,7 +1470,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.23.2) - dev: false /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} @@ -1564,7 +1481,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - dev: false /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} @@ -1576,7 +1492,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) - dev: false /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9): resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} @@ -1585,7 +1500,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.10.4 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.12.9) dev: false @@ -1603,7 +1518,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) - dev: false /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} @@ -1615,7 +1529,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) - dev: false /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.2): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} @@ -1628,16 +1541,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) - dev: false - - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - dev: false /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} @@ -1647,15 +1550,6 @@ packages: dependencies: '@babel/core': 7.23.2 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -1672,15 +1566,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -1689,16 +1574,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.0): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -1708,15 +1583,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -1733,16 +1599,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -1760,17 +1616,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} @@ -1781,16 +1626,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} engines: {node: '>=6.9.0'} @@ -1800,15 +1635,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -1817,15 +1643,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -1843,70 +1660,33 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.0): + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -1922,15 +1702,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -1939,15 +1710,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -1956,15 +1718,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -1973,16 +1726,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.0): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -1992,16 +1735,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -2011,16 +1744,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} @@ -2030,17 +1753,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.0): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -2051,16 +1763,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} engines: {node: '>=6.9.0'} @@ -2070,19 +1772,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} engines: {node: '>=6.9.0'} @@ -2095,18 +1784,6 @@ packages: '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} engines: {node: '>=6.9.0'} @@ -2118,16 +1795,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} engines: {node: '>=6.9.0'} @@ -2137,16 +1804,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} engines: {node: '>=6.9.0'} @@ -2156,17 +1813,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} engines: {node: '>=6.9.0'} @@ -2177,18 +1823,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} engines: {node: '>=6.9.0'} @@ -2200,24 +1834,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - dev: false - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} engines: {node: '>=6.9.0'} @@ -2235,17 +1851,6 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 - dev: false - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} engines: {node: '>=6.9.0'} @@ -2256,16 +1861,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.15 - /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} engines: {node: '>=6.9.0'} @@ -2275,17 +1870,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} engines: {node: '>=6.9.0'} @@ -2296,16 +1880,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} engines: {node: '>=6.9.0'} @@ -2315,17 +1889,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} engines: {node: '>=6.9.0'} @@ -2336,17 +1899,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} engines: {node: '>=6.9.0'} @@ -2357,17 +1909,6 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} engines: {node: '>=6.9.0'} @@ -2387,17 +1928,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) - dev: false - - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} @@ -2408,18 +1938,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} engines: {node: '>=6.9.0'} @@ -2431,17 +1949,6 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} engines: {node: '>=6.9.0'} @@ -2452,16 +1959,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} engines: {node: '>=6.9.0'} @@ -2471,17 +1968,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} engines: {node: '>=6.9.0'} @@ -2492,16 +1978,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} @@ -2511,17 +1987,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} engines: {node: '>=6.9.0'} @@ -2532,18 +1997,6 @@ packages: '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - dev: false - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} engines: {node: '>=6.9.0'} @@ -2555,19 +2008,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - dev: false - /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} engines: {node: '>=6.9.0'} @@ -2580,17 +2020,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} engines: {node: '>=6.9.0'} @@ -2601,17 +2030,6 @@ packages: '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} @@ -2622,16 +2040,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} engines: {node: '>=6.9.0'} @@ -2641,17 +2049,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} engines: {node: '>=6.9.0'} @@ -2662,17 +2059,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} engines: {node: '>=6.9.0'} @@ -2683,44 +2069,19 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) - /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.20 - '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.20 + '@babel/compat-data': 7.23.2 '@babel/core': 7.23.2 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} engines: {node: '>=6.9.0'} @@ -2731,17 +2092,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} engines: {node: '>=6.9.0'} @@ -2752,18 +2102,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) - /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} engines: {node: '>=6.9.0'} @@ -2785,16 +2123,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} @@ -2804,17 +2132,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} @@ -2825,19 +2142,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) - dev: false - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} engines: {node: '>=6.9.0'} @@ -2850,16 +2154,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} @@ -2869,23 +2163,13 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -2897,16 +2181,15 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) dev: false /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): @@ -2917,7 +2200,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} @@ -2927,21 +2209,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) - '@babel/types': 7.23.0 - dev: false /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} @@ -2955,30 +2222,18 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) '@babel/types': 7.23.0 - dev: false - /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.0): - resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 - dev: false - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.2): resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} engines: {node: '>=6.9.0'} @@ -2989,16 +2244,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} engines: {node: '>=6.9.0'} @@ -3008,25 +2253,8 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-runtime@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.0) - babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.23.0) - babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-transform-runtime@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==} + /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3035,22 +2263,11 @@ packages: '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) - babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.2) babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: false - - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} @@ -3061,17 +2278,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: false - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} @@ -3082,16 +2288,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} @@ -3101,16 +2297,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} @@ -3120,37 +2306,14 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) - dev: false /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} @@ -3164,16 +2327,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.0): - resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.2): resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} engines: {node: '>=6.9.0'} @@ -3183,17 +2336,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} engines: {node: '>=6.9.0'} @@ -3204,17 +2346,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} engines: {node: '>=6.9.0'} @@ -3225,17 +2356,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} engines: {node: '>=6.9.0'} @@ -3246,97 +2366,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/preset-env@7.22.20(@babel/core@7.23.0): - resolution: {integrity: sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.20 - '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.0) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.0) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.0) - '@babel/types': 7.23.0 - babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.0) - babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.23.0) - babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.0) - core-js-compat: 3.33.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/preset-env@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} engines: {node: '>=6.9.0'} @@ -3420,9 +2449,9 @@ packages: '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.2) '@babel/types': 7.23.0 babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) - babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.2) babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) - core-js-compat: 3.33.0 + core-js-compat: 3.33.1 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3437,18 +2466,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) - dev: false - - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.0): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.0 - esutils: 2.0.3 - dev: false /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} @@ -3460,33 +2477,19 @@ packages: '@babel/types': 7.23.0 esutils: 2.0.3 - /@babel/preset-react@7.22.15(@babel/core@7.23.0): + /@babel/preset-react@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.0) - dev: false - - /@babel/preset-typescript@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.2) dev: false /@babel/preset-typescript@7.23.2(@babel/core@7.23.2): @@ -3514,20 +2517,19 @@ packages: make-dir: 2.1.0 pirates: 4.0.6 source-map-support: 0.5.21 - dev: false /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - /@babel/runtime-corejs3@7.23.1: - resolution: {integrity: sha512-OKKfytwoc0tr7cDHwQm0RLVR3y+hDGFz3EPuvLNU/0fOeXJeKNIHj7ffNVFnncWt3sC58uyUCRSzf8nBQbyF6A==} + /@babel/runtime-corejs3@7.23.2: + resolution: {integrity: sha512-54cIh74Z1rp4oIjsHjqN+WM4fMyCBYe+LpZ9jWm51CZ1fbH3SkAzQD/3XLoNkjbJ7YEmjobLXyvQrFypRHOrXw==} engines: {node: '>=6.9.0'} dependencies: - core-js-pure: 3.33.0 + core-js-pure: 3.33.1 regenerator-runtime: 0.14.0 - /@babel/runtime@7.23.1: - resolution: {integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==} + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 @@ -3545,37 +2547,19 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 + '@babel/generator': 7.17.7 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 + '@babel/parser': 7.18.9 + '@babel/types': 7.17.0 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/traverse@7.23.0: - resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/traverse@7.23.2: resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} @@ -3614,7 +2598,7 @@ packages: engines: {node: '>= 16'} dependencies: '@jsdevtools/ono': 7.1.3 - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 call-me-maybe: 1.0.2 js-yaml: 4.1.0 dev: true @@ -3626,6 +2610,31 @@ packages: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} dev: false + /@celo/rainbowkit-celo@1.1.0(@rainbow-me/rainbowkit@1.0.8)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(wagmi@1.3.9)(zod@3.22.4): + resolution: {integrity: sha512-/G4HFhJNwUk6uU1yqGfQ/LIoNg9UAA4BUcEvFdd0M3DImnKlhodNLUdCmzqv96sjc/I7tMJqBeTnmbhwXdlsjQ==} + peerDependencies: + '@rainbow-me/rainbowkit': '>=1.0.2 && <=2.0.0' + viem: '>=1.2.8 && <=2.0.0' + wagmi: '>=1.0.0 && <=2.0.0' + dependencies: + '@metamask/providers': 11.1.2 + '@rainbow-me/rainbowkit': 1.0.8(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0)(viem@1.5.3)(wagmi@1.3.9) + '@wagmi/connectors': 2.6.6(@wagmi/chains@1.6.0)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) + viem: 1.5.3(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.3.9(@types/react@18.2.31)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - '@wagmi/chains' + - bufferutil + - encoding + - lokijs + - react + - supports-color + - typescript + - utf-8-validate + - zod + dev: false + /@chainsafe/as-sha256@0.3.1: resolution: {integrity: sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==} @@ -3726,8 +2735,8 @@ packages: mime: 3.0.0 dev: true - /@cloudflare/workers-types@4.20231002.0: - resolution: {integrity: sha512-gQMKf3THqAFWH426OXXfVx0gFLXiSiL2fo6mKjQYx4PU74MgmVDFh25NvpAIBK+XN+xXlrImClfYeqErXIT7jA==} + /@cloudflare/workers-types@4.20231016.0: + resolution: {integrity: sha512-eGB0cRVyoJpeyGJx2re5sbd9R316a61sY73xwnqm4cwGpb+OxCK2gc651RxGiN7H4w6LY1RpysUgeGLmj5B3+g==} dev: true /@coinbase/wallet-sdk@3.7.2: @@ -3735,7 +2744,7 @@ packages: engines: {node: '>= 10.0.0'} dependencies: '@metamask/safe-event-emitter': 2.0.0 - '@solana/web3.js': 1.87.1 + '@solana/web3.js': 1.87.2 bind-decorator: 1.0.11 bn.js: 5.2.1 buffer: 6.0.3 @@ -3746,7 +2755,7 @@ packages: json-rpc-engine: 6.1.0 keccak: 3.0.4 preact: 10.18.1 - qs: 6.11.0 + qs: 6.11.2 rxjs: 6.6.7 sha.js: 2.4.11 stream-browserify: 3.0.0 @@ -3764,16 +2773,16 @@ packages: requiresBuild: true optional: true - /@commitlint/cli@17.8.0: - resolution: {integrity: sha512-D3LdyZYbiRyAChfJMNlAd9f2P9vNQ7GWbI9gN2o7L5hF07QJDqj4z/pcJF3PjDbJWOaUUXla287RdDmmKqH2WQ==} + /@commitlint/cli@17.8.1: + resolution: {integrity: sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==} engines: {node: '>=v14'} hasBin: true dependencies: - '@commitlint/format': 17.4.4 - '@commitlint/lint': 17.8.0 - '@commitlint/load': 17.8.0 - '@commitlint/read': 17.5.1 - '@commitlint/types': 17.4.4 + '@commitlint/format': 17.8.1 + '@commitlint/lint': 17.8.1 + '@commitlint/load': 17.8.1 + '@commitlint/read': 17.8.1 + '@commitlint/types': 17.8.1 execa: 5.1.1 lodash.isfunction: 3.0.9 resolve-from: 5.0.0 @@ -3784,26 +2793,36 @@ packages: - '@swc/wasm' dev: true - /@commitlint/config-conventional@17.8.0: - resolution: {integrity: sha512-MgiFXujmqAvi7M33C7OSMTznwrVkckrbXe/aZWQ/+KFGLLF6IE50XIcjGrW0/uiDGb/im5qbqF2dh1dCFNa+sQ==} + /@commitlint/config-conventional@17.8.1: + resolution: {integrity: sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==} engines: {node: '>=v14'} dependencies: conventional-changelog-conventionalcommits: 6.1.0 dev: true - /@commitlint/config-validator@17.6.7: - resolution: {integrity: sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==} + /@commitlint/config-validator@17.8.1: + resolution: {integrity: sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.4.4 + '@commitlint/types': 17.8.1 + ajv: 8.12.0 + dev: true + + /@commitlint/config-validator@18.0.0: + resolution: {integrity: sha512-PlXy5QZzQeMgQM7jb0odIhxsI6GWcbGgfy+Hkz5ap31KES/oJgtEvgD8pjg0Z9Ri296bT6zK3ts6brS0MAcMgg==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + '@commitlint/types': 18.0.0 ajv: 8.12.0 dev: true + optional: true - /@commitlint/ensure@17.6.7: - resolution: {integrity: sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==} + /@commitlint/ensure@17.8.1: + resolution: {integrity: sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.4.4 + '@commitlint/types': 17.8.1 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 @@ -3811,45 +2830,52 @@ packages: lodash.upperfirst: 4.3.1 dev: true - /@commitlint/execute-rule@17.4.0: - resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} + /@commitlint/execute-rule@17.8.1: + resolution: {integrity: sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==} engines: {node: '>=v14'} dev: true - /@commitlint/format@17.4.4: - resolution: {integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==} + /@commitlint/execute-rule@18.0.0: + resolution: {integrity: sha512-eNUSaHajb+g3sgZeIrfc6cXNnKIkYN2SXtDVXuiE+hOa055T0bLdZK29gSd945JCztxPVwdOkPLDeLg3NfDubg==} + engines: {node: '>=v18'} + requiresBuild: true + dev: true + optional: true + + /@commitlint/format@17.8.1: + resolution: {integrity: sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.4.4 + '@commitlint/types': 17.8.1 chalk: 4.1.2 dev: true - /@commitlint/is-ignored@17.8.0: - resolution: {integrity: sha512-8bR6rxNcWaNprPBdE4ePIOwbxutTQGOsRPYWssX+zjGxnEljzaZSGzFUOMxapYILlf8Tts/O1wPQgG549Rdvdg==} + /@commitlint/is-ignored@17.8.1: + resolution: {integrity: sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.4.4 + '@commitlint/types': 17.8.1 semver: 7.5.4 dev: true - /@commitlint/lint@17.8.0: - resolution: {integrity: sha512-4ihwnqOY4TcJN6iz5Jv1LeYavvBllONwFyGxOIWmCT5s4PNMb43cws2TUdbXTZL1Vq59etGKd5LWYDFPVbs5EA==} + /@commitlint/lint@17.8.1: + resolution: {integrity: sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==} engines: {node: '>=v14'} dependencies: - '@commitlint/is-ignored': 17.8.0 - '@commitlint/parse': 17.7.0 - '@commitlint/rules': 17.7.0 - '@commitlint/types': 17.4.4 + '@commitlint/is-ignored': 17.8.1 + '@commitlint/parse': 17.8.1 + '@commitlint/rules': 17.8.1 + '@commitlint/types': 17.8.1 dev: true - /@commitlint/load@17.8.0: - resolution: {integrity: sha512-9VnGXYJCP4tXmR4YrwP8n5oX6T5ZsHfPQq6WuUQOvAI+QsDQMaTGgTRXr7us+xsjz+b+mMBSagogqfUx2aixyw==} + /@commitlint/load@17.8.1: + resolution: {integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==} engines: {node: '>=v14'} dependencies: - '@commitlint/config-validator': 17.6.7 - '@commitlint/execute-rule': 17.4.0 - '@commitlint/resolve-extends': 17.6.7 - '@commitlint/types': 17.4.4 + '@commitlint/config-validator': 17.8.1 + '@commitlint/execute-rule': 17.8.1 + '@commitlint/resolve-extends': 17.8.1 + '@commitlint/types': 17.8.1 '@types/node': 20.5.1 chalk: 4.1.2 cosmiconfig: 8.3.6(typescript@4.9.5) @@ -3865,81 +2891,129 @@ packages: - '@swc/wasm' dev: true - /@commitlint/message@17.4.2: - resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==} + /@commitlint/load@18.0.0: + resolution: {integrity: sha512-ocvMSkzNZCJ4yV673xjd4Y7sFVG/mg7S6yvL5ioM0OIG2XTbcCdzpmq+BeJcIwsRYU9g/b688yh7RDzGlbai6w==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + '@commitlint/config-validator': 18.0.0 + '@commitlint/execute-rule': 18.0.0 + '@commitlint/resolve-extends': 18.0.0 + '@commitlint/types': 18.0.0 + '@types/node': 18.18.6 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.2.2) + cosmiconfig-typescript-loader: 4.4.0(@types/node@18.18.6)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@5.2.2) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.1(@types/node@18.18.6)(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + optional: true + + /@commitlint/message@17.8.1: + resolution: {integrity: sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==} engines: {node: '>=v14'} dev: true - /@commitlint/parse@17.7.0: - resolution: {integrity: sha512-dIvFNUMCUHqq5Abv80mIEjLVfw8QNuA4DS7OWip4pcK/3h5wggmjVnlwGCDvDChkw2TjK1K6O+tAEV78oxjxag==} + /@commitlint/parse@17.8.1: + resolution: {integrity: sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.4.4 + '@commitlint/types': 17.8.1 conventional-changelog-angular: 6.0.0 conventional-commits-parser: 4.0.0 dev: true - /@commitlint/read@17.5.1: - resolution: {integrity: sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==} + /@commitlint/read@17.8.1: + resolution: {integrity: sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==} engines: {node: '>=v14'} dependencies: - '@commitlint/top-level': 17.4.0 - '@commitlint/types': 17.4.4 + '@commitlint/top-level': 17.8.1 + '@commitlint/types': 17.8.1 fs-extra: 11.1.1 git-raw-commits: 2.0.11 minimist: 1.2.8 dev: true - /@commitlint/resolve-extends@17.6.7: - resolution: {integrity: sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==} + /@commitlint/resolve-extends@17.8.1: + resolution: {integrity: sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==} engines: {node: '>=v14'} dependencies: - '@commitlint/config-validator': 17.6.7 - '@commitlint/types': 17.4.4 + '@commitlint/config-validator': 17.8.1 + '@commitlint/types': 17.8.1 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/resolve-extends@18.0.0: + resolution: {integrity: sha512-MD9+6GSiWvqgdJtfos+1gqz+zmy2vV7TbUVz2ETZzpfECgmUZSZSYzyivivBAQK6feS71KxmMLL8+YFF9+FFRQ==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + '@commitlint/config-validator': 18.0.0 + '@commitlint/types': 18.0.0 import-fresh: 3.3.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 resolve-global: 1.0.0 dev: true + optional: true - /@commitlint/rules@17.7.0: - resolution: {integrity: sha512-J3qTh0+ilUE5folSaoK91ByOb8XeQjiGcdIdiB/8UT1/Rd1itKo0ju/eQVGyFzgTMYt8HrDJnGTmNWwcMR1rmA==} + /@commitlint/rules@17.8.1: + resolution: {integrity: sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==} engines: {node: '>=v14'} dependencies: - '@commitlint/ensure': 17.6.7 - '@commitlint/message': 17.4.2 - '@commitlint/to-lines': 17.4.0 - '@commitlint/types': 17.4.4 + '@commitlint/ensure': 17.8.1 + '@commitlint/message': 17.8.1 + '@commitlint/to-lines': 17.8.1 + '@commitlint/types': 17.8.1 execa: 5.1.1 dev: true - /@commitlint/to-lines@17.4.0: - resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==} + /@commitlint/to-lines@17.8.1: + resolution: {integrity: sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==} engines: {node: '>=v14'} dev: true - /@commitlint/top-level@17.4.0: - resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==} + /@commitlint/top-level@17.8.1: + resolution: {integrity: sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==} engines: {node: '>=v14'} dependencies: find-up: 5.0.0 dev: true - /@commitlint/types@17.4.4: - resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} + /@commitlint/types@17.8.1: + resolution: {integrity: sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==} engines: {node: '>=v14'} dependencies: chalk: 4.1.2 dev: true + /@commitlint/types@18.0.0: + resolution: {integrity: sha512-FDzAdSm7kIir0NW0bZLENdrEgf/9Ihs1AAqE9DK9R+dRFby4ookkxPMaz7elZmG+e5rBl7hGrWJzJINqG9cDDg==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + chalk: 4.1.2 + dev: true + optional: true + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@cypress/code-coverage@3.12.1(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.88.2): - resolution: {integrity: sha512-4gSVkgcTo8NSWrOwLO0NxyvD2apIZFM/2k9sxdmP3eR3ko8tZVYrWfTdfxSXLDSkNnzVh+oXv7utaOLn+yemUg==} + /@cypress/code-coverage@3.12.5(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0): + resolution: {integrity: sha512-0hczq2kgzkh/fBLm74rHcDRX//W3bhJJw/aPWu57/pPaRp5c+LcatWuv8ZtIWNXit2kBClueOrVj0I20Arh80A==} peerDependencies: '@babel/core': ^7.0.1 '@babel/preset-env': ^7.0.0 @@ -3949,18 +3023,18 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/preset-env': 7.23.2(@babel/core@7.23.2) - '@cypress/webpack-preprocessor': 5.17.1(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(webpack@5.88.2) - babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.88.2) + '@cypress/webpack-preprocessor': 6.0.0(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(webpack@5.89.0) + babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.89.0) chalk: 4.1.2 cypress: 12.17.4 - dayjs: 1.11.9 + dayjs: 1.11.10 debug: 4.3.4(supports-color@8.1.1) execa: 4.1.0 globby: 11.0.4 istanbul-lib-coverage: 3.0.0 js-yaml: 4.1.0 nyc: 15.1.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color dev: true @@ -3989,19 +3063,19 @@ packages: uuid: 8.3.2 dev: true - /@cypress/webpack-dev-server@3.6.1(debug@4.3.4)(webpack@5.88.2): + /@cypress/webpack-dev-server@3.6.1(debug@4.3.4)(webpack@5.89.0): resolution: {integrity: sha512-v9tn8SW5ot9jxlei0LqnU1hmR8Cy/A4mOKJOmrcU8KI0qWH6cadwmtiifRMgn8obQCJxiBSAeSWP3l2P4XoSAA==} dependencies: find-up: 6.3.0 fs-extra: 9.1.0 - html-webpack-plugin-4: /html-webpack-plugin@4.5.2(webpack@5.88.2) - html-webpack-plugin-5: /html-webpack-plugin@5.5.3(webpack@5.88.2) + html-webpack-plugin-4: /html-webpack-plugin@4.5.2(webpack@5.89.0) + html-webpack-plugin-5: /html-webpack-plugin@5.5.3(webpack@5.89.0) local-pkg: 0.4.1 semver: 7.5.4 - speed-measure-webpack-plugin: 1.4.2(webpack@5.88.2) + speed-measure-webpack-plugin: 1.4.2(webpack@5.89.0) tslib: 2.6.2 - webpack-dev-server: 4.15.1(debug@4.3.4)(webpack@5.88.2) - webpack-merge: 5.9.0 + webpack-dev-server: 4.15.1(debug@4.3.4)(webpack@5.89.0) + webpack-merge: 5.10.0 transitivePeerDependencies: - bufferutil - debug @@ -4011,21 +3085,21 @@ packages: - webpack-cli dev: true - /@cypress/webpack-preprocessor@5.17.1(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(webpack@5.88.2): - resolution: {integrity: sha512-FE/e8ikPc8z4EVopJCaior3RGy0jd2q9Xcp5NtiwNG4XnLfEnUFTZlAGwXe75sEh4fNMPrBJW1KIz77PX5vGAw==} + /@cypress/webpack-preprocessor@6.0.0(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(webpack@5.89.0): + resolution: {integrity: sha512-1AS1Et5CNPJii0+DdBZBS8e0hlM2BkBNmYRdZO4/16A3KS3em1sjPZtFw7jJF00m6DYAdB9iy6QW/lLZ2bN0gg==} peerDependencies: '@babel/core': ^7.0.1 '@babel/preset-env': ^7.0.0 - babel-loader: ^8.0.2 || ^9 + babel-loader: ^8.3 || ^9 webpack: ^4 || ^5 dependencies: '@babel/core': 7.23.2 '@babel/preset-env': 7.23.2(@babel/core@7.23.2) - babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.88.2) + babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.89.0) bluebird: 3.7.1 debug: 4.3.4(supports-color@8.1.1) lodash: 4.17.21 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color dev: true @@ -4110,7 +3184,7 @@ packages: resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} dev: false - /@docsearch/react@3.5.2(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.8.3): + /@docsearch/react@3.5.2(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0): resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -4127,13 +3201,13 @@ packages: search-insights: optional: true dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.8.3) + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0) '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) '@docsearch/css': 3.5.2 algoliasearch: 4.20.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - search-insights: 2.8.3 + search-insights: 2.9.0 transitivePeerDependencies: - '@algolia/client-search' dev: false @@ -4146,16 +3220,16 @@ packages: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/generator': 7.23.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-transform-runtime': 7.22.15(@babel/core@7.23.0) - '@babel/preset-env': 7.22.20(@babel/core@7.23.0) - '@babel/preset-react': 7.22.15(@babel/core@7.23.0) - '@babel/preset-typescript': 7.23.0(@babel/core@7.23.0) - '@babel/runtime': 7.23.1 - '@babel/runtime-corejs3': 7.23.1 - '@babel/traverse': 7.23.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-react': 7.22.15(@babel/core@7.23.2) + '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) + '@babel/runtime': 7.23.2 + '@babel/runtime-corejs3': 7.23.2 + '@babel/traverse': 7.23.2 '@docusaurus/cssnano-preset': 2.4.3 '@docusaurus/logger': 2.4.3 '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) @@ -4166,7 +3240,7 @@ packages: '@slorber/static-site-generator-webpack-plugin': 4.0.7 '@svgr/webpack': 6.5.1 autoprefixer: 10.4.16(postcss@8.4.31) - babel-loader: 8.3.0(@babel/core@7.23.0)(webpack@5.88.2) + babel-loader: 8.3.0(@babel/core@7.23.2)(webpack@5.89.0) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -4175,33 +3249,33 @@ packages: cli-table3: 0.6.3 combine-promises: 1.2.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.88.2) - core-js: 3.33.0 - css-loader: 6.8.1(webpack@5.88.2) - css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.2)(webpack@5.88.2) + copy-webpack-plugin: 11.0.0(webpack@5.89.0) + core-js: 3.33.1 + css-loader: 6.8.1(webpack@5.89.0) + css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.2)(webpack@5.89.0) cssnano: 5.1.15(postcss@8.4.31) del: 6.1.1 detect-port: 1.5.1 escape-html: 1.0.3 eta: 2.2.0 - file-loader: 6.2.0(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.89.0) fs-extra: 10.1.0 html-minifier-terser: 6.1.0 html-tags: 3.3.1 - html-webpack-plugin: 5.5.3(webpack@5.88.2) + html-webpack-plugin: 5.5.3(webpack@5.89.0) import-fresh: 3.3.0 leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.7.6(webpack@5.88.2) + mini-css-extract-plugin: 2.7.6(webpack@5.89.0) postcss: 8.4.31 - postcss-loader: 7.3.3(postcss@8.4.31)(typescript@4.9.5)(webpack@5.88.2) + postcss-loader: 7.3.3(postcss@8.4.31)(typescript@4.9.5)(webpack@5.89.0) prompts: 2.4.2 react: 18.2.0 - react-dev-utils: 12.0.1(typescript@4.9.5)(webpack@5.88.2) + react-dev-utils: 12.0.1(typescript@4.9.5)(webpack@5.89.0) react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.88.2) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0) react-router: 5.3.4(react@18.2.0) react-router-config: 5.1.1(react-router@5.3.4)(react@18.2.0) react-router-dom: 5.3.4(react@18.2.0) @@ -4209,16 +3283,16 @@ packages: semver: 7.5.4 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(webpack@5.89.0) tslib: 2.6.2 update-notifier: 5.1.0 - url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.88.2) + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) wait-on: 6.0.1 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) webpack-bundle-analyzer: 4.9.1 - webpack-dev-server: 4.15.1(debug@4.3.4)(webpack@5.88.2) - webpack-merge: 5.9.0 - webpackbar: 5.0.2(webpack@5.88.2) + webpack-dev-server: 4.15.1(debug@4.3.4)(webpack@5.89.0) + webpack-merge: 5.10.0 + webpackbar: 5.0.2(webpack@5.89.0) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -4264,12 +3338,12 @@ packages: react-dom: ^16.8.4 || ^17.0.0 dependencies: '@babel/parser': 7.23.0 - '@babel/traverse': 7.23.0 + '@babel/traverse': 7.23.2 '@docusaurus/logger': 2.4.3 '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) '@mdx-js/mdx': 1.6.22 escape-html: 1.0.3 - file-loader: 6.2.0(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.89.0) fs-extra: 10.1.0 image-size: 1.0.2 mdast-util-to-string: 2.0.0 @@ -4280,8 +3354,8 @@ packages: tslib: 2.6.2 unified: 9.2.2 unist-util-visit: 2.0.3 - url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.88.2) - webpack: 5.88.2(webpack-cli@5.1.4) + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -4300,8 +3374,8 @@ packages: '@docusaurus/react-loadable': 5.5.2(react@18.2.0) '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@types/history': 4.7.11 - '@types/react': 18.2.28 - '@types/react-router-config': 5.0.8 + '@types/react': 18.2.31 + '@types/react-router-config': 5.0.9 '@types/react-router-dom': 5.3.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4337,7 +3411,7 @@ packages: tslib: 2.6.2 unist-util-visit: 2.0.3 utility-types: 3.10.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@parcel/css' - '@swc/core' @@ -4370,7 +3444,7 @@ packages: '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) - '@types/react-router-config': 5.0.8 + '@types/react-router-config': 5.0.9 combine-promises: 1.2.0 fs-extra: 10.1.0 import-fresh: 3.3.0 @@ -4380,7 +3454,7 @@ packages: react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 utility-types: 3.10.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@parcel/css' - '@swc/core' @@ -4415,7 +3489,7 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@parcel/css' - '@swc/core' @@ -4598,7 +3672,7 @@ packages: - webpack-cli dev: false - /@docusaurus/preset-classic@2.4.3(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.8.3)(typescript@4.9.5): + /@docusaurus/preset-classic@2.4.3(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5): resolution: {integrity: sha512-tRyMliepY11Ym6hB1rAFSNGwQDpmszvWYJvlK1E+md4SW8i6ylNHtpZjaYFff9Mdk3i/Pg8ItQq9P0daOJAvQw==} engines: {node: '>=16.14'} peerDependencies: @@ -4616,7 +3690,7 @@ packages: '@docusaurus/plugin-sitemap': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/theme-classic': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-search-algolia': 2.4.3(@algolia/client-search@4.20.0)(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.8.3)(typescript@4.9.5) + '@docusaurus/theme-search-algolia': 2.4.3(@algolia/client-search@4.20.0)(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5) '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4647,7 +3721,7 @@ packages: peerDependencies: react: '*' dependencies: - '@types/react': 18.2.28 + '@types/react': 18.2.31 prop-types: 15.8.1 react: 18.2.0 @@ -4718,8 +3792,8 @@ packages: '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) '@docusaurus/utils-common': 2.4.3(@docusaurus/types@2.4.3) '@types/history': 4.7.11 - '@types/react': 18.2.28 - '@types/react-router-config': 5.0.8 + '@types/react': 18.2.31 + '@types/react-router-config': 5.0.9 clsx: 1.2.1 parse-numeric-range: 1.3.0 prism-react-renderer: 1.3.5(react@18.2.0) @@ -4782,14 +3856,14 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-search-algolia@2.4.3(@algolia/client-search@4.20.0)(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.8.3)(typescript@4.9.5): + /@docusaurus/theme-search-algolia@2.4.3(@algolia/client-search@4.20.0)(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5): resolution: {integrity: sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docsearch/react': 3.5.2(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.8.3) + '@docsearch/react': 3.5.2(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0) '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/logger': 2.4.3 '@docusaurus/plugin-content-docs': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) @@ -4844,15 +3918,15 @@ packages: react-dom: ^16.8.4 || ^17.0.0 dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.28 + '@types/react': 18.2.31 commander: 5.1.0 joi: 17.11.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) utility-types: 3.10.0 - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-merge: 5.9.0 + webpack: 5.89.0(webpack-cli@5.1.4) + webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' - esbuild @@ -4903,7 +3977,7 @@ packages: '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@svgr/webpack': 6.5.1 escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.89.0) fs-extra: 10.1.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -4914,8 +3988,8 @@ packages: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.6.2 - url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.88.2) - webpack: 5.88.2(webpack-cli@5.1.4) + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -4928,14 +4002,14 @@ packages: resolution: {integrity: sha512-VWsdOZTsu8ABNVplFQUniHSLsCAQIJh+HDTUP6CllxXBe2pgFQKQ6RGxAS/QRTUcPprQCGpB3zH+gqNnvRRTmQ==} dependencies: chance: 1.1.11 - core-js: 3.33.0 + core-js: 3.33.1 dev: true /@emotion/babel-plugin@11.11.0: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.22.15 - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.2 @@ -4975,7 +4049,7 @@ packages: resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} dev: false - /@emotion/react@11.11.1(@types/react@18.2.28)(react@18.2.0): + /@emotion/react@11.11.1(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} peerDependencies: '@types/react': '*' @@ -4984,14 +4058,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@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(react@18.2.0) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 - '@types/react': 18.2.28 + '@types/react': 18.2.31 hoist-non-react-statics: 3.3.2 react: 18.2.0 dev: false @@ -5010,7 +4084,7 @@ packages: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} dev: false - /@emotion/styled@11.11.0(@emotion/react@11.11.1)(@types/react@18.2.28)(react@18.2.0): + /@emotion/styled@11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 @@ -5020,14 +4094,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.1 - '@emotion/react': 11.11.1(@types/react@18.2.28)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) '@emotion/serialize': 1.1.2 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 - '@types/react': 18.2.28 + '@types/react': 18.2.31 react: 18.2.0 dev: false @@ -5059,7 +4133,7 @@ packages: eth-ens-namehash: 2.0.8 solc: 0.4.26 testrpc: 0.0.1 - web3-utils: 1.10.2 + web3-utils: 1.10.3 dev: true /@ensdomains/resolver@0.2.4: @@ -5072,6 +4146,13 @@ packages: dependencies: '@envelop/types': 3.0.2 tslib: 2.6.2 + + /@envelop/core@5.0.0: + resolution: {integrity: sha512-aJdnH/ptv+cvwfvciCBe7TSvccBwo9g0S5f6u35TBVzRVqIGkK03lFlIL+x1cnfZgN9EfR2b1PH2galrT1CdCQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@envelop/types': 5.0.0 + tslib: 2.6.2 dev: false /@envelop/extended-validation@2.0.6(@envelop/core@3.0.6)(graphql@16.8.1): @@ -5084,12 +4165,44 @@ packages: '@graphql-tools/utils': 8.13.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + + /@envelop/extended-validation@4.0.0(@envelop/core@5.0.0)(graphql@16.8.1): + resolution: {integrity: sha512-pvJ/OL+C+lpNiiCXezHT+vP3PTq37MQicoOB1l5MdgOOZZWRAp0NDOgvEKcXUY7AWNpvNHgSE0QFSRfGwsfwFQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@envelop/core': ^5.0.0 + graphql: ^16.6.0 + dependencies: + '@envelop/core': 5.0.0 + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + + /@envelop/graphql-jit@8.0.1(@envelop/core@5.0.0)(graphql@16.8.1): + resolution: {integrity: sha512-91AcH3W9qGaY3B2ynCLdAbOzPBqLIcsTOzjFUfbKPBxe4d18qKpgjnBPrZ7s0XcN0DD5SDRq61bkvowg2E2BGQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@envelop/core': ^5.0.0 + graphql: ^16.6.0 + dependencies: + '@envelop/core': 5.0.0 + graphql: 16.8.1 + graphql-jit: 0.8.2(graphql@16.8.1) + tslib: 2.6.2 + value-or-promise: 1.0.12 dev: false /@envelop/types@3.0.2: resolution: {integrity: sha512-pOFea9ha0EkURWxJ/35axoH9fDGP5S2cUu/5Mmo9pb8zUf+TaEot8vB670XXihFEn/92759BMjLJNWBKmNhyng==} dependencies: tslib: 2.6.2 + + /@envelop/types@5.0.0: + resolution: {integrity: sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.6.2 dev: false /@envelop/validation-cache@5.1.3(@envelop/core@3.0.6)(graphql@16.8.1): @@ -5103,7 +4216,6 @@ packages: hash-it: 6.0.0 lru-cache: 6.0.0 tslib: 2.6.2 - dev: false /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): resolution: {integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==} @@ -5150,6 +4262,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64@0.19.5: + resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.16.3: resolution: {integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==} engines: {node: '>=12'} @@ -5177,6 +4298,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.19.5: + resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.16.3: resolution: {integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==} engines: {node: '>=12'} @@ -5204,6 +4334,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.19.5: + resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.16.3: resolution: {integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==} engines: {node: '>=12'} @@ -5231,6 +4370,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.19.5: + resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.16.3: resolution: {integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==} engines: {node: '>=12'} @@ -5258,6 +4406,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.19.5: + resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.16.3: resolution: {integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==} engines: {node: '>=12'} @@ -5285,6 +4442,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.19.5: + resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.16.3: resolution: {integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==} engines: {node: '>=12'} @@ -5312,6 +4478,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.19.5: + resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.16.3: resolution: {integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==} engines: {node: '>=12'} @@ -5339,6 +4514,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.19.5: + resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.16.3: resolution: {integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==} engines: {node: '>=12'} @@ -5366,6 +4550,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.19.5: + resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.16.3: resolution: {integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==} engines: {node: '>=12'} @@ -5393,6 +4586,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32@0.19.5: + resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64@0.16.3: resolution: {integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==} engines: {node: '>=12'} @@ -5411,8 +4613,17 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.5: + resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -5447,6 +4658,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.19.5: + resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.16.3: resolution: {integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==} engines: {node: '>=12'} @@ -5474,6 +4694,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.19.5: + resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.16.3: resolution: {integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==} engines: {node: '>=12'} @@ -5501,6 +4730,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.19.5: + resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.16.3: resolution: {integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==} engines: {node: '>=12'} @@ -5528,6 +4766,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.19.5: + resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.16.3: resolution: {integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==} engines: {node: '>=12'} @@ -5555,6 +4802,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.19.5: + resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.16.3: resolution: {integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==} engines: {node: '>=12'} @@ -5582,6 +4838,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.19.5: + resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.16.3: resolution: {integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==} engines: {node: '>=12'} @@ -5609,6 +4874,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.19.5: + resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.16.3: resolution: {integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==} engines: {node: '>=12'} @@ -5636,6 +4910,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.19.5: + resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.16.3: resolution: {integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==} engines: {node: '>=12'} @@ -5663,6 +4946,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.19.5: + resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.16.3: resolution: {integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==} engines: {node: '>=12'} @@ -5690,6 +4982,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.19.5: + resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.16.3: resolution: {integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==} engines: {node: '>=12'} @@ -5717,6 +5018,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.19.5: + resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.19.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5727,13 +5037,13 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.51.0 + eslint: 8.52.0 eslint-visitor-keys: 3.4.3 dev: true @@ -5776,18 +5086,18 @@ packages: - supports-color dev: true - /@eslint/js@8.51.0: - resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} + /@eslint/js@8.52.0: + resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true /@ethereum-attestation-service/eas-contracts@0.27.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(ts-node@10.9.1)(typescript@4.9.5): resolution: {integrity: sha512-ly1N/jLbXJjACDL7dnMSkzViBxxuVc+aMZ3EB1kpFxeMWrXkb7nN6w9gxGTH+m3gJztaKvyMsyr/13pA0OYq6Q==} dependencies: - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@4.9.5) - '@typechain/hardhat': 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.1) + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) + '@typechain/hardhat': 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2) hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) - typechain: 8.3.1(typescript@4.9.5) + typechain: 8.3.2(typescript@4.9.5) transitivePeerDependencies: - '@ethersproject/abi' - '@ethersproject/providers' @@ -5802,10 +5112,10 @@ packages: /@ethereum-attestation-service/eas-contracts@0.27.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.1.6): resolution: {integrity: sha512-ly1N/jLbXJjACDL7dnMSkzViBxxuVc+aMZ3EB1kpFxeMWrXkb7nN6w9gxGTH+m3gJztaKvyMsyr/13pA0OYq6Q==} dependencies: - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.1.6) - '@typechain/hardhat': 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.1) + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.1.6) + '@typechain/hardhat': 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2) hardhat: 2.13.1(typescript@5.1.6) - typechain: 8.3.1(typescript@5.1.6) + typechain: 8.3.2(typescript@5.1.6) transitivePeerDependencies: - '@ethersproject/abi' - '@ethersproject/providers' @@ -5865,7 +5175,7 @@ packages: - supports-color dev: true - /@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.1)(typescript@4.9.5): + /@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@4.9.5): resolution: {integrity: sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==} engines: {node: '>=10.0'} peerDependencies: @@ -5875,14 +5185,14 @@ packages: dependencies: '@resolver-engine/imports': 0.3.3 '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@4.9.5) + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) '@types/mkdirp': 0.5.2 - '@types/node-fetch': 2.6.6 + '@types/node-fetch': 2.6.7 ethers: 5.7.2 mkdirp: 0.5.6 node-fetch: 2.7.0 solc: 0.8.15 - typechain: 8.3.1(typescript@4.9.5) + typechain: 8.3.2(typescript@4.9.5) transitivePeerDependencies: - '@ethersproject/abi' - '@ethersproject/providers' @@ -5958,7 +5268,7 @@ packages: resolution: {integrity: sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==} dependencies: crc-32: 1.2.2 - ethereumjs-util: 7.1.5 + ethereumjs-util: 7.1.3 dev: true /@ethereumjs/common@2.6.5: @@ -5988,7 +5298,7 @@ packages: resolution: {integrity: sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==} dependencies: '@ethereumjs/common': 2.6.0 - ethereumjs-util: 7.1.5 + ethereumjs-util: 7.1.3 dev: true /@ethereumjs/tx@3.5.2: @@ -6015,9 +5325,9 @@ packages: '@ethereumjs/common': 2.6.0 '@ethereumjs/tx': 3.4.0 async-eventemitter: 0.2.4 - core-js-pure: 3.33.0 + core-js-pure: 3.33.1 debug: 2.6.9 - ethereumjs-util: 7.1.5 + ethereumjs-util: 7.1.3 functional-red-black-tree: 1.0.1 mcl-wasm: 0.7.9 merkle-patricia-tree: 4.2.4 @@ -6026,6 +5336,20 @@ packages: - supports-color dev: true + /@ethersproject/abi@5.0.7: + resolution: {integrity: sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: true + /@ethersproject/abi@5.7.0: resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} dependencies: @@ -6322,7 +5646,16 @@ packages: /@fastify/deepmerge@1.3.0: resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} - dev: false + + /@float-capital/float-subgraph-uncrashable@0.0.0-internal-testing.5: + resolution: {integrity: sha512-yZ0H5e3EpAYKokX/AbtplzlvSxEJY7ZfpvQyDzyODkks0hakAAlDG6fQu1SlDJMWorY7bbq1j7fCiFeTWci6TA==} + hasBin: true + dependencies: + '@rescript/std': 9.0.0 + graphql: 16.8.1 + graphql-import-node: 0.0.5(graphql@16.8.1) + js-yaml: 4.1.0 + dev: true /@floating-ui/core@1.5.0: resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} @@ -6437,6 +5770,43 @@ packages: tslib: 2.6.2 dev: false + /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} + peerDependencies: + '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 + '@graphql-tools/delegate': ^9.0.32 + '@graphql-tools/utils': ^9.2.1 + '@graphql-tools/wrap': ^9.4.2 + graphql: ^16.6.0 + dependencies: + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) + graphql: 16.8.1 + lodash: 4.17.21 + tslib: 2.6.2 + dev: false + + /@graphprotocol/client-add-source-name@2.0.0(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + resolution: {integrity: sha512-3vX8mVPIEJFwAoRhjTPd9IjQrBuE+Gv+JB7IEf8/9222qiU9EzHVFUekKxVtcxQXD40CfageS41CxOreWQ1enA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 + '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 + graphql: ^16.6.0 + dependencies: + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) + graphql: 16.8.1 + lodash: 4.17.21 + tslib: 2.6.2 + dev: true + /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-p8eEyeBcqxCXLxC7CNgIhLSCd7bjiKToKnrwYPShVb26gIG2JdAmD3/mpjuR+QaMA4chN/EO5t+TGvq6KnFx9g==} peerDependencies: @@ -6455,6 +5825,25 @@ packages: tslib: 2.6.2 dev: false + /@graphprotocol/client-auto-pagination@2.0.0(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + resolution: {integrity: sha512-TouHgs6rQLpZSgnMoPdes8/ZTtMMEoxWeUUCkfho/xfSi49prb5DcsI83pykln0OEAUnNPnaX0MhP+xA5LtFSg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 + '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 + graphql: ^16.6.0 + dependencies: + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) + graphql: 16.8.1 + lodash: 4.17.21 + tslib: 2.6.2 + dev: true + /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-kpiX2s804mpP3EVL0EdJfxeHWBTdg6SglIyEvSZ5T1OWyGDeMhr19D+gVIAlo22/PiBUkBDd0JfqppLsliPZ1A==} peerDependencies: @@ -6471,6 +5860,23 @@ packages: - '@graphql-mesh/utils' dev: false + /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): + resolution: {integrity: sha512-mxqXKHK2lO+k4r02Q44n3qhd5dufo+SSDduD8zGUDBsYcRQAtQD9PwmXRHyUoB9nw4A+NC+CtVh+76fueXCG1w==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 + '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 + graphql: ^16.6.0 + dependencies: + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@graphql-mesh/utils' + dev: true + /@graphprotocol/client-block-tracking@1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-Eim0fZ0AgukHt5770j/UYDxfrqJroOhDe8FfNKKN7mDVRoMBoCsNknH47i03fh4A/kE8R+J6Job/zEJZPTtKnQ==} peerDependencies: @@ -6483,7 +5889,20 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.5): + /@graphprotocol/client-block-tracking@2.0.0(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): + resolution: {integrity: sha512-mpr0JAlefFGhxeb25ndeRKZ+t9cDHcUKGfRKIsoDzCclUEh5tBVTiQCDVGt6Eu+pxnrHPF2v/NQWktaB3+6twQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 + graphql: ^16.6.0 + dependencies: + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: true + + /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-PIi8rFibYZVup+0jb08399RmbGF1ZrqUe6RXzLtKZBT57OWIMWwsFvdJyUAdr8Y8f0rrMn6A+Oy4nP1lf3hc1g==} hasBin: true peerDependencies: @@ -6494,8 +5913,47 @@ packages: '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-polling-live': 1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) - '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.5) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.15.13)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(tslib@2.6.2) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@babel/core' + - '@envelop/core' + - '@graphql-mesh/cross-helpers' + - '@graphql-mesh/store' + - '@graphql-mesh/types' + - '@graphql-mesh/utils' + - '@graphql-tools/delegate' + - '@graphql-tools/merge' + - '@graphql-tools/utils' + - '@graphql-tools/wrap' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - encoding + - graphql-tag + - react-native + - react-native-windows + - supports-color + - utf-8-validate + dev: false + + /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + resolution: {integrity: sha512-hTISbOzKavlDifBNsR6JqQMfdYwY7++hflPy+c3WHRrZ4OMoxFmW7ZuvaP6LvgKdJV77O8w9dnT/uxeHs6a90g==} + engines: {node: '>=16.0.0'} + hasBin: true + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) + '@graphprotocol/client-block-tracking': 2.0.0(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) + '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) + '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -6514,26 +5972,106 @@ packages: - '@types/node' - bufferutil - encoding - - graphql-tag - - react-native - - react-native-windows + - graphql-tag + - react-native + - react-native-windows + - supports-color + - utf-8-validate + dev: true + + /@graphprotocol/client-polling-live@1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1): + resolution: {integrity: sha512-/XKnXNTts1VCUqwN2TCuPzQBfMGusL8vtamACKUeX65WxVy/H/Wjpcxq+w/XbyqNsQdG5QOoxY+AS/vKMhUcDQ==} + peerDependencies: + '@envelop/core': ^2.4.2 || ^3.0.0 + '@graphql-tools/merge': ^8.3.14 + graphql: ^16.6.0 + dependencies: + '@envelop/core': 3.0.6 + '@graphql-tools/merge': 8.4.2(graphql@16.8.1) + '@repeaterjs/repeater': 3.0.4 + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + + /@graphprotocol/client-polling-live@2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1): + resolution: {integrity: sha512-JQ0sKiFCX+ErR0fynBNUg/WDiVaaEndlS12fkgrFZrQA2vVpSyow9pW0nKMGVZJa4cN+VDskgwqK5BWXMvdeRA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@envelop/core': ^2.4.2 || ^3.0.0 || ^4.0.0 + '@graphql-tools/merge': ^8.3.14 || ^9.0.0 + graphql: ^16.6.0 + dependencies: + '@envelop/core': 3.0.6 + '@graphql-tools/merge': 8.4.2(graphql@16.8.1) + '@repeaterjs/repeater': 3.0.4 + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + + /@graphprotocol/client-polling-live@2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1): + resolution: {integrity: sha512-JQ0sKiFCX+ErR0fynBNUg/WDiVaaEndlS12fkgrFZrQA2vVpSyow9pW0nKMGVZJa4cN+VDskgwqK5BWXMvdeRA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@envelop/core': ^2.4.2 || ^3.0.0 || ^4.0.0 + '@graphql-tools/merge': ^8.3.14 || ^9.0.0 + graphql: ^16.6.0 + dependencies: + '@envelop/core': 3.0.6 + '@graphql-tools/merge': 9.0.0(graphql@16.8.1) + '@repeaterjs/repeater': 3.0.4 + graphql: 16.8.1 + tslib: 2.6.2 + + /@graphprotocol/graph-cli@0.60.0(@types/node@18.18.6)(node-fetch@3.3.2)(typescript@4.9.5): + resolution: {integrity: sha512-8tGaQJ0EzAPtkDXCAijFGoVdJXM+pKFlGxjiU31TdG5bS4cIUoSB6yWojVsFFod0yETAwf+giel/0/8sudYsDw==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@float-capital/float-subgraph-uncrashable': 0.0.0-internal-testing.5 + '@oclif/core': 2.8.6(@types/node@18.18.6)(typescript@4.9.5) + '@oclif/plugin-autocomplete': 2.3.10(@types/node@18.18.6)(typescript@4.9.5) + '@oclif/plugin-not-found': 2.4.3(@types/node@18.18.6)(typescript@4.9.5) + '@whatwg-node/fetch': 0.8.8 + assemblyscript: 0.19.23 + binary-install-raw: 0.0.13(debug@4.3.4) + chalk: 3.0.0 + chokidar: 3.5.3 + debug: 4.3.4(supports-color@8.1.1) + docker-compose: 0.23.19 + dockerode: 2.5.8 + fs-extra: 9.1.0 + glob: 9.3.5 + gluegun: 5.1.2(debug@4.3.4) + graphql: 16.8.1 + immutable: 4.2.1 + ipfs-http-client: 55.0.0(node-fetch@3.3.2) + jayson: 4.0.0 + js-yaml: 3.14.1 + prettier: 1.19.1 + request: 2.88.2 + semver: 7.4.0 + sync-request: 6.1.0 + tmp-promise: 3.0.3 + web3-eth-abi: 1.7.0 + which: 2.0.2 + yaml: 1.10.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - encoding + - node-fetch - supports-color + - typescript - utf-8-validate - dev: false + dev: true - /@graphprotocol/client-polling-live@1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1): - resolution: {integrity: sha512-/XKnXNTts1VCUqwN2TCuPzQBfMGusL8vtamACKUeX65WxVy/H/Wjpcxq+w/XbyqNsQdG5QOoxY+AS/vKMhUcDQ==} - peerDependencies: - '@envelop/core': ^2.4.2 || ^3.0.0 - '@graphql-tools/merge': ^8.3.14 - graphql: ^16.6.0 + /@graphprotocol/graph-ts@0.31.0: + resolution: {integrity: sha512-xreRVM6ho2BtolyOh2flDkNoGZximybnzUnF53zJVp0+Ed0KnAlO1/KOCUYw06euVI9tk0c9nA2Z/D5SIQV2Rg==} dependencies: - '@envelop/core': 3.0.6 - '@graphql-tools/merge': 8.4.2(graphql@16.8.1) - '@repeaterjs/repeater': 3.0.4 - graphql: 16.8.1 - tslib: 2.6.2 - dev: false + assemblyscript: 0.19.10 + dev: true /@graphql-codegen/core@3.1.0(graphql@16.8.1): resolution: {integrity: sha512-DH1/yaR7oJE6/B+c6ZF2Tbdh7LixF1K8L+8BoSubjNyQ8pNwR4a70mvc1sv6H7qgp6y1bPQ9tKE+aazRRshysw==} @@ -6545,7 +6083,6 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.5.3 - dev: false /@graphql-codegen/plugin-helpers@2.7.2(graphql@16.8.1): resolution: {integrity: sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==} @@ -6558,8 +6095,7 @@ packages: graphql: 16.8.1 import-from: 4.0.0 lodash: 4.17.21 - tslib: 2.4.0 - dev: false + tslib: 2.4.1 /@graphql-codegen/plugin-helpers@3.1.2(graphql@16.8.1): resolution: {integrity: sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==} @@ -6572,8 +6108,7 @@ packages: graphql: 16.8.1 import-from: 4.0.0 lodash: 4.17.21 - tslib: 2.4.0 - dev: false + tslib: 2.4.1 /@graphql-codegen/plugin-helpers@4.2.0(graphql@16.8.1): resolution: {integrity: sha512-THFTCfg+46PXlXobYJ/OoCX6pzjI+9woQqCjdyKtgoI0tn3Xq2HUUCiidndxUpEYVrXb5pRiRXb7b/ZbMQqD0A==} @@ -6587,7 +6122,6 @@ packages: import-from: 4.0.0 lodash: 4.17.21 tslib: 2.5.3 - dev: false /@graphql-codegen/schema-ast@3.0.1(graphql@16.8.1): resolution: {integrity: sha512-rTKTi4XiW4QFZnrEqetpiYEWVsOFNoiR/v3rY9mFSttXFbIwNXPme32EspTiGWmEEdHY8UuTDtZN3vEcs/31zw==} @@ -6598,7 +6132,6 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.5.3 - dev: false /@graphql-codegen/typed-document-node@4.0.1(graphql@16.8.1): resolution: {integrity: sha512-mQNYCd12JsFSaK6xLry4olY9TdYG7GxQPexU6qU4Om++eKhseGwk2eGmQDRG4Qp8jEDFLMXuHMVUKqMQ1M+F/A==} @@ -6614,7 +6147,6 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false /@graphql-codegen/typescript-generic-sdk@3.1.0(graphql-tag@2.12.6)(graphql@16.8.1): resolution: {integrity: sha512-nQZi/YGRI1+qCZZsh0V5nz6+hCHSN4OU9tKyOTDsEPyDFnGEukDuRdCH2IZasGn22a3Iu5TUDkgp5w9wEQwGmg==} @@ -6627,11 +6159,10 @@ packages: auto-bind: 4.0.0 graphql: 16.8.1 graphql-tag: 2.12.6(graphql@16.8.1) - tslib: 2.4.0 + tslib: 2.4.1 transitivePeerDependencies: - encoding - supports-color - dev: false /@graphql-codegen/typescript-operations@3.0.4(graphql@16.8.1): resolution: {integrity: sha512-6yE2OL2+WJ1vd5MwFEGXpaxsFGzjAGUytPVHDML3Bi3TwP1F3lnQlIko4untwvHW0JhZEGQ7Ck30H9HjcxpdKA==} @@ -6647,7 +6178,6 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false /@graphql-codegen/typescript-resolvers@3.2.1(graphql@16.8.1): resolution: {integrity: sha512-2ZIHk5J6HTuylse5ZIxw+aega54prHxvj7vM8hiKJ6vejZ94kvVPAq4aWmSFOkZ5lqU3YnM/ZyWfnhT5CUDj1g==} @@ -6664,7 +6194,6 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false /@graphql-codegen/typescript@3.0.4(graphql@16.8.1): resolution: {integrity: sha512-x4O47447DZrWNtE/l5CU9QzzW4m1RbmCEdijlA3s2flG/y1Ckqdemob4CWfilSm5/tZ3w1junVDY616RDTSvZw==} @@ -6680,7 +6209,6 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false /@graphql-codegen/visitor-plugin-common@2.13.1(graphql@16.8.1): resolution: {integrity: sha512-mD9ufZhDGhyrSaWQGrU1Q1c5f01TeWtSWy/cDwXYjJcHIj1Y/DG2x0tOflEfCvh5WcnmHNIw4lzDsg1W7iFJEg==} @@ -6697,11 +6225,10 @@ packages: graphql: 16.8.1 graphql-tag: 2.12.6(graphql@16.8.1) parse-filepath: 1.0.2 - tslib: 2.4.0 + tslib: 2.4.1 transitivePeerDependencies: - encoding - supports-color - dev: false /@graphql-codegen/visitor-plugin-common@3.1.1(graphql@16.8.1): resolution: {integrity: sha512-uAfp+zu/009R3HUAuTK2AamR1bxIltM6rrYYI6EXSmkM3rFtFsLTuJhjUDj98HcUCszJZrADppz8KKLGRUVlNg==} @@ -6722,7 +6249,6 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false /@graphql-inspector/core@3.3.0(graphql@16.8.1): resolution: {integrity: sha512-LRtk9sHgj9qqVPIkkThAVq3iZ7QxgHCx6elEwd0eesZBCmaIYQxD/BFu+VT8jr10YfOURBZuAnVdyGu64vYpBg==} @@ -6733,7 +6259,17 @@ packages: graphql: 16.8.1 object-inspect: 1.10.3 tslib: 2.6.2 - dev: false + + /@graphql-inspector/core@5.0.1(graphql@16.8.1): + resolution: {integrity: sha512-1CWfFYucnRdULGiN1NDSinlNlpucBT+0x4i4AIthKe5n5jD9RIVyJtkA8zBbujUFrP++YE3l+TQifwbN1yTQsw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + dependency-graph: 0.11.0 + graphql: 16.8.1 + object-inspect: 1.12.3 + tslib: 2.6.0 /@graphql-mesh/cache-localforage@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-cY/LJ+XC8kiyPoLxqPAMlOAvaeB81CZafdadLNyNDFuu66qDiZqWTYPw/lnhp2nyeukC8o/P69oP7d2OqVaCZA==} @@ -6748,9 +6284,24 @@ packages: graphql: 16.8.1 localforage: 1.10.0 tslib: 2.6.2 + + /@graphql-mesh/cache-localforage@0.95.7(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-/e9sFn0kgSxGE6O/GWfdGnFMOIfk1Y+IZwRqPIofHmIPdyC5cZ/gnkN6oRQv7nnx+c9hzQQ5OnxiOGdOKwb1cg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/types': ^0.95.7 + '@graphql-mesh/utils': ^0.95.7 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + graphql: 16.8.1 + localforage: 1.10.0 + tslib: 2.6.2 dev: false - /@graphql-mesh/cli@0.82.35(@babel/core@7.23.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.5): + /@graphql-mesh/cli@0.82.35(@babel/core@7.23.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-5IuXpk+Zpg05u6qNPX19VzC5/HCiLdDRF6EPZ3ze57FIRgGA3YsB1CUGga6Ky3inalURYwx0kWqmdjbdKZYx1w==} hasBin: true peerDependencies: @@ -6763,7 +6314,7 @@ packages: '@graphql-codegen/typescript-operations': 3.0.4(graphql@16.8.1) '@graphql-codegen/typescript-resolvers': 3.2.1(graphql@16.8.1) '@graphql-mesh/config': 0.93.1(@babel/core@7.23.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.5) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/http': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -6777,18 +6328,18 @@ packages: dotenv: 16.3.1 graphql: 16.8.1 graphql-import-node: 0.0.5(graphql@16.8.1) - graphql-ws: 5.14.1(graphql@16.8.1) + graphql-ws: 5.14.2(graphql@16.8.1) json-bigint-patch: 0.0.8 json5: 2.2.3 mkdirp: 3.0.1 open: 7.4.2 pascal-case: 3.1.2 rimraf: 5.0.5 - ts-node: 10.9.1(@types/node@18.15.13)(typescript@5.1.6) + ts-node: 10.9.1(@types/node@18.18.6)(typescript@5.1.6) tsconfig-paths: 4.2.0 tslib: 2.6.2 typescript: 5.1.6 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: - '@babel/core' @@ -6802,7 +6353,6 @@ packages: - react-native-windows - supports-color - utf-8-validate - dev: false /@graphql-mesh/config@0.93.1(@babel/core@7.23.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-g4omjuBBVPtyhEDeEa6uwfSSvUehV3zcwZVNbk+UJuFJEYPO4yBLsxfEZBpoeO6EriiPX2WnQyn5kiHbC3YTRA==} @@ -6818,7 +6368,7 @@ packages: dependencies: '@envelop/core': 3.0.6 '@graphql-mesh/cache-localforage': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.5) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/merger-bare': 0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-stitching': 0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -6838,9 +6388,8 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color - dev: false - /@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.5): + /@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-jseNppSNEwNWjcjDDwsxmRBK+ub8tz2qc/ca2ZfCTebuCk/+D3dI3LJ95ceNFOIhInK0g2HVq8BO8lMMX1pQtg==} peerDependencies: '@graphql-tools/utils': ^9.2.1 @@ -6849,14 +6398,24 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 path-browserify: 1.0.1 - react-native-fs: 2.20.0(react-native@0.72.5) + react-native-fs: 2.20.0(react-native@0.72.6) react-native-path: 0.0.5 transitivePeerDependencies: - react-native - react-native-windows - dev: false - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.15.13)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/cross-helpers@0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1): + resolution: {integrity: sha512-NkLzFuY72tmmKO7gKWoDzoYcRVf3lLoCdlw30fSNKFKEWDAV3Tyh4v0fPvU3SEmoTJio7v0TIYZqtVt3dBBDFw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: ^16.6.0 + dependencies: + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + path-browserify: 1.0.1 + + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6867,13 +6426,43 @@ packages: graphql: ^16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.5) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) - '@graphql-tools/url-loader': 7.17.18(@types/node@18.15.13)(graphql@16.8.1) + '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.6)(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) + graphql: 16.8.1 + lodash.get: 4.4.2 + tslib: 2.6.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.3.4 + '@graphql-mesh/store': ^0.93.1 + '@graphql-mesh/types': ^0.93.1 + '@graphql-mesh/utils': ^0.93.1 + '@graphql-tools/utils': ^9.2.1 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/store': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.6)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) graphql: 16.8.1 @@ -6884,6 +6473,41 @@ packages: - bufferutil - encoding - utf-8-validate + dev: true + + /@graphql-mesh/graphql@0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): + resolution: {integrity: sha512-Fjf1Ti2HYOEP+dFLVnVxafD/Z4Ev+sR6BUbx3E7Mw8r/XGY28KmCA/QftBOB6BRNKMLe5w7RsgjCrO+Qp0klNg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/store': ^0.95.7 + '@graphql-mesh/types': ^0.95.7 + '@graphql-mesh/utils': ^0.95.7 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/store': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/string-interpolation': 0.5.2(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/federation': 1.1.10(@types/node@18.18.6)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.6)(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + lodash.get: 4.4.2 + tslib: 2.6.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - graphql-ws + - react + - react-dom + - subscriptions-transport-ws + - utf-8-validate dev: false /@graphql-mesh/http@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): @@ -6896,7 +6520,7 @@ packages: graphql: ^16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.5) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -6904,6 +6528,26 @@ packages: graphql: 16.8.1 graphql-yoga: 3.9.1(graphql@16.8.1) tslib: 2.6.2 + + /@graphql-mesh/http@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.12)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-WNiOJkwuRKoVCv/+9bp8/PFdclyTN0COIwSXjzIf36QICPtUXhokPLkXKhR7Xdtk175aIIpUHYRRwlgQw3BC1w==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/runtime': ^0.96.12 + '@graphql-mesh/types': ^0.95.7 + '@graphql-mesh/utils': ^0.95.7 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/runtime': 0.96.12(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@whatwg-node/server': 0.9.15 + graphql: 16.8.1 + graphql-yoga: 5.0.0(graphql@16.8.1) + tslib: 2.6.2 dev: false /@graphql-mesh/merger-bare@0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): @@ -6924,6 +6568,26 @@ packages: tslib: 2.6.2 transitivePeerDependencies: - '@graphql-mesh/store' + + /@graphql-mesh/merger-bare@0.95.7(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-QNLm5otrzcpClR8Puks4Md7Mh6AON+EWK+l3NBKvEkiOINFcnDRFv4FrSEXSfrAv/vHrSBbxAEXGUWHjjbQ8Kw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/types': ^0.95.7 + '@graphql-mesh/utils': ^0.95.7 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/merger-stitching': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@graphql-mesh/store' dev: false /@graphql-mesh/merger-stitching@0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): @@ -6946,6 +6610,27 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + + /@graphql-mesh/merger-stitching@0.95.7(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-0fooZHNseNrrVIm+OPfy7NdN1f/Cq6yhpW7d9lXjB8kPWjRGaX6gBUxpfCsRqSrfBDP1VwusZ6Z9EmW+84AtCQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/store': ^0.95.7 + '@graphql-mesh/types': ^0.95.7 + '@graphql-mesh/utils': ^0.95.7 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/store': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 dev: false /@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): @@ -6960,7 +6645,7 @@ packages: dependencies: '@envelop/core': 3.0.6 '@envelop/extended-validation': 2.0.6(@envelop/core@3.0.6)(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.5) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -6972,6 +6657,63 @@ packages: '@whatwg-node/fetch': 0.8.8 graphql: 16.8.1 tslib: 2.6.2 + + /@graphql-mesh/runtime@0.96.12(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-b3a/XjbTtS8gF30wu35M4pA2KyUYkYcWlnYNGXWOObtdEtEXjj+GkX//yO2XzTGI/sGWKElAAKIv4asPsye4jA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/types': ^0.95.7 + '@graphql-mesh/utils': ^0.95.7 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@envelop/core': 5.0.0 + '@envelop/extended-validation': 4.0.0(@envelop/core@5.0.0)(graphql@16.8.1) + '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/string-interpolation': 0.5.2(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/executor': 1.2.0(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) + '@whatwg-node/fetch': 0.9.13 + graphql: 16.8.1 + graphql-jit: 0.8.2(graphql@16.8.1) + tslib: 2.6.2 + dev: false + + /@graphql-mesh/runtime@0.96.12(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-b3a/XjbTtS8gF30wu35M4pA2KyUYkYcWlnYNGXWOObtdEtEXjj+GkX//yO2XzTGI/sGWKElAAKIv4asPsye4jA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/types': ^0.95.7 + '@graphql-mesh/utils': ^0.95.7 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@envelop/core': 5.0.0 + '@envelop/extended-validation': 4.0.0(@envelop/core@5.0.0)(graphql@16.8.1) + '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/string-interpolation': 0.5.2(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/executor': 1.2.0(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) + '@whatwg-node/fetch': 0.9.13 + graphql: 16.8.1 + graphql-jit: 0.8.2(graphql@16.8.1) + tslib: 2.6.2 dev: false /@graphql-mesh/store@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): @@ -6985,13 +6727,31 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-inspector/core': 3.3.0(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.5) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 - dev: false + + /@graphql-mesh/store@0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-4T5MnkdV70gPzM3Hj+Er2Qg4FTzePzbzGdHdWRSbW++4K+05Hbe1gKPix2f3s3BGkAO4Et5XkkdILL5QynhQFw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/types': ^0.95.7 + '@graphql-mesh/utils': ^0.95.7 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-inspector/core': 5.0.1(graphql@16.8.1) + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 /@graphql-mesh/string-interpolation@0.4.4(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-IotswBYZRaPswOebcr2wuOFuzD3dHIJxVEkPiiQubqjUIR8HhQI22XHJv0WNiQZ65z8NR9+GYWwEDIc2JRCNfQ==} @@ -7004,7 +6764,19 @@ packages: json-pointer: 0.6.2 lodash.get: 4.4.2 tslib: 2.6.2 - dev: false + + /@graphql-mesh/string-interpolation@0.5.2(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-TkSAJ9pj1zesQyDlHrEUevVGOc1s/z9IQC0AONcpMHAunb8uYGO4Yryl8JIRIvDl5DlexHt3z8kLDNCInRGWNQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + dayjs: 1.11.10 + graphql: 16.8.1 + json-pointer: 0.6.2 + lodash.get: 4.4.2 + tslib: 2.6.2 /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} @@ -7022,6 +6794,22 @@ packages: tslib: 2.6.2 dev: false + /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} + peerDependencies: + '@graphql-mesh/types': ^0.93.1 + '@graphql-mesh/utils': ^0.93.1 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: true + /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} peerDependencies: @@ -7037,7 +6825,23 @@ packages: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 - dev: false + + /@graphql-mesh/types@0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-afM2uuGR//lBoDrQvyfDmCcPwObpouRauahKVrXGyxkWe9LuIBG+scBZcynSbKotO1SgFcbJtToafMAIk5CefQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/store': ^0.95.7 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/store': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 /@graphql-mesh/utils@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-U+VytfSoqPofH/pmYZHFY10SkIFtHKrvE7Isxv1d0DiweVjdH3Qtojw13DWFpu/EKtgJY5bqoVnlcsZJYlKQoA==} @@ -7048,7 +6852,7 @@ packages: graphql: ^16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.5) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) @@ -7060,7 +6864,30 @@ packages: lodash.topath: 4.5.2 tiny-lru: 8.0.2 tslib: 2.6.2 - dev: false + + /@graphql-mesh/utils@0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-6YQTMTrLt6m/cAdesrBgbGVSrLd+68xTo1dRIhxUFHSgucSAqA47Q8E71Lc9cLHh80HQT+/pauKHHG40csy1Ng==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/types': ^0.95.7 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: ^16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/string-interpolation': 0.5.2(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@whatwg-node/fetch': 0.9.13 + dset: 3.1.2 + graphql: 16.8.1 + js-yaml: 4.1.0 + lodash.get: 4.4.2 + lodash.topath: 4.5.2 + tiny-lru: 11.2.3 + tslib: 2.6.2 /@graphql-tools/batch-delegate@8.4.27(graphql@16.8.1): resolution: {integrity: sha512-efgDDJhljma9d3Ky/LswIu1xm/if2oS27XA1sOcxcShW+Ze+Qxi0hZZ6iyI4eQxVDX5Lyy/n+NvQEZAK1riqnQ==} @@ -7073,7 +6900,19 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false + + /@graphql-tools/batch-delegate@9.0.0(graphql@16.8.1): + resolution: {integrity: sha512-23NmxcHQeKcfhMQyrRPTZfW4/+bSpAyR/qAhRjx+/hikDIa1Uv2XVgV9jIitSgM0OEk/KGPB4VQv+LCOWvAYiw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + dataloader: 2.2.2 + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 /@graphql-tools/batch-execute@8.5.22(graphql@16.8.1): resolution: {integrity: sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A==} @@ -7085,7 +6924,18 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false + + /@graphql-tools/batch-execute@9.0.2(graphql@16.8.1): + resolution: {integrity: sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + dataloader: 2.2.2 + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 /@graphql-tools/code-file-loader@7.3.23(@babel/core@7.23.2)(graphql@16.8.1): resolution: {integrity: sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==} @@ -7101,7 +6951,20 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color - dev: false + + /@graphql-tools/delegate@10.0.3(graphql@16.8.1): + resolution: {integrity: sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/batch-execute': 9.0.2(graphql@16.8.1) + '@graphql-tools/executor': 1.2.0(graphql@16.8.1) + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + dataloader: 2.2.2 + graphql: 16.8.1 + tslib: 2.6.2 /@graphql-tools/delegate@9.0.35(graphql@16.8.1): resolution: {integrity: sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA==} @@ -7116,7 +6979,6 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false /@graphql-tools/executor-graphql-ws@0.0.14(graphql@16.8.1): resolution: {integrity: sha512-P2nlkAsPZKLIXImFhj0YTtny5NQVGSsKnhi7PzXiaHSXc6KkzqbWZHKvikD4PObanqg+7IO58rKFpGXP7eeO+w==} @@ -7125,18 +6987,35 @@ packages: dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@repeaterjs/repeater': 3.0.4 - '@types/ws': 8.5.7 + '@types/ws': 8.5.8 graphql: 16.8.1 graphql-ws: 5.12.1(graphql@16.8.1) isomorphic-ws: 5.0.0(ws@8.13.0) tslib: 2.6.2 - ws: 8.13.0 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + /@graphql-tools/executor-graphql-ws@1.1.0(graphql@16.8.1): + resolution: {integrity: sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@types/ws': 8.5.8 + graphql: 16.8.1 + graphql-ws: 5.14.2(graphql@16.8.1) + isomorphic-ws: 5.0.0(ws@8.14.2) + tslib: 2.6.2 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate dev: false - /@graphql-tools/executor-http@0.1.10(@types/node@18.15.13)(graphql@16.8.1): + /@graphql-tools/executor-http@0.1.10(@types/node@18.18.6)(graphql@16.8.1): resolution: {integrity: sha512-hnAfbKv0/lb9s31LhWzawQ5hghBfHS+gYWtqxME6Rl0Aufq9GltiiLBcl7OVVOnkLF0KhwgbYP1mB5VKmgTGpg==} peerDependencies: graphql: ^16.6.0 @@ -7147,7 +7026,24 @@ packages: dset: 3.1.2 extract-files: 11.0.0 graphql: 16.8.1 - meros: 1.3.0(@types/node@18.15.13) + meros: 1.3.0(@types/node@18.18.6) + tslib: 2.6.2 + value-or-promise: 1.0.12 + transitivePeerDependencies: + - '@types/node' + + /@graphql-tools/executor-http@1.0.3(@types/node@18.18.6)(graphql@16.8.1): + resolution: {integrity: sha512-5WZIMBevRaxMabZ8U2Ty0dTUPy/PpeYSlMNEmC/YJjKKykgSfc/AwSejx2sE4FFKZ0I2kxRKRenyoWMHRAV49Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@repeaterjs/repeater': 3.0.4 + '@whatwg-node/fetch': 0.9.13 + extract-files: 11.0.0 + graphql: 16.8.1 + meros: 1.3.0(@types/node@18.18.6) tslib: 2.6.2 value-or-promise: 1.0.12 transitivePeerDependencies: @@ -7160,7 +7056,7 @@ packages: graphql: ^16.6.0 dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@types/ws': 8.5.7 + '@types/ws': 8.5.8 graphql: 16.8.1 isomorphic-ws: 5.0.0(ws@8.13.0) tslib: 2.6.2 @@ -7168,6 +7064,22 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + + /@graphql-tools/executor-legacy-ws@1.0.4(graphql@16.8.1): + resolution: {integrity: sha512-b7aGuRekZDS+m3af3BIvMKxu15bmVPMt5eGQVuP2v5pxmbaPTh+iv5mx9b3Plt32z5Ke5tycBnNm5urSFtW8ng==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@types/ws': 8.5.8 + graphql: 16.8.1 + isomorphic-ws: 5.0.0(ws@8.14.2) + tslib: 2.6.2 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate dev: false /@graphql-tools/executor@0.0.18(graphql@16.8.1): @@ -7181,7 +7093,6 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false /@graphql-tools/executor@0.0.20(graphql@16.8.1): resolution: {integrity: sha512-GdvNc4vszmfeGvUqlcaH1FjBoguvMYzxAfT6tDd4/LgwymepHhinqLNA5otqwVLW+JETcDaK7xGENzFomuE6TA==} @@ -7194,6 +7105,44 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + + /@graphql-tools/executor@1.2.0(graphql@16.8.1): + resolution: {integrity: sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + '@repeaterjs/repeater': 3.0.4 + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + + /@graphql-tools/federation@1.1.10(@types/node@18.18.6)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-H51qTYwbtfIYBO1uHXlImRWzo9tknSoIGBgJckDh+hdxJx43sZaMjJiLHc2DjRc/A8d2Bf0bi0HbH++HqOos/w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/executor-http': 1.0.3(@types/node@18.18.6)(graphql@16.8.1) + '@graphql-tools/merge': 9.0.0(graphql@16.8.1) + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + optionalDependencies: + '@apollo/client': 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@types/node' + - graphql-ws + - react + - react-dom + - subscriptions-transport-ws dev: false /@graphql-tools/graphql-file-loader@7.5.17(graphql@16.8.1): @@ -7207,7 +7156,6 @@ packages: graphql: 16.8.1 tslib: 2.6.2 unixify: 1.0.0 - dev: false /@graphql-tools/graphql-tag-pluck@7.5.2(@babel/core@7.23.2)(graphql@16.8.1): resolution: {integrity: sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==} @@ -7224,7 +7172,6 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color - dev: false /@graphql-tools/import@6.7.18(graphql@16.8.1): resolution: {integrity: sha512-XQDdyZTp+FYmT7as3xRWH/x8dx0QZA2WZqfMF5EWb36a0PiH7WwlRQYIdyYXj8YCLpiWkeBXgBRHmMnwEYR8iQ==} @@ -7235,7 +7182,6 @@ packages: graphql: 16.8.1 resolve-from: 5.0.0 tslib: 2.6.2 - dev: false /@graphql-tools/load@7.8.14(graphql@16.8.1): resolution: {integrity: sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==} @@ -7247,7 +7193,6 @@ packages: graphql: 16.8.1 p-limit: 3.1.0 tslib: 2.6.2 - dev: false /@graphql-tools/merge@8.4.2(graphql@16.8.1): resolution: {integrity: sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==} @@ -7257,7 +7202,16 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 - dev: false + + /@graphql-tools/merge@9.0.0(graphql@16.8.1): + resolution: {integrity: sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 /@graphql-tools/optimize@1.4.0(graphql@16.8.1): resolution: {integrity: sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==} @@ -7266,7 +7220,6 @@ packages: dependencies: graphql: 16.8.1 tslib: 2.6.2 - dev: false /@graphql-tools/relay-operation-optimizer@6.5.18(graphql@16.8.1): resolution: {integrity: sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==} @@ -7280,7 +7233,18 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false + + /@graphql-tools/schema@10.0.0(graphql@16.8.1): + resolution: {integrity: sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/merge': 9.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 /@graphql-tools/schema@9.0.19(graphql@16.8.1): resolution: {integrity: sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==} @@ -7292,7 +7256,6 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false /@graphql-tools/stitch@8.7.50(graphql@16.8.1): resolution: {integrity: sha512-VB1/uZyXjj1P5Wj0c4EKX3q8Q1Maj4dy6uNwodEPaO3EHMpaJU/DqyN0Bvnhxu0ol7RzdY3kgsvsdUjU2QMImw==} @@ -7309,6 +7272,23 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + + /@graphql-tools/stitch@9.0.3(graphql@16.8.1): + resolution: {integrity: sha512-G03XahiHDu1pnaS8z2GNfsV/5BribMEUATT5dCHBAqj13Te5y1amZNQePrmw8DLtbf5qDbU6CO7kGHPxv0XO9A==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/executor': 1.2.0(graphql@16.8.1) + '@graphql-tools/merge': 9.0.0(graphql@16.8.1) + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 dev: false /@graphql-tools/stitching-directives@2.3.34(graphql@16.8.1): @@ -7320,9 +7300,8 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 - dev: false - /@graphql-tools/url-loader@7.17.18(@types/node@18.15.13)(graphql@16.8.1): + /@graphql-tools/url-loader@7.17.18(@types/node@18.18.6)(graphql@16.8.1): resolution: {integrity: sha512-ear0CiyTj04jCVAxi7TvgbnGDIN2HgqzXzwsfcqiVg9cvjT40NcMlZ2P1lZDgqMkZ9oyLTV8Bw6j+SyG6A+xPw==} peerDependencies: graphql: ^16.6.0 @@ -7330,17 +7309,43 @@ packages: '@ardatan/sync-fetch': 0.0.1 '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/executor-graphql-ws': 0.0.14(graphql@16.8.1) - '@graphql-tools/executor-http': 0.1.10(@types/node@18.15.13)(graphql@16.8.1) + '@graphql-tools/executor-http': 0.1.10(@types/node@18.18.6)(graphql@16.8.1) '@graphql-tools/executor-legacy-ws': 0.0.11(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) - '@types/ws': 8.5.7 + '@types/ws': 8.5.8 '@whatwg-node/fetch': 0.8.8 graphql: 16.8.1 isomorphic-ws: 5.0.0(ws@8.14.2) tslib: 2.6.2 value-or-promise: 1.0.12 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - utf-8-validate + + /@graphql-tools/url-loader@8.0.0(@types/node@18.18.6)(graphql@16.8.1): + resolution: {integrity: sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@ardatan/sync-fetch': 0.0.1 + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/executor-graphql-ws': 1.1.0(graphql@16.8.1) + '@graphql-tools/executor-http': 1.0.3(@types/node@18.18.6)(graphql@16.8.1) + '@graphql-tools/executor-legacy-ws': 1.0.4(graphql@16.8.1) + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) + '@types/ws': 8.5.8 + '@whatwg-node/fetch': 0.9.13 + graphql: 16.8.1 + isomorphic-ws: 5.0.0(ws@8.14.2) + tslib: 2.6.2 + value-or-promise: 1.0.12 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@types/node' - bufferutil @@ -7348,6 +7353,17 @@ packages: - utf-8-validate dev: false + /@graphql-tools/utils@10.0.7(graphql@16.8.1): + resolution: {integrity: sha512-KOdeMj6Hd/MENDaqPbws3YJl3wVy0DeYnL7PyUms5Skyf7uzI9INynDwPMhLXfSb0/ph6BXTwMd5zBtWbF8tBQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + dset: 3.1.2 + graphql: 16.8.1 + tslib: 2.6.2 + /@graphql-tools/utils@8.13.1(graphql@16.8.1): resolution: {integrity: sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==} peerDependencies: @@ -7355,7 +7371,6 @@ packages: dependencies: graphql: 16.8.1 tslib: 2.6.2 - dev: false /@graphql-tools/utils@9.2.1(graphql@16.8.1): resolution: {integrity: sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==} @@ -7365,6 +7380,19 @@ packages: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + + /@graphql-tools/wrap@10.0.1(graphql@16.8.1): + resolution: {integrity: sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 dev: false /@graphql-tools/wrap@9.4.2(graphql@16.8.1): @@ -7378,7 +7406,6 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false /@graphql-typed-document-node/core@3.2.0(graphql@16.8.1): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} @@ -7386,12 +7413,17 @@ packages: graphql: ^16.6.0 dependencies: graphql: 16.8.1 - dev: false /@graphql-yoga/logger@0.0.1: resolution: {integrity: sha512-6npFz7eZz33mXgSm1waBLMjUNG0D5hTc/p5Hcs1mojkT3KsLpCOFokzTEKboNsBhKevYcaVa/xeA7WBj4UYMLg==} dependencies: tslib: 2.6.2 + + /@graphql-yoga/logger@2.0.0: + resolution: {integrity: sha512-Mg8psdkAp+YTG1OGmvU+xa6xpsAmSir0hhr3yFYPyLNwzUj95DdIwsMpKadDj9xDpYgJcH3Hp/4JMal9DhQimA==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.6.2 dev: false /@graphql-yoga/subscription@3.1.0: @@ -7401,6 +7433,15 @@ packages: '@repeaterjs/repeater': 3.0.4 '@whatwg-node/events': 0.0.2 tslib: 2.6.2 + + /@graphql-yoga/subscription@5.0.0: + resolution: {integrity: sha512-Ri7sK8hmxd/kwaEa0YT8uqQUb2wOLsmBMxI90QDyf96lzOMJRgBuNYoEkU1pSgsgmW2glceZ96sRYfaXqwVxUw==} + engines: {node: '>=18.0.0'} + dependencies: + '@graphql-yoga/typed-event-target': 3.0.0 + '@repeaterjs/repeater': 3.0.4 + '@whatwg-node/events': 0.1.1 + tslib: 2.6.2 dev: false /@graphql-yoga/typed-event-target@1.0.0: @@ -7408,6 +7449,13 @@ packages: dependencies: '@repeaterjs/repeater': 3.0.4 tslib: 2.6.2 + + /@graphql-yoga/typed-event-target@3.0.0: + resolution: {integrity: sha512-w+liuBySifrstuHbFrHoHAEyVnDFVib+073q8AeAJ/qqJfvFvAwUPLLtNohR/WDVRgSasfXtl3dcNuVJWN+rjg==} + engines: {node: '>=18.0.0'} + dependencies: + '@repeaterjs/repeater': 3.0.4 + tslib: 2.6.2 dev: false /@hapi/hoek@9.3.0: @@ -7418,11 +7466,11 @@ packages: dependencies: '@hapi/hoek': 9.3.0 - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: @@ -7449,57 +7497,67 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + /@hypercerts-org/contracts@0.8.11: resolution: {integrity: sha512-n6fwMsaoR50VITM2upR4OOi4EZJmZvU6vvXrHWCSakP9e1OeDuAOk+kHiK+egqDRYj6uKtg9VTUFKZBYvu3jRg==} dev: false - /@hypercerts-org/sdk@0.8.10(@babel/core@7.23.2)(@envelop/core@3.0.6)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(node-fetch@3.3.2)(react-native@0.72.5)(typescript@5.1.6)(uint8arraylist@2.4.3): - resolution: {integrity: sha512-shgYIhwG93RenegpIXVDMAGiFE0hpKZynMTl9qc0Q1RjWptX3+UvaeqYK4PfSxAS9LmN9lytXt3L8JOml3WWAQ==} + /@hypercerts-org/sdk@0.8.16(@envelop/core@3.0.6)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3): + resolution: {integrity: sha512-WkxYb5RYhv3QI7+N5y4xg5IL4azLqCq4ia1/bgFB55vWJLjnmoMj3VYbiybMxyfgnPfh5O8n2DU86u8ClLgyhg==} dependencies: '@ethereum-attestation-service/eas-sdk': 0.28.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(typescript@5.1.6) '@ethersproject/abstract-signer': 5.7.0 - '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-cli': 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.15.13)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.5) + '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) + '@graphql-mesh/cache-localforage': 0.95.7(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/graphql': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) + '@graphql-mesh/http': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.12)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/merger-bare': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.12(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': 0.8.11 '@openzeppelin/merkle-tree': 1.0.5 + '@whatwg-node/fetch': 0.9.13 ajv: 8.12.0 axios: 1.5.1(debug@4.3.4) dotenv: 16.3.1 ethers: 5.7.2 graphql: 16.8.1 ipfs-core: 0.17.0(uint8arraylist@2.4.3) - jest: 29.7.0(@types/node@18.15.13)(ts-node@10.9.1) + jest: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) loglevel: 1.8.1 mime: 3.0.0 nft.storage: 7.1.1(node-fetch@3.3.2) web3.storage: 4.5.5(node-fetch@3.3.2) transitivePeerDependencies: - - '@babel/core' - '@envelop/core' - '@ethersproject/abi' - '@ethersproject/providers' - - '@graphql-mesh/cross-helpers' - - '@graphql-mesh/store' - - '@graphql-mesh/types' - - '@graphql-mesh/utils' - '@graphql-tools/delegate' - '@graphql-tools/merge' - '@graphql-tools/utils' - '@graphql-tools/wrap' - - '@swc/core' - - '@swc/wasm' - '@types/node' - babel-plugin-macros - bufferutil - debug - encoding - - graphql-tag + - graphql-ws - node-fetch - node-notifier - - react-native - - react-native-windows + - react + - react-dom + - subscriptions-transport-ws - supports-color - ts-node + - tslib - typescript - uint8arraylist - utf-8-validate @@ -7522,7 +7580,7 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: '@ipld/dag-cbor': 9.0.6 - cborg: 4.0.3 + cborg: 4.0.4 multiformats: 12.1.2 varint: 6.0.0 dev: false @@ -7539,7 +7597,6 @@ packages: dependencies: cborg: 1.10.2 multiformats: 9.9.0 - dev: false /@ipld/dag-cbor@8.0.1: resolution: {integrity: sha512-mHRuzgGXNk0Y5W7nNQdN37qJiig1Kdgf92icBVFRUNtBc9Ezl5DIdWfiGWBucHBrhqPBncxoH3As9cHPIRozxA==} @@ -7553,10 +7610,17 @@ packages: resolution: {integrity: sha512-3kNab5xMppgWw6DVYx2BzmFq8t7I56AGWfp5kaU1fIPkwHVpBRglJJTYsGtbVluCi/s/q97HZM3bC+aDW4sxbQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - cborg: 4.0.3 + cborg: 4.0.4 multiformats: 12.1.2 dev: false + /@ipld/dag-json@8.0.11: + resolution: {integrity: sha512-Pea7JXeYHTWXRTIhBqBlhw7G53PJ7yta3G/sizGEZyzdeEwhZRr0od5IQ0r2ZxOt1Do+2czddjeEPp+YTxDwCA==} + dependencies: + cborg: 1.10.2 + multiformats: 9.9.0 + dev: true + /@ipld/dag-json@9.1.1: resolution: {integrity: sha512-L0l+Osi8zAWUw2L/fWJjeZ75l7XojD0Mud1Xvo32q8AJeVuqvCQFdqqIFBiq8MwuqC8qS8kbysro3w5mphUiDQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -7569,7 +7633,6 @@ packages: resolution: {integrity: sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg==} dependencies: multiformats: 9.9.0 - dev: false /@ipld/dag-pb@3.0.2: resolution: {integrity: sha512-ge+llKU/CNc6rX5ZcUhCrPXJjKjN1DsolDOJ99zOsousGOhepoIgvT01iAP8s7QN9QFciOE+a1jHdccs+CyhBA==} @@ -7608,7 +7671,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.15.13 + '@types/node': 18.18.6 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -7628,14 +7691,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.13 + '@types/node': 18.18.6 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.15.13)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -7661,7 +7724,6 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - dev: false /@jest/environment@29.7.0: resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} @@ -7669,7 +7731,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.13 + '@types/node': 18.18.6 jest-mock: 29.7.0 /@jest/expect-utils@29.7.0: @@ -7693,7 +7755,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.15.13 + '@types/node': 18.18.6 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -7723,8 +7785,8 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 - '@types/node': 18.15.13 + '@jridgewell/trace-mapping': 0.3.20 + '@types/node': 18.18.6 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -7755,7 +7817,7 @@ packages: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -7765,7 +7827,7 @@ packages: dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-lib-coverage': 2.0.5 collect-v8-coverage: 1.0.2 /@jest/test-sequencer@29.7.0: @@ -7783,7 +7845,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -7803,32 +7865,31 @@ packages: resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} engines: {node: '>= 10.14.2'} dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.2 - '@types/node': 18.15.13 - '@types/yargs': 15.0.16 + '@types/istanbul-lib-coverage': 2.0.5 + '@types/istanbul-reports': 3.0.3 + '@types/node': 18.18.6 + '@types/yargs': 15.0.17 chalk: 4.1.2 /@jest/types@27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.2 - '@types/node': 18.15.13 - '@types/yargs': 16.0.6 + '@types/istanbul-lib-coverage': 2.0.5 + '@types/istanbul-reports': 3.0.3 + '@types/node': 18.18.6 + '@types/yargs': 16.0.7 chalk: 4.1.2 - dev: false /@jest/types@29.6.3: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.2 - '@types/node': 18.15.13 - '@types/yargs': 17.0.28 + '@types/istanbul-lib-coverage': 2.0.5 + '@types/istanbul-reports': 3.0.3 + '@types/node': 18.18.6 + '@types/yargs': 17.0.29 chalk: 4.1.2 /@jridgewell/gen-mapping@0.3.3: @@ -7837,7 +7898,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} @@ -7851,13 +7912,13 @@ packages: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 @@ -7942,7 +8003,7 @@ packages: '@noble/secp256k1': 1.7.1 multiformats: 11.0.2 node-forge: 1.3.1 - protons-runtime: 5.0.2(uint8arraylist@2.4.3) + protons-runtime: 5.1.0 uint8arraylist: 2.4.3 uint8arrays: 4.0.6 dev: false @@ -8390,7 +8451,7 @@ packages: '@libp2p/logger': 2.1.1 '@libp2p/peer-id': 1.1.18 '@multiformats/multiaddr': 11.6.1 - '@types/multicast-dns': 7.2.2 + '@types/multicast-dns': 7.2.3 multicast-dns: 7.2.5 multiformats: 10.0.3 transitivePeerDependencies: @@ -8734,7 +8795,7 @@ packages: p-defer: 4.0.0 p-timeout: 6.1.2 wherearewe: 2.0.1 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -8799,15 +8860,46 @@ packages: tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 + /@metamask/object-multiplex@1.2.0: + resolution: {integrity: sha512-hksV602d3NWE2Q30Mf2Np1WfVKaGqfJRy9vpHAmelbaD0OkDt06/0KQkRR6UVYdMbTbkuEu8xN5JDUU80inGwQ==} + engines: {node: '>=12.0.0'} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + readable-stream: 2.3.8 + dev: false + + /@metamask/providers@11.1.2: + resolution: {integrity: sha512-xjE4cKrGpKZjripkMKMStc0H4LXrWJPijfbaj1kKeDLVhRH2Yu3ZecV3iIhf1EIJePeA+Kx6Pcm7d0IVJ+ea7g==} + engines: {node: '>=16.0.0'} + dependencies: + '@metamask/object-multiplex': 1.2.0 + '@metamask/safe-event-emitter': 3.0.0 + detect-browser: 5.3.0 + eth-rpc-errors: 4.0.2 + extension-port-stream: 2.1.1 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + json-rpc-engine: 6.1.0 + json-rpc-middleware-stream: 4.2.3 + pump: 3.0.0 + webextension-polyfill: 0.10.0 + dev: false + /@metamask/safe-event-emitter@2.0.0: resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} dev: false + /@metamask/safe-event-emitter@3.0.0: + resolution: {integrity: sha512-j6Z47VOmVyGMlnKXZmL0fyvWfEYtKWCA9yGZkU3FCsGZUT5lHGmvaV9JA5F2Y+010y7+ROtR3WMXIkvl/nVzqQ==} + engines: {node: '>=12.0.0'} + dev: false + /@metamask/utils@3.6.0: resolution: {integrity: sha512-9cIRrfkWvHblSiNDVXsjivqa9Ak0RYo/1H6tqTqTbAx+oBK2Sva0lWDHxGchOqA7bySGUJKAWSNJvH6gdHZ0gQ==} engines: {node: '>=14.0.0'} dependencies: - '@types/debug': 4.1.9 + '@types/debug': 4.1.10 debug: 4.3.4(supports-color@8.1.1) semver: 7.5.4 superstruct: 1.0.3 @@ -8887,7 +8979,7 @@ packages: kleur: 4.1.5 selfsigned: 2.1.1 undici: 5.9.1 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) youch: 2.2.2 transitivePeerDependencies: - bufferutil @@ -8936,7 +9028,7 @@ packages: resolution: {integrity: sha512-fWMqq3ZkWAg+k7CnyzMV/rZHugwn+/JxvVzCxrtvxzwotTN547THlOxgZe8JAP23U9BiTxOfpTfnLvFEjAmegw==} engines: {node: '>=16.13'} dependencies: - '@types/better-sqlite3': 7.6.5 + '@types/better-sqlite3': 7.6.6 kleur: 4.1.5 npx-import: 1.1.4 picomatch: 2.3.1 @@ -8980,7 +9072,7 @@ packages: '@miniflare/core': 2.11.0 '@miniflare/shared': 2.11.0 undici: 5.9.1 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -9051,7 +9143,7 @@ packages: resolution: {integrity: sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==} engines: {node: '>=14'} dependencies: - '@types/set-cookie-parser': 2.4.4 + '@types/set-cookie-parser': 2.4.5 set-cookie-parser: 2.6.0 dev: true @@ -9060,7 +9152,7 @@ packages: engines: {node: '>=14'} dependencies: '@open-draft/until': 1.0.3 - '@types/debug': 4.1.9 + '@types/debug': 4.1.10 '@xmldom/xmldom': 0.8.10 debug: 4.3.4(supports-color@8.1.1) headers-polyfill: 3.2.5 @@ -9071,8 +9163,8 @@ packages: - supports-color dev: true - /@mui/base@5.0.0-beta.19(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-maNBgAscddyPNzFZQUJDF/puxM27Li+NqSBsr/lAP8TLns2VvWS2SoL3OKFOIoRnAMKGY/Ic6Aot6gCYeQnssA==} + /@mui/base@5.0.0-beta.20(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -9082,24 +9174,24 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@mui/types': 7.2.6(@types/react@18.2.28) - '@mui/utils': 5.14.13(@types/react@18.2.28)(react@18.2.0) + '@mui/types': 7.2.6(@types/react@18.2.31) + '@mui/utils': 5.14.14(@types/react@18.2.31)(react@18.2.0) '@popperjs/core': 2.11.8 - '@types/react': 18.2.28 + '@types/react': 18.2.31 clsx: 2.0.0 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@mui/core-downloads-tracker@5.14.13: - resolution: {integrity: sha512-3ZUbzcH4yloLKlV6Y+S0Edn2wef9t+EGHSfEkwVCn8E0ULdshifEFgfEroKRegQifDIwcKS/ofccxuZ8njTAYg==} + /@mui/core-downloads-tracker@5.14.14: + resolution: {integrity: sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==} dev: false - /@mui/icons-material@5.14.13(@mui/material@5.14.13)(@types/react@18.2.28)(react@18.2.0): - resolution: {integrity: sha512-fxKE1UrjI4xVxHe9IAGuVQZrc18dSBJg0P+Sqi2SZmcDUCShmgRq6Jq7l7GduvuMIkOSqAJdNgLtXmtmZkjtLg==} + /@mui/icons-material@5.14.14(@mui/material@5.14.14)(@types/react@18.2.31)(react@18.2.0): + resolution: {integrity: sha512-vwuaMsKvI7AWTeYqR8wYbpXijuU8PzMAJWRAq2DDIuOZPxjKyHlr8WQ25+azZYkIXtJ7AqnVb1ZmHdEyB4/kug==} engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 @@ -9109,14 +9201,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.1 - '@mui/material': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.28 + '@babel/runtime': 7.23.2 + '@mui/material': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.31 react: 18.2.0 dev: false - /@mui/material@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-iPEFwhoVG789UVsXX4gqd1eJUlcLW1oceqwJYQN8Z4MpcAKfL9Lv3fda65AwG7pQ5lf+d7IbHzm4m48SWZxI2g==} + /@mui/material@5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cAmCwAHFQXxb44kWbVFkhKATN8tACgMsFwrXo8ro6WzYW73U/qsR5AcCiJIhCyYYg+gcftfkmNcpRaV3JjhHCg==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -9132,16 +9224,16 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.1 - '@emotion/react': 11.11.1(@types/react@18.2.28)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.28)(react@18.2.0) - '@mui/base': 5.0.0-beta.19(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.14.13 - '@mui/system': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.28)(react@18.2.0) - '@mui/types': 7.2.6(@types/react@18.2.28) - '@mui/utils': 5.14.13(@types/react@18.2.28)(react@18.2.0) - '@types/react': 18.2.28 - '@types/react-transition-group': 4.4.7 + '@babel/runtime': 7.23.2 + '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) + '@mui/base': 5.0.0-beta.20(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@mui/core-downloads-tracker': 5.14.14 + '@mui/system': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react@18.2.0) + '@mui/types': 7.2.6(@types/react@18.2.31) + '@mui/utils': 5.14.14(@types/react@18.2.31)(react@18.2.0) + '@types/react': 18.2.31 + '@types/react-transition-group': 4.4.8 clsx: 2.0.0 csstype: 3.1.2 prop-types: 15.8.1 @@ -9151,8 +9243,8 @@ packages: react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) dev: false - /@mui/private-theming@5.14.13(@types/react@18.2.28)(react@18.2.0): - resolution: {integrity: sha512-5EFqk4tqiSwPguj4NW/6bUf4u1qoUWXy9lrKfNh9H6oAohM+Ijv/7qSxFjnxPGBctj469/Sc5aKAR35ILBKZLQ==} + /@mui/private-theming@5.14.14(@types/react@18.2.31)(react@18.2.0): + resolution: {integrity: sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -9161,15 +9253,15 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.1 - '@mui/utils': 5.14.13(@types/react@18.2.28)(react@18.2.0) - '@types/react': 18.2.28 + '@babel/runtime': 7.23.2 + '@mui/utils': 5.14.14(@types/react@18.2.31)(react@18.2.0) + '@types/react': 18.2.31 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/styled-engine@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-1ff/egFQl26hiwcUtCMKAkp4Sgqpm3qIewmXq+GN27fb44lDIACquehMFBuadOjceOFmbIXbayzbA46ZyqFYzA==} + /@mui/styled-engine@5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -9181,17 +9273,17 @@ packages: '@emotion/styled': optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.1(@types/react@18.2.28)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.28)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) csstype: 3.1.2 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/system@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.28)(react@18.2.0): - resolution: {integrity: sha512-+5+Dx50lG4csbx2sGjrKLozXQJeCpJ4dIBZolyFLkZ+XphD1keQWouLUvJkPQ3MSglLLKuD37pp52YjMncZMEQ==} + /@mui/system@5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react@18.2.0): + resolution: {integrity: sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -9206,21 +9298,21 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.1 - '@emotion/react': 11.11.1(@types/react@18.2.28)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.28)(react@18.2.0) - '@mui/private-theming': 5.14.13(@types/react@18.2.28)(react@18.2.0) - '@mui/styled-engine': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/types': 7.2.6(@types/react@18.2.28) - '@mui/utils': 5.14.13(@types/react@18.2.28)(react@18.2.0) - '@types/react': 18.2.28 + '@babel/runtime': 7.23.2 + '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) + '@mui/private-theming': 5.14.14(@types/react@18.2.31)(react@18.2.0) + '@mui/styled-engine': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.6(@types/react@18.2.31) + '@mui/utils': 5.14.14(@types/react@18.2.31)(react@18.2.0) + '@types/react': 18.2.31 clsx: 2.0.0 csstype: 3.1.2 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/types@7.2.6(@types/react@18.2.28): + /@mui/types@7.2.6(@types/react@18.2.31): resolution: {integrity: sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -9228,11 +9320,11 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.28 + '@types/react': 18.2.31 dev: false - /@mui/utils@5.14.13(@types/react@18.2.28)(react@18.2.0): - resolution: {integrity: sha512-2AFpyXWw7uDCIqRu7eU2i/EplZtks5LAMzQvIhC79sPV9IhOZU2qwOWVnPtdctRXiQJOAaXulg+A37pfhEueQw==} + /@mui/utils@5.14.14(@types/react@18.2.31)(react@18.2.0): + resolution: {integrity: sha512-3AKp8uksje5sRfVrtgG9Q/2TBsHWVBUtA0NaXliZqGcXo8J+A+Agp0qUW2rJ+ivgPWTCCubz9FZVT2IQZ3bGsw==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -9241,15 +9333,15 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.1 - '@types/prop-types': 15.7.8 - '@types/react': 18.2.28 + '@babel/runtime': 7.23.2 + '@types/prop-types': 15.7.9 + '@types/react': 18.2.31 prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 dev: false - /@mui/x-date-pickers@5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.13)(@mui/system@5.14.13)(@types/react@18.2.28)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-date-pickers@5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(@mui/system@5.14.14)(@types/react@18.2.31)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA==} engines: {node: '>=12.0.0'} peerDependencies: @@ -9277,18 +9369,18 @@ packages: moment: optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@date-io/core': 2.17.0 '@date-io/date-fns': 2.17.0 '@date-io/dayjs': 2.17.0(dayjs@1.11.10) '@date-io/luxon': 2.17.0 '@date-io/moment': 2.17.0 - '@emotion/react': 11.11.1(@types/react@18.2.28)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.28)(react@18.2.0) - '@mui/material': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.28)(react@18.2.0) - '@mui/utils': 5.14.13(@types/react@18.2.28)(react@18.2.0) - '@types/react-transition-group': 4.4.7 + '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) + '@mui/material': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react@18.2.0) + '@mui/utils': 5.14.14(@types/react@18.2.31)(react@18.2.0) + '@types/react-transition-group': 4.4.8 clsx: 1.2.1 dayjs: 1.11.10 prop-types: 15.8.1 @@ -9370,8 +9462,8 @@ packages: murmurhash3js-revisited: 3.0.0 dev: false - /@next/env@13.5.4: - resolution: {integrity: sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ==} + /@next/env@13.5.6: + resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} dev: false /@next/eslint-plugin-next@12.2.0: @@ -9380,14 +9472,14 @@ packages: glob: 7.1.7 dev: true - /@next/eslint-plugin-next@13.5.4: - resolution: {integrity: sha512-vI94U+D7RNgX6XypSyjeFrOzxGlZyxOplU0dVE5norIfZGn/LDjJYPHdvdsR5vN1eRtl6PDAsOHmycFEOljK5A==} + /@next/eslint-plugin-next@13.5.6: + resolution: {integrity: sha512-ng7pU/DDsxPgT6ZPvuprxrkeew3XaRf4LAT4FabaEO/hAbvVx4P7wqnqdbTdDn1kgTvsI4tpIgT4Awn/m0bGbg==} dependencies: glob: 7.1.7 dev: false - /@next/swc-darwin-arm64@13.5.4: - resolution: {integrity: sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==} + /@next/swc-darwin-arm64@13.5.6: + resolution: {integrity: sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -9395,8 +9487,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.5.4: - resolution: {integrity: sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==} + /@next/swc-darwin-x64@13.5.6: + resolution: {integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -9404,8 +9496,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.5.4: - resolution: {integrity: sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==} + /@next/swc-linux-arm64-gnu@13.5.6: + resolution: {integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -9413,8 +9505,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.5.4: - resolution: {integrity: sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==} + /@next/swc-linux-arm64-musl@13.5.6: + resolution: {integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -9422,8 +9514,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.5.4: - resolution: {integrity: sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==} + /@next/swc-linux-x64-gnu@13.5.6: + resolution: {integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -9431,8 +9523,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.5.4: - resolution: {integrity: sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==} + /@next/swc-linux-x64-musl@13.5.6: + resolution: {integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -9440,8 +9532,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.5.4: - resolution: {integrity: sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==} + /@next/swc-win32-arm64-msvc@13.5.6: + resolution: {integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -9449,8 +9541,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.5.4: - resolution: {integrity: sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==} + /@next/swc-win32-ia32-msvc@13.5.6: + resolution: {integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -9458,8 +9550,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.5.4: - resolution: {integrity: sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==} + /@next/swc-win32-x64-msvc@13.5.6: + resolution: {integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -9502,6 +9594,7 @@ packages: /@noble/hashes@1.3.2: resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} + dev: false /@noble/secp256k1@1.7.1: resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} @@ -9681,7 +9774,7 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.13.1) - '@types/chai-as-promised': 7.1.6 + '@types/chai-as-promised': 7.1.7 chai: 4.3.10 chai-as-promised: 7.1.1(chai@4.3.10) deep-eql: 4.1.3 @@ -9699,7 +9792,7 @@ packages: hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) dev: true - /@nomicfoundation/hardhat-toolbox@2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(@typechain/ethers-v5@11.1.2)(@typechain/hardhat@9.1.0)(@types/chai@4.3.7)(@types/mocha@9.1.0)(@types/node@18.15.13)(chai@4.3.10)(ethers@5.7.2)(hardhat-gas-reporter@1.0.9)(hardhat@2.13.1)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.1)(typescript@4.9.5): + /@nomicfoundation/hardhat-toolbox@2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(@typechain/ethers-v5@11.1.2)(@typechain/hardhat@9.1.0)(@types/chai@4.3.9)(@types/mocha@9.1.0)(@types/node@18.18.6)(chai@4.3.10)(ethers@5.7.2)(hardhat-gas-reporter@1.0.9)(hardhat@2.13.1)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.2)(typescript@4.9.5): resolution: {integrity: sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==} peerDependencies: '@ethersproject/abi': ^5.4.7 @@ -9728,18 +9821,18 @@ packages: '@nomicfoundation/hardhat-network-helpers': 1.0.9(hardhat@2.13.1) '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.13.1) '@nomiclabs/hardhat-etherscan': 3.1.7(hardhat@2.13.1) - '@typechain/ethers-v5': 11.1.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@4.9.5) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.1) - '@types/chai': 4.3.7 + '@typechain/ethers-v5': 11.1.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2) + '@types/chai': 4.3.9 '@types/mocha': 9.1.0 - '@types/node': 18.15.13 + '@types/node': 18.18.6 chai: 4.3.10 ethers: 5.7.2 hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) hardhat-gas-reporter: 1.0.9(hardhat@2.13.1) solidity-coverage: 0.8.5(hardhat@2.13.1) - ts-node: 10.9.1(@types/node@18.15.13)(typescript@4.9.5) - typechain: 8.3.1(typescript@4.9.5) + ts-node: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + typechain: 8.3.2(typescript@4.9.5) typescript: 4.9.5 dev: true @@ -9848,47 +9941,155 @@ packages: hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) dev: true - /@nomiclabs/hardhat-etherscan@3.1.7(hardhat@2.13.1): - resolution: {integrity: sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==} - peerDependencies: - hardhat: ^2.0.4 + /@nomiclabs/hardhat-etherscan@3.1.7(hardhat@2.13.1): + resolution: {integrity: sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==} + peerDependencies: + hardhat: ^2.0.4 + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.7.0 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 7.0.1 + hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + lodash: 4.17.21 + semver: 6.3.1 + table: 6.8.1 + undici: 5.26.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@observablehq/inspector@5.0.0: + resolution: {integrity: sha512-Vvg/TQdsZTUaeYbH0IKxYEz37FbRO6kdowoz2PrHLQif54NC1CjEihEjg+ZMSBn587GQxTFABu0CGkFZgtR1UQ==} + dependencies: + isoformat: 0.2.1 + dev: false + + /@observablehq/runtime@5.9.4: + resolution: {integrity: sha512-r+2TjUH4oZlTkmZnk0tj4kgAe1C2O+KVPjWqxH/6G5fF38UAYlUf/+ONFmLotsXs0BkqHKXIui5U8dMdeMkncw==} + dependencies: + '@observablehq/inspector': 5.0.0 + '@observablehq/stdlib': 5.8.3 + dev: false + + /@observablehq/stdlib@5.8.3: + resolution: {integrity: sha512-XmuwqzAMZ8H0ICJfzd5wV3WD6nLlC2XwhMIdu2QDZppTSxGafATMSbgZ2JaiNPCejenkpERGmoC3W83FUGuNeg==} + engines: {node: '>=14.5.0'} + dependencies: + d3-array: 3.2.4 + d3-dsv: 3.0.1 + d3-require: 1.3.0 + dev: false + + /@oclif/core@2.15.0(@types/node@18.18.6)(typescript@4.9.5): + resolution: {integrity: sha512-fNEMG5DzJHhYmI3MgpByTvltBOMyFcnRIUMxbiz2ai8rhaYgaTHMG3Q38HcosfIvtw9nCjxpcQtC8MN8QtVCcA==} + engines: {node: '>=14.0.0'} + dependencies: + '@types/cli-progress': 3.11.4 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.3 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + ts-node: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + tslib: 2.6.2 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + dev: true + + /@oclif/core@2.8.6(@types/node@18.18.6)(typescript@4.9.5): + resolution: {integrity: sha512-1QlPaHMhOORySCXkQyzjsIsy2GYTilOw3LkjeHkCgsPJQjAT4IclVytJusWktPbYNys9O+O4V23J44yomQvnBQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@types/cli-progress': 3.11.4 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + fs-extra: 9.1.0 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.3 + semver: 7.5.4 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + ts-node: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + tslib: 2.6.2 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + dev: true + + /@oclif/plugin-autocomplete@2.3.10(@types/node@18.18.6)(typescript@4.9.5): + resolution: {integrity: sha512-Ow1AR8WtjzlyCtiWWPgzMyT8SbcDJFr47009riLioHa+MHX2BCDtVn2DVnN/E6b9JlPV5ptQpjefoRSNWBesmg==} + engines: {node: '>=12.0.0'} dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.7.0 - cbor: 8.1.0 - chalk: 2.4.2 + '@oclif/core': 2.15.0(@types/node@18.18.6)(typescript@4.9.5) + chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) - fs-extra: 7.0.1 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) - lodash: 4.17.21 - semver: 6.3.1 - table: 6.8.1 - undici: 5.26.0 transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' - supports-color + - typescript dev: true - /@observablehq/inspector@5.0.0: - resolution: {integrity: sha512-Vvg/TQdsZTUaeYbH0IKxYEz37FbRO6kdowoz2PrHLQif54NC1CjEihEjg+ZMSBn587GQxTFABu0CGkFZgtR1UQ==} - dependencies: - isoformat: 0.2.1 - dev: false - - /@observablehq/runtime@5.9.3: - resolution: {integrity: sha512-dRgqbClP4QiOSlInp6NaBXRPK7fJ2LtyPY/xppR8p9COTgwAPlP0/wHL8d1OD4f6AgwWXMqotiZqmduXsZgkSQ==} - dependencies: - '@observablehq/inspector': 5.0.0 - '@observablehq/stdlib': 5.8.3 - dev: false - - /@observablehq/stdlib@5.8.3: - resolution: {integrity: sha512-XmuwqzAMZ8H0ICJfzd5wV3WD6nLlC2XwhMIdu2QDZppTSxGafATMSbgZ2JaiNPCejenkpERGmoC3W83FUGuNeg==} - engines: {node: '>=14.5.0'} + /@oclif/plugin-not-found@2.4.3(@types/node@18.18.6)(typescript@4.9.5): + resolution: {integrity: sha512-nIyaR4y692frwh7wIHZ3fb+2L6XEecQwRDIb4zbEam0TvaVmBQWZoColQyWA84ljFBPZ8XWiQyTz+ixSwdRkqg==} + engines: {node: '>=12.0.0'} dependencies: - d3-array: 3.2.4 - d3-dsv: 3.0.1 - d3-require: 1.3.0 - dev: false + '@oclif/core': 2.15.0(@types/node@18.18.6)(typescript@4.9.5) + chalk: 4.1.2 + fast-levenshtein: 3.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + dev: true /@open-draft/until@1.0.3: resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} @@ -9992,7 +10193,7 @@ packages: '@nomiclabs/hardhat-etherscan': 3.1.7(hardhat@2.13.1) '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4) '@openzeppelin/platform-deploy-client': 0.8.0(debug@4.3.4) - '@openzeppelin/upgrades-core': 1.30.1 + '@openzeppelin/upgrades-core': 1.31.0 chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) ethers: 5.7.2 @@ -10024,8 +10225,8 @@ packages: - encoding dev: true - /@openzeppelin/upgrades-core@1.30.1: - resolution: {integrity: sha512-mFUsZibpiWJv1DR2K89cjbFIseTc2CUV4D2kvPPK5xYke6m7+M87qcr/Xk24mMrdCmG7RWNxQohhVnzESI6Eeg==} + /@openzeppelin/upgrades-core@1.31.0: + resolution: {integrity: sha512-E1Cz8lVpo2mnBeFWxiGDLWtuTYMFNTEWwbnhle4dZ+5UHX6xTRO+Q/CaWBHm33HHhuuiUbRwgGNnAR9zOu+fyQ==} hasBin: true dependencies: cbor: 9.0.1 @@ -10040,31 +10241,28 @@ packages: - supports-color dev: true - /@peculiar/asn1-schema@2.3.6: - resolution: {integrity: sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==} + /@peculiar/asn1-schema@2.3.8: + resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==} dependencies: asn1js: 3.0.5 pvtsutils: 1.3.5 tslib: 2.6.2 - dev: false /@peculiar/json-schema@1.1.12: resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} engines: {node: '>=8.0.0'} dependencies: tslib: 2.6.2 - dev: false /@peculiar/webcrypto@1.4.3: resolution: {integrity: sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==} engines: {node: '>=10.12.0'} dependencies: - '@peculiar/asn1-schema': 2.3.6 + '@peculiar/asn1-schema': 2.3.8 '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.5 tslib: 2.6.2 webcrypto-core: 1.7.7 - dev: false /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -10072,22 +10270,22 @@ packages: requiresBuild: true optional: true - /@plasmicapp/data-sources-context@0.1.15(react@18.2.0): - resolution: {integrity: sha512-y5JFBR490+oNrpwEo4fWTcgqB3dipEhS8khOLqHmy+ZSmp5OAp4Qh7v65XlQ4IoRitoqQoJuJ90QHfDrx4m0Og==} + /@plasmicapp/data-sources-context@0.1.17(react@18.2.0): + resolution: {integrity: sha512-vCAcgcxT6+MOn+rGlVszGDHPqBTGszzNZ4FuwXkX5RjN4W7VG8Vep6qpZC2KUZI0KpjGmGq3uLkeK4BcvciRzA==} engines: {node: '>=10'} peerDependencies: - react: '>=16' + react: '>=16.8.0' dependencies: react: 18.2.0 dev: false - /@plasmicapp/host@1.0.171(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yMkUq+MakBij6WfJEVR0s72KUXUoodY2GhX3WPEj1rpNlb6k03IbkkLiJM1hYN6dFvP7TKI4Pq6fR0mm0X6x8g==} + /@plasmicapp/host@1.0.177(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-TqipEiPaTZyz8wqQe/XJrdDAs0SIB99QINxZwtgvGjil47biFO0dhCk8Mv1JsrKyRTxRu5MCBToND8xpatXsBQ==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@plasmicapp/query': 0.1.72(react@18.2.0) + '@plasmicapp/query': 0.1.74(react@18.2.0) csstype: 3.1.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -10100,42 +10298,41 @@ packages: unfetch: 4.2.0 dev: false - /@plasmicapp/loader-core@1.0.112: - resolution: {integrity: sha512-hS8oKhzA73JEW59UQBWNGpATs84GQSBj+ANSOxmbvfEPh+v9HYn9627y3tKsMTaGHdAtp5iDH8cOQGIFxYF2hA==} + /@plasmicapp/loader-core@1.0.115: + resolution: {integrity: sha512-Ip/I4kuBFnsOB7DrCTrkhOCfSCGYknDTH83qiWpbQdYwCxWCHUsCtY3P3j9K8U4NYjFgy3OL4d0EkAtOvoBCTw==} engines: {node: '>=10'} dependencies: '@plasmicapp/isomorphic-unfetch': 1.0.3 - '@plasmicapp/loader-fetcher': 1.0.35 + '@plasmicapp/loader-fetcher': 1.0.37 dev: false - /@plasmicapp/loader-edge@1.0.41: - resolution: {integrity: sha512-Kw3et94sLUSMhhwp+907q0PY/FcjY1hErkEp4QKaw4wgyDfcg5RNtGimjac+xAu59JiGvX+D6sCvqzB6MuGlYw==} + /@plasmicapp/loader-edge@1.0.46: + resolution: {integrity: sha512-r3PA6ARF3EDWma5kwHOgPu/meed7hkKnkDp2aUWiHQKe7X0eRDWXpId/+2uYVzh8p1sjIxiINK6P9Bv1jVuXrQ==} engines: {node: '>=10'} dependencies: - '@plasmicapp/loader-fetcher': 1.0.35 - '@plasmicapp/loader-splits': 1.0.40 + '@plasmicapp/loader-splits': 1.0.43 dev: false - /@plasmicapp/loader-fetcher@1.0.35: - resolution: {integrity: sha512-QHpgxMi+Nl9lgEs3uIjRPcYt/KW2txXNsPKMoh6+KtebktOsH0n1bbl65cY7PbivYMEgVBJ3aSGMWeJaHLKYCg==} + /@plasmicapp/loader-fetcher@1.0.37: + resolution: {integrity: sha512-yLrOGklV8FNeyNteumzuE99zvPVGvNTT7TuLQISMvCkisY+pg4NY6gDxSUvDut65waBH0ie/ZdG6jUtkqb0kBg==} engines: {node: '>=10'} dependencies: '@plasmicapp/isomorphic-unfetch': 1.0.3 dev: false - /@plasmicapp/loader-nextjs@1.0.321(next@13.5.4)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-myXKOPHciWT+FL8PyetXmH1ST4yH74AQqvPXBl4KLBE1fQSxc5EVJOcdqnLfOm8M0NkigMUtjIR+kktf2NkzQg==} + /@plasmicapp/loader-nextjs@1.0.333(next@13.5.6)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Uhkeeig9UhZQqLgH5QPuV3bd1jE4Z5ZsJgvoxmsL96XrGEuxEO2wUPLq02HQ+EgJtXuNTgbb5bSPZsVCJ/nCKQ==} engines: {node: '>=10'} peerDependencies: next: '>=10.1.0' react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@plasmicapp/loader-core': 1.0.112 - '@plasmicapp/loader-edge': 1.0.41 - '@plasmicapp/loader-react': 1.0.302(react-dom@18.2.0)(react@18.2.0) - '@plasmicapp/watcher': 1.0.76 - next: 13.5.4(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@plasmicapp/loader-core': 1.0.115 + '@plasmicapp/loader-edge': 1.0.46 + '@plasmicapp/loader-react': 1.0.312(react-dom@18.2.0)(react@18.2.0) + '@plasmicapp/watcher': 1.0.78 + next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) server-only: 0.0.1 @@ -10145,51 +10342,50 @@ packages: - utf-8-validate dev: false - /@plasmicapp/loader-react@1.0.302(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Gm+iZknV+16ELdUKKnvTSrkjRtmkQ5bphUgOkQO/jGoIV7PqZzG0kDELYYleEsorStOPg9kelQ4Lyi3LZg8OCg==} + /@plasmicapp/loader-react@1.0.312(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nUu9TJrlu5/innWFTz1rvJx4NQgm/yLNZwK27cbLufQCYzec4FBdGEr4Ywr7IMHb4OHTzJOJG3ZsEDmFjTeJ3Q==} engines: {node: '>=12'} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@plasmicapp/data-sources-context': 0.1.15(react@18.2.0) - '@plasmicapp/host': 1.0.171(react-dom@18.2.0)(react@18.2.0) - '@plasmicapp/loader-core': 1.0.112 - '@plasmicapp/loader-splits': 1.0.40 - '@plasmicapp/prepass': 1.0.7(react-dom@18.2.0)(react@18.2.0) - '@plasmicapp/query': 0.1.72(react@18.2.0) + '@plasmicapp/data-sources-context': 0.1.17(react@18.2.0) + '@plasmicapp/host': 1.0.177(react-dom@18.2.0)(react@18.2.0) + '@plasmicapp/loader-core': 1.0.115 + '@plasmicapp/loader-splits': 1.0.43 + '@plasmicapp/prepass': 1.0.9(react-dom@18.2.0)(react@18.2.0) + '@plasmicapp/query': 0.1.74(react@18.2.0) pascalcase: 1.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) server-only: 0.0.1 dev: false - /@plasmicapp/loader-splits@1.0.40: - resolution: {integrity: sha512-rjMjPhjtYE0LTexANQ6RIlz2rNSms9A0p1BH4m/OnvF7p9u1vxsNQ2vqDfkKxyfZkfG0+/hbQF2ODggs4Qvjgg==} + /@plasmicapp/loader-splits@1.0.43: + resolution: {integrity: sha512-XdSiD/N9ddD/HTjsk6EUhU0SSLFzQl0G4vlapdcHIBI9vBZRLAJQLGPIS98OJJnEK3DsE7j4kMYzKevoE/bycQ==} engines: {node: '>=10'} dependencies: - '@plasmicapp/loader-fetcher': 1.0.35 json-logic-js: 2.0.2 dev: false - /@plasmicapp/prepass@1.0.7(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wBCbiGvirExoDXhkWryblNcx6nQ4D95HkME9IiRDT+IdKOH/7o2yAKBAqBCxbAzQznxX1R8GnTNWvVtCG+qJ0w==} + /@plasmicapp/prepass@1.0.9(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-0iG7iCD/Kf0I1Qaxw/steVPm3p2ciBPeA8Xa4i/E34gEat5qRsGl6cMi4V2EaPLWOF4cL6B+PEdtHCmZBscOGw==} engines: {node: '>=12'} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@plasmicapp/query': 0.1.72(react@18.2.0) + '@plasmicapp/query': 0.1.74(react@18.2.0) '@plasmicapp/react-ssr-prepass': 2.0.3(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@plasmicapp/query@0.1.72(react@18.2.0): - resolution: {integrity: sha512-7kR7t4IKdXwrGCRnwQQbWDaJy8AqiujYZFvRaF1cQUSL6TcgNCXOWeIdCcnwsP3BpjdNfu+HEgvR5y+GuyN5Hw==} + /@plasmicapp/query@0.1.74(react@18.2.0): + resolution: {integrity: sha512-5ZwplvH/ObqBFTgB3hG2nA72F5DqV8bCsDnxM/O+Z8o1IsFRI4xkdj1pMQY/bkrLshMFA6uu6jZJTPU/dRnxJA==} engines: {node: '>=10'} peerDependencies: - react: '>=16' + react: '>=16.8.0' dependencies: react: 18.2.0 swr: 1.3.0(react@18.2.0) @@ -10203,8 +10399,8 @@ packages: react: 18.2.0 dev: false - /@plasmicapp/watcher@1.0.76: - resolution: {integrity: sha512-wYMto8wa38OQ9fynVmVUD77KZJBbbGKl07lpIFOM94HKKTCTFVCvMdyt7/b1/Y9AelYZ6R2y9vOP3SoC5jFzVg==} + /@plasmicapp/watcher@1.0.78: + resolution: {integrity: sha512-YvBtGMkI6pvqgagwP72Rr5btZ3iJsIOyInH7XsT3vDopWaQfrEm2oB4sVwxUxnsxnUZPniH/LHCwn4QJsPmdfQ==} engines: {node: '>=10'} dependencies: socket.io-client: 4.7.2 @@ -10214,12 +10410,12 @@ packages: - utf-8-validate dev: false - /@playwright/test@1.38.1: - resolution: {integrity: sha512-NqRp8XMwj3AK+zKLbZShl0r/9wKgzqI/527bkptKXomtuo+dOjU9NdMASQ8DNC9z9zLOMbG53T4eihYr3XR+BQ==} + /@playwright/test@1.39.0: + resolution: {integrity: sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==} engines: {node: '>=16'} hasBin: true dependencies: - playwright: 1.38.1 + playwright: 1.39.0 dev: true /@polka/url@1.0.0-next.23: @@ -10242,48 +10438,38 @@ packages: /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - dev: false /@protobufjs/base64@1.1.2: resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - dev: false /@protobufjs/codegen@2.0.4: resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - dev: false /@protobufjs/eventemitter@1.1.0: resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - dev: false /@protobufjs/fetch@1.1.0: resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 - dev: false /@protobufjs/float@1.0.2: resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - dev: false /@protobufjs/inquire@1.1.0: resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - dev: false /@protobufjs/path@1.1.2: resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - dev: false /@protobufjs/pool@1.1.0: resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - dev: false /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - dev: false - /@rainbow-me/rainbowkit@1.0.8(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0)(viem@1.5.3)(wagmi@1.3.9): + /@rainbow-me/rainbowkit@1.0.8(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0)(viem@1.5.3)(wagmi@1.3.9): resolution: {integrity: sha512-m1B9/X3p8MLmj4fDfs2NpJlFRmKz7vOR0jmcdBw2SMFzXqP1FQFQc4pjvtLEeyfEUGSNNceGrecFZRVS0Qk//A==} engines: {node: '>=12.4'} peerDependencies: @@ -10299,9 +10485,9 @@ packages: qrcode: 1.5.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.4(@types/react@18.2.28)(react@18.2.0) + react-remove-scroll: 2.5.4(@types/react@18.2.31)(react@18.2.0) viem: 1.5.3(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.3.9(@types/react@18.2.28)(react-dom@18.2.0)(react-native@0.72.5)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) + wagmi: 1.3.9(@types/react@18.2.31)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) transitivePeerDependencies: - '@types/react' dev: false @@ -10315,7 +10501,6 @@ packages: prompts: 2.4.2 transitivePeerDependencies: - encoding - dev: false /@react-native-community/cli-config@11.3.7: resolution: {integrity: sha512-FDBLku9xskS+bx0YFJFLCmUJhEZ4/MMSC9qPYOGBollWYdgE7k/TWI0IeYFmMALAnbCdKQAYP5N29N55Tad8lg==} @@ -10328,7 +10513,6 @@ packages: joi: 17.11.0 transitivePeerDependencies: - encoding - dev: false /@react-native-community/cli-debugger-ui@11.3.7: resolution: {integrity: sha512-aVmKuPKHZENR8SrflkMurZqeyLwbKieHdOvaZCh1Nn/0UC5CxWcyST2DB2XQboZwsvr3/WXKJkSUO+SZ1J9qTQ==} @@ -10336,7 +10520,6 @@ packages: serve-static: 1.15.0 transitivePeerDependencies: - supports-color - dev: false /@react-native-community/cli-doctor@11.3.7: resolution: {integrity: sha512-YEHUqWISOHnsl5+NM14KHelKh68Sr5/HeEZvvNdIcvcKtZic3FU7Xd1WcbNdo3gCq5JvzGFfufx02Tabh5zmrg==} @@ -10358,10 +10541,9 @@ packages: strip-ansi: 5.2.0 sudo-prompt: 9.2.1 wcwidth: 1.0.1 - yaml: 2.3.1 + yaml: 2.3.3 transitivePeerDependencies: - encoding - dev: false /@react-native-community/cli-hermes@11.3.7: resolution: {integrity: sha512-chkKd8n/xeZkinRvtH6QcYA8rjNOKU3S3Lw/3Psxgx+hAYV0Gyk95qJHTalx7iu+PwjOOqqvCkJo5jCkYLkoqw==} @@ -10373,7 +10555,6 @@ packages: ip: 1.1.8 transitivePeerDependencies: - encoding - dev: false /@react-native-community/cli-platform-android@11.3.7: resolution: {integrity: sha512-WGtXI/Rm178UQb8bu1TAeFC/RJvYGnbHpULXvE20GkmeJ1HIrMjkagyk6kkY3Ej25JAP2R878gv+TJ/XiRhaEg==} @@ -10385,7 +10566,6 @@ packages: logkitty: 0.7.1 transitivePeerDependencies: - encoding - dev: false /@react-native-community/cli-platform-ios@11.3.7: resolution: {integrity: sha512-Z/8rseBput49EldX7MogvN6zJlWzZ/4M97s2P+zjS09ZoBU7I0eOKLi0N9wx+95FNBvGQQ/0P62bB9UaFQH2jw==} @@ -10398,7 +10578,6 @@ packages: ora: 5.4.1 transitivePeerDependencies: - encoding - dev: false /@react-native-community/cli-plugin-metro@11.3.7(@babel/core@7.23.2): resolution: {integrity: sha512-0WhgoBVGF1f9jXcuagQmtxpwpfP+2LbLZH4qMyo6OtYLWLG13n2uRep+8tdGzfNzl1bIuUTeE9yZSAdnf9LfYQ==} @@ -10420,7 +10599,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /@react-native-community/cli-server-api@11.3.7: resolution: {integrity: sha512-yoFyGdvR3HxCnU6i9vFqKmmSqFzCbnFSnJ29a+5dppgPRetN+d//O8ard/YHqHzToFnXutAFf2neONn23qcJAg==} @@ -10439,7 +10617,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /@react-native-community/cli-tools@11.3.7: resolution: {integrity: sha512-peyhP4TV6Ps1hk+MBHTFaIR1eI3u+OfGBvr5r0wPwo3FAJvldRinMgcB/TcCcOBXVORu7ba1XYjkubPeYcqAyA==} @@ -10455,13 +10632,11 @@ packages: shell-quote: 1.8.1 transitivePeerDependencies: - encoding - dev: false /@react-native-community/cli-types@11.3.7: resolution: {integrity: sha512-OhSr/TiDQkXjL5YOs8+hvGSB+HltLn5ZI0+A3DCiMsjUgTTsYh+Z63OtyMpNjrdCEFcg0MpfdU2uxstCS6Dc5g==} dependencies: joi: 17.11.0 - dev: false /@react-native-community/cli@11.3.7(@babel/core@7.23.2): resolution: {integrity: sha512-Ou8eDlF+yh2rzXeCTpMPYJ2fuqsusNOhmpYPYNQJQ2h6PvaF30kPomflgRILems+EBBuggRtcT+I+1YH4o/q6w==} @@ -10491,11 +10666,9 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /@react-native/assets-registry@0.72.0: resolution: {integrity: sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==} - dev: false /@react-native/codegen@0.72.7(@babel/preset-env@7.23.2): resolution: {integrity: sha512-O7xNcGeXGbY+VoqBGNlZ3O05gxfATlwE1Q1qQf5E38dK+tXn5BY4u0jaQ9DPjfE8pBba8g/BYI1N44lynidMtg==} @@ -10509,33 +10682,31 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - dev: false /@react-native/gradle-plugin@0.72.11: resolution: {integrity: sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw==} - dev: false /@react-native/js-polyfills@0.72.1: resolution: {integrity: sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA==} - dev: false /@react-native/normalize-colors@0.72.0: resolution: {integrity: sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw==} - dev: false - /@react-native/virtualized-lists@0.72.8(react-native@0.72.5): + /@react-native/virtualized-lists@0.72.8(react-native@0.72.6): resolution: {integrity: sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==} peerDependencies: react-native: '*' dependencies: invariant: 2.2.4 nullthrows: 1.1.1 - react-native: 0.72.5(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) - dev: false + react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) /@repeaterjs/repeater@3.0.4: resolution: {integrity: sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==} - dev: false + + /@rescript/std@9.0.0: + resolution: {integrity: sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ==} + dev: true /@resolver-engine/core@0.3.3: resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==} @@ -10703,7 +10874,7 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.2 + '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 2.78.0 @@ -10718,7 +10889,7 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.2 + '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 3.29.4 @@ -10733,7 +10904,7 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.2 + '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 4.1.4 @@ -10894,14 +11065,14 @@ packages: resolution: {integrity: sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==} dependencies: '@noble/curves': 1.0.0 - '@noble/hashes': 1.3.2 + '@noble/hashes': 1.3.0 '@scure/base': 1.1.3 /@scure/bip32@1.3.1: resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} dependencies: '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.2 + '@noble/hashes': 1.3.1 '@scure/base': 1.1.3 dev: true @@ -10914,35 +11085,35 @@ packages: /@scure/bip39@1.2.0: resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==} dependencies: - '@noble/hashes': 1.3.2 + '@noble/hashes': 1.3.0 '@scure/base': 1.1.3 /@scure/bip39@1.2.1: resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} dependencies: - '@noble/hashes': 1.3.2 + '@noble/hashes': 1.3.1 '@scure/base': 1.1.3 dev: true - /@sentry-internal/tracing@7.73.0: - resolution: {integrity: sha512-ig3WL/Nqp8nRQ52P205NaypGKNfIl/G+cIqge9xPW6zfRb5kJdM1YParw9GSJ1SPjEZBkBORGAML0on5H2FILw==} + /@sentry-internal/tracing@7.74.1: + resolution: {integrity: sha512-nNaiZreQxCitG2PzYPaC7XtyA9OMsETGYMKAtiK4p62/uTmeYbsBva9BoNx1XeiHRwbrVQYRMKQ9nV5e2jS4/A==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.73.0 - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 + '@sentry/core': 7.74.1 + '@sentry/types': 7.74.1 + '@sentry/utils': 7.74.1 tslib: 2.6.2 dev: false - /@sentry/browser@7.73.0: - resolution: {integrity: sha512-e301hUixcJ5+HNKCJwajFF5smF4opXEFSclyWsJuFNufv5J/1C1SDhbwG2JjBt5zzdSoKWJKT1ewR6vpICyoDw==} + /@sentry/browser@7.74.1: + resolution: {integrity: sha512-OYWNne/KO60lOvkIpIlJUyiJt/9j8DGI57thSDFEYSmmbNqMitczUTBOaEStouvHKyfchqLZm1CZfWKt+z0VOA==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.73.0 - '@sentry/core': 7.73.0 - '@sentry/replay': 7.73.0 - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 + '@sentry-internal/tracing': 7.74.1 + '@sentry/core': 7.74.1 + '@sentry/replay': 7.74.1 + '@sentry/types': 7.74.1 + '@sentry/utils': 7.74.1 tslib: 2.6.2 dev: false @@ -10989,12 +11160,12 @@ packages: '@sentry/utils': 5.30.0 tslib: 1.14.1 - /@sentry/core@7.73.0: - resolution: {integrity: sha512-9FEz4Gq848LOgVN2OxJGYuQqxv7cIVw69VlAzWHEm3njt8mjvlTq+7UiFsGRo84+59V2FQuHxzA7vVjl90WfSg==} + /@sentry/core@7.74.1: + resolution: {integrity: sha512-LvEhOSfdIvwkr+PdlrT/aA/iOLhkXrSkvjqAQyogE4ddCWeYfS0NoirxNt1EaxMBAWKhYZRqzkA7WA4LDLbzlA==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 + '@sentry/types': 7.74.1 + '@sentry/utils': 7.74.1 tslib: 2.6.2 dev: false @@ -11006,13 +11177,13 @@ packages: '@sentry/utils': 5.30.0 tslib: 1.14.1 - /@sentry/integrations@7.73.0: - resolution: {integrity: sha512-IjVpn4d+aSL9L1Ntu/oAdRwujz4BzzavDsZf96Xgc/AjBnjAEUT+wT1dAwluThfuKDXmWOJHhZ2cHHMfqI+7vw==} + /@sentry/integrations@7.74.1: + resolution: {integrity: sha512-Q7chPehHpHB4WOQ1J/X6NiN2ptiqJMmxtL+6wHumzIAyrjup3c9XekR83qEs8zpqYJAlb/4MUlwd9fPbkhGXnQ==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.73.0 - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 + '@sentry/core': 7.74.1 + '@sentry/types': 7.74.1 + '@sentry/utils': 7.74.1 localforage: 1.10.0 tslib: 2.6.2 dev: false @@ -11025,8 +11196,8 @@ packages: '@sentry/types': 5.30.0 tslib: 1.14.1 - /@sentry/nextjs@7.73.0(next@13.5.4)(react@18.2.0)(webpack@5.88.2): - resolution: {integrity: sha512-WTTxb3xFFpQ9u8jLx2jXa5oJIlgQs3kQ7wjHoTVOuuk51kB3wtMvq546tA5Kmsgu5uInjznBe4f2qUFYdqiO9Q==} + /@sentry/nextjs@7.74.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0): + resolution: {integrity: sha512-1RySEs3WBEqlpQCAFQ/XwV+oW4wEAtpYglvAyDBwPen/s6KnkkZ0za0l3Ug0O6S9HvMiNll1rPhvnkH5nM37Tg==} engines: {node: '>=8'} peerDependencies: next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 @@ -11037,21 +11208,22 @@ packages: optional: true dependencies: '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) - '@sentry/core': 7.73.0 - '@sentry/integrations': 7.73.0 - '@sentry/node': 7.73.0 - '@sentry/react': 7.73.0(react@18.2.0) - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 - '@sentry/vercel-edge': 7.73.0 + '@sentry/core': 7.74.1 + '@sentry/integrations': 7.74.1 + '@sentry/node': 7.74.1 + '@sentry/react': 7.74.1(react@18.2.0) + '@sentry/types': 7.74.1 + '@sentry/utils': 7.74.1 + '@sentry/vercel-edge': 7.74.1 '@sentry/webpack-plugin': 1.20.0 chalk: 3.0.0 - next: 13.5.4(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 + resolve: 1.22.8 rollup: 2.78.0 stacktrace-parser: 0.1.10 tslib: 2.6.2 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - encoding - supports-color @@ -11073,14 +11245,14 @@ packages: transitivePeerDependencies: - supports-color - /@sentry/node@7.73.0: - resolution: {integrity: sha512-i50bRfmgkRRx0XXUbg9jGD/RuznDJxJXc4rBILhoJuhl+BjRIaoXA3ayplfJn8JLZxsNh75uJaCq4IUK70SORw==} + /@sentry/node@7.74.1: + resolution: {integrity: sha512-aMUQ2LFZF64FBr+cgjAqjT4OkpYBIC9lyWI8QqjEHqNho5+LGu18/iVrJPD4fgs4UhGdCuAiQjpC36MbmnIDZA==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.73.0 - '@sentry/core': 7.73.0 - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 + '@sentry-internal/tracing': 7.74.1 + '@sentry/core': 7.74.1 + '@sentry/types': 7.74.1 + '@sentry/utils': 7.74.1 cookie: 0.5.0 https-proxy-agent: 5.0.1 lru_map: 0.3.3 @@ -11089,27 +11261,27 @@ packages: - supports-color dev: false - /@sentry/react@7.73.0(react@18.2.0): - resolution: {integrity: sha512-RCGlxW0Xp5vsC38LGxUO0Xf11LBzfg75VN+KS3D2FS5GXl0R0JwgUyPNVlod7YMCfwytsKGhfP+YpQvHGQAVwg==} + /@sentry/react@7.74.1(react@18.2.0): + resolution: {integrity: sha512-16oTsNi2hl/S5AL/e5bo9DQZDwXPkX0nC8ajrpU0z2pH4cwjQZUZt/9Xq1+MKqDIEZkqDcMwpTmBptOvy1Pvkw==} engines: {node: '>=8'} peerDependencies: react: 15.x || 16.x || 17.x || 18.x dependencies: - '@sentry/browser': 7.73.0 - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 + '@sentry/browser': 7.74.1 + '@sentry/types': 7.74.1 + '@sentry/utils': 7.74.1 hoist-non-react-statics: 3.3.2 react: 18.2.0 tslib: 2.6.2 dev: false - /@sentry/replay@7.73.0: - resolution: {integrity: sha512-a8IC9SowBisLYD2IdLkXzx7gN4iVwHDJhQvLp2B8ARs1PyPjJ7gCxSMHeGrYp94V0gOXtorNYkrxvuX8ayPROA==} + /@sentry/replay@7.74.1: + resolution: {integrity: sha512-qmbOl+jYdyhoHFbPp9WemKx8UojID5hVmuVLxNIP0ANqAwmE9OQEK9YFg2cf7L/TpKb1tqz0qLgi5MYIdcdpgQ==} engines: {node: '>=12'} dependencies: - '@sentry/core': 7.73.0 - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 + '@sentry/core': 7.74.1 + '@sentry/types': 7.74.1 + '@sentry/utils': 7.74.1 dev: false /@sentry/tracing@5.30.0: @@ -11126,8 +11298,8 @@ packages: resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} engines: {node: '>=6'} - /@sentry/types@7.73.0: - resolution: {integrity: sha512-/v8++bly8jW7r4cP2wswYiiVpn7eLLcqwnfPUMeCQze4zj3F3nTRIKc9BGHzU0V+fhHa3RwRC2ksqTGq1oJMDg==} + /@sentry/types@7.74.1: + resolution: {integrity: sha512-2jIuPc+YKvXqZETwr2E8VYnsH1zsSUR/wkIvg1uTVeVNyoowJv+YsOtCdeGyL2AwiotUBSPKu7O1Lz0kq5rMOQ==} engines: {node: '>=8'} dev: false @@ -11138,21 +11310,21 @@ packages: '@sentry/types': 5.30.0 tslib: 1.14.1 - /@sentry/utils@7.73.0: - resolution: {integrity: sha512-h3ZK/qpf4k76FhJV9uiSbvMz3V/0Ovy94C+5/9UgPMVCJXFmVsdw8n/dwANJ7LupVPfYP23xFGgebDMFlK1/2w==} + /@sentry/utils@7.74.1: + resolution: {integrity: sha512-qUsqufuHYcy5gFhLZslLxA5kcEOkkODITXW3c7D+x+8iP/AJqa8v8CeUCVNS7RetHCuIeWAbbTClC4c411EwQg==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.73.0 + '@sentry/types': 7.74.1 tslib: 2.6.2 dev: false - /@sentry/vercel-edge@7.73.0: - resolution: {integrity: sha512-5EIJAuHG9w2OBrG76uH51Zlh4SMg3N8n29YiZgOtsBL0FU7AvBpxsIknECmmQOKPFrfCa0ycu2WSWgFXILCYGQ==} + /@sentry/vercel-edge@7.74.1: + resolution: {integrity: sha512-E2lTfEtDFSh57EkjVe4EcgcdjOM8UvfZVsmANBqG4bnwRKrNX9GouClzKU2Ckd5vQnOiCH9r8x2aJ/dTqyBswQ==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.73.0 - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 + '@sentry/core': 7.74.1 + '@sentry/types': 7.74.1 + '@sentry/utils': 7.74.1 tslib: 2.6.2 dev: false @@ -11228,8 +11400,8 @@ packages: webpack-sources: 3.2.3 dev: false - /@smithy/types@2.3.5: - resolution: {integrity: sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==} + /@smithy/types@2.4.0: + resolution: {integrity: sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.6.2 @@ -11245,10 +11417,10 @@ packages: buffer: 6.0.3 dev: false - /@solana/web3.js@1.87.1: - resolution: {integrity: sha512-E8Y9bNlZ8TQlhOvCx1b7jG+TjA4SJLVwufmIk1+tcQctUhK5HiB1Q8ljd4yQDkFlk6OOeAlAeqvW0YntWJU94Q==} + /@solana/web3.js@1.87.2: + resolution: {integrity: sha512-TZNhS+tvJbYjm0LAvIkUy/3Aqgt2l6/3X6XsVUpvj5MGOl2Q6Ch8hYSxcUUtMbAFNN3sUXmV8NhhMLNJEvI6TA==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@solana/buffer-layout': 4.0.1 @@ -11261,7 +11433,7 @@ packages: fast-stable-stringify: 1.0.0 jayson: 4.1.0 node-fetch: 2.7.0 - rpc-websockets: 7.6.0 + rpc-websockets: 7.6.1 superstruct: 0.14.2 transitivePeerDependencies: - bufferutil @@ -11403,8 +11575,8 @@ packages: '@supabase/node-fetch': 2.6.14 dev: false - /@supabase/gotrue-js@2.55.0: - resolution: {integrity: sha512-wZAP66Lo68iROKo33m8seY30rCeGiR34leMEZ80j9fPm+/ar6h3y43Hb7f9F2STVMwT3Sv+aM+w0yCon5bih4g==} + /@supabase/gotrue-js@2.57.0: + resolution: {integrity: sha512-/CcAW40aPKgp9/w9WgXVUQFg1AOdvFR687ONOMjASPBuC6FsNbKlcXp4pc+rwKNtxyxDkBbR+x7zj/8g00r/Og==} dependencies: '@supabase/node-fetch': 2.6.14 dev: false @@ -11416,18 +11588,18 @@ packages: whatwg-url: 5.0.0 dev: false - /@supabase/postgrest-js@1.8.4: - resolution: {integrity: sha512-ELjpvhb04wILUiJz9zIsTSwaz9LQNlX+Ig5/LgXQ7k68qQI6NqHVn+ISRNt53DngUIyOnLHjeqqIRHBZ7zpgGA==} + /@supabase/postgrest-js@1.8.5: + resolution: {integrity: sha512-XvoqN5e5Z4TsQOYWLQYLW0HIlZtFSzwAcwiuToaSBSTpLOGCg4NaZ7au5GfBzCQJZdZPY5vk5FvwthfDsQK/Jw==} dependencies: '@supabase/node-fetch': 2.6.14 dev: false - /@supabase/realtime-js@2.8.0: - resolution: {integrity: sha512-j1OP2nRJhqLNEoYSMkIl1+cHK/Ow9fektemazkF2CvrIrmwgfJJGaFGiWGVgwoKtwVcrdknSsYWpxs90hys1EQ==} + /@supabase/realtime-js@2.8.1: + resolution: {integrity: sha512-bka5U4OeoKMdorGMPjdF30cl8n8nbhn+I9H4iySKzbN45W6AGxi7xoODnxdq/QwaDGtVyTMVbU+GVWre0QCdtw==} dependencies: '@supabase/node-fetch': 2.6.14 - '@types/phoenix': 1.6.2 - '@types/websocket': 1.0.7 + '@types/phoenix': 1.6.3 + '@types/websocket': 1.0.8 websocket: 1.0.34 transitivePeerDependencies: - supports-color @@ -11439,114 +11611,114 @@ packages: '@supabase/node-fetch': 2.6.14 dev: false - /@supabase/supabase-js@2.38.0: - resolution: {integrity: sha512-FSkIcz+/+TTBqNqhR8AdtblxEqCF72//CCkmZFIRCa3Xh/aiI0F4cBdL7AB3aIQn2DhE4aGxZ4mGiGR593096Q==} + /@supabase/supabase-js@2.38.2: + resolution: {integrity: sha512-yOCi94oO5WVUBhQ890BvtT7J3p8spP47PMhn22YldIcDLEQWE6N6X2JzfWCLHktXw+oCYUJfQBuqYhyLHAKb0w==} dependencies: '@supabase/functions-js': 2.1.5 - '@supabase/gotrue-js': 2.55.0 + '@supabase/gotrue-js': 2.57.0 '@supabase/node-fetch': 2.6.14 - '@supabase/postgrest-js': 1.8.4 - '@supabase/realtime-js': 2.8.0 + '@supabase/postgrest-js': 1.8.5 + '@supabase/realtime-js': 2.8.1 '@supabase/storage-js': 2.5.4 transitivePeerDependencies: - supports-color dev: false - /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: false - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.0): + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.2): resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: false - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.0): + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.2): resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: false - /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: false - /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: false - /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: false - /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: false - /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: false - /@svgr/babel-preset@6.5.1(@babel/core@7.23.0): + /@svgr/babel-preset@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.0) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.0) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.0) - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.0) - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.0) - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.0) - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.0) - '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.2) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.2) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.2) dev: false /@svgr/core@6.5.1: resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.0 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.2) '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.1.0 @@ -11568,8 +11740,8 @@ packages: peerDependencies: '@svgr/core': ^6.0.0 dependencies: - '@babel/core': 7.23.0 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.2) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -11593,11 +11765,11 @@ packages: resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.0 - '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.23.0) - '@babel/preset-env': 7.22.20(@babel/core@7.23.0) - '@babel/preset-react': 7.22.15(@babel/core@7.23.0) - '@babel/preset-typescript': 7.23.0(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-react': 7.22.15(@babel/core@7.23.2) + '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) @@ -11611,19 +11783,19 @@ packages: tslib: 2.6.2 dev: false - /@synthetixio/synpress@3.7.1(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(webpack@5.88.2): + /@synthetixio/synpress@3.7.1(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(webpack@5.89.0): resolution: {integrity: sha512-fU2+niaDgDvR/7NJwTvMA5WPbAt4fu8c4EMhQH1Lgk8OKSmaovL9xXgOscd90KZyHu6FbW8DNnocJKyiZmELEA==} engines: {node: '>=14'} hasBin: true dependencies: - '@cypress/code-coverage': 3.12.1(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.88.2) - '@cypress/webpack-dev-server': 3.6.1(debug@4.3.4)(webpack@5.88.2) + '@cypress/code-coverage': 3.12.5(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0) + '@cypress/webpack-dev-server': 3.6.1(debug@4.3.4)(webpack@5.89.0) '@drptbl/gremlins.js': 2.2.1 '@foundry-rs/easy-foundryup': 0.1.3 - '@playwright/test': 1.38.1 + '@playwright/test': 1.39.0 '@testing-library/cypress': 9.0.0(cypress@12.17.4) '@testing-library/react': 14.0.0(react-dom@18.2.0)(react@18.2.0) - '@types/testing-library__cypress': 5.0.11 + '@types/testing-library__cypress': 5.0.12 '@viem/anvil': 0.0.5(debug@4.3.4) app-root-path: 3.1.0 axios: 1.5.1(debug@4.3.4) @@ -11702,7 +11874,7 @@ packages: react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@tanstack/match-sorter-utils': 8.8.4 - '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.5)(react@18.2.0) + '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) superjson: 1.13.3 @@ -11715,10 +11887,10 @@ packages: '@tanstack/react-query': ^4.36.1 dependencies: '@tanstack/query-persist-client-core': 4.36.1 - '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.5)(react@18.2.0) + '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0) dev: false - /@tanstack/react-query@4.36.1(react-dom@18.2.0)(react-native@0.72.5)(react@18.2.0): + /@tanstack/react-query@4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0): resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11733,7 +11905,7 @@ packages: '@tanstack/query-core': 4.36.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-native: 0.72.5(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) + react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) use-sync-external-store: 1.2.0(react@18.2.0) dev: false @@ -11743,7 +11915,7 @@ packages: peerDependencies: cypress: ^12.0.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@testing-library/dom': 8.20.1 cypress: 12.17.4 dev: true @@ -11753,7 +11925,7 @@ packages: engines: {node: '>=10'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@types/aria-query': 4.2.2 aria-query: 4.2.2 chalk: 4.1.2 @@ -11767,8 +11939,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/runtime': 7.23.1 - '@types/aria-query': 5.0.2 + '@babel/runtime': 7.23.2 + '@types/aria-query': 5.0.3 aria-query: 5.1.3 chalk: 4.1.2 dom-accessibility-api: 0.5.16 @@ -11781,8 +11953,8 @@ packages: engines: {node: '>=14'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/runtime': 7.23.1 - '@types/aria-query': 5.0.2 + '@babel/runtime': 7.23.2 + '@types/aria-query': 5.0.3 aria-query: 5.1.3 chalk: 4.1.2 dom-accessibility-api: 0.5.16 @@ -11795,9 +11967,9 @@ packages: engines: {node: '>=8', npm: '>=6', yarn: '>=1'} dependencies: '@adobe/css-tools': 4.3.1 - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@types/testing-library__jest-dom': 5.14.9 - aria-query: 5.1.3 + aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.5.16 @@ -11812,9 +11984,9 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 '@testing-library/dom': 9.3.3 - '@types/react-dom': 18.2.13 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true @@ -11843,7 +12015,7 @@ packages: '@babel/parser': 7.18.9 '@babel/traverse': 7.17.3 '@babel/types': 7.17.0 - '@vue/compiler-sfc': 3.3.4 + '@vue/compiler-sfc': 3.3.6 javascript-natural-sort: 0.7.1 lodash: 4.17.21 prettier: 2.8.8 @@ -11889,7 +12061,7 @@ packages: /@tsconfig/node16@1.0.4: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@4.9.5): + /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5): resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} peerDependencies: '@ethersproject/abi': ^5.0.0 @@ -11903,10 +12075,10 @@ packages: ethers: 5.7.2 lodash: 4.17.21 ts-essentials: 7.0.3(typescript@4.9.5) - typechain: 8.3.1(typescript@4.9.5) + typechain: 8.3.2(typescript@4.9.5) typescript: 4.9.5 - /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.1.6): + /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.1.6): resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} peerDependencies: '@ethersproject/abi': ^5.0.0 @@ -11920,11 +12092,11 @@ packages: ethers: 5.7.2 lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.1.6) - typechain: 8.3.1(typescript@5.1.6) + typechain: 8.3.2(typescript@5.1.6) typescript: 5.1.6 dev: false - /@typechain/ethers-v5@11.1.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@4.9.5): + /@typechain/ethers-v5@11.1.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5): resolution: {integrity: sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ==} peerDependencies: '@ethersproject/abi': ^5.0.0 @@ -11938,11 +12110,11 @@ packages: ethers: 5.7.2 lodash: 4.17.21 ts-essentials: 7.0.3(typescript@4.9.5) - typechain: 8.3.1(typescript@4.9.5) + typechain: 8.3.2(typescript@4.9.5) typescript: 4.9.5 dev: true - /@typechain/ethers-v6@0.5.1(ethers@5.7.2)(typechain@8.3.1)(typescript@4.9.5): + /@typechain/ethers-v6@0.5.1(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5): resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} peerDependencies: ethers: ^5.7.2 @@ -11952,11 +12124,11 @@ packages: ethers: 5.7.2 lodash: 4.17.21 ts-essentials: 7.0.3(typescript@4.9.5) - typechain: 8.3.1(typescript@4.9.5) + typechain: 8.3.2(typescript@4.9.5) typescript: 4.9.5 dev: true - /@typechain/hardhat@6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.1): + /@typechain/hardhat@6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2): resolution: {integrity: sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==} peerDependencies: '@ethersproject/abi': ^5.4.7 @@ -11968,14 +12140,14 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/providers': 5.7.2 - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@4.9.5) + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) ethers: 5.7.2 fs-extra: 9.1.0 hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) - typechain: 8.3.1(typescript@4.9.5) + typechain: 8.3.2(typescript@4.9.5) dev: false - /@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.1): + /@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2): resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} peerDependencies: '@typechain/ethers-v6': ^0.5.1 @@ -11983,187 +12155,193 @@ packages: hardhat: ^2.9.9 typechain: ^8.3.2 dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@5.7.2)(typechain@8.3.1)(typescript@4.9.5) + '@typechain/ethers-v6': 0.5.1(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) ethers: 5.7.2 fs-extra: 9.1.0 hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) - typechain: 8.3.1(typescript@4.9.5) + typechain: 8.3.2(typescript@4.9.5) dev: true - /@types/abstract-leveldown@7.2.3: - resolution: {integrity: sha512-YAdL8tIYbiKoFjAf/0Ir3mvRJ/iFvBP/FK0I8Xa5rGWgVcq0xWOEInzlJfs6TIPWFweEOTKgNSBdxneUcHRvaw==} + /@types/abstract-leveldown@7.2.4: + resolution: {integrity: sha512-ygy0hYyHdKnAtvCGUFEFvr3YV7Y6Q4akyRkZpM3RSUMYGSr35ZGRCT9Div+la4DpRUiwYUhJ6l75JBz6EORmpg==} dev: true /@types/aria-query@4.2.2: resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} dev: true - /@types/aria-query@5.0.2: - resolution: {integrity: sha512-PHKZuMN+K5qgKIWhBodXzQslTo5P+K/6LqeKXS6O/4liIDdZqaX5RXrCK++LAw+y/nptN48YmUMFiQHRSWYwtQ==} + /@types/aria-query@5.0.3: + resolution: {integrity: sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==} dev: true - /@types/babel__core@7.20.2: - resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==} + /@types/babel__core@7.20.3: + resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} dependencies: '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - '@types/babel__generator': 7.6.5 - '@types/babel__template': 7.4.2 - '@types/babel__traverse': 7.20.2 + '@types/babel__generator': 7.6.6 + '@types/babel__template': 7.4.3 + '@types/babel__traverse': 7.20.3 - /@types/babel__generator@7.6.5: - resolution: {integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==} + /@types/babel__generator@7.6.6: + resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} dependencies: '@babel/types': 7.23.0 - /@types/babel__template@7.4.2: - resolution: {integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==} + /@types/babel__template@7.4.3: + resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} dependencies: '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - /@types/babel__traverse@7.20.2: - resolution: {integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==} + /@types/babel__traverse@7.20.3: + resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} dependencies: '@babel/types': 7.23.0 - /@types/better-sqlite3@7.6.5: - resolution: {integrity: sha512-H3ZUx89KiPhYa9nalUXVVStSUFHuzYxt4yoazufpTTYW9rVUCzhh02V8CH2C8nE4libnK0UgFq5DFIe0DOhqow==} + /@types/better-sqlite3@7.6.6: + resolution: {integrity: sha512-nuFAptzt0hZYBvyLzKQCbuCCK+RN9PHH4ezar5EJLIg2qpVhwQ/uLvLO/K8A9O7N8DafawgFupiyXQSs0U48Ng==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 dev: true /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 - /@types/bn.js@5.1.2: - resolution: {integrity: sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==} + /@types/bn.js@5.1.3: + resolution: {integrity: sha512-wT1B4iIO82ecXkdN6waCK8Ou7E71WU+mP1osDA5Q8c6Ur+ozU2vIKUIhSpUr6uE5L2YHocKS1Z2jG2fBC1YVeg==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 - /@types/body-parser@1.19.3: - resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} + /@types/body-parser@1.19.4: + resolution: {integrity: sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==} dependencies: - '@types/connect': 3.4.36 - '@types/node': 18.15.13 + '@types/connect': 3.4.37 + '@types/node': 18.18.6 - /@types/bonjour@3.5.11: - resolution: {integrity: sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg==} + /@types/bonjour@3.5.12: + resolution: {integrity: sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 - /@types/chai-as-promised@7.1.6: - resolution: {integrity: sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==} + /@types/chai-as-promised@7.1.7: + resolution: {integrity: sha512-APucaP5rlmTRYKtRA6FE5QPP87x76ejw5t5guRJ4y5OgMnwtsvigw7HHhKZlx2MGXLeZd6R/GNZR/IqDHcbtQw==} dependencies: - '@types/chai': 4.3.7 + '@types/chai': 4.3.9 dev: true - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + /@types/chai-subset@1.3.4: + resolution: {integrity: sha512-CCWNXrJYSUIojZ1149ksLl3AN9cmZ5djf+yUoVVV+NuYrtydItQVlL2ZDqyC6M6O9LWRnVf8yYDxbXHO2TfQZg==} dependencies: - '@types/chai': 4.3.7 + '@types/chai': 4.3.9 + dev: true + + /@types/chai@4.3.9: + resolution: {integrity: sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==} dev: true - /@types/chai@4.3.7: - resolution: {integrity: sha512-/k+vesl92vMvMygmQrFe9Aimxi6oQXFUX9mA5HanTrKUSAMoLauSi6PNFOdRw0oeqilaW600GNx2vSaT2f8aIQ==} + /@types/cli-progress@3.11.4: + resolution: {integrity: sha512-yufTxeeNCZuEIxx2uebK8lpSAsJM4lvzakm/VxzYhDtqhXCzwH9jpn7nPCxzrROuEbLATqhFq4MIPoG0tlrsvw==} + dependencies: + '@types/node': 18.18.6 dev: true /@types/concat-stream@1.6.1: resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 dev: true - /@types/connect-history-api-fallback@1.5.1: - resolution: {integrity: sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==} + /@types/connect-history-api-fallback@1.5.2: + resolution: {integrity: sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==} dependencies: - '@types/express-serve-static-core': 4.17.37 - '@types/node': 18.15.13 + '@types/express-serve-static-core': 4.17.39 + '@types/node': 18.18.6 - /@types/connect@3.4.36: - resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + /@types/connect@3.4.37: + resolution: {integrity: sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 /@types/cookie@0.4.1: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} dev: true - /@types/debug@4.1.9: - resolution: {integrity: sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==} + /@types/debug@4.1.10: + resolution: {integrity: sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==} dependencies: - '@types/ms': 0.7.32 + '@types/ms': 0.7.33 - /@types/dns-packet@5.6.1: - resolution: {integrity: sha512-F8X3srlDYXQSVGfjAWl0lxd9mGfYtkneMA0QFQ3BFBw/BUmBlhlAbpRjmvE7LbW3wIxf01KHi20/bPstYK6ssA==} + /@types/dns-packet@5.6.2: + resolution: {integrity: sha512-vgUZ0ilYvpnTDx7tBmmAUn1HsyzK3huAtulHaDbBBCW5UdaDrEei5XJjWHnD4s8r9/MSL1hJ8s+nvJdcvNKgMA==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 dev: false - /@types/eslint-scope@3.7.5: - resolution: {integrity: sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==} + /@types/eslint-scope@3.7.6: + resolution: {integrity: sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==} dependencies: - '@types/eslint': 8.44.4 - '@types/estree': 1.0.2 + '@types/eslint': 8.44.6 + '@types/estree': 1.0.3 - /@types/eslint@8.44.4: - resolution: {integrity: sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA==} + /@types/eslint@8.44.6: + resolution: {integrity: sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==} dependencies: - '@types/estree': 1.0.2 - '@types/json-schema': 7.0.13 + '@types/estree': 1.0.3 + '@types/json-schema': 7.0.14 - /@types/estree@1.0.2: - resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} + /@types/estree@1.0.3: + resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} - /@types/express-serve-static-core@4.17.37: - resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} + /@types/express-serve-static-core@4.17.39: + resolution: {integrity: sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==} dependencies: - '@types/node': 18.15.13 - '@types/qs': 6.9.8 - '@types/range-parser': 1.2.5 - '@types/send': 0.17.2 + '@types/node': 18.18.6 + '@types/qs': 6.9.9 + '@types/range-parser': 1.2.6 + '@types/send': 0.17.3 - /@types/express@4.17.19: - resolution: {integrity: sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg==} + /@types/express@4.17.20: + resolution: {integrity: sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==} dependencies: - '@types/body-parser': 1.19.3 - '@types/express-serve-static-core': 4.17.37 - '@types/qs': 6.9.8 - '@types/serve-static': 1.15.3 + '@types/body-parser': 1.19.4 + '@types/express-serve-static-core': 4.17.39 + '@types/qs': 6.9.9 + '@types/serve-static': 1.15.4 /@types/form-data@0.0.33: resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 dev: true /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: - '@types/minimatch': 3.0.5 - '@types/node': 18.15.13 + '@types/minimatch': 5.1.2 + '@types/node': 18.18.6 dev: true - /@types/graceful-fs@4.1.7: - resolution: {integrity: sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==} + /@types/graceful-fs@4.1.8: + resolution: {integrity: sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 - /@types/hast@2.3.6: - resolution: {integrity: sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg==} + /@types/hast@2.3.7: + resolution: {integrity: sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 dev: false /@types/history@4.7.11: resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} - /@types/hoist-non-react-statics@3.3.3: - resolution: {integrity: sha512-Wny3a2UXn5FEA1l7gc6BbpoV5mD1XijZqgkp4TRgDCDL5r3B5ieOFGUX5h3n78Tr1MEG7BfvoM8qeztdvNU0fw==} + /@types/hoist-non-react-statics@3.3.4: + resolution: {integrity: sha512-ZchYkbieA+7tnxwX/SCBySx9WwvWR8TaP5tb2jRAzwvLb/rWchGw3v0w3pqUbUvj0GCwW2Xz/AVPSk6kUGctXQ==} dependencies: - '@types/react': 18.2.28 + '@types/react': 18.2.31 hoist-non-react-statics: 3.3.2 dev: false @@ -12174,29 +12352,29 @@ packages: /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - /@types/http-errors@2.0.2: - resolution: {integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==} + /@types/http-errors@2.0.3: + resolution: {integrity: sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==} - /@types/http-proxy@1.17.12: - resolution: {integrity: sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw==} + /@types/http-proxy@1.17.13: + resolution: {integrity: sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + /@types/istanbul-lib-coverage@2.0.5: + resolution: {integrity: sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==} - /@types/istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} + /@types/istanbul-lib-report@3.0.2: + resolution: {integrity: sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==} dependencies: - '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-lib-coverage': 2.0.5 - /@types/istanbul-reports@3.0.2: - resolution: {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} + /@types/istanbul-reports@3.0.3: + resolution: {integrity: sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==} dependencies: - '@types/istanbul-lib-report': 3.0.1 + '@types/istanbul-lib-report': 3.0.2 - /@types/jest@29.5.5: - resolution: {integrity: sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==} + /@types/jest@29.5.6: + resolution: {integrity: sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 @@ -12206,20 +12384,20 @@ packages: resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} dev: false - /@types/js-levenshtein@1.1.1: - resolution: {integrity: sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==} + /@types/js-levenshtein@1.1.2: + resolution: {integrity: sha512-/NCbMABw2uacuyE16Iwka1EzREDD50/W2ggRBad0y1WHBvAkvR9OEINxModVY7D428gXBe0igeVX7bUc9GaslQ==} dev: true /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 18.15.13 - '@types/tough-cookie': 4.0.3 + '@types/node': 18.18.6 + '@types/tough-cookie': 4.0.4 parse5: 7.1.2 dev: true - /@types/json-schema@7.0.13: - resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} + /@types/json-schema@7.0.14: + resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -12229,72 +12407,75 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 - /@types/level-errors@3.0.0: - resolution: {integrity: sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==} + /@types/level-errors@3.0.1: + resolution: {integrity: sha512-eFJZWaOUhgjSqgEsPKJZrqXS9aEDUQh/5F9saFhhkR5uEVKlYb4GSG8XyoVC7APklcQKPGDVenTointTZBGIQg==} dev: true /@types/levelup@4.3.3: resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} dependencies: - '@types/abstract-leveldown': 7.2.3 - '@types/level-errors': 3.0.0 - '@types/node': 18.15.13 + '@types/abstract-leveldown': 7.2.4 + '@types/level-errors': 3.0.1 + '@types/node': 18.18.6 dev: true - /@types/lodash@4.14.199: - resolution: {integrity: sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==} + /@types/lodash@4.14.200: + resolution: {integrity: sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==} /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - dev: false /@types/lru-cache@5.1.1: resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - /@types/mdast@3.0.13: - resolution: {integrity: sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==} + /@types/mdast@3.0.14: + resolution: {integrity: sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 dev: false - /@types/mime@1.3.3: - resolution: {integrity: sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==} + /@types/mime@1.3.4: + resolution: {integrity: sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==} - /@types/mime@3.0.2: - resolution: {integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ==} + /@types/mime@3.0.3: + resolution: {integrity: sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ==} /@types/minimatch@3.0.5: resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - /@types/minimist@1.2.3: - resolution: {integrity: sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==} + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/minimist@1.2.4: + resolution: {integrity: sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==} /@types/mkdirp@0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 dev: true /@types/mocha@9.1.0: resolution: {integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==} dev: true - /@types/ms@0.7.32: - resolution: {integrity: sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==} + /@types/ms@0.7.33: + resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} - /@types/multicast-dns@7.2.2: - resolution: {integrity: sha512-re0wpYJU2SdKkBbmCh7f5zYMLFA/FCbX46DI0rRMLlkkDqhk+0bTHbYsUVZumk/43GfJehPImK9e202eSuxPKA==} + /@types/multicast-dns@7.2.3: + resolution: {integrity: sha512-2SZ079yRhuhDn5BssqkQGp07vErjm3PD8S/JAlduWXacZ8SVHF0q6R2m0PwjjgTDU1vE3kibNPlmnr1iKbP/Sw==} dependencies: - '@types/dns-packet': 5.6.1 - '@types/node': 18.15.13 + '@types/dns-packet': 5.6.2 + '@types/node': 18.18.6 dev: false - /@types/node-fetch@2.6.6: - resolution: {integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==} + /@types/node-fetch@2.6.7: + resolution: {integrity: sha512-lX17GZVpJ/fuCjguZ5b3TjEbSENxmEk1B2z02yoXSK9WMEWRivhdSY73wWMn6bpcCDAOh6qAdktpKHIlkDk2lg==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 form-data: 4.0.0 dev: true @@ -12308,18 +12489,17 @@ packages: /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: false - /@types/node@16.18.58: - resolution: {integrity: sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA==} + /@types/node@16.18.59: + resolution: {integrity: sha512-PJ1w2cNeKUEdey4LiPra0ZuxZFOGvetswE8qHRriV/sUkL5Al4tTmPV9D2+Y/TPIxTHHgxTfRjZVKWhPw/ORhQ==} dev: true /@types/node@17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false - /@types/node@18.15.13: - resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + /@types/node@18.18.6: + resolution: {integrity: sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==} /@types/node@20.5.1: resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} @@ -12329,97 +12509,96 @@ packages: resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} dev: true - /@types/normalize-package-data@2.4.2: - resolution: {integrity: sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==} + /@types/normalize-package-data@2.4.3: + resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==} - /@types/papaparse@5.3.9: - resolution: {integrity: sha512-sZcrKD63qA4/6GyBcVvX6AIp0AkpfyYk00CUQHMBvb4+OVXTZWyXUvidUZaai1wyKUVyJoxO7mgREam/pMRrDw==} + /@types/papaparse@5.3.10: + resolution: {integrity: sha512-mS1Fta/xJ9EDYmAvpeWzcV9Gr0cOl1ClpW7di9+wSUNDIDO55tBtyXg97O7K+Syrd9rDEmuejM2iqmJIJ1SO5g==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 dev: true - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: false + /@types/parse-json@4.0.1: + resolution: {integrity: sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==} /@types/parse5@5.0.3: resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} dev: false - /@types/pbkdf2@3.1.0: - resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} + /@types/pbkdf2@3.1.1: + resolution: {integrity: sha512-4HCoGwR3221nOc7G0Z/6KgTNGgaaFGkbGrtUJsB+zlKX2LBVjFHHIUkieMBgHHXgBH5Gq6dZHJKdBYdtlhBQvw==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 - /@types/phoenix@1.6.2: - resolution: {integrity: sha512-I3mm7x5XIi+5NsIY3nfreY+H4PmQdyBwJ84SiUSOxSg1axwEPNmkKWYVm56y+emDpPPUL3cPzrLcgRWSd9gI7g==} + /@types/phoenix@1.6.3: + resolution: {integrity: sha512-D8TtchWVnU2ZdPVDY6tBJuz8MUDmCNVduilZTrf0Gn/u5I/uZEXOsaL4Gs4F0j43cysHsU/4h7eqAKc+SF2boQ==} dev: false /@types/prettier@2.7.3: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - /@types/prop-types@15.7.8: - resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==} + /@types/prop-types@15.7.9: + resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} - /@types/qs@6.9.8: - resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} + /@types/qs@6.9.9: + resolution: {integrity: sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==} - /@types/range-parser@1.2.5: - resolution: {integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==} + /@types/range-parser@1.2.6: + resolution: {integrity: sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==} - /@types/react-dom@18.2.13: - resolution: {integrity: sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==} + /@types/react-dom@18.2.14: + resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} dependencies: - '@types/react': 18.2.28 + '@types/react': 18.2.31 dev: true - /@types/react-router-config@5.0.8: - resolution: {integrity: sha512-zBzYZsr05V9xRG96oQ/xBXHy5+fDCX5wL7bboM0FFoOYQp9Gxmz8uvuKSkLesNWHlICl+W1l64F7fmp/KsOkuw==} + /@types/react-router-config@5.0.9: + resolution: {integrity: sha512-a7zOj9yVUtM3Ns5stoseQAAsmppNxZpXDv6tZiFV5qlRmV4W96u53on1vApBX1eRSc8mrFOiB54Hc0Pk1J8GFg==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.28 + '@types/react': 18.2.31 '@types/react-router': 5.1.20 /@types/react-router-dom@5.3.3: resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.28 + '@types/react': 18.2.31 '@types/react-router': 5.1.20 /@types/react-router@5.1.20: resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.28 + '@types/react': 18.2.31 - /@types/react-transition-group@4.4.7: - resolution: {integrity: sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==} + /@types/react-transition-group@4.4.8: + resolution: {integrity: sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==} dependencies: - '@types/react': 18.2.28 + '@types/react': 18.2.31 dev: false - /@types/react@18.2.28: - resolution: {integrity: sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==} + /@types/react@18.2.31: + resolution: {integrity: sha512-c2UnPv548q+5DFh03y8lEDeMfDwBn9G3dRwfkrxQMo/dOtRHUUO57k6pHvBIfH/VF4Nh+98mZ5aaSe+2echD5g==} dependencies: - '@types/prop-types': 15.7.8 - '@types/scheduler': 0.16.4 + '@types/prop-types': 15.7.9 + '@types/scheduler': 0.16.5 csstype: 3.1.2 /@types/readable-stream@2.3.15: resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 safe-buffer: 5.1.2 /@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true - /@types/responselike@1.0.1: - resolution: {integrity: sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==} + /@types/responselike@1.0.2: + resolution: {integrity: sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -12428,88 +12607,92 @@ packages: resolution: {integrity: sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==} dev: false - /@types/sax@1.2.5: - resolution: {integrity: sha512-9jWta97bBVC027/MShr3gLab8gPhKy4l6qpb+UJLF5pDm3501NvA7uvqVCW+REFtx00oTi6Cq9JzLwgq6evVgw==} + /@types/sax@1.2.6: + resolution: {integrity: sha512-A1mpYCYu1aHFayy8XKN57ebXeAbh9oQIZ1wXcno6b1ESUAfMBDMx7mf/QGlYwcMRaFryh9YBuH03i/3FlPGDkQ==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 dev: false - /@types/scheduler@0.16.4: - resolution: {integrity: sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==} + /@types/scheduler@0.16.5: + resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} - /@types/secp256k1@4.0.4: - resolution: {integrity: sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A==} + /@types/secp256k1@4.0.5: + resolution: {integrity: sha512-aIonTBMErtE3T9MxDvTZRzcrT/mCqpEZBw3CCY/i+oG9n57N/+7obBkhFgavUAIrX21bU0LHg1XRgtaLdelBhA==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 /@types/seedrandom@3.0.1: resolution: {integrity: sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==} dev: true - /@types/semver@7.5.3: - resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} + /@types/semver@7.5.4: + resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} dev: true - /@types/send@0.17.2: - resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} + /@types/send@0.17.3: + resolution: {integrity: sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==} dependencies: - '@types/mime': 1.3.3 - '@types/node': 18.15.13 + '@types/mime': 1.3.4 + '@types/node': 18.18.6 - /@types/serve-index@1.9.2: - resolution: {integrity: sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig==} + /@types/serve-index@1.9.3: + resolution: {integrity: sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==} dependencies: - '@types/express': 4.17.19 + '@types/express': 4.17.20 - /@types/serve-static@1.15.3: - resolution: {integrity: sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==} + /@types/serve-static@1.15.4: + resolution: {integrity: sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==} dependencies: - '@types/http-errors': 2.0.2 - '@types/mime': 3.0.2 - '@types/node': 18.15.13 + '@types/http-errors': 2.0.3 + '@types/mime': 3.0.3 + '@types/node': 18.18.6 - /@types/set-cookie-parser@2.4.4: - resolution: {integrity: sha512-xCfTC/eL/GmvMC24b42qJpYSTdCIBwWcfskDF80ztXtnU6pKXyvuZP2EConb2K9ps0s7gMhCa0P1foy7wiItMA==} + /@types/set-cookie-parser@2.4.5: + resolution: {integrity: sha512-ZPmztaAQ4rbnW/WTUnT1dwSENQo4bjGqxCSeyK+gZxmd+zJl/QAeF6dpEXcS5UEJX22HwiggFSaY8nE1nRmkbg==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 dev: true - /@types/sinon@10.0.19: - resolution: {integrity: sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==} + /@types/sinon@10.0.20: + resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} dependencies: - '@types/sinonjs__fake-timers': 8.1.1 + '@types/sinonjs__fake-timers': 8.1.4 dev: true /@types/sinonjs__fake-timers@8.1.1: resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} dev: true - /@types/sizzle@2.3.4: - resolution: {integrity: sha512-jA2llq2zNkg8HrALI7DtWzhALcVH0l7i89yhY3iBdOz6cBPeACoFq+fkQrjHA39t1hnSFOboZ7A/AY5MMZSlag==} + /@types/sinonjs__fake-timers@8.1.4: + resolution: {integrity: sha512-GDV68H0mBSN449sa5HEj51E0wfpVQb8xNSMzxf/PrypMFcLTMwJMOM/cgXiv71Mq5drkOQmUGvL1okOZcu6RrQ==} + dev: true + + /@types/sizzle@2.3.5: + resolution: {integrity: sha512-tAe4Q+OLFOA/AMD+0lq8ovp8t3ysxAOeaScnfNdZpUxaGl51ZMDEITxkvFl1STudQ58mz6gzVGl9VhMKhwRnZQ==} dev: true - /@types/sockjs@0.3.34: - resolution: {integrity: sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g==} + /@types/sockjs@0.3.35: + resolution: {integrity: sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 - /@types/source-list-map@0.1.3: - resolution: {integrity: sha512-I9R/7fUjzUOyDy6AFkehCK711wWoAXEaBi80AfjZt1lIkbe6AcXKd3ckQc3liMvQExWvfOeh/8CtKzrfUFN5gA==} + /@types/source-list-map@0.1.4: + resolution: {integrity: sha512-Kdfm7Sk5VX8dFW7Vbp18+fmAatBewzBILa1raHYxrGEFXT0jNl9x3LWfuW7bTbjEKFNey9Dfkj/UzT6z/NvRlg==} dev: true /@types/stack-trace@0.0.29: resolution: {integrity: sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==} dev: true - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + /@types/stack-utils@2.0.2: + resolution: {integrity: sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==} - /@types/tapable@1.0.9: - resolution: {integrity: sha512-fOHIwZua0sRltqWzODGUM6b4ffZrf/vzGUmNXdR+4DzuJP42PMbM5dLKcdzlYvv8bMJ3GALOzkk1q7cDm2zPyA==} + /@types/tapable@1.0.10: + resolution: {integrity: sha512-q8F20SdXG5fdVJQ5yxsVlH+f+oekP42QeHv4s5KlrxTMT0eopXn7ol1rhxMcksf8ph7XNv811iVDE2hOpUvEPg==} dev: true - /@types/testing-library__cypress@5.0.11: - resolution: {integrity: sha512-SNKUJWfxJKG7ZAmkRCFYWfqxBk3nxD60QKUJYXpU7wxX85EikDEjHxIGmQQfZ6TLSyItMrkgt9MHlX0rG7JF/Q==} + /@types/testing-library__cypress@5.0.12: + resolution: {integrity: sha512-MxX257KJIDnakpfCOzpT3tIwrWd3bpGWHCMIpJO3Ye1sCxtzluRyYIKWt6+XDr9ZzJeHlsR9i5ggZEgNB71cfQ==} dependencies: '@testing-library/dom': 7.31.2 cypress: 12.17.4 @@ -12518,87 +12701,85 @@ packages: /@types/testing-library__jest-dom@5.14.9: resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} dependencies: - '@types/jest': 29.5.5 + '@types/jest': 29.5.6 dev: true - /@types/tough-cookie@4.0.3: - resolution: {integrity: sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==} + /@types/tough-cookie@4.0.4: + resolution: {integrity: sha512-95Sfz4nvMAb0Nl9DTxN3j64adfwfbBPEYq14VN7zT5J5O2M9V6iZMIIQU1U+pJyl9agHYHNCqhCXgyEtIRRa5A==} dev: true - /@types/trusted-types@2.0.4: - resolution: {integrity: sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==} + /@types/trusted-types@2.0.5: + resolution: {integrity: sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==} dev: false - /@types/uglify-js@3.17.2: - resolution: {integrity: sha512-9SjrHO54LINgC/6Ehr81NjAxAYvwEZqjUHLjJYvC4Nmr9jbLQCIZbWSvl4vXQkkmR1UAuaKDycau3O1kWGFyXQ==} + /@types/uglify-js@3.17.3: + resolution: {integrity: sha512-ToldSfJ6wxO21cakcz63oFD1GjqQbKzhZCD57eH7zWuYT5UEZvfUoqvrjX5d+jB9g4a/sFO0n6QSVzzn5sMsjg==} dependencies: source-map: 0.6.1 dev: true - /@types/unist@2.0.8: - resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==} + /@types/unist@2.0.9: + resolution: {integrity: sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==} dev: false - /@types/webpack-sources@3.2.1: - resolution: {integrity: sha512-iLC3Fsx62ejm3ST3PQ8vBMC54Rb3EoCprZjeJGI5q+9QjfDLGt9jeg/k245qz1G9AQnORGk0vqPicJFPT1QODQ==} + /@types/webpack-sources@3.2.2: + resolution: {integrity: sha512-acCzhuVe+UJy8abiSFQWXELhhNMZjQjQKpLNEi1pKGgKXZj0ul614ATcx4kkhunPost6Xw+aCq8y8cn1/WwAiA==} dependencies: - '@types/node': 18.15.13 - '@types/source-list-map': 0.1.3 + '@types/node': 18.18.6 + '@types/source-list-map': 0.1.4 source-map: 0.7.4 dev: true - /@types/webpack@4.41.34: - resolution: {integrity: sha512-CN2aOGrR3zbMc2v+cKqzaClYP1ldkpPOgtdNvgX+RmlWCSWxHxpzz6WSCVQZRkF8D60ROlkRzAoEpgjWQ+bd2g==} + /@types/webpack@4.41.35: + resolution: {integrity: sha512-XRC6HLGHtNfN8/xWeu1YUQV1GSE+28q8lSqvcJ+0xt/zW9Wmn4j9pCSvaXPyRlCKrl5OuqECQNEJUy2vo8oWqg==} dependencies: - '@types/node': 18.15.13 - '@types/tapable': 1.0.9 - '@types/uglify-js': 3.17.2 - '@types/webpack-sources': 3.2.1 + '@types/node': 18.18.6 + '@types/tapable': 1.0.10 + '@types/uglify-js': 3.17.3 + '@types/webpack-sources': 3.2.2 anymatch: 3.1.3 source-map: 0.6.1 dev: true - /@types/websocket@1.0.7: - resolution: {integrity: sha512-62Omr8U0PO+hgjLCpPnMsmjh2/FRwIGOktZHyYAUzooEJotwkXHMp7vCacdYi8haxBNOiw9bc2HIHI+b/MPNjA==} + /@types/websocket@1.0.8: + resolution: {integrity: sha512-wvkOpWApbuxVfHhSQ1XrjVN4363vsfLJwEo4AboIZk0g1vJA5nmLp8GXUHuIdf4/Fe7+/V0Efe2HvWiLqHtlqw==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 dev: false /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 18.15.13 - dev: false + '@types/node': 18.18.6 - /@types/ws@8.5.7: - resolution: {integrity: sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ==} + /@types/ws@8.5.8: + resolution: {integrity: sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 - /@types/yargs-parser@21.0.1: - resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} + /@types/yargs-parser@21.0.2: + resolution: {integrity: sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==} - /@types/yargs@15.0.16: - resolution: {integrity: sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg==} + /@types/yargs@15.0.17: + resolution: {integrity: sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==} dependencies: - '@types/yargs-parser': 21.0.1 + '@types/yargs-parser': 21.0.2 - /@types/yargs@16.0.6: - resolution: {integrity: sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==} + /@types/yargs@16.0.7: + resolution: {integrity: sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==} dependencies: - '@types/yargs-parser': 21.0.1 - dev: false + '@types/yargs-parser': 21.0.2 - /@types/yargs@17.0.28: - resolution: {integrity: sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw==} + /@types/yargs@17.0.29: + resolution: {integrity: sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==} dependencies: - '@types/yargs-parser': 21.0.1 + '@types/yargs-parser': 21.0.2 - /@types/yauzl@2.10.1: - resolution: {integrity: sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw==} + /@types/yauzl@2.10.2: + resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==} requiresBuild: true dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 dev: true optional: true @@ -12630,7 +12811,7 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@4.9.5): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.52.0)(typescript@4.9.5): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -12642,12 +12823,12 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.52.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.51.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.52.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.52.0)(typescript@4.9.5) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.51.0 + eslint: 8.52.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -12678,7 +12859,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.51.0)(typescript@4.9.5): + /@typescript-eslint/parser@5.62.0(eslint@8.52.0)(typescript@4.9.5): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -12692,7 +12873,7 @@ packages: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.51.0 + eslint: 8.52.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -12726,7 +12907,7 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.51.0)(typescript@4.9.5): + /@typescript-eslint/type-utils@5.62.0(eslint@8.52.0)(typescript@4.9.5): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -12737,9 +12918,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.52.0)(typescript@4.9.5) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.51.0 + eslint: 8.52.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -12800,8 +12981,8 @@ packages: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.19.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.3 + '@types/json-schema': 7.0.14 + '@types/semver': 7.5.4 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) @@ -12813,19 +12994,19 @@ packages: - typescript dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.51.0)(typescript@4.9.5): + /@typescript-eslint/utils@5.62.0(eslint@8.52.0)(typescript@4.9.5): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.3 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@types/json-schema': 7.0.14 + '@types/semver': 7.5.4 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 8.51.0 + eslint: 8.52.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -12841,6 +13022,10 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + /@vanilla-extract/css@1.9.1: resolution: {integrity: sha512-pu2SFiff5jRhPwvGoj8cM5l/qIyLvigOmy22ss5DGjwV5pJYezRjDLxWumi2luIwioMWvh9EozCjyfH8nq+7fQ==} dependencies: @@ -12885,7 +13070,7 @@ packages: execa: 7.2.0 get-port: 6.1.2 http-proxy: 1.18.1(debug@4.3.4) - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -12919,61 +13104,61 @@ packages: dependencies: cli-truncate: 3.1.0 diff: 5.1.0 - loupe: 2.3.6 + loupe: 2.3.7 picocolors: 1.0.0 pretty-format: 27.5.1 dev: true - /@vue/compiler-core@3.3.4: - resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + /@vue/compiler-core@3.3.6: + resolution: {integrity: sha512-2JNjemwaNwf+MkkatATVZi7oAH1Hx0B04DdPH3ZoZ8vKC1xZVP7nl4HIsk8XYd3r+/52sqqoz9TWzYc3yE9dqA==} dependencies: '@babel/parser': 7.23.0 - '@vue/shared': 3.3.4 + '@vue/shared': 3.3.6 estree-walker: 2.0.2 source-map-js: 1.0.2 dev: true - /@vue/compiler-dom@3.3.4: - resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + /@vue/compiler-dom@3.3.6: + resolution: {integrity: sha512-1MxXcJYMHiTPexjLAJUkNs/Tw2eDf2tY3a0rL+LfuWyiKN2s6jvSwywH3PWD8bKICjfebX3GWx2Os8jkRDq3Ng==} dependencies: - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-core': 3.3.6 + '@vue/shared': 3.3.6 dev: true - /@vue/compiler-sfc@3.3.4: - resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + /@vue/compiler-sfc@3.3.6: + resolution: {integrity: sha512-/Kms6du2h1VrXFreuZmlvQej8B1zenBqIohP0690IUBkJjsFvJxY0crcvVRJ0UhMgSR9dewB+khdR1DfbpArJA==} dependencies: '@babel/parser': 7.23.0 - '@vue/compiler-core': 3.3.4 - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-ssr': 3.3.4 - '@vue/reactivity-transform': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-core': 3.3.6 + '@vue/compiler-dom': 3.3.6 + '@vue/compiler-ssr': 3.3.6 + '@vue/reactivity-transform': 3.3.6 + '@vue/shared': 3.3.6 estree-walker: 2.0.2 magic-string: 0.30.5 postcss: 8.4.31 source-map-js: 1.0.2 dev: true - /@vue/compiler-ssr@3.3.4: - resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + /@vue/compiler-ssr@3.3.6: + resolution: {integrity: sha512-QTIHAfDCHhjXlYGkUg5KH7YwYtdUM1vcFl/FxFDlD6d0nXAmnjizka3HITp8DGudzHndv2PjKVS44vqqy0vP4w==} dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-dom': 3.3.6 + '@vue/shared': 3.3.6 dev: true - /@vue/reactivity-transform@3.3.4: - resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + /@vue/reactivity-transform@3.3.6: + resolution: {integrity: sha512-RlJl4dHfeO7EuzU1iJOsrlqWyJfHTkJbvYz/IOJWqu8dlCNWtxWX377WI0VsbAgBizjwD+3ZjdnvSyyFW1YVng==} dependencies: '@babel/parser': 7.23.0 - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-core': 3.3.6 + '@vue/shared': 3.3.6 estree-walker: 2.0.2 magic-string: 0.30.5 dev: true - /@vue/shared@3.3.4: - resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + /@vue/shared@3.3.6: + resolution: {integrity: sha512-Xno5pEqg8SVhomD0kTSmfh30ZEmV/+jZtyh39q6QflrjdJCXah5lrnOLi9KB6a5k5aAHXMXjoMnxlzUkCNfWLQ==} dev: true /@wagmi/chains@1.0.0(typescript@5.1.6): @@ -13034,7 +13219,7 @@ packages: - zod dev: false - /@wagmi/core@1.3.8(@types/react@18.2.28)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4): + /@wagmi/core@1.3.8(@types/react@18.2.31)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4): resolution: {integrity: sha512-OYSxikoMizqVnpSkFTwGE7PwFaz2k0PXteSiI0W2Mtk4j4sZzRFdP+9AWeDB6AYm0yU3WvgN1IATx0EEBKUe3w==} peerDependencies: typescript: '>=5.0.4' @@ -13049,7 +13234,7 @@ packages: eventemitter3: 4.0.7 typescript: 5.1.6 viem: 1.5.3(typescript@5.1.6)(zod@3.22.4) - zustand: 4.4.3(@types/react@18.2.28)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.31)(react@18.2.0) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@types/react' @@ -13581,27 +13766,27 @@ packages: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.88.2): + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.89.0): resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} engines: {node: '>=14.15.0'} peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.88.2) + webpack: 5.89.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.89.0) - /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.88.2): + /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.89.0): resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} engines: {node: '>=14.15.0'} peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.88.2) + webpack: 5.89.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.89.0) - /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.88.2): + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.89.0): resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} engines: {node: '>=14.15.0'} peerDependencies: @@ -13612,23 +13797,24 @@ packages: webpack-dev-server: optional: true dependencies: - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.88.2) + webpack: 5.89.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.89.0) /@whatwg-node/cookie-store@0.0.1: resolution: {integrity: sha512-uoti8QU5xd+X+9PULOGpPpOqPDdwkz+ukMc4kyQG1GwXeKVGktr4FSllr6dBotjOjNVPSBPpmj5V6zrUdDcLaw==} dependencies: '@whatwg-node/events': 0.0.3 tslib: 2.6.2 - dev: false /@whatwg-node/events@0.0.2: resolution: {integrity: sha512-WKj/lI4QjnLuPrim0cfO7i+HsDSXHxNv1y0CrJhdntuO3hxWZmnXCwNDnwOvry11OjRin6cgWNF+j/9Pn8TN4w==} - dev: false /@whatwg-node/events@0.0.3: resolution: {integrity: sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==} - dev: false + + /@whatwg-node/events@0.1.1: + resolution: {integrity: sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==} + engines: {node: '>=16.0.0'} /@whatwg-node/fetch@0.8.8: resolution: {integrity: sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==} @@ -13638,7 +13824,13 @@ packages: busboy: 1.6.0 urlpattern-polyfill: 8.0.2 web-streams-polyfill: 3.2.1 - dev: false + + /@whatwg-node/fetch@0.9.13: + resolution: {integrity: sha512-PPtMwhjtS96XROnSpowCQM85gCUG2m7AXZFw0PZlGbhzx2GK7f2iOXilfgIJ0uSlCuuGbOIzfouISkA7C4FJOw==} + engines: {node: '>=16.0.0'} + dependencies: + '@whatwg-node/node-fetch': 0.4.19 + urlpattern-polyfill: 9.0.0 /@whatwg-node/node-fetch@0.3.6: resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==} @@ -13648,13 +13840,29 @@ packages: fast-querystring: 1.1.2 fast-url-parser: 1.1.3 tslib: 2.6.2 - dev: false + + /@whatwg-node/node-fetch@0.4.19: + resolution: {integrity: sha512-AW7/m2AuweAoSXmESrYQr/KBafueScNbn2iNO0u6xFr2JZdPmYsSm5yvAXYk6yDLv+eDmSSKrf7JnFZ0CsJIdA==} + engines: {node: '>=16.0.0'} + dependencies: + '@whatwg-node/events': 0.1.1 + busboy: 1.6.0 + fast-querystring: 1.1.2 + fast-url-parser: 1.1.3 + tslib: 2.6.2 /@whatwg-node/server@0.7.7: resolution: {integrity: sha512-aHURgNDFm/48WVV3vhTMfnEKCYwYgdaRdRhZsQZx4UVFjGGkGay7Ys0+AYu9QT/jpoImv2oONkstoTMUprDofg==} dependencies: '@whatwg-node/fetch': 0.8.8 tslib: 2.6.2 + + /@whatwg-node/server@0.9.15: + resolution: {integrity: sha512-MDmw3HYfZt8hzP8Vac/LPwD8LyZFByVuO1vHPBDsOMYNf4XWv6eHbRCk4UFfLT8OMFgd+qMy/zNYc74o+3tXZg==} + engines: {node: '>=16.0.0'} + dependencies: + '@whatwg-node/fetch': 0.9.13 + tslib: 2.6.2 dev: false /@wry/context@0.7.3: @@ -13702,6 +13910,14 @@ packages: requiresBuild: true optional: true + /JSONStream@1.3.2: + resolution: {integrity: sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + /JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -13988,7 +14204,6 @@ packages: /anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} - dev: false /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -14023,7 +14238,6 @@ packages: colorette: 1.4.0 slice-ansi: 2.1.0 strip-ansi: 5.2.0 - dev: false /ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} @@ -14043,7 +14257,6 @@ packages: /ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} - dev: false /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -14077,6 +14290,10 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + /ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + dev: true + /antlr4@4.13.1: resolution: {integrity: sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==} engines: {node: '>=16'} @@ -14095,11 +14312,9 @@ packages: dependencies: abort-controller: 3.0.0 native-abort-controller: 1.0.4(abort-controller@3.0.0) - dev: false /any-signal@3.0.1: resolution: {integrity: sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==} - dev: false /any-signal@4.1.1: resolution: {integrity: sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==} @@ -14113,6 +14328,18 @@ packages: normalize-path: 3.0.0 picomatch: 2.3.1 + /apisauce@2.1.6(debug@4.3.4): + resolution: {integrity: sha512-MdxR391op/FucS2YQRfB/NMRyCnHEPDd4h17LRIuVYi0BpGmMhpxc0shbOpfs5ahABuBEffNCGal5EcsydbBWg==} + dependencies: + axios: 0.21.4(debug@4.3.4) + transitivePeerDependencies: + - debug + dev: true + + /app-module-path@2.2.0: + resolution: {integrity: sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==} + dev: true + /app-root-path@3.1.0: resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} engines: {node: '>= 6.0.0'} @@ -14120,7 +14347,6 @@ packages: /appdirsjs@1.2.7: resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} - dev: false /append-transform@2.0.0: resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} @@ -14162,8 +14388,8 @@ packages: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} engines: {node: '>=6.0'} dependencies: - '@babel/runtime': 7.23.1 - '@babel/runtime-corejs3': 7.23.1 + '@babel/runtime': 7.23.2 + '@babel/runtime-corejs3': 7.23.2 dev: true /aria-query@5.1.3: @@ -14172,6 +14398,12 @@ packages: deep-equal: 2.2.2 dev: true + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + /array-back@3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} @@ -14183,7 +14415,7 @@ packages: /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 is-array-buffer: 3.0.2 dev: true @@ -14201,10 +14433,10 @@ packages: resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 is-string: 1.0.7 dev: true @@ -14233,51 +14465,51 @@ packages: resolution: {integrity: sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 dev: true /array.prototype.findlastindex@1.2.3: resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 dev: true /array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 dev: true /array.prototype.flatmap@1.3.2: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 dev: true /array.prototype.reduce@1.0.6: resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 dev: true @@ -14285,11 +14517,11 @@ packages: /array.prototype.tosorted@1.1.2: resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 dev: true /arraybuffer.prototype.slice@1.0.2: @@ -14297,10 +14529,10 @@ packages: engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 dev: true @@ -14325,7 +14557,23 @@ packages: pvtsutils: 1.3.5 pvutils: 1.1.3 tslib: 2.6.2 - dev: false + + /assemblyscript@0.19.10: + resolution: {integrity: sha512-HavcUBXB3mBTRGJcpvaQjmnmaqKHBGREjSPNsIvnAk2f9dj78y4BkMaSSdvBQYWcDDzsHQjyUC8stICFkD1Odg==} + hasBin: true + dependencies: + binaryen: 101.0.0-nightly.20210723 + long: 4.0.0 + dev: true + + /assemblyscript@0.19.23: + resolution: {integrity: sha512-fwOQNZVTMga5KRsfY80g7cpOl4PsFQczMwHzdtgoqLXaYhkhavufKb0sB0l3T1DUxpAufA0KNhlbpuuhZUwxMA==} + hasBin: true + dependencies: + binaryen: 102.0.0-nightly.20211028 + long: 5.2.3 + source-map-support: 0.5.21 + dev: true /assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} @@ -14349,12 +14597,10 @@ packages: engines: {node: '>=4'} dependencies: tslib: 2.6.2 - dev: false /astral-regex@1.0.0: resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} engines: {node: '>=4'} - dev: false /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} @@ -14369,7 +14615,6 @@ packages: /async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - dev: false /async-mutex@0.2.6: resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} @@ -14421,7 +14666,6 @@ packages: /auto-bind@4.0.0: resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} engines: {node: '>=8'} - dev: false /autoprefixer@10.4.16(postcss@8.4.31): resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} @@ -14431,8 +14675,8 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.22.1 - caniuse-lite: 1.0.30001547 - fraction.js: 4.3.6 + caniuse-lite: 1.0.30001553 + fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 postcss: 8.4.31 @@ -14520,7 +14764,6 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 - dev: false /babel-jest@29.7.0(@babel/core@7.23.2): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} @@ -14530,7 +14773,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.2 + '@types/babel__core': 7.20.3 babel-plugin-istanbul: 6.1.1 babel-preset-jest: 29.6.3(@babel/core@7.23.2) chalk: 4.1.2 @@ -14539,22 +14782,22 @@ packages: transitivePeerDependencies: - supports-color - /babel-loader@8.3.0(@babel/core@7.23.0)(webpack@5.88.2): + /babel-loader@8.3.0(@babel/core@7.23.2)(webpack@5.89.0): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 webpack: '>=2' dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: false - /babel-loader@9.1.3(@babel/core@7.23.2)(webpack@5.88.2): + /babel-loader@9.1.3(@babel/core@7.23.2)(webpack@5.89.0): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -14564,7 +14807,7 @@ packages: '@babel/core': 7.23.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: true /babel-plugin-apply-mdx-type-prop@1.6.22(@babel/core@7.12.9): @@ -14607,31 +14850,18 @@ packages: dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.0 - '@types/babel__core': 7.20.2 - '@types/babel__traverse': 7.20.2 + '@types/babel__core': 7.20.3 + '@types/babel__traverse': 7.20.3 /babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 cosmiconfig: 7.1.0 resolve: 1.22.8 dev: false - /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.0): - resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.23.0 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2): resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} peerDependencies: @@ -14644,39 +14874,16 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.23.0): - resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.0) - core-js-compat: 3.33.0 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.23.2): - resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==} + /babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.23.2): + resolution: {integrity: sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.23.2 '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) - core-js-compat: 3.33.0 - transitivePeerDependencies: - - supports-color - - /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.0): - resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.0) + core-js-compat: 3.33.1 transitivePeerDependencies: - supports-color - dev: false /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2): resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} @@ -14698,7 +14905,6 @@ packages: /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} - dev: false /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.2): resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} @@ -14706,7 +14912,6 @@ packages: '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) transitivePeerDependencies: - '@babel/core' - dev: false /babel-plugin-transform-react-qa-classes@1.6.0: resolution: {integrity: sha512-r7G9s+j6CiatnTMP+32fbPrfrSSPWJ3LBoESNlCdXWb8oAO2Ubcrgk0TSbpHVMoDpBiyn+zfm2rxdxwdTt3FpQ==} @@ -14781,7 +14986,6 @@ packages: '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 - dev: false /babel-preset-jest@29.6.3(@babel/core@7.23.2): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} @@ -14822,7 +15026,6 @@ packages: /base-64@0.1.0: resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} - dev: false /base-x@3.0.9: resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} @@ -14883,6 +15086,27 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + /binary-install-raw@0.0.13(debug@4.3.4): + resolution: {integrity: sha512-v7ms6N/H7iciuk6QInon3/n2mu7oRX+6knJ9xFPsJ3rQePgAqcR3CRTwUheFd8SLbiq4LL7Z4G/44L9zscdt9A==} + engines: {node: '>=10'} + dependencies: + axios: 0.21.4(debug@4.3.4) + rimraf: 3.0.2 + tar: 6.2.0 + transitivePeerDependencies: + - debug + dev: true + + /binaryen@101.0.0-nightly.20210723: + resolution: {integrity: sha512-eioJNqhHlkguVSbblHOtLqlhtC882SOEPKmNFZaDuz1hzQjolxZ+eu3/kaS10n3sGPONsIZsO7R9fR00UyhEUA==} + hasBin: true + dev: true + + /binaryen@102.0.0-nightly.20211028: + resolution: {integrity: sha512-GCJBVB5exbxzzvyt8MGDv/MeUjs6gkXDvf4xOIItRBptYl0Tz5sm1o/uG95YK0L0VeG5ajDu3hRtkBP2kzqC5w==} + hasBin: true + dev: true + /bind-decorator@1.0.11: resolution: {integrity: sha512-yzkH0uog6Vv/vQ9+rhSKxecnqGUZHYncg7qS7voz3Q76+TAi1SGiOKk2mlOvusQnFz9Dc4BC/NMkeXu11YgjJg==} dev: false @@ -14935,7 +15159,6 @@ packages: resolution: {integrity: sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA==} dependencies: browser-readablestream-to-it: 1.0.3 - dev: false /blob-to-it@2.0.4: resolution: {integrity: sha512-1z2a98yY7v855TreA3HzwJs/j7ecMzes6U1ty8fJ93S1XbiETsup+h5DA/XBMwK3tBu+CWx4WJjR3b8S13TKeQ==} @@ -15083,7 +15306,7 @@ packages: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 - chalk: 5.3.0 + chalk: 5.0.1 cli-boxes: 3.0.0 string-width: 5.1.2 type-fest: 2.19.0 @@ -15121,7 +15344,6 @@ packages: /browser-readablestream-to-it@1.0.3: resolution: {integrity: sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==} - dev: false /browser-readablestream-to-it@2.0.4: resolution: {integrity: sha512-EOjEEA+tJInvKg/Pml6QYxVY6gD8lka/ceLmkUbEeuWlzZx/a5k5ugupVFUUKSfI/88+v0VFs7JSFi5iYpp3IA==} @@ -15145,8 +15367,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001547 - electron-to-chromium: 1.4.549 + caniuse-lite: 1.0.30001553 + electron-to-chromium: 1.4.564 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) @@ -15233,8 +15455,8 @@ packages: dev: true optional: true - /bufferutil@4.0.7: - resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} + /bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} engines: {node: '>=6.14.2'} requiresBuild: true dependencies: @@ -15304,10 +15526,10 @@ packages: resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} engines: {node: '>=8'} dependencies: - clone-response: 1.0.2 + clone-response: 1.0.3 get-stream: 5.2.0 http-cache-semantics: 4.1.1 - keyv: 3.0.0 + keyv: 3.1.0 lowercase-keys: 2.0.0 normalize-url: 4.5.1 responselike: 1.0.2 @@ -15333,11 +15555,12 @@ packages: write-file-atomic: 3.0.3 dev: true - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 /call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} @@ -15348,19 +15571,16 @@ packages: engines: {node: '>=4'} dependencies: callsites: 2.0.0 - dev: false /caller-path@2.0.0: resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} engines: {node: '>=4'} dependencies: caller-callsite: 2.0.0 - dev: false /callsites@2.0.0: resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} engines: {node: '>=4'} - dev: false /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -15407,13 +15627,13 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.22.1 - caniuse-lite: 1.0.30001547 + caniuse-lite: 1.0.30001553 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: false - /caniuse-lite@1.0.30001547: - resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==} + /caniuse-lite@1.0.30001553: + resolution: {integrity: sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==} /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -15421,7 +15641,6 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false /carbites@1.0.6: resolution: {integrity: sha512-dS9IQvnrb5VIRvSTNz5Ff+mB9d2MFfi5mojtJi7Rlss79VeF190jr0sZdA7eW0CGHotvHkZaWuM6wgfD9PEFRg==} @@ -15432,6 +15651,14 @@ packages: multiformats: 9.9.0 dev: false + /cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + dev: true + /case@1.6.3: resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} engines: {node: '>= 0.8.0'} @@ -15461,10 +15688,9 @@ packages: /cborg@1.10.2: resolution: {integrity: sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==} hasBin: true - dev: false - /cborg@4.0.3: - resolution: {integrity: sha512-poLvpK30KT5KI8gzDx3J/IuVCbsLqMT2fEbOrOuX0H7Hyj8yg5LezeWhRh9aLa5Z6MfPC5sriW3HVJF328M8LQ==} + /cborg@4.0.4: + resolution: {integrity: sha512-nu+JXYskYqWN/tFWQVjL2ZYlUwK+dapqkTpruAtJkwmDv7XaTgg8PStUbO+sXfhqSWaeQ9LPSPCTrO2WZ2Bxfg==} hasBin: true dev: false @@ -15502,7 +15728,7 @@ packages: check-error: 1.0.3 deep-eql: 4.1.3 get-func-name: 2.0.2 - loupe: 2.3.6 + loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 dev: true @@ -15544,6 +15770,7 @@ packages: /chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true /chance@1.1.11: resolution: {integrity: sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA==} @@ -15562,7 +15789,6 @@ packages: title-case: 3.0.3 upper-case: 2.0.2 upper-case-first: 2.0.2 - dev: false /change-case-all@1.0.15: resolution: {integrity: sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==} @@ -15577,7 +15803,6 @@ packages: title-case: 3.0.3 upper-case: 2.0.2 upper-case-first: 2.0.2 - dev: false /change-case@4.1.2: resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} @@ -15594,7 +15819,6 @@ packages: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.6.2 - dev: false /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} @@ -15673,6 +15897,15 @@ packages: optionalDependencies: fsevents: 2.3.3 + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -15725,6 +15958,13 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + /clean-stack@3.0.1: + resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 4.0.0 + dev: true + /cli-boxes@2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} @@ -15759,6 +15999,13 @@ packages: restore-cursor: 4.0.0 dev: true + /cli-progress@3.12.0: + resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} + engines: {node: '>=4'} + dependencies: + string-width: 4.2.3 + dev: true + /cli-spinners@2.9.1: resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} engines: {node: '>=6'} @@ -15773,6 +16020,16 @@ packages: colors: 1.4.0 dev: true + /cli-table3@0.6.0: + resolution: {integrity: sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==} + engines: {node: 10.* || >= 12.*} + dependencies: + object-assign: 4.1.1 + string-width: 4.2.3 + optionalDependencies: + colors: 1.4.0 + dev: true + /cli-table3@0.6.3: resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} engines: {node: 10.* || >= 12.*} @@ -15857,6 +16114,13 @@ packages: resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} dependencies: mimic-response: 1.0.1 + dev: true + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: false /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} @@ -15895,7 +16159,6 @@ packages: /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - requiresBuild: true dependencies: color-name: 1.1.3 @@ -15907,7 +16170,6 @@ packages: /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - requiresBuild: true /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -15918,7 +16180,6 @@ packages: /colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - dev: false /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -15979,7 +16240,6 @@ packages: /commander@2.13.0: resolution: {integrity: sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==} - dev: false /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -16013,7 +16273,6 @@ packages: /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - dev: false /commitizen@4.3.0: resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} @@ -16120,7 +16379,6 @@ packages: utils-merge: 1.0.1 transitivePeerDependencies: - supports-color - dev: false /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} @@ -16132,7 +16390,6 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case: 2.0.2 - dev: false /content-disposition@0.5.2: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} @@ -16213,7 +16470,7 @@ packages: toggle-selection: 1.0.6 dev: false - /copy-webpack-plugin@11.0.0(webpack@5.88.2): + /copy-webpack-plugin@11.0.0(webpack@5.89.0): resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -16225,7 +16482,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.1 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: false /copyfiles@2.4.1: @@ -16241,13 +16498,13 @@ packages: yargs: 16.2.0 dev: true - /core-js-compat@3.33.0: - resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==} + /core-js-compat@3.33.1: + resolution: {integrity: sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ==} dependencies: browserslist: 4.22.1 - /core-js-pure@3.33.0: - resolution: {integrity: sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==} + /core-js-pure@3.33.1: + resolution: {integrity: sha512-wCXGbLjnsP10PlK/thHSQlOLlLKNEkaWbTzVvHHZ79fZNeN1gUmw2gBlpItxPv/pvqldevEXFh/d5stdNvl6EQ==} requiresBuild: true /core-js@2.6.12: @@ -16256,8 +16513,8 @@ packages: requiresBuild: true dev: true - /core-js@3.33.0: - resolution: {integrity: sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw==} + /core-js@3.33.1: + resolution: {integrity: sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q==} requiresBuild: true /core-util-is@1.0.2: @@ -16279,6 +16536,22 @@ packages: layout-base: 2.0.1 dev: false + /cosmiconfig-typescript-loader@4.4.0(@types/node@18.18.6)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@5.2.2): + resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} + engines: {node: '>=v14.21.3'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=4' + dependencies: + '@types/node': 18.18.6 + cosmiconfig: 8.3.6(typescript@5.2.2) + ts-node: 10.9.1(@types/node@18.18.6)(typescript@5.2.2) + typescript: 5.2.2 + dev: true + optional: true + /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@4.9.5): resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} engines: {node: '>=v14.21.3'} @@ -16302,24 +16575,34 @@ packages: is-directory: 0.3.1 js-yaml: 3.14.1 parse-json: 4.0.0 - dev: false /cosmiconfig@6.0.0: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} engines: {node: '>=8'} dependencies: - '@types/parse-json': 4.0.0 + '@types/parse-json': 4.0.1 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 dev: false + /cosmiconfig@7.0.1: + resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.1 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: - '@types/parse-json': 4.0.0 + '@types/parse-json': 4.0.1 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 @@ -16355,7 +16638,23 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 typescript: 5.1.6 - dev: false + + /cosmiconfig@8.3.6(typescript@5.2.2): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.2.2 + dev: true + optional: true /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} @@ -16381,7 +16680,7 @@ packages: safe-buffer: 5.2.1 sha.js: 2.4.11 - /create-jest@29.7.0(@types/node@18.15.13)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@18.18.6)(ts-node@10.9.1): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -16390,7 +16689,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.13)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -16420,7 +16719,6 @@ packages: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: false /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -16460,7 +16758,7 @@ packages: utrie: 1.0.2 dev: false - /css-loader@6.8.1(webpack@5.88.2): + /css-loader@6.8.1(webpack@5.89.0): resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -16474,10 +16772,10 @@ packages: postcss-modules-values: 4.0.0(postcss@8.4.31) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: false - /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.2)(webpack@5.88.2): + /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.2)(webpack@5.89.0): resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -16509,7 +16807,7 @@ packages: schema-utils: 4.2.0 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: false /css-select@4.3.0: @@ -16669,9 +16967,9 @@ packages: dependencies: '@cypress/request': 2.88.12 '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 16.18.58 + '@types/node': 16.18.59 '@types/sinonjs__fake-timers': 8.1.1 - '@types/sizzle': 2.3.4 + '@types/sizzle': 2.3.5 arch: 2.2.0 blob-util: 2.0.2 bluebird: 3.7.2 @@ -16749,7 +17047,7 @@ packages: longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 17.8.0 + '@commitlint/load': 18.0.0 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -17051,7 +17349,6 @@ packages: /data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - dev: false /data-urls@3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} @@ -17064,7 +17361,6 @@ packages: /dataloader@2.2.2: resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} - dev: false /datastore-core@8.0.4: resolution: {integrity: sha512-oBA6a024NFXJOTu+w9nLAimfy4wCYUhdE/5XQGtdKt1BmCVtPYW10GORvVT3pdZBcse6k/mVcBl+hjkXIlm65A==} @@ -17139,11 +17435,6 @@ packages: /dayjs@1.11.7: resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} - dev: false - - /dayjs@1.11.9: - resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} - dev: true /death@1.1.0: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} @@ -17294,9 +17585,9 @@ packages: resolution: {integrity: sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==} dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 + call-bind: 1.0.5 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 is-arguments: 1.1.1 is-array-buffer: 3.0.2 is-date-object: 1.0.5 @@ -17310,7 +17601,7 @@ packages: side-channel: 1.0.4 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true /deep-extend@0.6.0: @@ -17371,13 +17662,13 @@ packages: inherits: 2.0.4 dev: true - /define-data-property@1.1.0: - resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 gopd: 1.0.1 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} @@ -17387,15 +17678,15 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.0 - has-property-descriptors: 1.0.0 + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 object-keys: 1.1.1 /del@6.1.1: resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} engines: {node: '>=10'} dependencies: - globby: 11.0.4 + globby: 11.1.0 graceful-fs: 4.2.11 is-glob: 4.0.3 is-path-cwd: 2.2.0 @@ -17414,7 +17705,6 @@ packages: /delay@5.0.0: resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} engines: {node: '>=10'} - dev: false /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} @@ -17433,7 +17723,6 @@ packages: /denodeify@1.2.1: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} - dev: false /denque@1.5.1: resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==} @@ -17451,7 +17740,6 @@ packages: /dependency-graph@0.11.0: resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} engines: {node: '>= 0.6.0'} - dev: false /deprecated-react-native-prop-types@4.1.0: resolution: {integrity: sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw==} @@ -17459,7 +17747,6 @@ packages: '@react-native/normalize-colors': 0.72.0 invariant: 2.2.4 prop-types: 15.8.1 - dev: false /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -17573,16 +17860,15 @@ packages: transitivePeerDependencies: - node-fetch - supports-color - dev: false /dns-over-http-resolver@2.1.2: resolution: {integrity: sha512-Bjbf6aZjr3HMnwGslZnoW3MJVqgbTsh39EZWpikx2yLl9xEjw4eZhlOHCFhkOu89zoWaS4rqe2Go53TXW4Byiw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: debug: 4.3.4(supports-color@8.1.1) - native-fetch: 4.0.2(undici@5.26.0) + native-fetch: 4.0.2(undici@5.26.5) receptacle: 1.3.2 - undici: 5.26.0 + undici: 5.26.5 transitivePeerDependencies: - supports-color dev: false @@ -17598,7 +17884,36 @@ packages: dependencies: asap: 2.0.6 lodash.clone: 4.5.0 - dev: false + + /docker-compose@0.23.19: + resolution: {integrity: sha512-v5vNLIdUqwj4my80wxFDkNH+4S85zsRuH29SO7dCWVWPCMt/ohZBsGN6g6KXWifT0pzQ7uOxqEKCYCDPJ8Vz4g==} + engines: {node: '>= 6.0.0'} + dependencies: + yaml: 1.10.2 + dev: true + + /docker-modem@1.0.9: + resolution: {integrity: sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw==} + engines: {node: '>= 0.8'} + dependencies: + JSONStream: 1.3.2 + debug: 3.2.7(supports-color@8.1.1) + readable-stream: 1.0.34 + split-ca: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /dockerode@2.5.8: + resolution: {integrity: sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw==} + engines: {node: '>= 0.8'} + dependencies: + concat-stream: 1.6.2 + docker-modem: 1.0.9 + tar-fs: 1.16.3 + transitivePeerDependencies: + - supports-color + dev: true /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -17641,7 +17956,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 csstype: 3.1.2 dev: false @@ -17752,7 +18067,6 @@ packages: /dset@3.1.2: resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==} engines: {node: '>=4'} - dev: false /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} @@ -17783,15 +18097,30 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + /ejs@3.1.6: + resolution: {integrity: sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.7 + dev: true + + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.7 + dev: true + /electron-fetch@1.9.1: resolution: {integrity: sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==} engines: {node: '>=6'} dependencies: encoding: 0.1.13 - dev: false - /electron-to-chromium@1.4.549: - resolution: {integrity: sha512-gpXfJslSi4hYDkA0mTLEpYKRv9siAgSUgZ+UWyk+J5Cttpd1ThCVwdclzIwQSclz3hYn049+M2fgrP1WpvF8xg==} + /electron-to-chromium@1.4.564: + resolution: {integrity: sha512-bGAx9+teIzL5I4esQwCMtiXtb78Ysc8xOKTPOvmafbJZ4SQ40kDO1ym3yRcGSkfaBtV81fGgHOgPoe6DsmpmkA==} /elkjs@0.8.2: resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} @@ -17856,7 +18185,6 @@ packages: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} dependencies: iconv-lite: 0.6.3 - dev: false /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -17889,6 +18217,13 @@ packages: graceful-fs: 4.2.11 tapable: 2.2.1 + /enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: true + /enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -17914,7 +18249,6 @@ packages: /err-code@3.0.1: resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} - dev: false /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} @@ -17932,7 +18266,6 @@ packages: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} dependencies: stackframe: 1.3.4 - dev: false /errorhandler@1.5.1: resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} @@ -17940,28 +18273,27 @@ packages: dependencies: accepts: 1.3.8 escape-html: 1.0.3 - dev: false - /es-abstract@1.22.2: - resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 - has: 1.0.4 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.5 + hasown: 2.0.0 + internal-slot: 1.0.6 is-array-buffer: 3.0.2 is-callable: 1.2.7 is-negative-zero: 2.0.2 @@ -17970,7 +18302,7 @@ packages: is-string: 1.0.7 is-typed-array: 1.1.12 is-weakref: 1.0.2 - object-inspect: 1.12.3 + object-inspect: 1.13.1 object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.5.1 @@ -17984,7 +18316,7 @@ packages: typed-array-byte-offset: 1.0.0 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true /es-array-method-boxes-properly@1.0.0: @@ -17994,8 +18326,8 @@ packages: /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 is-arguments: 1.1.1 is-map: 2.0.2 @@ -18009,17 +18341,17 @@ packages: resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} dependencies: asynciterator.prototype: 1.0.0 - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - es-set-tostringtag: 2.0.1 - function-bind: 1.1.1 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.2 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 globalthis: 1.0.3 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.5 + internal-slot: 1.0.6 iterator.prototype: 1.1.2 safe-array-concat: 1.0.1 dev: true @@ -18027,19 +18359,19 @@ packages: /es-module-lexer@1.3.1: resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 - has: 1.0.4 + get-intrinsic: 1.2.2 has-tostringtag: 1.0.0 + hasown: 2.0.0 dev: true - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - has: 1.0.4 + hasown: 2.0.0 dev: true /es-to-primitive@1.2.1: @@ -18073,13 +18405,11 @@ packages: /es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: false /es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} dependencies: es6-promise: 4.2.8 - dev: false /es6-symbol@3.1.3: resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} @@ -18186,6 +18516,36 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: true + /esbuild@0.19.5: + resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.5 + '@esbuild/android-arm64': 0.19.5 + '@esbuild/android-x64': 0.19.5 + '@esbuild/darwin-arm64': 0.19.5 + '@esbuild/darwin-x64': 0.19.5 + '@esbuild/freebsd-arm64': 0.19.5 + '@esbuild/freebsd-x64': 0.19.5 + '@esbuild/linux-arm': 0.19.5 + '@esbuild/linux-arm64': 0.19.5 + '@esbuild/linux-ia32': 0.19.5 + '@esbuild/linux-loong64': 0.19.5 + '@esbuild/linux-mips64el': 0.19.5 + '@esbuild/linux-ppc64': 0.19.5 + '@esbuild/linux-riscv64': 0.19.5 + '@esbuild/linux-s390x': 0.19.5 + '@esbuild/linux-x64': 0.19.5 + '@esbuild/netbsd-x64': 0.19.5 + '@esbuild/openbsd-x64': 0.19.5 + '@esbuild/sunos-x64': 0.19.5 + '@esbuild/win32-arm64': 0.19.5 + '@esbuild/win32-ia32': 0.19.5 + '@esbuild/win32-x64': 0.19.5 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -18249,8 +18609,8 @@ packages: '@typescript-eslint/parser': 5.62.0(eslint@8.19.0)(typescript@5.1.6) eslint: 8.19.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.28.1)(eslint@8.19.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.19.0) + eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.29.0)(eslint@8.19.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.19.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.19.0) eslint-plugin-react: 7.33.2(eslint@8.19.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.19.0) @@ -18269,13 +18629,13 @@ packages: eslint: 8.19.0 dev: true - /eslint-config-prettier@8.10.0(eslint@8.51.0): + /eslint-config-prettier@8.10.0(eslint@8.52.0): resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.51.0 + eslint: 8.52.0 dev: true /eslint-config-react@1.1.7: @@ -18286,13 +18646,13 @@ packages: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7(supports-color@8.1.1) - is-core-module: 2.13.0 + is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true - /eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.28.1)(eslint@8.19.0): + /eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.29.0)(eslint@8.19.0): resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==} engines: {node: '>=4'} peerDependencies: @@ -18301,7 +18661,7 @@ packages: dependencies: debug: 4.3.4(supports-color@8.1.1) eslint: 8.19.0 - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.19.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.19.0) glob: 7.2.3 is-glob: 4.0.3 resolve: 1.22.8 @@ -18335,13 +18695,13 @@ packages: debug: 3.2.7(supports-color@8.1.1) eslint: 8.19.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.28.1)(eslint@8.19.0) + eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.29.0)(eslint@8.19.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.19.0): - resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + /eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.19.0): + resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -18360,8 +18720,8 @@ packages: eslint: 8.19.0 eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.19.0) - has: 1.0.4 - is-core-module: 2.13.0 + hasown: 2.0.0 + is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.7 @@ -18381,8 +18741,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.23.1 - aria-query: 5.1.3 + '@babel/runtime': 7.23.2 + aria-query: 5.3.0 array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.7 @@ -18513,18 +18873,19 @@ packages: - supports-color dev: true - /eslint@8.51.0: - resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} + /eslint@8.52.0: + resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) '@eslint-community/regexpp': 4.9.1 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.51.0 - '@humanwhocodes/config-array': 0.11.11 + '@eslint/js': 8.52.0 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -18704,8 +19065,8 @@ packages: /ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} dependencies: - '@types/pbkdf2': 3.1.0 - '@types/secp256k1': 4.0.4 + '@types/pbkdf2': 3.1.1 + '@types/secp256k1': 4.0.5 blakejs: 1.2.1 browserify-aes: 1.2.0 bs58check: 2.1.2 @@ -18745,12 +19106,12 @@ packages: ethers: ^5.7.2 dependencies: '@ethereum-waffle/chai': 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) - '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.1)(typescript@4.9.5) + '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@4.9.5) '@ethereum-waffle/mock-contract': 4.0.4(ethers@5.7.2) '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) ethers: 5.7.2 solc: 0.8.15 - typechain: 8.3.1(typescript@4.9.5) + typechain: 8.3.2(typescript@4.9.5) transitivePeerDependencies: - '@ensdomains/ens' - '@ensdomains/resolver' @@ -18783,7 +19144,7 @@ packages: resolution: {integrity: sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==} engines: {node: '>=10.0.0'} dependencies: - '@types/bn.js': 5.1.2 + '@types/bn.js': 5.1.3 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 @@ -18794,7 +19155,7 @@ packages: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} dependencies: - '@types/bn.js': 5.1.2 + '@types/bn.js': 5.1.3 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 @@ -18867,7 +19228,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 require-like: 0.1.2 dev: false @@ -19060,6 +19421,13 @@ packages: /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + /extension-port-stream@2.1.1: + resolution: {integrity: sha512-qknp5o5rj2J9CRKfVB8KJr+uXQlrojNZzdESUPhKYLXf97TPcGf6qWWKmpsNNtUyOdzFhab1ON0jzouNxHHvow==} + engines: {node: '>=12.0.0'} + dependencies: + webextension-polyfill: 0.10.0 + dev: false + /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -19072,7 +19440,6 @@ packages: /extract-files@11.0.0: resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} engines: {node: ^12.20 || >= 14.13} - dev: false /extract-zip@2.0.1(supports-color@8.1.1): resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} @@ -19083,7 +19450,7 @@ packages: get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.10.1 + '@types/yauzl': 2.10.2 transitivePeerDependencies: - supports-color dev: true @@ -19096,14 +19463,12 @@ packages: /eyes@0.1.8: resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} engines: {node: '> 0.1.90'} - dev: false /fast-base64-decode@1.0.0: resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} /fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - dev: false /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -19114,7 +19479,6 @@ packages: /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - dev: false /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} @@ -19129,10 +19493,24 @@ packages: /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + /fast-json-stringify@1.21.0: + resolution: {integrity: sha512-xY6gyjmHN3AK1Y15BCbMpeO9+dea5ePVsp3BouHCdukcx0hOHbXwFhRodhcI0NpZIgDChSeAKkHW9YjKvhwKBA==} + dependencies: + ajv: 6.12.6 + deepmerge: 4.3.1 + string-similarity: 4.0.4 + dev: false + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-levenshtein@3.0.0: + resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} + dependencies: + fastest-levenshtein: 1.0.16 + dev: true + /fast-loops@1.1.3: resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} dev: false @@ -19141,7 +19519,6 @@ packages: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} dependencies: fast-decode-uri-component: 1.0.1 - dev: false /fast-redact@3.3.0: resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} @@ -19164,7 +19541,6 @@ packages: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} dependencies: punycode: 1.4.1 - dev: false /fast-write-atomic@0.2.1: resolution: {integrity: sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw==} @@ -19175,7 +19551,6 @@ packages: hasBin: true dependencies: strnum: 1.0.5 - dev: false /fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} @@ -19211,7 +19586,6 @@ packages: /fbjs-css-vars@1.0.2: resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} - dev: false /fbjs@3.0.5: resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} @@ -19225,7 +19599,6 @@ packages: ua-parser-js: 1.0.36 transitivePeerDependencies: - encoding - dev: false /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -19246,7 +19619,6 @@ packages: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.2.1 - dev: false /fets@0.1.5: resolution: {integrity: sha512-mL/ya591WOgCP1yBBPbp8E37nynj8QQF6iQCUVl0aHDL80BZ9SOL4BcKBy0dnKdC+clnnAkMm05KB9hsj4m4jQ==} @@ -19263,7 +19635,6 @@ packages: tslib: 2.6.2 zod: 3.22.4 zod-to-json-schema: 3.21.4(zod@3.22.4) - dev: false /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} @@ -19279,7 +19650,7 @@ packages: flat-cache: 3.1.1 dev: true - /file-loader@6.2.0(webpack@5.88.2): + /file-loader@6.2.0(webpack@5.89.0): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -19287,7 +19658,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: false /file-selector@0.6.0: @@ -19326,6 +19697,12 @@ packages: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} dev: false + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: true + /filename-reserved-regex@2.0.0: resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} engines: {node: '>=4'} @@ -19387,7 +19764,6 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: false /finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} @@ -19410,7 +19786,6 @@ packages: commondir: 1.0.1 make-dir: 2.1.0 pkg-dir: 3.0.0 - dev: false /find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} @@ -19470,7 +19845,6 @@ packages: engines: {node: '>=6'} dependencies: locate-path: 3.0.0 - dev: false /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -19523,12 +19897,10 @@ packages: /flow-enums-runtime@0.0.5: resolution: {integrity: sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ==} - dev: false /flow-parser@0.206.0: resolution: {integrity: sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==} engines: {node: '>=0.4.0'} - dev: false /flux@4.0.4(react@18.2.0): resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} @@ -19570,7 +19942,6 @@ packages: /foreach@2.0.6: resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} - dev: false /foreground-child@2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} @@ -19591,7 +19962,7 @@ packages: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true - /fork-ts-checker-webpack-plugin@6.5.3(typescript@4.9.5)(webpack@5.88.2): + /fork-ts-checker-webpack-plugin@6.5.3(typescript@4.9.5)(webpack@5.89.0): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -19606,7 +19977,7 @@ packages: optional: true dependencies: '@babel/code-frame': 7.22.13 - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 @@ -19619,7 +19990,7 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: false /form-data@2.3.3: @@ -19631,6 +20002,15 @@ packages: mime-types: 2.1.35 dev: true + /form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -19644,9 +20024,8 @@ packages: engines: {node: '>=12.20.0'} dependencies: fetch-blob: 3.2.0 - dev: false - /formik-mui-x-date-pickers@0.0.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.13)(@mui/system@5.14.13)(@mui/x-date-pickers@5.0.20)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3): + /formik-mui-x-date-pickers@0.0.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(@mui/system@5.14.14)(@mui/x-date-pickers@5.0.20)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3): resolution: {integrity: sha512-IxZsY6er+g0eNsucIDHcNs6DLaPDdG14IYx/lS2HSuKnTgV4vGEWpXyGMpkY/vGyh+W3N5U4TrBVu+7eRb5rLA==} peerDependencies: '@emotion/react': '>=11.5.0' @@ -19658,17 +20037,17 @@ packages: react: '>=17.0.2' tiny-warning: '>=1.0.3' dependencies: - '@emotion/react': 11.11.1(@types/react@18.2.28)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.28)(react@18.2.0) - '@mui/material': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.28)(react@18.2.0) - '@mui/x-date-pickers': 5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.13)(@mui/system@5.14.13)(@types/react@18.2.28)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) + '@mui/material': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react@18.2.0) + '@mui/x-date-pickers': 5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(@mui/system@5.14.14)(@types/react@18.2.31)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) formik: 2.4.5(react@18.2.0) react: 18.2.0 tiny-warning: 1.0.3 dev: false - /formik-mui@5.0.0-alpha.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.13)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3): + /formik-mui@5.0.0-alpha.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3): resolution: {integrity: sha512-tcY8B4I3N2UK9ghgVpeBWsXGMDe1y4LVKwI8GiUbLKGB86fI/CN9UMr4FuNo6kzNXvO42LFNmCxdEVzovNCyYQ==} peerDependencies: '@emotion/react': '>=11.5.0' @@ -19678,9 +20057,9 @@ packages: react: '>=17.0.2' tiny-warning: '>=1.0.3' dependencies: - '@emotion/react': 11.11.1(@types/react@18.2.28)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.28)(react@18.2.0) - '@mui/material': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) + '@mui/material': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) formik: 2.4.5(react@18.2.0) react: 18.2.0 tiny-warning: 1.0.3 @@ -19691,7 +20070,7 @@ packages: peerDependencies: react: '>=16.8.0' dependencies: - '@types/hoist-non-react-statics': 3.3.3 + '@types/hoist-non-react-statics': 3.3.4 deepmerge: 2.2.1 hoist-non-react-statics: 3.3.2 lodash: 4.17.21 @@ -19709,8 +20088,8 @@ packages: /fp-ts@1.19.3: resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} - /fraction.js@4.3.6: - resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==} + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: false /freeport-promise@2.0.0: @@ -19789,6 +20168,20 @@ packages: jsonfile: 6.1.0 universalify: 2.0.0 + /fs-jetpack@4.3.1: + resolution: {integrity: sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ==} + dependencies: + minimatch: 3.1.2 + rimraf: 2.7.1 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + /fs-monkey@1.0.5: resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} @@ -19814,16 +20207,16 @@ packages: requiresBuild: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} /function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 functions-have-names: 1.2.3 dev: true @@ -19839,7 +20232,7 @@ packages: hasBin: true dependencies: '@trufflesuite/bigint-buffer': 1.1.10 - '@types/bn.js': 5.1.2 + '@types/bn.js': 5.1.3 '@types/lru-cache': 5.1.1 '@types/seedrandom': 3.0.1 emittery: 0.10.0 @@ -19860,6 +20253,12 @@ packages: - '@types/lru-cache' - '@types/seedrandom' + /generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + dependencies: + is-property: 1.0.2 + dev: false + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -19876,17 +20275,16 @@ packages: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: - function-bind: 1.1.1 - has: 1.0.4 + function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 + hasown: 2.0.0 /get-iterator@1.0.2: resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==} - dev: false /get-iterator@2.0.1: resolution: {integrity: sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg==} @@ -19953,8 +20351,8 @@ packages: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 dev: true /get-tsconfig@4.7.2: @@ -20099,6 +20497,16 @@ packages: minimatch: 5.1.6 once: 1.4.0 + /glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.10.1 + dev: true + /global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} @@ -20188,6 +20596,7 @@ packages: ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 + dev: true /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -20222,10 +20631,48 @@ packages: pinkie-promise: 2.0.1 dev: true + /gluegun@5.1.2(debug@4.3.4): + resolution: {integrity: sha512-Cwx/8S8Z4YQg07a6AFsaGnnnmd8mN17414NcPS3OoDtZRwxgsvwRNJNg69niD6fDa8oNwslCG0xH7rEpRNNE/g==} + hasBin: true + dependencies: + apisauce: 2.1.6(debug@4.3.4) + app-module-path: 2.2.0 + cli-table3: 0.6.0 + colors: 1.4.0 + cosmiconfig: 7.0.1 + cross-spawn: 7.0.3 + ejs: 3.1.6 + enquirer: 2.3.6 + execa: 5.1.1 + fs-jetpack: 4.3.1 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.lowercase: 4.3.0 + lodash.lowerfirst: 4.3.1 + lodash.pad: 4.5.1 + lodash.padend: 4.6.1 + lodash.padstart: 4.6.1 + lodash.repeat: 4.1.0 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.trim: 4.5.1 + lodash.trimend: 4.5.1 + lodash.trimstart: 4.5.1 + lodash.uppercase: 4.3.0 + lodash.upperfirst: 4.3.1 + ora: 4.0.2 + pluralize: 8.0.0 + semver: 7.3.5 + which: 2.0.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - debug + dev: true + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 /got@8.3.2: resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==} @@ -20233,7 +20680,7 @@ packages: dependencies: '@sindresorhus/is': 0.7.0 '@types/keyv': 3.1.4 - '@types/responselike': 1.0.1 + '@types/responselike': 1.0.2 cacheable-request: 2.1.4 decompress-response: 3.3.0 duplexer3: 0.1.5 @@ -20259,7 +20706,7 @@ packages: '@sindresorhus/is': 0.14.0 '@szmarczak/http-timer': 1.1.2 '@types/keyv': 3.1.4 - '@types/responselike': 1.0.1 + '@types/responselike': 1.0.2 cacheable-request: 6.1.0 decompress-response: 3.3.0 duplexer3: 0.1.5 @@ -20284,6 +20731,20 @@ packages: graphql: ^16.6.0 dependencies: graphql: 16.8.1 + + /graphql-jit@0.8.2(graphql@16.8.1): + resolution: {integrity: sha512-P9KtM/UY4JTtHVRqRlZzFXPmDEtps1Bd27Mvj/naQIa5d0j83zPxAx4jewq1wueF3UEZu1JFZwX1XVBBkoo1Mg==} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + fast-json-stringify: 1.21.0 + generate-function: 2.3.1 + graphql: 16.8.1 + json-schema: 0.4.0 + lodash.memoize: 4.1.2 + lodash.merge: 4.6.2 + lodash.mergewith: 4.6.2 dev: false /graphql-tag@2.12.6(graphql@16.8.1): @@ -20294,7 +20755,6 @@ packages: dependencies: graphql: 16.8.1 tslib: 2.6.2 - dev: false /graphql-ws@5.12.1(graphql@16.8.1): resolution: {integrity: sha512-umt4f5NnMK46ChM2coO36PTFhHouBrK9stWWBczERguwYrGnPNxJ9dimU6IyOBfOkC6Izhkg4H8+F51W/8CYDg==} @@ -20303,16 +20763,14 @@ packages: graphql: ^16.6.0 dependencies: graphql: 16.8.1 - dev: false - /graphql-ws@5.14.1(graphql@16.8.1): - resolution: {integrity: sha512-aqkls1espsygP1PfkAuuLIV96IbztQ6EaADse97pw8wRIMT3+AL/OYfS8V2iCRkc0gzckitoDRGCQEdnySggiA==} + /graphql-ws@5.14.2(graphql@16.8.1): + resolution: {integrity: sha512-LycmCwhZ+Op2GlHz4BZDsUYHKRiiUz+3r9wbhBATMETNlORQJAaFlAgTFoeRh6xQoQegwYwIylVD1Qns9/DA3w==} engines: {node: '>=10'} peerDependencies: graphql: ^16.6.0 dependencies: graphql: 16.8.1 - dev: false /graphql-yoga@3.9.1(graphql@16.8.1): resolution: {integrity: sha512-BB6EkN64VBTXWmf9Kym2OsVZFzBC0mAsQNo9eNB5xIr3t+x7qepQ34xW5A353NWol3Js3xpzxwIKFVF6l9VsPg==} @@ -20332,6 +20790,25 @@ packages: graphql: 16.8.1 lru-cache: 7.18.3 tslib: 2.6.2 + + /graphql-yoga@5.0.0(graphql@16.8.1): + resolution: {integrity: sha512-ZvZlO8MHMDWuLRoDhvJQnXg8SOJD0iDaCA+M/zWuD26AlhEugOEbpnhw/645oqXTYtvHsM91WyxtV7p5XJWYMg==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@envelop/core': 5.0.0 + '@graphql-tools/executor': 1.2.0(graphql@16.8.1) + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-yoga/logger': 2.0.0 + '@graphql-yoga/subscription': 5.0.0 + '@whatwg-node/fetch': 0.9.13 + '@whatwg-node/server': 0.9.15 + dset: 3.1.2 + graphql: 16.8.1 + lru-cache: 10.0.1 + tslib: 2.6.2 dev: false /graphql@16.8.1: @@ -20468,7 +20945,7 @@ packages: '@nomicfoundation/ethereumjs-vm': 7.0.0 '@nomicfoundation/solidity-analyzer': 0.1.1 '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.2 + '@types/bn.js': 5.1.3 '@types/lru-cache': 5.1.1 abort-controller: 3.0.0 adm-zip: 0.4.16 @@ -20494,16 +20971,16 @@ packages: mocha: 10.2.0 p-map: 4.0.0 qs: 6.11.2 - raw-body: 2.5.1 + raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 solc: 0.7.3(debug@4.3.4) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.1(@types/node@18.15.13)(typescript@4.9.5) + ts-node: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) tsort: 0.0.1 typescript: 4.9.5 - undici: 5.26.0 + undici: 5.26.5 uuid: 8.3.2 ws: 7.5.9 transitivePeerDependencies: @@ -20538,7 +21015,7 @@ packages: '@nomicfoundation/ethereumjs-vm': 7.0.0 '@nomicfoundation/solidity-analyzer': 0.1.1 '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.2 + '@types/bn.js': 5.1.3 '@types/lru-cache': 5.1.1 abort-controller: 3.0.0 adm-zip: 0.4.16 @@ -20564,7 +21041,7 @@ packages: mocha: 10.2.0 p-map: 4.0.0 qs: 6.11.2 - raw-body: 2.5.1 + raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 solc: 0.7.3(debug@4.3.4) @@ -20572,7 +21049,7 @@ packages: stacktrace-parser: 0.1.10 tsort: 0.0.1 typescript: 5.1.6 - undici: 5.26.0 + undici: 5.26.5 uuid: 8.3.2 ws: 7.5.9 transitivePeerDependencies: @@ -20593,16 +21070,15 @@ packages: /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - requiresBuild: true /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} @@ -20636,6 +21112,7 @@ packages: /has@1.0.4: resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} + dev: true /hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} @@ -20647,7 +21124,6 @@ packages: /hash-it@6.0.0: resolution: {integrity: sha512-KHzmSFx1KwyMPw0kXeeUD752q/Kfbzhy6dAZrjXV9kAIXGqzGvv8vhkUqj+2MGZldTo0IBpw6v7iWE7uxsvH0w==} - dev: false /hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} @@ -20667,10 +21143,16 @@ packages: resolution: {integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==} dev: false + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + /hast-to-hyperscript@9.0.1: resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 comma-separated-tokens: 1.0.8 property-information: 5.6.0 space-separated-tokens: 1.1.5 @@ -20697,7 +21179,7 @@ packages: /hast-util-raw@6.0.1: resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==} dependencies: - '@types/hast': 2.3.6 + '@types/hast': 2.3.7 hast-util-from-parse5: 6.0.1 hast-util-to-parse5: 6.0.0 html-void-elements: 1.0.5 @@ -20726,7 +21208,7 @@ packages: /hastscript@6.0.0: resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} dependencies: - '@types/hast': 2.3.6 + '@types/hast': 2.3.7 comma-separated-tokens: 1.0.8 hast-util-parse-selector: 2.2.5 property-information: 5.6.0 @@ -20742,7 +21224,6 @@ packages: dependencies: capital-case: 1.0.4 tslib: 2.6.2 - dev: false /headers-polyfill@3.2.5: resolution: {integrity: sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==} @@ -20753,20 +21234,17 @@ packages: /hermes-estree@0.12.0: resolution: {integrity: sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw==} - dev: false /hermes-parser@0.12.0: resolution: {integrity: sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw==} dependencies: hermes-estree: 0.12.0 - dev: false /hermes-profile-transformer@0.0.6: resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} engines: {node: '>=8'} dependencies: source-map: 0.7.4 - dev: false /hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} @@ -20775,7 +21253,7 @@ packages: /history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 loose-envify: 1.4.0 resolve-pathname: 3.0.0 tiny-invariant: 1.3.1 @@ -20814,7 +21292,6 @@ packages: /hotscript@1.0.13: resolution: {integrity: sha512-C++tTF1GqkGYecL+2S1wJTfoH6APGAsbb7PAWQ3iVIwgG/EFseAfEVOKFgAFq4yK3+6j1EjUD4UQ9dRJHX/sSQ==} - dev: false /hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -20862,7 +21339,7 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.21.0 + terser: 5.22.0 /html-rewriter-wasm@0.4.1: resolution: {integrity: sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q==} @@ -20877,25 +21354,25 @@ packages: resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} dev: false - /html-webpack-plugin@4.5.2(webpack@5.88.2): + /html-webpack-plugin@4.5.2(webpack@5.89.0): resolution: {integrity: sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==} engines: {node: '>=6.9'} peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: '@types/html-minifier-terser': 5.1.2 - '@types/tapable': 1.0.9 - '@types/webpack': 4.41.34 + '@types/tapable': 1.0.10 + '@types/webpack': 4.41.35 html-minifier-terser: 5.1.1 loader-utils: 1.4.2 lodash: 4.17.21 pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: true - /html-webpack-plugin@5.5.3(webpack@5.88.2): + /html-webpack-plugin@5.5.3(webpack@5.89.0): resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} engines: {node: '>=10.13.0'} peerDependencies: @@ -20906,7 +21383,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) /html2canvas@1.4.1: resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} @@ -20986,7 +21463,7 @@ packages: - supports-color dev: true - /http-proxy-middleware@2.0.6(@types/express@4.17.19)(debug@4.3.4): + /http-proxy-middleware@2.0.6(@types/express@4.17.20)(debug@4.3.4): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -20995,8 +21472,8 @@ packages: '@types/express': optional: true dependencies: - '@types/express': 4.17.19 - '@types/http-proxy': 1.17.12 + '@types/express': 4.17.20 + '@types/http-proxy': 1.17.13 http-proxy: 1.18.1(debug@4.3.4) is-glob: 4.0.3 is-plain-obj: 3.0.0 @@ -21026,7 +21503,7 @@ packages: dependencies: assert-plus: 1.0.0 jsprim: 1.4.2 - sshpk: 1.17.0 + sshpk: 1.18.0 dev: true /http-signature@1.3.6: @@ -21035,7 +21512,7 @@ packages: dependencies: assert-plus: 1.0.0 jsprim: 2.0.2 - sshpk: 1.17.0 + sshpk: 1.18.0 dev: true /https-proxy-agent@5.0.1: @@ -21077,6 +21554,11 @@ packages: hasBin: true dev: true + /hyperlinker@1.0.0: + resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==} + engines: {node: '>=4'} + dev: true + /hyphenate-style-name@1.0.4: resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} dev: false @@ -21126,11 +21608,9 @@ packages: hasBin: true dependencies: queue: 6.0.2 - dev: false /immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: false /immediate@3.2.3: resolution: {integrity: sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==} @@ -21147,7 +21627,10 @@ packages: /immutable@3.7.6: resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} engines: {node: '>=0.8.0'} - dev: false + + /immutable@4.2.1: + resolution: {integrity: sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==} + dev: true /immutable@4.3.4: resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} @@ -21158,7 +21641,6 @@ packages: dependencies: caller-path: 2.0.0 resolve-from: 3.0.0 - dev: false /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -21170,7 +21652,6 @@ packages: /import-from@4.0.0: resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} engines: {node: '>=12.2'} - dev: false /import-lazy@2.1.0: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} @@ -21300,7 +21781,6 @@ packages: interface-store: 2.0.2 nanoid: 3.3.6 uint8arrays: 3.1.1 - dev: false /interface-datastore@7.0.4: resolution: {integrity: sha512-Q8LZS/jfFFHz6XyZazLTAc078SSCoa27ZPBOfobWdpDiFO7FqPA2yskitUJIhaCgxNK8C+/lMBUTBNfVIDvLiw==} @@ -21321,7 +21801,6 @@ packages: /interface-store@2.0.2: resolution: {integrity: sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg==} - dev: false /interface-store@3.0.4: resolution: {integrity: sha512-OjHUuGXbH4eXSBx1TF1tTySvjLldPLzRSYYXJwrEQI+XfH5JWYZofr0gVMV4F8XTwC+4V7jomDYkvGRmDSRKqQ==} @@ -21332,12 +21811,12 @@ packages: resolution: {integrity: sha512-SI2co5IAxAybBc9egRM2bXvHOa1RPh5SQQkO6di6t/aX92RbtzP4t8raB0l3GTzQmJADaBbzz8Tfa1QLgfMdGQ==} dev: false - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 - has: 1.0.4 + get-intrinsic: 1.2.2 + hasown: 2.0.0 side-channel: 1.0.4 dev: true @@ -21380,7 +21859,6 @@ packages: /ip-regex@4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} - dev: false /ip-regex@5.0.0: resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} @@ -21389,7 +21867,6 @@ packages: /ip@1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - dev: false /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -21536,7 +22013,7 @@ packages: '@libp2p/interface-peer-info': 1.0.10 '@libp2p/interface-pubsub': 3.0.7 '@multiformats/multiaddr': 11.6.1 - '@types/node': 18.15.13 + '@types/node': 18.18.6 interface-datastore: 7.0.4 ipfs-unixfs: 8.0.0 multiformats: 10.0.3 @@ -21556,6 +22033,18 @@ packages: - supports-color dev: false + /ipfs-core-types@0.9.0(node-fetch@3.3.2): + resolution: {integrity: sha512-VJ8vJSHvI1Zm7/SxsZo03T+zzpsg8pkgiIi5hfwSJlsrJ1E2v68QPlnLshGHUSYw89Oxq0IbETYl2pGTFHTWfg==} + deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details + dependencies: + interface-datastore: 6.1.1 + multiaddr: 10.0.1(node-fetch@3.3.2) + multiformats: 9.9.0 + transitivePeerDependencies: + - node-fetch + - supports-color + dev: true + /ipfs-core-utils@0.12.2(node-fetch@3.3.2): resolution: {integrity: sha512-RfxP3rPhXuqKIUmTAUhmee6fmaV3A7LMnjOUikRKpSyqESz/DR7aGK7tbttMxkZdkSEr0rFXlqbyb0vVwmn0wQ==} deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details @@ -21586,6 +22075,36 @@ packages: - supports-color dev: false + /ipfs-core-utils@0.13.0(node-fetch@3.3.2): + resolution: {integrity: sha512-HP5EafxU4/dLW3U13CFsgqVO5Ika8N4sRSIb/dTg16NjLOozMH31TXV0Grtu2ZWo1T10ahTzMvrfT5f4mhioXw==} + deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details + dependencies: + any-signal: 2.1.2 + blob-to-it: 1.0.4 + browser-readablestream-to-it: 1.0.3 + debug: 4.3.4(supports-color@8.1.1) + err-code: 3.0.1 + ipfs-core-types: 0.9.0(node-fetch@3.3.2) + ipfs-unixfs: 6.0.9 + ipfs-utils: 9.0.14 + it-all: 1.0.6 + it-map: 1.0.6 + it-peekable: 1.0.3 + it-to-stream: 1.0.0 + merge-options: 3.0.4 + multiaddr: 10.0.1(node-fetch@3.3.2) + multiaddr-to-uri: 8.0.0(node-fetch@3.3.2) + multiformats: 9.9.0 + nanoid: 3.3.6 + parse-duration: 1.1.0 + timeout-abort-controller: 2.0.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - encoding + - node-fetch + - supports-color + dev: true + /ipfs-core-utils@0.17.0: resolution: {integrity: sha512-mZbQ9ZkLGGR988hO0iCsB6FXDb0fS0vYRue07Ia8O3ODdKjZ69Jx7zYoYqpjTQQCgEN6RrX98aCTOw+ifziGvw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -21700,6 +22219,36 @@ packages: - utf-8-validate dev: false + /ipfs-http-client@55.0.0(node-fetch@3.3.2): + resolution: {integrity: sha512-GpvEs7C7WL9M6fN/kZbjeh4Y8YN7rY8b18tVWZnKxRsVwM25cIFrRI8CwNt3Ugin9yShieI3i9sPyzYGMrLNnQ==} + engines: {node: '>=14.0.0', npm: '>=3.0.0'} + deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details + dependencies: + '@ipld/dag-cbor': 7.0.3 + '@ipld/dag-json': 8.0.11 + '@ipld/dag-pb': 2.1.18 + abort-controller: 3.0.0 + any-signal: 2.1.2 + debug: 4.3.4(supports-color@8.1.1) + err-code: 3.0.1 + ipfs-core-types: 0.9.0(node-fetch@3.3.2) + ipfs-core-utils: 0.13.0(node-fetch@3.3.2) + ipfs-utils: 9.0.14 + it-first: 1.0.7 + it-last: 1.0.6 + merge-options: 3.0.4 + multiaddr: 10.0.1(node-fetch@3.3.2) + multiformats: 9.9.0 + native-abort-controller: 1.0.4(abort-controller@3.0.0) + parse-duration: 1.1.0 + stream-to-it: 0.2.4 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - encoding + - node-fetch + - supports-color + dev: true + /ipfs-http-client@59.0.0: resolution: {integrity: sha512-cFMU8ykKgxK2/uAw4Hthy2Kd+UuoFBno89DOdUqHYvmilKrmfV5vrYwviVWLYveIpkkaj8FB5x4TBxsiU99y0Q==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -21876,7 +22425,6 @@ packages: dependencies: err-code: 3.0.1 protobufjs: 6.11.4 - dev: false /ipfs-unixfs@8.0.0: resolution: {integrity: sha512-PAHtfyjiFs2PZBbeft5QRyXpVOvZ2zsGqID+zVRla7fjC1zRTqJkrGY9h6dF03ldGv/mSmFlNZh479qPC6aZKg==} @@ -21908,7 +22456,6 @@ packages: stream-to-it: 0.2.4 transitivePeerDependencies: - encoding - dev: false /ipns@0.16.0: resolution: {integrity: sha512-fBYkRjN3/fc6IQujUF4WBEyOXegK715w+wx9IErV6H2B5JXsMnHOBceUKn3L90dj+wJfHs6T+hM/OZiTT6mQCw==} @@ -21956,7 +22503,6 @@ packages: dependencies: is-relative: 1.0.0 is-windows: 1.0.2 - dev: false /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} @@ -21973,14 +22519,14 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-typed-array: 1.1.12 dev: true @@ -22010,7 +22556,7 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true @@ -22043,10 +22589,10 @@ packages: ci-info: 3.9.0 dev: true - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - has: 1.0.4 + hasown: 2.0.0 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -22062,7 +22608,6 @@ packages: /is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} - dev: false /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} @@ -22075,7 +22620,6 @@ packages: /is-electron@2.2.2: resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} - dev: false /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} @@ -22089,7 +22633,7 @@ packages: /is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-fullwidth-code-point@1.0.0: @@ -22152,7 +22696,6 @@ packages: engines: {node: '>=8'} dependencies: ip-regex: 4.3.0 - dev: false /is-ipfs@7.0.3: resolution: {integrity: sha512-IwjmN5DYrWQgk75dPX9WOFDbGpStJg6SLMLXXlxwpI3/SnwAIz3PwrdnxB+s2k+RjOTn9ueFIbGWxF2VMUYmLQ==} @@ -22175,7 +22718,6 @@ packages: resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} dependencies: tslib: 2.6.2 - dev: false /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -22277,16 +22819,20 @@ packages: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} dev: true + /is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + dev: false + /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: - '@types/estree': 1.0.2 + '@types/estree': 1.0.3 /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true @@ -22300,7 +22846,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-unc-path: 1.0.0 - dev: false /is-retry-allowed@1.2.0: resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} @@ -22319,7 +22864,7 @@ packages: /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-stream@1.1.0: @@ -22371,7 +22916,7 @@ packages: resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -22381,7 +22926,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: unc-path-regex: 0.1.2 - dev: false /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -22391,7 +22935,6 @@ packages: resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} dependencies: tslib: 2.6.2 - dev: false /is-url@1.2.4: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} @@ -22408,14 +22951,14 @@ packages: /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 dev: true /is-what@4.1.15: @@ -22438,7 +22981,6 @@ packages: /is-wsl@1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} - dev: false /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} @@ -22480,7 +23022,6 @@ packages: /iso-url@1.2.1: resolution: {integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==} engines: {node: '>=12'} - dev: false /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} @@ -22504,7 +23045,6 @@ packages: ws: '*' dependencies: ws: 7.5.9 - dev: false /isomorphic-ws@5.0.0(ws@8.12.0): resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} @@ -22519,15 +23059,13 @@ packages: ws: '*' dependencies: ws: 8.13.0 - dev: false /isomorphic-ws@5.0.0(ws@8.14.2): resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: ws: '*' dependencies: - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) - dev: false + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) /isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} @@ -22632,7 +23170,6 @@ packages: /it-all@1.0.6: resolution: {integrity: sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==} - dev: false /it-all@2.0.1: resolution: {integrity: sha512-9UuJcCRZsboz+HBQTNOau80Dw+ryGaHYFP/cPYzFBJBFcfDathMYnhHk4t52en9+fcyDGPTdLB+lFc1wzQIroA==} @@ -22676,7 +23213,6 @@ packages: /it-first@1.0.7: resolution: {integrity: sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==} - dev: false /it-first@2.0.1: resolution: {integrity: sha512-noC1oEQcWZZMUwq7VWxHNLML43dM+5bviZpfmkxkXlvBe60z7AFRqpZSga9uQBo792jKv9otnn1IjA4zwgNARw==} @@ -22704,7 +23240,6 @@ packages: dependencies: '@types/minimatch': 3.0.5 minimatch: 3.1.2 - dev: false /it-handshake@4.1.3: resolution: {integrity: sha512-V6Lt9A9usox9iduOX+edU1Vo94E6v9Lt9dOvg3ubFaw1qf5NCxXLi93Ao4fyCHWDYd8Y+DUhadwNtWVyn7qqLg==} @@ -22719,7 +23254,6 @@ packages: /it-last@1.0.6: resolution: {integrity: sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q==} - dev: false /it-last@2.0.1: resolution: {integrity: sha512-uVMedYW0wa2Cx0TAmcOCLbfuLLII7+vyURmhKa8Zovpd+aBTMsmINtsta2n364wJ5qsEDBH+akY1sUtAkaYBlg==} @@ -22756,7 +23290,6 @@ packages: /it-map@1.0.6: resolution: {integrity: sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ==} - dev: false /it-map@2.0.1: resolution: {integrity: sha512-a2GcYDHiAh/eSU628xlvB56LA98luXZnniH2GlD0IdBzf15shEq9rBeb0Rg3o1SWtNILUAwqmQxEXcewGCdvmQ==} @@ -22815,7 +23348,6 @@ packages: /it-peekable@1.0.3: resolution: {integrity: sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ==} - dev: false /it-peekable@2.0.1: resolution: {integrity: sha512-fJ/YTU9rHRhGJOM2hhQKKEfRM6uKB9r4yGGFLBHqp72ACC8Yi6+7/FhuBAMG8cpN6mLoj9auVX7ZJ3ul6qFpTA==} @@ -22914,7 +23446,6 @@ packages: p-defer: 3.0.0 p-fifo: 1.0.0 readable-stream: 3.6.2 - dev: false /it-ws@5.0.6: resolution: {integrity: sha512-TEEJQaGtkxgP/nGVq8dq48nPT85Afu8kwwvtDFLj4rQLWRhZcb26RWdXLdn9qhXkWPiWbK5H7JWBW1Bebj/SuQ==} @@ -22924,7 +23455,7 @@ packages: iso-url: 1.2.1 it-stream-types: 1.0.5 uint8arrays: 4.0.6 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -22934,7 +23465,7 @@ packages: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.4 set-function-name: 2.0.1 @@ -22948,16 +23479,49 @@ packages: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + /jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true + /javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} dev: true + /jayson@4.0.0: + resolution: {integrity: sha512-v2RNpDCMu45fnLzSk47vx7I+QUaOsox6f5X0CUlabAFwxoP+8MfAY0NQRFwOEYXIxm8Ih5y6OaEa5KYiQMkyAA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@types/connect': 3.4.37 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + JSONStream: 1.3.5 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.9) + json-stringify-safe: 5.0.1 + uuid: 8.3.2 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + /jayson@4.1.0: resolution: {integrity: sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==} engines: {node: '>=8'} hasBin: true dependencies: - '@types/connect': 3.4.36 + '@types/connect': 3.4.37 '@types/node': 12.20.55 '@types/ws': 7.4.7 JSONStream: 1.3.5 @@ -22990,7 +23554,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.13 + '@types/node': 18.18.6 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -23010,7 +23574,7 @@ packages: - babel-plugin-macros - supports-color - /jest-cli@29.7.0(@types/node@18.15.13)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@18.18.6)(ts-node@10.9.1): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -23024,10 +23588,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.13)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.13)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -23037,7 +23601,7 @@ packages: - supports-color - ts-node - /jest-config@29.7.0(@types/node@18.15.13)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@18.18.6)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -23052,7 +23616,7 @@ packages: '@babel/core': 7.23.2 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.13 + '@types/node': 18.18.6 babel-jest: 29.7.0(@babel/core@7.23.2) chalk: 4.1.2 ci-info: 3.9.0 @@ -23072,7 +23636,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.15.13)(typescript@4.9.5) + ts-node: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -23115,7 +23679,7 @@ packages: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 18.15.13 + '@types/node': 18.18.6 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -23132,7 +23696,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.13 + '@types/node': 18.18.6 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -23145,7 +23709,7 @@ packages: jest: optional: true dependencies: - jest: 29.7.0(@types/node@18.15.13)(ts-node@10.9.1) + jest: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) jest-diff: 29.7.0 jest-get-type: 29.6.3 dev: true @@ -23159,8 +23723,8 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.7 - '@types/node': 18.15.13 + '@types/graceful-fs': 4.1.8 + '@types/node': 18.18.6 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -23194,7 +23758,7 @@ packages: dependencies: '@babel/code-frame': 7.22.13 '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.1 + '@types/stack-utils': 2.0.2 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.5 @@ -23207,7 +23771,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.15.13 + '@types/node': 18.18.6 jest-util: 29.7.0 /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -23224,7 +23788,6 @@ packages: /jest-regex-util@27.5.1: resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: false /jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} @@ -23262,7 +23825,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.13 + '@types/node': 18.18.6 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -23292,7 +23855,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.13 + '@types/node': 18.18.6 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -23342,19 +23905,18 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.15.13 + '@types/node': 18.18.6 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 - dev: false /jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.15.13 + '@types/node': 18.18.6 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -23377,7 +23939,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.13 + '@types/node': 18.18.6 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -23388,7 +23950,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -23396,12 +23958,12 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@29.7.0(@types/node@18.15.13)(ts-node@10.9.1): + /jest@29.7.0(@types/node@18.18.6)(ts-node@10.9.1): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -23414,7 +23976,7 @@ packages: '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.13)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -23464,7 +24026,6 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - requiresBuild: true /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} @@ -23489,11 +24050,9 @@ packages: /jsc-android@250231.0.0: resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} - dev: false /jsc-safe-url@0.2.4: resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} - dev: false /jscodeshift@0.14.0(@babel/preset-env@7.23.2): resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} @@ -23523,7 +24082,6 @@ packages: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color - dev: false /jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} @@ -23558,7 +24116,7 @@ packages: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -23577,7 +24135,6 @@ packages: /json-bigint-patch@0.0.8: resolution: {integrity: sha512-xa0LTQsyaq8awYyZyuUsporWisZFiyqzxGW8CKM3t7oouf0GFAKYJnqAm6e9NLNBQOCtOLvy614DEiRX/rPbnA==} - dev: false /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -23606,7 +24163,6 @@ packages: resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} dependencies: foreach: 2.0.6 - dev: false /json-rpc-engine@6.1.0: resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} @@ -23616,6 +24172,15 @@ packages: eth-rpc-errors: 4.0.2 dev: false + /json-rpc-middleware-stream@4.2.3: + resolution: {integrity: sha512-4iFb0yffm5vo3eFKDbQgke9o17XBcLQ2c3sONrXSbcOLzP8LTojqo8hRGVgtJShhm5q4ZDSNq039fAx9o65E1w==} + engines: {node: '>=14.0.0'} + dependencies: + '@metamask/safe-event-emitter': 3.0.0 + json-rpc-engine: 6.1.0 + readable-stream: 2.3.8 + dev: false + /json-rpc-random-id@1.0.1: resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} dev: false @@ -23624,10 +24189,9 @@ packages: resolution: {integrity: sha512-h9WqLkTVpBbiaPb5OmeUpz/FBLS/kvIJw4oRCPiEisIu2WjMh+aai0QIY2LoOhRFx5r92taGLcerIrzxKBAP6g==} engines: {node: '>=16'} dependencies: - '@babel/runtime': 7.23.1 - '@types/json-schema': 7.0.13 + '@babel/runtime': 7.23.2 + '@types/json-schema': 7.0.14 ts-algebra: 1.2.2 - dev: false /json-schema-to-typescript@12.0.0: resolution: {integrity: sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==} @@ -23635,8 +24199,8 @@ packages: hasBin: true dependencies: '@bcherny/json-schema-ref-parser': 10.0.5-fork - '@types/json-schema': 7.0.13 - '@types/lodash': 4.14.199 + '@types/json-schema': 7.0.14 + '@types/lodash': 4.14.200 '@types/prettier': 2.7.3 cli-color: 2.0.3 get-stdin: 8.0.0 @@ -23658,7 +24222,6 @@ packages: /json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - dev: true /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -23676,7 +24239,6 @@ packages: /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true - requiresBuild: true dependencies: minimist: 1.2.8 dev: true @@ -23808,6 +24370,13 @@ packages: resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==} dependencies: json-buffer: 3.0.0 + dev: true + + /keyv@3.1.0: + resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + dependencies: + json-buffer: 3.0.0 + dev: false /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -23819,8 +24388,8 @@ packages: resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} dev: false - /khroma@2.0.0: - resolution: {integrity: sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==} + /khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} dev: false /kind-of@6.0.3: @@ -24032,7 +24601,7 @@ packages: resolution: {integrity: sha512-AeLaA+8KIhUhjpXZcs20+Pnf2wIBp+zdSYPD1IgGCF0PlMbTdCvaIqhPzpTSd3+e5k7NZlgpd/BvCOLgQbfm5Q==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - '@achingbrain/nat-port-mapper': 1.0.11 + '@achingbrain/nat-port-mapper': 1.0.12 '@libp2p/connection': 4.0.2 '@libp2p/crypto': 1.0.17 '@libp2p/interface-address-manager': 2.0.5 @@ -24109,7 +24678,6 @@ packages: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} dependencies: immediate: 3.0.6 - dev: false /lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -24192,7 +24760,7 @@ packages: /lit-html@2.8.0: resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} dependencies: - '@types/trusted-types': 2.0.4 + '@types/trusted-types': 2.0.5 dev: false /lit@2.7.5: @@ -24265,7 +24833,6 @@ packages: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} dependencies: lie: 3.1.1 - dev: false /locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} @@ -24280,7 +24847,6 @@ packages: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: false /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} @@ -24314,7 +24880,6 @@ packages: /lodash.clone@4.5.0: resolution: {integrity: sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==} - dev: false /lodash.curry@4.1.1: resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} @@ -24366,6 +24931,14 @@ packages: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} dev: true + /lodash.lowercase@4.3.0: + resolution: {integrity: sha512-UcvP1IZYyDKyEL64mmrwoA1AbFu5ahojhTtkOUr1K9dbuxzS9ev8i4TxMMGCqRC9TE8uDaSoufNAXxRPNTseVA==} + dev: true + + /lodash.lowerfirst@4.3.1: + resolution: {integrity: sha512-UUKX7VhP1/JL54NXg2aq/E1Sfnjjes8fNYTNkPU8ZmsaVeBvPHKdbNaN79Re5XRL01u6wbq3j0cbYZj71Fcu5w==} + dev: true + /lodash.map@4.6.0: resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} dev: true @@ -24375,20 +24948,34 @@ packages: /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - dev: true /lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} dev: true + /lodash.pad@4.5.1: + resolution: {integrity: sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==} + dev: true + + /lodash.padend@4.6.1: + resolution: {integrity: sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==} + dev: true + + /lodash.padstart@4.6.1: + resolution: {integrity: sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==} + dev: true + /lodash.pullall@4.2.0: resolution: {integrity: sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==} dev: false + /lodash.repeat@4.1.0: + resolution: {integrity: sha512-eWsgQW89IewS95ZOcr15HHCX6FVDxq3f2PNUIng3fyzsPev9imFQxIYdFZ6crl8L56UR6ZlGDLcEb3RZsCSSqw==} + dev: true + /lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true @@ -24399,11 +24986,21 @@ packages: /lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: false /lodash.topath@4.5.2: resolution: {integrity: sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==} - dev: false + + /lodash.trim@4.5.1: + resolution: {integrity: sha512-nJAlRl/K+eiOehWKDzoBVrSMhK0K3A3YQsUNXHQa5yIrKBAhsZgSu3KoAFoFT+mEgiyBHddZ0pRk1ITpIp90Wg==} + dev: true + + /lodash.trimend@4.5.1: + resolution: {integrity: sha512-lsD+k73XztDsMBKPKvzHXRKFNMohTjoTKIIo4ADLn5dA65LZ1BqlAvSXhR2rPEC3BgAUQnzMnorqDtqn2z4IHA==} + dev: true + + /lodash.trimstart@4.5.1: + resolution: {integrity: sha512-b/+D6La8tU76L/61/aN0jULWHkT0EeJCmVstPBn/K9MtD2qBW83AsBNrr63dKuWYwVMO7ucv13QNO/Ek/2RKaQ==} + dev: true /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -24416,6 +25013,10 @@ packages: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} dev: false + /lodash.uppercase@4.3.0: + resolution: {integrity: sha512-+Nbnxkj7s8K5U8z6KnEYPGUOGp3woZbB7Ecs7v3LkkjLQSm2kP9SKIILitN1ktn2mB/tmM9oSlku06I+/lH7QA==} + dev: true + /lodash.upperfirst@4.3.1: resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} dev: true @@ -24423,6 +25024,13 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + /log-symbols@3.0.0: + resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} + engines: {node: '>=8'} + dependencies: + chalk: 2.4.2 + dev: true + /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -24458,7 +25066,6 @@ packages: ansi-fragments: 0.2.1 dayjs: 1.11.10 yargs: 15.4.1 - dev: false /loglevel@1.8.1: resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} @@ -24467,11 +25074,9 @@ packages: /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - dev: false /long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false /longbits@1.1.0: resolution: {integrity: sha512-22U2exkkYy7sr7nuQJYx2NEZ2kEMsC69+BxM5h8auLvkVIJa+LwAB5mFIExnuW2dFuYXFOWsFMKXjaWiq/htYQ==} @@ -24492,8 +25097,8 @@ packages: dependencies: js-tokens: 4.0.0 - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: get-func-name: 2.0.2 dev: true @@ -24502,7 +25107,6 @@ packages: resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} dependencies: tslib: 2.6.2 - dev: false /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -24541,7 +25145,6 @@ packages: /lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - dev: false /lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} @@ -24621,7 +25224,6 @@ packages: /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} - dev: false /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} @@ -24645,6 +25247,12 @@ packages: hasBin: true dev: true + /matchstick-as@0.6.0: + resolution: {integrity: sha512-E36fWsC1AbCkBFt05VsDDRoFvGSdcZg6oZJrtIe/YDBbuFh8SKbR5FcoqDhNWqSN+F7bN/iS2u8Md0SM+4pUpw==} + dependencies: + wabt: 1.0.24 + dev: true + /mcl-wasm@0.7.9: resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==} engines: {node: '>=8.9.0'} @@ -24671,16 +25279,16 @@ packages: /mdast-util-definitions@5.1.2: resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: - '@types/mdast': 3.0.13 - '@types/unist': 2.0.8 + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 unist-util-visit: 4.1.2 dev: false /mdast-util-from-markdown@1.3.1: resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: - '@types/mdast': 3.0.13 - '@types/unist': 2.0.8 + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 decode-named-character-reference: 1.0.2 mdast-util-to-string: 3.2.0 micromark: 3.2.0 @@ -24698,8 +25306,8 @@ packages: /mdast-util-to-hast@10.0.1: resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} dependencies: - '@types/mdast': 3.0.13 - '@types/unist': 2.0.8 + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 mdast-util-definitions: 4.0.0 mdurl: 1.0.1 unist-builder: 2.0.3 @@ -24711,8 +25319,8 @@ packages: /mdast-util-to-hast@12.3.0: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: - '@types/hast': 2.3.6 - '@types/mdast': 3.0.13 + '@types/hast': 2.3.7 + '@types/mdast': 3.0.14 mdast-util-definitions: 5.1.2 micromark-util-sanitize-uri: 1.2.0 trim-lines: 3.0.1 @@ -24728,7 +25336,7 @@ packages: /mdast-util-to-string@3.2.0: resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} dependencies: - '@types/mdast': 3.0.13 + '@types/mdast': 3.0.14 dev: false /mdn-data@2.0.14: @@ -24754,7 +25362,7 @@ packages: /media-query-parser@2.0.2: resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 dev: false /media-typer@0.3.0: @@ -24781,7 +25389,6 @@ packages: /memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} - dev: false /memoizee@0.4.15: resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} @@ -24812,7 +25419,7 @@ packages: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} dependencies: - '@types/minimist': 1.2.3 + '@types/minimist': 1.2.4 camelcase-keys: 6.2.2 decamelize-keys: 1.1.1 hard-rejection: 2.1.0 @@ -24829,7 +25436,7 @@ packages: resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} engines: {node: '>=10'} dependencies: - '@types/minimist': 1.2.3 + '@types/minimist': 1.2.4 camelcase-keys: 6.2.2 decamelize: 1.2.0 decamelize-keys: 1.1.1 @@ -24851,7 +25458,6 @@ packages: engines: {node: '>=10'} dependencies: is-plain-obj: 2.1.0 - dev: false /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -24887,7 +25493,7 @@ packages: dayjs: 1.11.10 dompurify: 2.4.3 elkjs: 0.8.2 - khroma: 2.0.0 + khroma: 2.1.0 lodash-es: 4.17.21 non-layered-tidy-tree-layout: 2.0.2 stylis: 4.3.0 @@ -24896,7 +25502,7 @@ packages: web-worker: 1.2.0 dev: false - /meros@1.3.0(@types/node@18.15.13): + /meros@1.3.0(@types/node@18.18.6): resolution: {integrity: sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==} engines: {node: '>=13'} peerDependencies: @@ -24905,8 +25511,7 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 18.15.13 - dev: false + '@types/node': 18.18.6 /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -24921,12 +25526,10 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - dev: false /metro-cache-key@0.76.8: resolution: {integrity: sha512-buKQ5xentPig9G6T37Ww/R/bC+/V1MA5xU/D8zjnhlelsrPG6w6LtHUS61ID3zZcMZqYaELWk5UIadIdDsaaLw==} engines: {node: '>=16'} - dev: false /metro-cache@0.76.8: resolution: {integrity: sha512-QBJSJIVNH7Hc/Yo6br/U/qQDUpiUdRgZ2ZBJmvAbmAKp2XDzsapnMwK/3BGj8JNWJF7OLrqrYHsRsukSbUBpvQ==} @@ -24934,7 +25537,6 @@ packages: dependencies: metro-core: 0.76.8 rimraf: 3.0.2 - dev: false /metro-config@0.76.8: resolution: {integrity: sha512-SL1lfKB0qGHALcAk2zBqVgQZpazDYvYFGwCK1ikz0S6Y/CM2i2/HwuZN31kpX6z3mqjv/6KvlzaKoTb1otuSAA==} @@ -24952,7 +25554,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /metro-core@0.76.8: resolution: {integrity: sha512-sl2QLFI3d1b1XUUGxwzw/KbaXXU/bvFYrSKz6Sg19AdYGWFyzsgZ1VISRIDf+HWm4R/TJXluhWMEkEtZuqi3qA==} @@ -24960,7 +25561,6 @@ packages: dependencies: lodash.throttle: 4.1.1 metro-resolver: 0.76.8 - dev: false /metro-file-map@0.76.8: resolution: {integrity: sha512-A/xP1YNEVwO1SUV9/YYo6/Y1MmzhL4ZnVgcJC3VmHp/BYVOXVStzgVbWv2wILe56IIMkfXU+jpXrGKKYhFyHVw==} @@ -24982,7 +25582,6 @@ packages: fsevents: 2.3.3 transitivePeerDependencies: - supports-color - dev: false /metro-inspector-proxy@0.76.8: resolution: {integrity: sha512-Us5o5UEd4Smgn1+TfHX4LvVPoWVo9VsVMn4Ldbk0g5CQx3Gu0ygc/ei2AKPGTwsOZmKxJeACj7yMH2kgxQP/iw==} @@ -24999,21 +25598,18 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /metro-minify-terser@0.76.8: resolution: {integrity: sha512-Orbvg18qXHCrSj1KbaeSDVYRy/gkro2PC7Fy2tDSH1c9RB4aH8tuMOIXnKJE+1SXxBtjWmQ5Yirwkth2DyyEZA==} engines: {node: '>=16'} dependencies: - terser: 5.21.0 - dev: false + terser: 5.22.0 /metro-minify-uglify@0.76.8: resolution: {integrity: sha512-6l8/bEvtVaTSuhG1FqS0+Mc8lZ3Bl4RI8SeRIifVLC21eeSDp4CEBUWSGjpFyUDfi6R5dXzYaFnSgMNyfxADiQ==} engines: {node: '>=16'} dependencies: uglify-es: 3.3.9 - dev: false /metro-react-native-babel-preset@0.76.8(@babel/core@7.23.2): resolution: {integrity: sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==} @@ -25051,7 +25647,7 @@ packages: '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-runtime': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.2) @@ -25062,7 +25658,6 @@ packages: react-refresh: 0.4.3 transitivePeerDependencies: - supports-color - dev: false /metro-react-native-babel-transformer@0.76.8(@babel/core@7.23.2): resolution: {integrity: sha512-3h+LfS1WG1PAzhq8QF0kfXjxuXetbY/lgz8vYMQhgrMMp17WM1DNJD0gjx8tOGYbpbBC1qesJ45KMS4o5TA73A==} @@ -25077,20 +25672,17 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - dev: false /metro-resolver@0.76.8: resolution: {integrity: sha512-KccOqc10vrzS7ZhG2NSnL2dh3uVydarB7nOhjreQ7C4zyWuiW9XpLC4h47KtGQv3Rnv/NDLJYeDqaJ4/+140HQ==} engines: {node: '>=16'} - dev: false /metro-runtime@0.76.8: resolution: {integrity: sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==} engines: {node: '>=16'} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 react-refresh: 0.4.3 - dev: false /metro-source-map@0.76.8: resolution: {integrity: sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==} @@ -25106,7 +25698,6 @@ packages: vlq: 1.0.1 transitivePeerDependencies: - supports-color - dev: false /metro-symbolicate@0.76.8: resolution: {integrity: sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w==} @@ -25121,7 +25712,6 @@ packages: vlq: 1.0.1 transitivePeerDependencies: - supports-color - dev: false /metro-transform-plugins@0.76.8: resolution: {integrity: sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA==} @@ -25134,7 +25724,6 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - dev: false /metro-transform-worker@0.76.8: resolution: {integrity: sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ==} @@ -25157,7 +25746,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /metro@0.76.8: resolution: {integrity: sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg==} @@ -25217,7 +25805,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} @@ -25377,7 +25964,7 @@ packages: /micromark@3.2.0: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: - '@types/debug': 4.1.9 + '@types/debug': 4.1.10 debug: 4.3.4(supports-color@8.1.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 @@ -25444,7 +26031,6 @@ packages: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true - dev: false /mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} @@ -25467,14 +26053,14 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - /mini-css-extract-plugin@2.7.6(webpack@5.88.2): + /mini-css-extract-plugin@2.7.6(webpack@5.89.0): resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: schema-utils: 4.2.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: false /miniflare@2.11.0: @@ -25549,6 +26135,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -25570,10 +26163,35 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + /minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -25589,7 +26207,6 @@ packages: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} hasBin: true - dev: false /mlly@1.4.2: resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} @@ -25698,7 +26315,7 @@ packages: '@mswjs/interceptors': 0.17.10 '@open-draft/until': 1.0.3 '@types/cookie': 0.4.1 - '@types/js-levenshtein': 1.1.1 + '@types/js-levenshtein': 1.1.2 chalk: 4.1.2 chokidar: 3.5.3 cookie: 0.4.2 @@ -25727,7 +26344,6 @@ packages: transitivePeerDependencies: - node-fetch - supports-color - dev: false /multiaddr@10.0.1(node-fetch@3.3.2): resolution: {integrity: sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg==} @@ -25742,7 +26358,6 @@ packages: transitivePeerDependencies: - node-fetch - supports-color - dev: false /multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} @@ -25768,7 +26383,6 @@ packages: /multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} - dev: false /murmur-128@0.2.1: resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} @@ -25856,7 +26470,6 @@ packages: abort-controller: '*' dependencies: abort-controller: 3.0.0 - dev: false /native-fetch@3.0.0(node-fetch@2.7.0): resolution: {integrity: sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==} @@ -25864,7 +26477,6 @@ packages: node-fetch: '*' dependencies: node-fetch: 2.7.0 - dev: false /native-fetch@3.0.0(node-fetch@3.3.2): resolution: {integrity: sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==} @@ -25872,14 +26484,13 @@ packages: node-fetch: '*' dependencies: node-fetch: 3.3.2 - dev: false - /native-fetch@4.0.2(undici@5.26.0): + /native-fetch@4.0.2(undici@5.26.5): resolution: {integrity: sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==} peerDependencies: undici: '*' dependencies: - undici: 5.26.0 + undici: 5.26.5 dev: false /natural-compare-lite@1.4.0: @@ -25889,6 +26500,10 @@ packages: /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + /natural-orderby@2.0.3: + resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==} + dev: true + /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -25904,8 +26519,8 @@ packages: /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - /next@13.5.4(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==} + /next@13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==} engines: {node: '>=16.14.0'} hasBin: true peerDependencies: @@ -25919,25 +26534,25 @@ packages: sass: optional: true dependencies: - '@next/env': 13.5.4 + '@next/env': 13.5.6 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001547 + caniuse-lite: 1.0.30001553 postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) styled-jsx: 5.1.1(@babel/core@7.23.2)(react@18.2.0) watchpack: 2.4.0 optionalDependencies: - '@next/swc-darwin-arm64': 13.5.4 - '@next/swc-darwin-x64': 13.5.4 - '@next/swc-linux-arm64-gnu': 13.5.4 - '@next/swc-linux-arm64-musl': 13.5.4 - '@next/swc-linux-x64-gnu': 13.5.4 - '@next/swc-linux-x64-musl': 13.5.4 - '@next/swc-win32-arm64-msvc': 13.5.4 - '@next/swc-win32-ia32-msvc': 13.5.4 - '@next/swc-win32-x64-msvc': 13.5.4 + '@next/swc-darwin-arm64': 13.5.6 + '@next/swc-darwin-x64': 13.5.6 + '@next/swc-linux-arm64-gnu': 13.5.6 + '@next/swc-linux-arm64-musl': 13.5.6 + '@next/swc-linux-x64-gnu': 13.5.6 + '@next/swc-linux-x64-musl': 13.5.6 + '@next/swc-win32-arm64-msvc': 13.5.6 + '@next/swc-win32-ia32-msvc': 13.5.6 + '@next/swc-win32-x64-msvc': 13.5.6 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -25965,8 +26580,8 @@ packages: - supports-color dev: false - /nise@5.1.4: - resolution: {integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==} + /nise@5.1.5: + resolution: {integrity: sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==} dependencies: '@sinonjs/commons': 2.0.0 '@sinonjs/fake-timers': 10.3.0 @@ -25984,11 +26599,9 @@ packages: /nocache@3.0.4: resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} engines: {node: '>=12.0.0'} - dev: false /node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - dev: false /node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} @@ -25998,12 +26611,10 @@ packages: engines: {node: '>= 0.10.5'} dependencies: minimatch: 3.1.2 - dev: false /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} - dev: false /node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} @@ -26028,7 +26639,6 @@ packages: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - dev: false /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} @@ -26066,7 +26676,6 @@ packages: /node-stream-zip@1.15.0: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} engines: {node: '>=0.12.0'} - dev: false /nofilter@3.1.0: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} @@ -26104,7 +26713,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.13.0 + is-core-module: 2.13.1 semver: 7.5.4 validate-npm-package-license: 3.0.4 @@ -26113,7 +26722,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: remove-trailing-separator: 1.1.0 - dev: false /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -26175,7 +26783,6 @@ packages: /nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - dev: false /number-is-nan@1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} @@ -26237,7 +26844,6 @@ packages: /ob1@0.76.8: resolution: {integrity: sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==} engines: {node: '>=16'} - dev: false /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -26245,16 +26851,18 @@ packages: /object-inspect@1.10.3: resolution: {integrity: sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==} - dev: false /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 dev: true @@ -26262,11 +26870,16 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} + /object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + dev: true + /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 @@ -26275,18 +26888,18 @@ packages: resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /object.fromentries@2.0.7: resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /object.getownpropertydescriptors@2.1.7: @@ -26294,35 +26907,35 @@ packages: engines: {node: '>= 0.8'} dependencies: array.prototype.reduce: 1.0.6 - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 safe-array-concat: 1.0.1 dev: true /object.groupby@1.0.1: resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 dev: true /object.hasown@1.1.3: resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} dependencies: define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /object.values@1.1.7: resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /obliterator@2.0.4: @@ -26345,7 +26958,6 @@ packages: engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 - dev: false /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -26379,7 +26991,6 @@ packages: engines: {node: '>=8'} dependencies: is-wsl: 1.1.0 - dev: false /open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} @@ -26387,7 +26998,6 @@ packages: dependencies: is-docker: 2.2.1 is-wsl: 2.2.0 - dev: false /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} @@ -26399,7 +27009,6 @@ packages: /openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} - dev: false /opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} @@ -26438,6 +27047,19 @@ packages: type-check: 0.4.0 dev: true + /ora@4.0.2: + resolution: {integrity: sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==} + engines: {node: '>=8'} + dependencies: + chalk: 2.4.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.1 + is-interactive: 1.0.0 + log-symbols: 3.0.0 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + dev: true + /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -26497,7 +27119,6 @@ packages: /p-defer@3.0.0: resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} engines: {node: '>=8'} - dev: false /p-defer@4.0.0: resolution: {integrity: sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==} @@ -26523,7 +27144,6 @@ packages: dependencies: fast-fifo: 1.3.2 p-defer: 3.0.0 - dev: false /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} @@ -26570,7 +27190,6 @@ packages: engines: {node: '>=6'} dependencies: p-limit: 2.3.0 - dev: false /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} @@ -26715,7 +27334,6 @@ packages: /parse-duration@1.1.0: resolution: {integrity: sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==} - dev: false /parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} @@ -26735,7 +27353,6 @@ packages: is-absolute: 1.0.0 map-cache: 0.2.2 path-root: 0.1.1 - dev: false /parse-json@2.2.0: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} @@ -26808,6 +27425,13 @@ packages: resolution: {integrity: sha512-BSExi0rRnCHReJys6NocaK+cfTXNinAegfWBvr0JD3hiaEG7Nuc7r0CIdOJunXrs8gU/sbHQ9dxVAtiVQisjmg==} engines: {node: '>=8'} + /password-prompt@1.1.3: + resolution: {integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==} + dependencies: + ansi-escapes: 4.3.2 + cross-spawn: 7.0.3 + dev: true + /path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -26816,7 +27440,6 @@ packages: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false /path-exists@2.1.0: resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} @@ -26860,14 +27483,12 @@ packages: /path-root-regex@0.1.2: resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} engines: {node: '>=0.10.0'} - dev: false /path-root@0.1.1: resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} engines: {node: '>=0.10.0'} dependencies: path-root-regex: 0.1.2 - dev: false /path-scurry@1.10.1: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} @@ -27034,7 +27655,6 @@ packages: engines: {node: '>=6'} dependencies: find-up: 3.0.0 - dev: false /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} @@ -27068,18 +27688,18 @@ packages: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} dev: false - /playwright-core@1.38.1: - resolution: {integrity: sha512-tQqNFUKa3OfMf4b2jQ7aGLB8o9bS3bOY0yMEtldtC2+spf8QXG9zvXLTXUeRsoNuxEYMgLYR+NXfAa1rjKRcrg==} + /playwright-core@1.39.0: + resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} engines: {node: '>=16'} hasBin: true dev: true - /playwright@1.38.1: - resolution: {integrity: sha512-oRMSJmZrOu1FP5iu3UrCx8JEFRIMxLDM0c/3o4bpzU5Tz97BypefWf7TuTNPWeCe279TPal5RtPPZ+9lW/Qkow==} + /playwright@1.39.0: + resolution: {integrity: sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==} engines: {node: '>=16'} hasBin: true dependencies: - playwright-core: 1.38.1 + playwright-core: 1.39.0 optionalDependencies: fsevents: 2.3.2 dev: true @@ -27174,7 +27794,7 @@ packages: postcss-selector-parser: 6.0.13 dev: false - /postcss-loader@7.3.3(postcss@8.4.31)(typescript@4.9.5)(webpack@5.88.2): + /postcss-loader@7.3.3(postcss@8.4.31)(typescript@4.9.5)(webpack@5.89.0): resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -27185,7 +27805,7 @@ packages: jiti: 1.20.0 postcss: 8.4.31 semver: 7.5.4 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - typescript dev: false @@ -27540,6 +28160,12 @@ packages: solidity-comments-extractor: 0.0.7 dev: true + /prettier@1.19.1: + resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} + engines: {node: '>=4'} + hasBin: true + dev: true + /prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -27601,8 +28227,8 @@ packages: engines: {node: '>=4'} dev: false - /primereact@9.6.2(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wc7bvhR+9TiWkHADp02R10lnLbtmXiJ0Pdix8jgVh9HdHMaT2tbA6zPuhaRvA1PVT49hvrDXRCL9QB6YtaCi3w==} + /primereact@9.6.3(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-E1Apj4zHeEqFuNR43PFmcpYO51V17PDaVuZmYggEUxZHUo7XWoqkOGg7896SRRMDMBQcO3+HXdJQXi6DOWRV1g==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -27611,8 +28237,8 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.28 - '@types/react-transition-group': 4.4.7 + '@types/react': 18.2.31 + '@types/react-transition-group': 4.4.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) @@ -27676,7 +28302,6 @@ packages: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} dependencies: asap: 2.0.6 - dev: false /promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} @@ -27704,8 +28329,8 @@ packages: retry: 0.12.0 signal-exit: 3.0.7 - /property-expr@2.0.5: - resolution: {integrity: sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==} + /property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} dev: false /property-information@5.6.0: @@ -27734,9 +28359,8 @@ packages: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/long': 4.0.2 - '@types/node': 18.15.13 + '@types/node': 18.18.6 long: 4.0.0 - dev: false /protobufjs@7.2.5: resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} @@ -27753,7 +28377,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.15.13 + '@types/node': 18.18.6 long: 5.2.3 dev: false @@ -27767,13 +28391,11 @@ packages: uint8arraylist: 2.4.3 dev: false - /protons-runtime@5.0.2(uint8arraylist@2.4.3): - resolution: {integrity: sha512-eKppVrIS5dDh+Y61Yj4bDEOs2sQLQbQGIhr7EBiybPQhIMGBynzVXlYILPWl3Td1GDadobc8qevh5D+JwfG9bw==} - peerDependencies: - uint8arraylist: ^2.3.2 + /protons-runtime@5.1.0: + resolution: {integrity: sha512-9zUaikdZj2u9Z/lFKH+qmtewvQdB1fIKTyN5Iytpdlt0rsHrfw8a14CqXKMWY4ow25HyGuu4D8+7wUbjmI/sdA==} dependencies: - protobufjs: 7.2.5 uint8arraylist: 2.4.3 + uint8arrays: 4.0.6 dev: false /proxy-addr@2.0.7: @@ -27802,6 +28424,13 @@ packages: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true + /pump@1.0.3: + resolution: {integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: @@ -27838,12 +28467,10 @@ packages: resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} dependencies: tslib: 2.6.2 - dev: false /pvutils@1.1.3: resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} engines: {node: '>=6.0.0'} - dev: false /qrcode@1.5.0: resolution: {integrity: sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==} @@ -27928,7 +28555,6 @@ packages: /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - requiresBuild: true dev: true /queue-microtask@1.2.3: @@ -27938,7 +28564,6 @@ packages: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} dependencies: inherits: 2.0.4 - dev: false /quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -28005,6 +28630,15 @@ packages: iconv-lite: 0.4.24 unpipe: 1.0.0 + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -28024,7 +28658,7 @@ packages: pure-color: 1.3.0 dev: false - /react-dev-utils@12.0.1(typescript@4.9.5)(webpack@5.88.2): + /react-dev-utils@12.0.1(typescript@4.9.5)(webpack@5.89.0): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -28043,9 +28677,9 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(typescript@4.9.5)(webpack@5.88.2) + fork-ts-checker-webpack-plugin: 6.5.3(typescript@4.9.5)(webpack@5.89.0) global-modules: 2.0.0 - globby: 11.0.4 + globby: 11.1.0 gzip-size: 6.0.0 immer: 9.0.21 is-root: 2.1.0 @@ -28059,7 +28693,7 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 4.9.5 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - eslint - supports-color @@ -28074,7 +28708,6 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} @@ -28114,7 +28747,7 @@ packages: react: ^16.6.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 invariant: 2.2.4 prop-types: 15.8.1 react: 18.2.0 @@ -28152,28 +28785,28 @@ packages: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} dev: false - /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.88.2): + /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0): resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} engines: {node: '>=10.13.0'} peerDependencies: react-loadable: '*' webpack: '>=4.41.1 || 5.x' dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: false - /react-markdown@8.0.7(@types/react@18.2.28)(react@18.2.0): + /react-markdown@8.0.7(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} peerDependencies: '@types/react': '>=16' react: '>=16' dependencies: - '@types/hast': 2.3.6 - '@types/prop-types': 15.7.8 - '@types/react': 18.2.28 - '@types/unist': 2.0.8 + '@types/hast': 2.3.7 + '@types/prop-types': 15.7.9 + '@types/react': 18.2.31 + '@types/unist': 2.0.9 comma-separated-tokens: 2.0.3 hast-util-whitespace: 2.0.1 prop-types: 15.8.1 @@ -28183,7 +28816,7 @@ packages: remark-parse: 10.0.2 remark-rehype: 10.1.0 space-separated-tokens: 2.0.2 - style-to-object: 0.4.2 + style-to-object: 0.4.4 unified: 10.1.2 unist-util-visit: 4.1.2 vfile: 5.3.7 @@ -28195,9 +28828,8 @@ packages: resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==} dependencies: p-defer: 3.0.0 - dev: false - /react-native-fs@2.20.0(react-native@0.72.5): + /react-native-fs@2.20.0(react-native@0.72.6): resolution: {integrity: sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ==} peerDependencies: react-native: '*' @@ -28207,16 +28839,14 @@ packages: optional: true dependencies: base-64: 0.1.0 - react-native: 0.72.5(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) + react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) utf8: 3.0.0 - dev: false /react-native-path@0.0.5: resolution: {integrity: sha512-WJr256xBquk7X2O83QYWKqgLg43Zg3SrgjPc/kr0gCD2LoXA+2L72BW4cmstH12GbGeutqs/eXk3jgDQ2iCSvQ==} - dev: false - /react-native@0.72.5(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0): - resolution: {integrity: sha512-oIewslu5DBwOmo7x5rdzZlZXCqDIna0R4dUwVpfmVteORYLr4yaZo5wQnMeR+H7x54GaMhmgeqp0ZpULtulJFg==} + /react-native@0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0): + resolution: {integrity: sha512-RafPY2gM7mcrFySS8TL8x+TIO3q7oAlHpzEmC7Im6pmXni6n1AuufGaVh0Narbr1daxstw7yW7T9BKW5dpVc2A==} engines: {node: '>=16'} hasBin: true peerDependencies: @@ -28231,7 +28861,7 @@ packages: '@react-native/gradle-plugin': 0.72.11 '@react-native/js-polyfills': 0.72.1 '@react-native/normalize-colors': 0.72.0 - '@react-native/virtualized-lists': 0.72.8(react-native@0.72.5) + '@react-native/virtualized-lists': 0.72.8(react-native@0.72.6) abort-controller: 3.0.0 anser: 1.4.10 base64-js: 1.5.1 @@ -28266,14 +28896,12 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /react-refresh@0.4.3: resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} engines: {node: '>=0.10.0'} - dev: false - /react-remove-scroll-bar@2.3.4(@types/react@18.2.28)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -28283,13 +28911,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.28 + '@types/react': 18.2.31 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.28)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.31)(react@18.2.0) tslib: 2.6.2 dev: false - /react-remove-scroll@2.5.4(@types/react@18.2.28)(react@18.2.0): + /react-remove-scroll@2.5.4(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} engines: {node: '>=10'} peerDependencies: @@ -28299,13 +28927,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.28 + '@types/react': 18.2.31 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.28)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.28)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.31)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.31)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.0(@types/react@18.2.28)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.28)(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.31)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.31)(react@18.2.0) dev: false /react-router-config@5.1.1(react-router@5.3.4)(react@18.2.0): @@ -28314,7 +28942,7 @@ packages: react: '>=15' react-router: '>=5' dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 react: 18.2.0 react-router: 5.3.4(react@18.2.0) dev: false @@ -28324,7 +28952,7 @@ packages: peerDependencies: react: '>=15' dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 history: 4.10.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -28339,7 +28967,7 @@ packages: peerDependencies: react: '>=15' dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 history: 4.10.1 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 @@ -28359,9 +28987,8 @@ packages: object-assign: 4.1.1 react: 18.2.0 react-is: 18.2.0 - dev: false - /react-style-singleton@2.2.1(@types/react@18.2.28)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -28371,7 +28998,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.28 + '@types/react': 18.2.31 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 @@ -28384,7 +29011,7 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 react: 18.2.0 use-composed-ref: 1.3.0(react@18.2.0) use-latest: 1.2.1(react@18.2.0) @@ -28409,7 +29036,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -28495,7 +29122,7 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: - '@types/normalize-package-data': 2.4.2 + '@types/normalize-package-data': 2.4.3 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 @@ -28551,7 +29178,6 @@ packages: /readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} - dev: false /real-require@0.1.0: resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} @@ -28566,13 +29192,11 @@ packages: esprima: 4.0.1 source-map: 0.6.1 tslib: 2.6.2 - dev: false /receptacle@1.3.2: resolution: {integrity: sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==} dependencies: ms: 2.1.3 - dev: false /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} @@ -28599,6 +29223,12 @@ packages: indent-string: 4.0.0 strip-indent: 3.0.0 + /redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + dependencies: + esprima: 4.0.1 + dev: true + /reduce-flatten@2.0.0: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} @@ -28607,10 +29237,10 @@ packages: resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 globalthis: 1.0.3 which-builtin-type: 1.1.3 dev: true @@ -28630,7 +29260,6 @@ packages: /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: false /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} @@ -28638,13 +29267,13 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 /regexp.prototype.flags@1.5.1: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 set-function-name: 2.0.1 dev: true @@ -28706,12 +29335,11 @@ packages: /relay-runtime@12.0.0: resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 fbjs: 3.0.5 invariant: 2.2.4 transitivePeerDependencies: - encoding - dev: false /release-zalgo@1.0.0: resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} @@ -28750,7 +29378,7 @@ packages: /remark-parse@10.0.2: resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} dependencies: - '@types/mdast': 3.0.13 + '@types/mdast': 3.0.14 mdast-util-from-markdown: 1.3.1 unified: 10.1.2 transitivePeerDependencies: @@ -28781,8 +29409,8 @@ packages: /remark-rehype@10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: - '@types/hast': 2.3.6 - '@types/mdast': 3.0.13 + '@types/hast': 2.3.7 + '@types/mdast': 3.0.14 mdast-util-to-hast: 12.3.0 unified: 10.1.2 dev: false @@ -28799,7 +29427,6 @@ packages: /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - dev: false /renderkid@2.0.7: resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} @@ -28898,7 +29525,6 @@ packages: /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - requiresBuild: true /resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} @@ -28962,7 +29588,7 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -28970,7 +29596,7 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -29006,7 +29632,6 @@ packages: /retimer@3.0.0: resolution: {integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==} - dev: false /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} @@ -29036,7 +29661,6 @@ packages: hasBin: true dependencies: glob: 7.2.3 - dev: false /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} @@ -29152,7 +29776,7 @@ packages: - supports-color dev: true - /rollup-plugin-esbuild@6.1.0(esbuild@0.18.20)(rollup@4.1.4): + /rollup-plugin-esbuild@6.1.0(esbuild@0.19.5)(rollup@4.1.4): resolution: {integrity: sha512-HPpXU65V8bSpW8eSYPahtUJaJHmbxJGybuf/M8B3bz/6i11YaYHlNNJIQ38gSEV0FyohQOgVxJ2YMEEZtEmwvA==} engines: {node: '>=14.18.0'} peerDependencies: @@ -29162,7 +29786,7 @@ packages: '@rollup/pluginutils': 5.0.5(rollup@4.1.4) debug: 4.3.4(supports-color@8.1.1) es-module-lexer: 1.3.1 - esbuild: 0.18.20 + esbuild: 0.19.5 get-tsconfig: 4.7.2 rollup: 4.1.4 transitivePeerDependencies: @@ -29226,22 +29850,22 @@ packages: fsevents: 2.3.3 dev: true - /rpc-websockets@7.6.0: - resolution: {integrity: sha512-Jgcs8q6t8Go98dEulww1x7RysgTkzpCMelVxZW4hvuyFtOGpeUz9prpr2KjUa/usqxgFCd9Tu3+yhHEP9GVmiQ==} + /rpc-websockets@7.6.1: + resolution: {integrity: sha512-MmRGaJJvxTHSRxYPjJJqcj2zWnCetw7YbYbKlD0Yc7qVw6PsZhRJg1MI3mpWlpBs+4zO+urlNfLl9zLsdOD/gA==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 eventemitter3: 4.0.7 uuid: 8.3.2 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: - bufferutil: 4.0.7 + bufferutil: 4.0.8 utf-8-validate: 5.0.10 dev: false /rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 dev: false /rtl-detect@1.0.4: @@ -29303,8 +29927,8 @@ packages: resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 isarray: 2.0.5 dev: true @@ -29322,8 +29946,8 @@ packages: /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-regex: 1.1.4 dev: true @@ -29385,13 +30009,12 @@ packages: resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} dependencies: loose-envify: 1.4.0 - dev: false /schema-utils@2.7.0: resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} engines: {node: '>= 8.9.0'} dependencies: - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) dev: false @@ -29400,7 +30023,7 @@ packages: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} dependencies: - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) dev: false @@ -29409,7 +30032,7 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) @@ -29417,7 +30040,7 @@ packages: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} engines: {node: '>= 12.13.0'} dependencies: - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) @@ -29430,8 +30053,8 @@ packages: /scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - /search-insights@2.8.3: - resolution: {integrity: sha512-W9rZfQ9XEfF0O6ntgQOTI7Txc8nkZrO4eJ/pTHK0Br6wWND2sPGPoWg+yGhdIW7wMbLqk8dc23IyEtLlNGpeNw==} + /search-insights@2.9.0: + resolution: {integrity: sha512-bkWW9nIHOFkLwjQ1xqVaMbjjO5vhP26ERsH9Y3pKr8imthofEFIxlnOabkmGcw6ksRj9jWidcI65vvjJH/nTGg==} dev: false /secp256k1@4.0.3: @@ -29495,6 +30118,22 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + /semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.4.0: + resolution: {integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -29528,12 +30167,10 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false /serialize-error@2.1.0: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} - dev: false /serialize-javascript@6.0.0: resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} @@ -29618,13 +30255,22 @@ packages: resolution: {integrity: sha512-29fhAwuZlLcuBnW/EwxvLcg2D3ELX+VBDNhnavs3YYkab72qmrcSeQNVdzl8EcPPahGQXhBM6MKdPLCQGMDakw==} dev: false + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + /set-function-name@2.0.1: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.0 + define-data-property: 1.1.1 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 dev: true /set-harmonic-interval@1.0.1: @@ -29707,9 +30353,9 @@ packages: /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -29724,16 +30370,16 @@ packages: /signedsource@1.0.0: resolution: {integrity: sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==} - dev: false /sinon@15.2.0: resolution: {integrity: sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==} + deprecated: 16.1.1 dependencies: '@sinonjs/commons': 3.0.0 '@sinonjs/fake-timers': 10.3.0 '@sinonjs/samsam': 8.0.0 diff: 5.1.0 - nise: 5.1.4 + nise: 5.1.5 supports-color: 7.2.0 dev: true @@ -29755,7 +30401,7 @@ packages: hasBin: true dependencies: '@types/node': 17.0.45 - '@types/sax': 1.2.5 + '@types/sax': 1.2.6 arg: 5.0.2 sax: 1.3.0 dev: false @@ -29776,7 +30422,6 @@ packages: ansi-styles: 3.2.1 astral-regex: 1.0.0 is-fullwidth-code-point: 2.0.0 - dev: false /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} @@ -29809,7 +30454,6 @@ packages: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false /socket.io-client@4.7.2: resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} @@ -29960,7 +30604,7 @@ packages: sc-istanbul: 0.4.6 semver: 7.5.4 shelljs: 0.8.5 - web3-utils: 1.10.2 + web3-utils: 1.10.3 transitivePeerDependencies: - supports-color dev: true @@ -30116,14 +30760,18 @@ packages: transitivePeerDependencies: - supports-color - /speed-measure-webpack-plugin@1.4.2(webpack@5.88.2): + /speed-measure-webpack-plugin@1.4.2(webpack@5.89.0): resolution: {integrity: sha512-AtVzD0bnIy2/B0fWqJpJgmhcrfWFhBlduzSo0uwplr/QvB33ZNZj2NEth3NONgdnZJqicK0W0mSxnLSbsVCDbw==} engines: {node: '>=6.0.0'} peerDependencies: webpack: ^1 || ^2 || ^3 || ^4 || ^5 dependencies: chalk: 4.1.2 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) + dev: true + + /split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} dev: true /split-on-first@1.1.0: @@ -30146,7 +30794,6 @@ packages: resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} dependencies: tslib: 2.6.2 - dev: false /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -30160,8 +30807,8 @@ packages: engines: {node: '>=6.0.0'} dev: true - /sshpk@1.17.0: - resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + /sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} hasBin: true dependencies: @@ -30203,7 +30850,6 @@ packages: /stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - dev: false /stacktrace-gps@3.1.2: resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} @@ -30245,7 +30891,7 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} dependencies: - internal-slot: 1.0.5 + internal-slot: 1.0.6 dev: true /stream-browserify@3.0.0: @@ -30263,7 +30909,6 @@ packages: resolution: {integrity: sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==} dependencies: get-iterator: 1.0.2 - dev: false /streaming-iterables@6.2.0: resolution: {integrity: sha512-3AYC8oB60WyD1ic7uHmN/vm2oRGzRnQ3XFBl/bFMDi1q1+nc5/vjMmiE4vroIya3jG59t87VpyAj/iXYxyw9AA==} @@ -30309,6 +30954,11 @@ packages: char-regex: 1.0.2 strip-ansi: 6.0.1 + /string-similarity@4.0.4: + resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: false + /string-width@1.0.2: resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} engines: {node: '>=0.10.0'} @@ -30345,12 +30995,12 @@ packages: /string.prototype.matchall@4.0.10: resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 - internal-slot: 1.0.5 + internal-slot: 1.0.6 regexp.prototype.flags: 1.5.1 set-function-name: 2.0.1 side-channel: 1.0.4 @@ -30360,25 +31010,25 @@ packages: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /string_decoder@0.10.31: @@ -30423,7 +31073,6 @@ packages: engines: {node: '>=6'} dependencies: ansi-regex: 4.1.1 - dev: false /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -30507,7 +31156,6 @@ packages: /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - dev: false /style-to-object@0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} @@ -30515,8 +31163,8 @@ packages: inline-style-parser: 0.1.1 dev: false - /style-to-object@0.4.2: - resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} dependencies: inline-style-parser: 0.1.1 dev: false @@ -30560,7 +31208,6 @@ packages: /sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} - dev: false /superjson@1.13.3: resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} @@ -30588,7 +31235,6 @@ packages: /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} - requiresBuild: true dependencies: has-flag: 3.0.0 @@ -30604,6 +31250,14 @@ packages: dependencies: has-flag: 4.0.0 + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -30630,7 +31284,6 @@ packages: resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} dependencies: tslib: 2.6.2 - dev: false /swr@1.3.0(react@18.2.0): resolution: {integrity: sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==} @@ -30692,6 +31345,15 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + /tar-fs@1.16.3: + resolution: {integrity: sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==} + dependencies: + chownr: 1.1.4 + mkdirp: 0.5.6 + pump: 1.0.3 + tar-stream: 1.6.2 + dev: true + /tar-stream@1.6.2: resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} engines: {node: '>= 0.8.0'} @@ -30705,14 +31367,25 @@ packages: xtend: 4.0.2 dev: true + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + /temp@0.8.4: resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} engines: {node: '>=6.0.0'} dependencies: rimraf: 2.6.3 - dev: false - /terser-webpack-plugin@5.3.9(webpack@5.88.2): + /terser-webpack-plugin@5.3.9(webpack@5.89.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -30728,12 +31401,12 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.21.0 - webpack: 5.88.2(webpack-cli@5.1.4) + terser: 5.22.0 + webpack: 5.89.0(webpack-cli@5.1.4) /terser@4.8.1: resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} @@ -30746,8 +31419,8 @@ packages: source-map-support: 0.5.21 dev: true - /terser@5.21.0: - resolution: {integrity: sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw==} + /terser@5.22.0: + resolution: {integrity: sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==} engines: {node: '>=10'} hasBin: true dependencies: @@ -30794,10 +31467,10 @@ packages: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 '@types/node': 8.10.66 - '@types/qs': 6.9.8 + '@types/qs': 6.9.9 caseless: 0.12.0 concat-stream: 1.6.2 - form-data: 2.3.3 + form-data: 2.5.1 http-basic: 8.1.3 http-response-object: 3.0.2 promise: 8.3.0 @@ -30825,7 +31498,6 @@ packages: /throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} - dev: false /throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} @@ -30870,6 +31542,14 @@ packages: retimer: 2.0.0 dev: false + /timeout-abort-controller@2.0.0: + resolution: {integrity: sha512-2FAPXfzTPYEgw27bQGTHc0SzrbmnU2eso4qo172zMLZzaGqeu09PFa5B2FCUHM1tflgRqPgn5KQgp6+Vex4uNA==} + dependencies: + abort-controller: 3.0.0 + native-abort-controller: 1.0.4(abort-controller@3.0.0) + retimer: 3.0.0 + dev: true + /timeout-abort-controller@3.0.0: resolution: {integrity: sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==} dependencies: @@ -30892,10 +31572,13 @@ packages: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: false + /tiny-lru@11.2.3: + resolution: {integrity: sha512-mF9jPTrvN7UHk0bekOk3RlFdFwfyS4CJYVsGc7nInL3pVgUCYj5r9X6GpZBFQgLr0TKJo8Dp+F3oRvYzxU9xiA==} + engines: {node: '>=12'} + /tiny-lru@8.0.2: resolution: {integrity: sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg==} engines: {node: '>=6'} - dev: false /tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} @@ -30919,7 +31602,12 @@ packages: resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} dependencies: tslib: 2.6.2 - dev: false + + /tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + dependencies: + tmp: 0.2.1 + dev: true /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} @@ -30989,7 +31677,6 @@ packages: /tough-cookie@4.1.3: resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} engines: {node: '>=6'} - requiresBuild: true dependencies: psl: 1.9.0 punycode: 2.3.0 @@ -31047,7 +31734,6 @@ packages: /ts-algebra@1.2.2: resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} - dev: false /ts-command-line-args@2.5.1: resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} @@ -31125,7 +31811,7 @@ packages: bs-logger: 0.2.6 esbuild: 0.17.19 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(ts-node@10.9.1) + jest: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -31135,7 +31821,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-loader@9.5.0(typescript@4.9.5)(webpack@5.88.2): + /ts-loader@9.5.0(typescript@4.9.5)(webpack@5.89.0): resolution: {integrity: sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -31148,7 +31834,7 @@ packages: semver: 7.5.4 source-map: 0.7.4 typescript: 4.9.5 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: true /ts-mocha@10.0.0(mocha@10.2.0): @@ -31164,7 +31850,7 @@ packages: tsconfig-paths: 3.14.2 dev: true - /ts-node@10.9.1(@types/node@18.15.13)(typescript@4.9.5): + /ts-node@10.9.1(@types/node@18.18.6)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -31183,7 +31869,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.15.13 + '@types/node': 18.18.6 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -31194,7 +31880,7 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-node@10.9.1(@types/node@18.15.13)(typescript@5.1.6): + /ts-node@10.9.1(@types/node@18.18.6)(typescript@5.1.6): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -31213,7 +31899,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.15.13 + '@types/node': 18.18.6 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -31223,7 +31909,38 @@ packages: typescript: 5.1.6 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: false + + /ts-node@10.9.1(@types/node@18.18.6)(typescript@5.2.2): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.18.6 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.2.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + optional: true /ts-node@10.9.1(@types/node@20.5.1)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} @@ -31273,7 +31990,6 @@ packages: /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} - requiresBuild: true dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -31288,18 +32004,18 @@ packages: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: false /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - dev: false + /tslib@2.4.1: + resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - dev: false + + /tslib@2.6.0: + resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -31327,70 +32043,81 @@ packages: typescript: 5.1.6 dev: true + /tsx@3.14.0: + resolution: {integrity: sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==} + hasBin: true + dependencies: + esbuild: 0.18.20 + get-tsconfig: 4.7.2 + source-map-support: 0.5.21 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 dev: true - /turbo-darwin-64@1.10.15: - resolution: {integrity: sha512-Sik5uogjkRTe1XVP9TC2GryEMOJCaKE2pM/O9uLn4koQDnWKGcLQv+mDU+H+9DXvKLnJnKCD18OVRkwK5tdpoA==} + /turbo-darwin-64@1.10.16: + resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64@1.10.15: - resolution: {integrity: sha512-xwqyFDYUcl2xwXyGPmHkmgnNm4Cy0oNzMpMOBGRr5x64SErS7QQLR4VHb0ubiR+VAb8M+ECPklU6vD1Gm+wekg==} + /turbo-darwin-arm64@1.10.16: + resolution: {integrity: sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64@1.10.15: - resolution: {integrity: sha512-dM07SiO3RMAJ09Z+uB2LNUSkPp3I1IMF8goH5eLj+d8Kkwoxd/+qbUZOj9RvInyxU/IhlnO9w3PGd3Hp14m/nA==} + /turbo-linux-64@1.10.16: + resolution: {integrity: sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64@1.10.15: - resolution: {integrity: sha512-MkzKLkKYKyrz4lwfjNXH8aTny5+Hmiu4SFBZbx+5C0vOlyp6fV5jZANDBvLXWiDDL4DSEAuCEK/2cmN6FVH1ow==} + /turbo-linux-arm64@1.10.16: + resolution: {integrity: sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64@1.10.15: - resolution: {integrity: sha512-3TdVU+WEH9ThvQGwV3ieX/XHebtYNHv9HARHauPwmVj3kakoALkpGxLclkHFBLdLKkqDvmHmXtcsfs6cXXRHJg==} + /turbo-windows-64@1.10.16: + resolution: {integrity: sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64@1.10.15: - resolution: {integrity: sha512-l+7UOBCbfadvPMYsX08hyLD+UIoAkg6ojfH+E8aud3gcA1padpjCJTh9gMpm3QdMbKwZteT5uUM+wyi6Rbbyww==} + /turbo-windows-arm64@1.10.16: + resolution: {integrity: sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo@1.10.15: - resolution: {integrity: sha512-mKKkqsuDAQy1wCCIjCdG+jOCwUflhckDMSRoeBPcIL/CnCl7c5yRDFe7SyaXloUUkt4tUR0rvNIhVCcT7YeQpg==} + /turbo@1.10.16: + resolution: {integrity: sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==} hasBin: true optionalDependencies: - turbo-darwin-64: 1.10.15 - turbo-darwin-arm64: 1.10.15 - turbo-linux-64: 1.10.15 - turbo-linux-arm64: 1.10.15 - turbo-windows-64: 1.10.15 - turbo-windows-arm64: 1.10.15 + turbo-darwin-64: 1.10.16 + turbo-darwin-arm64: 1.10.16 + turbo-linux-64: 1.10.16 + turbo-linux-arm64: 1.10.16 + turbo-windows-64: 1.10.16 + turbo-windows-arm64: 1.10.16 dev: true /tweetnacl-util@0.15.1: @@ -31467,8 +32194,8 @@ packages: /type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - /typechain@8.3.1(typescript@4.9.5): - resolution: {integrity: sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==} + /typechain@8.3.2(typescript@4.9.5): + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} hasBin: true peerDependencies: typescript: '>=4.3.0' @@ -31487,8 +32214,8 @@ packages: transitivePeerDependencies: - supports-color - /typechain@8.3.1(typescript@5.1.6): - resolution: {integrity: sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==} + /typechain@8.3.2(typescript@5.1.6): + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} hasBin: true peerDependencies: typescript: '>=4.3.0' @@ -31512,8 +32239,8 @@ packages: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-typed-array: 1.1.12 dev: true @@ -31521,7 +32248,7 @@ packages: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -31532,7 +32259,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -31541,7 +32268,7 @@ packages: /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 is-typed-array: 1.1.12 dev: true @@ -31596,6 +32323,14 @@ packages: engines: {node: '>=14.17'} hasBin: true + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dev: true + optional: true + /typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} @@ -31606,7 +32341,6 @@ packages: /ua-parser-js@1.0.36: resolution: {integrity: sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==} - dev: false /ufo@1.3.1: resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} @@ -31620,7 +32354,6 @@ packages: dependencies: commander: 2.13.0 source-map: 0.6.1 - dev: false /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} @@ -31657,7 +32390,6 @@ packages: resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} dependencies: multiformats: 9.9.0 - dev: false /uint8arrays@4.0.6: resolution: {integrity: sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw==} @@ -31668,7 +32400,7 @@ packages: /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 @@ -31684,14 +32416,13 @@ packages: /unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} - dev: false /underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} dev: true - /undici@5.26.0: - resolution: {integrity: sha512-MLqGMyaJk2ubSl7FrmWuV7ZOsYWmdF7gcBHDRxm4AR8NoodQhgy3vO/D1god79HoetxR0uAeVNB65yj2lNRQnQ==} + /undici@5.26.5: + resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.0.0 @@ -31733,7 +32464,7 @@ packages: /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 bail: 2.0.2 extend: 3.0.2 is-buffer: 2.0.5 @@ -31745,7 +32476,7 @@ packages: /unified@9.2.0: resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 bail: 1.0.5 extend: 3.0.2 is-buffer: 2.0.5 @@ -31757,7 +32488,7 @@ packages: /unified@9.2.2: resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 bail: 1.0.5 extend: 3.0.2 is-buffer: 2.0.5 @@ -31792,7 +32523,7 @@ packages: /unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 dev: false /unist-util-position@3.1.0: @@ -31802,7 +32533,7 @@ packages: /unist-util-position@4.0.4: resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 dev: false /unist-util-remove-position@2.0.1: @@ -31820,33 +32551,33 @@ packages: /unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 dev: false /unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 dev: false /unist-util-visit-parents@3.1.1: resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 unist-util-is: 4.1.0 dev: false /unist-util-visit-parents@5.1.3: resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 unist-util-is: 5.2.1 dev: false /unist-util-visit@2.0.3: resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 unist-util-is: 4.1.0 unist-util-visit-parents: 3.1.1 dev: false @@ -31854,7 +32585,7 @@ packages: /unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 dev: false @@ -31866,7 +32597,6 @@ packages: /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} - requiresBuild: true dev: true /universalify@2.0.0: @@ -31878,7 +32608,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: normalize-path: 2.1.1 - dev: false /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} @@ -31930,20 +32659,18 @@ packages: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} dependencies: tslib: 2.6.2 - dev: false /upper-case@2.0.2: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} dependencies: tslib: 2.6.2 - dev: false /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 - /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.88.2): + /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.89.0): resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -31953,11 +32680,11 @@ packages: file-loader: optional: true dependencies: - file-loader: 6.2.0(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.89.0) loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: false /url-parse-lax@3.0.0: @@ -31968,7 +32695,6 @@ packages: /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - requiresBuild: true dependencies: querystringify: 2.2.0 requires-port: 1.0.0 @@ -31992,9 +32718,11 @@ packages: /urlpattern-polyfill@8.0.2: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} - dev: false - /use-callback-ref@1.3.0(@types/react@18.2.28)(react@18.2.0): + /urlpattern-polyfill@9.0.0: + resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} + + /use-callback-ref@1.3.0(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: @@ -32004,7 +32732,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.28 + '@types/react': 18.2.31 react: 18.2.0 tslib: 2.6.2 dev: false @@ -32042,7 +32770,7 @@ packages: use-isomorphic-layout-effect: 1.1.2(react@18.2.0) dev: false - /use-sidecar@1.1.2(@types/react@18.2.28)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -32052,7 +32780,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.28 + '@types/react': 18.2.31 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 @@ -32064,7 +32792,6 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 18.2.0 - dev: false /user-home@2.0.0: resolution: {integrity: sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==} @@ -32113,7 +32840,7 @@ packages: is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.12 - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 /utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} @@ -32169,8 +32896,8 @@ packages: resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.19 - '@types/istanbul-lib-coverage': 2.0.4 + '@jridgewell/trace-mapping': 0.3.20 + '@types/istanbul-lib-coverage': 2.0.5 convert-source-map: 2.0.0 /validate-npm-package-license@3.0.4: @@ -32207,7 +32934,6 @@ packages: /value-or-promise@1.0.12: resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} engines: {node: '>=12'} - dev: false /varint-decoder@1.0.0: resolution: {integrity: sha512-JkOvdztASWGUAsXshCFHrB9f6AgR2Q8W08CEyJ+43b1qtFocmI8Sp1R/M0E/hDOY2FzVIqk63tOYLgDYWuJ7IQ==} @@ -32222,7 +32948,6 @@ packages: /varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} - dev: false /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} @@ -32244,21 +32969,21 @@ packages: /vfile-message@2.0.4: resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 unist-util-stringify-position: 2.0.3 dev: false /vfile-message@3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 unist-util-stringify-position: 3.0.3 dev: false /vfile@4.2.1: resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 is-buffer: 2.0.5 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 @@ -32267,7 +32992,7 @@ packages: /vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 is-buffer: 2.0.5 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 @@ -32305,7 +33030,7 @@ packages: '@noble/hashes': 1.3.0 '@scure/bip32': 1.3.0 '@scure/bip39': 1.2.0 - '@types/ws': 8.5.7 + '@types/ws': 8.5.8 '@wagmi/chains': 1.6.0(typescript@5.1.6) abitype: 0.9.3(typescript@5.1.6)(zod@3.22.4) isomorphic-ws: 5.0.0(ws@8.12.0) @@ -32317,7 +33042,7 @@ packages: - zod dev: false - /vite-node@0.28.5(@types/node@18.15.13): + /vite-node@0.28.5(@types/node@18.18.6): resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} engines: {node: '>=v14.16.0'} hasBin: true @@ -32329,7 +33054,7 @@ packages: picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 - vite: 4.4.11(@types/node@18.15.13) + vite: 4.5.0(@types/node@18.18.6) transitivePeerDependencies: - '@types/node' - less @@ -32341,8 +33066,8 @@ packages: - terser dev: true - /vite@4.4.11(@types/node@18.15.13): - resolution: {integrity: sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==} + /vite@4.5.0(@types/node@18.18.6): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -32369,7 +33094,7 @@ packages: terser: optional: true dependencies: - '@types/node': 18.15.13 + '@types/node': 18.18.6 esbuild: 0.18.20 postcss: 8.4.31 rollup: 3.29.4 @@ -32399,9 +33124,9 @@ packages: jsdom: optional: true dependencies: - '@types/chai': 4.3.7 - '@types/chai-subset': 1.3.3 - '@types/node': 18.15.13 + '@types/chai': 4.3.9 + '@types/chai-subset': 1.3.4 + '@types/node': 18.18.6 '@vitest/expect': 0.28.5 '@vitest/runner': 0.28.5 '@vitest/spy': 0.28.5 @@ -32420,8 +33145,8 @@ packages: tinybench: 2.5.1 tinypool: 0.3.1 tinyspy: 1.1.1 - vite: 4.4.11(@types/node@18.15.13) - vite-node: 0.28.5(@types/node@18.15.13) + vite: 4.5.0(@types/node@18.18.6) + vite-node: 0.28.5(@types/node@18.18.6) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -32435,7 +33160,6 @@ packages: /vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} - dev: false /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} @@ -32466,7 +33190,12 @@ packages: - supports-color dev: false - /wagmi@1.3.9(@types/react@18.2.28)(react-dom@18.2.0)(react-native@0.72.5)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4): + /wabt@1.0.24: + resolution: {integrity: sha512-8l7sIOd3i5GWfTWciPL0+ff/FK/deVK2Q6FN+MPz4vfUcD78i2M/49XJTwF6aml91uIiuXJEsLKWMB2cw/mtKg==} + hasBin: true + dev: true + + /wagmi@1.3.9(@types/react@18.2.31)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4): resolution: {integrity: sha512-BQbl+vWLNpLraXd/MWsl1P3I41l7DHrujx6qshIa1HDV7Mdh0GNrDuluRYBtuK2bBx9WM/Fjw45Ef2aKADan9A==} peerDependencies: react: '>=17.0.0' @@ -32477,9 +33206,9 @@ packages: optional: true dependencies: '@tanstack/query-sync-storage-persister': 4.36.1 - '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.5)(react@18.2.0) + '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0) '@tanstack/react-query-persist-client': 4.36.1(@tanstack/react-query@4.36.1) - '@wagmi/core': 1.3.8(@types/react@18.2.28)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) + '@wagmi/core': 1.3.8(@types/react@18.2.31)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) react: 18.2.0 typescript: 5.1.6 @@ -32563,14 +33292,21 @@ packages: /web-streams-polyfill@3.2.1: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} - dev: false /web-worker@1.2.0: resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} dev: false - /web3-utils@1.10.2: - resolution: {integrity: sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==} + /web3-eth-abi@1.7.0: + resolution: {integrity: sha512-heqR0bWxgCJwjWIhq2sGyNj9bwun5+Xox/LdZKe+WMyTSy0cXDXEAgv3XKNkXC4JqdDt/ZlbTEx4TWak4TRMSg==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/abi': 5.0.7 + web3-utils: 1.7.0 + dev: true + + /web3-utils@1.10.3: + resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} engines: {node: '>=8.0.0'} dependencies: '@ethereumjs/util': 8.1.0 @@ -32583,6 +33319,19 @@ packages: utf8: 3.0.0 dev: true + /web3-utils@1.7.0: + resolution: {integrity: sha512-O8Tl4Ky40Sp6pe89Olk2FsaUkgHyb5QAXuaKo38ms3CxZZ4d3rPGfjP9DNKGm5+IUgAZBNpF1VmlSmNCqfDI1w==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 4.12.0 + ethereum-bloom-filters: 1.0.10 + ethereumjs-util: 7.1.5 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + dev: true + /web3.storage@4.5.5(node-fetch@3.3.2): resolution: {integrity: sha512-ABW1Gk4gpkVkEIgeQTcoqZ1pI1YKQiBbZDploAcyldFWCXtdBpsijrRHg0S5Mwlvllw4E8OsRm/9HG2nVaGsCg==} dependencies: @@ -32611,11 +33360,14 @@ packages: /webcrypto-core@1.7.7: resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==} dependencies: - '@peculiar/asn1-schema': 2.3.6 + '@peculiar/asn1-schema': 2.3.8 '@peculiar/json-schema': 1.1.12 asn1js: 3.0.5 pvtsutils: 1.3.5 tslib: 2.6.2 + + /webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} dev: false /webidl-conversions@3.0.1: @@ -32653,7 +33405,7 @@ packages: - utf-8-validate dev: false - /webpack-cli@5.1.4(webpack@5.88.2): + /webpack-cli@5.1.4(webpack@5.89.0): resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} engines: {node: '>=14.15.0'} hasBin: true @@ -32671,9 +33423,9 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.88.2) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.88.2) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.89.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.89.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.89.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -32682,10 +33434,10 @@ packages: import-local: 3.1.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-merge: 5.9.0 + webpack: 5.89.0(webpack-cli@5.1.4) + webpack-merge: 5.10.0 - /webpack-dev-middleware@5.3.3(webpack@5.88.2): + /webpack-dev-middleware@5.3.3(webpack@5.89.0): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -32696,9 +33448,9 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) - /webpack-dev-server@4.15.1(debug@4.3.4)(webpack@5.88.2): + /webpack-dev-server@4.15.1(debug@4.3.4)(webpack@5.89.0): resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} engines: {node: '>= 12.13.0'} hasBin: true @@ -32711,13 +33463,13 @@ packages: webpack-cli: optional: true dependencies: - '@types/bonjour': 3.5.11 - '@types/connect-history-api-fallback': 1.5.1 - '@types/express': 4.17.19 - '@types/serve-index': 1.9.2 - '@types/serve-static': 1.15.3 - '@types/sockjs': 0.3.34 - '@types/ws': 8.5.7 + '@types/bonjour': 3.5.12 + '@types/connect-history-api-fallback': 1.5.2 + '@types/express': 4.17.20 + '@types/serve-index': 1.9.3 + '@types/serve-static': 1.15.4 + '@types/sockjs': 0.3.35 + '@types/ws': 8.5.8 ansi-html-community: 0.0.8 bonjour-service: 1.1.1 chokidar: 3.5.3 @@ -32728,7 +33480,7 @@ packages: express: 4.18.2 graceful-fs: 4.2.11 html-entities: 2.4.0 - http-proxy-middleware: 2.0.6(@types/express@4.17.19)(debug@4.3.4) + http-proxy-middleware: 2.0.6(@types/express@4.17.20)(debug@4.3.4) ipaddr.js: 2.1.0 launch-editor: 2.6.1 open: 8.4.2 @@ -32739,28 +33491,29 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-dev-middleware: 5.3.3(webpack@5.88.2) - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + webpack: 5.89.0(webpack-cli@5.1.4) + webpack-dev-middleware: 5.3.3(webpack@5.89.0) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - /webpack-merge@5.9.0: - resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} + /webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} engines: {node: '>=10.0.0'} dependencies: clone-deep: 4.0.1 + flat: 5.0.2 wildcard: 2.0.1 /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.88.2(webpack-cli@5.1.4): - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + /webpack@5.89.0(webpack-cli@5.1.4): + resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -32769,8 +33522,8 @@ packages: webpack-cli: optional: true dependencies: - '@types/eslint-scope': 3.7.5 - '@types/estree': 1.0.2 + '@types/eslint-scope': 3.7.6 + '@types/estree': 1.0.3 '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 @@ -32790,16 +33543,16 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(webpack@5.89.0) watchpack: 2.4.0 - webpack-cli: 5.1.4(webpack@5.88.2) + webpack-cli: 5.1.4(webpack@5.89.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - /webpackbar@5.0.2(webpack@5.88.2): + /webpackbar@5.0.2(webpack@5.89.0): resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==} engines: {node: '>=12'} peerDependencies: @@ -32809,7 +33562,7 @@ packages: consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.4.3 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.89.0(webpack-cli@5.1.4) dev: false /websocket-driver@0.7.4: @@ -32828,7 +33581,7 @@ packages: resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} engines: {node: '>=4.0.0'} dependencies: - bufferutil: 4.0.7 + bufferutil: 4.0.8 debug: 2.6.9 es5-ext: 0.10.62 typedarray-to-buffer: 3.1.5 @@ -32847,7 +33600,6 @@ packages: /whatwg-fetch@3.6.19: resolution: {integrity: sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==} - dev: false /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} @@ -32900,7 +33652,7 @@ packages: isarray: 2.0.5 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true /which-collection@1.0.1: @@ -32919,12 +33671,12 @@ packages: /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 @@ -32956,7 +33708,6 @@ packages: engines: {node: '>=8'} dependencies: string-width: 4.2.3 - dev: false /widest-line@4.0.1: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} @@ -33068,7 +33819,6 @@ packages: graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: false /write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} @@ -33097,7 +33847,6 @@ packages: optional: true dependencies: async-limiter: 1.0.1 - dev: false /ws@7.4.6: resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} @@ -33159,9 +33908,8 @@ packages: optional: true utf-8-validate: optional: true - dev: false - /ws@8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10): + /ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} engines: {node: '>=10.0.0'} peerDependencies: @@ -33173,7 +33921,7 @@ packages: utf-8-validate: optional: true dependencies: - bufferutil: 4.0.7 + bufferutil: 4.0.8 utf-8-validate: 5.0.10 /xdg-basedir@4.0.0: @@ -33193,14 +33941,6 @@ packages: engines: {node: '>=12'} dev: true - /xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - dependencies: - sax: 1.3.0 - xmlbuilder: 11.0.1 - dev: false - /xml2js@0.6.2: resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} engines: {node: '>=4.0.0'} @@ -33260,11 +34000,15 @@ packages: /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - dev: false /yaml@2.3.1: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} + dev: true + + /yaml@2.3.3: + resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} + engines: {node: '>= 14'} /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} @@ -33397,12 +34141,12 @@ packages: resolution: {integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==} engines: {node: '>=10'} dependencies: - '@babel/runtime': 7.23.1 - '@types/lodash': 4.14.199 + '@babel/runtime': 7.23.2 + '@types/lodash': 4.14.200 lodash: 4.17.21 lodash-es: 4.17.21 nanoclone: 0.2.1 - property-expr: 2.0.5 + property-expr: 2.0.6 toposort: 2.0.2 dev: false @@ -33422,13 +34166,12 @@ packages: zod: ^3.21.4 dependencies: zod: 3.22.4 - dev: false /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - /zustand@4.4.3(@types/react@18.2.28)(react@18.2.0): - resolution: {integrity: sha512-oRy+X3ZazZvLfmv6viIaQmtLOMeij1noakIsK/Y47PWYhT8glfXzQ4j0YcP5i0P0qI1A4rIB//SGROGyZhx91A==} + /zustand@4.4.4(@types/react@18.2.31)(react@18.2.0): + resolution: {integrity: sha512-5UTUIAiHMNf5+mFp7/AnzJXS7+XxktULFN0+D1sCiZWyX7ZG+AQpqs2qpYrynRij4QvoDdCD+U+bmg/cG3Ucxw==} engines: {node: '>=12.7.0'} peerDependencies: '@types/react': '>=16.8' @@ -33442,7 +34185,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.28 + '@types/react': 18.2.31 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 697ff688..aaa9186b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,6 +3,7 @@ packages: - "defender" - "docs" - "frontend" + - "graph" - "vendor/observabletreemap" - "sdk" - - "contracts" \ No newline at end of file + - "contracts" diff --git a/sdk/package.json b/sdk/package.json index e4cbc00c..1227f74b 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "0.8.10", + "version": "0.8.16", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -26,9 +26,20 @@ "@ethereum-attestation-service/eas-sdk": "^0.28.3", "@ethersproject/abstract-signer": "^5.7.0", "@graphprotocol/client-add-source-name": "^1.0.16", - "@graphprotocol/client-cli": "^2.2.15", + "@graphprotocol/client-polling-live": "^2.0.0", + "@graphql-mesh/cache-localforage": "^0.95.7", + "@graphql-mesh/cross-helpers": "^0.4.1", + "@graphql-mesh/graphql": "^0.95.7", + "@graphql-mesh/http": "^0.96.13", + "@graphql-mesh/merger-bare": "^0.95.7", + "@graphql-mesh/runtime": "^0.96.12", + "@graphql-mesh/store": "^0.95.7", + "@graphql-mesh/types": "^0.95.7", + "@graphql-mesh/utils": "^0.95.7", + "@graphql-typed-document-node/core": "^3.2.0", "@hypercerts-org/contracts": "0.8.11", "@openzeppelin/merkle-tree": "^1.0.4", + "@whatwg-node/fetch": "^0.9.13", "ajv": "^8.11.2", "axios": "^1.2.2", "dotenv": "^16.0.3", @@ -46,6 +57,7 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.23.2", "@faker-js/faker": "^8.0.2", + "@graphprotocol/client-cli": "^3.0.0", "@jest/globals": "^29.7.0", "@rollup/plugin-commonjs": "^24.0.1", "@rollup/plugin-json": "^6.0.0", @@ -78,6 +90,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.1", "tslib": "^2.5.0", + "tsx": "^3.14.0", "typedoc": "^0.23.25", "typedoc-plugin-markdown": "^3.14.0", "typedoc-plugin-missing-exports": "^2.0.0", @@ -89,7 +102,7 @@ "graph:compile": "graphql-codegen", "graph:serve": "graphclient serve-dev", "graph:watch": "graphql-codegen -w", - "graph:build:esm": "rm -rf ./src/.graphclient && NODE_OPTIONS='--loader ts-node/esm' graphclient build --filetype js --throwOnInvalidConfig", + "graph:build:esm": "rm -rf ./src/.graphclient && NODE_OPTIONS='--loader ts-node/esm' graphclient build --throwOnInvalidConfig", "clean": "rm -rf ./dist", "prebuild": "pnpm clean", "prepack": "pnpm build", diff --git a/sdk/src/constants.ts b/sdk/src/constants.ts index 0ee3743b..da4383b5 100644 --- a/sdk/src/constants.ts +++ b/sdk/src/constants.ts @@ -23,6 +23,12 @@ const DEPLOYMENTS: { [key in SupportedChainIds]: Deployment } = { contractAddress: "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", graphUrl: `${DEFAULT_GRAPH_BASE_URL}/hypercerts-optimism-mainnet`, } as const, + 42220: { + chainId: 42220, + chainName: "celo-mainnet", + contractAddress: "0x16ba53b74c234c870c61efc04cd418b8f2865959", + graphUrl: `${DEFAULT_GRAPH_BASE_URL}/hypercerts-celo`, + }, 11155111: { chainId: 11155111, chainName: "sepolia", diff --git a/sdk/src/index.ts b/sdk/src/index.ts index 5976f1b9..4bbdfcd6 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -1,6 +1,6 @@ import type { HypercertMinter, IHypercertToken } from "@hypercerts-org/contracts"; -import { execute } from "../.graphclient/index.js"; +import { execute } from "../.graphclient"; import HypercertClient from "./client.js"; import HypercertsStorage from "./storage.js"; import { DEPLOYMENTS } from "./constants.js"; diff --git a/sdk/src/indexer.ts b/sdk/src/indexer.ts index 05fd85b2..793e77ab 100644 --- a/sdk/src/indexer.ts +++ b/sdk/src/indexer.ts @@ -1,4 +1,4 @@ -import { getBuiltGraphSDK, Sdk as GraphClient } from "../.graphclient/index.js"; +import { getBuiltGraphSDK, Sdk as GraphClient } from "../.graphclient"; import { defaultQueryParams } from "./indexer/utils.js"; import { HypercertIndexerInterface, QueryParams } from "./types/index.js"; diff --git a/sdk/src/storage.ts b/sdk/src/storage.ts index f588d258..8dd23c2a 100644 --- a/sdk/src/storage.ts +++ b/sdk/src/storage.ts @@ -1,9 +1,5 @@ import axios from "axios"; -//eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore import { CIDString, NFTStorage } from "nft.storage"; -//eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore import { Blob, File, Web3Storage } from "web3.storage"; import { validateMetaData } from "./validator/index.js"; diff --git a/sdk/src/types/client.ts b/sdk/src/types/client.ts index 407a3fd0..7d803a0c 100644 --- a/sdk/src/types/client.ts +++ b/sdk/src/types/client.ts @@ -7,7 +7,7 @@ import HypercertIndexer from "../indexer.js"; import { AllowlistEntry, TransferRestrictions } from "./hypercerts.js"; import { HypercertMetadata } from "./metadata.js"; -export type SupportedChainIds = 5 | 10 | 11155111; +export type SupportedChainIds = 5 | 10 | 42220 | 11155111; /** * Represents a deployment of a contract on a specific network. diff --git a/sdk/src/types/global.d.ts b/sdk/src/types/global.d.ts index 50592e0f..62b29ce3 100644 --- a/sdk/src/types/global.d.ts +++ b/sdk/src/types/global.d.ts @@ -1,3 +1,3 @@ -import type { ClaimByIdQuery, ClaimTokensByClaimQuery, ClaimToken, Claim } from "../../.graphclient/index.ts"; +import type { ClaimByIdQuery, ClaimTokensByClaimQuery, ClaimToken, Claim } from "../../.graphclient"; export type { ClaimByIdQuery, ClaimTokensByClaimQuery, ClaimToken, Claim }; diff --git a/sdk/src/types/indexer.ts b/sdk/src/types/indexer.ts index b1b07525..26cd9821 100644 --- a/sdk/src/types/indexer.ts +++ b/sdk/src/types/indexer.ts @@ -6,7 +6,7 @@ import { ClaimTokensByClaimQuery, ClaimTokenByIdQuery, Sdk, -} from "../../.graphclient/index.js"; +} from "../../.graphclient"; export type QueryParams = { orderDirections: "asc" | "desc"; diff --git a/sdk/src/utils/config.ts b/sdk/src/utils/config.ts index bd59eabd..a9dfb228 100644 --- a/sdk/src/utils/config.ts +++ b/sdk/src/utils/config.ts @@ -39,7 +39,7 @@ export const getConfig = (overrides: Partial) => { unsafeForceOverrideConfig: overrides.unsafeForceOverrideConfig, }; } else { - if (!chainId || [5, 10, 11155111].indexOf(chainId) === -1) { + if (!chainId || [5, 10, 42220, 11155111].indexOf(chainId) === -1) { throw new UnsupportedChainError(`chainId=${chainId} is not yet supported`, { chainID: chainId?.toString() || "undefined", }); @@ -87,6 +87,9 @@ const getChainConfig = (overrides: Partial) => { case 10: chainName = "optimism-mainnet"; break; + case 42220: + chainName = "celo"; + break; case 11155111: chainName = "sepolia"; break; diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index d3dd3007..368097f4 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -22,5 +22,5 @@ "skipLibCheck": true }, "exclude": ["node_modules"], - "include": ["./src/*.ts", "./src/**/*", "./.graphclient/**/*", "./test", "global.d.ts"] + "include": ["./src/*.ts", "./src/**/*", "./test", "global.d.ts"] } From c60e8f749c8aa84d794b751ae23c8e64e0588b73 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 23 Oct 2023 23:14:08 +0200 Subject: [PATCH 003/118] fix(gha): use pnpm cache in graph gha (#1138) --- .github/workflows/deploy-graph.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-graph.yml b/.github/workflows/deploy-graph.yml index b5ec5261..74727ea3 100644 --- a/.github/workflows/deploy-graph.yml +++ b/.github/workflows/deploy-graph.yml @@ -33,7 +33,7 @@ jobs: - name: Set up Node.js 18 uses: actions/setup-node@v3 with: - cache: "yarn" + cache: "pnpm" node-version: "18.x" - name: Install run: pnpm install --frozen-lockfile From fe9b359effdf43a2ae202f0f5eae5443d0dca8f9 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Tue, 31 Oct 2023 13:01:52 +0100 Subject: [PATCH 004/118] chore: add wrapper components for split and merge functionality --- .../merge-all-claim-fractions-button.tsx | 26 ++++++++++++++ frontend/components/split-fraction-button.tsx | 24 +++++++++++++ frontend/plasmic-init.ts | 35 +++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 frontend/components/merge-all-claim-fractions-button.tsx create mode 100644 frontend/components/split-fraction-button.tsx diff --git a/frontend/components/merge-all-claim-fractions-button.tsx b/frontend/components/merge-all-claim-fractions-button.tsx new file mode 100644 index 00000000..f0c5d1b3 --- /dev/null +++ b/frontend/components/merge-all-claim-fractions-button.tsx @@ -0,0 +1,26 @@ +import React from "react"; +import { Button } from "@mui/material"; + +interface Props { + claimId: string; + text?: string; + disabled?: boolean; + className?: string; +} + +export function MergeAllClaimFractionsButton({ + text, + claimId, + className, + disabled, +}: Props) { + const onClick = async () => { + console.log("Merging all claim fractions", claimId); + }; + + return ( + + ); +} diff --git a/frontend/components/split-fraction-button.tsx b/frontend/components/split-fraction-button.tsx new file mode 100644 index 00000000..09202758 --- /dev/null +++ b/frontend/components/split-fraction-button.tsx @@ -0,0 +1,24 @@ +import { Button } from "@mui/material"; + +interface Props { + fractionId: string; + text?: string; + disabled?: boolean; + className?: string; +} +export function SplitFractionButton({ + fractionId, + text, + className, + disabled, +}: Props) { + const onClick = async () => { + console.log("Splitting fraction", fractionId); + }; + + return ( + + ); +} diff --git a/frontend/plasmic-init.ts b/frontend/plasmic-init.ts index b8c4149f..c722eca3 100644 --- a/frontend/plasmic-init.ts +++ b/frontend/plasmic-init.ts @@ -32,6 +32,8 @@ import { initPlasmicLoader } from "@plasmicapp/loader-nextjs"; import dynamic from "next/dynamic"; import "primereact/resources/primereact.min.css"; import "primereact/resources/themes/tailwind-light/theme.css"; +import { MergeAllClaimFractionsButton } from "./components/merge-all-claim-fractions-button"; +import { SplitFractionButton } from "./components/split-fraction-button"; export const PLASMIC = initPlasmicLoader({ projects: [ @@ -682,3 +684,36 @@ PLASMIC.registerComponent(ProjectsClientProvider, { width: "Full bleed", }, }); + +PLASMIC.registerComponent(MergeAllClaimFractionsButton, { + name: "MergeAllClaimFractionsButton", + description: + "Button that will merge all fractions in selected claim owned by current owner upon clicking", + props: { + className: "string", + claimId: "string", + disabled: "boolean", + text: { + type: "string", + defaultValue: "Split", + helpText: "Text to display on button", + }, + }, + importPath: "./components/merge-all-claim-fractions-button", +}); + +PLASMIC.registerComponent(SplitFractionButton, { + name: "SplitFractionButton", + description: "Button that will split the fraction currently selected", + props: { + text: { + type: "string", + defaultValue: "Split", + helpText: "Text to display on button", + }, + fractionId: "string", + disabled: "boolean", + className: "string", + }, + importPath: "./components/split-fraction-button", +}); From b033d77e087238753c6e619c752157903d37746c Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Fri, 3 Nov 2023 17:48:16 +0100 Subject: [PATCH 005/118] Fix/handle batch transfers graph (#1149) * feat(batch): add batch transfers to grap --- .lintstagedrc | 2 +- graph/src/hypercert-minter.ts | 36 +++++++++++++++++++++++------------ graph/tests/.latest.json | 2 +- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/.lintstagedrc b/.lintstagedrc index 327ce68e..e6715067 100644 --- a/.lintstagedrc +++ b/.lintstagedrc @@ -1,6 +1,6 @@ { "**/*.{js,jsx,ts,tsx,sol}": [ - "eslint --ignore-path .gitignore --ignore-pattern sdk/ --ignore-pattern graph/generated/", + "eslint --ignore-path .gitignore --ignore-pattern sdk/ --ignore-pattern graph/generated/ --ignore-pattern graph/", "prettier --write" ], "**/*.{md,json}": ["prettier --write"] diff --git a/graph/src/hypercert-minter.ts b/graph/src/hypercert-minter.ts index a9f65e3a..d88fbacf 100644 --- a/graph/src/hypercert-minter.ts +++ b/graph/src/hypercert-minter.ts @@ -17,19 +17,14 @@ import { getOrCreateClaim, getOrCreateClaimToken, } from "./utils"; -import { Address, BigInt, log } from "@graphprotocol/graph-ts"; +import { log } from "@graphprotocol/graph-ts"; import { ClaimToken } from "../generated/schema"; -const ZERO_ADDRESS = Address.fromString( - "0x0000000000000000000000000000000000000000" -); -const ZERO_TOKEN = BigInt.fromI32(0); - export function handleAllowlistCreated(event: AllowlistCreatedEvent): void { let allowlist = getOrCreateAllowlist( event.params.tokenID, event.params.root, - event.address + event.address, ); allowlist.save(); @@ -41,7 +36,7 @@ export function handleClaimStored(event: ClaimStoredEvent): void { let claim = getOrCreateClaim( event.params.claimID, event.address, - event.block.timestamp + event.block.timestamp, ); claim.uri = event.params.uri; @@ -57,10 +52,27 @@ export function handleInitialized(event: InitializedEvent): void {} export function handleLeafClaimed(event: LeafClaimedEvent): void {} export function handleOwnershipTransferred( - event: OwnershipTransferredEvent + event: OwnershipTransferredEvent, ): void {} -export function handleTransferBatch(event: TransferBatchEvent): void {} +export function handleTransferBatch(event: TransferBatchEvent): void { + let ids = event.params.ids; + let size = ids.length; + + for (let i = 0; i < size; i++) { + let id = getID(ids[i], event.address); + let token = ClaimToken.load(id); + + if (!token) { + log.debug("Transfered ClaimToken does not exist: {}", [id]); + return; + } + + token.owner = event.params.to; + + token.save(); + } +} export function handleTransferSingle(event: TransferSingleEvent): void { let id = getID(event.params.id, event.address); @@ -95,12 +107,12 @@ export function handleValueTransfer(event: ValueTransferEvent): void { let from = getOrCreateClaimToken( event.params.claimID, event.params.fromTokenID, - event.address + event.address, ); let to = getOrCreateClaimToken( event.params.claimID, event.params.toTokenID, - event.address + event.address, ); let value = event.params.value; diff --git a/graph/tests/.latest.json b/graph/tests/.latest.json index 4651dd06..ff6bf392 100644 --- a/graph/tests/.latest.json +++ b/graph/tests/.latest.json @@ -1,4 +1,4 @@ { "version": "0.6.0", - "timestamp": 1698094053842 + "timestamp": 1698760525590 } From 859366ae0051bbad8e1a2a23dafd44466bf6e655 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 6 Nov 2023 19:40:13 +0100 Subject: [PATCH 006/118] SDK remove default chainID dependency (#1146) * Feat/batch burn (#1051) * feat(batch_burn): add batch burn function * fix(docs): update SemiFungible1155 docs * chore(lint): cleanup lint ignores * chore(lint): defender lint errors * chore(deploy): reduce optimizer run for kb limit * chore(script): update upgrade script * feat(gha): split graph deploy develop-main * chore(lint): line length rule to warn from err * chore(gha): run CI on PR to develop * chore(gha): run e2e,ci on pr,push to develop * feat(graph): update graph for burn methods * chore(turbo): split graph deploys (#1055) * Fix/workspace label (#1060) chore(yarn): update workspace label * 1052 subgraph a claimed token should indicate whether it was claimed from an allowlist (#1058) * fix(graph): link claim with allowlist * chore(tweak): yada * fix(graph): update mapping to claim (#1061) * nitial trader implementation (#1063) * feat(iface): draft of trader interface * feat(trader): simple offer, buy, cancel flow * feat(db): update allowlist query (#1057) * feat(test): tweaks and initial tests for Trader * chore(gha): remove hardcoded foundry nightly * feat(test): add initial test for trader sales * feat(test): sales tests * feat(deploy): deployed to goerli * chore(ci): updated hh scripts for trader contract * feat(pause): pausable controls and tests * feat(trader): init trader graph * feat(tokens): surface accepted tokens (#1065) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * Feat/accepted tokens (#1066) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * chore(address): update trader address graph * fix(import): add bigint to import * Feat/accepted tokens (#1067) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * chore(address): update trader address graph * fix(import): add bigint to import * fix(log): add logging to trader mapping * [Prod]:Deployed to Celo, updated Defender, version bumps for everyone (#1137) * Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop * Feat/deploy to celo (#1135) * Add HC contracts to OpenZeppelin Defender (#1134) * Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop * feat(defender): use hc packages in oz defender * feat(celo): graph deploy, sdk and defender config * chore(bump): SDK 0.8.14 Celo deployment * feat(celo): add celo support to frontend * chore(graph): fix turbo test flow * chore(graph): add comment to p.json * fix(gha): use pnpm cache in graph gha (#1138) * chore(prep): protocol contracts to protocol dir * chore(prep): tests to protocol dir and remappings * chore(license): MIT license * Feat/init marketplace (#1139) * chore(prep): protocol contracts to protocol dir * chore(prep): tests to protocol dir and remappings * chore(license): MIT license * feat(marketplace): inject, build, refactor, test * chore(gha): run gha on push and develop-branches * fix(build): build and lint errors * chore(pnpm): refresh lock file * chore(build): reduce turbo concurrency * fix(build): whac a mole * chore(build): restore prettier in solhint * chore(build): env.template vars * chore(dist): clean and remap output contracts * chore(clean): last tests * fix(build): ignore cors-proxy type errors * chore(gha): add rpc env vars for fork testing --------- Co-authored-by: jipstavenuiter * chore(lint): cleanup config and affiliate flows (#1140) * chore(license): dual licensing contracts + repo (#1141) * feat(config): updated sdk init config * feat(tests): fix all tests to use updated init * feat(test): uncommented all SDK tests * fix(log): remove result logging * [Test] Release marketplace contracts on testnet and add to contracts package (#1150) * feat(deploy): deploy to testnets * chore(build): hardhat build * feat(pack): release, test, bump updated contracts * chore(gha): updated env vars * chore(pnpm): updated lock file * fix(build): build error, replaced util with viem * fix(pnpm): root dir ethers resolution * chore(pnpm): updated lockfile * fix(pnpm): overrides * chore(build): resolving build issues sdk * chore(refactor): dep resolution bug - del eth v5 * fix(test): mock ipfs in minting, remove timeout * chore(build): fresh build * chore(clean): remove contracts/contracts dir * fix(gha): non-next env var in gha for sdk * chore(run): kick * fix(jest): forceExit hanging async call * chore(build): fresh run for sanity * fix(lint): ignore **/abi instead of **/src/abi * feat(fe): integrate in FE and SDK 0.9.1 * chore(bump): sdk 0.9.1-viem * feat(fe): update FE to use SDK 0.9.1 * chore(cleanup): code cleanup SDK * chore(bump): sdk version bump * chore(fe): update SDK dep version * fix(sdk): chainId config * chore(parse): fix parse calc * fix parse allowlist csv tests * fix injected chain id in config * update component config.tsx * chore(bump): updated sdk alpha * chore(run): sanity check passed * chore(build): graphSDK * feat(fe): plasmic rendering issues. * feat(sdk): web3 token * chore(defender): removed api_key sep network conf * chore(defender): remove verbose log batch action * chore(gha): deduplicate runs - now on all push * chore(lint): lint fe lib * chore(gha): cleaned up env vars --------- Co-authored-by: jipstavenuiter --- .github/workflows/ci-default.yml | 13 +- .github/workflows/e2e-tests.yml | 2 + .lintstagedignore | 10 + .lintstagedrc | 2 +- LICENSE | 203 +- LICENSE-APACHE | 13 + LICENSE-MIT | 21 + contracts/.env.example | 11 +- contracts/.eslintrc.yml | 10 - contracts/.gitignore | 3 +- contracts/.lintstagedrc | 5 +- contracts/.openzeppelin/goerli.json | 1500 ++++++++ contracts/.prettierignore | 4 +- contracts/.prettierrc.yml | 23 - contracts/.solcover.js | 7 - contracts/.solhint.json | 9 +- contracts/.vscode/settings.json | 2 - contracts/LICENSE | 4 + contracts/LICENSE-APACHE | 10 + contracts/{LICENSE.md => LICENSE-MIT} | 7 +- contracts/README.md | 4 +- contracts/contracts/AllowlistMinter.sol | 70 - contracts/contracts/HypercertMinter.sol | 229 -- contracts/contracts/SemiFungible1155.sol | 433 --- contracts/foundry.toml | 31 +- contracts/hardhat.config.ts | 80 +- .../.eslintrc | 31 +- contracts/package.json | 53 +- contracts/remappings.txt | 5 + contracts/rollup.config.mjs | 4 +- contracts/scripts/deployment/Deployment.s.sol | 117 + .../ProtocolFeeRecipientDeployment.s.sol | 43 + contracts/src/SemiFungible1155.sol | 433 --- contracts/src/deployments.json | 22 + contracts/src/index.ts | 60 +- contracts/src/interfaces/IAllowlist.sol | 14 - contracts/src/interfaces/IHypercertToken.sol | 62 - contracts/src/libs/Errors.sol | 15 - .../BatchOrderTypehashRegistry.sol | 62 + .../CreatorFeeManagerWithRebates.sol | 93 + .../CreatorFeeManagerWithRoyalties.sol | 95 + contracts/src/marketplace/CurrencyManager.sol | 37 + .../src/marketplace/ExecutionManager.sol | 304 ++ .../src/marketplace/InheritedStrategy.sol | 89 + .../src/marketplace/LooksRareProtocol.sol | 622 +++ contracts/src/marketplace/NonceManager.sol | 115 + .../src/marketplace/ProtocolFeeRecipient.sol | 54 + contracts/src/marketplace/StrategyManager.sol | 124 + contracts/src/marketplace/TransferManager.sol | 375 ++ .../src/marketplace/TransferSelectorNFT.sol | 67 + .../constants/AssemblyConstants.sol | 42 + .../constants/NumericConstants.sol | 14 + .../constants/ValidationCodeConstants.sol | 313 ++ .../src/marketplace/enums/CollectionType.sol | 13 + contracts/src/marketplace/enums/QuoteType.sol | 10 + .../marketplace/errors/ChainlinkErrors.sol | 41 + .../src/marketplace/errors/SharedErrors.sol | 65 + .../executionStrategies/BaseStrategy.sol | 46 + .../BaseStrategyChainlinkPriceLatency.sol | 33 + .../StrategyChainlinkUSDDynamicAsk.sol | 164 + .../StrategyCollectionOffer.sol | 138 + .../StrategyDutchAuction.sol | 102 + .../StrategyItemIdsRange.sol | 111 + .../marketplace/helpers/OrderValidatorV2A.sol | 845 +++++ .../marketplace/helpers/ProtocolHelpers.sol | 89 + .../interfaces/ICreatorFeeManager.sol | 35 + .../interfaces/ICurrencyManager.sol | 15 + .../interfaces/IExecutionManager.sol | 53 + .../interfaces/IImmutableCreate2Factory.sol | 9 + .../interfaces/ILooksRareProtocol.sol | 166 + .../marketplace/interfaces/INonceManager.sol | 40 + .../interfaces/IRoyaltyFeeRegistry.sol | 20 + .../src/marketplace/interfaces/IStrategy.sol | 30 + .../interfaces/IStrategyManager.sol | 80 + .../interfaces/ITransferManager.sol | 84 + .../libraries/CurrencyValidator.sol | 38 + .../MerkleProofCalldataWithNodes.sol | 61 + .../OpenZeppelin/MerkleProofMemory.sol | 51 + .../marketplace/libraries/OrderStructs.sol | 152 + .../src/{ => protocol}/AllowlistMinter.sol | 22 +- .../src/{ => protocol}/HypercertMinter.sol | 75 +- contracts/src/protocol/SemiFungible1155.sol | 641 ++++ .../protocol}/interfaces/IAllowlist.sol | 11 +- .../protocol}/interfaces/IHypercertToken.sol | 2 +- .../protocol}/libs/Errors.sol | 0 contracts/tasks/deploy.ts | 2 +- contracts/tasks/transfer-owner.ts | 36 +- contracts/tasks/upgrade.ts | 71 +- contracts/test/HypercertMinter.test.ts | 10 +- .../foundry/SemiFungible1155.burning.t.sol | 56 - .../BatchMakerCollectionOrders.t.sol | 111 + .../marketplace/BatchMakerOrders.t.sol | 333 ++ .../BatchOrderTypehashRegistry.t.sol | 120 + .../marketplace/BundleTransactions.t.sol | 260 ++ .../CreatorFeeManagerWithRebates.t.sol | 233 ++ .../CreatorFeeManagerWithRoyalties.t.sol | 350 ++ .../foundry/marketplace/CurrencyManager.t.sol | 42 + .../DelegationRecipientsTaker.t.sol | 172 + .../marketplace/DomainSeparatorUpdates.t.sol | 97 + .../marketplace/ExecutionManager.t.sol | 282 ++ .../foundry/marketplace/GasGriefing.t.sol | 135 + .../foundry/marketplace/InitialStates.t.sol | 55 + .../marketplace/LooksRareProtocol.t.sol | 268 ++ .../marketplace/NonceInvalidation.t.sol | 355 ++ .../marketplace/OrderValidatorV2A.t.sol | 378 ++ .../foundry/marketplace/ProtocolBase.t.sol | 257 ++ .../marketplace/ProtocolFeeRecipient.t.sol | 110 + .../test/foundry/marketplace/Sandbox.t.sol | 142 + .../marketplace/SignaturesEIP2098.t.sol | 66 + .../SignaturesERC1271WalletForERC1155.t.sol | 445 +++ .../SignaturesERC1271WalletForERC721.t.sol | 278 ++ .../marketplace/SignaturesRevertions.t.sol | 173 + .../marketplace/StandardTransactions.t.sol | 508 +++ .../foundry/marketplace/StrategyManager.t.sol | 213 ++ .../foundry/marketplace/TransferManager.t.sol | 527 +++ ...ifyOrderTimestampValidityEquivalence.t.sol | 91 + .../Chainlink/USDDynamicAskOrders.t.sol | 488 +++ .../CollectionOffers.t.sol | 449 +++ .../DutchAuctionOrders.t.sol | 407 ++ .../ItemIdsRangeOrders.t.sol | 486 +++ .../MultiFillCollectionOrders.t.sol | 187 + .../foundry/marketplace/utils/BytesLib.sol | 71 + .../marketplace/utils/EIP712MerkleTree.sol | 114 + .../marketplace/utils/ERC1271Wallet.sol | 20 + .../foundry/marketplace/utils/GasGriefer.sol | 15 + .../utils/MaliciousERC1271Wallet.sol | 66 + ...MaliciousIsValidSignatureERC1271Wallet.sol | 20 + ...aliciousOnERC1155ReceivedERC1271Wallet.sol | 36 + ...C1155ReceivedTheThirdTimeERC1271Wallet.sol | 24 + .../foundry/marketplace/utils/MathLib.sol | 50 + .../marketplace/utils/MerkleWithPosition.sol | 157 + .../marketplace/utils/MockOrderGenerator.sol | 146 + .../marketplace/utils/ProtocolHelpers.sol | 107 + .../StrategyTestMultiFillCollectionOrder.sol | 77 + .../foundry/marketplace/utils/TestHelpers.sol | 26 + .../marketplace/utils/TestParameters.sol | 55 + .../{ => protocol}/AllowlistMinter.t.sol | 27 +- .../foundry/{ => protocol}/Bitshifting.t.sol | 17 +- .../HypercertMinter.batchminting.t.sol | 48 +- .../HypercertMinter.pausable.t.sol | 18 +- .../{ => protocol}/HypercertMinter.t.sol | 42 +- .../HypercertMinter.transfers.t.sol | 14 +- .../{ => protocol}/PerformanceTesting.t.sol | 49 +- .../SemiFungible1155.allowances.t.sol | 8 +- .../protocol/SemiFungible1155.burning.t.sol | 121 + .../SemiFungible1155.minting.t.sol | 24 +- .../{ => protocol}/SemiFungible1155.t.sol | 14 +- .../SemiFungible1155.transfers.t.sol | 18 +- .../{ => protocol}/SemiFungible1155.units.sol | 14 +- .../{ => protocol}/SemiFungibleHelper.sol | 25 +- .../test/mock/MockChainlinkAggregator.sol | 31 + contracts/test/mock/MockERC1155.sol | 29 + .../mock/MockERC1155SupportsNoInterface.sol | 10 + .../mock/MockERC1155WithoutAnyBalanceOf.sol | 21 + .../mock/MockERC1155WithoutBalanceOfBatch.sol | 10 + .../MockERC1155WithoutIsApprovedForAll.sol | 21 + contracts/test/mock/MockERC20.sol | 10 + contracts/test/mock/MockERC721.sol | 31 + .../mock/MockERC721SupportsNoInterface.sol | 10 + .../test/mock/MockERC721WithRoyalties.sol | 53 + .../test/mock/MockRoyaltyFeeRegistry.sol | 95 + contracts/test/mock/MockSmartWallet.sol | 65 + contracts/tsconfig.build.json | 18 +- contracts/tsconfig.json | 21 +- cors-proxy/src/index.ts | 3 + defender/.eslintrc.yml | 2 +- defender/package.json | 8 +- .../batch-mint-claims-from-allowlists.ts | 8 - defender/src/networks.ts | 1 - defender/src/update.ts | 6 +- docs/.eslintrc.yml | 27 + .../api/contracts/HypercertMinter.md | 47 +- .../api/contracts/HypercertTrader.md | 434 +++ .../api/contracts/IHypercertMinter.md | 39 + .../api/contracts/SemiFungible1155.md | 28 +- .../v0.8/interfaces/AggregatorV3Interface.md | 77 + .../contracts/interfaces/IHypercertToken.md | 17 + .../contracts/interfaces/IHypercertTrader.md | 133 + .../marketplace/BatchOrderTypehashRegistry.md | 46 + .../CreatorFeeManagerWithRebates.md | 76 + .../CreatorFeeManagerWithRoyalties.md | 64 + .../contracts/marketplace/CurrencyManager.md | 250 ++ .../contracts/marketplace/ExecutionManager.md | 751 ++++ .../marketplace/InheritedStrategy.md | 9 + .../marketplace/LooksRareProtocol.md | 1157 ++++++ .../api/contracts/marketplace/NonceManager.md | 193 + .../marketplace/ProtocolFeeRecipient.md | 75 + .../contracts/marketplace/StrategyManager.md | 391 ++ .../contracts/marketplace/TransferManager.md | 547 +++ .../marketplace/TransferSelectorNFT.md | 779 ++++ .../executionStrategies/BaseStrategy.md | 41 + .../BaseStrategyChainlinkPriceLatency.md | 212 ++ .../StrategyChainlinkUSDDynamicAsk.md | 342 ++ .../StrategyCollectionOffer.md | 107 + .../StrategyDutchAuction.md | 83 + .../StrategyItemIdsRange.md | 75 + .../marketplace/helpers/OrderValidatorV2A.md | 201 + .../marketplace/helpers/ProtocolHelpers.md | 159 + .../interfaces/ICreatorFeeManager.md | 60 + .../interfaces/ICurrencyManager.md | 22 + .../interfaces/IExecutionManager.md | 99 + .../interfaces/IImmutableCreate2Factory.md | 22 + .../interfaces/ILooksRareProtocol.md | 157 + .../marketplace/interfaces/INonceManager.md | 53 + .../interfaces/IRoyaltyFeeRegistry.md | 29 + .../marketplace/interfaces/IStrategy.md | 41 + .../interfaces/IStrategyManager.md | 84 + .../interfaces/ITransferManager.md | 111 + .../libraries/CurrencyValidator.md | 7 + .../MerkleProofCalldataWithNodes.md | 7 + .../OpenZeppelin/MerkleProofMemory.md | 7 + .../marketplace/libraries/OrderStructs.md | 7 + .../api/contracts/protocol/AllowlistMinter.md | 84 + .../api/contracts/protocol/HypercertMinter.md | 895 +++++ .../contracts/protocol/SemiFungible1155.md | 457 +++ .../protocol/interfaces/IAllowlist.md | 29 + .../protocol/interfaces/IHypercertToken.md | 175 + .../api/contracts/protocol/libs/Errors.md | 59 + docs/package.json | 1 + frontend/.eslintrc.json | 5 - frontend/components/blueprint-create.tsx | 487 --- frontend/components/config.tsx | 15 +- .../contribution-blueprint-create.tsx | 28 - frontend/components/dapp-state.tsx | 4 - frontend/components/hypercert-fetcher.tsx | 2 +- frontend/hooks/burnFraction.ts | 14 +- frontend/hooks/hypercerts-client.ts | 74 +- frontend/hooks/mergeFractionUnits.ts | 13 +- frontend/hooks/mintClaim.ts | 16 +- frontend/hooks/mintClaimAllowlist.ts | 14 +- frontend/hooks/mintFractionAllowlist.ts | 19 +- frontend/hooks/mintFractionAllowlistBatch.ts | 18 +- frontend/hooks/splitClaimUnits.ts | 15 +- frontend/lib/config.ts | 14 +- frontend/lib/hypercert.test.ts | 4 +- frontend/lib/parse-blockchain-error.ts | 13 +- frontend/lib/parsing.test.ts | 44 +- frontend/lib/parsing.ts | 26 +- frontend/next.config.mjs | 1 + frontend/package.json | 10 +- frontend/plasmic-init.ts | 25 - graph/.eslintrc.yml | 11 + graph/abis/HypercertMinter.json | 2189 +++++------ .../HypercertMinter/HypercertMinter.ts | 255 +- graph/generated/schema.ts | 430 +++ graph/schema.graphql | 41 + graph/src/hypercert-minter.ts | 61 +- graph/src/utils.ts | 142 +- graph/subgraph.yaml | 6 +- graph/tests/.latest.json | 2 +- graph/tests/hypercert-minter-burn.test.ts | 189 + graph/tests/hypercert-minter-claim.test.ts | 6 +- graph/tests/hypercert-minter-utils.ts | 147 +- package.json | 9 +- pnpm-lock.yaml | 3363 +++++++++-------- pnpm-workspace.yaml | 2 +- sdk/.graphclient/index.ts | 61 +- sdk/.graphclient/schema.graphql | 4 +- sdk/.graphclientrc.yml | 6 +- sdk/jest.config.ts | 2 +- sdk/package.json | 18 +- sdk/src/client.ts | 361 +- sdk/src/constants.ts | 21 +- sdk/src/evaluations/eas.ts | 155 - sdk/src/evaluations/index.ts | 53 +- sdk/src/index.ts | 12 +- sdk/src/indexer.ts | 9 +- sdk/src/indexer/queries/claims.graphql | 6 +- sdk/src/indexer/queries/fractions.graphql | 6 +- sdk/src/indexer/utils.ts | 2 +- sdk/src/storage.ts | 77 +- sdk/src/types/client.ts | 73 +- sdk/src/types/hypercerts.ts | 4 +- sdk/src/types/index.ts | 16 +- sdk/src/utils/adapters.ts | 41 + sdk/src/utils/config.ts | 216 +- sdk/src/utils/errors.ts | 2 +- sdk/src/utils/formatter.ts | 4 +- sdk/src/utils/resolvers.ts | 6 +- sdk/src/validator/index.ts | 17 +- sdk/test/client.test.ts | 102 +- sdk/test/client/allowlist.minting.test.ts | 247 +- sdk/test/client/burn.test.ts | 109 +- sdk/test/client/minting.test.ts | 123 +- sdk/test/client/split.merge.test.ts | 406 +- sdk/test/evaluations/easEvaluator.test.ts | 90 - sdk/test/evaluations/evaluator.test.ts | 77 +- sdk/test/helpers.ts | 126 +- sdk/test/indexer.test.ts | 2 +- sdk/test/resources/HypercertMinter.json | 1139 ++++++ sdk/test/setup-env.ts | 11 + sdk/test/storage.test.ts | 26 +- sdk/test/storage/nft.storage.test.ts | 49 +- sdk/test/storage/web3.storage.test.ts | 41 +- sdk/test/types/errors.test.ts | 2 +- sdk/test/utils/config.test.ts | 181 +- sdk/test/utils/errors.test.ts | 4 +- sdk/test/utils/formatter.test.ts | 4 +- sdk/test/validator.test.ts | 19 +- sdk/tsconfig.json | 6 +- 300 files changed, 32665 insertions(+), 7033 deletions(-) create mode 100644 .lintstagedignore create mode 100644 LICENSE-APACHE create mode 100644 LICENSE-MIT delete mode 100644 contracts/.solcover.js create mode 100644 contracts/LICENSE create mode 100644 contracts/LICENSE-APACHE rename contracts/{LICENSE.md => LICENSE-MIT} (77%) delete mode 100644 contracts/contracts/AllowlistMinter.sol delete mode 100644 contracts/contracts/HypercertMinter.sol delete mode 100644 contracts/contracts/SemiFungible1155.sol create mode 100644 contracts/scripts/deployment/Deployment.s.sol create mode 100644 contracts/scripts/deployment/ProtocolFeeRecipientDeployment.s.sol delete mode 100644 contracts/src/SemiFungible1155.sol create mode 100644 contracts/src/deployments.json delete mode 100644 contracts/src/interfaces/IAllowlist.sol delete mode 100644 contracts/src/interfaces/IHypercertToken.sol delete mode 100644 contracts/src/libs/Errors.sol create mode 100644 contracts/src/marketplace/BatchOrderTypehashRegistry.sol create mode 100644 contracts/src/marketplace/CreatorFeeManagerWithRebates.sol create mode 100644 contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol create mode 100644 contracts/src/marketplace/CurrencyManager.sol create mode 100644 contracts/src/marketplace/ExecutionManager.sol create mode 100644 contracts/src/marketplace/InheritedStrategy.sol create mode 100644 contracts/src/marketplace/LooksRareProtocol.sol create mode 100644 contracts/src/marketplace/NonceManager.sol create mode 100644 contracts/src/marketplace/ProtocolFeeRecipient.sol create mode 100644 contracts/src/marketplace/StrategyManager.sol create mode 100644 contracts/src/marketplace/TransferManager.sol create mode 100644 contracts/src/marketplace/TransferSelectorNFT.sol create mode 100644 contracts/src/marketplace/constants/AssemblyConstants.sol create mode 100644 contracts/src/marketplace/constants/NumericConstants.sol create mode 100644 contracts/src/marketplace/constants/ValidationCodeConstants.sol create mode 100644 contracts/src/marketplace/enums/CollectionType.sol create mode 100644 contracts/src/marketplace/enums/QuoteType.sol create mode 100644 contracts/src/marketplace/errors/ChainlinkErrors.sol create mode 100644 contracts/src/marketplace/errors/SharedErrors.sol create mode 100644 contracts/src/marketplace/executionStrategies/BaseStrategy.sol create mode 100644 contracts/src/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.sol create mode 100644 contracts/src/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.sol create mode 100644 contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol create mode 100644 contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol create mode 100644 contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol create mode 100644 contracts/src/marketplace/helpers/OrderValidatorV2A.sol create mode 100644 contracts/src/marketplace/helpers/ProtocolHelpers.sol create mode 100644 contracts/src/marketplace/interfaces/ICreatorFeeManager.sol create mode 100644 contracts/src/marketplace/interfaces/ICurrencyManager.sol create mode 100644 contracts/src/marketplace/interfaces/IExecutionManager.sol create mode 100644 contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol create mode 100644 contracts/src/marketplace/interfaces/ILooksRareProtocol.sol create mode 100644 contracts/src/marketplace/interfaces/INonceManager.sol create mode 100644 contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol create mode 100644 contracts/src/marketplace/interfaces/IStrategy.sol create mode 100644 contracts/src/marketplace/interfaces/IStrategyManager.sol create mode 100644 contracts/src/marketplace/interfaces/ITransferManager.sol create mode 100644 contracts/src/marketplace/libraries/CurrencyValidator.sol create mode 100644 contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol create mode 100644 contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol create mode 100644 contracts/src/marketplace/libraries/OrderStructs.sol rename contracts/src/{ => protocol}/AllowlistMinter.sol (83%) rename contracts/src/{ => protocol}/HypercertMinter.sol (80%) create mode 100644 contracts/src/protocol/SemiFungible1155.sol rename contracts/{contracts => src/protocol}/interfaces/IAllowlist.sol (61%) rename contracts/{contracts => src/protocol}/interfaces/IHypercertToken.sol (99%) rename contracts/{contracts => src/protocol}/libs/Errors.sol (100%) delete mode 100644 contracts/test/foundry/SemiFungible1155.burning.t.sol create mode 100644 contracts/test/foundry/marketplace/BatchMakerCollectionOrders.t.sol create mode 100644 contracts/test/foundry/marketplace/BatchMakerOrders.t.sol create mode 100644 contracts/test/foundry/marketplace/BatchOrderTypehashRegistry.t.sol create mode 100644 contracts/test/foundry/marketplace/BundleTransactions.t.sol create mode 100644 contracts/test/foundry/marketplace/CreatorFeeManagerWithRebates.t.sol create mode 100644 contracts/test/foundry/marketplace/CreatorFeeManagerWithRoyalties.t.sol create mode 100644 contracts/test/foundry/marketplace/CurrencyManager.t.sol create mode 100644 contracts/test/foundry/marketplace/DelegationRecipientsTaker.t.sol create mode 100644 contracts/test/foundry/marketplace/DomainSeparatorUpdates.t.sol create mode 100644 contracts/test/foundry/marketplace/ExecutionManager.t.sol create mode 100644 contracts/test/foundry/marketplace/GasGriefing.t.sol create mode 100644 contracts/test/foundry/marketplace/InitialStates.t.sol create mode 100644 contracts/test/foundry/marketplace/LooksRareProtocol.t.sol create mode 100644 contracts/test/foundry/marketplace/NonceInvalidation.t.sol create mode 100644 contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol create mode 100644 contracts/test/foundry/marketplace/ProtocolBase.t.sol create mode 100644 contracts/test/foundry/marketplace/ProtocolFeeRecipient.t.sol create mode 100644 contracts/test/foundry/marketplace/Sandbox.t.sol create mode 100644 contracts/test/foundry/marketplace/SignaturesEIP2098.t.sol create mode 100644 contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol create mode 100644 contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol create mode 100644 contracts/test/foundry/marketplace/SignaturesRevertions.t.sol create mode 100644 contracts/test/foundry/marketplace/StandardTransactions.t.sol create mode 100644 contracts/test/foundry/marketplace/StrategyManager.t.sol create mode 100644 contracts/test/foundry/marketplace/TransferManager.t.sol create mode 100644 contracts/test/foundry/marketplace/assembly/VerifyOrderTimestampValidityEquivalence.t.sol create mode 100644 contracts/test/foundry/marketplace/executionStrategies/Chainlink/USDDynamicAskOrders.t.sol create mode 100644 contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol create mode 100644 contracts/test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol create mode 100644 contracts/test/foundry/marketplace/executionStrategies/ItemIdsRangeOrders.t.sol create mode 100644 contracts/test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol create mode 100644 contracts/test/foundry/marketplace/utils/BytesLib.sol create mode 100644 contracts/test/foundry/marketplace/utils/EIP712MerkleTree.sol create mode 100644 contracts/test/foundry/marketplace/utils/ERC1271Wallet.sol create mode 100644 contracts/test/foundry/marketplace/utils/GasGriefer.sol create mode 100644 contracts/test/foundry/marketplace/utils/MaliciousERC1271Wallet.sol create mode 100644 contracts/test/foundry/marketplace/utils/MaliciousIsValidSignatureERC1271Wallet.sol create mode 100644 contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedERC1271Wallet.sol create mode 100644 contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet.sol create mode 100644 contracts/test/foundry/marketplace/utils/MathLib.sol create mode 100644 contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol create mode 100644 contracts/test/foundry/marketplace/utils/MockOrderGenerator.sol create mode 100644 contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol create mode 100644 contracts/test/foundry/marketplace/utils/StrategyTestMultiFillCollectionOrder.sol create mode 100644 contracts/test/foundry/marketplace/utils/TestHelpers.sol create mode 100644 contracts/test/foundry/marketplace/utils/TestParameters.sol rename contracts/test/foundry/{ => protocol}/AllowlistMinter.t.sol (90%) rename contracts/test/foundry/{ => protocol}/Bitshifting.t.sol (86%) rename contracts/test/foundry/{ => protocol}/HypercertMinter.batchminting.t.sol (86%) rename contracts/test/foundry/{ => protocol}/HypercertMinter.pausable.t.sol (88%) rename contracts/test/foundry/{ => protocol}/HypercertMinter.t.sol (78%) rename contracts/test/foundry/{ => protocol}/HypercertMinter.transfers.t.sol (92%) rename contracts/test/foundry/{ => protocol}/PerformanceTesting.t.sol (82%) rename contracts/test/foundry/{ => protocol}/SemiFungible1155.allowances.t.sol (94%) create mode 100644 contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol rename contracts/test/foundry/{ => protocol}/SemiFungible1155.minting.t.sol (88%) rename contracts/test/foundry/{ => protocol}/SemiFungible1155.t.sol (91%) rename contracts/test/foundry/{ => protocol}/SemiFungible1155.transfers.t.sol (94%) rename contracts/test/foundry/{ => protocol}/SemiFungible1155.units.sol (89%) rename contracts/test/foundry/{ => protocol}/SemiFungibleHelper.sol (87%) create mode 100644 contracts/test/mock/MockChainlinkAggregator.sol create mode 100644 contracts/test/mock/MockERC1155.sol create mode 100644 contracts/test/mock/MockERC1155SupportsNoInterface.sol create mode 100644 contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol create mode 100644 contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol create mode 100644 contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol create mode 100644 contracts/test/mock/MockERC20.sol create mode 100644 contracts/test/mock/MockERC721.sol create mode 100644 contracts/test/mock/MockERC721SupportsNoInterface.sol create mode 100644 contracts/test/mock/MockERC721WithRoyalties.sol create mode 100644 contracts/test/mock/MockRoyaltyFeeRegistry.sol create mode 100644 contracts/test/mock/MockSmartWallet.sol create mode 100644 docs/.eslintrc.yml create mode 100644 docs/docs/developer/api/contracts/HypercertTrader.md create mode 100644 docs/docs/developer/api/contracts/IHypercertMinter.md create mode 100644 docs/docs/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md create mode 100644 docs/docs/developer/api/contracts/interfaces/IHypercertTrader.md create mode 100644 docs/docs/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md create mode 100644 docs/docs/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md create mode 100644 docs/docs/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md create mode 100644 docs/docs/developer/api/contracts/marketplace/CurrencyManager.md create mode 100644 docs/docs/developer/api/contracts/marketplace/ExecutionManager.md create mode 100644 docs/docs/developer/api/contracts/marketplace/InheritedStrategy.md create mode 100644 docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md create mode 100644 docs/docs/developer/api/contracts/marketplace/NonceManager.md create mode 100644 docs/docs/developer/api/contracts/marketplace/ProtocolFeeRecipient.md create mode 100644 docs/docs/developer/api/contracts/marketplace/StrategyManager.md create mode 100644 docs/docs/developer/api/contracts/marketplace/TransferManager.md create mode 100644 docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md create mode 100644 docs/docs/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md create mode 100644 docs/docs/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md create mode 100644 docs/docs/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md create mode 100644 docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md create mode 100644 docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md create mode 100644 docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md create mode 100644 docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md create mode 100644 docs/docs/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md create mode 100644 docs/docs/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md create mode 100644 docs/docs/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md create mode 100644 docs/docs/developer/api/contracts/marketplace/interfaces/IExecutionManager.md create mode 100644 docs/docs/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md create mode 100644 docs/docs/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md create mode 100644 docs/docs/developer/api/contracts/marketplace/interfaces/INonceManager.md create mode 100644 docs/docs/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md create mode 100644 docs/docs/developer/api/contracts/marketplace/interfaces/IStrategy.md create mode 100644 docs/docs/developer/api/contracts/marketplace/interfaces/IStrategyManager.md create mode 100644 docs/docs/developer/api/contracts/marketplace/interfaces/ITransferManager.md create mode 100644 docs/docs/developer/api/contracts/marketplace/libraries/CurrencyValidator.md create mode 100644 docs/docs/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md create mode 100644 docs/docs/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md create mode 100644 docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md create mode 100644 docs/docs/developer/api/contracts/protocol/AllowlistMinter.md create mode 100644 docs/docs/developer/api/contracts/protocol/HypercertMinter.md create mode 100644 docs/docs/developer/api/contracts/protocol/SemiFungible1155.md create mode 100644 docs/docs/developer/api/contracts/protocol/interfaces/IAllowlist.md create mode 100644 docs/docs/developer/api/contracts/protocol/interfaces/IHypercertToken.md create mode 100644 docs/docs/developer/api/contracts/protocol/libs/Errors.md delete mode 100644 frontend/components/blueprint-create.tsx delete mode 100644 frontend/components/contribution-blueprint-create.tsx create mode 100644 graph/.eslintrc.yml create mode 100644 graph/tests/hypercert-minter-burn.test.ts delete mode 100644 sdk/src/evaluations/eas.ts create mode 100644 sdk/src/utils/adapters.ts delete mode 100644 sdk/test/evaluations/easEvaluator.test.ts create mode 100644 sdk/test/resources/HypercertMinter.json diff --git a/.github/workflows/ci-default.yml b/.github/workflows/ci-default.yml index a7242d72..a52e21bf 100644 --- a/.github/workflows/ci-default.yml +++ b/.github/workflows/ci-default.yml @@ -7,27 +7,22 @@ env: NEXT_PUBLIC_DEFAULT_CHAIN_ID: ${{ vars.NEXT_PUBLIC_DEFAULT_CHAIN_ID }} NEXT_PUBLIC_CONTRACT_ADDRESS: ${{ vars.NEXT_PUBLIC_CONTRACT_ADDRESS }} NEXT_PUBLIC_GRAPH_URL: ${{ vars.NEXT_PUBLIC_GRAPH_URL }} + NFT_STORAGE_TOKEN: ${{ secrets.NEXT_PUBLIC_NFT_STORAGE_TOKEN }} + WEB3_STORAGE_TOKEN: ${{ secrets.NEXT_PUBLIC_NFT_STORAGE_TOKEN }} NEXT_PUBLIC_NFT_STORAGE_TOKEN: ${{ secrets.NEXT_PUBLIC_NFT_STORAGE_TOKEN }} NEXT_PUBLIC_WEB3_STORAGE_TOKEN: ${{ secrets.NEXT_PUBLIC_NFT_STORAGE_TOKEN }} NEXT_PUBLIC_SUPABASE_URL: ${{ vars.NEXT_PUBLIC_SUPABASE_URL }} NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }} NEXT_PUBLIC_SUPABASE_TABLE: ${{ vars.NEXT_PUBLIC_SUPABASE_TABLE }} NEXT_PUBLIC_WALLETCONNECT_ID: ${{ secrets.NEXT_PUBLIC_WALLETCONNECT_ID }} + INFURA_API_KEY: ${{ vars.INFURA_API_KEY }} + ALCHEMY_API_KEY: ${{ vars.ALCHEMY_API_KEY }} DOCKER_PLATFORM: "amd64" # Trigger the workflow when: on: # A push occurs to one of the matched branches. push: - branches: - - main - - develop - # Or when a pull request event occurs for a pull request against one of the - # matched branches. - pull_request: - branches: - - main - - develop # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 33c3be37..1337bfe4 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -16,11 +16,13 @@ on: push: branches: - main + - develop # Or when a pull request event occurs for a pull request against one of the # matched branches. pull_request: branches: - main + - develop # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/.lintstagedignore b/.lintstagedignore new file mode 100644 index 00000000..339baae4 --- /dev/null +++ b/.lintstagedignore @@ -0,0 +1,10 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# root config +playwright.config.ts + +# patterns +graph/generated/ +e2e +docs +vendor \ No newline at end of file diff --git a/.lintstagedrc b/.lintstagedrc index e6715067..ad678de5 100644 --- a/.lintstagedrc +++ b/.lintstagedrc @@ -1,6 +1,6 @@ { "**/*.{js,jsx,ts,tsx,sol}": [ - "eslint --ignore-path .gitignore --ignore-pattern sdk/ --ignore-pattern graph/generated/ --ignore-pattern graph/", + "eslint --ignore-path .gitignore --ignore-path .lintstagedignore", "prettier --write" ], "**/*.{md,json}": ["prettier --write"] diff --git a/LICENSE b/LICENSE index 261eeb9e..dba11665 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,4 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +This project is dual licensed under MIT and Apache-2.0. - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +MIT: https://www.opensource.org/licenses/mit +Apache-2.0: https://www.apache.org/licenses/license-2.0 \ No newline at end of file diff --git a/LICENSE-APACHE b/LICENSE-APACHE new file mode 100644 index 00000000..103c2143 --- /dev/null +++ b/LICENSE-APACHE @@ -0,0 +1,13 @@ +Copyright 2023 Hypercerts Foundation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 00000000..d67b8580 --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright © 2023 Hypercerts Foundation + +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. \ No newline at end of file diff --git a/contracts/.env.example b/contracts/.env.example index b7c57fac..235bb631 100644 --- a/contracts/.env.example +++ b/contracts/.env.example @@ -2,7 +2,7 @@ MNEMONIC="test test test test test test test test test test test junk" MNEMONIC_CELO=="test test test test test test test test test test test junk" INFURA_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" -ALCHEMY_OPTIMISM_URL="https://opt-mainnet.g.alchemy.com/v2/zzzzzzzzzzzzzzzzzzz" +ALCHEMY_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" # OpenZeppelin OPENZEPPELIN_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" @@ -14,6 +14,13 @@ OPTIMISTIC_ETHERSCAN_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" CELOSCAN_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" # Unused, ignore below -POLYGONSCAN_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" REPORT_GAS=false CMC_API_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" + +# Marketplace +OWNER_ADDRESS="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +TRANSFER_MANAGER_SALT="bbbbbbbbbbbbbb" +LOOKSRARE_PROTOCOL_SALT="cccccccccccccc" +STRATEGY_COLLECTION_OFFER_SALT="dddddddddddddd" +PROTOCOL_FEE_RECIPIENT_ADDRESS="eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" + diff --git a/contracts/.eslintrc.yml b/contracts/.eslintrc.yml index a6c77c81..bc63dc32 100644 --- a/contracts/.eslintrc.yml +++ b/contracts/.eslintrc.yml @@ -8,13 +8,3 @@ parserOptions: project: "./contracts/tsconfig.json" plugins: - "@typescript-eslint" -rules: - "@typescript-eslint/no-floating-promises": - - error - - ignoreIIFE: true - ignoreVoid: true - "@typescript-eslint/no-inferrable-types": "off" - "@typescript-eslint/no-unused-vars": - - error - - argsIgnorePattern: "_" - varsIgnorePattern: "_" diff --git a/contracts/.gitignore b/contracts/.gitignore index 41c2623f..2d812b19 100644 --- a/contracts/.gitignore +++ b/contracts/.gitignore @@ -18,7 +18,7 @@ **/deployments/localhost **/out* **/typechain -**/src/types +**/types **/cache** **/abi **/rollup-cache @@ -35,6 +35,7 @@ yarn-error.log* .DS_Store /.idea test*.svg +lcov.info # broadcasts !/broadcast diff --git a/contracts/.lintstagedrc b/contracts/.lintstagedrc index 45a7492d..0e2564c9 100644 --- a/contracts/.lintstagedrc +++ b/contracts/.lintstagedrc @@ -1,5 +1,4 @@ { - "*.{js,json,md,sol,ts,yml}": [ - "prettier --config ./.prettierrc.yml --write" - ] + "*.{js,json,md,ts,yml}": ["prettier --config ./.prettierrc.yml --write"], + "*.{sol}": ["forge fmt"] } diff --git a/contracts/.openzeppelin/goerli.json b/contracts/.openzeppelin/goerli.json index e9968158..4058c77b 100644 --- a/contracts/.openzeppelin/goerli.json +++ b/contracts/.openzeppelin/goerli.json @@ -30,6 +30,11 @@ "address": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", "txHash": "0xeeb032f25fb656971f835204d0bd825f766593afadfe420110903420bb4f7071", "kind": "uups" + }, + { + "address": "0x689587461AA3103D3D7975c5e4B352Ab711C14C2", + "txHash": "0x236119a264468c853263e067fbde6781c2c4109a5a3027a9adcfdca56b9bdacb", + "kind": "uups" } ], "impls": { @@ -4403,6 +4408,1501 @@ } } } + }, + "a74a0b26cd000c4d5c3717e7e2b2c4060405bf4c2f315356073581f711bf134d": { + "address": "0xDb77A1fDC905685B4052a512522D502638DdA5E3", + "txHash": "0xfe64805f07143e91ce6d02ce69e95c21f688a0cc083495baafba764274de05ff", + "layout": { + "solcVersion": "0.8.16", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_balances", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:25" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:28" + }, + { + "label": "_uri", + "offset": 0, + "slot": "103", + "type": "t_string_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "104", + "type": "t_array(t_uint256)47_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:528" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1155BurnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol:52" + }, + { + "label": "_baseURI", + "offset": 0, + "slot": "201", + "type": "t_string_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:27" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "202", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:30" + }, + { + "label": "__gap", + "offset": 0, + "slot": "203", + "type": "t_array(t_uint256)48_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:77" + }, + { + "label": "_owner", + "offset": 0, + "slot": "251", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "351", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "typeCounter", + "offset": 0, + "slot": "401", + "type": "t_uint256", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:27" + }, + { + "label": "owners", + "offset": 0, + "slot": "402", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:38" + }, + { + "label": "creators", + "offset": 0, + "slot": "403", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:41" + }, + { + "label": "tokenValues", + "offset": 0, + "slot": "404", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:44" + }, + { + "label": "maxIndex", + "offset": 0, + "slot": "405", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:47" + }, + { + "label": "__gap", + "offset": 0, + "slot": "406", + "type": "t_array(t_uint256)25_storage", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:612" + }, + { + "label": "merkleRoots", + "offset": 0, + "slot": "431", + "type": "t_mapping(t_uint256,t_bytes32)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:17" + }, + { + "label": "hasBeenClaimed", + "offset": 0, + "slot": "432", + "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:18" + }, + { + "label": "maxUnits", + "offset": 0, + "slot": "433", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:19" + }, + { + "label": "minted", + "offset": 0, + "slot": "434", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "435", + "type": "t_array(t_uint256)26_storage", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:69" + }, + { + "label": "_paused", + "offset": 0, + "slot": "461", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "462", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:116" + }, + { + "label": "typeRestrictions", + "offset": 0, + "slot": "511", + "type": "t_mapping(t_uint256,t_enum(TransferRestrictions)6957)", + "contract": "HypercertMinter", + "src": "src/HypercertMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "512", + "type": "t_array(t_uint256)29_storage", + "contract": "HypercertMinter", + "src": "src/HypercertMinter.sol:246" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)25_storage": { + "label": "uint256[25]", + "numberOfBytes": "800" + }, + "t_array(t_uint256)26_storage": { + "label": "uint256[26]", + "numberOfBytes": "832" + }, + "t_array(t_uint256)29_storage": { + "label": "uint256[29]", + "numberOfBytes": "928" + }, + "t_array(t_uint256)47_storage": { + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_enum(TransferRestrictions)6957": { + "label": "enum IHypercertToken.TransferRestrictions", + "members": [ + "AllowAll", + "DisallowAll", + "FromCreatorOnly" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bytes32)": { + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_enum(TransferRestrictions)6957)": { + "label": "mapping(uint256 => enum IHypercertToken.TransferRestrictions)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))": { + "label": "mapping(uint256 => mapping(bytes32 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "d1832c305d4610ff816070ba0b32f8fcbb0e86cead29b4261acf08bd5c0836e6": { + "address": "0x8561eAE9962FA3af19e2E972Ea717d4AD407BDbF", + "txHash": "0x0bcef85a53eb6fdec51cfa3c817e013b1ecf19f0a9387384202fae0ef66985a2", + "layout": { + "solcVersion": "0.8.16", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "101", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:116" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "201", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "totalUnitsForSale", + "offset": 0, + "slot": "251", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:30" + }, + { + "label": "offers", + "offset": 0, + "slot": "252", + "type": "t_mapping(t_uint256,t_struct(Offer)7905_storage)", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:31" + }, + { + "label": "_offerCounter", + "offset": 0, + "slot": "253", + "type": "t_uint256", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:32" + }, + { + "label": "__gap", + "offset": 0, + "slot": "254", + "type": "t_array(t_uint256)27_storage", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:359" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(AcceptedToken)7917_storage)dyn_storage": { + "label": "struct IHypercertTrader.AcceptedToken[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)27_storage": { + "label": "uint256[27]", + "numberOfBytes": "864" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_enum(OfferStatus)7912": { + "label": "enum IHypercertTrader.OfferStatus", + "members": [ + "Open", + "Fulfilled", + "Cancelled" + ], + "numberOfBytes": "1" + }, + "t_enum(OfferType)7908": { + "label": "enum IHypercertTrader.OfferType", + "members": [ + "Units", + "Fraction" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Offer)7905_storage)": { + "label": "mapping(uint256 => struct IHypercertTrader.Offer)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AcceptedToken)7917_storage": { + "label": "struct IHypercertTrader.AcceptedToken", + "members": [ + { + "label": "token", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "minimumAmountPerUnit", + "type": "t_uint256", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Offer)7905_storage": { + "label": "struct IHypercertTrader.Offer", + "members": [ + { + "label": "offerer", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "hypercertContract", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "fractionID", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "unitsAvailable", + "type": "t_uint256", + "offset": 0, + "slot": "3" + }, + { + "label": "minUnitsPerTrade", + "type": "t_uint256", + "offset": 0, + "slot": "4" + }, + { + "label": "maxUnitsPerTrade", + "type": "t_uint256", + "offset": 0, + "slot": "5" + }, + { + "label": "offerType", + "type": "t_enum(OfferType)7908", + "offset": 0, + "slot": "6" + }, + { + "label": "status", + "type": "t_enum(OfferStatus)7912", + "offset": 1, + "slot": "6" + }, + { + "label": "acceptedTokens", + "type": "t_array(t_struct(AcceptedToken)7917_storage)dyn_storage", + "offset": 0, + "slot": "7" + } + ], + "numberOfBytes": "256" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "dd332b99b39b573f44ffeb5c8685891923934c7ddf4763cc7767f224483eff8a": { + "address": "0x0A00a2f09cd37B24E7429c5238323bfebCfF3Ed9", + "txHash": "0xa2c8831ddf933b36362efd3e4cd6a0f2ba640d0a4908f3f97ae43c4661077ead", + "layout": { + "solcVersion": "0.8.16", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_balances", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:25" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:28" + }, + { + "label": "_uri", + "offset": 0, + "slot": "103", + "type": "t_string_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "104", + "type": "t_array(t_uint256)47_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:528" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1155BurnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol:52" + }, + { + "label": "_baseURI", + "offset": 0, + "slot": "201", + "type": "t_string_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:27" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "202", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:30" + }, + { + "label": "__gap", + "offset": 0, + "slot": "203", + "type": "t_array(t_uint256)48_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:77" + }, + { + "label": "_owner", + "offset": 0, + "slot": "251", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "351", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "typeCounter", + "offset": 0, + "slot": "401", + "type": "t_uint256", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:27" + }, + { + "label": "owners", + "offset": 0, + "slot": "402", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:38" + }, + { + "label": "creators", + "offset": 0, + "slot": "403", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:41" + }, + { + "label": "tokenValues", + "offset": 0, + "slot": "404", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:44" + }, + { + "label": "maxIndex", + "offset": 0, + "slot": "405", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:47" + }, + { + "label": "__gap", + "offset": 0, + "slot": "406", + "type": "t_array(t_uint256)25_storage", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:612" + }, + { + "label": "merkleRoots", + "offset": 0, + "slot": "431", + "type": "t_mapping(t_uint256,t_bytes32)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:17" + }, + { + "label": "hasBeenClaimed", + "offset": 0, + "slot": "432", + "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:18" + }, + { + "label": "maxUnits", + "offset": 0, + "slot": "433", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:19" + }, + { + "label": "minted", + "offset": 0, + "slot": "434", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "435", + "type": "t_array(t_uint256)26_storage", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:69" + }, + { + "label": "_paused", + "offset": 0, + "slot": "461", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "462", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:116" + }, + { + "label": "typeRestrictions", + "offset": 0, + "slot": "511", + "type": "t_mapping(t_uint256,t_enum(TransferRestrictions)7777)", + "contract": "HypercertMinter", + "src": "src/HypercertMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "512", + "type": "t_array(t_uint256)29_storage", + "contract": "HypercertMinter", + "src": "src/HypercertMinter.sol:246" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)25_storage": { + "label": "uint256[25]", + "numberOfBytes": "800" + }, + "t_array(t_uint256)26_storage": { + "label": "uint256[26]", + "numberOfBytes": "832" + }, + "t_array(t_uint256)29_storage": { + "label": "uint256[29]", + "numberOfBytes": "928" + }, + "t_array(t_uint256)47_storage": { + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_enum(TransferRestrictions)7777": { + "label": "enum IHypercertToken.TransferRestrictions", + "members": [ + "AllowAll", + "DisallowAll", + "FromCreatorOnly" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bytes32)": { + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_enum(TransferRestrictions)7777)": { + "label": "mapping(uint256 => enum IHypercertToken.TransferRestrictions)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))": { + "label": "mapping(uint256 => mapping(bytes32 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "18f4479dd70171f19657f8c092580a0d6e9ec28cf1867e45d3e9e87aff3e1ee2": { + "address": "0xFf3F27c6132c30d1098b97FfeC05C3150dA90432", + "txHash": "0xaf2c9d0708fafea03a10da1e6b25f340c4a2847b09032d2890d40167496c7b49", + "layout": { + "solcVersion": "0.8.16", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "101", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:116" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "201", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "totalUnitsForSale", + "offset": 0, + "slot": "251", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:36" + }, + { + "label": "offers", + "offset": 0, + "slot": "252", + "type": "t_mapping(t_uint256,t_struct(Offer)2510_storage)", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:37" + }, + { + "label": "_offerCounter", + "offset": 0, + "slot": "253", + "type": "t_uint256", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "254", + "type": "t_array(t_uint256)27_storage", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:387" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(AcceptedToken)2522_storage)dyn_storage": { + "label": "struct IHypercertTrader.AcceptedToken[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)27_storage": { + "label": "uint256[27]", + "numberOfBytes": "864" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_enum(OfferStatus)2517": { + "label": "enum IHypercertTrader.OfferStatus", + "members": [ + "Open", + "Fulfilled", + "Cancelled" + ], + "numberOfBytes": "1" + }, + "t_enum(OfferType)2513": { + "label": "enum IHypercertTrader.OfferType", + "members": [ + "Units", + "Fraction" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Offer)2510_storage)": { + "label": "mapping(uint256 => struct IHypercertTrader.Offer)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AcceptedToken)2522_storage": { + "label": "struct IHypercertTrader.AcceptedToken", + "members": [ + { + "label": "token", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "minimumAmountPerUnit", + "type": "t_uint256", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Offer)2510_storage": { + "label": "struct IHypercertTrader.Offer", + "members": [ + { + "label": "offerer", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "hypercertContract", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "fractionID", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "unitsAvailable", + "type": "t_uint256", + "offset": 0, + "slot": "3" + }, + { + "label": "minUnitsPerTrade", + "type": "t_uint256", + "offset": 0, + "slot": "4" + }, + { + "label": "maxUnitsPerTrade", + "type": "t_uint256", + "offset": 0, + "slot": "5" + }, + { + "label": "offerType", + "type": "t_enum(OfferType)2513", + "offset": 0, + "slot": "6" + }, + { + "label": "status", + "type": "t_enum(OfferStatus)2517", + "offset": 1, + "slot": "6" + }, + { + "label": "acceptedTokens", + "type": "t_array(t_struct(AcceptedToken)2522_storage)dyn_storage", + "offset": 0, + "slot": "7" + } + ], + "numberOfBytes": "256" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "c448a5dca6b776aedb55eb5857ea7c6a03d1ccd3ff709786879396d71bf7dbb2": { + "address": "0x038c990018b9Aab4aA2496E592E668EAD77aF72B", + "txHash": "0xe07f42a41b70affd1fdd08ce8011f55a35b0e62a9ef67d0b5c4daa04b6028f60", + "layout": { + "solcVersion": "0.8.16", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "101", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:116" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "201", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "totalUnitsForSale", + "offset": 0, + "slot": "251", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:36" + }, + { + "label": "offers", + "offset": 0, + "slot": "252", + "type": "t_mapping(t_uint256,t_struct(Offer)8003_storage)", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:37" + }, + { + "label": "_offerCounter", + "offset": 0, + "slot": "253", + "type": "t_uint256", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "254", + "type": "t_array(t_uint256)27_storage", + "contract": "HypercertTrader", + "src": "src/HypercertTrader.sol:392" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(AcceptedToken)8015_storage)dyn_storage": { + "label": "struct IHypercertTrader.AcceptedToken[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)27_storage": { + "label": "uint256[27]", + "numberOfBytes": "864" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_enum(OfferStatus)8010": { + "label": "enum IHypercertTrader.OfferStatus", + "members": [ + "Open", + "Fulfilled", + "Cancelled" + ], + "numberOfBytes": "1" + }, + "t_enum(OfferType)8006": { + "label": "enum IHypercertTrader.OfferType", + "members": [ + "Units", + "Fraction" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Offer)8003_storage)": { + "label": "mapping(uint256 => struct IHypercertTrader.Offer)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AcceptedToken)8015_storage": { + "label": "struct IHypercertTrader.AcceptedToken", + "members": [ + { + "label": "token", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "minimumAmountPerUnit", + "type": "t_uint256", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Offer)8003_storage": { + "label": "struct IHypercertTrader.Offer", + "members": [ + { + "label": "offerer", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "hypercertContract", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "fractionID", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "unitsAvailable", + "type": "t_uint256", + "offset": 0, + "slot": "3" + }, + { + "label": "minUnitsPerTrade", + "type": "t_uint256", + "offset": 0, + "slot": "4" + }, + { + "label": "maxUnitsPerTrade", + "type": "t_uint256", + "offset": 0, + "slot": "5" + }, + { + "label": "offerType", + "type": "t_enum(OfferType)8006", + "offset": 0, + "slot": "6" + }, + { + "label": "status", + "type": "t_enum(OfferStatus)8010", + "offset": 1, + "slot": "6" + }, + { + "label": "acceptedTokens", + "type": "t_array(t_struct(AcceptedToken)8015_storage)dyn_storage", + "offset": 0, + "slot": "7" + } + ], + "numberOfBytes": "256" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } } } } diff --git a/contracts/.prettierignore b/contracts/.prettierignore index 406d1f27..87bdd5b4 100644 --- a/contracts/.prettierignore +++ b/contracts/.prettierignore @@ -17,13 +17,15 @@ **/deployments **/.openzeppelin **/docs -**/src/abi/ +**/abi # files *.env *.log +*.sol .pnp.* coverage.json npm-debug.log* yarn-debug.log* yarn-error.log* +.DS_Store diff --git a/contracts/.prettierrc.yml b/contracts/.prettierrc.yml index 0f125e7c..b8ea7e0f 100644 --- a/contracts/.prettierrc.yml +++ b/contracts/.prettierrc.yml @@ -6,26 +6,3 @@ singleQuote: false tabWidth: 2 trailingComma: "all" useTabs: false - -plugins: - - prettier-plugin-solidity - -overrides: - - files: "**/*.t.sol" - rules: - max-state-count": "off" - state-visibility": "off" - max-line-length": "off" - options: - tabWidth: 4 - - files: "*.sol" - rules: - compiler-version: "0.8.16" - options: - tabWidth: 4 - - files: "*.ts" - options: - importOrder: ["", "^[./]"] - importOrderParserPlugins: ["importAssertions", "typescript"] - importOrderSeparation: true - importOrderSortSpecifiers: true diff --git a/contracts/.solcover.js b/contracts/.solcover.js deleted file mode 100644 index a6b8e642..00000000 --- a/contracts/.solcover.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - istanbulReporter: ["html", "lcov"], - providerOptions: { - mnemonic: process.env.MNEMONIC, - }, - skipFiles: ["test", "mocks", "lib"], -}; diff --git a/contracts/.solhint.json b/contracts/.solhint.json index 48849103..78d99a5a 100644 --- a/contracts/.solhint.json +++ b/contracts/.solhint.json @@ -1,13 +1,14 @@ { - "plugins": ["prettier"], "extends": "solhint:recommended", "rules": { - "code-complexity": ["error", 8], - "compiler-version": ["error", "0.8.16"], + "avoid-low-level-calls": "off", + "code-complexity": ["error", 12], + "compiler-version": ["error", ">=0.8.16"], "func-visibility": ["error", { "ignoreConstructors": true }], - "max-line-length": ["error", 120], "no-console": "off", + "no-empty-blocks": "off", "not-rely-on-time": "off", + "private-vars-leading-underscore": "off", "reason-string": ["warn", { "maxLength": 64 }], "one-contract-per-file": "off" } diff --git a/contracts/.vscode/settings.json b/contracts/.vscode/settings.json index 5a74fb60..ea8a1e8a 100644 --- a/contracts/.vscode/settings.json +++ b/contracts/.vscode/settings.json @@ -1,10 +1,8 @@ { "editor.formatOnSave": true, - "solidity.formatter": "prettier", "solidity.packageDefaultDependenciesContractsDirectory": "src", "solidity.packageDefaultDependenciesDirectory": "lib", "solidity.remappings": ["./remappings.txt"], - "solidity.defaultCompiler": "remoteFile", "files.exclude": { "**/.git": true, "**/.svn": true, diff --git a/contracts/LICENSE b/contracts/LICENSE new file mode 100644 index 00000000..dba11665 --- /dev/null +++ b/contracts/LICENSE @@ -0,0 +1,4 @@ +This project is dual licensed under MIT and Apache-2.0. + +MIT: https://www.opensource.org/licenses/mit +Apache-2.0: https://www.apache.org/licenses/license-2.0 \ No newline at end of file diff --git a/contracts/LICENSE-APACHE b/contracts/LICENSE-APACHE new file mode 100644 index 00000000..d4cc5a41 --- /dev/null +++ b/contracts/LICENSE-APACHE @@ -0,0 +1,10 @@ +Copyright 2023 Hypercerts Foundation + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. diff --git a/contracts/LICENSE.md b/contracts/LICENSE-MIT similarity index 77% rename from contracts/LICENSE.md rename to contracts/LICENSE-MIT index 054bdbe3..4e9e555e 100644 --- a/contracts/LICENSE.md +++ b/contracts/LICENSE-MIT @@ -1,6 +1,11 @@ MIT License -Copyright (c) 2022 Paul Razvan Berg +Copyright (c) 2022 Hypercerts Foundation: Hypercerts protocol and marketplace. + +Copyright (c) 2022 LooksRare for portions of marketplace: https://github.com/LooksRare/contracts-exchange-v2 commit: +7fca565 + +Copyright (c) 2022 Paul Razvan Berg for inital template: https://github.com/paulrberg/foundry-template 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 diff --git a/contracts/README.md b/contracts/README.md index 6320a762..fc293242 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -88,7 +88,7 @@ yarn hardhat deploy --network goerli To transfer ownership of the proxy contract for upgrades, run the following: ```sh -yarn hardhat transfer-owner --network goerli --proxy PROXY_CONTRACT_ADDRESS --owner NEW_OWNER_ADDRESS +yarn hardhat transfer-owner-minter --network goerli --proxy PROXY_CONTRACT_ADDRESS --owner NEW_OWNER_ADDRESS ``` This is typically done to transfer control to a multi-sig (i.e. Gnosis Safe). @@ -110,7 +110,7 @@ Propose an upgrade via OpenZeppelin Defender. For more information, see this ```sh yarn build:hardhat -yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS +yarn hardhat propose-upgrade-minter --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS ``` This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. diff --git a/contracts/contracts/AllowlistMinter.sol b/contracts/contracts/AllowlistMinter.sol deleted file mode 100644 index 576b45ee..00000000 --- a/contracts/contracts/AllowlistMinter.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.16; - -import { MerkleProofUpgradeable } from "oz-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; -import { IAllowlist } from "./interfaces/IAllowlist.sol"; - -import { Errors } from "./libs/Errors.sol"; - -/// @title Interface for hypercert token interactions -/// @author bitbeckers -/// @notice This interface declares the required functionality for a hypercert token -/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) -contract AllowlistMinter is IAllowlist { - event AllowlistCreated(uint256 tokenID, bytes32 root); - event LeafClaimed(uint256 tokenID, bytes32 leaf); - - mapping(uint256 => bytes32) internal merkleRoots; - mapping(uint256 => mapping(bytes32 => bool)) public hasBeenClaimed; - mapping(uint256 => uint256) internal maxUnits; - mapping(uint256 => uint256) internal minted; - - function isAllowedToClaim( - bytes32[] calldata proof, - uint256 claimID, - bytes32 leaf - ) external view returns (bool isAllowed) { - if (merkleRoots[claimID].length == 0) revert Errors.DoesNotExist(); - isAllowed = MerkleProofUpgradeable.verifyCalldata(proof, merkleRoots[claimID], leaf); - } - - function _createAllowlist(uint256 claimID, bytes32 merkleRoot, uint256 units) internal { - if (merkleRoot == "" || units == 0) revert Errors.Invalid(); - if (merkleRoots[claimID] != "") revert Errors.DuplicateEntry(); - - merkleRoots[claimID] = merkleRoot; - maxUnits[claimID] = units; - emit AllowlistCreated(claimID, merkleRoot); - } - - function _processClaim(bytes32[] calldata proof, uint256 claimID, uint256 amount) internal { - if (merkleRoots[claimID].length == 0) revert Errors.DoesNotExist(); - - bytes32 leaf = _calculateLeaf(msg.sender, amount); - - if (hasBeenClaimed[claimID][leaf]) revert Errors.AlreadyClaimed(); - if ( - !MerkleProofUpgradeable.verifyCalldata(proof, merkleRoots[claimID], leaf) || - (minted[claimID] + amount) > maxUnits[claimID] - ) revert Errors.Invalid(); - hasBeenClaimed[claimID][leaf] = true; - - emit LeafClaimed(claimID, leaf); - } - - function _calculateLeaf(address account, uint256 amount) internal pure returns (bytes32 leaf) { - leaf = keccak256(bytes.concat(keccak256(abi.encode(account, amount)))); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - * Assuming 30 available slots (slots cost space, cost gas) - * 1. merkleRoots - * 2. hasBeenClaimed - * 3. maxUnits - * 4. minted - */ - uint256[26] private __gap; -} diff --git a/contracts/contracts/HypercertMinter.sol b/contracts/contracts/HypercertMinter.sol deleted file mode 100644 index 917c02c5..00000000 --- a/contracts/contracts/HypercertMinter.sol +++ /dev/null @@ -1,229 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.16; - -import { IHypercertToken } from "./interfaces/IHypercertToken.sol"; -import { SemiFungible1155 } from "./SemiFungible1155.sol"; -import { AllowlistMinter } from "./AllowlistMinter.sol"; -import { PausableUpgradeable } from "oz-upgradeable/security/PausableUpgradeable.sol"; - -import { Errors } from "./libs/Errors.sol"; - -/// @title Contract for managing hypercert claims and whitelists -/// @author bitbeckers -/// @notice Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token. -/// @notice This contract supports whitelisted minting via { AllowlistMinter }. -/// @dev Wrapper contract to expose and chain functions. -contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, PausableUpgradeable { - // solhint-disable-next-line const-name-snakecase - string public constant name = "HypercertMinter"; - /// @dev from typeID to a transfer policy - mapping(uint256 => TransferRestrictions) internal typeRestrictions; - - /// INIT - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } - /// @custom:oz-upgrades-unsafe-allow constructor - constructor() { - _disableInitializers(); - } - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } - function initialize() public virtual initializer { - __SemiFungible1155_init(); - __Pausable_init(); - } - - /// EXTERNAL - - /// @notice Mint a semi-fungible token for the impact claim referenced via `uri` - /// @dev see {IHypercertToken} - function mintClaim( - address account, - uint256 units, - string memory _uri, - TransferRestrictions restrictions - ) external override whenNotPaused { - // This enables us to release this restriction in the future - if (msg.sender != account) revert Errors.NotAllowed(); - uint256 claimID = _mintNewTypeWithToken(account, units, _uri); - typeRestrictions[claimID] = restrictions; - emit ClaimStored(claimID, _uri, units); - } - - /// @notice Mint semi-fungible tokens for the impact claim referenced via `uri` - /// @dev see {IHypercertToken} - function mintClaimWithFractions( - address account, - uint256 units, - uint256[] calldata fractions, - string memory _uri, - TransferRestrictions restrictions - ) external override whenNotPaused { - // This enables us to release this restriction in the future - if (msg.sender != account) revert Errors.NotAllowed(); - //Using sum to compare units and fractions (sanity check) - if (_getSum(fractions) != units) revert Errors.Invalid(); - - uint256 claimID = _mintNewTypeWithTokens(account, fractions, _uri); - typeRestrictions[claimID] = restrictions; - emit ClaimStored(claimID, _uri, units); - } - - /// @notice Mint a semi-fungible token representing a fraction of the claim - /// @dev Calls AllowlistMinter to verify `proof`. - /// @dev Mints the `amount` of units for the hypercert stored under `claimID` - function mintClaimFromAllowlist( - address account, - bytes32[] calldata proof, - uint256 claimID, - uint256 units - ) external whenNotPaused { - _processClaim(proof, claimID, units); - _mintToken(account, claimID, units); - } - - /// @notice Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - /// @dev Calls AllowlistMinter to verify `proofs`. - /// @dev Mints the `amount` of units for the hypercert stored under `claimIDs` - function batchMintClaimsFromAllowlists( - address account, - bytes32[][] calldata proofs, - uint256[] calldata claimIDs, - uint256[] calldata units - ) external whenNotPaused { - uint256 len = claimIDs.length; - for (uint256 i; i < len; ) { - _processClaim(proofs[i], claimIDs[i], units[i]); - unchecked { - ++i; - } - } - _batchMintTokens(account, claimIDs, units); - } - - /// @notice Register a claim and the whitelist for minting token(s) belonging to that claim - /// @dev Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units` - /// @dev Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims - function createAllowlist( - address account, - uint256 units, - bytes32 merkleRoot, - string memory _uri, - TransferRestrictions restrictions - ) external whenNotPaused { - uint256 claimID = _createTokenType(account, units, _uri); - _createAllowlist(claimID, merkleRoot, units); - typeRestrictions[claimID] = restrictions; - emit ClaimStored(claimID, _uri, units); - } - - /// @notice Split a claimtokens value into parts with summed value equal to the original - /// @dev see {IHypercertToken} - function splitFraction( - address _account, - uint256 _tokenID, - uint256[] calldata _newFractions - ) external whenNotPaused { - _splitTokenUnits(_account, _tokenID, _newFractions); - } - - /// @notice Merge the value of tokens belonging to the same claim - /// @dev see {IHypercertToken} - function mergeFractions(address _account, uint256[] calldata _fractionIDs) external whenNotPaused { - _mergeTokensUnits(_account, _fractionIDs); - } - - /// @notice Burn a claimtoken - /// @dev see {IHypercertToken} - function burnFraction(address _account, uint256 _tokenID) external whenNotPaused { - _burnToken(_account, _tokenID); - } - - /// @dev see {IHypercertToken} - function unitsOf(uint256 tokenID) external view override returns (uint256 units) { - units = _unitsOf(tokenID); - } - - /// @dev see {IHypercertToken} - function unitsOf(address account, uint256 tokenID) external view override returns (uint256 units) { - units = _unitsOf(account, tokenID); - } - - /// PAUSABLE - - function pause() external onlyOwner { - _pause(); - } - - function unpause() external onlyOwner { - _unpause(); - } - - /// METADATA - - /// @dev see { IHypercertMetadata} - function uri(uint256 tokenID) public view override(IHypercertToken, SemiFungible1155) returns (string memory _uri) { - _uri = SemiFungible1155.uri(tokenID); - } - - /// TRANSFER RESTRICTIONS - - function readTransferRestriction(uint256 tokenID) external view returns (string memory) { - TransferRestrictions temp = typeRestrictions[getBaseType(tokenID)]; - if (temp == TransferRestrictions.AllowAll) return "AllowAll"; - if (temp == TransferRestrictions.DisallowAll) return "DisallowAll"; - if (temp == TransferRestrictions.FromCreatorOnly) return "FromCreatorOnly"; - return ""; - } - - /// INTERNAL - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol } - function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { - // solhint-disable-previous-line no-empty-blocks - } - - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - - // By-pass transfer restrictions for minting and burning - if (from == address(0)) { - // Minting - return; - } else if (to == address(0)) { - // Burning - return; - } - - // Transfer case, where to and from are non-zero - uint256 len = ids.length; - for (uint256 i; i < len; ) { - uint256 typeID = getBaseType(ids[i]); - TransferRestrictions policy = typeRestrictions[typeID]; - if (policy == TransferRestrictions.DisallowAll) { - revert Errors.TransfersNotAllowed(); - } else if (policy == TransferRestrictions.FromCreatorOnly && from != creators[typeID]) { - revert Errors.TransfersNotAllowed(); - } - unchecked { - ++i; - } - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - * Assuming 30 available slots (slots cost space, cost gas) - * 1. typeRestrictions - */ - uint256[29] private __gap; -} diff --git a/contracts/contracts/SemiFungible1155.sol b/contracts/contracts/SemiFungible1155.sol deleted file mode 100644 index cd88714a..00000000 --- a/contracts/contracts/SemiFungible1155.sol +++ /dev/null @@ -1,433 +0,0 @@ -// SPDX-License-Identifier: MIT -// Used components of Enjin example implementation for mixed fungibility -// https://github.com/enjin/erc-1155/blob/master/contracts/ERC1155MixedFungibleMintable.sol -pragma solidity 0.8.16; - -import { ERC1155Upgradeable } from "oz-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; -import { ERC1155BurnableUpgradeable } from "oz-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol"; -import { ERC1155URIStorageUpgradeable } from "oz-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol"; -import { OwnableUpgradeable } from "oz-upgradeable/access/OwnableUpgradeable.sol"; -import { Initializable } from "oz-upgradeable/proxy/utils/Initializable.sol"; -import { UUPSUpgradeable } from "oz-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import { Errors } from "./libs/Errors.sol"; - -/// @title Contract for minting semi-fungible EIP1155 tokens -/// @author bitbeckers -/// @notice Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` -/// @dev Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens) -contract SemiFungible1155 is - Initializable, - ERC1155Upgradeable, - ERC1155BurnableUpgradeable, - ERC1155URIStorageUpgradeable, - OwnableUpgradeable, - UUPSUpgradeable -{ - /// @dev Counter used to generate next typeID. - uint256 internal typeCounter; - - /// @dev Bitmask used to expose only upper 128 bits of uint256 - uint256 internal constant TYPE_MASK = type(uint256).max << 128; - - /// @dev Bitmask used to expose only lower 128 bits of uint256 - uint256 internal constant NF_INDEX_MASK = type(uint256).max >> 128; - - uint256 internal constant FRACTION_LIMIT = 253; - - /// @dev Mapping of `tokenID` to address of `owner` - mapping(uint256 => address) internal owners; - - /// @dev Mapping of `tokenID` to address of `creator` - mapping(uint256 => address) internal creators; - - /// @dev Used to determine amount of `units` stored in token at `tokenID` - mapping(uint256 => uint256) internal tokenValues; - - /// @dev Used to find highest index of token belonging to token at `typeID` - mapping(uint256 => uint256) internal maxIndex; - - /// @dev Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID` - event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value); - - /// @dev Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs` - event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values); - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } - // solhint-disable-next-line func-name-mixedcase - function __SemiFungible1155_init() public virtual onlyInitializing { - __ERC1155_init(""); - __ERC1155Burnable_init(); - __ERC1155URIStorage_init(); - __Ownable_init(); - __UUPSUpgradeable_init(); - } - - /// @dev Get index of fractional token at `_id` by returning lower 128 bit values - /// @dev Returns 0 if `_id` is a baseType - function getItemIndex(uint256 tokenID) internal pure returns (uint256) { - return tokenID & NF_INDEX_MASK; - } - - /// @dev Get base type ID for token at `_id` by returning upper 128 bit values - function getBaseType(uint256 tokenID) internal pure returns (uint256) { - return tokenID & TYPE_MASK; - } - - /// @dev Identify that token at `_id` is base type. - /// @dev Upper 128 bits identify base type ID, lower bits should be 0 - function isBaseType(uint256 tokenID) internal pure returns (bool) { - return (tokenID & TYPE_MASK == tokenID) && (tokenID & NF_INDEX_MASK == 0); - } - - /// @dev Identify that token at `_id` is fraction of a claim. - /// @dev Upper 128 bits identify base type ID, lower bits should be > 0 - function isTypedItem(uint256 tokenID) internal pure returns (bool) { - return (tokenID & TYPE_MASK != 0) && (tokenID & NF_INDEX_MASK != 0); - } - - /// READ - function ownerOf(uint256 tokenID) public view returns (address _owner) { - _owner = owners[tokenID]; - } - - /// @dev see {IHypercertToken} - function _unitsOf(uint256 tokenID) internal view returns (uint256 units) { - units = tokenValues[tokenID]; - } - - /// @dev see {IHypercertToken} - function _unitsOf(address account, uint256 tokenID) internal view returns (uint256 units) { - // Check if fraction token and accounts owns it - if (ownerOf(tokenID) == account) { - units = tokenValues[tokenID]; - } - } - - /// MUTATE - - /// @dev create token type ID based of token counter - - function _createTokenType(address _account, uint256 units, string memory _uri) internal returns (uint256 typeID) { - _notMaxType(typeCounter); - typeID = ++typeCounter << 128; - - creators[typeID] = _account; - tokenValues[typeID] = units; - - _setURI(typeID, _uri); - - //Event emitted for indexing purposes - emit TransferSingle(_account, address(0), address(0), typeID, 0); - } - - /// @dev Mint a new token type and the initial units - function _mintNewTypeWithToken( - address _account, - uint256 _units, - string memory _uri - ) internal returns (uint256 typeID) { - if (_units == 0) { - revert Errors.NotAllowed(); - } - typeID = _createTokenType(_account, _units, _uri); - - uint256 tokenID = typeID + ++maxIndex[typeID]; //1 based indexing, 0 holds type data - - tokenValues[tokenID] = _units; - - _mint(_account, tokenID, 1, ""); - emit ValueTransfer(typeID, 0, tokenID, _units); - } - - /// @dev Mint a new token type and the initial fractions - function _mintNewTypeWithTokens( - address _account, - uint256[] calldata _fractions, - string memory _uri - ) internal returns (uint256 typeID) { - typeID = _mintNewTypeWithToken(_account, _getSum(_fractions), _uri); - _splitTokenUnits(_account, typeID + maxIndex[typeID], _fractions); - } - - /// @dev Mint a new token for an existing type - function _mintToken(address _account, uint256 _typeID, uint256 _units) internal returns (uint256 tokenID) { - if (!isBaseType(_typeID)) revert Errors.NotAllowed(); - - _notMaxItem(maxIndex[_typeID]); - - unchecked { - tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data - } - - tokenValues[tokenID] = _units; - - _mint(_account, tokenID, 1, ""); - emit ValueTransfer(_typeID, 0, tokenID, _units); - } - - /// @dev Mint new tokens for existing types - /// @notice Enables batch claiming from multiple allowlists - function _batchMintTokens( - address _account, - uint256[] calldata _typeIDs, - uint256[] calldata _units - ) internal returns (uint256[] memory tokenIDs) { - uint256 len = _typeIDs.length; - - tokenIDs = new uint256[](len); - uint256[] memory amounts = new uint256[](len); - uint256[] memory zeroes = new uint256[](len); - - for (uint256 i; i < len; ) { - uint256 _typeID = _typeIDs[i]; - if (!isBaseType(_typeID)) revert Errors.NotAllowed(); - _notMaxItem(maxIndex[_typeID]); - - unchecked { - uint256 tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data - tokenValues[tokenID] = _units[i]; - tokenIDs[i] = tokenID; - amounts[i] = 1; - ++i; - } - } - - _mintBatch(_account, tokenIDs, amounts, ""); - emit BatchValueTransfer(_typeIDs, zeroes, tokenIDs, _units); - } - - /// @dev Split the units of `_tokenID` owned by `account` across `_values` - /// @dev `_values` must sum to total `units` held at `_tokenID` - function _splitTokenUnits(address _account, uint256 _tokenID, uint256[] calldata _values) internal { - if (_values.length > FRACTION_LIMIT || _values.length < 2) revert Errors.ArraySize(); - if (tokenValues[_tokenID] != _getSum(_values)) revert Errors.NotAllowed(); - - // Current token - uint256 _typeID = getBaseType(_tokenID); - uint256 valueLeft = tokenValues[_tokenID]; - - // Prepare batch processing, we want to skip the first entry - uint256 len = _values.length - 1; - - uint256[] memory typeIDs = new uint256[](len); - uint256[] memory fromIDs = new uint256[](len); - uint256[] memory toIDs = new uint256[](len); - uint256[] memory amounts = new uint256[](len); - uint256[] memory values = new uint256[](len); - - { - uint256[] memory _valuesCache = _values; - uint256 swapValue = _valuesCache[len]; - _valuesCache[len] = _valuesCache[0]; - _valuesCache[0] = swapValue; - - for (uint256 i; i < len; ) { - _notMaxItem(maxIndex[_typeID]); - - typeIDs[i] = _typeID; - fromIDs[i] = _tokenID; - toIDs[i] = _typeID + ++maxIndex[_typeID]; - amounts[i] = 1; - values[i] = _valuesCache[i]; - - unchecked { - ++i; - } - } - } - - _beforeUnitTransfer(_msgSender(), _account, fromIDs, toIDs, values, ""); - - for (uint256 i; i < len; ) { - valueLeft -= values[i]; - - tokenValues[toIDs[i]] = values[i]; - - unchecked { - ++i; - } - } - - tokenValues[_tokenID] = valueLeft; - - _mintBatch(_account, toIDs, amounts, ""); - - emit BatchValueTransfer(typeIDs, fromIDs, toIDs, values); - } - - /// @dev Merge the units of `_fractionIDs`. - /// @dev Base type of `_fractionIDs` must be identical for all tokens. - function _mergeTokensUnits(address _account, uint256[] memory _fractionIDs) internal { - if (_fractionIDs.length > FRACTION_LIMIT || _fractionIDs.length < 2) { - revert Errors.ArraySize(); - } - uint256 len = _fractionIDs.length - 1; - - uint256 target = _fractionIDs[len]; - - uint256 _totalValue; - uint256[] memory fromIDs = new uint256[](len); - uint256[] memory toIDs = new uint256[](len); - uint256[] memory values = new uint256[](len); - uint256[] memory amounts = new uint256[](len); - - { - for (uint256 i; i < len; ) { - uint256 _fractionID = _fractionIDs[i]; - fromIDs[i] = _fractionID; - toIDs[i] = target; - amounts[i] = 1; - values[i] = tokenValues[_fractionID]; - - unchecked { - ++i; - } - } - } - - _beforeUnitTransfer(_msgSender(), _account, fromIDs, toIDs, values, ""); - - for (uint256 i; i < len; ) { - _totalValue += values[i]; - - delete tokenValues[fromIDs[i]]; - unchecked { - ++i; - } - } - - tokenValues[target] += _totalValue; - - _burnBatch(_account, fromIDs, amounts); - } - - /// @dev Burn the token at `_tokenID` owned by `_account` - /// @dev Not allowed to burn base type. - /// @dev `_tokenID` must hold all value declared at base type - function _burnToken(address _account, uint256 _tokenID) internal { - if (_account != _msgSender() && !isApprovedForAll(_account, _msgSender())) revert Errors.NotApprovedOrOwner(); - - uint256 value = tokenValues[_tokenID]; - - delete tokenValues[_tokenID]; - - _burn(_account, _tokenID, 1); - emit ValueTransfer(getBaseType(_tokenID), _tokenID, 0, value); - } - - /// TRANSFERS - - // The following functions are overrides required by Solidity. - function _afterTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override { - super._afterTokenTransfer(operator, from, to, ids, amounts, data); - - uint256 len = ids.length; - - for (uint256 i; i < len; ) { - owners[ids[i]] = to; - unchecked { - ++i; - } - } - } - - function _beforeUnitTransfer( - address operator, - address from, - uint256[] memory fromIDs, - uint256[] memory toIDs, - uint256[] memory values, - bytes memory data - ) internal virtual { - uint256 len = fromIDs.length; - - for (uint256 i; i < len; ) { - uint256 _from = fromIDs[i]; - uint256 _to = toIDs[i]; - - if (isBaseType(_from)) revert Errors.NotAllowed(); - if (getBaseType(_from) != getBaseType(_to)) revert Errors.TypeMismatch(); - if (from != _msgSender() && !isApprovedForAll(from, _msgSender())) revert Errors.NotApprovedOrOwner(); - unchecked { - ++i; - } - } - } - - /// METADATA - - /// @dev see { openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol } - /// @dev Always returns the URI for the basetype so that it's managed in one place. - function uri( - uint256 tokenID - ) public view virtual override(ERC1155Upgradeable, ERC1155URIStorageUpgradeable) returns (string memory _uri) { - // All tokens share the same metadata at the moment - _uri = ERC1155URIStorageUpgradeable.uri(getBaseType(tokenID)); - } - - /// UTILS - - /** - * @dev Check if value is below max item index - */ - function _notMaxItem(uint256 tokenID) private pure { - uint128 _count = uint128(tokenID); - ++_count; - } - - /** - * @dev Check if value is below max type index - */ - function _notMaxType(uint256 tokenID) private pure { - uint128 _count = uint128(tokenID >> 128); - ++_count; - } - - /** - * @dev calculate the sum of the elements of an array - */ - function _getSum(uint256[] memory array) internal pure returns (uint256 sum) { - uint256 len = array.length; - for (uint256 i; i < len; ) { - if (array[i] == 0) revert Errors.NotAllowed(); - sum += array[i]; - unchecked { - ++i; - } - } - } - - function _getSingletonArray(uint256 element) private pure returns (uint256[] memory) { - uint256[] memory array = new uint256[](1); - array[0] = element; - - return array; - } - - // UUPS PROXY - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol } - function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { - // solhint-disable-previous-line no-empty-blocks - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - * Assuming 30 available slots (slots cost space, cost gas) - * 1. typeCounter - * 2. owners - * 3. creators - * 4. tokenValues - * 5. maxIndex - */ - uint256[25] private __gap; -} diff --git a/contracts/foundry.toml b/contracts/foundry.toml index 20f19235..efe3aa83 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -1,19 +1,40 @@ # Full reference https://github.com/foundry-rs/foundry/tree/master/config [profile.default] -auto_detect_solc = false +auto_detect_solc = true +allow_paths = ["../node_modules", "node_modules", "lib"] bytecode_hash = "none" +force = false fuzz = { runs = 1025 } gas_reports = ["*"] -libs = ["lib"] +libraries = [] +libs = ["node_modules", "lib"] optimizer = true -optimizer_runs = 10_000 +optimizer_runs = 5_000 out = "out" -solc = "0.8.16" src = "src" +script = "scripts/deployment" test = "test/foundry" - +no_match_test = "testCannotExecuteOrderIfInvalidUserGlobal" [profile.ci] fuzz = { runs = 1024 } verbosity = 1 + +[etherscan] +mainnet = { key = "${ETHERSCAN_API_KEY}" } +goerli = { key = "${ETHERSCAN_API_KEY}" } +optimism = { key = "${OPTIMISTIC_ETHERSCAN_API_KEY}" } +sepolia = { key = "${ETHERSCAN_API_KEY}" } +celo = { key = "${CELOSCAN_API_KEY}" } + +[rpc_endpoints] +mainnet = "https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +goerli = "https://eth-goerli.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +optimism = "https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +sepolia = "https://sepolia.infura.io/v3/${INFURA_API_KEY}" +celo = "https://forno.celo.org" + +[fmt] +number_underscore = "thousands" +wrap_comments = true diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 48f3d3d6..dce7d9ca 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -1,8 +1,7 @@ -import "@nomicfoundation/hardhat-chai-matchers"; +import { HardhatUserConfig } from "hardhat/config"; import "@nomicfoundation/hardhat-toolbox"; -import "@nomiclabs/hardhat-ethers"; +import "@nomicfoundation/hardhat-chai-matchers"; import "@openzeppelin/hardhat-upgrades"; -import "@openzeppelin/hardhat-defender"; import "@primitivefi/hardhat-dodoc"; import { config as dotenvConfig } from "dotenv"; @@ -34,17 +33,20 @@ const dotenvConfigPath: string = process.env.DOTENV_PATH ?? fs.existsSync("./.en dotenvConfig({ path: resolve(__dirname, dotenvConfigPath) }); // Ensure that we have all the environment variables we need. -const mnemonic = requireEnv(process.env.MNEMONIC, "MNEMONIC"); -const mnemonic_celo = requireEnv(process.env.MNEMONIC_CELO, "MNEMONIC_CELO"); -const infuraApiKey = requireEnv(process.env.INFURA_API_KEY, "INFURA_API_KEY"); -const alchemyOptimismUrl = requireEnv(process.env.ALCHEMY_OPTIMISM_URL, "ALCHEMY_OPTIMISM_URL"); +const MNEMONIC = requireEnv(process.env.MNEMONIC, "MNEMONIC"); +const MNEMONIC_CELO = requireEnv(process.env.MNEMONIC_CELO, "MNEMONIC_CELO"); +const INFURA_API_KEY = requireEnv(process.env.INFURA_API_KEY, "INFURA_API_KEY"); +const ALCHEMY_API_KEY = requireEnv(process.env.ALCHEMY_API_KEY, "ALCHEMY_API_KEY"); -const etherscanApiKey = requireEnv(process.env.ETHERSCAN_API_KEY, "ETHERSCAN_API_KEY"); -const optimisticEtherscanApiKey = requireEnv(process.env.OPTIMISTIC_ETHERSCAN_API_KEY, "OPTIMISTIC_ETHERSCAN_API_KEY"); -const celoscanApiKey = requireEnv(process.env.CELOSCAN_API_KEY, "CELOSCAN_API_KEY"); +const ETHERSCAN_API_KEY = requireEnv(process.env.ETHERSCAN_API_KEY, "ETHERSCAN_API_KEY"); +const OPTIMISTIC_ETHERSCAN_API_KEY = requireEnv( + process.env.OPTIMISTIC_ETHERSCAN_API_KEY, + "OPTIMISTIC_ETHERSCAN_API_KEY", +); +const CELOSCAN_API_KEY = requireEnv(process.env.CELOSCAN_API_KEY, "CELOSCAN_API_KEY"); -const ozApiKey = requireEnv(process.env.OPENZEPPELIN_API_KEY, "OPENZEPPELIN_API_KEY"); -const ozSecretKey = requireEnv(process.env.OPENZEPPELIN_SECRET_KEY, "OPENZEPPELIN_SECRET_KEY"); +const OPENZEPPELIN_API_KEY = requireEnv(process.env.OPENZEPPELIN_API_KEY, "OPENZEPPELIN_API_KEY"); +const OPENZEPPELIN_SECRET_KEY = requireEnv(process.env.OPENZEPPELIN_SECRET_KEY, "OPENZEPPELIN_SECRET_KEY"); /** * Maps a key to the chain ID @@ -64,23 +66,30 @@ const chainIds = { }; function getChainConfig(chain: keyof typeof chainIds) { - const jsonRpcUrl = "https://" + chain + ".infura.io/v3/" + infuraApiKey; + const jsonRpcUrl = "https://" + chain + ".infura.io/v3/" + INFURA_API_KEY; let config = { accounts: { count: 10, - mnemonic, + mnemonic: MNEMONIC, path: "m/44'/60'/0'/0", }, chainId: chainIds[chain], url: jsonRpcUrl, }; + if (chain === "optimism-mainnet") { + config = { + ...config, + url: `https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}`, + }; + } + if (chain === "celo-mainnet") { config = { ...config, accounts: { count: 10, - mnemonic: mnemonic_celo, + mnemonic: MNEMONIC_CELO, path: "m/44'/52752'/0'/0", }, }; @@ -89,9 +98,9 @@ function getChainConfig(chain: keyof typeof chainIds) { return config; } -const config = { +const config: HardhatUserConfig = { abiExporter: { - path: "./src/abi", + path: "./abi", runOnCompile: true, clear: true, flat: true, @@ -99,8 +108,8 @@ const config = { except: ["@openzeppelin"], }, defender: { - apiKey: ozApiKey!, - apiSecret: ozSecretKey!, + apiKey: OPENZEPPELIN_API_KEY!, + apiSecret: OPENZEPPELIN_SECRET_KEY!, useDefenderDeploy: true, }, dodoc: { @@ -111,10 +120,10 @@ const config = { }, etherscan: { apiKey: { - goerli: etherscanApiKey!, - sepolia: etherscanApiKey!, - optimisticEthereum: optimisticEtherscanApiKey!, - celo: celoscanApiKey!, + goerli: ETHERSCAN_API_KEY!, + sepolia: ETHERSCAN_API_KEY!, + optimisticEthereum: OPTIMISTIC_ETHERSCAN_API_KEY!, + celo: CELOSCAN_API_KEY!, }, customChains: [ { @@ -133,7 +142,7 @@ const config = { // metamask can't transfer when connected to hardhat's network. initialBaseFeePerGas: 0, accounts: { - mnemonic, + mnemonic: MNEMONIC, }, chainId: chainIds.hardhat, }, @@ -145,10 +154,7 @@ const config = { sepolia: getChainConfig("sepolia"), mainnet: getChainConfig("mainnet"), "optimism-goerli": getChainConfig("optimism-goerli"), - "optimism-mainnet": { - ...getChainConfig("optimism-mainnet"), - url: alchemyOptimismUrl, - }, + "optimism-mainnet": getChainConfig("optimism-mainnet"), }, paths: { cache: "./cache_hardhat", // Use a different cache for Hardhat than Foundry @@ -156,31 +162,31 @@ const config = { tests: "./test", }, preprocess: { - eachLine: () => ({ + eachLine: (hre) => ({ transform: (line: string) => { if (line.match(/^\s*import /i)) { - getRemappings().forEach(([find, replace]) => { - if (line.match(find)) { - line = line.replace(find, replace); + for (const [from, to] of getRemappings()) { + if (line.includes(from)) { + line = line.replace(from, to); + break; } - }); + } } return line; }, }), }, solidity: { - version: "0.8.16", + version: "0.8.17", settings: { optimizer: { enabled: true, - runs: 10_000, + runs: 5_000, }, }, }, typechain: { - outDir: "./src/types", - target: "ethers-v5", + outDir: "./types", }, }; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.eslintrc b/contracts/lib/openzeppelin-contracts-upgradeable/.eslintrc index 095d2754..22fb715f 100644 --- a/contracts/lib/openzeppelin-contracts-upgradeable/.eslintrc +++ b/contracts/lib/openzeppelin-contracts-upgradeable/.eslintrc @@ -1,35 +1,30 @@ { - "extends" : [ - "standard" - ], - "plugins": [ - "mocha" - ], + "extends": ["standard"], + "plugins": ["mocha"], "env": { - "browser" : true, - "node" : true, - "mocha" : true, - "jest" : true, + "browser": true, + "node": true, + "mocha": true, + "jest": true }, - "globals" : { + "globals": { "artifacts": false, "contract": false, "assert": false, "web3": false, "usePlugin": false, - "extendEnvironment": false, + "extendEnvironment": false }, "rules": { - // Strict mode "strict": ["error", "global"], // Code style "array-bracket-spacing": ["off"], - "camelcase": ["error", {"properties": "always"}], + "camelcase": ["error", { "properties": "always" }], "comma-dangle": ["error", "always-multiline"], - "comma-spacing": ["error", {"before": false, "after": true}], - "dot-notation": ["error", {"allowKeywords": true, "allowPattern": ""}], + "comma-spacing": ["error", { "before": false, "after": true }], + "dot-notation": ["error", { "allowKeywords": true, "allowPattern": "" }], "eol-last": ["error", "always"], "eqeqeq": ["error", "smart"], "generator-star-spacing": ["error", "before"], @@ -40,7 +35,7 @@ "no-dupe-args": "error", "no-dupe-keys": "error", "no-mixed-spaces-and-tabs": ["error", "smart-tabs"], - "no-redeclare": ["error", {"builtinGlobals": true}], + "no-redeclare": ["error", { "builtinGlobals": true }], "no-trailing-spaces": ["error", { "skipBlankLines": false }], "no-undef": "error", "no-use-before-define": "off", @@ -54,7 +49,7 @@ "mocha/no-exclusive-tests": ["error"], "promise/always-return": "off", - "promise/avoid-new": "off", + "promise/avoid-new": "off" }, "parserOptions": { "ecmaVersion": 2020 diff --git a/contracts/package.json b/contracts/package.json index a54becd4..78530c9c 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@hypercerts-org/contracts", "description": "EVM compatible protocol for managing impact claims", - "version": "0.8.11", + "version": "0.9.0", "author": { "name": "Hypercerts Foundation", "url": "https://github.com/hypercerts-org/hypercerts" @@ -26,47 +26,33 @@ "files": [ "dist", "README.md", - "package.json", - "contracts" + "package.json" ], "devDependencies": { + "@chainlink/contracts": "^0.8.0", "@commitlint/cli": "^17.1.2", "@commitlint/config-conventional": "^17.1.0", "@dlsl/hardhat-markup": "^1.0.0-rc.7", - "@ethersproject/abi": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/hardhat-chai-matchers": "^1.0.5", - "@nomicfoundation/hardhat-network-helpers": "^1.0.7", - "@nomicfoundation/hardhat-toolbox": "^2.0.0", - "@nomiclabs/hardhat-ethers": "^2.2.1", - "@nomiclabs/hardhat-etherscan": "^3.1.3", - "@openzeppelin/hardhat-defender": "^1.8.2", - "@openzeppelin/hardhat-upgrades": "^1.28", + "@looksrare/contracts-libs": "^3.4.0", + "@nomicfoundation/hardhat-toolbox": "^3.0.0", + "@openzeppelin/contracts": "<5.0.0", + "@openzeppelin/hardhat-upgrades": "2.3.3", "@primitivefi/hardhat-dodoc": "^0.2.3", "@rollup/plugin-commonjs": "^24.0.1", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", "@trivago/prettier-plugin-sort-imports": "^3.3.0", - "@typechain/ethers-v5": "^11.1.1", - "@typechain/hardhat": "^9.0.0", - "@types/chai": "^4.3.4", - "@types/mocha": "9.1.0", "@types/node": "^18.11.11", "@typescript-eslint/eslint-plugin": "^5.38.0", "@typescript-eslint/parser": "^5.38.0", - "chai": "^4.3.7", "commitizen": "^4.2.5", - "copyfiles": "^2.4.1", "cross-env": "^7.0.3", "cz-conventional-changelog": "^3.3.0", "dotenv": "^16.0.2", "eslint": "^8.23.1", "eslint-config-prettier": "^8.5.0", - "ethers": "^5.7.2", - "hardhat": "2.13.1", + "ethers": "^6.8.0", "hardhat-abi-exporter": "^2.10.1", - "hardhat-gas-reporter": "^1.0.9", "hardhat-preprocessor": "^0.1.5", "husky": "^8.0.1", "lint-staged": "^13.0.3", @@ -81,7 +67,7 @@ "shx": "^0.3.4", "solhint": "^3.6.2", "solhint-plugin-prettier": "^0.0.5", - "solidity-coverage": "^0.8.2", + "solmate": "^6.2.0", "ts-node": "^10.9.1", "typechain": "^8.3.1", "typescript": "^4.9.4" @@ -97,22 +83,27 @@ "template" ], "scripts": { - "build": "hardhat compile && pnpm tsc -p tsconfig.build.json && rollup -c && pnpm copy:contracts", - "build:forge": "forge build", - "clean": "rimraf cache out dist typechain abi", - "copy:contracts": "copyfiles -u 1 ./src/**/*.sol ./src/*.sol ./contracts", + "build": "pnpm clean && hardhat compile && pnpm tsc -p tsconfig.build.json && rollup -c", + "build:forge": "pnpm clean && forge build", + "clean": "rimraf abi artifacts build cache cache_hardhat dist out types", + "deploy:marketplace:goerli": "forge script scripts/deployment/Deployment.s.sol:Deployment --broadcast --verify --fork-url goerli", + "deploy:marketplace:sepolia": "forge script scripts/deployment/Deployment.s.sol:Deployment --broadcast --verify --fork-url sepolia", + "deploy:marketplace:test": "pnpm deploy:marketplace:goerli && pnpm deploy:marketplace:sepolia", + "deploy:marketplace:dryrun": "forge script scripts/deployment/Deployment.s.sol:Deployment --fork-url", "docs": "hardhat dodoc", "lint": "pnpm lint:sol && pnpm prettier:check", - "lint:sol": "solhint -w 5 \"./{src,test}/**/*.sol\"", - "prebuild": "pnpm clean", + "lint:sol": "forge fmt --check && solhint \"./{src,test/protocol,test/marketplace}/**/*.sol\"", "prepublish": "pnpm build", - "prettier": "prettier --config \"./.prettierrc.yml\" --write \"**/*.{json,md,sol,yml}\"", - "prettier:check": "prettier --config \"./.prettierrc.yml\" --check \"**/*.{json,md,sol,yml}\"", + "prettier": "prettier --config \"./.prettierrc.yml\" --write \"**/*.{json,md,ts,yml}\"", + "prettier:check": "prettier --config \"./.prettierrc.yml\" --check \"**/*.{json,md,ts,yml}\"", "slither": "slither ./src", "test": "pnpm test:hardhat && pnpm test:forge", "test:forge": "forge test", "test:hardhat": "hardhat test", "test:gas": "forge test --match-path test/foundry/PerformanceTesting.t.sol --gas-report", "hardhat": "hardhat" + }, + "dependencies": { + "hardhat": "^2.18.3" } } diff --git a/contracts/remappings.txt b/contracts/remappings.txt index bb8f23eb..6fdc5ec2 100644 --- a/contracts/remappings.txt +++ b/contracts/remappings.txt @@ -4,3 +4,8 @@ murky/=lib/murky/src/ oz-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/ oz-contracts/=lib/murky/lib/openzeppelin-contracts/ prb-test/=lib/prb-test/src/ +@hypercerts/protocol/=src/protocol/ +@hypercerts/marketplace/=src/marketplace/ +@looksrare/=node_modules/@looksrare/ +hardhat/=node_modules/hardhat/ +solmate/=node_modules/solmate/ diff --git a/contracts/rollup.config.mjs b/contracts/rollup.config.mjs index f6e55c8b..77c81300 100644 --- a/contracts/rollup.config.mjs +++ b/contracts/rollup.config.mjs @@ -8,7 +8,7 @@ import nodePolyfills from "rollup-plugin-node-polyfills"; export default [ { - input: `build/index.js`, + input: `build/src/index.js`, plugins: [ autoExternal(), nodePolyfills(), @@ -33,7 +33,7 @@ export default [ ], }, { - input: `build/index.d.ts`, + input: `build/src/index.d.ts`, plugins: [json(), dts()], output: { file: `dist/index.d.ts`, diff --git a/contracts/scripts/deployment/Deployment.s.sol b/contracts/scripts/deployment/Deployment.s.sol new file mode 100644 index 00000000..244652e5 --- /dev/null +++ b/contracts/scripts/deployment/Deployment.s.sol @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// Scripting tool +import {Script} from "forge-std/Script.sol"; + +// Core contracts +import {LooksRareProtocol} from "@hypercerts/marketplace/LooksRareProtocol.sol"; +import {TransferManager} from "@hypercerts/marketplace/TransferManager.sol"; +import {StrategyCollectionOffer} from "@hypercerts/marketplace/executionStrategies/StrategyCollectionOffer.sol"; + +// Create2 factory interface +import {IImmutableCreate2Factory} from "@hypercerts/marketplace/interfaces/IImmutableCreate2Factory.sol"; + +// Other contracts +import {OrderValidatorV2A} from "@hypercerts/marketplace/helpers/OrderValidatorV2A.sol"; + +contract Deployment is Script { + address internal deployer; + IImmutableCreate2Factory private constant IMMUTABLE_CREATE2_FACTORY = + IImmutableCreate2Factory(0x0000000000FFe8B47B3e2130213B802212439497); + + error ChainIdInvalid(uint256 chainId); + error MnemonicInvalid(); + + address public weth; + + // address public royaltyFeeRegistry; + + uint16 internal constant _standardProtocolFeeBp = uint16(50); + uint16 internal constant _minTotalFeeBp = uint16(50); + uint16 internal constant _maxProtocolFeeBp = uint16(200); + + function setUp() public virtual { + string memory mnemonic = vm.envString("MNEMONIC"); + if (bytes(mnemonic).length > 0) { + (deployer,) = deriveRememberKey(mnemonic, 0); + } else { + revert MnemonicInvalid(); + } + } + + function run() external { + uint256 chainId = block.chainid; + + if (chainId == 5) { + weth = 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6; + } else if (chainId == 11_155_111) { + weth = 0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14; + } else { + revert ChainIdInvalid(chainId); + } + + vm.startBroadcast(deployer); + + // 1. Deploy TransferManager + address transferManagerAddress = IMMUTABLE_CREATE2_FACTORY.safeCreate2({ + salt: vm.envBytes32("TRANSFER_MANAGER_SALT"), + initializationCode: abi.encodePacked( + type(TransferManager).creationCode, abi.encode(vm.envAddress("OWNER_ADDRESS")) + ) + }); + + // 2. Transfer 1 wei to LooksRareProtocol before it is deployed. + // It cannot receive ETH after it is deployed. + payable(0x0000000000E655fAe4d56241588680F86E3b2377).transfer(1 wei); + + // 3. Deploy LooksRareProtocol + address looksRareProtocolAddress = IMMUTABLE_CREATE2_FACTORY.safeCreate2({ + salt: vm.envBytes32("LOOKSRARE_PROTOCOL_SALT"), + initializationCode: abi.encodePacked( + type(LooksRareProtocol).creationCode, + abi.encode( + vm.envAddress("OWNER_ADDRESS"), + vm.envAddress("PROTOCOL_FEE_RECIPIENT_ADDRESS"), + transferManagerAddress, + weth + ) + ) + }); + + // 4. Other operations + TransferManager(transferManagerAddress).allowOperator(looksRareProtocolAddress); + LooksRareProtocol(looksRareProtocolAddress).updateCurrencyStatus(address(0), true); + LooksRareProtocol(looksRareProtocolAddress).updateCurrencyStatus(weth, true); + + // 5. Deploy OrderValidatorV2A, this needs to happen after updateCreatorFeeManager + // as the order validator calls creator fee manager to retrieve the royalty fee registry + new OrderValidatorV2A(looksRareProtocolAddress); + + // 6. Deploy StrategyCollectionOffer + address strategyCollectionOfferAddress = IMMUTABLE_CREATE2_FACTORY.safeCreate2({ + salt: vm.envBytes32("STRATEGY_COLLECTION_OFFER_SALT"), + initializationCode: type(StrategyCollectionOffer).creationCode + }); + + LooksRareProtocol(looksRareProtocolAddress).addStrategy( + _standardProtocolFeeBp, + _minTotalFeeBp, + _maxProtocolFeeBp, + StrategyCollectionOffer.executeCollectionStrategyWithTakerAsk.selector, + true, + strategyCollectionOfferAddress + ); + + LooksRareProtocol(looksRareProtocolAddress).addStrategy( + _standardProtocolFeeBp, + _minTotalFeeBp, + _maxProtocolFeeBp, + StrategyCollectionOffer.executeCollectionStrategyWithTakerAskWithProof.selector, + true, + strategyCollectionOfferAddress + ); + + vm.stopBroadcast(); + } +} diff --git a/contracts/scripts/deployment/ProtocolFeeRecipientDeployment.s.sol b/contracts/scripts/deployment/ProtocolFeeRecipientDeployment.s.sol new file mode 100644 index 00000000..dc08c0b7 --- /dev/null +++ b/contracts/scripts/deployment/ProtocolFeeRecipientDeployment.s.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// Scripting tool +import {Script} from "forge-std/Script.sol"; + +// Core contracts +import {ProtocolFeeRecipient} from "@hypercerts/marketplace/ProtocolFeeRecipient.sol"; + +contract ProtocolFeeRecipientDeployment is Script { + error ChainIdInvalid(uint256 chainId); + + // WETH + address public weth; + address private feeSharingSetter; + + function run() external { + uint256 chainId = block.chainid; + uint256 deployerPrivateKey; + + if (chainId == 1) { + weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; + feeSharingSetter = 0x5924A28caAF1cc016617874a2f0C3710d881f3c1; + deployerPrivateKey = vm.envUint("MAINNET_KEY"); + } else if (chainId == 5) { + weth = 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6; + feeSharingSetter = 0x3d1E1521b659b0C942836DeF24dd254aBdEb873b; + deployerPrivateKey = vm.envUint("TESTNET_KEY"); + } else if (chainId == 11_155_111) { + weth = 0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9; + feeSharingSetter = 0x8a7c709648160a5A1191D07dfAB316224E4C6b07; + deployerPrivateKey = vm.envUint("TESTNET_KEY"); + } else { + revert ChainIdInvalid(chainId); + } + + vm.startBroadcast(deployerPrivateKey); + + new ProtocolFeeRecipient(feeSharingSetter, weth); + + vm.stopBroadcast(); + } +} diff --git a/contracts/src/SemiFungible1155.sol b/contracts/src/SemiFungible1155.sol deleted file mode 100644 index cd88714a..00000000 --- a/contracts/src/SemiFungible1155.sol +++ /dev/null @@ -1,433 +0,0 @@ -// SPDX-License-Identifier: MIT -// Used components of Enjin example implementation for mixed fungibility -// https://github.com/enjin/erc-1155/blob/master/contracts/ERC1155MixedFungibleMintable.sol -pragma solidity 0.8.16; - -import { ERC1155Upgradeable } from "oz-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; -import { ERC1155BurnableUpgradeable } from "oz-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol"; -import { ERC1155URIStorageUpgradeable } from "oz-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol"; -import { OwnableUpgradeable } from "oz-upgradeable/access/OwnableUpgradeable.sol"; -import { Initializable } from "oz-upgradeable/proxy/utils/Initializable.sol"; -import { UUPSUpgradeable } from "oz-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import { Errors } from "./libs/Errors.sol"; - -/// @title Contract for minting semi-fungible EIP1155 tokens -/// @author bitbeckers -/// @notice Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` -/// @dev Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens) -contract SemiFungible1155 is - Initializable, - ERC1155Upgradeable, - ERC1155BurnableUpgradeable, - ERC1155URIStorageUpgradeable, - OwnableUpgradeable, - UUPSUpgradeable -{ - /// @dev Counter used to generate next typeID. - uint256 internal typeCounter; - - /// @dev Bitmask used to expose only upper 128 bits of uint256 - uint256 internal constant TYPE_MASK = type(uint256).max << 128; - - /// @dev Bitmask used to expose only lower 128 bits of uint256 - uint256 internal constant NF_INDEX_MASK = type(uint256).max >> 128; - - uint256 internal constant FRACTION_LIMIT = 253; - - /// @dev Mapping of `tokenID` to address of `owner` - mapping(uint256 => address) internal owners; - - /// @dev Mapping of `tokenID` to address of `creator` - mapping(uint256 => address) internal creators; - - /// @dev Used to determine amount of `units` stored in token at `tokenID` - mapping(uint256 => uint256) internal tokenValues; - - /// @dev Used to find highest index of token belonging to token at `typeID` - mapping(uint256 => uint256) internal maxIndex; - - /// @dev Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID` - event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value); - - /// @dev Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs` - event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values); - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } - // solhint-disable-next-line func-name-mixedcase - function __SemiFungible1155_init() public virtual onlyInitializing { - __ERC1155_init(""); - __ERC1155Burnable_init(); - __ERC1155URIStorage_init(); - __Ownable_init(); - __UUPSUpgradeable_init(); - } - - /// @dev Get index of fractional token at `_id` by returning lower 128 bit values - /// @dev Returns 0 if `_id` is a baseType - function getItemIndex(uint256 tokenID) internal pure returns (uint256) { - return tokenID & NF_INDEX_MASK; - } - - /// @dev Get base type ID for token at `_id` by returning upper 128 bit values - function getBaseType(uint256 tokenID) internal pure returns (uint256) { - return tokenID & TYPE_MASK; - } - - /// @dev Identify that token at `_id` is base type. - /// @dev Upper 128 bits identify base type ID, lower bits should be 0 - function isBaseType(uint256 tokenID) internal pure returns (bool) { - return (tokenID & TYPE_MASK == tokenID) && (tokenID & NF_INDEX_MASK == 0); - } - - /// @dev Identify that token at `_id` is fraction of a claim. - /// @dev Upper 128 bits identify base type ID, lower bits should be > 0 - function isTypedItem(uint256 tokenID) internal pure returns (bool) { - return (tokenID & TYPE_MASK != 0) && (tokenID & NF_INDEX_MASK != 0); - } - - /// READ - function ownerOf(uint256 tokenID) public view returns (address _owner) { - _owner = owners[tokenID]; - } - - /// @dev see {IHypercertToken} - function _unitsOf(uint256 tokenID) internal view returns (uint256 units) { - units = tokenValues[tokenID]; - } - - /// @dev see {IHypercertToken} - function _unitsOf(address account, uint256 tokenID) internal view returns (uint256 units) { - // Check if fraction token and accounts owns it - if (ownerOf(tokenID) == account) { - units = tokenValues[tokenID]; - } - } - - /// MUTATE - - /// @dev create token type ID based of token counter - - function _createTokenType(address _account, uint256 units, string memory _uri) internal returns (uint256 typeID) { - _notMaxType(typeCounter); - typeID = ++typeCounter << 128; - - creators[typeID] = _account; - tokenValues[typeID] = units; - - _setURI(typeID, _uri); - - //Event emitted for indexing purposes - emit TransferSingle(_account, address(0), address(0), typeID, 0); - } - - /// @dev Mint a new token type and the initial units - function _mintNewTypeWithToken( - address _account, - uint256 _units, - string memory _uri - ) internal returns (uint256 typeID) { - if (_units == 0) { - revert Errors.NotAllowed(); - } - typeID = _createTokenType(_account, _units, _uri); - - uint256 tokenID = typeID + ++maxIndex[typeID]; //1 based indexing, 0 holds type data - - tokenValues[tokenID] = _units; - - _mint(_account, tokenID, 1, ""); - emit ValueTransfer(typeID, 0, tokenID, _units); - } - - /// @dev Mint a new token type and the initial fractions - function _mintNewTypeWithTokens( - address _account, - uint256[] calldata _fractions, - string memory _uri - ) internal returns (uint256 typeID) { - typeID = _mintNewTypeWithToken(_account, _getSum(_fractions), _uri); - _splitTokenUnits(_account, typeID + maxIndex[typeID], _fractions); - } - - /// @dev Mint a new token for an existing type - function _mintToken(address _account, uint256 _typeID, uint256 _units) internal returns (uint256 tokenID) { - if (!isBaseType(_typeID)) revert Errors.NotAllowed(); - - _notMaxItem(maxIndex[_typeID]); - - unchecked { - tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data - } - - tokenValues[tokenID] = _units; - - _mint(_account, tokenID, 1, ""); - emit ValueTransfer(_typeID, 0, tokenID, _units); - } - - /// @dev Mint new tokens for existing types - /// @notice Enables batch claiming from multiple allowlists - function _batchMintTokens( - address _account, - uint256[] calldata _typeIDs, - uint256[] calldata _units - ) internal returns (uint256[] memory tokenIDs) { - uint256 len = _typeIDs.length; - - tokenIDs = new uint256[](len); - uint256[] memory amounts = new uint256[](len); - uint256[] memory zeroes = new uint256[](len); - - for (uint256 i; i < len; ) { - uint256 _typeID = _typeIDs[i]; - if (!isBaseType(_typeID)) revert Errors.NotAllowed(); - _notMaxItem(maxIndex[_typeID]); - - unchecked { - uint256 tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data - tokenValues[tokenID] = _units[i]; - tokenIDs[i] = tokenID; - amounts[i] = 1; - ++i; - } - } - - _mintBatch(_account, tokenIDs, amounts, ""); - emit BatchValueTransfer(_typeIDs, zeroes, tokenIDs, _units); - } - - /// @dev Split the units of `_tokenID` owned by `account` across `_values` - /// @dev `_values` must sum to total `units` held at `_tokenID` - function _splitTokenUnits(address _account, uint256 _tokenID, uint256[] calldata _values) internal { - if (_values.length > FRACTION_LIMIT || _values.length < 2) revert Errors.ArraySize(); - if (tokenValues[_tokenID] != _getSum(_values)) revert Errors.NotAllowed(); - - // Current token - uint256 _typeID = getBaseType(_tokenID); - uint256 valueLeft = tokenValues[_tokenID]; - - // Prepare batch processing, we want to skip the first entry - uint256 len = _values.length - 1; - - uint256[] memory typeIDs = new uint256[](len); - uint256[] memory fromIDs = new uint256[](len); - uint256[] memory toIDs = new uint256[](len); - uint256[] memory amounts = new uint256[](len); - uint256[] memory values = new uint256[](len); - - { - uint256[] memory _valuesCache = _values; - uint256 swapValue = _valuesCache[len]; - _valuesCache[len] = _valuesCache[0]; - _valuesCache[0] = swapValue; - - for (uint256 i; i < len; ) { - _notMaxItem(maxIndex[_typeID]); - - typeIDs[i] = _typeID; - fromIDs[i] = _tokenID; - toIDs[i] = _typeID + ++maxIndex[_typeID]; - amounts[i] = 1; - values[i] = _valuesCache[i]; - - unchecked { - ++i; - } - } - } - - _beforeUnitTransfer(_msgSender(), _account, fromIDs, toIDs, values, ""); - - for (uint256 i; i < len; ) { - valueLeft -= values[i]; - - tokenValues[toIDs[i]] = values[i]; - - unchecked { - ++i; - } - } - - tokenValues[_tokenID] = valueLeft; - - _mintBatch(_account, toIDs, amounts, ""); - - emit BatchValueTransfer(typeIDs, fromIDs, toIDs, values); - } - - /// @dev Merge the units of `_fractionIDs`. - /// @dev Base type of `_fractionIDs` must be identical for all tokens. - function _mergeTokensUnits(address _account, uint256[] memory _fractionIDs) internal { - if (_fractionIDs.length > FRACTION_LIMIT || _fractionIDs.length < 2) { - revert Errors.ArraySize(); - } - uint256 len = _fractionIDs.length - 1; - - uint256 target = _fractionIDs[len]; - - uint256 _totalValue; - uint256[] memory fromIDs = new uint256[](len); - uint256[] memory toIDs = new uint256[](len); - uint256[] memory values = new uint256[](len); - uint256[] memory amounts = new uint256[](len); - - { - for (uint256 i; i < len; ) { - uint256 _fractionID = _fractionIDs[i]; - fromIDs[i] = _fractionID; - toIDs[i] = target; - amounts[i] = 1; - values[i] = tokenValues[_fractionID]; - - unchecked { - ++i; - } - } - } - - _beforeUnitTransfer(_msgSender(), _account, fromIDs, toIDs, values, ""); - - for (uint256 i; i < len; ) { - _totalValue += values[i]; - - delete tokenValues[fromIDs[i]]; - unchecked { - ++i; - } - } - - tokenValues[target] += _totalValue; - - _burnBatch(_account, fromIDs, amounts); - } - - /// @dev Burn the token at `_tokenID` owned by `_account` - /// @dev Not allowed to burn base type. - /// @dev `_tokenID` must hold all value declared at base type - function _burnToken(address _account, uint256 _tokenID) internal { - if (_account != _msgSender() && !isApprovedForAll(_account, _msgSender())) revert Errors.NotApprovedOrOwner(); - - uint256 value = tokenValues[_tokenID]; - - delete tokenValues[_tokenID]; - - _burn(_account, _tokenID, 1); - emit ValueTransfer(getBaseType(_tokenID), _tokenID, 0, value); - } - - /// TRANSFERS - - // The following functions are overrides required by Solidity. - function _afterTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override { - super._afterTokenTransfer(operator, from, to, ids, amounts, data); - - uint256 len = ids.length; - - for (uint256 i; i < len; ) { - owners[ids[i]] = to; - unchecked { - ++i; - } - } - } - - function _beforeUnitTransfer( - address operator, - address from, - uint256[] memory fromIDs, - uint256[] memory toIDs, - uint256[] memory values, - bytes memory data - ) internal virtual { - uint256 len = fromIDs.length; - - for (uint256 i; i < len; ) { - uint256 _from = fromIDs[i]; - uint256 _to = toIDs[i]; - - if (isBaseType(_from)) revert Errors.NotAllowed(); - if (getBaseType(_from) != getBaseType(_to)) revert Errors.TypeMismatch(); - if (from != _msgSender() && !isApprovedForAll(from, _msgSender())) revert Errors.NotApprovedOrOwner(); - unchecked { - ++i; - } - } - } - - /// METADATA - - /// @dev see { openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol } - /// @dev Always returns the URI for the basetype so that it's managed in one place. - function uri( - uint256 tokenID - ) public view virtual override(ERC1155Upgradeable, ERC1155URIStorageUpgradeable) returns (string memory _uri) { - // All tokens share the same metadata at the moment - _uri = ERC1155URIStorageUpgradeable.uri(getBaseType(tokenID)); - } - - /// UTILS - - /** - * @dev Check if value is below max item index - */ - function _notMaxItem(uint256 tokenID) private pure { - uint128 _count = uint128(tokenID); - ++_count; - } - - /** - * @dev Check if value is below max type index - */ - function _notMaxType(uint256 tokenID) private pure { - uint128 _count = uint128(tokenID >> 128); - ++_count; - } - - /** - * @dev calculate the sum of the elements of an array - */ - function _getSum(uint256[] memory array) internal pure returns (uint256 sum) { - uint256 len = array.length; - for (uint256 i; i < len; ) { - if (array[i] == 0) revert Errors.NotAllowed(); - sum += array[i]; - unchecked { - ++i; - } - } - } - - function _getSingletonArray(uint256 element) private pure returns (uint256[] memory) { - uint256[] memory array = new uint256[](1); - array[0] = element; - - return array; - } - - // UUPS PROXY - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol } - function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { - // solhint-disable-previous-line no-empty-blocks - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - * Assuming 30 available slots (slots cost space, cost gas) - * 1. typeCounter - * 2. owners - * 3. creators - * 4. tokenValues - * 5. maxIndex - */ - uint256[25] private __gap; -} diff --git a/contracts/src/deployments.json b/contracts/src/deployments.json new file mode 100644 index 00000000..4156e8e6 --- /dev/null +++ b/contracts/src/deployments.json @@ -0,0 +1,22 @@ +{ + "5": { + "HypercertMinterUUPS": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "HypercertMinterImplementation": "0x0a00a2f09cd37b24e7429c5238323bfebcff3ed9", + "TransferManager": "0x91CC106977934becc64e56987a89547077E95186", + "HypercertExchange": "0xE6563d73D19794d50526eB1B02441530ED190dc5" + }, + "11155111": { + "HypercertMinterUUPS": "0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941", + "HypercertMinterImplementation": "0x0a0df97bddb36eef95fef089a4aeb7aceabf2101", + "TransferManager": "0x91CC106977934becc64e56987a89547077E95186", + "HypercertExchange": "0x7AFc7938130bd03b792C0B05C796f42E9beBB2D6" + }, + "10": { + "HypercertMinterUUPS": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "HypercertMinterImplementation": "0x396d5f1ef3aa92ddad4dead04388374a03bc5577" + }, + "42220": { + "HypercertMinterUUPS": "0x16bA53B74c234C870c61EFC04cD418B8f2865959", + "HypercertMinterImplementation": "0x620257e9301a813be7cc5b75aae8dda3f6a926d2" + } +} diff --git a/contracts/src/index.ts b/contracts/src/index.ts index 486b728b..3019f4fc 100644 --- a/contracts/src/index.ts +++ b/contracts/src/index.ts @@ -1,10 +1,28 @@ -import HypercertMinterAbi from "./abi/HypercertMinter.json"; -// import { HypercertMinter__factory } from "./types/factories/src/HypercertMinter__factory"; -import type { AllowlistMinter } from "./types/src/AllowlistMinter"; -import type { HypercertMinter } from "./types/src/HypercertMinter"; -import type { IAllowlist } from "./types/src/interfaces/IAllowlist"; -import type { IHypercertToken } from "./types/src/interfaces/IHypercertToken"; -import type { Errors } from "./types/src/libs/Errors"; +import HypercertMinterAbi from "../abi/HypercertMinter.json"; +import AllowlistMinterAbi from "../abi/AllowlistMinter.json"; +import CurrencyManagerAbi from "../abi/CurrencyManager.json"; +import ExecutionManagerAbi from "../abi/ExecutionManager.json"; +import LooksRareProtocolAbi from "../abi/LooksRareProtocol.json"; +import NonceManagerAbi from "../abi/NonceManager.json"; +import OrderValidatorV2AAbi from "../abi/OrderValidatorV2A.json"; +import StrategyManagerAbi from "../abi/StrategyManager.json"; +import TransferManagerAbi from "../abi/TransferManager.json"; + +import type { CurrencyManager } from "../types/src/marketplace/CurrencyManager"; +import type { ExecutionManager } from "../types/src/marketplace/ExecutionManager"; +import type { LooksRareProtocol } from "../types/src/marketplace/LooksRareProtocol"; +import type { NonceManager } from "../types/src/marketplace/NonceManager"; +import type { OrderValidatorV2A } from "../types/src/marketplace/helpers/OrderValidatorV2A"; +import type { StrategyManager } from "../types/src/marketplace/StrategyManager"; +import type { TransferManager } from "../types/src/marketplace/TransferManager"; +import type { AllowlistMinter } from "../types/src/protocol/AllowlistMinter"; +import type { HypercertMinter } from "../types/src/protocol/HypercertMinter"; +import type { IAllowlist } from "../types/src/protocol/interfaces/IAllowlist"; +import type { IHypercertToken } from "../types/src/protocol/interfaces/IHypercertToken"; +import type { Errors } from "../types/src/protocol/libs/Errors"; + +import deployments from "./deployments.json"; + /* in order to adjust the build folder: 1) import any files here you want in the final build package. @@ -13,15 +31,35 @@ import type { Errors } from "./types/src/libs/Errors"; 4) bump package.json version to publish a new package to npm. */ -// Factory -// export { HypercertMinter__factory }; +// Deployments +export { deployments }; // Interfaces export { IAllowlist, IHypercertToken }; -export { HypercertMinterAbi }; +export { + HypercertMinterAbi, + AllowlistMinterAbi, + CurrencyManagerAbi, + ExecutionManagerAbi, + LooksRareProtocolAbi as HypercertExchangeAbi, + NonceManagerAbi, + OrderValidatorV2AAbi, + StrategyManagerAbi, + TransferManagerAbi, +}; // Contracts -export { HypercertMinter, AllowlistMinter }; +export { + HypercertMinter, + AllowlistMinter, + CurrencyManager, + ExecutionManager, + LooksRareProtocol as HypercertExchange, + NonceManager, + OrderValidatorV2A, + StrategyManager, + TransferManager, +}; // Libs export { Errors }; diff --git a/contracts/src/interfaces/IAllowlist.sol b/contracts/src/interfaces/IAllowlist.sol deleted file mode 100644 index fe4a9ec4..00000000 --- a/contracts/src/interfaces/IAllowlist.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.16; - -/// @title Interface for allowlist -/// @author bitbeckers -/// @notice This interface declares the required functionality for a hypercert token -/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) -interface IAllowlist { - function isAllowedToClaim( - bytes32[] calldata proof, - uint256 tokenID, - bytes32 leaf - ) external view returns (bool isAllowed); -} diff --git a/contracts/src/interfaces/IHypercertToken.sol b/contracts/src/interfaces/IHypercertToken.sol deleted file mode 100644 index 1ed1e34e..00000000 --- a/contracts/src/interfaces/IHypercertToken.sol +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.16; - -/// @title Interface for hypercert token interactions -/// @author bitbeckers -/// @notice This interface declares the required functionality for a hypercert token -/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) -interface IHypercertToken { - /** - * AllowAll = Unrestricted - * DisallowAll = Transfers disabled after minting - * FromCreatorOnly = Only the original creator can transfer - */ - /// @dev Transfer restriction policies on hypercerts - enum TransferRestrictions { - AllowAll, - DisallowAll, - FromCreatorOnly - } - - /// @dev Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`. - event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits); - - /// @dev Function called to store a claim referenced via `uri` with a maximum number of fractions `units`. - function mintClaim(address account, uint256 units, string memory uri, TransferRestrictions restrictions) external; - - /// @dev Function called to store a claim referenced via `uri` with a set of `fractions`. - /// @dev Fractions are internally summed to total units. - function mintClaimWithFractions( - address account, - uint256 units, - uint256[] memory fractions, - string memory uri, - TransferRestrictions restrictions - ) external; - - /// @dev Function called to split `tokenID` owned by `account` into units declared in `values`. - /// @notice The sum of `values` must equal the current value of `_tokenID`. - function splitFraction(address account, uint256 tokenID, uint256[] memory _values) external; - - /// @dev Function called to merge tokens within `tokenIDs`. - /// @notice Tokens that have been merged are burned. - function mergeFractions(address account, uint256[] memory tokenIDs) external; - - /// @dev Function to burn the token at `tokenID` for `account` - /// @notice Operator must be allowed by `creator` and the token must represent the total amount of available units. - function burnFraction(address account, uint256 tokenID) external; - - /// @dev Returns the `units` held by a (fractional) token at `claimID` - /// @dev If `tokenID` is a base type, the total amount of `units` for the claim is returned. - /// @dev If `tokenID` is a fractional token, the `units` held by the token is returned - function unitsOf(uint256 tokenID) external view returns (uint256 units); - - /// @dev Returns the `units` held by `account` of a (fractional) token at `claimID` - /// @dev If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned. - /// @dev If `tokenID` is a fractional token, the `units` held by `account` the token is returned - function unitsOf(address account, uint256 tokenID) external view returns (uint256 units); - - /// @dev Returns the `uri` for metadata of the claim represented by `tokenID` - /// @dev Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata) - function uri(uint256 tokenID) external view returns (string memory metadata); -} diff --git a/contracts/src/libs/Errors.sol b/contracts/src/libs/Errors.sol deleted file mode 100644 index e19d6b5c..00000000 --- a/contracts/src/libs/Errors.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; - -/// @author bitbeckers -library Errors { - error AlreadyClaimed(); - error ArraySize(); - error DoesNotExist(); - error DuplicateEntry(); - error Invalid(); - error NotAllowed(); - error NotApprovedOrOwner(); - error TransfersNotAllowed(); - error TypeMismatch(); -} diff --git a/contracts/src/marketplace/BatchOrderTypehashRegistry.sol b/contracts/src/marketplace/BatchOrderTypehashRegistry.sol new file mode 100644 index 00000000..9710a735 --- /dev/null +++ b/contracts/src/marketplace/BatchOrderTypehashRegistry.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Shared errors +import {MerkleProofTooLarge} from "./errors/SharedErrors.sol"; + +/** + * @title BatchOrderTypehashRegistry + * @notice The contract generates the batch order hash that is used to compute the digest for signature verification. + * @author LooksRare protocol team (👀,💎) + */ +contract BatchOrderTypehashRegistry { + /** + * @notice This function returns the hash of the concatenation of batch order type hash and merkle root. + * @param root Merkle root + * @param proofLength Merkle proof length + * @return batchOrderHash The batch order hash + */ + function hashBatchOrder(bytes32 root, uint256 proofLength) public pure returns (bytes32 batchOrderHash) { + batchOrderHash = keccak256(abi.encode(_getBatchOrderTypehash(proofLength), root)); + } + + /** + * @dev It looks like this for each height + * height == 1: BatchOrder(Maker[2] tree)Maker(uint8 quoteType,uint256 globalNonce,uint256 subsetNonce,uint256 + * orderNonce,uint256 strategyId,uint8 collectionType,address collection,address currency,address signer,uint256 + * startTime,uint256 endTime,uint256 price,uint256[] itemIds,uint256[] amounts,bytes additionalParameters) + * height == 2: BatchOrder(Maker[2][2] tree)Maker(uint8 quoteType,uint256 globalNonce,uint256 + * subsetNonce,uint256 orderNonce,uint256 strategyId,uint8 collectionType,address collection,address + * currency,address signer,uint256 startTime,uint256 endTime,uint256 price,uint256[] itemIds,uint256[] amounts,bytes + * additionalParameters) + * height == n: BatchOrder(Maker[2]...[2] tree)Maker(uint8 quoteType,uint256 globalNonce,uint256 + * subsetNonce,uint256 orderNonce,uint256 strategyId,uint8 collectionType,address collection,address + * currency,address signer,uint256 startTime,uint256 endTime,uint256 price,uint256[] itemIds,uint256[] amounts,bytes + * additionalParameters) + */ + function _getBatchOrderTypehash(uint256 height) internal pure returns (bytes32 typehash) { + if (height == 1) { + typehash = hex"9661287f7a4aa4867db46a2453ee15bebac4e8fc25667a58718da658f15de643"; + } else if (height == 2) { + typehash = hex"a54ab330ea9e1dfccee2b86f3666989e7fbd479704416c757c8de8e820142a08"; + } else if (height == 3) { + typehash = hex"93390f5d45ede9dea305f16aec86b2472af4f823851637f1b7019ad0775cea49"; + } else if (height == 4) { + typehash = hex"9dda2c8358da895e43d574bb15954ce5727b22e923a2d8f28261f297bce42f0b"; + } else if (height == 5) { + typehash = hex"92dc717124e161262f9d10c7079e7d54dc51271893fba54aa4a0f270fecdcc98"; + } else if (height == 6) { + typehash = hex"ce02aee5a7a35d40d974463c4c6e5534954fb07a7e7bc966fee268a15337bfd8"; + } else if (height == 7) { + typehash = hex"f7a65efd167a18f7091b2bb929d687dd94503cf0a43620487055ed7d6b727559"; + } else if (height == 8) { + typehash = hex"def24acacad1318b664520f7c10e8bc6d1e7f6f6f7c8b031e70624ceb42266a6"; + } else if (height == 9) { + typehash = hex"4cb4080dc4e7bae88b4dc4307ad5117fa4f26195998a1b5f40368809d7f4c7f2"; + } else if (height == 10) { + typehash = hex"f8b1f864164d8d6e0b45f1399bd711223117a4ab0b057a9c2d7779e86a7c88db"; + } else { + revert MerkleProofTooLarge(height); + } + } +} diff --git a/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol b/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol new file mode 100644 index 00000000..9f0bcc3d --- /dev/null +++ b/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// LooksRare unopinionated libraries +import {IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; + +// Interfaces +import {ICreatorFeeManager} from "./interfaces/ICreatorFeeManager.sol"; +import {IRoyaltyFeeRegistry} from "./interfaces/IRoyaltyFeeRegistry.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "./constants/NumericConstants.sol"; + +/** + * @title CreatorFeeManagerWithRebates + * @notice This contract returns the creator fee address and the creator rebate amount. + * @author LooksRare protocol team (👀,💎) + */ +contract CreatorFeeManagerWithRebates is ICreatorFeeManager { + /** + * @notice Standard royalty fee (in basis point). + */ + uint256 public constant STANDARD_ROYALTY_FEE_BP = 50; + + /** + * @notice Royalty fee registry interface. + */ + IRoyaltyFeeRegistry public immutable royaltyFeeRegistry; + + /** + * @notice Constructor + * @param _royaltyFeeRegistry Royalty fee registry address. + */ + constructor(address _royaltyFeeRegistry) { + royaltyFeeRegistry = IRoyaltyFeeRegistry(_royaltyFeeRegistry); + } + + /** + * @inheritdoc ICreatorFeeManager + */ + function viewCreatorFeeInfo(address collection, uint256 price, uint256[] memory itemIds) + external + view + returns (address creator, uint256 creatorFeeAmount) + { + // Check if there is a royalty info in the system + (creator,) = royaltyFeeRegistry.royaltyInfo(collection, price); + + if (creator == address(0)) { + if (IERC2981(collection).supportsInterface(IERC2981.royaltyInfo.selector)) { + uint256 length = itemIds.length; + + for (uint256 i; i < length;) { + try IERC2981(collection).royaltyInfo(itemIds[i], price) returns ( + address newCreator, uint256 /* newCreatorFeeAmount */ + ) { + if (i == 0) { + creator = newCreator; + + unchecked { + ++i; + } + continue; + } + + if (newCreator != creator) { + revert BundleEIP2981NotAllowed(collection); + } + } catch { + // If creator address is not 0, that means there was at least 1 + // successful call. If all royaltyInfo calls fail, it should assume + // 0 royalty. + // If the first call reverts, even if creator is address(0), subsequent + // successful calls will still revert above with BundleEIP2981NotAllowed + // because newCreator will be different from creator. + if (creator != address(0)) { + revert BundleEIP2981NotAllowed(collection); + } + } + + unchecked { + ++i; + } + } + } + } + + // A fixed royalty fee is applied + if (creator != address(0)) { + creatorFeeAmount = (STANDARD_ROYALTY_FEE_BP * price) / ONE_HUNDRED_PERCENT_IN_BP; + } + } +} diff --git a/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol b/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol new file mode 100644 index 00000000..4b72630f --- /dev/null +++ b/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// LooksRare unopinionated libraries +import {IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; + +// Interfaces +import {ICreatorFeeManager} from "./interfaces/ICreatorFeeManager.sol"; +import {IRoyaltyFeeRegistry} from "./interfaces/IRoyaltyFeeRegistry.sol"; + +/** + * @title CreatorFeeManagerWithRoyalties + * @notice This contract returns the creator fee address and the creator fee amount. + * @author LooksRare protocol team (👀,💎) + */ +contract CreatorFeeManagerWithRoyalties is ICreatorFeeManager { + /** + * @notice Royalty fee registry interface. + */ + IRoyaltyFeeRegistry public immutable royaltyFeeRegistry; + + /** + * @notice Constructor + * @param _royaltyFeeRegistry Royalty fee registry address. + */ + constructor(address _royaltyFeeRegistry) { + royaltyFeeRegistry = IRoyaltyFeeRegistry(_royaltyFeeRegistry); + } + + /** + * @inheritdoc ICreatorFeeManager + * @dev There are two on-chain sources for the royalty fee to distribute. + * 1. RoyaltyFeeRegistry: It is an on-chain registry where creator fee is defined + * for all items of a collection. + * 2. ERC2981: The NFT Royalty Standard where royalty fee is defined at a itemId level in a collection. + * The on-chain logic looks up the registry first. If it does not find anything, + * it checks if a collection is ERC2981. If so, it fetches the proper royalty information for the itemId. + * For a bundle that contains multiple itemIds (for a collection using ERC2981), if the royalty fee/recipient + * differ among the itemIds part of the bundle, the trade reverts. + * This contract DOES NOT enforce any restriction for extremely high creator fee, + * nor verifies the creator fee fetched is inferior to the total price. + * If any contract relies on it to build an on-chain royalty logic, + * it should implement protection against: + * (1) high royalties + * (2) potential unexpected royalty changes that can occur after the creation of the order. + */ + function viewCreatorFeeInfo(address collection, uint256 price, uint256[] memory itemIds) + external + view + returns (address creator, uint256 creatorFeeAmount) + { + // Check if there is a royalty info in the system + (creator, creatorFeeAmount) = royaltyFeeRegistry.royaltyInfo(collection, price); + + if (creator == address(0)) { + if (IERC2981(collection).supportsInterface(IERC2981.royaltyInfo.selector)) { + uint256 length = itemIds.length; + + for (uint256 i; i < length;) { + try IERC2981(collection).royaltyInfo(itemIds[i], price) returns ( + address newCreator, uint256 newCreatorFeeAmount + ) { + if (i == 0) { + creator = newCreator; + creatorFeeAmount = newCreatorFeeAmount; + + unchecked { + ++i; + } + continue; + } + + if (newCreator != creator || newCreatorFeeAmount != creatorFeeAmount) { + revert BundleEIP2981NotAllowed(collection); + } + } catch { + // If creator address is not 0, that means there was at least 1 + // successful call. If all royaltyInfo calls fail, it should assume + // 0 royalty. + // If the first call reverts, even if creator is address(0), subsequent + // successful calls will still revert above with BundleEIP2981NotAllowed + // because newCreator/newCreatorFeeAmount will be different from creator/creatorFeeAmount. + if (creator != address(0)) { + revert BundleEIP2981NotAllowed(collection); + } + } + + unchecked { + ++i; + } + } + } + } + } +} diff --git a/contracts/src/marketplace/CurrencyManager.sol b/contracts/src/marketplace/CurrencyManager.sol new file mode 100644 index 00000000..f72b5471 --- /dev/null +++ b/contracts/src/marketplace/CurrencyManager.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; + +// Interfaces +import {ICurrencyManager} from "./interfaces/ICurrencyManager.sol"; + +/** + * @title CurrencyManager + * @notice This contract manages the list of valid fungible currencies. + * @author LooksRare protocol team (👀,💎) + */ +contract CurrencyManager is ICurrencyManager, OwnableTwoSteps { + /** + * @notice It checks whether the currency is allowed for transacting. + */ + mapping(address => bool) public isCurrencyAllowed; + + /** + * @notice Constructor + * @param _owner Owner address + */ + constructor(address _owner) OwnableTwoSteps(_owner) {} + + /** + * @notice This function allows the owner to update the status of a currency. + * @param currency Currency address (address(0) for ETH) + * @param isAllowed Whether the currency should be allowed for trading + * @dev Only callable by owner. + */ + function updateCurrencyStatus(address currency, bool isAllowed) external onlyOwner { + isCurrencyAllowed[currency] = isAllowed; + emit CurrencyStatusUpdated(currency, isAllowed); + } +} diff --git a/contracts/src/marketplace/ExecutionManager.sol b/contracts/src/marketplace/ExecutionManager.sol new file mode 100644 index 00000000..e3e132df --- /dev/null +++ b/contracts/src/marketplace/ExecutionManager.sol @@ -0,0 +1,304 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "./libraries/OrderStructs.sol"; + +// Interfaces +import {IExecutionManager} from "./interfaces/IExecutionManager.sol"; +import {ICreatorFeeManager} from "./interfaces/ICreatorFeeManager.sol"; + +// Direct dependencies +import {InheritedStrategy} from "./InheritedStrategy.sol"; +import {NonceManager} from "./NonceManager.sol"; +import {StrategyManager} from "./StrategyManager.sol"; + +// Assembly +import { + NoSelectorForStrategy_error_selector, + NoSelectorForStrategy_error_length, + OutsideOfTimeRange_error_selector, + OutsideOfTimeRange_error_length, + Error_selector_offset +} from "./constants/AssemblyConstants.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "./constants/NumericConstants.sol"; + +// Enums +import {QuoteType} from "./enums/QuoteType.sol"; + +/** + * @title ExecutionManager + * @notice This contract handles the execution and resolution of transactions. A transaction is executed on-chain + * when an off-chain maker order is matched by on-chain taker order of a different kind. + * For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). + * @author LooksRare protocol team (👀,💎) + */ +contract ExecutionManager is InheritedStrategy, NonceManager, StrategyManager, IExecutionManager { + /** + * @notice Protocol fee recipient. + */ + address public protocolFeeRecipient; + + /** + * @notice Maximum creator fee (in basis point). + */ + // TODO do we need a max? Is 1% max fair? + uint16 public maxCreatorFeeBp = 1000; + + /** + * @notice Creator fee manager. + */ + ICreatorFeeManager public creatorFeeManager; + + /** + * @notice Constructor + * @param _owner Owner address + * @param _protocolFeeRecipient Protocol fee recipient address + */ + constructor(address _owner, address _protocolFeeRecipient) StrategyManager(_owner) { + _updateProtocolFeeRecipient(_protocolFeeRecipient); + } + + /** + * @notice This function allows the owner to update the creator fee manager address. + * @param newCreatorFeeManager Address of the creator fee manager + * @dev Only callable by owner. + */ + function updateCreatorFeeManager(address newCreatorFeeManager) external onlyOwner { + creatorFeeManager = ICreatorFeeManager(newCreatorFeeManager); + emit NewCreatorFeeManager(newCreatorFeeManager); + } + + /** + * @notice This function allows the owner to update the maximum creator fee (in basis point). + * @param newMaxCreatorFeeBp New maximum creator fee (in basis point) + * @dev The maximum value that can be set is 25%. + * Only callable by owner. + */ + function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external onlyOwner { + if (newMaxCreatorFeeBp > 2500) { + revert CreatorFeeBpTooHigh(); + } + + maxCreatorFeeBp = newMaxCreatorFeeBp; + + emit NewMaxCreatorFeeBp(newMaxCreatorFeeBp); + } + + /** + * @notice This function allows the owner to update the protocol fee recipient. + * @param newProtocolFeeRecipient New protocol fee recipient address + * @dev Only callable by owner. + */ + function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external onlyOwner { + _updateProtocolFeeRecipient(newProtocolFeeRecipient); + } + + /** + * @notice This function is internal and is used to execute a transaction initiated by a taker order. + * @param takerOrder Taker order struct (taker specific parameters for the execution) + * @param makerOrder Maker order struct (maker specific parameter for the execution) + * @param sender The address that sent the transaction + * @return itemIds Array of item ids to be traded + * @return amounts Array of amounts for each item id + * @return recipients Array of recipient addresses + * @return feeAmounts Array of fee amounts + * @return isNonceInvalidated Whether the order's nonce will be invalidated after executing the order + */ + function _executeStrategyForTakerOrder( + OrderStructs.Taker calldata takerOrder, + OrderStructs.Maker calldata makerOrder, + address sender + ) + internal + returns ( + uint256[] memory itemIds, + uint256[] memory amounts, + address[2] memory recipients, + uint256[3] memory feeAmounts, + bool isNonceInvalidated + ) + { + uint256 price; + + // Verify the order validity for timestamps + _verifyOrderTimestampValidity(makerOrder.startTime, makerOrder.endTime); + + if (makerOrder.strategyId == 0) { + _verifyItemIdsAndAmountsEqualLengthsAndValidAmounts(makerOrder.amounts, makerOrder.itemIds); + (price, itemIds, amounts) = (makerOrder.price, makerOrder.itemIds, makerOrder.amounts); + isNonceInvalidated = true; + } else { + if (strategyInfo[makerOrder.strategyId].isActive) { + /** + * @dev This is equivalent to + * + * if (makerOrder.quoteType == QuoteType.Bid) { + * if (!strategyInfo[makerOrder.strategyId].isMakerBid) { + * revert NoSelectorForStrategy(); + * } + * } else { + * if (strategyInfo[makerOrder.strategyId].isMakerBid) { + * revert NoSelectorForStrategy(); + * } + * } + * + * because one must be 0 and another must be 1 for the function + * to not revert. + * + * Both quoteType (an enum with 2 values) and isMakerBid (a bool) + * can only be 0 or 1. + */ + QuoteType quoteType = makerOrder.quoteType; + bool isMakerBid = strategyInfo[makerOrder.strategyId].isMakerBid; + assembly { + if eq(quoteType, isMakerBid) { + mstore(0x00, NoSelectorForStrategy_error_selector) + revert(Error_selector_offset, NoSelectorForStrategy_error_length) + } + } + + (bool status, bytes memory data) = strategyInfo[makerOrder.strategyId].implementation.call( + abi.encodeWithSelector(strategyInfo[makerOrder.strategyId].selector, takerOrder, makerOrder) + ); + + if (!status) { + // @dev It forwards the revertion message from the low-level call + assembly { + revert(add(data, 32), mload(data)) + } + } + + (price, itemIds, amounts, isNonceInvalidated) = abi.decode(data, (uint256, uint256[], uint256[], bool)); + } else { + revert StrategyNotAvailable(makerOrder.strategyId); + } + } + + // Creator fee and adjustment of protocol fee + (recipients[1], feeAmounts[1]) = + _getCreatorRecipientAndCalculateFeeAmount(makerOrder.collection, price, itemIds); + if (makerOrder.quoteType == QuoteType.Bid) { + _setTheRestOfFeeAmountsAndRecipients( + makerOrder.strategyId, + price, + takerOrder.recipient == address(0) ? sender : takerOrder.recipient, + feeAmounts, + recipients + ); + } else { + _setTheRestOfFeeAmountsAndRecipients( + makerOrder.strategyId, price, makerOrder.signer, feeAmounts, recipients + ); + } + } + + /** + * @notice This private function updates the protocol fee recipient. + * @param newProtocolFeeRecipient New protocol fee recipient address + */ + function _updateProtocolFeeRecipient(address newProtocolFeeRecipient) private { + if (newProtocolFeeRecipient == address(0)) { + revert NewProtocolFeeRecipientCannotBeNullAddress(); + } + + protocolFeeRecipient = newProtocolFeeRecipient; + emit NewProtocolFeeRecipient(newProtocolFeeRecipient); + } + + /** + * @notice This function is internal and is used to calculate + * the protocol fee amount for a set of fee amounts. + * @param price Transaction price + * @param strategyId Strategy id + * @param creatorFeeAmount Creator fee amount + * @param minTotalFeeAmount Min total fee amount + * @return protocolFeeAmount Protocol fee amount + */ + function _calculateProtocolFeeAmount( + uint256 price, + uint256 strategyId, + uint256 creatorFeeAmount, + uint256 minTotalFeeAmount + ) private view returns (uint256 protocolFeeAmount) { + protocolFeeAmount = (price * strategyInfo[strategyId].standardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + + if (protocolFeeAmount + creatorFeeAmount < minTotalFeeAmount) { + protocolFeeAmount = minTotalFeeAmount - creatorFeeAmount; + } + } + + /** + * @notice This function is internal and is used to get the creator fee address + * and calculate the creator fee amount. + * @param collection Collection address + * @param price Transaction price + * @param itemIds Array of item ids + * @return creator Creator recipient + * @return creatorFeeAmount Creator fee amount + */ + function _getCreatorRecipientAndCalculateFeeAmount(address collection, uint256 price, uint256[] memory itemIds) + private + view + returns (address creator, uint256 creatorFeeAmount) + { + if (address(creatorFeeManager) != address(0)) { + (creator, creatorFeeAmount) = creatorFeeManager.viewCreatorFeeInfo(collection, price, itemIds); + + if (creator == address(0)) { + // If recipient is null address, creator fee is set to 0 + creatorFeeAmount = 0; + } else if (creatorFeeAmount * ONE_HUNDRED_PERCENT_IN_BP > (price * uint256(maxCreatorFeeBp))) { + // If creator fee is higher than tolerated, it reverts + revert CreatorFeeBpTooHigh(); + } + } + } + + /** + * @dev This function does not need to return feeAmounts and recipients as they are modified + * in memory. + */ + function _setTheRestOfFeeAmountsAndRecipients( + uint256 strategyId, + uint256 price, + address askRecipient, + uint256[3] memory feeAmounts, + address[2] memory recipients + ) private view { + // Compute minimum total fee amount + uint256 minTotalFeeAmount = (price * strategyInfo[strategyId].minTotalFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + + if (feeAmounts[1] == 0) { + // If creator fee is null, protocol fee is set as the minimum total fee amount + feeAmounts[2] = minTotalFeeAmount; + // Net fee amount for seller + feeAmounts[0] = price - feeAmounts[2]; + } else { + // If there is a creator fee information, the protocol fee amount can be calculated + feeAmounts[2] = _calculateProtocolFeeAmount(price, strategyId, feeAmounts[1], minTotalFeeAmount); + // Net fee amount for seller + feeAmounts[0] = price - feeAmounts[1] - feeAmounts[2]; + } + + recipients[0] = askRecipient; + } + + /** + * @notice This function is internal and is used to verify the validity of an order + * in the context of the current block timestamps. + * @param startTime Start timestamp + * @param endTime End timestamp + */ + function _verifyOrderTimestampValidity(uint256 startTime, uint256 endTime) private view { + // if (startTime > block.timestamp || endTime < block.timestamp) revert OutsideOfTimeRange(); + assembly { + if or(gt(startTime, timestamp()), lt(endTime, timestamp())) { + mstore(0x00, OutsideOfTimeRange_error_selector) + revert(Error_selector_offset, OutsideOfTimeRange_error_length) + } + } + } +} diff --git a/contracts/src/marketplace/InheritedStrategy.sol b/contracts/src/marketplace/InheritedStrategy.sol new file mode 100644 index 00000000..93d09414 --- /dev/null +++ b/contracts/src/marketplace/InheritedStrategy.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "./libraries/OrderStructs.sol"; + +// Shared errors +import {OrderInvalid} from "./errors/SharedErrors.sol"; + +// Assembly +import { + OrderInvalid_error_selector, + OrderInvalid_error_length, + Error_selector_offset, + OneWord +} from "./constants/AssemblyConstants.sol"; + +/** + * @title InheritedStrategy + * @notice This contract handles the verification of parameters for standard transactions. + * It does not verify the taker struct's itemIds and amounts array as well as + * minPrice (taker ask) / maxPrice (taker bid) because before the taker executes the + * transaction and the maker itemIds/amounts/price should have already been confirmed off-chain. + * @dev A standard transaction (bid or ask) is mapped to strategyId = 0. + * @author LooksRare protocol team (👀,💎) + */ +contract InheritedStrategy { + /** + * @notice This function is internal and is used to validate the parameters for a standard sale strategy + * when the standard transaction is initiated by a taker bid. + * @param amounts Array of amounts + * @param itemIds Array of item ids + */ + function _verifyItemIdsAndAmountsEqualLengthsAndValidAmounts(uint256[] calldata amounts, uint256[] calldata itemIds) + internal + pure + { + assembly { + let end + { + /* + * @dev If A == B, then A XOR B == 0. + * + * if (amountsLength == 0 || amountsLength != itemIdsLength) { + * revert OrderInvalid(); + * } + */ + let amountsLength := amounts.length + let itemIdsLength := itemIds.length + + if or(iszero(amountsLength), xor(amountsLength, itemIdsLength)) { + mstore(0x00, OrderInvalid_error_selector) + revert(Error_selector_offset, OrderInvalid_error_length) + } + + /** + * @dev Shifting left 5 times is equivalent to amountsLength * 32 bytes + */ + end := shl(5, amountsLength) + } + + let amountsOffset := amounts.offset + + for {} end {} { + /** + * @dev Starting from the end of the array minus 32 bytes to load the last item, + * ending with `end` equal to 0 to load the first item + * + * uint256 end = amountsLength; + * + * for (uint256 i = end - 1; i >= 0; i--) { + * uint256 amount = amounts[i]; + * if (amount == 0) { + * revert OrderInvalid(); + * } + * } + */ + end := sub(end, OneWord) + + let amount := calldataload(add(amountsOffset, end)) + + if iszero(amount) { + mstore(0x00, OrderInvalid_error_selector) + revert(Error_selector_offset, OrderInvalid_error_length) + } + } + } + } +} diff --git a/contracts/src/marketplace/LooksRareProtocol.sol b/contracts/src/marketplace/LooksRareProtocol.sol new file mode 100644 index 00000000..b60e6e30 --- /dev/null +++ b/contracts/src/marketplace/LooksRareProtocol.sol @@ -0,0 +1,622 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {SignatureCheckerCalldata} from "@looksrare/contracts-libs/contracts/SignatureCheckerCalldata.sol"; +import {LowLevelETHReturnETHIfAnyExceptOneWei} from + "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelETHReturnETHIfAnyExceptOneWei.sol"; +import {LowLevelWETH} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelWETH.sol"; +import {LowLevelERC20Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Transfer.sol"; + +// OpenZeppelin's library (adjusted) for verifying Merkle proofs +import {MerkleProofCalldataWithNodes} from "./libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol"; + +// Libraries +import {OrderStructs} from "./libraries/OrderStructs.sol"; + +// Interfaces +import {ILooksRareProtocol} from "./interfaces/ILooksRareProtocol.sol"; + +// Shared errors +import { + CallerInvalid, + CurrencyInvalid, + LengthsInvalid, + MerkleProofInvalid, + MerkleProofTooLarge, + QuoteTypeInvalid +} from "./errors/SharedErrors.sol"; + +// Direct dependencies +import {TransferSelectorNFT} from "./TransferSelectorNFT.sol"; +import {BatchOrderTypehashRegistry} from "./BatchOrderTypehashRegistry.sol"; + +// Constants +import {MAX_CALLDATA_PROOF_LENGTH, ONE_HUNDRED_PERCENT_IN_BP} from "./constants/NumericConstants.sol"; + +// Enums +import {QuoteType} from "./enums/QuoteType.sol"; + +/** + * @title LooksRareProtocol + * @notice This contract is the core smart contract of the LooksRare protocol ("v2"). + * It is the main entry point for users to initiate transactions with taker orders + * and manage the cancellation of maker orders, which exist off-chain. + * ~~~~~~ + * ~~~~ ~~~~ + * ~~~ ~~~ + * ~~~ ~~~ + * ~~~ ~~~ + * ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ + * ~~~ ~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~~ ~~~ + * ~~~ ~~~~~~~ ~~~~~~~ ~~~ + * ~~~- ~~~~~~~~ ~~~~ + * ~~~ ~~~~ ~~~~ ~~~ + * ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ + * ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ + * ~~~ ~~~ ~~~ ~~~ + * ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ + * ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ + * ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ + * ~~~~~~ ~~~~ ~~~ ~~~ ~~~~ ~~~~~~ + * ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ + * ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ + * ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ + * ~~~~~~ ~~~~ ~~~ ~~~ ~~~~~ ~~~~~~ + * ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ + * ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ + * ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ + * ~~ ~~~ ~~~ ~~~ + * ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ + * ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ + * ~~~ ~~~~ ~~~~ ~~~ + * ~~~~ ~~~~~~~~ ~~~~ + * ~~~ ~~~~~~~ ~~~~~~~ ~~~ + * ~~~ ~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~ ~~~ + * ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ + * ~~~ ~~~ + * ~~~ ~~~ + * ~~~ ~~~ + * ~~~~ ~~~~ + * ~~~~~~ + * @author LooksRare protocol team (👀,💎) + */ +contract LooksRareProtocol is + ILooksRareProtocol, + TransferSelectorNFT, + LowLevelETHReturnETHIfAnyExceptOneWei, + LowLevelWETH, + LowLevelERC20Transfer, + BatchOrderTypehashRegistry +{ + using OrderStructs for OrderStructs.Maker; + + /** + * @notice Wrapped ETH. + */ + address public immutable WETH; + + /** + * @notice Current chainId. + */ + uint256 public chainId; + + /** + * @notice Current domain separator. + */ + bytes32 public domainSeparator; + + /** + * @notice This variable is used as the gas limit for a ETH transfer. + * If a standard ETH transfer fails within this gas limit, ETH will get wrapped to WETH + * and transferred to the initial recipient. + */ + uint256 private _gasLimitETHTransfer = 2300; + + /** + * @notice Constructor + * @param _owner Owner address + * @param _protocolFeeRecipient Protocol fee recipient address + * @param _transferManager Transfer manager address + * @param _weth Wrapped ETH address + */ + constructor(address _owner, address _protocolFeeRecipient, address _transferManager, address _weth) + TransferSelectorNFT(_owner, _protocolFeeRecipient, _transferManager) + { + _updateDomainSeparator(); + WETH = _weth; + } + + /** + * @inheritdoc ILooksRareProtocol + */ + function executeTakerAsk( + OrderStructs.Taker calldata takerAsk, + OrderStructs.Maker calldata makerBid, + bytes calldata makerSignature, + OrderStructs.MerkleTree calldata merkleTree + ) external nonReentrant { + address currency = makerBid.currency; + + // Verify whether the currency is allowed and is not ETH (address(0)) + if (!isCurrencyAllowed[currency] || currency == address(0)) { + revert CurrencyInvalid(); + } + + address signer = makerBid.signer; + bytes32 orderHash = makerBid.hash(); + _verifyMerkleProofOrOrderHash(merkleTree, orderHash, makerSignature, signer); + + // Execute the transaction and fetch protocol fee amount + uint256 totalProtocolFeeAmount = _executeTakerAsk(takerAsk, makerBid, orderHash); + + // Pay protocol fee (and affiliate fee if any) + _payProtocolFeeAndAffiliateFee(currency, signer, totalProtocolFeeAmount); + } + + /** + * @inheritdoc ILooksRareProtocol + */ + function executeTakerBid( + OrderStructs.Taker calldata takerBid, + OrderStructs.Maker calldata makerAsk, + bytes calldata makerSignature, + OrderStructs.MerkleTree calldata merkleTree + ) external payable nonReentrant { + address currency = makerAsk.currency; + + // Verify whether the currency is allowed for trading. + if (!isCurrencyAllowed[currency]) { + revert CurrencyInvalid(); + } + + bytes32 orderHash = makerAsk.hash(); + _verifyMerkleProofOrOrderHash(merkleTree, orderHash, makerSignature, makerAsk.signer); + + // Execute the transaction and fetch protocol fee amount + uint256 totalProtocolFeeAmount = _executeTakerBid(takerBid, makerAsk, msg.sender, orderHash); + + // Pay protocol fee amount + _payProtocolFeeAndAffiliateFee(currency, msg.sender, totalProtocolFeeAmount); + + // Return ETH if any + _returnETHIfAnyWithOneWeiLeft(); + } + + /** + * @inheritdoc ILooksRareProtocol + */ + function executeMultipleTakerBids( + OrderStructs.Taker[] calldata takerBids, + OrderStructs.Maker[] calldata makerAsks, + bytes[] calldata makerSignatures, + OrderStructs.MerkleTree[] calldata merkleTrees, + bool isAtomic + ) external payable nonReentrant { + uint256 length = takerBids.length; + if ( + length == 0 + || (makerAsks.length ^ length) | (makerSignatures.length ^ length) | (merkleTrees.length ^ length) != 0 + ) { + revert LengthsInvalid(); + } + + // Verify whether the currency at index = 0 is allowed for trading + address currency = makerAsks[0].currency; + if (!isCurrencyAllowed[currency]) { + revert CurrencyInvalid(); + } + + { + // Initialize protocol fee amount + uint256 totalProtocolFeeAmount; + + // If atomic, it uses the executeTakerBid function. + // If not atomic, it uses a catch/revert pattern with external function. + if (isAtomic) { + for (uint256 i; i < length;) { + OrderStructs.Maker calldata makerAsk = makerAsks[i]; + + // Verify the currency is the same + if (i != 0) { + if (makerAsk.currency != currency) { + revert CurrencyInvalid(); + } + } + + OrderStructs.Taker calldata takerBid = takerBids[i]; + bytes32 orderHash = makerAsk.hash(); + + { + _verifyMerkleProofOrOrderHash(merkleTrees[i], orderHash, makerSignatures[i], makerAsk.signer); + + // Execute the transaction and add protocol fee + totalProtocolFeeAmount += _executeTakerBid(takerBid, makerAsk, msg.sender, orderHash); + + unchecked { + ++i; + } + } + } + } else { + for (uint256 i; i < length;) { + OrderStructs.Maker calldata makerAsk = makerAsks[i]; + + // Verify the currency is the same + if (i != 0) { + if (makerAsk.currency != currency) { + revert CurrencyInvalid(); + } + } + + OrderStructs.Taker calldata takerBid = takerBids[i]; + bytes32 orderHash = makerAsk.hash(); + + { + _verifyMerkleProofOrOrderHash(merkleTrees[i], orderHash, makerSignatures[i], makerAsk.signer); + + try this.restrictedExecuteTakerBid(takerBid, makerAsk, msg.sender, orderHash) returns ( + uint256 protocolFeeAmount + ) { + totalProtocolFeeAmount += protocolFeeAmount; + } catch {} + + unchecked { + ++i; + } + } + } + } + + // Pay protocol fee (and affiliate fee if any) + _payProtocolFeeAndAffiliateFee(currency, msg.sender, totalProtocolFeeAmount); + } + + // Return ETH if any + _returnETHIfAnyWithOneWeiLeft(); + } + + /** + * @notice This function is used to do a non-atomic matching in the context of a batch taker bid. + * @param takerBid Taker bid struct + * @param makerAsk Maker ask struct + * @param sender Sender address (i.e. the initial msg sender) + * @param orderHash Hash of the maker ask order + * @return protocolFeeAmount Protocol fee amount + * @dev This function is only callable by this contract. It is used for non-atomic batch order matching. + */ + function restrictedExecuteTakerBid( + OrderStructs.Taker calldata takerBid, + OrderStructs.Maker calldata makerAsk, + address sender, + bytes32 orderHash + ) external returns (uint256 protocolFeeAmount) { + if (msg.sender != address(this)) { + revert CallerInvalid(); + } + + protocolFeeAmount = _executeTakerBid(takerBid, makerAsk, sender, orderHash); + } + + /** + * @notice This function allows the owner to update the domain separator (if possible). + * @dev Only callable by owner. If there is a fork of the network with a new chainId, + * it allows the owner to reset the domain separator for the new chain id. + */ + function updateDomainSeparator() external onlyOwner { + if (block.chainid != chainId) { + _updateDomainSeparator(); + emit NewDomainSeparator(); + } else { + revert SameDomainSeparator(); + } + } + + /** + * @notice This function allows the owner to update the maximum ETH gas limit for a standard transfer. + * @param newGasLimitETHTransfer New gas limit for ETH transfer + * @dev Only callable by owner. + */ + function updateETHGasLimitForTransfer(uint256 newGasLimitETHTransfer) external onlyOwner { + if (newGasLimitETHTransfer < 2300) { + revert NewGasLimitETHTransferTooLow(); + } + + _gasLimitETHTransfer = newGasLimitETHTransfer; + + emit NewGasLimitETHTransfer(newGasLimitETHTransfer); + } + + /** + * @notice This function is internal and is used to execute a taker ask (against a maker bid). + * @param takerAsk Taker ask order struct + * @param makerBid Maker bid order struct + * @param orderHash Hash of the maker bid order + * @return protocolFeeAmount Protocol fee amount + */ + function _executeTakerAsk( + OrderStructs.Taker calldata takerAsk, + OrderStructs.Maker calldata makerBid, + bytes32 orderHash + ) internal returns (uint256) { + if (makerBid.quoteType != QuoteType.Bid) { + revert QuoteTypeInvalid(); + } + + address signer = makerBid.signer; + { + bytes32 userOrderNonceStatus = userOrderNonce[signer][makerBid.orderNonce]; + // Verify nonces + if ( + userBidAskNonces[signer].bidNonce != makerBid.globalNonce + || userSubsetNonce[signer][makerBid.subsetNonce] + || (userOrderNonceStatus != bytes32(0) && userOrderNonceStatus != orderHash) + ) { + revert NoncesInvalid(); + } + } + + ( + uint256[] memory itemIds, + uint256[] memory amounts, + address[2] memory recipients, + uint256[3] memory feeAmounts, + bool isNonceInvalidated + ) = _executeStrategyForTakerOrder(takerAsk, makerBid, msg.sender); + + // Order nonce status is updated + _updateUserOrderNonce(isNonceInvalidated, signer, makerBid.orderNonce, orderHash); + + // Taker action goes first + _transferNFT(makerBid.collection, makerBid.collectionType, msg.sender, signer, itemIds, amounts); + + // Maker action goes second + _transferToAskRecipientAndCreatorIfAny(recipients, feeAmounts, makerBid.currency, signer); + + emit TakerAsk( + NonceInvalidationParameters({ + orderHash: orderHash, + orderNonce: makerBid.orderNonce, + isNonceInvalidated: isNonceInvalidated + }), + msg.sender, + signer, + makerBid.strategyId, + makerBid.currency, + makerBid.collection, + itemIds, + amounts, + recipients, + feeAmounts + ); + + // It returns the protocol fee amount + return feeAmounts[2]; + } + + /** + * @notice This function is internal and is used to execute a taker bid (against a maker ask). + * @param takerBid Taker bid order struct + * @param makerAsk Maker ask order struct + * @param sender Sender of the transaction (i.e. msg.sender) + * @param orderHash Hash of the maker ask order + * @return protocolFeeAmount Protocol fee amount + */ + function _executeTakerBid( + OrderStructs.Taker calldata takerBid, + OrderStructs.Maker calldata makerAsk, + address sender, + bytes32 orderHash + ) internal returns (uint256) { + if (makerAsk.quoteType != QuoteType.Ask) { + revert QuoteTypeInvalid(); + } + + address signer = makerAsk.signer; + { + // Verify nonces + bytes32 userOrderNonceStatus = userOrderNonce[signer][makerAsk.orderNonce]; + + if ( + userBidAskNonces[signer].askNonce != makerAsk.globalNonce + || userSubsetNonce[signer][makerAsk.subsetNonce] + || (userOrderNonceStatus != bytes32(0) && userOrderNonceStatus != orderHash) + ) { + revert NoncesInvalid(); + } + } + + ( + uint256[] memory itemIds, + uint256[] memory amounts, + address[2] memory recipients, + uint256[3] memory feeAmounts, + bool isNonceInvalidated + ) = _executeStrategyForTakerOrder(takerBid, makerAsk, msg.sender); + + // Order nonce status is updated + _updateUserOrderNonce(isNonceInvalidated, signer, makerAsk.orderNonce, orderHash); + + // Taker action goes first + _transferToAskRecipientAndCreatorIfAny(recipients, feeAmounts, makerAsk.currency, sender); + + // Maker action goes second + _transferNFT( + makerAsk.collection, + makerAsk.collectionType, + signer, + takerBid.recipient == address(0) ? sender : takerBid.recipient, + itemIds, + amounts + ); + + emit TakerBid( + NonceInvalidationParameters({ + orderHash: orderHash, + orderNonce: makerAsk.orderNonce, + isNonceInvalidated: isNonceInvalidated + }), + sender, + takerBid.recipient == address(0) ? sender : takerBid.recipient, + makerAsk.strategyId, + makerAsk.currency, + makerAsk.collection, + itemIds, + amounts, + recipients, + feeAmounts + ); + + // It returns the protocol fee amount + return feeAmounts[2]; + } + + /** + * @notice This function is internal and is used to pay the protocol fee and affiliate fee (if any). + * @param currency Currency address to transfer (address(0) is ETH) + * @param bidUser Bid user address + * @param totalProtocolFeeAmount Total protocol fee amount (denominated in the currency) + */ + function _payProtocolFeeAndAffiliateFee(address currency, address bidUser, uint256 totalProtocolFeeAmount) + internal + { + if (totalProtocolFeeAmount != 0) { + // Transfer remaining protocol fee to the protocol fee recipient + _transferFungibleTokens(currency, bidUser, protocolFeeRecipient, totalProtocolFeeAmount); + } + } + + /** + * @notice This function is internal and is used to transfer fungible tokens. + * @param currency Currency address + * @param sender Sender address + * @param recipient Recipient address + * @param amount Amount (in fungible tokens) + */ + function _transferFungibleTokens(address currency, address sender, address recipient, uint256 amount) internal { + if (currency == address(0)) { + _transferETHAndWrapIfFailWithGasLimit(WETH, recipient, amount, _gasLimitETHTransfer); + } else { + _executeERC20TransferFrom(currency, sender, recipient, amount); + } + } + + /** + * @notice This function is private and used to transfer funds to + * (1) creator recipient (if any) + * (2) ask recipient. + * @param recipients Recipient addresses + * @param feeAmounts Fees + * @param currency Currency address + * @param bidUser Bid user address + * @dev It does not send to the 0-th element in the array since it is the protocol fee, + * which is paid later in the execution flow. + */ + function _transferToAskRecipientAndCreatorIfAny( + address[2] memory recipients, + uint256[3] memory feeAmounts, + address currency, + address bidUser + ) private { + // @dev There is no check for address(0) since the ask recipient can never be address(0) + // If ask recipient is the maker --> the signer cannot be the null address + // If ask is the taker --> either it is the sender address or + // if the recipient (in TakerAsk) is set to address(0), it is adjusted to the original taker address + uint256 sellerProceed = feeAmounts[0]; + if (sellerProceed != 0) { + _transferFungibleTokens(currency, bidUser, recipients[0], sellerProceed); + } + + // @dev There is no check for address(0), if the creator recipient is address(0), the fee is set to 0 + uint256 creatorFeeAmount = feeAmounts[1]; + if (creatorFeeAmount != 0) { + _transferFungibleTokens(currency, bidUser, recipients[1], creatorFeeAmount); + } + } + + /** + * @notice This function is private and used to compute the domain separator and store the current chain id. + */ + function _updateDomainSeparator() private { + domainSeparator = keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256("LooksRareProtocol"), + keccak256(bytes("2")), + block.chainid, + address(this) + ) + ); + chainId = block.chainid; + } + + /** + * @notice This function is internal and is called during the execution of a transaction to decide + * how to map the user's order nonce. + * @param isNonceInvalidated Whether the nonce is being invalidated + * @param signer Signer address + * @param orderNonce Maker user order nonce + * @param orderHash Hash of the order struct + * @dev If isNonceInvalidated is true, this function invalidates the user order nonce for future execution. + * If it is equal to false, this function maps the order hash for this user order nonce + * to prevent other order structs sharing the same order nonce to be executed. + */ + function _updateUserOrderNonce(bool isNonceInvalidated, address signer, uint256 orderNonce, bytes32 orderHash) + private + { + userOrderNonce[signer][orderNonce] = (isNonceInvalidated ? MAGIC_VALUE_ORDER_NONCE_EXECUTED : orderHash); + } + + /** + * @notice This function is private and used to verify the chain id, compute the digest, and verify the signature. + * @dev If chainId is not equal to the cached chain id, it would revert. + * @param computedHash Hash of order (maker bid or maker ask) or merkle root + * @param makerSignature Signature of the maker + * @param signer Signer address + */ + function _computeDigestAndVerify(bytes32 computedHash, bytes calldata makerSignature, address signer) + private + view + { + if (chainId == block.chainid) { + // \x19\x01 is the standard encoding prefix + SignatureCheckerCalldata.verify( + keccak256(abi.encodePacked("\x19\x01", domainSeparator, computedHash)), signer, makerSignature + ); + } else { + revert ChainIdInvalid(); + } + } + + /** + * @notice This function is private and called to verify whether the merkle proofs provided for the order hash + * are correct or verify the order hash if the order is not part of a merkle tree. + * @param merkleTree Merkle tree + * @param orderHash Order hash (can be maker bid hash or maker ask hash) + * @param signature Maker order signature + * @param signer Maker address + * @dev It verifies (1) merkle proof (if necessary) (2) signature is from the expected signer + */ + function _verifyMerkleProofOrOrderHash( + OrderStructs.MerkleTree calldata merkleTree, + bytes32 orderHash, + bytes calldata signature, + address signer + ) private view { + uint256 proofLength = merkleTree.proof.length; + + if (proofLength != 0) { + if (proofLength > MAX_CALLDATA_PROOF_LENGTH) { + revert MerkleProofTooLarge(proofLength); + } + + if (!MerkleProofCalldataWithNodes.verifyCalldata(merkleTree.proof, merkleTree.root, orderHash)) { + revert MerkleProofInvalid(); + } + + orderHash = hashBatchOrder(merkleTree.root, proofLength); + } + + _computeDigestAndVerify(orderHash, signature, signer); + } +} diff --git a/contracts/src/marketplace/NonceManager.sol b/contracts/src/marketplace/NonceManager.sol new file mode 100644 index 00000000..d9a94cfc --- /dev/null +++ b/contracts/src/marketplace/NonceManager.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Interfaces and errors +import {INonceManager} from "./interfaces/INonceManager.sol"; +import {LengthsInvalid} from "./errors/SharedErrors.sol"; + +/** + * @title NonceManager + * @notice This contract handles the nonce logic that is used for invalidating maker orders that exist off-chain. + * The nonce logic revolves around three parts at the user level: + * - order nonce (orders sharing an order nonce are conditional, OCO-like) + * - subset (orders can be grouped under a same subset) + * - bid/ask (all orders can be executed only if the bid/ask nonce matches the user's one on-chain) + * Only the order nonce is invalidated at the time of the execution of a maker order that contains it. + * @author LooksRare protocol team (👀,💎) + */ +contract NonceManager is INonceManager { + /** + * @notice Magic value nonce returned if executed (or cancelled). + */ + bytes32 public constant MAGIC_VALUE_ORDER_NONCE_EXECUTED = keccak256("ORDER_NONCE_EXECUTED"); + + /** + * @notice This tracks the bid and ask nonces for a user address. + */ + mapping(address => UserBidAskNonces) public userBidAskNonces; + + /** + * @notice This checks whether the order nonce for a user was executed or cancelled. + */ + mapping(address => mapping(uint256 => bytes32)) public userOrderNonce; + + /** + * @notice This checks whether the subset nonce for a user was cancelled. + */ + mapping(address => mapping(uint256 => bool)) public userSubsetNonce; + + /** + * @notice This function allows a user to cancel an array of order nonces. + * @param orderNonces Array of order nonces + * @dev It does not check the status of the nonces to save gas + * and to prevent revertion if one of the orders is filled in the same + * block. + */ + function cancelOrderNonces(uint256[] calldata orderNonces) external { + uint256 length = orderNonces.length; + if (length == 0) { + revert LengthsInvalid(); + } + + for (uint256 i; i < length;) { + userOrderNonce[msg.sender][orderNonces[i]] = MAGIC_VALUE_ORDER_NONCE_EXECUTED; + unchecked { + ++i; + } + } + + emit OrderNoncesCancelled(msg.sender, orderNonces); + } + + /** + * @notice This function allows a user to cancel an array of subset nonces. + * @param subsetNonces Array of subset nonces + * @dev It does not check the status of the nonces to save gas. + */ + function cancelSubsetNonces(uint256[] calldata subsetNonces) external { + uint256 length = subsetNonces.length; + + if (length == 0) { + revert LengthsInvalid(); + } + + for (uint256 i; i < length;) { + userSubsetNonce[msg.sender][subsetNonces[i]] = true; + unchecked { + ++i; + } + } + + emit SubsetNoncesCancelled(msg.sender, subsetNonces); + } + + /** + * @notice This function increments a user's bid/ask nonces. + * @param bid Whether to increment the user bid nonce + * @param ask Whether to increment the user ask nonce + * @dev The logic for computing the quasi-random number is inspired by Seaport v1.2. + * The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. + * A deterministic increment would make the cancel-all process non-effective in certain cases + * (orders signed with a greater ask/bid nonce). + * The same quasi-random number is used for incrementing both the bid and ask nonces if both values + * are incremented in the same transaction. + * If this function is used twice in the same block, it will return the same quasiRandomNumber + * but this will not impact the overall business logic. + */ + function incrementBidAskNonces(bool bid, bool ask) external { + // Use second half of the previous block hash as a quasi-random number + uint256 quasiRandomNumber = uint256(blockhash(block.number - 1) >> 128); + uint256 newBidNonce = userBidAskNonces[msg.sender].bidNonce; + uint256 newAskNonce = userBidAskNonces[msg.sender].askNonce; + + if (bid) { + newBidNonce += quasiRandomNumber; + userBidAskNonces[msg.sender].bidNonce = newBidNonce; + } + + if (ask) { + newAskNonce += quasiRandomNumber; + userBidAskNonces[msg.sender].askNonce = newAskNonce; + } + + emit NewBidAskNonces(msg.sender, newBidNonce, newAskNonce); + } +} diff --git a/contracts/src/marketplace/ProtocolFeeRecipient.sol b/contracts/src/marketplace/ProtocolFeeRecipient.sol new file mode 100644 index 00000000..4eb12174 --- /dev/null +++ b/contracts/src/marketplace/ProtocolFeeRecipient.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// LooksRare unopinionated libraries +import {LowLevelERC20Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Transfer.sol"; +import {IWETH} from "@looksrare/contracts-libs/contracts/interfaces/generic/IWETH.sol"; +import {IERC20} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC20.sol"; + +/** + * @title ProtocolFeeRecipient + * @notice This contract is used to receive protocol fees and transfer them to the fee sharing setter. + * Fee sharing setter cannot receive ETH directly, so we need to use this contract as a middleman + * to convert ETH into WETH before sending it. + * @author LooksRare protocol team (👀,💎) + */ +contract ProtocolFeeRecipient is LowLevelERC20Transfer { + address public immutable FEE_SHARING_SETTER; + IWETH public immutable WETH; + + error NothingToTransfer(); + + constructor(address _feeSharingSetter, address _weth) { + FEE_SHARING_SETTER = _feeSharingSetter; + WETH = IWETH(_weth); + } + + function transferETH() external { + uint256 ethBalance = address(this).balance; + + if (ethBalance != 0) { + WETH.deposit{value: ethBalance}(); + } + + uint256 wethBalance = IERC20(address(WETH)).balanceOf(address(this)); + + if (wethBalance == 0) { + revert NothingToTransfer(); + } + _executeERC20DirectTransfer(address(WETH), FEE_SHARING_SETTER, wethBalance); + } + + /** + * @param currency ERC20 currency address + */ + function transferERC20(address currency) external { + uint256 balance = IERC20(currency).balanceOf(address(this)); + if (balance == 0) { + revert NothingToTransfer(); + } + _executeERC20DirectTransfer(currency, FEE_SHARING_SETTER, balance); + } + + receive() external payable {} +} diff --git a/contracts/src/marketplace/StrategyManager.sol b/contracts/src/marketplace/StrategyManager.sol new file mode 100644 index 00000000..4edb9d66 --- /dev/null +++ b/contracts/src/marketplace/StrategyManager.sol @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {CurrencyManager} from "./CurrencyManager.sol"; + +// Interfaces +import {IStrategy} from "./interfaces/IStrategy.sol"; +import {IStrategyManager} from "./interfaces/IStrategyManager.sol"; + +/** + * @title StrategyManager + * @notice This contract handles the addition and the update of execution strategies. + * @author LooksRare protocol team (👀,💎) + */ +contract StrategyManager is IStrategyManager, CurrencyManager { + /** + * @notice This variable keeps the count of how many strategies exist. + * It includes strategies that have been removed. + */ + uint256 private _countStrategies = 1; + + /** + * @notice This returns the strategy information for a strategy id. + */ + mapping(uint256 => Strategy) public strategyInfo; + + /** + * @notice Constructor + * @param _owner Owner address + */ + constructor(address _owner) CurrencyManager(_owner) { + strategyInfo[0] = Strategy({ + isActive: true, + standardProtocolFeeBp: 50, + minTotalFeeBp: 50, + maxProtocolFeeBp: 200, + selector: bytes4(0), + isMakerBid: false, + implementation: address(0) + }); + + emit NewStrategy(0, 50, 50, 200, bytes4(0), false, address(0)); + } + + /** + * @notice This function allows the owner to add a new execution strategy to the protocol. + * @param standardProtocolFeeBp Standard protocol fee (in basis point) + * @param minTotalFeeBp Minimum total fee (in basis point) + * @param maxProtocolFeeBp Maximum protocol fee (in basis point) + * @param selector Function selector for the strategy + * @param isMakerBid Whether the function selector is for maker bid + * @param implementation Implementation address + * @dev Strategies have an id that is incremental. + * Only callable by owner. + */ + function addStrategy( + uint16 standardProtocolFeeBp, + uint16 minTotalFeeBp, + uint16 maxProtocolFeeBp, + bytes4 selector, + bool isMakerBid, + address implementation + ) external onlyOwner { + if (minTotalFeeBp > maxProtocolFeeBp || standardProtocolFeeBp > minTotalFeeBp || maxProtocolFeeBp > 500) { + revert StrategyProtocolFeeTooHigh(); + } + + if (selector == bytes4(0)) { + revert StrategyHasNoSelector(); + } + + if (!IStrategy(implementation).isLooksRareV2Strategy()) { + revert NotV2Strategy(); + } + + strategyInfo[_countStrategies] = Strategy({ + isActive: true, + standardProtocolFeeBp: standardProtocolFeeBp, + minTotalFeeBp: minTotalFeeBp, + maxProtocolFeeBp: maxProtocolFeeBp, + selector: selector, + isMakerBid: isMakerBid, + implementation: implementation + }); + + emit NewStrategy( + _countStrategies++, + standardProtocolFeeBp, + minTotalFeeBp, + maxProtocolFeeBp, + selector, + isMakerBid, + implementation + ); + } + + /** + * @notice This function allows the owner to update parameters for an existing execution strategy. + * @param strategyId Strategy id + * @param isActive Whether the strategy must be active + * @param newStandardProtocolFee New standard protocol fee (in basis point) + * @param newMinTotalFee New minimum total fee (in basis point) + * @dev Only callable by owner. + */ + function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) + external + onlyOwner + { + if (strategyId >= _countStrategies) { + revert StrategyNotUsed(); + } + + if (newMinTotalFee > strategyInfo[strategyId].maxProtocolFeeBp || newStandardProtocolFee > newMinTotalFee) { + revert StrategyProtocolFeeTooHigh(); + } + + strategyInfo[strategyId].isActive = isActive; + strategyInfo[strategyId].standardProtocolFeeBp = newStandardProtocolFee; + strategyInfo[strategyId].minTotalFeeBp = newMinTotalFee; + + emit StrategyUpdated(strategyId, isActive, newStandardProtocolFee, newMinTotalFee); + } +} diff --git a/contracts/src/marketplace/TransferManager.sol b/contracts/src/marketplace/TransferManager.sol new file mode 100644 index 00000000..cc1c9578 --- /dev/null +++ b/contracts/src/marketplace/TransferManager.sol @@ -0,0 +1,375 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; +import {LowLevelERC721Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC721Transfer.sol"; +import {LowLevelERC1155Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC1155Transfer.sol"; + +// Interfaces and errors +import {ITransferManager} from "./interfaces/ITransferManager.sol"; +import {AmountInvalid, LengthsInvalid} from "./errors/SharedErrors.sol"; + +// Libraries +import {OrderStructs} from "./libraries/OrderStructs.sol"; + +// Enums +import {CollectionType} from "./enums/CollectionType.sol"; + +/** + * @title TransferManager + * @notice This contract provides the transfer functions for ERC721/ERC1155/Hypercert/Hyperboard for contracts that + * require them. + * Collection type "0" refers to ERC721 transfer functions. + * Collection type "1" refers to ERC1155 transfer functions. + * Collection type "2" refers to Hypercert transfer functions. + * Collection type "3" refers to Hyperboard transfer functions. + * @dev "Safe" transfer functions for ERC721 are not implemented since they come with added gas costs + * to verify if the recipient is a contract as it requires verifying the receiver interface is valid. + * @author LooksRare protocol team (👀,💎) + */ +// TODO Needs to be updated to split a fraction and transfer the new fraction to the bidder +contract TransferManager is ITransferManager, LowLevelERC721Transfer, LowLevelERC1155Transfer, OwnableTwoSteps { + /** + * @notice This returns whether the user has approved the operator address. + * The first address is the user and the second address is the operator (e.g. LooksRareProtocol). + */ + mapping(address => mapping(address => bool)) public hasUserApprovedOperator; + + /** + * @notice This returns whether the operator address is allowed by this contract's owner. + */ + mapping(address => bool) public isOperatorAllowed; + + /** + * @notice Constructor + * @param _owner Owner address + */ + constructor(address _owner) OwnableTwoSteps(_owner) {} + + /** + * @notice This function transfers items for a single ERC721 collection. + * @param collection Collection address + * @param from Sender address + * @param to Recipient address + * @param itemIds Array of itemIds + * @param amounts Array of amounts + */ + function transferItemsERC721( + address collection, + address from, + address to, + uint256[] calldata itemIds, + uint256[] calldata amounts + ) external { + uint256 length = itemIds.length; + if (length == 0) { + revert LengthsInvalid(); + } + + _isOperatorValidForTransfer(from, msg.sender); + + for (uint256 i; i < length;) { + if (amounts[i] != 1) { + revert AmountInvalid(); + } + _executeERC721TransferFrom(collection, from, to, itemIds[i]); + unchecked { + ++i; + } + } + } + + /** + * @notice This function transfers items for a single ERC1155 collection. + * @param collection Collection address + * @param from Sender address + * @param to Recipient address + * @param itemIds Array of itemIds + * @param amounts Array of amounts + * @dev It does not allow batch transferring if from = msg.sender since native function should be used. + */ + function transferItemsERC1155( + address collection, + address from, + address to, + uint256[] calldata itemIds, + uint256[] calldata amounts + ) external { + uint256 length = itemIds.length; + + if (length == 0 || amounts.length != length) { + revert LengthsInvalid(); + } + + _isOperatorValidForTransfer(from, msg.sender); + + if (length == 1) { + if (amounts[0] == 0) { + revert AmountInvalid(); + } + _executeERC1155SafeTransferFrom(collection, from, to, itemIds[0], amounts[0]); + } else { + for (uint256 i; i < length;) { + if (amounts[i] == 0) { + revert AmountInvalid(); + } + + unchecked { + ++i; + } + } + _executeERC1155SafeBatchTransferFrom(collection, from, to, itemIds, amounts); + } + } + + /** + * @notice This function transfers items for a single Hypercert. + * @param collection Collection address + * @param from Sender address + * @param to Recipient address + * @param itemIds Array of itemIds + * @param amounts Array of amounts + * @dev It does not allow batch transferring if from = msg.sender since native function should be used. + */ + function transferItemsHypercert( + address collection, + address from, + address to, + uint256[] calldata itemIds, + uint256[] calldata amounts + ) external { + uint256 length = itemIds.length; + + if (length == 0 || amounts.length != length) { + revert LengthsInvalid(); + } + + _isOperatorValidForTransfer(from, msg.sender); + + if (length == 1) { + if (amounts[0] == 0) { + revert AmountInvalid(); + } + _executeERC1155SafeTransferFrom(collection, from, to, itemIds[0], amounts[0]); + } else { + for (uint256 i; i < length;) { + if (amounts[i] == 0) { + revert AmountInvalid(); + } + + unchecked { + ++i; + } + } + _executeERC1155SafeBatchTransferFrom(collection, from, to, itemIds, amounts); + } + } + + /** + * @notice This function transfers items for a single Hyperboard. + * @param collection Collection address + * @param from Sender address + * @param to Recipient address + * @param itemIds Array of itemIds + * @param amounts Array of amounts + * @dev It does not allow batch transferring if from = msg.sender since native function should be used. + */ + function transferItemsHyperboard( + address collection, + address from, + address to, + uint256[] calldata itemIds, + uint256[] calldata amounts + ) external { + uint256 length = itemIds.length; + + if (length == 0 || amounts.length != length) { + revert LengthsInvalid(); + } + + _isOperatorValidForTransfer(from, msg.sender); + + if (length == 1) { + if (amounts[0] == 0) { + revert AmountInvalid(); + } + _executeERC1155SafeTransferFrom(collection, from, to, itemIds[0], amounts[0]); + } else { + for (uint256 i; i < length;) { + if (amounts[i] == 0) { + revert AmountInvalid(); + } + + unchecked { + ++i; + } + } + _executeERC1155SafeBatchTransferFrom(collection, from, to, itemIds, amounts); + } + } + + /** + * @notice This function transfers items across an array of collections that can be both ERC721 and ERC1155. + * @param items Array of BatchTransferItem + * @param from Sender address + * @param to Recipient address + */ + function transferBatchItemsAcrossCollections(BatchTransferItem[] calldata items, address from, address to) + external + { + uint256 itemsLength = items.length; + + if (itemsLength == 0) { + revert LengthsInvalid(); + } + + if (from != msg.sender) { + _isOperatorValidForTransfer(from, msg.sender); + } + + for (uint256 i; i < itemsLength;) { + uint256[] calldata itemIds = items[i].itemIds; + uint256 itemIdsLengthForSingleCollection = itemIds.length; + uint256[] calldata amounts = items[i].amounts; + + if (itemIdsLengthForSingleCollection == 0 || amounts.length != itemIdsLengthForSingleCollection) { + revert LengthsInvalid(); + } + + CollectionType collectionType = items[i].collectionType; + if (collectionType == CollectionType.ERC721) { + for (uint256 j; j < itemIdsLengthForSingleCollection;) { + if (amounts[j] != 1) { + revert AmountInvalid(); + } + _executeERC721TransferFrom(items[i].collection, from, to, itemIds[j]); + unchecked { + ++j; + } + } + } else if (collectionType == CollectionType.ERC1155) { + for (uint256 j; j < itemIdsLengthForSingleCollection;) { + if (amounts[j] == 0) { + revert AmountInvalid(); + } + + unchecked { + ++j; + } + } + _executeERC1155SafeBatchTransferFrom(items[i].collection, from, to, itemIds, amounts); + } + + unchecked { + ++i; + } + } + } + + /** + * @notice This function allows a user to grant approvals for an array of operators. + * Users cannot grant approvals if the operator is not allowed by this contract's owner. + * @param operators Array of operator addresses + * @dev Each operator address must be globally allowed to be approved. + */ + function grantApprovals(address[] calldata operators) external { + uint256 length = operators.length; + + if (length == 0) { + revert LengthsInvalid(); + } + + for (uint256 i; i < length;) { + address operator = operators[i]; + + if (!isOperatorAllowed[operator]) { + revert OperatorNotAllowed(); + } + + if (hasUserApprovedOperator[msg.sender][operator]) { + revert OperatorAlreadyApprovedByUser(); + } + + hasUserApprovedOperator[msg.sender][operator] = true; + + unchecked { + ++i; + } + } + + emit ApprovalsGranted(msg.sender, operators); + } + + /** + * @notice This function allows a user to revoke existing approvals for an array of operators. + * @param operators Array of operator addresses + * @dev Each operator address must be approved at the user level to be revoked. + */ + function revokeApprovals(address[] calldata operators) external { + uint256 length = operators.length; + if (length == 0) { + revert LengthsInvalid(); + } + + for (uint256 i; i < length;) { + address operator = operators[i]; + + if (!hasUserApprovedOperator[msg.sender][operator]) { + revert OperatorNotApprovedByUser(); + } + + delete hasUserApprovedOperator[msg.sender][operator]; + unchecked { + ++i; + } + } + + emit ApprovalsRemoved(msg.sender, operators); + } + + /** + * @notice This function allows an operator to be added for the shared transfer system. + * Once the operator is allowed, users can grant NFT approvals to this operator. + * @param operator Operator address to allow + * @dev Only callable by owner. + */ + function allowOperator(address operator) external onlyOwner { + if (isOperatorAllowed[operator]) { + revert OperatorAlreadyAllowed(); + } + + isOperatorAllowed[operator] = true; + + emit OperatorAllowed(operator); + } + + /** + * @notice This function allows the user to remove an operator for the shared transfer system. + * @param operator Operator address to remove + * @dev Only callable by owner. + */ + function removeOperator(address operator) external onlyOwner { + if (!isOperatorAllowed[operator]) { + revert OperatorNotAllowed(); + } + + delete isOperatorAllowed[operator]; + + emit OperatorRemoved(operator); + } + + /** + * @notice This function is internal and verifies whether the transfer + * (by an operator on behalf of a user) is valid. If not, it reverts. + * @param user User address + * @param operator Operator address + */ + function _isOperatorValidForTransfer(address user, address operator) private view { + if (isOperatorAllowed[operator] && hasUserApprovedOperator[user][operator]) { + return; + } + + revert TransferCallerInvalid(); + } +} diff --git a/contracts/src/marketplace/TransferSelectorNFT.sol b/contracts/src/marketplace/TransferSelectorNFT.sol new file mode 100644 index 00000000..8b4d201c --- /dev/null +++ b/contracts/src/marketplace/TransferSelectorNFT.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Direct dependencies +import {PackableReentrancyGuard} from "@looksrare/contracts-libs/contracts/PackableReentrancyGuard.sol"; +import {ExecutionManager} from "./ExecutionManager.sol"; +import {TransferManager} from "./TransferManager.sol"; + +// Libraries +import {OrderStructs} from "./libraries/OrderStructs.sol"; + +// Enums +import {CollectionType} from "./enums/CollectionType.sol"; + +/** + * @title TransferSelectorNFT + * @notice This contract handles the logic for transferring non-fungible items. + * @author LooksRare protocol team (👀,💎) + */ +contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { + error UnsupportedCollectionType(); + /** + * @notice Transfer manager for ERC721 and ERC1155. + */ + + TransferManager public immutable transferManager; + + /** + * @notice Constructor + * @param _owner Owner address + * @param _protocolFeeRecipient Protocol fee recipient address + * @param _transferManager Address of the transfer manager for ERC721/ERC1155 + */ + constructor(address _owner, address _protocolFeeRecipient, address _transferManager) + ExecutionManager(_owner, _protocolFeeRecipient) + { + transferManager = TransferManager(_transferManager); + } + + /** + * @notice This function is internal and used to transfer non-fungible tokens. + * @param collection Collection address + * @param collectionType Collection type (e.g. 0 = ERC721, 1 = ERC1155) + * @param sender Sender address + * @param recipient Recipient address + * @param itemIds Array of itemIds + * @param amounts Array of amounts + */ + function _transferNFT( + address collection, + CollectionType collectionType, + address sender, + address recipient, + uint256[] memory itemIds, + uint256[] memory amounts + ) internal { + if (collectionType == CollectionType.ERC721) { + transferManager.transferItemsERC721(collection, sender, recipient, itemIds, amounts); + } else if (collectionType == CollectionType.ERC1155) { + transferManager.transferItemsERC1155(collection, sender, recipient, itemIds, amounts); + } else if (collectionType == CollectionType.Hypercert) { + transferManager.transferItemsERC1155(collection, sender, recipient, itemIds, amounts); + } else if (collectionType == CollectionType.Hyperboard) { + revert UnsupportedCollectionType(); + } + } +} diff --git a/contracts/src/marketplace/constants/AssemblyConstants.sol b/contracts/src/marketplace/constants/AssemblyConstants.sol new file mode 100644 index 00000000..8557dece --- /dev/null +++ b/contracts/src/marketplace/constants/AssemblyConstants.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/* + * @dev error OrderInvalid() + * Memory layout: + * - 0x00: Left-padded selector (data begins at 0x1c) + * Revert buffer is memory[0x1c:0x20] + */ +uint256 constant OrderInvalid_error_selector = 0x2e0c0f71; +uint256 constant OrderInvalid_error_length = 0x04; + +/* + * @dev error CurrencyInvalid() + * Memory layout: + * - 0x00: Left-padded selector (data begins at 0x1c) + * Revert buffer is memory[0x1c:0x20] + */ +uint256 constant CurrencyInvalid_error_selector = 0x4f795487; +uint256 constant CurrencyInvalid_error_length = 0x04; + +/* + * @dev error OutsideOfTimeRange() + * Memory layout: + * - 0x00: Left-padded selector (data begins at 0x1c) + * Revert buffer is memory[0x1c:0x20] + */ +uint256 constant OutsideOfTimeRange_error_selector = 0x7476320f; +uint256 constant OutsideOfTimeRange_error_length = 0x04; + +/* + * @dev error NoSelectorForStrategy() + * Memory layout: + * - 0x00: Left-padded selector (data begins at 0x1c) + * Revert buffer is memory[0x1c:0x20] + */ +uint256 constant NoSelectorForStrategy_error_selector = 0xab984846; +uint256 constant NoSelectorForStrategy_error_length = 0x04; + +uint256 constant Error_selector_offset = 0x1c; + +uint256 constant OneWord = 0x20; diff --git a/contracts/src/marketplace/constants/NumericConstants.sol b/contracts/src/marketplace/constants/NumericConstants.sol new file mode 100644 index 00000000..63029eea --- /dev/null +++ b/contracts/src/marketplace/constants/NumericConstants.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @dev 100% represented in basis point is 10_000. + */ +uint256 constant ONE_HUNDRED_PERCENT_IN_BP = 10_000; + +/** + * @dev The maximum length of a proof for a batch order is 10. + * The maximum merkle tree that can used for signing has a height of + * 2**10 = 1_024. + */ +uint256 constant MAX_CALLDATA_PROOF_LENGTH = 10; diff --git a/contracts/src/marketplace/constants/ValidationCodeConstants.sol b/contracts/src/marketplace/constants/ValidationCodeConstants.sol new file mode 100644 index 00000000..73cbc996 --- /dev/null +++ b/contracts/src/marketplace/constants/ValidationCodeConstants.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * 0. No error + */ + +/** + * @dev The maker order is expected to be valid. + * There can be other reasons that cause makers orders to be + * invalid (e.g. trading restrictions for the protocol, fallbacks). + */ +uint256 constant ORDER_EXPECTED_TO_BE_VALID = 0; + +/** + * 1. Strategy & currency-related codes + */ + +/** + * @dev The currency is not allowed in the protocol. + * This maker order could become valid only with owner action. + * If the order is a maker bid and currency = address(0), it is permanently invalid. + */ +uint256 constant CURRENCY_NOT_ALLOWED = 101; + +/** + * @dev The strategy is not implemented in the protocol. + * This maker order can become valid only with owner action. + */ +uint256 constant STRATEGY_NOT_IMPLEMENTED = 111; + +/** + * @dev The strategy is not for this quote type. + * This maker order can never become valid. + */ +uint256 constant STRATEGY_INVALID_QUOTE_TYPE = 112; + +/** + * @dev The strategy exists but is not currently active. + * This maker order can become valid again only with owner action. + */ +uint256 constant STRATEGY_NOT_ACTIVE = 113; + +/** + * 2. Maker order struct-related codes + */ + +/** + * @dev The maker order is permanently invalid for a standard sale (e.g. invalid collection type or amounts) + * This maker order cannot become valid again. + */ +uint256 constant MAKER_ORDER_INVALID_STANDARD_SALE = 201; + +/** + * @dev The maker order is permanently invalid for a non-standard sale strategy. + * This maker order cannot become valid again. + */ +uint256 constant MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE = 211; + +/** + * @dev The maker order is invalid due to a currency support. + * This maker order may become valid in the future depending on the strategy's currency support. + * Please refer to the strategy's implementation code. + */ +uint256 constant MAKER_ORDER_INVALID_CURRENCY_NON_STANDARD_SALE = 212; + +/** + * @dev The maker order is temporarily invalid due to a strategy-specific reason. + * This maker order may become valid in the future. + * Please refer to the strategy's implementation code. + */ +uint256 constant MAKER_ORDER_TEMPORARILY_INVALID_NON_STANDARD_SALE = 213; + +/** + * 3. Nonce-related codes + */ + +/** + * @dev The signer's subset nonce is cancelled. + * This maker order will not become valid again. + */ +uint256 constant USER_SUBSET_NONCE_CANCELLED = 301; + +/** + * @dev The signer's order nonce is executed or cancelled. + * This maker order will not become valid again. + */ +uint256 constant USER_ORDER_NONCE_EXECUTED_OR_CANCELLED = 311; + +/** + * @dev The signer's order nonce is in partial fill status with an other order hash. + * This maker order will not become valid again. + */ +uint256 constant USER_ORDER_NONCE_IN_EXECUTION_WITH_OTHER_HASH = 312; + +/** + * @dev The signer's global bid nonce is not matching the order's bid nonce. + * This maker order will not become valid again. + */ +uint256 constant INVALID_USER_GLOBAL_BID_NONCE = 321; + +/** + * @dev The signer's global ask nonce is not matching the order's ask nonce. + * This maker order will not become valid again. + */ +uint256 constant INVALID_USER_GLOBAL_ASK_NONCE = 322; + +/** + * 4. Codes related to signatures (EOA, EIP-1271) and merkle tree computations + */ + +/** + * @dev The order hash proof is not in the merkle tree. + * This maker order is not valid with the set of merkle root and proofs. + * It cannot become valid with the current merkle proof and root. + */ +uint256 constant ORDER_HASH_PROOF_NOT_IN_MERKLE_TREE = 401; + +/** + * @dev The merkle proof is too large to be verified according. + * There is a proof's size limit defined in the MerkleProofCalldataWithNodes. + * It cannot become valid with the current merkle proof and root. + */ +uint256 constant MERKLE_PROOF_PROOF_TOO_LARGE = 402; + +/** + * @dev The signature's length is invalid. + * The signature's length must be either 64 or 65 bytes. + * This maker order will never be valid. + */ +uint256 constant INVALID_SIGNATURE_LENGTH = 411; + +/** + * @dev The signature's s parameter is invalid. + * This maker order will never be valid. + */ +uint256 constant INVALID_S_PARAMETER_EOA = 412; + +/** + * @dev The signature's v parameter is invalid. + * It must be either equal to 27 or 28. + * This maker order will never be valid with this signature. + */ +uint256 constant INVALID_V_PARAMETER_EOA = 413; + +/** + * @dev The signer recovered (using ecrecover) is the null address. + * This maker order will never be valid with this signature. + */ +uint256 constant NULL_SIGNER_EOA = 414; + +/** + * @dev The recovered signer is not the target signer. + * This maker order will never be valid with this signature. + */ +uint256 constant INVALID_SIGNER_EOA = 415; + +/** + * @dev The signature is generated by a EIP1271 signer contract but the + * contract does not implement the required function to verify the signature. + */ +uint256 constant MISSING_IS_VALID_SIGNATURE_FUNCTION_EIP1271 = 421; + +/** + * @dev The signature by the EIP1271 signer contract is invalid. + * This maker order may become valid again depending on the implementation of the + * contract signing the order. + */ +uint256 constant SIGNATURE_INVALID_EIP1271 = 422; + +/** + * 5. Timestamp-related codes + */ + +/** + * @dev The start time is greater than the end time. + * This maker order will never be valid. + */ +uint256 constant START_TIME_GREATER_THAN_END_TIME = 501; + +/** + * @dev The block time is greater than the end time. + * This maker order will never be valid. + */ +uint256 constant TOO_LATE_TO_EXECUTE_ORDER = 502; + +/** + * @dev The block time is earlier than the start time. + * A buffer of 5 minutes is included for orders that are about to be valid. + * This maker order will become valid without any user action. + */ +uint256 constant TOO_EARLY_TO_EXECUTE_ORDER = 503; + +/** + * 6. Transfer-related (ERC20, ERC721, ERC1155 tokens), including transfers and approvals, codes. + */ + +/** + * @dev The same itemId is twice in the bundle. + * This maker order can be valid for ERC1155 collections but will never be valid for ERC721. + */ +uint256 constant SAME_ITEM_ID_IN_BUNDLE = 601; + +/** + * @dev The ERC20 balance of the signer (maker bid user) is inferior to the order bid price. + * This maker order can become valid without any user's action. + */ +uint256 constant ERC20_BALANCE_INFERIOR_TO_PRICE = 611; + +/** + * @dev The ERC20 approval amount of the signer (maker bid user) is inferior to the order bid price. + * This maker order can become valid only with the user's action. + */ +uint256 constant ERC20_APPROVAL_INFERIOR_TO_PRICE = 612; + +/** + * @dev The ERC721 itemId does not exist. + * This maker order can become valid if the item is created later. + */ +uint256 constant ERC721_ITEM_ID_DOES_NOT_EXIST = 621; + +/** + * @dev The ERC721 itemId is not owned by the signer (maker ask user). + * This maker order can become valid without any user's action. + */ +uint256 constant ERC721_ITEM_ID_NOT_IN_BALANCE = 622; + +/** + * @dev The transfer manager contract has not been approved by the ERC721 collection + * contract, either for the entire collection or the itemId. + * This maker order can become valid only with the user's action. + * The collection may not follow the ERC721 standard. + */ +uint256 constant ERC721_NO_APPROVAL_FOR_ALL_OR_ITEM_ID = 623; + +/** + * @dev The ERC1155 collection contract does not implement balanceOf. + */ +uint256 constant ERC1155_BALANCE_OF_DOES_NOT_EXIST = 631; + +/** + * @dev The ERC20 balance of the signer (maker ask user) is inferior to the amount + * required to be sold. + * This maker order can become valid without any user's action. + */ +uint256 constant ERC1155_BALANCE_OF_ITEM_ID_INFERIOR_TO_AMOUNT = 632; + +/** + * @dev The ERC1155 collection contract does not implement isApprovedForAll. + * The collection may not follow the ERC1155 standard. + */ +uint256 constant ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST = 633; + +/** + * @dev The transfer manager contract has not been approved by the ERC1155 + * collection contract. + * This maker order can become valid only with the user's action. + */ +uint256 constant ERC1155_NO_APPROVAL_FOR_ALL = 634; + +/** + * 7. Asset-type codes + */ + +/** + * @dev The collection type specified in the order seems incorrect. + * It is expected to be collectionType = 0. + */ +uint256 constant POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC721 = 701; + +/** + * @dev The collection type specified in the order seems incorrect. + * It is expected to be collectionType = 1. + */ +uint256 constant POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155 = 702; + +/** + * 8. Transfer manager-related codes + */ + +/** + * @dev The user has not approved the protocol to transfer NFTs on behalf + * of the user. + * This maker order can become valid only with the user's action. + */ +uint256 constant NO_TRANSFER_MANAGER_APPROVAL_BY_USER_FOR_EXCHANGE = 801; + +/** + * @dev The transfer manager's owner has revoked the ability to transfer NFTs + * on behalf of all users that have also approved the protocol. + * This maker order can become valid again only with owner action. + */ +uint256 constant TRANSFER_MANAGER_APPROVAL_REVOKED_BY_OWNER_FOR_EXCHANGE = 802; + +/** + * 9. Creator fee-related codes + */ + +/** + * @dev The collection contract has a flexible royalty fee structure that + * prevents this bundle to be traded. + * It applies at the protocol level. + * For instance, 2 items in a bundle have different creator recipients. + */ +uint256 constant BUNDLE_ERC2981_NOT_SUPPORTED = 901; + +/** + * @dev The creator fee applied at the protocol is higher than the threshold + * allowed. The transaction will revert. + * It applies at the protocol level. + * This maker order can become valid only with the creator's action. + */ +uint256 constant CREATOR_FEE_TOO_HIGH = 902; diff --git a/contracts/src/marketplace/enums/CollectionType.sol b/contracts/src/marketplace/enums/CollectionType.sol new file mode 100644 index 00000000..d95a2dc7 --- /dev/null +++ b/contracts/src/marketplace/enums/CollectionType.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @notice CollectionType is used in OrderStructs.Maker's collectionType to determine the collection type being traded. + */ +//TODO remove 721??? +enum CollectionType { + ERC721, + ERC1155, + Hypercert, + Hyperboard +} diff --git a/contracts/src/marketplace/enums/QuoteType.sol b/contracts/src/marketplace/enums/QuoteType.sol new file mode 100644 index 00000000..2cb766d7 --- /dev/null +++ b/contracts/src/marketplace/enums/QuoteType.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @notice QuoteType is used in OrderStructs.Maker's quoteType to determine whether the maker order is a bid or an ask. + */ +enum QuoteType { + Bid, + Ask +} diff --git a/contracts/src/marketplace/errors/ChainlinkErrors.sol b/contracts/src/marketplace/errors/ChainlinkErrors.sol new file mode 100644 index 00000000..bb21b470 --- /dev/null +++ b/contracts/src/marketplace/errors/ChainlinkErrors.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @notice It is returned if the Chainlink price is invalid (e.g. negative). + */ +error ChainlinkPriceInvalid(); + +/** + * @notice It is returned if the decimals from the NFT floor price feed is invalid. + * Chainlink price feeds are expected to have 18 decimals. + * @dev It can only be returned for owner operations. + */ +error DecimalsInvalid(); + +/** + * @notice It is returned if the fixed discount for a maker bid is greater than floor price. + */ +error DiscountGreaterThanFloorPrice(); + +/** + * @notice It is returned if the latency tolerance is set too high (i.e. greater than 3,600 sec). + */ +error LatencyToleranceTooHigh(); + +/** + * @notice It is returned if the price feed for a collection is already set. + * @dev It can only be returned for owner operations. + */ +error PriceFeedAlreadySet(); + +/** + * @notice It is returned when the price feed is not available. + */ +error PriceFeedNotAvailable(); + +/** + * @notice It is returned if the current block time relative to the latest price's update time + * is greater than the latency tolerance. + */ +error PriceNotRecentEnough(); diff --git a/contracts/src/marketplace/errors/SharedErrors.sol b/contracts/src/marketplace/errors/SharedErrors.sol new file mode 100644 index 00000000..bb123902 --- /dev/null +++ b/contracts/src/marketplace/errors/SharedErrors.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @notice It is returned if the amount is invalid. + * For ERC721, any number that is not 1. For ERC1155, if amount is 0. + */ +error AmountInvalid(); + +/** + * @notice It is returned if the ask price is too high for the bid user. + */ +error AskTooHigh(); + +/** + * @notice It is returned if the bid price is too low for the ask user. + */ +error BidTooLow(); + +/** + * @notice It is returned if the function cannot be called by the sender. + */ +error CallerInvalid(); + +/** + * @notice It is returned if the currency is invalid. + */ +error CurrencyInvalid(); + +/** + * @notice The function selector is invalid for this strategy implementation. + */ +error FunctionSelectorInvalid(); + +/** + * @notice It is returned if there is either a mismatch or an error in the length of the array(s). + */ +error LengthsInvalid(); + +/** + * @notice It is returned if the merkle proof provided is invalid. + */ +error MerkleProofInvalid(); + +/** + * @notice It is returned if the length of the merkle proof provided is greater than tolerated. + * @param length Proof length + */ +error MerkleProofTooLarge(uint256 length); + +/** + * @notice It is emitted if the call recipient is not a contract. + */ +error NotAContract(); + +/** + * @notice It is returned if the order is permanently invalid. + * There may be an issue with the order formatting. + */ +error OrderInvalid(); + +/** + * @notice It is returned if the maker quote type is invalid. + */ +error QuoteTypeInvalid(); diff --git a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol new file mode 100644 index 00000000..9d0bec3c --- /dev/null +++ b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Interfaces +import {IStrategy} from "../interfaces/IStrategy.sol"; + +// Assembly constants +import {OrderInvalid_error_selector} from "../constants/AssemblyConstants.sol"; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; + +// Enums +import {CollectionType} from "../enums/CollectionType.sol"; + +/** + * @title BaseStrategy + * @author LooksRare protocol team (👀,💎) + */ +abstract contract BaseStrategy is IStrategy { + /** + * @inheritdoc IStrategy + */ + function isLooksRareV2Strategy() external pure override returns (bool) { + return true; + } + + /** + * @dev This is equivalent to + * if (amount == 0 || (amount != 1 && collectionType == 0)) { + * return (0, OrderInvalid.selector); + * } + * @dev OrderInvalid_error_selector is a left-padded 4 bytes. If the error selector is returned + * instead of reverting, the error selector needs to be right-padded by + * 28 bytes. Therefore it needs to be left shifted by 28 x 8 = 224 bits. + */ + function _validateAmountNoRevert(uint256 amount, CollectionType collectionType) internal pure { + assembly { + if or(iszero(amount), and(xor(amount, 1), iszero(collectionType))) { + mstore(0x00, 0x00) + mstore(0x20, shl(224, OrderInvalid_error_selector)) + return(0, 0x40) + } + } + } +} diff --git a/contracts/src/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.sol b/contracts/src/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.sol new file mode 100644 index 00000000..09cb3dc3 --- /dev/null +++ b/contracts/src/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; + +/** + * @title BaseStrategyChainlinkPriceLatency + * @notice This contract allows the owner to define the maximum acceptable Chainlink price latency. + * @author LooksRare protocol team (👀,💎) + */ +contract BaseStrategyChainlinkPriceLatency is OwnableTwoSteps { + /** + * @notice Maximum latency accepted after which + * the execution strategy rejects the retrieved price. + * + * For ETH, it cannot be higher than 3,600 as Chainlink will at least update the + * price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. + * + * For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the + * price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + */ + uint256 public immutable maxLatency; + + /** + * @notice Constructor + * @param _owner Owner address + * @param _maxLatency Maximum price latency allowed + */ + constructor(address _owner, uint256 _maxLatency) OwnableTwoSteps(_owner) { + maxLatency = _maxLatency; + } +} diff --git a/contracts/src/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.sol b/contracts/src/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.sol new file mode 100644 index 00000000..137c1e86 --- /dev/null +++ b/contracts/src/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.sol @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "../../libraries/OrderStructs.sol"; +import {CurrencyValidator} from "../../libraries/CurrencyValidator.sol"; + +// Interfaces +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; + +// Enums +import {QuoteType} from "../../enums/QuoteType.sol"; + +// Shared errors +import { + BidTooLow, + OrderInvalid, + CurrencyInvalid, + FunctionSelectorInvalid, + QuoteTypeInvalid +} from "../../errors/SharedErrors.sol"; +import {ChainlinkPriceInvalid, PriceFeedNotAvailable, PriceNotRecentEnough} from "../../errors/ChainlinkErrors.sol"; + +// Base strategy contracts +import {BaseStrategy, IStrategy} from "../BaseStrategy.sol"; +import {BaseStrategyChainlinkPriceLatency} from "./BaseStrategyChainlinkPriceLatency.sol"; + +/** + * @title StrategyChainlinkUSDDynamicAsk + * @notice This contract allows a seller to sell an NFT priced in USD and the receivable amount to be in ETH. + * @author LooksRare protocol team (👀,💎) + */ +contract StrategyChainlinkUSDDynamicAsk is BaseStrategy, BaseStrategyChainlinkPriceLatency { + /** + * @dev It is possible to call priceFeed.decimals() to get the decimals, + * but to save gas, it is hard coded instead. + */ + uint256 public constant ETH_USD_PRICE_FEED_DECIMALS = 1e8; + + /** + * @notice Wrapped ether (WETH) address. + */ + address public immutable WETH; + + /** + * @notice ETH/USD Chainlink price feed + */ + AggregatorV3Interface public immutable priceFeed; + + /** + * @notice Constructor + * @param _weth Wrapped ether address + * @param _owner Owner address + * @param _priceFeed Address of the ETH/USD price feed + */ + constructor(address _owner, address _weth, address _priceFeed) BaseStrategyChainlinkPriceLatency(_owner, 3600) { + WETH = _weth; + priceFeed = AggregatorV3Interface(_priceFeed); + } + + /** + * @notice This function validates the order under the context of the chosen strategy + * and returns the fulfillable items/amounts/price/nonce invalidation status. + * This strategy looks at the seller's desired sale price in USD and minimum sale price in ETH, + * converts the USD value into ETH using Chainlink's price feed and chooses the higher price. + * @param takerBid Taker bid struct (taker bid-specific parameters for the execution) + * @param makerAsk Maker ask struct (maker ask-specific parameters for the execution) + * @dev The client has to provide the seller's desired sale price in USD as the additionalParameters + */ + function executeStrategyWithTakerBid(OrderStructs.Taker calldata takerBid, OrderStructs.Maker calldata makerAsk) + external + view + returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) + { + uint256 itemIdsLength = makerAsk.itemIds.length; + + if (itemIdsLength == 0 || itemIdsLength != makerAsk.amounts.length) { + revert OrderInvalid(); + } + + CurrencyValidator.allowNativeOrAllowedCurrency(makerAsk.currency, WETH); + + (, int256 answer,, uint256 updatedAt,) = priceFeed.latestRoundData(); + + if (answer <= 0) { + revert ChainlinkPriceInvalid(); + } + + if (block.timestamp - updatedAt > maxLatency) { + revert PriceNotRecentEnough(); + } + + // The client has to provide a USD value that is augmented by 1e18. + uint256 desiredSalePriceInUSD = abi.decode(makerAsk.additionalParameters, (uint256)); + + uint256 ethPriceInUSD = uint256(answer); + uint256 minPriceInETH = makerAsk.price; + uint256 desiredSalePriceInETH = (desiredSalePriceInUSD * ETH_USD_PRICE_FEED_DECIMALS) / ethPriceInUSD; + + if (minPriceInETH >= desiredSalePriceInETH) { + price = minPriceInETH; + } else { + price = desiredSalePriceInETH; + } + + uint256 maxPrice = abi.decode(takerBid.additionalParameters, (uint256)); + if (maxPrice < price) { + revert BidTooLow(); + } + + itemIds = makerAsk.itemIds; + amounts = makerAsk.amounts; + isNonceInvalidated = true; + } + + /** + * @inheritdoc IStrategy + */ + function isMakerOrderValid(OrderStructs.Maker calldata makerAsk, bytes4 functionSelector) + external + view + override + returns (bool isValid, bytes4 errorSelector) + { + if (functionSelector != StrategyChainlinkUSDDynamicAsk.executeStrategyWithTakerBid.selector) { + return (isValid, FunctionSelectorInvalid.selector); + } + + if (makerAsk.quoteType != QuoteType.Ask) { + return (isValid, QuoteTypeInvalid.selector); + } + + uint256 itemIdsLength = makerAsk.itemIds.length; + + if (itemIdsLength == 0 || itemIdsLength != makerAsk.amounts.length) { + return (isValid, OrderInvalid.selector); + } + + for (uint256 i; i < itemIdsLength;) { + _validateAmountNoRevert(makerAsk.amounts[i], makerAsk.collectionType); + unchecked { + ++i; + } + } + + if (makerAsk.currency != address(0)) { + if (makerAsk.currency != WETH) { + return (isValid, CurrencyInvalid.selector); + } + } + + (, int256 answer,, uint256 updatedAt,) = priceFeed.latestRoundData(); + + if (answer <= 0) { + return (isValid, ChainlinkPriceInvalid.selector); + } + + if (block.timestamp - updatedAt > maxLatency) { + return (isValid, PriceNotRecentEnough.selector); + } + + isValid = true; + } +} diff --git a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol new file mode 100644 index 00000000..9f0d04bf --- /dev/null +++ b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; + +// OpenZeppelin's library for verifying Merkle proofs +import {MerkleProofMemory} from "../libraries/OpenZeppelin/MerkleProofMemory.sol"; + +// Enums +import {QuoteType} from "../enums/QuoteType.sol"; + +// Shared errors +import {OrderInvalid, FunctionSelectorInvalid, MerkleProofInvalid, QuoteTypeInvalid} from "../errors/SharedErrors.sol"; + +// Base strategy contracts +import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; + +/** + * @title StrategyCollectionOffer + * @notice This contract offers execution strategies for users to create maker bid offers for items in a collection. + * There are two available functions: + * 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection + * 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria. + * @notice The bidder can only bid on 1 item id at a time. + * 1. If ERC721, the amount must be 1. + * 2. If ERC1155, the amount can be greater than 1. + * @dev Use cases can include trait-based offers or rarity score offers. + * @author LooksRare protocol team (👀,💎) + */ +// TODO This allows for a buyer to declare a set of items they're willing to buy in a merkle tree +contract StrategyCollectionOffer is BaseStrategy { + /** + * @notice This function validates the order under the context of the chosen strategy and + * returns the fulfillable items/amounts/price/nonce invalidation status. + * This strategy executes a collection offer against a taker ask order without the need of merkle proofs. + * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) + * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) + */ + function executeCollectionStrategyWithTakerAsk( + OrderStructs.Taker calldata takerAsk, + OrderStructs.Maker calldata makerBid + ) + external + pure + returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) + { + price = makerBid.price; + amounts = makerBid.amounts; + + // A collection order can only be executable for 1 itemId but quantity to fill can vary + if (amounts.length != 1) { + revert OrderInvalid(); + } + + uint256 offeredItemId = abi.decode(takerAsk.additionalParameters, (uint256)); + itemIds = new uint256[](1); + itemIds[0] = offeredItemId; + isNonceInvalidated = true; + } + + /** + * @notice This function validates the order under the context of the chosen strategy + * and returns the fulfillable items/amounts/price/nonce invalidation status. + * This strategy executes a collection offer against a taker ask order with the need of a merkle proof. + * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) + * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) + * @dev The transaction reverts if the maker does not include a merkle root in the additionalParameters. + */ + function executeCollectionStrategyWithTakerAskWithProof( + OrderStructs.Taker calldata takerAsk, + OrderStructs.Maker calldata makerBid + ) + external + pure + returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) + { + price = makerBid.price; + amounts = makerBid.amounts; + + // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary + if (amounts.length != 1) { + revert OrderInvalid(); + } + + (uint256 offeredItemId, bytes32[] memory proof) = + abi.decode(takerAsk.additionalParameters, (uint256, bytes32[])); + itemIds = new uint256[](1); + itemIds[0] = offeredItemId; + isNonceInvalidated = true; + + bytes32 root = abi.decode(makerBid.additionalParameters, (bytes32)); + bytes32 node = keccak256(abi.encodePacked(offeredItemId)); + + // Verify the merkle root for the given merkle proof + if (!MerkleProofMemory.verify(proof, root, node)) { + revert MerkleProofInvalid(); + } + } + + /** + * @inheritdoc IStrategy + */ + function isMakerOrderValid(OrderStructs.Maker calldata makerBid, bytes4 functionSelector) + external + pure + override + returns (bool isValid, bytes4 errorSelector) + { + if ( + functionSelector != StrategyCollectionOffer.executeCollectionStrategyWithTakerAskWithProof.selector + && functionSelector != StrategyCollectionOffer.executeCollectionStrategyWithTakerAsk.selector + ) { + return (isValid, FunctionSelectorInvalid.selector); + } + + if (makerBid.quoteType != QuoteType.Bid) { + return (isValid, QuoteTypeInvalid.selector); + } + + if (makerBid.amounts.length != 1) { + return (isValid, OrderInvalid.selector); + } + + _validateAmountNoRevert(makerBid.amounts[0], makerBid.collectionType); + + // If no root is provided or invalid length, it should be invalid. + // @dev It does not mean the merkle root is valid against a specific itemId that exists in the collection. + if ( + functionSelector == StrategyCollectionOffer.executeCollectionStrategyWithTakerAskWithProof.selector + && makerBid.additionalParameters.length != 32 + ) { + return (isValid, OrderInvalid.selector); + } + + isValid = true; + } +} diff --git a/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol b/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol new file mode 100644 index 00000000..3c4fcf27 --- /dev/null +++ b/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; + +// Enums +import {QuoteType} from "../enums/QuoteType.sol"; + +// Shared errors +import {BidTooLow, OrderInvalid, FunctionSelectorInvalid, QuoteTypeInvalid} from "../errors/SharedErrors.sol"; + +// Base strategy contracts +import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; + +/** + * @title StrategyDutchAuction + * @notice This contract offers a single execution strategy for users to create Dutch auctions. + * @author LooksRare protocol team (👀,💎) + */ +contract StrategyDutchAuction is BaseStrategy { + /** + * @notice This function validates the order under the context of the chosen strategy + * and returns the fulfillable items/amounts/price/nonce invalidation status. + * The execution price set by the seller decreases linearly within the defined period. + * @param takerBid Taker bid struct (taker ask-specific parameters for the execution) + * @param makerAsk Maker ask struct (maker bid-specific parameters for the execution) + * @dev The client has to provide the seller's desired initial start price as the additionalParameters. + */ + function executeStrategyWithTakerBid(OrderStructs.Taker calldata takerBid, OrderStructs.Maker calldata makerAsk) + external + view + returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) + { + uint256 itemIdsLength = makerAsk.itemIds.length; + + if (itemIdsLength == 0 || itemIdsLength != makerAsk.amounts.length) { + revert OrderInvalid(); + } + + uint256 startPrice = abi.decode(makerAsk.additionalParameters, (uint256)); + + if (startPrice < makerAsk.price) { + revert OrderInvalid(); + } + + uint256 startTime = makerAsk.startTime; + uint256 endTime = makerAsk.endTime; + + price = ((endTime - block.timestamp) * startPrice + (block.timestamp - startTime) * makerAsk.price) + / (endTime - startTime); + + uint256 maxPrice = abi.decode(takerBid.additionalParameters, (uint256)); + if (maxPrice < price) { + revert BidTooLow(); + } + + isNonceInvalidated = true; + + itemIds = makerAsk.itemIds; + amounts = makerAsk.amounts; + } + + /** + * @inheritdoc IStrategy + */ + function isMakerOrderValid(OrderStructs.Maker calldata makerAsk, bytes4 functionSelector) + external + pure + override + returns (bool isValid, bytes4 errorSelector) + { + if (functionSelector != StrategyDutchAuction.executeStrategyWithTakerBid.selector) { + return (isValid, FunctionSelectorInvalid.selector); + } + + if (makerAsk.quoteType != QuoteType.Ask) { + return (isValid, QuoteTypeInvalid.selector); + } + + uint256 itemIdsLength = makerAsk.itemIds.length; + + if (itemIdsLength == 0 || itemIdsLength != makerAsk.amounts.length) { + return (isValid, OrderInvalid.selector); + } + + for (uint256 i; i < itemIdsLength;) { + _validateAmountNoRevert(makerAsk.amounts[i], makerAsk.collectionType); + unchecked { + ++i; + } + } + + uint256 startPrice = abi.decode(makerAsk.additionalParameters, (uint256)); + + if (startPrice < makerAsk.price) { + return (isValid, OrderInvalid.selector); + } + + isValid = true; + } +} diff --git a/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol b/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol new file mode 100644 index 00000000..96470011 --- /dev/null +++ b/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; + +// Enums +import {QuoteType} from "../enums/QuoteType.sol"; + +// Shared errors +import {OrderInvalid, FunctionSelectorInvalid, QuoteTypeInvalid} from "../errors/SharedErrors.sol"; + +// Base strategy contracts +import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; + +/** + * @title StrategyItemIdsRange + * @notice This contract offers a single execution strategy for users to bid on + * a specific amount of items in a range bounded by 2 item ids. + * @author LooksRare protocol team (👀,💎) + */ +// TODO this enables bidding on all fractions belonging to a claimID +contract StrategyItemIdsRange is BaseStrategy { + /** + * @notice This function validates the order under the context of the chosen strategy + * and returns the fulfillable items/amounts/price/nonce invalidation status. + * With this strategy, the bidder picks a item id range (e.g. 1-100) + * and a seller can fulfill the order with any tokens within the specified id range. + * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) + * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) + */ + function executeStrategyWithTakerAsk(OrderStructs.Taker calldata takerAsk, OrderStructs.Maker calldata makerBid) + external + pure + returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) + { + (itemIds, amounts) = abi.decode(takerAsk.additionalParameters, (uint256[], uint256[])); + uint256 length = itemIds.length; + if (length != amounts.length) { + revert OrderInvalid(); + } + + (uint256 minItemId, uint256 maxItemId, uint256 desiredAmount) = + abi.decode(makerBid.additionalParameters, (uint256, uint256, uint256)); + + if (minItemId >= maxItemId || desiredAmount == 0) { + revert OrderInvalid(); + } + + uint256 totalOfferedAmount; + uint256 lastItemId; + + for (uint256 i; i < length;) { + uint256 offeredItemId = itemIds[i]; + // Force the client to sort the item ids in ascending order, + // in order to prevent taker ask from providing duplicated + // item ids + if (offeredItemId <= lastItemId) { + if (i != 0) { + revert OrderInvalid(); + } + } + + if (offeredItemId < minItemId || offeredItemId > maxItemId) { + revert OrderInvalid(); + } + + totalOfferedAmount += amounts[i]; + + lastItemId = offeredItemId; + + unchecked { + ++i; + } + } + + if (totalOfferedAmount != desiredAmount) { + revert OrderInvalid(); + } + + price = makerBid.price; + isNonceInvalidated = true; + } + + /** + * @inheritdoc IStrategy + */ + function isMakerOrderValid(OrderStructs.Maker calldata makerBid, bytes4 functionSelector) + external + pure + override + returns (bool isValid, bytes4 errorSelector) + { + if (functionSelector != StrategyItemIdsRange.executeStrategyWithTakerAsk.selector) { + return (isValid, FunctionSelectorInvalid.selector); + } + + if (makerBid.quoteType != QuoteType.Bid) { + return (isValid, QuoteTypeInvalid.selector); + } + + (uint256 minItemId, uint256 maxItemId, uint256 desiredAmount) = + abi.decode(makerBid.additionalParameters, (uint256, uint256, uint256)); + + if (minItemId >= maxItemId || desiredAmount == 0) { + return (isValid, OrderInvalid.selector); + } + + isValid = true; + } +} diff --git a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol new file mode 100644 index 00000000..808a8386 --- /dev/null +++ b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol @@ -0,0 +1,845 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {IERC165} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC165.sol"; +import {IERC20} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC20.sol"; +import {IERC721} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC721.sol"; +import {IERC1155} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC1155.sol"; +import {IERC1271} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC1271.sol"; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; +import {MerkleProofCalldataWithNodes} from "../libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol"; + +// Interfaces +import {ICreatorFeeManager} from "../interfaces/ICreatorFeeManager.sol"; +import {IStrategy} from "../interfaces/IStrategy.sol"; +import {IRoyaltyFeeRegistry} from "../interfaces/IRoyaltyFeeRegistry.sol"; + +// Shared errors +import {OrderInvalid} from "../errors/SharedErrors.sol"; + +// Other dependencies +import {LooksRareProtocol} from "../LooksRareProtocol.sol"; +import {TransferManager} from "../TransferManager.sol"; + +// Constants +import "../constants/ValidationCodeConstants.sol"; +import {MAX_CALLDATA_PROOF_LENGTH, ONE_HUNDRED_PERCENT_IN_BP} from "../constants/NumericConstants.sol"; + +// Enums +import {CollectionType} from "../enums/CollectionType.sol"; +import {QuoteType} from "../enums/QuoteType.sol"; + +/** + * @title OrderValidatorV2A + * @notice This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). + * It performs checks for: + * 1. Protocol allowlist issues (i.e. currency or strategy not allowed) + * 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) + * 3. Nonce related issues (e.g., nonce executed or cancelled) + * 4. Signature related issues and merkle tree parameters + * 5. Timestamp related issues (e.g., order expired) + * 6. Asset-related issues for ERC20/ERC721/ERC1155 (approvals and balances) + * 7. Collection-type suggestions + * 8. Transfer manager related issues + * 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) + * @dev This version does not handle strategies with partial fills. + * @author LooksRare protocol team (👀,💎) + */ +//TODO this might need hypercerts specific changes like checking on amount of units in a fraction +contract OrderValidatorV2A { + using OrderStructs for OrderStructs.Maker; + + /** + * @notice ERC721 potential interfaceId. + */ + bytes4 public constant ERC721_INTERFACE_ID_1 = 0x5b5e139f; + + /** + * @notice ERC721 potential interfaceId. + */ + bytes4 public constant ERC721_INTERFACE_ID_2 = 0x80ac58cd; + + /** + * @notice ERC1155 interfaceId. + */ + bytes4 public constant ERC1155_INTERFACE_ID = 0xd9b67a26; + + /** + * @notice Magic value nonce returned if executed (or cancelled). + */ + bytes32 public constant MAGIC_VALUE_ORDER_NONCE_EXECUTED = keccak256("ORDER_NONCE_EXECUTED"); + + /** + * @notice Number of distinct criteria groups checked to evaluate the validity of an order. + */ + uint256 public constant CRITERIA_GROUPS = 9; + + /** + * @notice LooksRareProtocol domain separator. + */ + bytes32 public domainSeparator; + + /** + * @notice Maximum creator fee (in basis point). + */ + uint256 public maxCreatorFeeBp; + + /** + * @notice CreatorFeeManager. + */ + ICreatorFeeManager public creatorFeeManager; + + /** + * @notice LooksRareProtocol. + */ + LooksRareProtocol public looksRareProtocol; + + /** + * @notice TransferManager + */ + TransferManager public transferManager; + + /** + * @notice Constructor + * @param _looksRareProtocol LooksRare protocol address + * @dev It derives automatically other external variables such as the creator fee manager and domain separator. + */ + constructor(address _looksRareProtocol) { + looksRareProtocol = LooksRareProtocol(_looksRareProtocol); + transferManager = looksRareProtocol.transferManager(); + + _deriveProtocolParameters(); + } + + /** + * @notice Derive protocol parameters. Anyone can call this function. + * @dev It allows adjusting if the domain separator or creator fee manager address were to change. + */ + function deriveProtocolParameters() external { + _deriveProtocolParameters(); + } + + /** + * @notice This function verifies the validity of an array of maker orders. + * @param makerOrders Array of maker orders + * @param signatures Array of signatures + * @param merkleTrees Array of merkle trees + * @return validationCodes Arrays of validation codes + */ + function checkMultipleMakerOrderValidities( + OrderStructs.Maker[] calldata makerOrders, + bytes[] calldata signatures, + OrderStructs.MerkleTree[] calldata merkleTrees + ) external view returns (uint256[9][] memory validationCodes) { + uint256 length = makerOrders.length; + + validationCodes = new uint256[CRITERIA_GROUPS][](length); + + for (uint256 i; i < length;) { + validationCodes[i] = checkMakerOrderValidity(makerOrders[i], signatures[i], merkleTrees[i]); + unchecked { + ++i; + } + } + } + + /** + * @notice This function verifies the validity of a maker order. + * @param makerOrder Maker struct + * @param signature Signature + * @param merkleTree Merkle tree + * @return validationCodes Array of validation codes + */ + function checkMakerOrderValidity( + OrderStructs.Maker calldata makerOrder, + bytes calldata signature, + OrderStructs.MerkleTree calldata merkleTree + ) public view returns (uint256[9] memory validationCodes) { + bytes32 orderHash = makerOrder.hash(); + + validationCodes[0] = + _checkValidityCurrencyAndStrategy(makerOrder.quoteType, makerOrder.currency, makerOrder.strategyId); + + // It will exit here if the strategy does not exist. + // However, if the strategy is implemented but invalid (except if wrong quote type), + // it can continue the validation process. + if (validationCodes[0] == STRATEGY_NOT_IMPLEMENTED || validationCodes[0] == STRATEGY_INVALID_QUOTE_TYPE) { + return validationCodes; + } + + uint256 validationCode1; + uint256[] memory itemIds; + uint256[] memory amounts; + uint256 price; + + if (makerOrder.quoteType == QuoteType.Ask) { + (validationCode1, itemIds, amounts, price) = _checkValidityMakerAskItemIdsAndAmountsAndPrice(makerOrder); + } else { + (validationCode1, itemIds,, price) = _checkValidityMakerBidItemIdsAndAmountsAndPrice(makerOrder); + } + + validationCodes[1] = validationCode1; + + validationCodes[2] = _checkValidityNonces( + makerOrder.quoteType, + makerOrder.signer, + makerOrder.globalNonce, + makerOrder.orderNonce, + makerOrder.subsetNonce, + orderHash + ); + + validationCodes[3] = _checkValidityMerkleProofAndOrderHash(merkleTree, orderHash, signature, makerOrder.signer); + validationCodes[4] = _checkValidityTimestamps(makerOrder.startTime, makerOrder.endTime); + + validationCodes[3] = _checkValidityMerkleProofAndOrderHash(merkleTree, orderHash, signature, makerOrder.signer); + validationCodes[4] = _checkValidityTimestamps(makerOrder.startTime, makerOrder.endTime); + + if (makerOrder.quoteType == QuoteType.Bid) { + validationCodes[5] = _checkValidityMakerBidERC20Assets(makerOrder.currency, makerOrder.signer, price); + } else { + validationCodes[5] = _checkValidityMakerAskNFTAssets( + makerOrder.collection, makerOrder.collectionType, makerOrder.signer, itemIds, amounts + ); + } + + validationCodes[6] = _checkIfPotentialInvalidCollectionTypes(makerOrder.collection, makerOrder.collectionType); + + if (makerOrder.quoteType == QuoteType.Bid) { + validationCodes[7] = ORDER_EXPECTED_TO_BE_VALID; + } else { + validationCodes[7] = _checkValidityTransferManagerApprovals(makerOrder.signer); + } + + validationCodes[8] = _checkValidityCreatorFee(makerOrder.collection, price, itemIds); + } + + /** + * @notice This function is private and is used to adjust the protocol parameters. + */ + function _deriveProtocolParameters() private { + domainSeparator = looksRareProtocol.domainSeparator(); + creatorFeeManager = looksRareProtocol.creatorFeeManager(); + maxCreatorFeeBp = looksRareProtocol.maxCreatorFeeBp(); + } + + /** + * @notice This function is private and verifies the validity of nonces for maker order. + * @param makerSigner Address of the maker signer + * @param globalNonce Global nonce + * @param orderNonce Order nonce + * @param subsetNonce Subset nonce + * @param orderHash Order hash + * @return validationCode Validation code + */ + function _checkValidityNonces( + QuoteType quoteType, + address makerSigner, + uint256 globalNonce, + uint256 orderNonce, + uint256 subsetNonce, + bytes32 orderHash + ) private view returns (uint256 validationCode) { + // 1. Check subset nonce + if (looksRareProtocol.userSubsetNonce(makerSigner, subsetNonce)) { + return USER_SUBSET_NONCE_CANCELLED; + } + + // 2. Check order nonce + bytes32 orderNonceStatus = looksRareProtocol.userOrderNonce(makerSigner, orderNonce); + + if (orderNonceStatus == MAGIC_VALUE_ORDER_NONCE_EXECUTED) { + return USER_ORDER_NONCE_EXECUTED_OR_CANCELLED; + } + + if (orderNonceStatus != bytes32(0) && orderNonceStatus != orderHash) { + return USER_ORDER_NONCE_IN_EXECUTION_WITH_OTHER_HASH; + } + + // 3. Check global nonces + (uint256 globalBidNonce, uint256 globalAskNonce) = looksRareProtocol.userBidAskNonces(makerSigner); + + if (quoteType == QuoteType.Bid && globalNonce != globalBidNonce) { + return INVALID_USER_GLOBAL_BID_NONCE; + } + if (quoteType == QuoteType.Ask && globalNonce != globalAskNonce) { + return INVALID_USER_GLOBAL_ASK_NONCE; + } + } + + /** + * @notice This function is private and verifies the validity of the currency and strategy. + * @param quoteType Quote type + * @param currency Address of the currency + * @param strategyId Strategy id + * @return validationCode Validation code + */ + function _checkValidityCurrencyAndStrategy(QuoteType quoteType, address currency, uint256 strategyId) + private + view + returns (uint256 validationCode) + { + // 1. Verify whether the currency is allowed + if (!looksRareProtocol.isCurrencyAllowed(currency)) { + return CURRENCY_NOT_ALLOWED; + } + + if (currency == address(0) && quoteType == QuoteType.Bid) { + return CURRENCY_NOT_ALLOWED; + } + + // 2. Verify whether the strategy is valid + (bool strategyIsActive,,,,, bool strategyIsMakerBid, address strategyImplementation) = + looksRareProtocol.strategyInfo(strategyId); + + if (strategyId != 0 && strategyImplementation == address(0)) { + return STRATEGY_NOT_IMPLEMENTED; + } + + if (strategyId != 0) { + if ( + (strategyIsMakerBid && quoteType != QuoteType.Bid) + || (!strategyIsMakerBid && quoteType != QuoteType.Ask) + ) { + return STRATEGY_INVALID_QUOTE_TYPE; + } + } + + if (!strategyIsActive) { + return STRATEGY_NOT_ACTIVE; + } + } + + /** + * @notice This function verifies the validity for order timestamps. + * @param startTime Start time + * @param endTime End time + * @return validationCode Validation code + */ + function _checkValidityTimestamps(uint256 startTime, uint256 endTime) + private + view + returns (uint256 validationCode) + { + // @dev It is possible for startTime to be equal to endTime. + // If so, the execution only succeeds when the startTime = endTime = block.timestamp. + // For order invalidation, if the call succeeds, it is already too late for later execution since the + // next block will have a greater timestamp than the current one. + if (startTime >= endTime) { + return START_TIME_GREATER_THAN_END_TIME; + } + + if (endTime <= block.timestamp) { + return TOO_LATE_TO_EXECUTE_ORDER; + } + if (startTime >= block.timestamp + 5 minutes) { + return TOO_EARLY_TO_EXECUTE_ORDER; + } + } + + /** + * @notice This function is private and checks if the collection type may be potentially invalid. + * @param collection Address of the collection + * @param collectionType Collection type in the maker order + * @return validationCode Validation code + * @dev This function may return false positives. + * (i.e. collections that are tradable but do not implement the proper interfaceId). + * If ERC165 is not implemented, it will revert. + */ + function _checkIfPotentialInvalidCollectionTypes(address collection, CollectionType collectionType) + private + view + returns (uint256 validationCode) + { + if (collectionType == CollectionType.ERC721) { + bool isERC721 = IERC165(collection).supportsInterface(ERC721_INTERFACE_ID_1) + || IERC165(collection).supportsInterface(ERC721_INTERFACE_ID_2); + + if (!isERC721) { + return POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC721; + } + } else if (collectionType == CollectionType.ERC1155) { + if (!IERC165(collection).supportsInterface(ERC1155_INTERFACE_ID)) { + return POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155; + } + } + } + + /** + * @notice This function verifies that (1) ERC20 approvals + * and (2) balances are sufficient to process the maker bid order. + * @param currency Currency address + * @param user User address + * @param price Price (defined by the maker order) + * @return validationCode Validation code + */ + function _checkValidityMakerBidERC20Assets(address currency, address user, uint256 price) + private + view + returns (uint256 validationCode) + { + if (currency != address(0)) { + if (IERC20(currency).balanceOf(user) < price) { + return ERC20_BALANCE_INFERIOR_TO_PRICE; + } + + if (IERC20(currency).allowance(user, address(looksRareProtocol)) < price) { + return ERC20_APPROVAL_INFERIOR_TO_PRICE; + } + } + } + + /** + * @notice This function verifies the validity of NFT assets (approvals, balances, and others). + * @param collection Collection address + * @param collectionType Collection type + * @param user User address + * @param itemIds Array of item ids + * @param amounts Array of amounts + * @return validationCode Validation code + */ + function _checkValidityMakerAskNFTAssets( + address collection, + CollectionType collectionType, + address user, + uint256[] memory itemIds, + uint256[] memory amounts + ) private view returns (uint256 validationCode) { + validationCode = _checkIfItemIdsDiffer(itemIds); + + if (validationCode != ORDER_EXPECTED_TO_BE_VALID) { + return validationCode; + } + + if (collectionType == CollectionType.ERC721) { + validationCode = _checkValidityERC721AndEquivalents(collection, user, itemIds); + } else if (collectionType == CollectionType.ERC1155) { + validationCode = _checkValidityERC1155(collection, user, itemIds, amounts); + } + } + + /** + * @notice This function verifies the validity of (1) ERC721 approvals + * and (2) balances to process the maker ask order. + * @param collection Collection address + * @param user User address + * @param itemIds Array of item ids + * @return validationCode Validation code + */ + function _checkValidityERC721AndEquivalents(address collection, address user, uint256[] memory itemIds) + private + view + returns (uint256 validationCode) + { + // 1. Verify itemId is owned by user and catch revertion if ERC721 ownerOf fails + uint256 length = itemIds.length; + + bool success; + bytes memory data; + + for (uint256 i; i < length;) { + (success, data) = collection.staticcall(abi.encodeCall(IERC721.ownerOf, (itemIds[i]))); + + if (!success) { + return ERC721_ITEM_ID_DOES_NOT_EXIST; + } + + if (abi.decode(data, (address)) != user) { + return ERC721_ITEM_ID_NOT_IN_BALANCE; + } + + unchecked { + ++i; + } + } + + // 2. Verify if collection is approved by transfer manager + (success, data) = + collection.staticcall(abi.encodeCall(IERC721.isApprovedForAll, (user, address(transferManager)))); + + bool isApprovedAll; + if (success) { + isApprovedAll = abi.decode(data, (bool)); + } + + if (!isApprovedAll) { + for (uint256 i; i < length;) { + // 3. If collection is not approved by transfer manager, try to see if it is approved individually + (success, data) = collection.staticcall(abi.encodeCall(IERC721.getApproved, (itemIds[i]))); + + address approvedAddress; + + if (success) { + approvedAddress = abi.decode(data, (address)); + } + + if (approvedAddress != address(transferManager)) { + return ERC721_NO_APPROVAL_FOR_ALL_OR_ITEM_ID; + } + + unchecked { + ++i; + } + } + } + } + + /** + * @notice This function verifies the validity of (1) ERC1155 approvals + * (2) and balances to process the maker ask order. + * @param collection Collection address + * @param user User address + * @param itemIds Array of item ids + * @param amounts Array of amounts + * @return validationCode Validation code + */ + function _checkValidityERC1155(address collection, address user, uint256[] memory itemIds, uint256[] memory amounts) + private + view + returns (uint256 validationCode) + { + // 1. Verify each itemId is owned by user and catch revertion if ERC1155 ownerOf fails + address[] memory users = new address[](1); + users[0] = user; + + uint256 length = itemIds.length; + + // 1.1 Use balanceOfBatch + (bool success, bytes memory data) = + collection.staticcall(abi.encodeCall(IERC1155.balanceOfBatch, (users, itemIds))); + + if (success) { + uint256[] memory balances = abi.decode(data, (uint256[])); + for (uint256 i; i < length;) { + if (balances[i] < amounts[i]) { + return ERC1155_BALANCE_OF_ITEM_ID_INFERIOR_TO_AMOUNT; + } + unchecked { + ++i; + } + } + } else { + // 1.2 If the balanceOfBatch does not work, use loop with balanceOf function + for (uint256 i; i < length;) { + (success, data) = collection.staticcall(abi.encodeCall(IERC1155.balanceOf, (user, itemIds[i]))); + + if (!success) { + return ERC1155_BALANCE_OF_DOES_NOT_EXIST; + } + + if (abi.decode(data, (uint256)) < amounts[i]) { + return ERC1155_BALANCE_OF_ITEM_ID_INFERIOR_TO_AMOUNT; + } + + unchecked { + ++i; + } + } + } + + // 2. Verify if collection is approved by transfer manager + (success, data) = + collection.staticcall(abi.encodeCall(IERC1155.isApprovedForAll, (user, address(transferManager)))); + + if (!success) { + return ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST; + } + + if (!abi.decode(data, (bool))) { + return ERC1155_NO_APPROVAL_FOR_ALL; + } + } + + /** + * @notice This function verifies the validity of a Merkle proof and the order hash. + * @param merkleTree Merkle tree struct + * @param orderHash Order hash + * @param signature Signature + * @param signer Signer address + * @return validationCode Validation code + */ + function _checkValidityMerkleProofAndOrderHash( + OrderStructs.MerkleTree calldata merkleTree, + bytes32 orderHash, + bytes calldata signature, + address signer + ) private view returns (uint256 validationCode) { + if (merkleTree.proof.length != 0) { + if (merkleTree.proof.length > MAX_CALLDATA_PROOF_LENGTH) { + return MERKLE_PROOF_PROOF_TOO_LARGE; + } + + if (!MerkleProofCalldataWithNodes.verifyCalldata(merkleTree.proof, merkleTree.root, orderHash)) { + return ORDER_HASH_PROOF_NOT_IN_MERKLE_TREE; + } + + bytes32 batchOrderHash = looksRareProtocol.hashBatchOrder(merkleTree.root, merkleTree.proof.length); + + return _computeDigestAndVerify(batchOrderHash, signature, signer); + } else { + return _computeDigestAndVerify(orderHash, signature, signer); + } + } + + /** + * @notice Check the validity of creator fee + * @param collection Collection address + * @param itemIds Item ids + * @return validationCode Validation code + */ + function _checkValidityCreatorFee(address collection, uint256 price, uint256[] memory itemIds) + private + view + returns (uint256 validationCode) + { + if (address(creatorFeeManager) != address(0)) { + (bool status, bytes memory data) = address(creatorFeeManager).staticcall( + abi.encodeCall(ICreatorFeeManager.viewCreatorFeeInfo, (collection, price, itemIds)) + ); + + // The only path possible (to revert) in the fee manager is the bundle being not supported. + if (!status) { + return BUNDLE_ERC2981_NOT_SUPPORTED; + } + + (address creator, uint256 creatorFeeAmount) = abi.decode(data, (address, uint256)); + + if (creator != address(0)) { + if (creatorFeeAmount * ONE_HUNDRED_PERCENT_IN_BP > (price * uint256(maxCreatorFeeBp))) { + return CREATOR_FEE_TOO_HIGH; + } + } + } + } + + /** + * @notice This function computes the digest and verify the signature. + * @param computedHash Hash of order or merkle root + * @param makerSignature Signature of the maker + * @param signer Signer address + * @return validationCode Validation code + */ + function _computeDigestAndVerify(bytes32 computedHash, bytes calldata makerSignature, address signer) + private + view + returns (uint256 validationCode) + { + return _validateSignature( + keccak256(abi.encodePacked("\x19\x01", domainSeparator, computedHash)), makerSignature, signer + ); + } + + /** + * @notice This function checks the validity of the signature. + * @param hash Message hash + * @param signature A 64 or 65 bytes signature + * @param signer Signer address + * @return validationCode Validation code + */ + function _validateSignature(bytes32 hash, bytes calldata signature, address signer) + private + view + returns (uint256 validationCode) + { + // Logic if EOA + if (signer.code.length == 0) { + bytes32 r; + bytes32 s; + uint8 v; + + if (signature.length == 64) { + bytes32 vs; + assembly { + r := calldataload(signature.offset) + vs := calldataload(add(signature.offset, 0x20)) + s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) + v := add(shr(255, vs), 27) + } + } else if (signature.length == 65) { + assembly { + r := calldataload(signature.offset) + s := calldataload(add(signature.offset, 0x20)) + v := byte(0, calldataload(add(signature.offset, 0x40))) + } + } else { + return INVALID_SIGNATURE_LENGTH; + } + + if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { + return INVALID_S_PARAMETER_EOA; + } + + if (v != 27 && v != 28) { + return INVALID_V_PARAMETER_EOA; + } + + address recoveredSigner = ecrecover(hash, v, r, s); + + if (recoveredSigner == address(0)) { + return NULL_SIGNER_EOA; + } + + if (signer != recoveredSigner) { + return INVALID_SIGNER_EOA; + } + } else { + // Logic if ERC1271 + (bool success, bytes memory data) = + signer.staticcall(abi.encodeCall(IERC1271.isValidSignature, (hash, signature))); + + if (!success) { + return MISSING_IS_VALID_SIGNATURE_FUNCTION_EIP1271; + } + + if (abi.decode(data, (bytes4)) != IERC1271.isValidSignature.selector) { + return SIGNATURE_INVALID_EIP1271; + } + } + } + + /** + * @dev This function checks if transfer manager approvals are not revoked by user, nor by the owner + * @param user Address of the user + * @return validationCode Validation code + */ + function _checkValidityTransferManagerApprovals(address user) private view returns (uint256 validationCode) { + if (!transferManager.hasUserApprovedOperator(user, address(looksRareProtocol))) { + return NO_TRANSFER_MANAGER_APPROVAL_BY_USER_FOR_EXCHANGE; + } + + if (!transferManager.isOperatorAllowed(address(looksRareProtocol))) { + return TRANSFER_MANAGER_APPROVAL_REVOKED_BY_OWNER_FOR_EXCHANGE; + } + } + + function _checkValidityMakerAskItemIdsAndAmountsAndPrice(OrderStructs.Maker memory makerAsk) + private + view + returns (uint256 validationCode, uint256[] memory itemIds, uint256[] memory amounts, uint256 price) + { + if (makerAsk.strategyId == 0) { + itemIds = makerAsk.itemIds; + amounts = makerAsk.amounts; + price = makerAsk.price; + + validationCode = + _getOrderValidationCodeForStandardStrategy(makerAsk.collectionType, itemIds.length, amounts); + } else { + itemIds = makerAsk.itemIds; + amounts = makerAsk.amounts; + // @dev It should ideally be adjusted by real price + price = makerAsk.price; + + (,,,, bytes4 strategySelector,, address strategyImplementation) = + looksRareProtocol.strategyInfo(makerAsk.strategyId); + + (bool isValid, bytes4 errorSelector) = + IStrategy(strategyImplementation).isMakerOrderValid(makerAsk, strategySelector); + + validationCode = _getOrderValidationCodeForNonStandardStrategies(isValid, errorSelector); + } + } + + function _checkValidityMakerBidItemIdsAndAmountsAndPrice(OrderStructs.Maker memory makerBid) + private + view + returns (uint256 validationCode, uint256[] memory itemIds, uint256[] memory amounts, uint256 price) + { + if (makerBid.strategyId == 0) { + itemIds = makerBid.itemIds; + amounts = makerBid.amounts; + price = makerBid.price; + + validationCode = + _getOrderValidationCodeForStandardStrategy(makerBid.collectionType, itemIds.length, amounts); + } else { + // @dev It should ideally be adjusted by real price + // amounts and itemIds are not used since most non-native maker bids won't target a single item + price = makerBid.price; + + (,,,, bytes4 strategySelector,, address strategyImplementation) = + looksRareProtocol.strategyInfo(makerBid.strategyId); + + (bool isValid, bytes4 errorSelector) = + IStrategy(strategyImplementation).isMakerOrderValid(makerBid, strategySelector); + + validationCode = _getOrderValidationCodeForNonStandardStrategies(isValid, errorSelector); + } + } + + /** + * @notice This function checks if the same itemId is repeated + * in an array of item ids. + * @param itemIds Array of item ids + * @dev This is for bundles. + * For example, if itemIds = [1,2,1], it will return SAME_ITEM_ID_IN_BUNDLE. + * @return validationCode Validation code + */ + function _checkIfItemIdsDiffer(uint256[] memory itemIds) private pure returns (uint256 validationCode) { + uint256 length = itemIds.length; + + // Only check if length of array is greater than 1 + if (length > 1) { + for (uint256 i = 0; i < length - 1;) { + for (uint256 j = i + 1; j < length;) { + if (itemIds[i] == itemIds[j]) { + return SAME_ITEM_ID_IN_BUNDLE; + } + + unchecked { + ++j; + } + } + + unchecked { + ++i; + } + } + } + } + + function _getOrderValidationCodeForStandardStrategy( + CollectionType collectionType, + uint256 expectedLength, + uint256[] memory amounts + ) private pure returns (uint256 validationCode) { + if (expectedLength == 0 || (amounts.length != expectedLength)) { + validationCode = MAKER_ORDER_INVALID_STANDARD_SALE; + } else { + for (uint256 i; i < expectedLength;) { + uint256 amount = amounts[i]; + + if (amount == 0) { + validationCode = MAKER_ORDER_INVALID_STANDARD_SALE; + } + + if (collectionType == CollectionType.ERC721 && amount != 1) { + validationCode = MAKER_ORDER_INVALID_STANDARD_SALE; + } + + unchecked { + ++i; + } + } + } + } + + function _getOrderValidationCodeForNonStandardStrategies(bool isValid, bytes4 errorSelector) + private + pure + returns (uint256 validationCode) + { + if (isValid) { + validationCode = ORDER_EXPECTED_TO_BE_VALID; + } else { + if (errorSelector == OrderInvalid.selector) { + validationCode = MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE; + } else { + validationCode = MAKER_ORDER_TEMPORARILY_INVALID_NON_STANDARD_SALE; + } + } + } +} diff --git a/contracts/src/marketplace/helpers/ProtocolHelpers.sol b/contracts/src/marketplace/helpers/ProtocolHelpers.sol new file mode 100644 index 00000000..99c37c0d --- /dev/null +++ b/contracts/src/marketplace/helpers/ProtocolHelpers.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {SignatureCheckerCalldata} from "@looksrare/contracts-libs/contracts/SignatureCheckerCalldata.sol"; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; + +// Other dependencies +import {LooksRareProtocol} from "../LooksRareProtocol.sol"; + +/** + * @title ProtocolHelpers + * @notice This contract contains helper view functions for order creation. + * @author LooksRare protocol team (👀,💎) + */ +contract ProtocolHelpers { + using OrderStructs for OrderStructs.Maker; + + // Encoding prefix for EIP-712 signatures + string internal constant _ENCODING_PREFIX = "\x19\x01"; + + // LooksRareProtocol + LooksRareProtocol public looksRareProtocol; + + /** + * @notice Constructor + * @param _looksRareProtocol LooksRare protocol address + */ + constructor(address _looksRareProtocol) { + looksRareProtocol = LooksRareProtocol(_looksRareProtocol); + } + + /** + * @notice Compute digest for maker bid struct + * @param maker Maker struct + * @return digest Digest + */ + function computeMakerDigest(OrderStructs.Maker memory maker) public view returns (bytes32 digest) { + bytes32 domainSeparator = looksRareProtocol.domainSeparator(); + return keccak256(abi.encodePacked(_ENCODING_PREFIX, domainSeparator, maker.hash())); + } + + /** + * @notice Compute digest for merkle tree struct + * @param merkleTree Merkle tree struct + * @return digest Digest + */ + function computeDigestMerkleTree(OrderStructs.MerkleTree memory merkleTree) public view returns (bytes32 digest) { + bytes32 domainSeparator = looksRareProtocol.domainSeparator(); + bytes32 batchOrderHash = looksRareProtocol.hashBatchOrder(merkleTree.root, merkleTree.proof.length); + return keccak256(abi.encodePacked(_ENCODING_PREFIX, domainSeparator, batchOrderHash)); + } + + /** + * @notice Verify maker order signature + * @param maker Maker struct + * @param makerSignature Maker signature + * @param signer Signer address + * @dev It returns true only if the SignatureCheckerCalldata does not revert before. + */ + function verifyMakerSignature(OrderStructs.Maker memory maker, bytes calldata makerSignature, address signer) + public + view + returns (bool) + { + bytes32 digest = computeMakerDigest(maker); + SignatureCheckerCalldata.verify(digest, signer, makerSignature); + return true; + } + + /** + * @notice Verify merkle tree signature + * @param merkleTree Merkle tree struct + * @param makerSignature Maker signature + * @param signer Signer address + * @dev It returns true only if the SignatureCheckerCalldata does not revert before. + */ + function verifyMerkleTree(OrderStructs.MerkleTree memory merkleTree, bytes calldata makerSignature, address signer) + public + view + returns (bool) + { + bytes32 digest = computeDigestMerkleTree(merkleTree); + SignatureCheckerCalldata.verify(digest, signer, makerSignature); + return true; + } +} diff --git a/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol b/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol new file mode 100644 index 00000000..6b6728e7 --- /dev/null +++ b/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Interfaces +import {IRoyaltyFeeRegistry} from "./IRoyaltyFeeRegistry.sol"; + +/** + * @title ICreatorFeeManager + * @author LooksRare protocol team (👀,💎) + */ +interface ICreatorFeeManager { + /** + * @notice It is returned if the bundle contains multiple itemIds with different creator fee structure. + */ + error BundleEIP2981NotAllowed(address collection); + + /** + * @notice It returns the royalty fee registry address/interface. + * @return royaltyFeeRegistry Interface of the royalty fee registry + */ + function royaltyFeeRegistry() external view returns (IRoyaltyFeeRegistry royaltyFeeRegistry); + + /** + * @notice This function returns the creator address and calculates the creator fee amount. + * @param collection Collection address + * @param price Transaction price + * @param itemIds Array of item ids + * @return creator Creator address + * @return creatorFeeAmount Creator fee amount + */ + function viewCreatorFeeInfo(address collection, uint256 price, uint256[] memory itemIds) + external + view + returns (address creator, uint256 creatorFeeAmount); +} diff --git a/contracts/src/marketplace/interfaces/ICurrencyManager.sol b/contracts/src/marketplace/interfaces/ICurrencyManager.sol new file mode 100644 index 00000000..72d50d2e --- /dev/null +++ b/contracts/src/marketplace/interfaces/ICurrencyManager.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @title ICurrencyManager + * @author LooksRare protocol team (👀,💎) + */ +interface ICurrencyManager { + /** + * @notice It is emitted if the currency status in the allowlist is updated. + * @param currency Currency address (address(0) = ETH) + * @param isAllowed Whether the currency is allowed + */ + event CurrencyStatusUpdated(address currency, bool isAllowed); +} diff --git a/contracts/src/marketplace/interfaces/IExecutionManager.sol b/contracts/src/marketplace/interfaces/IExecutionManager.sol new file mode 100644 index 00000000..945637b5 --- /dev/null +++ b/contracts/src/marketplace/interfaces/IExecutionManager.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @title IExecutionManager + * @author LooksRare protocol team (👀,💎) + */ +interface IExecutionManager { + /** + * @notice It is issued when there is a new creator fee manager. + * @param creatorFeeManager Address of the new creator fee manager + */ + event NewCreatorFeeManager(address creatorFeeManager); + + /** + * @notice It is issued when there is a new maximum creator fee (in basis point). + * @param maxCreatorFeeBp New maximum creator fee (in basis point) + */ + event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp); + + /** + * @notice It is issued when there is a new protocol fee recipient address. + * @param protocolFeeRecipient Address of the new protocol fee recipient + */ + event NewProtocolFeeRecipient(address protocolFeeRecipient); + + /** + * @notice It is returned if the creator fee (in basis point) is too high. + */ + error CreatorFeeBpTooHigh(); + + /** + * @notice It is returned if the new protocol fee recipient is set to address(0). + */ + error NewProtocolFeeRecipientCannotBeNullAddress(); + + /** + * @notice It is returned if there is no selector for maker ask/bid for a given strategyId, + * depending on the quote type. + */ + error NoSelectorForStrategy(); + + /** + * @notice It is returned if the current block timestamp is not between start and end times in the maker order. + */ + error OutsideOfTimeRange(); + + /** + * @notice It is returned if the strategy id has no implementation. + * @dev It is returned if there is no implementation address and the strategyId is strictly greater than 0. + */ + error StrategyNotAvailable(uint256 strategyId); +} diff --git a/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol b/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol new file mode 100644 index 00000000..efbecb66 --- /dev/null +++ b/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +interface IImmutableCreate2Factory { + function safeCreate2(bytes32 salt, bytes calldata initializationCode) + external + payable + returns (address deploymentAddress); +} diff --git a/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol b/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol new file mode 100644 index 00000000..e2a52119 --- /dev/null +++ b/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; + +/** + * @title ILooksRareProtocol + * @author LooksRare protocol team (👀,💎) + */ +interface ILooksRareProtocol { + /** + * @notice This struct contains an order nonce's invalidation status + * and the order hash that triggered the status change. + * @param orderHash Maker order hash + * @param orderNonce Order nonce + * @param isNonceInvalidated Whether this transaction invalidated the maker user's order nonce at the protocol level + */ + struct NonceInvalidationParameters { + bytes32 orderHash; + uint256 orderNonce; + bool isNonceInvalidated; + } + + /** + * @notice It is emitted if there is a change in the domain separator. + */ + event NewDomainSeparator(); + + /** + * @notice It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + * @param gasLimitETHTransfer Gas limit for an ETH transfer + */ + event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer); + + /** + * @notice It is emitted when a taker ask transaction is completed. + * @param nonceInvalidationParameters Struct about nonce invalidation parameters + * @param askUser Address of the ask user + * @param bidUser Address of the bid user + * @param strategyId Id of the strategy + * @param currency Address of the currency + * @param collection Address of the collection + * @param itemIds Array of item ids + * @param amounts Array of amounts (for item ids) + * @param feeRecipients Array of fee recipients + * feeRecipients[0] User who receives the proceeds of the sale (it can be the taker ask user or different) + * feeRecipients[1] Creator fee recipient (if none, address(0)) + * @param feeAmounts Array of fee amounts + * feeAmounts[0] Fee amount for the user receiving sale proceeds + * feeAmounts[1] Creator fee amount + * feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment + */ + // maker (receives the NFT) + // taker (initiates the transaction) + event TakerAsk( + NonceInvalidationParameters nonceInvalidationParameters, + address askUser, + address bidUser, + uint256 strategyId, + address currency, + address collection, + uint256[] itemIds, + uint256[] amounts, + address[2] feeRecipients, + uint256[3] feeAmounts + ); + + /** + * @notice It is emitted when a taker bid transaction is completed. + * @param nonceInvalidationParameters Struct about nonce invalidation parameters + * @param bidUser Address of the bid user + * @param bidRecipient Address of the recipient of the bid + * @param strategyId Id of the strategy + * @param currency Address of the currency + * @param collection Address of the collection + * @param itemIds Array of item ids + * @param amounts Array of amounts (for item ids) + * @param feeRecipients Array of fee recipients + * feeRecipients[0] User who receives the proceeds of the sale (it is the maker ask user) + * feeRecipients[1] Creator fee recipient (if none, address(0)) + * @param feeAmounts Array of fee amounts + * feeAmounts[0] Fee amount for the user receiving sale proceeds + * feeAmounts[1] Creator fee amount + * feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment + */ + // taker (receives the NFT) + // taker (initiates the transaction) + event TakerBid( + NonceInvalidationParameters nonceInvalidationParameters, + address bidUser, + address bidRecipient, + uint256 strategyId, + address currency, + address collection, + uint256[] itemIds, + uint256[] amounts, + address[2] feeRecipients, + uint256[3] feeAmounts + ); + + /** + * @notice It is returned if the gas limit for a standard ETH transfer is too low. + */ + error NewGasLimitETHTransferTooLow(); + + /** + * @notice It is returned if the domain separator cannot be updated (i.e. the chainId is the same). + */ + error SameDomainSeparator(); + + /** + * @notice It is returned if the domain separator should change. + */ + error ChainIdInvalid(); + + /** + * @notice It is returned if the nonces are invalid. + */ + error NoncesInvalid(); + + /** + * @notice This function allows a user to execute a taker ask (against a maker bid). + * @param takerAsk Taker ask struct + * @param makerBid Maker bid struct + * @param makerSignature Maker signature + * @param merkleTree Merkle tree struct (if the signature contains multiple maker orders) + */ + function executeTakerAsk( + OrderStructs.Taker calldata takerAsk, + OrderStructs.Maker calldata makerBid, + bytes calldata makerSignature, + OrderStructs.MerkleTree calldata merkleTree + ) external; + + /** + * @notice This function allows a user to execute a taker bid (against a maker ask). + * @param takerBid Taker bid struct + * @param makerAsk Maker ask struct + * @param makerSignature Maker signature + * @param merkleTree Merkle tree struct (if the signature contains multiple maker orders) + */ + function executeTakerBid( + OrderStructs.Taker calldata takerBid, + OrderStructs.Maker calldata makerAsk, + bytes calldata makerSignature, + OrderStructs.MerkleTree calldata merkleTree + ) external payable; + + /** + * @notice This function allows a user to batch buy with an array of taker bids (against an array of maker asks). + * @param takerBids Array of taker bid structs + * @param makerAsks Array of maker ask structs + * @param makerSignatures Array of maker signatures + * @param merkleTrees Array of merkle tree structs if the signature contains multiple maker orders + * @param isAtomic Whether the execution should be atomic + * i.e. whether it should revert if 1 or more transactions fail + */ + function executeMultipleTakerBids( + OrderStructs.Taker[] calldata takerBids, + OrderStructs.Maker[] calldata makerAsks, + bytes[] calldata makerSignatures, + OrderStructs.MerkleTree[] calldata merkleTrees, + bool isAtomic + ) external payable; +} diff --git a/contracts/src/marketplace/interfaces/INonceManager.sol b/contracts/src/marketplace/interfaces/INonceManager.sol new file mode 100644 index 00000000..6011291d --- /dev/null +++ b/contracts/src/marketplace/interfaces/INonceManager.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @title INonceManager + * @author LooksRare protocol team (👀,💎) + */ +interface INonceManager { + /** + * @notice This struct contains the global bid and ask nonces of a user. + * @param bidNonce Bid nonce + * @param askNonce Ask nonce + */ + struct UserBidAskNonces { + uint256 bidNonce; + uint256 askNonce; + } + + /** + * @notice It is emitted when there is an update of the global bid/ask nonces for a user. + * @param user Address of the user + * @param bidNonce New bid nonce + * @param askNonce New ask nonce + */ + event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce); + + /** + * @notice It is emitted when order nonces are cancelled for a user. + * @param user Address of the user + * @param orderNonces Array of order nonces cancelled + */ + event OrderNoncesCancelled(address user, uint256[] orderNonces); + + /** + * @notice It is emitted when subset nonces are cancelled for a user. + * @param user Address of the user + * @param subsetNonces Array of subset nonces cancelled + */ + event SubsetNoncesCancelled(address user, uint256[] subsetNonces); +} diff --git a/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol b/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol new file mode 100644 index 00000000..766d4603 --- /dev/null +++ b/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @title IRoyaltyFeeRegistry + * @author LooksRare protocol team (👀,💎) + */ +interface IRoyaltyFeeRegistry { + /** + * @notice This function returns the royalty information for a collection at a given transaction price. + * @param collection Collection address + * @param price Transaction price + * @return receiver Receiver address + * @return royaltyFee Royalty fee amount + */ + function royaltyInfo(address collection, uint256 price) + external + view + returns (address receiver, uint256 royaltyFee); +} diff --git a/contracts/src/marketplace/interfaces/IStrategy.sol b/contracts/src/marketplace/interfaces/IStrategy.sol new file mode 100644 index 00000000..a9b7e450 --- /dev/null +++ b/contracts/src/marketplace/interfaces/IStrategy.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; + +/** + * @title IStrategy + * @author LooksRare protocol team (👀,💎) + */ +interface IStrategy { + /** + * @notice Validate *only the maker* order under the context of the chosen strategy. It does not revert if + * the maker order is invalid. Instead it returns false and the error's 4 bytes selector. + * @param makerOrder Maker struct (maker specific parameters for the execution) + * @param functionSelector Function selector for the strategy + * @return isValid Whether the maker struct is valid + * @return errorSelector If isValid is false, it returns the error's 4 bytes selector + */ + function isMakerOrderValid(OrderStructs.Maker calldata makerOrder, bytes4 functionSelector) + external + view + returns (bool isValid, bytes4 errorSelector); + + /** + * @notice This function acts as a safety check for the protocol's owner when adding new execution strategies. + * @return isStrategy Whether it is a LooksRare V2 protocol strategy + */ + function isLooksRareV2Strategy() external pure returns (bool isStrategy); +} diff --git a/contracts/src/marketplace/interfaces/IStrategyManager.sol b/contracts/src/marketplace/interfaces/IStrategyManager.sol new file mode 100644 index 00000000..283431a2 --- /dev/null +++ b/contracts/src/marketplace/interfaces/IStrategyManager.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @title IStrategyManager + * @author LooksRare protocol team (👀,💎) + */ +interface IStrategyManager { + /** + * @notice This struct contains the parameter of an execution strategy. + * @param strategyId Id of the new strategy + * @param standardProtocolFeeBp Standard protocol fee (in basis point) + * @param minTotalFeeBp Minimum total fee (in basis point) + * @param maxProtocolFeeBp Maximum protocol fee (in basis point) + * @param selector Function selector for the transaction to be executed + * @param isMakerBid Whether the strategyId is for maker bid + * @param implementation Address of the implementation of the strategy + */ + struct Strategy { + bool isActive; + uint16 standardProtocolFeeBp; + uint16 minTotalFeeBp; + uint16 maxProtocolFeeBp; + bytes4 selector; + bool isMakerBid; + address implementation; + } + + /** + * @notice It is emitted when a new strategy is added. + * @param strategyId Id of the new strategy + * @param standardProtocolFeeBp Standard protocol fee (in basis point) + * @param minTotalFeeBp Minimum total fee (in basis point) + * @param maxProtocolFeeBp Maximum protocol fee (in basis point) + * @param selector Function selector for the transaction to be executed + * @param isMakerBid Whether the strategyId is for maker bid + * @param implementation Address of the implementation of the strategy + */ + event NewStrategy( + uint256 strategyId, + uint16 standardProtocolFeeBp, + uint16 minTotalFeeBp, + uint16 maxProtocolFeeBp, + bytes4 selector, + bool isMakerBid, + address implementation + ); + + /** + * @notice It is emitted when an existing strategy is updated. + * @param strategyId Id of the strategy + * @param isActive Whether the strategy is active (or not) after the update + * @param standardProtocolFeeBp Standard protocol fee (in basis point) + * @param minTotalFeeBp Minimum total fee (in basis point) + */ + event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp); + + /** + * @notice If the strategy has not set properly its implementation contract. + * @dev It can only be returned for owner operations. + */ + error NotV2Strategy(); + + /** + * @notice It is returned if the strategy has no selector. + * @dev It can only be returned for owner operations. + */ + error StrategyHasNoSelector(); + + /** + * @notice It is returned if the strategyId is invalid. + */ + error StrategyNotUsed(); + + /** + * @notice It is returned if the strategy's protocol fee is too high. + * @dev It can only be returned for owner operations. + */ + error StrategyProtocolFeeTooHigh(); +} diff --git a/contracts/src/marketplace/interfaces/ITransferManager.sol b/contracts/src/marketplace/interfaces/ITransferManager.sol new file mode 100644 index 00000000..8f19f9a4 --- /dev/null +++ b/contracts/src/marketplace/interfaces/ITransferManager.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; + +// Enums +import {CollectionType} from "../enums/CollectionType.sol"; + +/** + * @title ITransferManager + * @author LooksRare protocol team (👀,💎) + */ +interface ITransferManager { + /** + * @notice This struct is only used for transferBatchItemsAcrossCollections. + * @param collection Collection address + * @param collectionType 0 for ERC721, 1 for ERC1155 + * @param itemIds Array of item ids to transfer + * @param amounts Array of amounts to transfer + */ + struct BatchTransferItem { + address collection; + CollectionType collectionType; + uint256[] itemIds; + uint256[] amounts; + } + + /** + * @notice It is emitted if operators' approvals to transfer NFTs are granted by a user. + * @param user Address of the user + * @param operators Array of operator addresses + */ + event ApprovalsGranted(address user, address[] operators); + + /** + * @notice It is emitted if operators' approvals to transfer NFTs are revoked by a user. + * @param user Address of the user + * @param operators Array of operator addresses + */ + event ApprovalsRemoved(address user, address[] operators); + + /** + * @notice It is emitted if a new operator is added to the global allowlist. + * @param operator Operator address + */ + event OperatorAllowed(address operator); + + /** + * @notice It is emitted if an operator is removed from the global allowlist. + * @param operator Operator address + */ + event OperatorRemoved(address operator); + + /** + * @notice It is returned if the operator to approve has already been approved by the user. + */ + error OperatorAlreadyApprovedByUser(); + + /** + * @notice It is returned if the operator to revoke has not been previously approved by the user. + */ + error OperatorNotApprovedByUser(); + + /** + * @notice It is returned if the transfer caller is already allowed by the owner. + * @dev This error can only be returned for owner operations. + */ + error OperatorAlreadyAllowed(); + + /** + * @notice It is returned if the operator to approve is not in the global allowlist defined by the owner. + * @dev This error can be returned if the user tries to grant approval to an operator address not in the + * allowlist or if the owner tries to remove the operator from the global allowlist. + */ + error OperatorNotAllowed(); + + /** + * @notice It is returned if the transfer caller is invalid. + * For a transfer called to be valid, the operator must be in the global allowlist and + * approved by the 'from' user. + */ + error TransferCallerInvalid(); +} diff --git a/contracts/src/marketplace/libraries/CurrencyValidator.sol b/contracts/src/marketplace/libraries/CurrencyValidator.sol new file mode 100644 index 00000000..61208646 --- /dev/null +++ b/contracts/src/marketplace/libraries/CurrencyValidator.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Assembly +import { + CurrencyInvalid_error_selector, + CurrencyInvalid_error_length, + Error_selector_offset +} from "../constants/AssemblyConstants.sol"; + +/** + * @title CurrencyValidator + * @notice This library validates the order currency to be the + * chain's native currency or the specified ERC20 token. + * @author LooksRare protocol team (👀,💎) + */ +library CurrencyValidator { + /** + * @dev This is equivalent to + * if (orderCurrency != address(0)) { + * if (orderCurrency != allowedCurrency) { + * revert CurrencyInvalid(); + * } + * } + * + * 1. If orderCurrency == WETH, allowedCurrency == WETH -> WETH * 0 == 0 + * 2. If orderCurrency == ETH, allowedCurrency == WETH -> 0 * 1 == 0 + * 3. If orderCurrency == USDC, allowedCurrency == WETH -> USDC * 1 != 0 + */ + function allowNativeOrAllowedCurrency(address orderCurrency, address allowedCurrency) internal pure { + assembly { + if mul(orderCurrency, iszero(eq(orderCurrency, allowedCurrency))) { + mstore(0x00, CurrencyInvalid_error_selector) + revert(Error_selector_offset, CurrencyInvalid_error_length) + } + } + } +} diff --git a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol new file mode 100644 index 00000000..f3af4e8b --- /dev/null +++ b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "../../libraries/OrderStructs.sol"; + +/** + * @title MerkleProofCalldataWithNodes + * @notice This library is adjusted from the work of OpenZeppelin. + * It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). + * @author OpenZeppelin (adjusted by LooksRare) + */ +library MerkleProofCalldataWithNodes { + /** + * @notice This returns true if a `leaf` can be proved to be a part of a Merkle tree defined by `root`. + * For this, a `proof` must be provided, containing sibling hashes on the branch from the leaf to the + * root of the tree. Each pair of leaves and each pair of pre-images are assumed to be sorted. + */ + function verifyCalldata(OrderStructs.MerkleTreeNode[] calldata proof, bytes32 root, bytes32 leaf) + internal + pure + returns (bool) + { + return processProofCalldata(proof, leaf) == root; + } + + /** + * @notice This returns the rebuilt hash obtained by traversing a Merkle tree up from `leaf` using `proof`. + * A `proof` is valid if and only if the rebuilt hash matches the root of the tree. + * When processing the proof, the pairs of leafs & pre-images are assumed to be sorted. + */ + function processProofCalldata(OrderStructs.MerkleTreeNode[] calldata proof, bytes32 leaf) + internal + pure + returns (bytes32) + { + bytes32 computedHash = leaf; + uint256 length = proof.length; + + for (uint256 i = 0; i < length;) { + if (proof[i].position == OrderStructs.MerkleTreeNodePosition.Left) { + computedHash = _efficientHash(proof[i].value, computedHash); + } else { + computedHash = _efficientHash(computedHash, proof[i].value); + } + unchecked { + ++i; + } + } + return computedHash; + } + + function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, a) + mstore(0x20, b) + value := keccak256(0x00, 0x40) + } + } +} diff --git a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol new file mode 100644 index 00000000..02ab8737 --- /dev/null +++ b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @title MerkleProofMemory + * @notice This library is adjusted from the work of OpenZeppelin. + * It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). + * @author OpenZeppelin (adjusted by LooksRare) + */ +// TODO compare changes with OpenZeppelin +library MerkleProofMemory { + /** + * @notice This returns true if a `leaf` can be proved to be a part of a Merkle tree defined by `root`. + * For this, a `proof` must be provided, containing sibling hashes on the branch from the leaf to the + * root of the tree. Each pair of leaves and each pair of pre-images are assumed to be sorted. + */ + function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { + return processProof(proof, leaf) == root; + } + + /** + * @notice This returns the rebuilt hash obtained by traversing a Merkle tree up from `leaf` using `proof`. + * A `proof` is valid if and only if the rebuilt hash matches the root of the tree. + * When processing the proof, the pairs of leafs & pre-images are assumed to be sorted. + */ + function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { + bytes32 computedHash = leaf; + uint256 length = proof.length; + + for (uint256 i = 0; i < length;) { + computedHash = _hashPair(computedHash, proof[i]); + unchecked { + ++i; + } + } + return computedHash; + } + + function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { + return a < b ? _efficientHash(a, b) : _efficientHash(b, a); + } + + function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, a) + mstore(0x20, b) + value := keccak256(0x00, 0x40) + } + } +} diff --git a/contracts/src/marketplace/libraries/OrderStructs.sol b/contracts/src/marketplace/libraries/OrderStructs.sol new file mode 100644 index 00000000..19b3a88d --- /dev/null +++ b/contracts/src/marketplace/libraries/OrderStructs.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Enums +import {CollectionType} from "../enums/CollectionType.sol"; +import {QuoteType} from "../enums/QuoteType.sol"; + +/** + * @title OrderStructs + * @notice This library contains all order struct types for the LooksRare protocol (v2). + * @author LooksRare protocol team (👀,💎) + */ +library OrderStructs { + /** + * 1. Maker struct + */ + + /** + * @notice Maker is the struct for a maker order. + * @param quoteType Quote type (i.e. 0 = BID, 1 = ASK) + * @param globalNonce Global user order nonce for maker orders + * @param subsetNonce Subset nonce (shared across bid/ask maker orders) + * @param orderNonce Order nonce (it can be shared across bid/ask maker orders) + * @param strategyId Strategy id + * @param collectionType Collection type (i.e. 0 = ERC721, 1 = ERC1155, 2 = Hypercert, 3 = Hyperboard) + * @param collection Collection address + * @param currency Currency address (@dev address(0) = ETH) + * @param signer Signer address + * @param startTime Start timestamp + * @param endTime End timestamp + * @param price Minimum price for maker ask, maximum price for maker bid + * @param itemIds Array of itemIds + * @param amounts Array of amounts + * @param additionalParameters Extra data specific for the order + */ + struct Maker { + QuoteType quoteType; + uint256 globalNonce; + uint256 subsetNonce; + uint256 orderNonce; + uint256 strategyId; + CollectionType collectionType; + address collection; + address currency; + address signer; + uint256 startTime; + uint256 endTime; + uint256 price; + uint256[] itemIds; + uint256[] amounts; + bytes additionalParameters; + } + + /** + * 2. Taker struct + */ + + /** + * @notice Taker is the struct for a taker ask/bid order. It contains the parameters required for a direct purchase. + * @dev Taker struct is matched against MakerAsk/MakerBid structs at the protocol level. + * @param recipient Recipient address (to receive NFTs or non-fungible tokens) + * @param additionalParameters Extra data specific for the order + */ + struct Taker { + address recipient; + bytes additionalParameters; + } + + /** + * 3. Merkle tree struct + */ + + enum MerkleTreeNodePosition { + Left, + Right + } + + /** + * @notice MerkleTreeNode is a MerkleTree's node. + * @param value It can be an order hash or a proof + * @param position The node's position in its branch. + * It can be left or right or none + * (before the tree is sorted). + */ + struct MerkleTreeNode { + bytes32 value; + MerkleTreeNodePosition position; + } + + /** + * @notice MerkleTree is the struct for a merkle tree of order hashes. + * @dev A Merkle tree can be computed with order hashes. + * It can contain order hashes from both maker bid and maker ask structs. + * @param root Merkle root + * @param proof Array containing the merkle proof + */ + struct MerkleTree { + bytes32 root; + MerkleTreeNode[] proof; + } + + /** + * 4. Constants + */ + + /** + * @notice This is the type hash constant used to compute the maker order hash. + */ + bytes32 internal constant _MAKER_TYPEHASH = keccak256( + "Maker(" "uint8 quoteType," "uint256 globalNonce," "uint256 subsetNonce," "uint256 orderNonce," + "uint256 strategyId," "uint8 collectionType," "address collection," "address currency," "address signer," + "uint256 startTime," "uint256 endTime," "uint256 price," "uint256[] itemIds," "uint256[] amounts," + "bytes additionalParameters" ")" + ); + + /** + * 5. Hash functions + */ + + /** + * @notice This function is used to compute the order hash for a maker struct. + * @param maker Maker order struct + * @return makerHash Hash of the maker struct + */ + function hash(Maker memory maker) internal pure returns (bytes32) { + // Encoding is done into two parts to avoid stack too deep issues + return keccak256( + bytes.concat( + abi.encode( + _MAKER_TYPEHASH, + maker.quoteType, + maker.globalNonce, + maker.subsetNonce, + maker.orderNonce, + maker.strategyId, + maker.collectionType, + maker.collection, + maker.currency + ), + abi.encode( + maker.signer, + maker.startTime, + maker.endTime, + maker.price, + keccak256(abi.encodePacked(maker.itemIds)), + keccak256(abi.encodePacked(maker.amounts)), + keccak256(maker.additionalParameters) + ) + ) + ); + } +} diff --git a/contracts/src/AllowlistMinter.sol b/contracts/src/protocol/AllowlistMinter.sol similarity index 83% rename from contracts/src/AllowlistMinter.sol rename to contracts/src/protocol/AllowlistMinter.sol index 576b45ee..881e0e68 100644 --- a/contracts/src/AllowlistMinter.sol +++ b/contracts/src/protocol/AllowlistMinter.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.16; +pragma solidity ^0.8.16; -import { MerkleProofUpgradeable } from "oz-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; -import { IAllowlist } from "./interfaces/IAllowlist.sol"; +import {MerkleProofUpgradeable} from "oz-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; +import {IAllowlist} from "./interfaces/IAllowlist.sol"; -import { Errors } from "./libs/Errors.sol"; +import {Errors} from "./libs/Errors.sol"; /// @title Interface for hypercert token interactions /// @author bitbeckers @@ -19,11 +19,11 @@ contract AllowlistMinter is IAllowlist { mapping(uint256 => uint256) internal maxUnits; mapping(uint256 => uint256) internal minted; - function isAllowedToClaim( - bytes32[] calldata proof, - uint256 claimID, - bytes32 leaf - ) external view returns (bool isAllowed) { + function isAllowedToClaim(bytes32[] calldata proof, uint256 claimID, bytes32 leaf) + external + view + returns (bool isAllowed) + { if (merkleRoots[claimID].length == 0) revert Errors.DoesNotExist(); isAllowed = MerkleProofUpgradeable.verifyCalldata(proof, merkleRoots[claimID], leaf); } @@ -44,8 +44,8 @@ contract AllowlistMinter is IAllowlist { if (hasBeenClaimed[claimID][leaf]) revert Errors.AlreadyClaimed(); if ( - !MerkleProofUpgradeable.verifyCalldata(proof, merkleRoots[claimID], leaf) || - (minted[claimID] + amount) > maxUnits[claimID] + !MerkleProofUpgradeable.verifyCalldata(proof, merkleRoots[claimID], leaf) + || (minted[claimID] + amount) > maxUnits[claimID] ) revert Errors.Invalid(); hasBeenClaimed[claimID][leaf] = true; diff --git a/contracts/src/HypercertMinter.sol b/contracts/src/protocol/HypercertMinter.sol similarity index 80% rename from contracts/src/HypercertMinter.sol rename to contracts/src/protocol/HypercertMinter.sol index 917c02c5..63cf8cb4 100644 --- a/contracts/src/HypercertMinter.sol +++ b/contracts/src/protocol/HypercertMinter.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.16; +pragma solidity ^0.8.16; -import { IHypercertToken } from "./interfaces/IHypercertToken.sol"; -import { SemiFungible1155 } from "./SemiFungible1155.sol"; -import { AllowlistMinter } from "./AllowlistMinter.sol"; -import { PausableUpgradeable } from "oz-upgradeable/security/PausableUpgradeable.sol"; +import {IHypercertToken} from "./interfaces/IHypercertToken.sol"; +import {SemiFungible1155} from "./SemiFungible1155.sol"; +import {AllowlistMinter} from "./AllowlistMinter.sol"; +import {PausableUpgradeable} from "oz-upgradeable/security/PausableUpgradeable.sol"; -import { Errors } from "./libs/Errors.sol"; +import {Errors} from "./libs/Errors.sol"; /// @title Contract for managing hypercert claims and whitelists /// @author bitbeckers @@ -37,12 +37,11 @@ contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, /// @notice Mint a semi-fungible token for the impact claim referenced via `uri` /// @dev see {IHypercertToken} - function mintClaim( - address account, - uint256 units, - string memory _uri, - TransferRestrictions restrictions - ) external override whenNotPaused { + function mintClaim(address account, uint256 units, string memory _uri, TransferRestrictions restrictions) + external + override + whenNotPaused + { // This enables us to release this restriction in the future if (msg.sender != account) revert Errors.NotAllowed(); uint256 claimID = _mintNewTypeWithToken(account, units, _uri); @@ -72,12 +71,10 @@ contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, /// @notice Mint a semi-fungible token representing a fraction of the claim /// @dev Calls AllowlistMinter to verify `proof`. /// @dev Mints the `amount` of units for the hypercert stored under `claimID` - function mintClaimFromAllowlist( - address account, - bytes32[] calldata proof, - uint256 claimID, - uint256 units - ) external whenNotPaused { + function mintClaimFromAllowlist(address account, bytes32[] calldata proof, uint256 claimID, uint256 units) + external + whenNotPaused + { _processClaim(proof, claimID, units); _mintToken(account, claimID, units); } @@ -92,7 +89,7 @@ contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, uint256[] calldata units ) external whenNotPaused { uint256 len = claimIDs.length; - for (uint256 i; i < len; ) { + for (uint256 i; i < len;) { _processClaim(proofs[i], claimIDs[i], units[i]); unchecked { ++i; @@ -119,11 +116,10 @@ contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, /// @notice Split a claimtokens value into parts with summed value equal to the original /// @dev see {IHypercertToken} - function splitFraction( - address _account, - uint256 _tokenID, - uint256[] calldata _newFractions - ) external whenNotPaused { + function splitFraction(address _account, uint256 _tokenID, uint256[] calldata _newFractions) + external + whenNotPaused + { _splitTokenUnits(_account, _tokenID, _newFractions); } @@ -139,6 +135,28 @@ contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, _burnToken(_account, _tokenID); } + /// @notice Burn a claimtoken + /// @dev see {IHypercertToken} + function batchBurnFraction(address _account, uint256[] memory _tokenIDs) external whenNotPaused { + _batchBurnToken(_account, _tokenIDs); + } + + /// @notice Burn a claimtoken; override is needed to update units/values + /// @dev see {ERC1155Burnable} + function burn(address account, uint256 id, uint256 /*value*/ ) public override whenNotPaused { + _burnToken(account, id); + } + + /// @notice Batch burn claimtokens; override is needed to update units/values + /// @dev see {ERC1155Burnable} + function burnBatch(address account, uint256[] memory ids, uint256[] memory /*values*/ ) + public + override + whenNotPaused + { + _batchBurnToken(account, ids); + } + /// @dev see {IHypercertToken} function unitsOf(uint256 tokenID) external view override returns (uint256 units) { units = _unitsOf(tokenID); @@ -162,7 +180,12 @@ contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, /// METADATA /// @dev see { IHypercertMetadata} - function uri(uint256 tokenID) public view override(IHypercertToken, SemiFungible1155) returns (string memory _uri) { + function uri(uint256 tokenID) + public + view + override(IHypercertToken, SemiFungible1155) + returns (string memory _uri) + { _uri = SemiFungible1155.uri(tokenID); } @@ -204,7 +227,7 @@ contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, // Transfer case, where to and from are non-zero uint256 len = ids.length; - for (uint256 i; i < len; ) { + for (uint256 i; i < len;) { uint256 typeID = getBaseType(ids[i]); TransferRestrictions policy = typeRestrictions[typeID]; if (policy == TransferRestrictions.DisallowAll) { diff --git a/contracts/src/protocol/SemiFungible1155.sol b/contracts/src/protocol/SemiFungible1155.sol new file mode 100644 index 00000000..4fe25e1c --- /dev/null +++ b/contracts/src/protocol/SemiFungible1155.sol @@ -0,0 +1,641 @@ +// SPDX-License-Identifier: MIT +// Used components of Enjin example implementation for mixed fungibility +// https://github.com/enjin/erc-1155/blob/master/contracts/ERC1155MixedFungibleMintable.sol +pragma solidity ^0.8.16; + +import {ERC1155Upgradeable} from "oz-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; +import {ERC1155BurnableUpgradeable} from "oz-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol"; +import {ERC1155URIStorageUpgradeable} from "oz-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol"; +import {OwnableUpgradeable} from "oz-upgradeable/access/OwnableUpgradeable.sol"; +import {Initializable} from "oz-upgradeable/proxy/utils/Initializable.sol"; +import {UUPSUpgradeable} from "oz-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {Errors} from "./libs/Errors.sol"; + +/// @title Contract for minting semi-fungible EIP1155 tokens +/// @author bitbeckers +/// @notice Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` +/// @dev Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens) +contract SemiFungible1155 is + Initializable, + ERC1155Upgradeable, + ERC1155BurnableUpgradeable, + ERC1155URIStorageUpgradeable, + OwnableUpgradeable, + UUPSUpgradeable +{ + /// @dev Counter used to generate next typeID. + uint256 internal typeCounter; + + /// @dev Bitmask used to expose only upper 128 bits of uint256 + uint256 internal constant TYPE_MASK = type(uint256).max << 128; + + /// @dev Bitmask used to expose only lower 128 bits of uint256 + uint256 internal constant NF_INDEX_MASK = type(uint256).max >> 128; + + uint256 internal constant FRACTION_LIMIT = 253; + + /// @dev Mapping of `tokenID` to address of `owner` + mapping(uint256 => address) internal owners; + + /// @dev Mapping of `tokenID` to address of `creator` + mapping(uint256 => address) internal creators; + + /// @dev Used to determine amount of `units` stored in token at `tokenID` + mapping(uint256 => uint256) internal tokenValues; + + /// @dev Used to find highest index of token belonging to token at `typeID` + mapping(uint256 => uint256) internal maxIndex; + + /// @dev Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID` + event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value); + + /// @dev Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs` + event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values); + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } + // solhint-disable-next-line func-name-mixedcase + function __SemiFungible1155_init() public virtual onlyInitializing { + __ERC1155_init(""); + __ERC1155Burnable_init(); + __ERC1155URIStorage_init(); + __Ownable_init(); + __UUPSUpgradeable_init(); + } + + /** + * @dev Returns the index of the fractional token at `_id` by returning lower 128 bit values. + * @param tokenID The ID of the token to query. + * @return The index of the fractional token. + * @dev This function returns 0 if `_id` is a baseType. + */ + function getItemIndex(uint256 tokenID) internal pure returns (uint256) { + return tokenID & NF_INDEX_MASK; + } + + /** + * @dev Get base type ID for token at `_id` by returning upper 128 bit values. + * @param tokenID The ID of the token to query. + * @return The base type ID of the token. + */ + function getBaseType(uint256 tokenID) internal pure returns (uint256) { + return tokenID & TYPE_MASK; + } + + /** + * @dev Identify that token at `_id` is base type. + * @param tokenID The ID of the token to query. + * @return A boolean indicating whether the token is a base type. + * @dev Upper 128 bits identify base type ID, lower bits should be 0. + */ + function isBaseType(uint256 tokenID) internal pure returns (bool) { + return (tokenID & TYPE_MASK == tokenID) && (tokenID & NF_INDEX_MASK == 0); + } + + /** + * @dev Returns a boolean indicating whether the token at `_id` belongs to a base type. + * @param tokenID The ID of the token to query. + * @return A boolean indicating whether the token is a typed item. + * @dev Upper 128 bits identify the type ID, lower bits identify the index of the typed item. + */ + function isTypedItem(uint256 tokenID) internal pure returns (bool) { + return (tokenID & TYPE_MASK != 0) && (tokenID & NF_INDEX_MASK != 0); + } + + /// READ + /** + * @dev Returns the owner of a given token ID. + * @param tokenID The ID of the token to query. + * @return _owner The address of the owner of the token. + */ + function ownerOf(uint256 tokenID) public view returns (address _owner) { + _owner = owners[tokenID]; + } + + /** + * @dev Returns the number of units of a given token ID. + * @param tokenID The ID of the token to query. + * @return units The number of units of the token. + * @dev This function is used internally to get the number of units of a token. + */ + function _unitsOf(uint256 tokenID) internal view returns (uint256 units) { + units = tokenValues[tokenID]; + } + + /** + * @dev Returns the number of units of a given token ID owned by a given account. + * @param account The address of the account to query. + * @param tokenID The ID of the token to query. + * @return units The number of units of the token owned by the account. + * @dev This function is used internally to get the number of units of a token owned by an account. + */ + function _unitsOf(address account, uint256 tokenID) internal view returns (uint256 units) { + // Check if fraction token and accounts owns it + if (ownerOf(tokenID) == account) { + units = tokenValues[tokenID]; + } + } + + /// MUTATE + + /** + * @dev Creates a new token type ID based on the token counter. + * @param _account The address of the account that will own the new token type. + * @param units The number of units associated with the new token type. + * @param _uri The URI for the metadata associated with the new token type. + * @return typeID The new token type ID. + */ + function _createTokenType(address _account, uint256 units, string memory _uri) internal returns (uint256 typeID) { + _notMaxType(typeCounter); + typeID = ++typeCounter << 128; + + creators[typeID] = _account; + tokenValues[typeID] = units; + + _setURI(typeID, _uri); + + //Event emitted for indexing purposes + emit TransferSingle(_account, address(0), address(0), typeID, 0); + } + + /** + * @dev Mints a new token with a new token type ID and assigns it to the specified account. + * @param _account The address of the account that will receive the new token. + * @param _units The number of units associated with the new token. + * @param _uri The URI for the metadata associated with the new token. + * @return typeID The new token type ID. + * @dev This function creates a new token type ID by calling the `_createTokenType` function and then mints a new + * token with the new type ID. + * @dev The `tokenID` is calculated by adding the `typeID` to the current maximum index for the `typeID`. + * @dev The `tokenValues` mapping is updated with the number of units associated with the new token. + * @dev A `ValueTransfer` event is emitted to indicate that a new token has been minted and assigned to the + * specified account. + * @dev If `_units` is zero, the function will revert with an error. + */ + function _mintNewTypeWithToken(address _account, uint256 _units, string memory _uri) + internal + returns (uint256 typeID) + { + if (_units == 0) { + revert Errors.NotAllowed(); + } + typeID = _createTokenType(_account, _units, _uri); + + uint256 tokenID = typeID + ++maxIndex[typeID]; //1 based indexing, 0 holds type data + + tokenValues[tokenID] = _units; + + _mint(_account, tokenID, 1, ""); + emit ValueTransfer(typeID, 0, tokenID, _units); + } + + /** + * @dev Mints a new token with a new token type ID and assigns it to the specified account. + * @param _account The address of the account that will receive the new token. + * @param _fractions An array of values associated with the new token. + * @param _uri The URI for the metadata associated with the new token. + * @return typeID The new token type ID. + * @dev This function creates a new token type ID by calling the `_createTokenType` function and then mints a new + * token with the new type ID. + * @dev The `tokenID` is calculated by adding the `typeID` to the current maximum index for the `typeID`. + * @dev The `tokenValues` mapping is updated with the number of units associated with the new token. + * @dev A `ValueTransfer` event is emitted to indicate that a new token has been minted and assigned to the + * specified account. + * @dev If any of the fractional values in `_fractions` are zero, the function will revert with an error. + * @dev This function also calls the `_splitTokenUnits` function to split the new token into multiple sub-tokens + * with the specified fractional values. + */ + function _mintNewTypeWithTokens(address _account, uint256[] calldata _fractions, string memory _uri) + internal + returns (uint256 typeID) + { + typeID = _mintNewTypeWithToken(_account, _getSum(_fractions), _uri); + _splitTokenUnits(_account, typeID + maxIndex[typeID], _fractions); + } + + /** + * @dev Mints a new token with the specified token type ID and assigns it to the specified account. + * @param _account The address of the account that will receive the new token. + * @param _typeID The ID of the token type to mint. + * @param _units The number of units associated with the new token. + * @return tokenID The ID of the newly minted token. + * @dev This function checks that the specified token type ID is a base type and that the maximum number of tokens + * for the token type has not been reached. + * @dev The function then calculates the new token ID by adding the specified token type ID to the current maximum + * index for the token type. + * @dev The `tokenValues` mapping is updated with the number of units associated with the new token. + * @dev A `ValueTransfer` event is emitted to indicate that a new token has been minted and assigned to the + * specified account. + */ + function _mintToken(address _account, uint256 _typeID, uint256 _units) internal returns (uint256 tokenID) { + if (!isBaseType(_typeID)) revert Errors.NotAllowed(); + + _notMaxItem(maxIndex[_typeID]); + + unchecked { + tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data + } + + tokenValues[tokenID] = _units; + + _mint(_account, tokenID, 1, ""); + emit ValueTransfer(_typeID, 0, tokenID, _units); + } + + /** + * @dev Mints multiple tokens with the specified token type IDs and assigns them to the specified account. + * @param _account The address of the account that will receive the new tokens. + * @param _typeIDs An array of token type IDs to mint. + * @param _units An array of numbers of units associated with the new tokens. + * @return tokenIDs An array of the IDs of the newly minted tokens. + * @dev This function checks that each specified token type ID is a base type and that the maximum number of tokens + * for each token type has not been reached. + * @dev The function then calculates the new token IDs by adding the specified token type IDs to the current maximum + * index for each token type. + * @dev The `tokenValues` mapping is updated with the number of units associated with each new token. + * @dev A `BatchValueTransfer` event is emitted to indicate that new tokens have been minted and assigned to the + * specified account. + */ + function _batchMintTokens(address _account, uint256[] calldata _typeIDs, uint256[] calldata _units) + internal + returns (uint256[] memory tokenIDs) + { + uint256 len = _typeIDs.length; + + tokenIDs = new uint256[](len); + uint256[] memory amounts = new uint256[](len); + uint256[] memory zeroes = new uint256[](len); + + for (uint256 i; i < len;) { + uint256 _typeID = _typeIDs[i]; + if (!isBaseType(_typeID)) revert Errors.NotAllowed(); + _notMaxItem(maxIndex[_typeID]); + + unchecked { + uint256 tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data + tokenValues[tokenID] = _units[i]; + tokenIDs[i] = tokenID; + amounts[i] = 1; + ++i; + } + } + + _mintBatch(_account, tokenIDs, amounts, ""); + emit BatchValueTransfer(_typeIDs, zeroes, tokenIDs, _units); + } + + /** + * @dev Splits a token into multiple tokens with different unit values. + * @param _account The address of the account that will receive the new tokens. + * @param _tokenID The ID of the token to split. + * @param _values An array of numbers of units associated with the new tokens. + * @dev This function splits a token into multiple tokens with different unit values. + * @dev The `_values` array specifies the number of units associated with each new token. + * @dev The function checks that the length of the `_values` array is between 2 and `FRACTION_LIMIT`, and that the + * sum of the values in the `_values` array is equal to the number of units associated with the original token. + * @dev The function then creates new tokens with the specified unit values and assigns them to the specified + * account. + * @dev A `BatchValueTransfer` event is emitted to indicate that the original token has been split into multiple + * tokens. + */ + function _splitTokenUnits(address _account, uint256 _tokenID, uint256[] calldata _values) internal { + if (_values.length > FRACTION_LIMIT || _values.length < 2) revert Errors.ArraySize(); + if (tokenValues[_tokenID] != _getSum(_values)) revert Errors.NotAllowed(); + + // Current token + uint256 _typeID = getBaseType(_tokenID); + uint256 valueLeft = tokenValues[_tokenID]; + + // Prepare batch processing, we want to skip the first entry + uint256 len = _values.length - 1; + + uint256[] memory typeIDs = new uint256[](len); + uint256[] memory fromIDs = new uint256[](len); + uint256[] memory toIDs = new uint256[](len); + uint256[] memory amounts = new uint256[](len); + uint256[] memory values = new uint256[](len); + + { + uint256[] memory _valuesCache = _values; + uint256 swapValue = _valuesCache[len]; + _valuesCache[len] = _valuesCache[0]; + _valuesCache[0] = swapValue; + + for (uint256 i; i < len;) { + _notMaxItem(maxIndex[_typeID]); + + typeIDs[i] = _typeID; + fromIDs[i] = _tokenID; + toIDs[i] = _typeID + ++maxIndex[_typeID]; + amounts[i] = 1; + values[i] = _valuesCache[i]; + + unchecked { + ++i; + } + } + } + + _beforeUnitTransfer(_msgSender(), owners[_tokenID], fromIDs, toIDs, values, ""); + + for (uint256 i; i < len;) { + valueLeft -= values[i]; + + tokenValues[toIDs[i]] = values[i]; + + unchecked { + ++i; + } + } + + tokenValues[_tokenID] = valueLeft; + + _mintBatch(_account, toIDs, amounts, ""); + + emit BatchValueTransfer(typeIDs, fromIDs, toIDs, values); + } + + /** + * @dev Merges the units of multiple tokens into a single token. + * @param _account The address of the account that will receive the merged token. + * @param _fractionIDs An array of token IDs to merge. + * @dev This function merges the units of multiple tokens into a single token. + * @dev The `_fractionIDs` array specifies the IDs of the tokens to merge. + * @dev The function checks that the length of the `_fractionIDs` array is between 2 and `FRACTION_LIMIT`. + * @dev The function then calculates the total value of the merged token by summing the values of the tokens to be + * merged. + * @dev The `tokenValues` mapping is updated with the total value of the merged token. + * @dev The tokens to be merged are burned except the last one that receives all the units. + * @dev A `BatchValueTransfer` event is emitted to indicate that the tokens have been merged into a single token. + */ + function _mergeTokensUnits(address _account, uint256[] memory _fractionIDs) internal { + if (_fractionIDs.length > FRACTION_LIMIT || _fractionIDs.length < 2) { + revert Errors.ArraySize(); + } + uint256 len = _fractionIDs.length - 1; + + uint256 target = _fractionIDs[len]; + + uint256 _totalValue; + uint256[] memory fromIDs = new uint256[](len); + uint256[] memory toIDs = new uint256[](len); + uint256[] memory values = new uint256[](len); + uint256[] memory amounts = new uint256[](len); + + { + for (uint256 i; i < len;) { + uint256 _fractionID = _fractionIDs[i]; + fromIDs[i] = _fractionID; + toIDs[i] = target; + amounts[i] = 1; + values[i] = tokenValues[_fractionID]; + + unchecked { + ++i; + } + } + } + + _beforeUnitTransfer(_msgSender(), _account, fromIDs, toIDs, values, ""); + + for (uint256 i; i < len;) { + _totalValue += values[i]; + + delete tokenValues[fromIDs[i]]; + unchecked { + ++i; + } + } + + tokenValues[target] += _totalValue; + + _burnBatch(_account, fromIDs, amounts); + } + + /** + * @dev Burns a single token and emits a `ValueTransfer` event with a value of 0. + * @param _account The address of the account that owns the token to burn. + * @param _tokenID The ID of the token to burn. + * @dev This function burns a single token with the specified ID and emits a `ValueTransfer` event `toTokenID` 0. + * @dev The function checks that the caller is the owner of the token or is approved to burn the token on behalf of + * the owner. + * @dev The function then deletes the token from the `tokenValues` mapping and calls the `_burn` function to burn + * the token. + */ + function _burnToken(address _account, uint256 _tokenID) internal { + if (_account != _msgSender() && !isApprovedForAll(_account, _msgSender())) revert Errors.NotApprovedOrOwner(); + + uint256 value = tokenValues[_tokenID]; + + delete tokenValues[_tokenID]; + + _burn(_account, _tokenID, 1); + emit ValueTransfer(getBaseType(_tokenID), _tokenID, 0, value); + } + + /** + * @dev Burns multiple tokens and emits a `BatchValueTransfer` event with a value of 0 for each token burned. + * @param _account The address of the account that owns the tokens to burn. + * @param _tokenIDs An array of token IDs to burn. + * @dev This function burns multiple tokens with the specified IDs and emits a `BatchValueTransfer` event. + * @dev The function checks that the caller is the owner of the tokens or is approved to burn the tokens on behalf + * of the owner. + * @dev The function then deletes the tokens from the `tokenValues` mapping and calls the `_burnBatch` function to + * burn the tokens. + * @dev Finally, the function emits a `BatchValueTransfer` event with a value of 1 and `toTokenIDs` as 0 for each + * token burned to indicate that the tokens have been burned. + */ + function _batchBurnToken(address _account, uint256[] memory _tokenIDs) internal { + if (_account != _msgSender() && !isApprovedForAll(_account, _msgSender())) revert Errors.NotApprovedOrOwner(); + + uint256 len = _tokenIDs.length; + + // ERC115 requires values + uint256[] memory claimIDs = new uint256[](len); + uint256[] memory toTokens = new uint256[](len); + uint256[] memory claimUnits = new uint256[](len); + uint256[] memory values = new uint256[](len); + + for (uint256 i; i < len; i++) { + uint256 _tokenId = _tokenIDs[i]; + uint256 value = tokenValues[_tokenId]; + + delete tokenValues[_tokenId]; + + claimIDs[i] = getBaseType(_tokenId); + claimUnits[i] = value; + values[i] = 1; + } + + _burnBatch(_account, _tokenIDs, values); + emit BatchValueTransfer(claimIDs, _tokenIDs, toTokens, claimUnits); + } + + /// TRANSFERS + + // The following functions are overrides required by Solidity. + /** + * @dev Called after a token transfer has been completed. + * @param operator The address of the operator performing the transfer. + * @param from The address of the sender of the tokens. + * @param to The address of the recipient of the tokens. + * @param ids An array of token IDs that were transferred. + * @param amounts An array of token amounts that were transferred. + * @param data Additional data that was passed along with the transfer. + * @dev This function updates the `owners` mapping to reflect the new owner of each token that was transferred. + */ + function _afterTokenTransfer( + address operator, + address from, + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) internal virtual override { + super._afterTokenTransfer(operator, from, to, ids, amounts, data); + + uint256 len = ids.length; + + for (uint256 i; i < len;) { + owners[ids[i]] = to; + unchecked { + ++i; + } + } + } + + /** + * @dev Called before a batch of tokens is transferred. + * @param {operator} The address of the operator performing the transfer. + * @param from The address of the sender of the tokens. + * @param fromIDs An array of token IDs that are being transferred. + * @param toIDs An array of token IDs that the tokens are being transferred to. + * @param {values} An array of token amounts that are being transferred. + * @param {data} Additional data that was passed along with the transfer. + * @dev This function checks that the transfer is allowed by verifying that the sender is approved to transfer the + * tokens and that the tokens being transferred are of the same base type. + */ + function _beforeUnitTransfer( + address, /*operator*/ + address from, + uint256[] memory fromIDs, + uint256[] memory toIDs, + uint256[] memory, /*values*/ + bytes memory /*data*/ + ) internal virtual { + uint256 len = fromIDs.length; + + for (uint256 i; i < len;) { + uint256 _from = fromIDs[i]; + uint256 _to = toIDs[i]; + + if (isBaseType(_from)) revert Errors.NotAllowed(); + if (getBaseType(_from) != getBaseType(_to)) revert Errors.TypeMismatch(); + if (from != _msgSender() && !isApprovedForAll(from, _msgSender())) revert Errors.NotApprovedOrOwner(); + unchecked { + ++i; + } + } + } + + /// METADATA + + /** + * @dev Returns the metadata URI for a given token ID. + * @param tokenID The ID of the token to retrieve the metadata URI for. + * @return _uri The metadata URI for the specified token ID. + * @dev This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the + * `ERC1155URIStorageUpgradeable` contract. + * @dev The metadata URI is a string that points to a JSON file containing information about the token, such as its + * name, symbol, and image. + * @dev This function always returns the URI for the basetype so that it's managed in one place. + */ + function uri(uint256 tokenID) + public + view + virtual + override(ERC1155Upgradeable, ERC1155URIStorageUpgradeable) + returns (string memory _uri) + { + // All tokens share the same metadata at the moment + _uri = ERC1155URIStorageUpgradeable.uri(getBaseType(tokenID)); + } + + /// UTILS + + /** + * @dev Checks if the specified token ID is below the maximum item index. + * @param tokenID The ID of the token to check. + * @dev This function checks if the specified token ID is below the maximum item index by converting the token ID to + * a `uint128` value and incrementing it. + * @dev If the token ID is greater than or equal to the maximum item index, the function will revert with an error. + */ + function _notMaxItem(uint256 tokenID) private pure { + uint128 _count = uint128(tokenID); + ++_count; + } + + /** + * @dev Checks if the specified token ID is below the maximum type index. + * @param tokenID The ID of the token to check. + * @dev This function checks if the specified token ID is below the maximum type index by shifting the token ID + * right by 128 bits to get the type ID and converting it to a `uint128` value. + * @dev If the type ID is greater than or equal to the maximum type index, the function will revert with an error. + */ + function _notMaxType(uint256 tokenID) private pure { + uint128 _count = uint128(tokenID >> 128); + ++_count; + } + + /** + * @dev Calculates the sum of the elements of an array. + * @param array The array of uint256 values to sum. + * @return sum The sum of the elements of the array. + * @dev This function calculates the sum of the elements of the specified array by iterating over the array and + * adding each element to a running total. + * @dev If an element in the array is 0, the function will revert with an error. + */ + function _getSum(uint256[] memory array) internal pure returns (uint256 sum) { + uint256 len = array.length; + for (uint256 i; i < len;) { + if (array[i] == 0) revert Errors.NotAllowed(); + sum += array[i]; + unchecked { + ++i; + } + } + } + + /** + * @dev Returns an array containing a single element. + * @param element The element to include in the array. + * @return An array containing a single element. + * @dev This function returns an array containing a single element by creating a new array with a length of 1 and + * setting the first element to the specified value. + */ + function _getSingletonArray(uint256 element) private pure returns (uint256[] memory) { + uint256[] memory array = new uint256[](1); + array[0] = element; + + return array; + } + + // UUPS PROXY + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol } + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { + // solhint-disable-previous-line no-empty-blocks + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + * Assuming 30 available slots (slots cost space, cost gas) + * 1. typeCounter + * 2. owners + * 3. creators + * 4. tokenValues + * 5. maxIndex + */ + uint256[25] private __gap; +} diff --git a/contracts/contracts/interfaces/IAllowlist.sol b/contracts/src/protocol/interfaces/IAllowlist.sol similarity index 61% rename from contracts/contracts/interfaces/IAllowlist.sol rename to contracts/src/protocol/interfaces/IAllowlist.sol index fe4a9ec4..b4415d42 100644 --- a/contracts/contracts/interfaces/IAllowlist.sol +++ b/contracts/src/protocol/interfaces/IAllowlist.sol @@ -1,14 +1,13 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.16; +pragma solidity ^0.8.16; /// @title Interface for allowlist /// @author bitbeckers /// @notice This interface declares the required functionality for a hypercert token /// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) interface IAllowlist { - function isAllowedToClaim( - bytes32[] calldata proof, - uint256 tokenID, - bytes32 leaf - ) external view returns (bool isAllowed); + function isAllowedToClaim(bytes32[] calldata proof, uint256 tokenID, bytes32 leaf) + external + view + returns (bool isAllowed); } diff --git a/contracts/contracts/interfaces/IHypercertToken.sol b/contracts/src/protocol/interfaces/IHypercertToken.sol similarity index 99% rename from contracts/contracts/interfaces/IHypercertToken.sol rename to contracts/src/protocol/interfaces/IHypercertToken.sol index 1ed1e34e..ff280c2e 100644 --- a/contracts/contracts/interfaces/IHypercertToken.sol +++ b/contracts/src/protocol/interfaces/IHypercertToken.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.16; +pragma solidity ^0.8.16; /// @title Interface for hypercert token interactions /// @author bitbeckers diff --git a/contracts/contracts/libs/Errors.sol b/contracts/src/protocol/libs/Errors.sol similarity index 100% rename from contracts/contracts/libs/Errors.sol rename to contracts/src/protocol/libs/Errors.sol diff --git a/contracts/tasks/deploy.ts b/contracts/tasks/deploy.ts index 30927db5..28767a74 100644 --- a/contracts/tasks/deploy.ts +++ b/contracts/tasks/deploy.ts @@ -1,7 +1,7 @@ import { task } from "hardhat/config"; import { writeFile } from "node:fs/promises"; -task("deploy", "Deploy contracts and verify") +task("deploy-minter", "Deploy contracts and verify") .addOptionalParam("output", "write the details of the deployment to this file if this is set") .setAction(async ({ output }, { ethers, upgrades, network, run }) => { console.log("Using address: ", await ethers.getSigners().then((res) => res[0])); diff --git a/contracts/tasks/transfer-owner.ts b/contracts/tasks/transfer-owner.ts index 03421503..20c80c66 100644 --- a/contracts/tasks/transfer-owner.ts +++ b/contracts/tasks/transfer-owner.ts @@ -1,13 +1,13 @@ import { task } from "hardhat/config"; -task("transfer-owner", "Transfer ownership of ProxyAdmin contract") +task("transfer-owner-minter", "Transfer ownership of ProxyAdmin contract HypercertMinter") .addParam("proxy", "Proxy contract address") .addParam("owner", "Address of new owner") .setAction(async ({ proxy, owner }, { ethers, upgrades }) => { const HypercertMinter = await ethers.getContractFactory("HypercertMinter"); const hypercertMinter = await HypercertMinter.attach(proxy); - console.log('Transferring ownership of proxy contract...'); + console.log("Transferring ownership of proxy contract..."); const transferTransaction = await hypercertMinter.transferOwnership(owner); console.log("Sent transfer transaction, waiting for transaction receipt..."); @@ -27,5 +27,33 @@ task("transfer-owner", "Transfer ownership of ProxyAdmin contract") } console.log(`Successfully verified that the HypercertMinter contract was transferred. Contract address: ${proxy}`); - } -); + }); + +task("transfer-owner-trader", "Transfer ownership of ProxyAdmin contract HypercertTrader") + .addParam("proxy", "Proxy contract address") + .addParam("owner", "Address of new owner") + .setAction(async ({ proxy, owner }, { ethers, upgrades }) => { + const HypercertTrader = await ethers.getContractFactory("HypercertTrader"); + const hypercertTrader = await HypercertTrader.attach(proxy); + + console.log("Transferring ownership of proxy contract..."); + const transferTransaction = await hypercertTrader.transferOwnership(owner); + console.log("Sent transfer transaction, waiting for transaction receipt..."); + + const transferReceipt = await transferTransaction.wait(); + if (transferReceipt == null || transferReceipt.status == 0) { + console.error(transferReceipt); + console.error("Transaction failed, failed to transfer contract"); + return; + } + + console.log(`Transaction succeeded. Transaction Hash: ${transferReceipt.transactionHash}`); + + const newOwner = await hypercertTrader.owner(); + if (newOwner !== owner) { + console.error(`Verification failed: the contract is owned by ${newOwner}.`); + return; + } + + console.log(`Successfully verified that the HypercertTrader contract was transferred. Contract address: ${proxy}`); + }); diff --git a/contracts/tasks/upgrade.ts b/contracts/tasks/upgrade.ts index 9f547d43..082e36a4 100644 --- a/contracts/tasks/upgrade.ts +++ b/contracts/tasks/upgrade.ts @@ -3,7 +3,7 @@ import { task } from "hardhat/config"; /** * Used to upgrade a contract directly via local keys */ -task("upgrade", "Upgrade implementation contract and verify") +task("upgrade-minter", "Upgrade implementation contract of Minter and verify") .addParam("proxy", "Provider proxy address") .setAction(async ({ proxy }, { ethers, upgrades, run }) => { const HypercertMinter = await ethers.getContractFactory("HypercertMinter"); @@ -40,16 +40,77 @@ task("upgrade", "Upgrade implementation contract and verify") }); /** - * Used to propose a multi-sig upgrade via OpenZeppelin Defender + * Used to upgrade a contract directly via local keys */ -task("propose-upgrade", "Propose an upgrade to OpenZeppelin Defender") +task("upgrade-trader", "Upgrade implementation contract of Trader and verify") + .addParam("proxy", "Provider proxy address") + .setAction(async ({ proxy }, { ethers, upgrades, run }) => { + const HypercertTrader = await ethers.getContractFactory("HypercertTrader"); + + // Validate (redundant?) + console.log("Validating upgrade.."); + await upgrades.validateUpgrade(proxy, HypercertTrader).then(() => console.log("Valid upgrade. Deploying..")); + + // Upgrade + const hypercertTraderUpgrade = await upgrades.upgradeProxy(proxy, HypercertTrader, { + kind: "uups", + unsafeAllow: ["constructor"], + }); + await hypercertTraderUpgrade.deployed(); + console.log(`HypercertTrader at proxy address ${hypercertTraderUpgrade.address} was upgraded`); + + try { + const code = await hypercertTraderUpgrade.instance?.provider.getCode(hypercertTraderUpgrade.address); + if (code === "0x") { + console.log(`${hypercertTraderUpgrade.name} contract upgrade has not completed. waiting to verify...`); + await hypercertTraderUpgrade.instance?.deployed(); + } + await run("verify:verify", { + address: hypercertTraderUpgrade.address, + }); + } catch (error) { + const errorMessage = (error as Error).message; + if (errorMessage.includes("Reason: Already Verified")) { + console.log("Reason: Already Verified"); + } + console.error(errorMessage); + } + }); + +/** + * Used to propose a multi-sig upgrade via OpenZeppelin Defender for HypercertMinter + */ +task("propose-upgrade-minter", "Propose an upgrade to OpenZeppelin Defender") .addParam("proxy", "Proxy contract address") .addParam("multisig", "Owner multisig address") - .setAction(async ({ proxy, multisig }, { ethers, defender }) => { + .addOptionalParam("description", "Description of upgrade") + .setAction(async ({ proxy, multisig, description = "Upgrade Minter contract" }, { ethers, defender }) => { const HypercertMinter = await ethers.getContractFactory("HypercertMinter"); - console.log("Proposing upgrade.."); + console.log(`Proposing upgrade to multisig ${multisig} as address ${proxy}`); const proposal = await defender.proposeUpgrade(proxy, HypercertMinter, { + description, + multisig, + multisigType: "Gnosis Safe", + title: "Upgrade Minter contract", + }); + console.log("Upgrade proposal created at: ", proposal.url); + }); + +/** + * Used to propose a multi-sig upgrade via OpenZeppelin Defender for HypercertTrader + */ +task("propose-upgrade-trader", "Propose an upgrade to OpenZeppelin Defender") + .addParam("proxy", "Proxy contract address") + .addParam("multisig", "Owner multisig address") + .addOptionalParam("description", "Description of upgrade") + .setAction(async ({ proxy, multisig, description = "Upgrade Trader contract" }, { ethers, defender }) => { + const HypercertTrader = await ethers.getContractFactory("HypercertTrader"); + console.log(`Proposing upgrade to multisig ${multisig} as address ${proxy}`); + const proposal = await defender.proposeUpgrade(proxy, HypercertTrader, { + description, multisig, + multisigType: "Gnosis Safe", + title: "Upgrade Trader contract", }); console.log("Upgrade proposal created at: ", proposal.url); }); diff --git a/contracts/test/HypercertMinter.test.ts b/contracts/test/HypercertMinter.test.ts index 9cb0af6f..437b1fe4 100644 --- a/contracts/test/HypercertMinter.test.ts +++ b/contracts/test/HypercertMinter.test.ts @@ -1,16 +1,16 @@ -import { expect } from "chai"; import { ethers, upgrades } from "hardhat"; +import { expect } from "chai"; -import { HypercertMinter } from "../src/types"; - -describe("Hypercert Minter", function () { +describe("HypercertMinter", function () { it("is upgradeable", async () => { const HypercertMinter = await ethers.getContractFactory("HypercertMinter"); - const instance = await upgrades.deployProxy(HypercertMinter, { + const instance = await upgrades.deployProxy(HypercertMinter, { kind: "uups", unsafeAllow: ["constructor"], + useDefenderDeploy: false, }); + await instance.waitForDeployment(); const name = await instance.name(); expect(name).to.equal("HypercertMinter"); await expect(instance.initialize()).to.be.revertedWith("Initializable: contract is already initialized"); diff --git a/contracts/test/foundry/SemiFungible1155.burning.t.sol b/contracts/test/foundry/SemiFungible1155.burning.t.sol deleted file mode 100644 index e816d35f..00000000 --- a/contracts/test/foundry/SemiFungible1155.burning.t.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >=0.8.16; - -import { PRBTest } from "prb-test/PRBTest.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; -import { SemiFungible1155Helper } from "./SemiFungibleHelper.sol"; - -/// @dev See the "Writing Tests" section in the Foundry Book if this is your first time with Forge. -/// https://book.getfoundry.sh/forge/writing-tests -contract SemiFungible1155BurnTest is PRBTest, StdCheats, StdUtils, SemiFungible1155Helper { - SemiFungible1155Helper internal semiFungible; - string internal _uri; - address internal alice; - address internal bob; - - function setUp() public { - semiFungible = new SemiFungible1155Helper(); - _uri = "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi"; - alice = address(1); - bob = address(2); - } - - function testBurnFraction() public { - uint256 baseID = 1 << 128; - - uint256 size = 20; - uint256 value = 2000; - uint256[] memory values = semiFungible.buildValues(size, value); - uint256[] memory tokenIDs = semiFungible.buildIDs(baseID, size); - - startHoax(alice, 100 ether); - - semiFungible.mintValue(alice, values, _uri); - semiFungible.validateOwnerBalanceUnits(tokenIDs[1], alice, 1, values[1]); - - vm.expectEmit(true, true, true, true); - emit TransferSingle(alice, alice, address(0), tokenIDs[1], 1); - semiFungible.burnValue(alice, tokenIDs[1]); - - semiFungible.validateNotOwnerNoBalanceNoUnits(tokenIDs[1], alice); - } - - function testCannotBurnClaim() public { - uint256 size = 20; - uint256 value = 2000; - uint256[] memory values = semiFungible.buildValues(size, value); - - startHoax(alice, 100 ether); - - uint256 baseID = semiFungible.mintValue(alice, values, _uri); - - vm.expectRevert("ERC1155: burn amount exceeds balance"); - semiFungible.burnValue(alice, baseID); - } -} diff --git a/contracts/test/foundry/marketplace/BatchMakerCollectionOrders.t.sol b/contracts/test/foundry/marketplace/BatchMakerCollectionOrders.t.sol new file mode 100644 index 00000000..8810028b --- /dev/null +++ b/contracts/test/foundry/marketplace/BatchMakerCollectionOrders.t.sol @@ -0,0 +1,111 @@ +/// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Strategies +import {StrategyCollectionOffer} from "@hypercerts/marketplace/executionStrategies/StrategyCollectionOffer.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Helpers +import {EIP712MerkleTree} from "./utils/EIP712MerkleTree.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract BatchMakerCollectionOrdersTest is ProtocolBase { + StrategyCollectionOffer private strategy; + uint256 private constant price = 1 ether; // Fixed price of sale + EIP712MerkleTree private eip712MerkleTree; + + function setUp() public { + _setUp(); + + strategy = new StrategyCollectionOffer(); + vm.prank(_owner); + looksRareProtocol.addStrategy( + _standardProtocolFeeBp, + _minTotalFeeBp, + _maxProtocolFeeBp, + StrategyCollectionOffer.executeCollectionStrategyWithTakerAsk.selector, + true, + address(strategy) + ); + + _setUpUsers(); + eip712MerkleTree = new EIP712MerkleTree(looksRareProtocol); + } + + function testTakerAskMultipleOrdersSignedERC721(uint256 numberOrders) public { + vm.assume(numberOrders > 0 && numberOrders <= 10); + + mockERC721.batchMint(takerUser, numberOrders); + + OrderStructs.Maker[] memory makerBids = _createBatchMakerBids(numberOrders); + + (bytes memory signature,) = eip712MerkleTree.sign(makerUserPK, makerBids, 0); + + for (uint256 i; i < numberOrders; i++) { + // To prove that we only need 1 signature for multiple collection offers, + // we are not using the signature from the sign call in the loop. + (, OrderStructs.MerkleTree memory merkleTree) = eip712MerkleTree.sign(makerUserPK, makerBids, i); + + OrderStructs.Maker memory makerBidToExecute = makerBids[i]; + + // Verify validity + _assertValidMakerOrderWithMerkleTree(makerBidToExecute, signature, merkleTree); + + OrderStructs.Taker memory takerOrder = OrderStructs.Taker(takerUser, abi.encode(i)); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerOrder, makerBidToExecute, signature, merkleTree); + + // Maker user has received the asset + assertEq(mockERC721.ownerOf(i), makerUser); + + // Verify the nonce is marked as executed + assertEq( + looksRareProtocol.userOrderNonce(makerUser, makerBidToExecute.orderNonce), + MAGIC_VALUE_ORDER_NONCE_EXECUTED + ); + } + + uint256 totalValue = price * numberOrders; + assertEq( + weth.balanceOf(makerUser), _initialWETHBalanceUser - totalValue, "Maker bid user should pay the whole price" + ); + assertEq( + weth.balanceOf(takerUser), + _initialWETHBalanceUser + + (totalValue * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP, + "Taker ask user should receive 99.5% of the whole price (0.5% protocol)" + ); + } + + function _createBatchMakerBids(uint256 numberOrders) private view returns (OrderStructs.Maker[] memory makerBids) { + makerBids = new OrderStructs.Maker[](numberOrders); + for (uint256 i; i < numberOrders; i++) { + makerBids[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.ERC721, + orderNonce: i, // incremental + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 // Not used + }); + } + } +} diff --git a/contracts/test/foundry/marketplace/BatchMakerOrders.t.sol b/contracts/test/foundry/marketplace/BatchMakerOrders.t.sol new file mode 100644 index 00000000..35bb3570 --- /dev/null +++ b/contracts/test/foundry/marketplace/BatchMakerOrders.t.sol @@ -0,0 +1,333 @@ +/// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Murky (third-party) library is used to compute Merkle trees in Solidity +import {Merkle} from "murky/Merkle.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Errors and constants +import {MerkleProofTooLarge, MerkleProofInvalid} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import { + MERKLE_PROOF_PROOF_TOO_LARGE, + ORDER_HASH_PROOF_NOT_IN_MERKLE_TREE +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; +import { + ONE_HUNDRED_PERCENT_IN_BP, + MAX_CALLDATA_PROOF_LENGTH +} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Helpers +import {EIP712MerkleTree} from "./utils/EIP712MerkleTree.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract BatchMakerOrdersTest is ProtocolBase { + uint256 private constant price = 1.2222 ether; // Fixed price of sale + EIP712MerkleTree private eip712MerkleTree; + + function setUp() public { + _setUp(); + _setUpUsers(); + eip712MerkleTree = new EIP712MerkleTree(looksRareProtocol); + } + + function testTakerBidMultipleOrdersSignedERC721(uint256 numberOrders, uint256 orderIndex) public { + _assertMerkleTreeAssumptions(numberOrders, orderIndex); + + mockERC721.batchMint(makerUser, numberOrders); + + OrderStructs.Maker[] memory makerAsks = _createBatchMakerAsks(numberOrders); + + (bytes memory signature, OrderStructs.MerkleTree memory merkleTree) = + eip712MerkleTree.sign(makerUserPK, makerAsks, orderIndex); + + OrderStructs.Maker memory makerAskToExecute = makerAsks[orderIndex]; + + // Verify validity + _assertValidMakerOrderWithMerkleTree(makerAskToExecute, signature, merkleTree); + + // Execute taker bid transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(_genericTakerOrder(), makerAskToExecute, signature, merkleTree); + + // Taker user has received the asset + assertEq(mockERC721.ownerOf(orderIndex), takerUser); + // Taker bid user pays the whole price + assertEq(address(takerUser).balance, _initialETHBalanceUser - price); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + address(makerUser).balance, + _initialETHBalanceUser + (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // No leftover in the balance of the contract + assertEq(address(looksRareProtocol).balance, 0); + // Verify the nonce is marked as executed + assertEq( + looksRareProtocol.userOrderNonce(makerUser, makerAskToExecute.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED + ); + } + + function testTakerAskMultipleOrdersSignedERC721(uint256 numberOrders, uint256 orderIndex) public { + _assertMerkleTreeAssumptions(numberOrders, orderIndex); + + mockERC721.batchMint(takerUser, numberOrders); + + OrderStructs.Maker[] memory makerBids = _createBatchMakerBids(numberOrders); + + (bytes memory signature, OrderStructs.MerkleTree memory merkleTree) = + eip712MerkleTree.sign(makerUserPK, makerBids, orderIndex); + + OrderStructs.Maker memory makerBidToExecute = makerBids[orderIndex]; + + // Verify validity + _assertValidMakerOrderWithMerkleTree(makerBidToExecute, signature, merkleTree); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(_genericTakerOrder(), makerBidToExecute, signature, merkleTree); + + // Maker user has received the asset + assertEq(mockERC721.ownerOf(orderIndex), makerUser); + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - price); + // Taker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + weth.balanceOf(takerUser), + _initialWETHBalanceUser + (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Verify the nonce is marked as executed + assertEq( + looksRareProtocol.userOrderNonce(makerUser, makerBidToExecute.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED + ); + } + + function testTakerBidMultipleOrdersSignedERC721MerkleProofInvalid(uint256 numberOrders, uint256 orderIndex) + public + { + _assertMerkleTreeAssumptions(numberOrders, orderIndex); + + mockERC721.batchMint(makerUser, numberOrders); + + OrderStructs.Maker[] memory makerAsks = _createBatchMakerAsks(numberOrders); + + (bytes memory signature, OrderStructs.MerkleTree memory merkleTree) = + eip712MerkleTree.sign(makerUserPK, makerAsks, orderIndex); + + bytes32 tamperedRoot = bytes32(uint256(merkleTree.root) + 1); + merkleTree.root = tamperedRoot; + + OrderStructs.Maker memory makerAskToExecute = makerAsks[orderIndex]; + + // Verify invalidity of maker ask order + _assertMakerOrderReturnValidationCodeWithMerkleTree( + makerAskToExecute, signature, merkleTree, ORDER_HASH_PROOF_NOT_IN_MERKLE_TREE + ); + + vm.prank(takerUser); + vm.expectRevert(MerkleProofInvalid.selector); + looksRareProtocol.executeTakerBid{value: price}(_genericTakerOrder(), makerAskToExecute, signature, merkleTree); + } + + function testTakerAskMultipleOrdersSignedERC721MerkleProofInvalid(uint256 numberOrders, uint256 orderIndex) + public + { + _assertMerkleTreeAssumptions(numberOrders, orderIndex); + + mockERC721.batchMint(takerUser, numberOrders); + + OrderStructs.Maker[] memory makerBids = _createBatchMakerBids(numberOrders); + + (bytes memory signature, OrderStructs.MerkleTree memory merkleTree) = + eip712MerkleTree.sign(makerUserPK, makerBids, orderIndex); + + bytes32 tamperedRoot = bytes32(uint256(merkleTree.root) + 1); + merkleTree.root = tamperedRoot; + + OrderStructs.Maker memory makerBidToExecute = makerBids[orderIndex]; + + // Verify invalidity of maker bid order + _assertMakerOrderReturnValidationCodeWithMerkleTree( + makerBidToExecute, signature, merkleTree, ORDER_HASH_PROOF_NOT_IN_MERKLE_TREE + ); + + vm.prank(takerUser); + vm.expectRevert(MerkleProofInvalid.selector); + looksRareProtocol.executeTakerAsk(_genericTakerOrder(), makerBidToExecute, signature, merkleTree); + } + + function testTakerBidMultipleOrdersSignedERC721MerkleProofWrongPosition(uint256 numberOrders, uint256 orderIndex) + public + { + _assertMerkleTreeAssumptions(numberOrders, orderIndex); + + mockERC721.batchMint(makerUser, numberOrders); + + OrderStructs.Maker[] memory makerAsks = _createBatchMakerAsks(numberOrders); + + (bytes memory signature, OrderStructs.MerkleTree memory merkleTree) = + eip712MerkleTree.sign(makerUserPK, makerAsks, orderIndex); + + // Swap every node's position + OrderStructs.MerkleTreeNode[] memory proof = merkleTree.proof; + for (uint256 i; i < proof.length; i++) { + if (proof[i].position == OrderStructs.MerkleTreeNodePosition.Left) { + proof[i].position = OrderStructs.MerkleTreeNodePosition.Right; + } else { + proof[i].position = OrderStructs.MerkleTreeNodePosition.Left; + } + } + + OrderStructs.Maker memory makerAskToExecute = makerAsks[orderIndex]; + + // Verify invalidity of maker ask order + _assertMakerOrderReturnValidationCodeWithMerkleTree( + makerAskToExecute, signature, merkleTree, ORDER_HASH_PROOF_NOT_IN_MERKLE_TREE + ); + + vm.prank(takerUser); + vm.expectRevert(MerkleProofInvalid.selector); + looksRareProtocol.executeTakerBid{value: price}(_genericTakerOrder(), makerAskToExecute, signature, merkleTree); + } + + function testTakerAskMultipleOrdersSignedERC721MerkleProofWrongPosition(uint256 numberOrders, uint256 orderIndex) + public + { + _assertMerkleTreeAssumptions(numberOrders, orderIndex); + + mockERC721.batchMint(takerUser, numberOrders); + + OrderStructs.Maker[] memory makerBids = _createBatchMakerBids(numberOrders); + + (bytes memory signature, OrderStructs.MerkleTree memory merkleTree) = + eip712MerkleTree.sign(makerUserPK, makerBids, orderIndex); + + // Swap every node's position + OrderStructs.MerkleTreeNode[] memory proof = merkleTree.proof; + for (uint256 i; i < proof.length; i++) { + if (proof[i].position == OrderStructs.MerkleTreeNodePosition.Left) { + proof[i].position = OrderStructs.MerkleTreeNodePosition.Right; + } else { + proof[i].position = OrderStructs.MerkleTreeNodePosition.Left; + } + } + + OrderStructs.Maker memory makerBidToExecute = makerBids[orderIndex]; + + // Verify invalidity of maker bid order + _assertMakerOrderReturnValidationCodeWithMerkleTree( + makerBidToExecute, signature, merkleTree, ORDER_HASH_PROOF_NOT_IN_MERKLE_TREE + ); + + vm.prank(takerUser); + vm.expectRevert(MerkleProofInvalid.selector); + looksRareProtocol.executeTakerAsk(_genericTakerOrder(), makerBidToExecute, signature, merkleTree); + } + + function testTakerBidRevertsIfProofTooLarge() public { + uint256 testProofLengthUpTo = MAX_CALLDATA_PROOF_LENGTH + 3; + mockERC721.batchMint(makerUser, 2 ** testProofLengthUpTo); + + // Keep it reasonably large + for (uint256 proofLength = MAX_CALLDATA_PROOF_LENGTH + 1; proofLength <= testProofLengthUpTo; proofLength++) { + uint256 numberOrders = 2 ** proofLength; + uint256 orderIndex = numberOrders - 1; + + OrderStructs.Maker[] memory makerAsks = _createBatchMakerAsks(numberOrders); + + (bytes memory signature, OrderStructs.MerkleTree memory merkleTree) = + eip712MerkleTree.sign(makerUserPK, makerAsks, orderIndex); + + OrderStructs.Maker memory makerAskToExecute = makerAsks[orderIndex]; + + // Verify validity + _assertMakerOrderReturnValidationCodeWithMerkleTree( + makerAskToExecute, signature, merkleTree, MERKLE_PROOF_PROOF_TOO_LARGE + ); + + vm.prank(takerUser); + vm.expectRevert(abi.encodeWithSelector(MerkleProofTooLarge.selector, proofLength)); + looksRareProtocol.executeTakerBid{value: price}( + _genericTakerOrder(), makerAskToExecute, signature, merkleTree + ); + } + } + + function testTakerAskRevertsIfProofTooLarge() public { + uint256 testProofLengthUpTo = MAX_CALLDATA_PROOF_LENGTH + 3; + mockERC721.batchMint(takerUser, 2 ** testProofLengthUpTo); + + // Keep it reasonably large + for (uint256 proofLength = MAX_CALLDATA_PROOF_LENGTH + 1; proofLength <= testProofLengthUpTo; proofLength++) { + uint256 numberOrders = 2 ** proofLength; + uint256 orderIndex = numberOrders - 1; + + OrderStructs.Maker[] memory makerBids = _createBatchMakerBids(numberOrders); + + (bytes memory signature, OrderStructs.MerkleTree memory merkleTree) = + eip712MerkleTree.sign(makerUserPK, makerBids, orderIndex); + + OrderStructs.Maker memory makerBidToExecute = makerBids[orderIndex]; + + // Verify validity + _assertMakerOrderReturnValidationCodeWithMerkleTree( + makerBidToExecute, signature, merkleTree, MERKLE_PROOF_PROOF_TOO_LARGE + ); + + vm.prank(takerUser); + vm.expectRevert(abi.encodeWithSelector(MerkleProofTooLarge.selector, proofLength)); + looksRareProtocol.executeTakerBid{value: price}( + _genericTakerOrder(), makerBidToExecute, signature, merkleTree + ); + } + } + + function _createBatchMakerAsks(uint256 numberOrders) private view returns (OrderStructs.Maker[] memory makerAsks) { + makerAsks = new OrderStructs.Maker[](numberOrders); + for (uint256 i; i < numberOrders; i++) { + makerAsks[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: i, // incremental + collection: address(mockERC721), + currency: ETH, + signer: makerUser, + price: price, + itemId: i + }); + } + } + + function _createBatchMakerBids(uint256 numberOrders) private view returns (OrderStructs.Maker[] memory makerBids) { + makerBids = new OrderStructs.Maker[](numberOrders); + for (uint256 i; i < numberOrders; i++) { + makerBids[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: i, // incremental + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: i + }); + } + } + + function _assertMerkleTreeAssumptions(uint256 numberOrders, uint256 orderIndex) private pure { + vm.assume(numberOrders > 0 && numberOrders <= 2 ** MAX_CALLDATA_PROOF_LENGTH); + vm.assume(orderIndex < numberOrders); + } +} diff --git a/contracts/test/foundry/marketplace/BatchOrderTypehashRegistry.t.sol b/contracts/test/foundry/marketplace/BatchOrderTypehashRegistry.t.sol new file mode 100644 index 00000000..e44c2af4 --- /dev/null +++ b/contracts/test/foundry/marketplace/BatchOrderTypehashRegistry.t.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +import {BatchOrderTypehashRegistry} from "@hypercerts/marketplace/BatchOrderTypehashRegistry.sol"; + +// Shared errors +import {MerkleProofTooLarge} from "@hypercerts/marketplace/errors/SharedErrors.sol"; + +contract BatchOrderTypehashRegistryInheriter is BatchOrderTypehashRegistry { + function getBatchOrderTypehash(uint256 height) external pure returns (bytes32 typehash) { + return _getBatchOrderTypehash(height); + } +} + +contract BatchOrderTypehashRegistryTest is Test { + function testHash() public { + BatchOrderTypehashRegistryInheriter registry = new BatchOrderTypehashRegistryInheriter(); + bytes32 root = hex"6942000000000000000000000000000000000000000000000000000000000000"; + assertEq( + registry.hashBatchOrder(root, 1), hex"8f0c85a215cff55fe39cf62ee7a1e0b5205a8ade02ff12ffee9ece02d626ffc3" + ); + assertEq( + registry.hashBatchOrder(root, 2), hex"f04a7d8a4688cf084b00b51ed583de7e5a19e59b073635e00a45a474899e89ec" + ); + assertEq( + registry.hashBatchOrder(root, 3), hex"56ef3bb8c564d19cfe494776934aa5e7ed84c41ae609d5f10e726f76281dd30b" + ); + assertEq( + registry.hashBatchOrder(root, 4), hex"2b0cb021eacab73e36d9ac9a04c1cf58589ff5bb4dc0d9b88ec29f67358ca812" + ); + assertEq( + registry.hashBatchOrder(root, 5), hex"253b3cc8d591a8b01fc8967cefe3ac3d0e078b884d96aa589f1ffd4536921bbb" + ); + assertEq( + registry.hashBatchOrder(root, 6), hex"7e4c4a2c5806fc4765bca325e8b78ccf9633bd1c7643144a56210293daefcbca" + ); + assertEq( + registry.hashBatchOrder(root, 7), hex"e8e39cebe7137f0fadf6b88ba611044ac79c0168444eab66ca53bddd0c5fb717" + ); + assertEq( + registry.hashBatchOrder(root, 8), hex"6e02f123509255ed381c7552de5e2ac1c1ea401a23e026e2452f01b70564affb" + ); + assertEq( + registry.hashBatchOrder(root, 9), hex"7eeb4a7fe4655841fdd66f8ecfcf6cd261d50eafabbaebb10f63f5fe84ddddc9" + ); + assertEq( + registry.hashBatchOrder(root, 10), hex"a96dee8b7b88deda5d50b55f641ca08c1ee00825eeb1db7a324f392fa0b8bb83" + ); + } + + function testGetTypehash() public { + BatchOrderTypehashRegistryInheriter registry = new BatchOrderTypehashRegistryInheriter(); + bytes memory makerOrderString = bytes( + "Maker(" "uint8 quoteType," "uint256 globalNonce," "uint256 subsetNonce," "uint256 orderNonce," + "uint256 strategyId," "uint8 collectionType," "address collection," "address currency," "address signer," + "uint256 startTime," "uint256 endTime," "uint256 price," "uint256[] itemIds," "uint256[] amounts," + "bytes additionalParameters" ")" + ); + + assertEq( + registry.getBatchOrderTypehash(1), + keccak256(bytes.concat(bytes("BatchOrder(Maker[2] tree)"), makerOrderString)) + ); + + assertEq( + registry.getBatchOrderTypehash(2), + keccak256(bytes.concat(bytes("BatchOrder(Maker[2][2] tree)"), makerOrderString)) + ); + + assertEq( + registry.getBatchOrderTypehash(3), + keccak256(bytes.concat(bytes("BatchOrder(Maker[2][2][2] tree)"), makerOrderString)) + ); + + assertEq( + registry.getBatchOrderTypehash(4), + keccak256(bytes.concat(bytes("BatchOrder(Maker[2][2][2][2] tree)"), makerOrderString)) + ); + + assertEq( + registry.getBatchOrderTypehash(5), + keccak256(bytes.concat(bytes("BatchOrder(Maker[2][2][2][2][2] tree)"), makerOrderString)) + ); + + assertEq( + registry.getBatchOrderTypehash(6), + keccak256(bytes.concat(bytes("BatchOrder(Maker[2][2][2][2][2][2] tree)"), makerOrderString)) + ); + + assertEq( + registry.getBatchOrderTypehash(7), + keccak256(bytes.concat(bytes("BatchOrder(Maker[2][2][2][2][2][2][2] tree)"), makerOrderString)) + ); + + assertEq( + registry.getBatchOrderTypehash(8), + keccak256(bytes.concat(bytes("BatchOrder(Maker[2][2][2][2][2][2][2][2] tree)"), makerOrderString)) + ); + + assertEq( + registry.getBatchOrderTypehash(9), + keccak256(bytes.concat(bytes("BatchOrder(Maker[2][2][2][2][2][2][2][2][2] tree)"), makerOrderString)) + ); + + assertEq( + registry.getBatchOrderTypehash(10), + keccak256(bytes.concat(bytes("BatchOrder(Maker[2][2][2][2][2][2][2][2][2][2] tree)"), makerOrderString)) + ); + } + + function testGetTypehashMerkleProofTooLarge(uint256 height) public { + vm.assume(height > 10); + + BatchOrderTypehashRegistryInheriter registry = new BatchOrderTypehashRegistryInheriter(); + vm.expectRevert(abi.encodeWithSelector(MerkleProofTooLarge.selector, height)); + registry.getBatchOrderTypehash(height); + } +} diff --git a/contracts/test/foundry/marketplace/BundleTransactions.t.sol b/contracts/test/foundry/marketplace/BundleTransactions.t.sol new file mode 100644 index 00000000..62ffccf9 --- /dev/null +++ b/contracts/test/foundry/marketplace/BundleTransactions.t.sol @@ -0,0 +1,260 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Other tests +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +contract BundleTransactionsTest is ProtocolBase { + function setUp() public { + _setUp(); + } + + function testTakerAskERC721BundleNoRoyalties() public { + _setUpUsers(); + uint256 numberItemsInBundle = 5; + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAskWithBundle(address(mockERC721), address(weth), numberItemsInBundle); + + // Sign the order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Verify validity + _assertValidMakerOrder(makerBid, signature); + + // Mint the items + mockERC721.batchMint(takerUser, makerBid.itemIds); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertMockERC721Ownership(makerBid.itemIds, makerUser); + + _assertSuccessfulTakerAskNoRoyalties(makerBid); + } + + function testTakerAskERC1155BundleNoRoyalties() public { + _setUpUsers(); + uint256 numberItemsInBundle = 5; + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAskWithBundle(address(mockERC1155), address(weth), numberItemsInBundle); + + // Sign the order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Verify validity + _assertValidMakerOrder(makerBid, signature); + + // Mint the items + mockERC1155.batchMint(takerUser, makerBid.itemIds, makerBid.amounts); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + for (uint256 i; i < makerBid.itemIds.length; i++) { + // Maker user has received all the assets in the bundle + assertEq(mockERC1155.balanceOf(makerUser, makerBid.itemIds[i]), makerBid.amounts[i]); + } + + _assertSuccessfulTakerAskNoRoyalties(makerBid); + } + + function testTakerAskERC721BundleWithRoyaltiesFromRegistry() public { + _setUpUsers(); + _setupRegistryRoyalties(address(mockERC721), _standardRoyaltyFee); + uint256 numberItemsInBundle = 5; + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAskWithBundle(address(mockERC721), address(weth), numberItemsInBundle); + + uint256 price = makerBid.price; + + // Sign the order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Verify validity + _assertValidMakerOrder(makerBid, signature); + + // Mint the items + mockERC721.batchMint(takerUser, makerBid.itemIds); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertMockERC721Ownership(makerBid.itemIds, makerUser); + + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - price); + // Royalty recipient receives royalties + assertEq( + weth.balanceOf(_royaltyRecipient), + _initialWETHBalanceRoyaltyRecipient + (price * _standardRoyaltyFee) / ONE_HUNDRED_PERCENT_IN_BP + ); + assertEq( + weth.balanceOf(address(protocolFeeRecipient)), + (price * _standardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP, + "ProtocolFeeRecipient should receive protocol fee" + ); + // Taker ask user receives 99.5% of the whole price + assertEq( + weth.balanceOf(takerUser), + _initialWETHBalanceUser + (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + function testTakerBidERC721BundleNoRoyalties() public { + _setUpUsers(); + uint256 numberItemsInBundle = 5; + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBidWithBundle(address(mockERC721), numberItemsInBundle); + + uint256 price = makerAsk.price; + + // Mint the items and sign the order + mockERC721.batchMint(makerUser, makerAsk.itemIds); + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker bid transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertMockERC721Ownership(makerAsk.itemIds, takerUser); + + _assertSuccessfulTakerBidNoRoyalties(makerAsk); + } + + function testTakerBidERC1155BundleNoRoyalties() public { + _setUpUsers(); + uint256 numberItemsInBundle = 5; + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBidWithBundle(address(mockERC1155), numberItemsInBundle); + + uint256 price = makerAsk.price; + + // Mint the items and sign the order + mockERC1155.batchMint(makerUser, makerAsk.itemIds, makerAsk.amounts); + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker bid transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + for (uint256 i; i < makerAsk.itemIds.length; i++) { + // Taker user has received all the assets in the bundle + assertEq(mockERC1155.balanceOf(takerUser, makerAsk.itemIds[i]), makerAsk.amounts[i]); + } + + _assertSuccessfulTakerBidNoRoyalties(makerAsk); + } + + function testTakerBidERC721BundleWithRoyaltiesFromRegistry() public { + _setUpUsers(); + _setupRegistryRoyalties(address(mockERC721), _standardRoyaltyFee); + uint256 numberItemsInBundle = 5; + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBidWithBundle(address(mockERC721), numberItemsInBundle); + + uint256 price = makerAsk.price; + + // Mint the items and sign the order + mockERC721.batchMint(makerUser, makerAsk.itemIds); + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker bid transaction + vm.prank(takerUser); + + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertMockERC721Ownership(makerAsk.itemIds, takerUser); + + // Taker bid user pays the whole price + assertEq(address(takerUser).balance, _initialETHBalanceUser - price); + // Royalty recipient receives the royalties + assertEq( + address(_royaltyRecipient).balance, + _initialETHBalanceRoyaltyRecipient + (price * _standardRoyaltyFee) / ONE_HUNDRED_PERCENT_IN_BP + ); + assertEq( + address(protocolFeeRecipient).balance, + (price * _standardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP, + "ProtocolFeeRecipient should receive protocol fee" + ); + // Maker ask user receives 99.5% of the whole price + assertEq( + address(makerUser).balance, + _initialETHBalanceUser + (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // No leftover in the balance of the contract + assertEq(address(looksRareProtocol).balance, 0); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + function _assertSuccessfulTakerAskNoRoyalties(OrderStructs.Maker memory makerBid) private { + uint256 price = makerBid.price; + + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - price); + // Royalty recipient receives no royalty + assertEq(weth.balanceOf(_royaltyRecipient), _initialWETHBalanceRoyaltyRecipient); + assertEq( + weth.balanceOf(address(protocolFeeRecipient)), + (price * _minTotalFeeBp) / ONE_HUNDRED_PERCENT_IN_BP, + "ProtocolFeeRecipient should receive protocol fee" + ); + // Taker ask user receives 99.5% of the whole price (no royalties are paid) + assertEq( + weth.balanceOf(takerUser), + _initialWETHBalanceUser + (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + function _assertSuccessfulTakerBidNoRoyalties(OrderStructs.Maker memory makerAsk) private { + uint256 price = makerAsk.price; + + // Taker bid user pays the whole price + assertEq(address(takerUser).balance, _initialETHBalanceUser - price); + // Royalty recipient receives no royalty + assertEq(address(_royaltyRecipient).balance, _initialETHBalanceRoyaltyRecipient); + assertEq( + address(protocolFeeRecipient).balance, + (price * _minTotalFeeBp) / ONE_HUNDRED_PERCENT_IN_BP, + "ProtocolFeeRecipient should receive protocol fee" + ); + // Maker ask user receives 99.5% of the whole price (no royalties are paid) + assertEq( + address(makerUser).balance, + _initialETHBalanceUser + (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // No leftover in the balance of the contract + assertEq(address(looksRareProtocol).balance, 0); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } +} diff --git a/contracts/test/foundry/marketplace/CreatorFeeManagerWithRebates.t.sol b/contracts/test/foundry/marketplace/CreatorFeeManagerWithRebates.t.sol new file mode 100644 index 00000000..93a552db --- /dev/null +++ b/contracts/test/foundry/marketplace/CreatorFeeManagerWithRebates.t.sol @@ -0,0 +1,233 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {IERC721} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC721.sol"; + +import {CreatorFeeManagerWithRebates} from "@hypercerts/marketplace/CreatorFeeManagerWithRebates.sol"; + +// Libraries and interfaces +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {ICreatorFeeManager} from "@hypercerts/marketplace/interfaces/ICreatorFeeManager.sol"; +import {IExecutionManager} from "@hypercerts/marketplace/interfaces/IExecutionManager.sol"; + +// Shared errors +import {BUNDLE_ERC2981_NOT_SUPPORTED} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +contract CreatorFeeManagerWithRebatesTest is ProtocolBase { + function setUp() public { + _setUp(); + CreatorFeeManagerWithRebates creatorFeeManager = new CreatorFeeManagerWithRebates(address(royaltyFeeRegistry)); + vm.prank(_owner); + looksRareProtocol.updateCreatorFeeManager(address(creatorFeeManager)); + orderValidator.deriveProtocolParameters(); + } + + function _setUpRoyaltiesRegistry(uint256 fee) private { + vm.prank(_owner); + royaltyFeeRegistry.updateRoyaltyInfoForCollection( + address(mockERC721), _royaltyRecipient, _royaltyRecipient, fee + ); + } + + function _testCreatorFeeRebatesArePaid(address erc721) private { + _setUpUsers(); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(erc721, address(weth)); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + if (erc721 == address(mockERC721)) { + // Adjust royalties + _setUpRoyaltiesRegistry(_standardRoyaltyFee); + // Mint asset + mockERC721.mint(takerUser, makerBid.itemIds[0]); + } else if (erc721 == address(mockERC721WithRoyalties)) { + // Adjust ERC721 with royalties + mockERC721WithRoyalties.addCustomRoyaltyInformationForTokenId( + makerBid.itemIds[0], _royaltyRecipient, _standardRoyaltyFee + ); + // Mint asset + mockERC721WithRoyalties.mint(takerUser, makerBid.itemIds[0]); + } + + _assertValidMakerOrder(makerBid, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Verify ownership is transferred + assertEq(IERC721(erc721).ownerOf(makerBid.itemIds[0]), makerUser); + _assertSuccessfulTakerAsk(makerBid); + } + + function _testCreatorFeeRebatesArePaidForBundles(address erc721) private { + _setUpUsers(); + _setUpRoyaltiesRegistry(_standardRoyaltyFee); + + // Parameters + uint256 numberItemsInBundle = 5; + + // Create order + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAskWithBundle(erc721, address(weth), numberItemsInBundle); + + if (erc721 == address(mockERC721)) { + // Adjust royalties + _setUpRoyaltiesRegistry(_standardRoyaltyFee); + // Mint the items + mockERC721.batchMint(takerUser, makerBid.itemIds); + } else if (erc721 == address(mockERC721WithRoyalties)) { + // Adjust ERC721 with royalties + for (uint256 i; i < makerBid.itemIds.length; i++) { + mockERC721WithRoyalties.addCustomRoyaltyInformationForTokenId( + makerBid.itemIds[i], _royaltyRecipient, _standardRoyaltyFee + ); + } + // Mint the items + mockERC721WithRoyalties.batchMint(takerUser, makerBid.itemIds); + } + + // Sign the order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertValidMakerOrder(makerBid, signature); + + // Taker user actions + vm.prank(takerUser); + + // Execute taker ask transaction + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Verify ownership is transferred + for (uint256 i; i < makerBid.itemIds.length; i++) { + // Maker user has received all the assets in the bundle + assertEq(IERC721(erc721).ownerOf(makerBid.itemIds[i]), makerUser); + } + _assertSuccessfulTakerAsk(makerBid); + } + + function testCreatorRebatesArePaidForRoyaltyFeeManager() public { + _testCreatorFeeRebatesArePaid(address(mockERC721)); + } + + function testCreatorRebatesArePaidForERC2981() public { + _testCreatorFeeRebatesArePaid(address(mockERC721WithRoyalties)); + } + + function testCreatorRebatesArePaidForRoyaltyFeeManagerWithBundles() public { + _testCreatorFeeRebatesArePaidForBundles(address(mockERC721)); + } + + function testCreatorRoyaltiesGetPaidForERC2981WithBundles() public { + _testCreatorFeeRebatesArePaidForBundles(address(mockERC721WithRoyalties)); + } + + function testCreatorRoyaltiesRevertForEIP2981WithBundlesIfInfoDiffer() public { + _setUpUsers(); + + uint256 numberItemsInBundle = 5; + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAskWithBundle(address(mockERC721WithRoyalties), address(weth), numberItemsInBundle); + + // Sign the order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint the items + mockERC721WithRoyalties.batchMint(takerUser, makerBid.itemIds); + + _assertValidMakerOrder(makerBid, signature); + + /** + * Different recipient + */ + + // Adjust ERC721 with royalties + for (uint256 i; i < makerBid.itemIds.length; i++) { + mockERC721WithRoyalties.addCustomRoyaltyInformationForTokenId( + makerBid.itemIds[i], i == 0 ? _royaltyRecipient : address(50), 50 + ); + } + + _assertMakerOrderReturnValidationCode(makerBid, signature, BUNDLE_ERC2981_NOT_SUPPORTED); + + vm.prank(takerUser); + vm.expectRevert( + abi.encodeWithSelector( + ICreatorFeeManager.BundleEIP2981NotAllowed.selector, address(mockERC721WithRoyalties) + ) + ); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testCreatorRoyaltiesRevertForEIP2981WithBundlesIfAtLeastOneCallReverts(uint256 revertIndex) public { + _setUpUsers(); + + uint256 numberItemsInBundle = 5; + vm.assume(revertIndex < numberItemsInBundle); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAskWithBundle(address(mockERC721WithRoyalties), address(weth), numberItemsInBundle); + + // Sign the order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint the items + mockERC721WithRoyalties.batchMint(takerUser, makerBid.itemIds); + + _assertValidMakerOrder(makerBid, signature); + + // Adjust ERC721 with royalties + for (uint256 i; i < makerBid.itemIds.length; i++) { + mockERC721WithRoyalties.addCustomRoyaltyInformationForTokenId( + makerBid.itemIds[i], + _royaltyRecipient, + // if greater than 10,000, will revert in royaltyInfo + i == revertIndex ? 10_001 : 50 + ); + } + + _assertMakerOrderReturnValidationCode(makerBid, signature, BUNDLE_ERC2981_NOT_SUPPORTED); + + vm.prank(takerUser); + vm.expectRevert( + abi.encodeWithSelector( + ICreatorFeeManager.BundleEIP2981NotAllowed.selector, address(mockERC721WithRoyalties) + ) + ); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function _assertSuccessfulTakerAsk(OrderStructs.Maker memory makerBid) private { + uint256 price = makerBid.price; + + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - price); + assertEq( + weth.balanceOf(address(protocolFeeRecipient)), + (price * _standardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP, + "Protocol fee recipient should receive 0.5% of the whole price" + ); + assertEq( + weth.balanceOf(takerUser), + _initialWETHBalanceUser + (price * 9900) / ONE_HUNDRED_PERCENT_IN_BP, + "Taker ask user should receive 99% of the whole price" + ); + assertEq( + weth.balanceOf(_royaltyRecipient), + _initialWETHBalanceRoyaltyRecipient + (price * 50) / ONE_HUNDRED_PERCENT_IN_BP, + "Royalty recipient receives 0.5% of the whole price" + ); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } +} diff --git a/contracts/test/foundry/marketplace/CreatorFeeManagerWithRoyalties.t.sol b/contracts/test/foundry/marketplace/CreatorFeeManagerWithRoyalties.t.sol new file mode 100644 index 00000000..3ba84222 --- /dev/null +++ b/contracts/test/foundry/marketplace/CreatorFeeManagerWithRoyalties.t.sol @@ -0,0 +1,350 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries and interfaces +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {ICreatorFeeManager} from "@hypercerts/marketplace/interfaces/ICreatorFeeManager.sol"; +import {IExecutionManager} from "@hypercerts/marketplace/interfaces/IExecutionManager.sol"; + +// Core contract +import {CreatorFeeManagerWithRoyalties} from "@hypercerts/marketplace/CreatorFeeManagerWithRoyalties.sol"; + +// Shared errors +import { + BUNDLE_ERC2981_NOT_SUPPORTED, + CREATOR_FEE_TOO_HIGH +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +contract CreatorFeeManagerWithRoyaltiesTest is ProtocolBase { + CreatorFeeManagerWithRoyalties public creatorFeeManagerWithRoyalties; + + // New protocol fee + uint16 internal constant _newProtocolFee = 200; + + // New creator royalty fee + uint256 internal constant _newCreatorRoyaltyFee = 300; + + function _setUpRoyaltiesRegistry(uint256 fee) internal { + vm.prank(_owner); + royaltyFeeRegistry.updateRoyaltyInfoForCollection( + address(mockERC721), _royaltyRecipient, _royaltyRecipient, fee + ); + } + + function setUp() public { + _setUp(); + creatorFeeManagerWithRoyalties = new CreatorFeeManagerWithRoyalties(address(royaltyFeeRegistry)); + vm.startPrank(_owner); + looksRareProtocol.updateCreatorFeeManager(address(creatorFeeManagerWithRoyalties)); + // Set up 2% as protocol fee, which is now equal to minimum fee + looksRareProtocol.updateStrategy(0, true, _newProtocolFee, _newProtocolFee); + vm.stopPrank(); + + // Adjust for new creator fee manager + orderValidator.deriveProtocolParameters(); + } + + function testCreatorRoyaltiesGetPaidForRoyaltyFeeManager() public { + _setUpUsers(); + + // Adjust royalties + _setUpRoyaltiesRegistry(_newCreatorRoyaltyFee); + + (OrderStructs.Maker memory makerBid,) = _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint asset + mockERC721.mint(takerUser, makerBid.itemIds[0]); + + _assertValidMakerOrder(makerBid, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(_genericTakerOrder(), makerBid, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockERC721.ownerOf(makerBid.itemIds[0]), makerUser); + _assertSuccessfulTakerAsk(makerBid); + } + + function testCreatorRoyaltiesGetPaidForERC2981() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerBid,) = + _createMockMakerBidAndTakerAsk(address(mockERC721WithRoyalties), address(weth)); + + // Adjust ERC721 with royalties + mockERC721WithRoyalties.addCustomRoyaltyInformationForTokenId( + makerBid.itemIds[0], _royaltyRecipient, _newCreatorRoyaltyFee + ); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint asset + mockERC721WithRoyalties.mint(takerUser, makerBid.itemIds[0]); + + _assertValidMakerOrder(makerBid, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(_genericTakerOrder(), makerBid, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockERC721WithRoyalties.ownerOf(makerBid.itemIds[0]), makerUser); + _assertSuccessfulTakerAsk(makerBid); + } + + function testCreatorRoyaltiesGetPaidForRoyaltyFeeManagerWithBundles() public { + _setUpUsers(); + + // Adjust royalties + _setUpRoyaltiesRegistry(_newCreatorRoyaltyFee); + + uint256 numberItemsInBundle = 5; + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAskWithBundle(address(mockERC721), address(weth), numberItemsInBundle); + + // Sign the order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint the items + mockERC721.batchMint(takerUser, makerBid.itemIds); + + // Check order validity + _assertValidMakerOrder(makerBid, signature); + + // Taker user actions + vm.prank(takerUser); + + // Execute taker ask transaction + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertMockERC721Ownership(makerBid.itemIds, makerUser); + + _assertSuccessfulTakerAskBundle(makerBid); + } + + function testCreatorRoyaltiesGetPaidForERC2981WithBundles() public { + _setUpUsers(); + + uint256 numberItemsInBundle = 5; + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAskWithBundle(address(mockERC721WithRoyalties), address(weth), numberItemsInBundle); + + // Sign the order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint the items + mockERC721WithRoyalties.batchMint(takerUser, makerBid.itemIds); + + // Adjust ERC721 with royalties + for (uint256 i; i < makerBid.itemIds.length; i++) { + mockERC721WithRoyalties.addCustomRoyaltyInformationForTokenId( + makerBid.itemIds[i], _royaltyRecipient, _newCreatorRoyaltyFee + ); + } + + _assertValidMakerOrder(makerBid, signature); + + // Taker user actions + vm.prank(takerUser); + + // Execute taker ask transaction + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerAskBundle(makerBid); + } + + function testCreatorRoyaltiesRevertForEIP2981WithBundlesIfInfoDiffer() public { + _setUpUsers(); + + uint256 numberItemsInBundle = 5; + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAskWithBundle(address(mockERC721WithRoyalties), address(weth), numberItemsInBundle); + + // Sign the order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint the items + mockERC721WithRoyalties.batchMint(takerUser, makerBid.itemIds); + + /** + * 1. Different fee structure but same recipient + */ + + // Adjust ERC721 with royalties + for (uint256 i; i < makerBid.itemIds.length; i++) { + mockERC721WithRoyalties.addCustomRoyaltyInformationForTokenId( + makerBid.itemIds[i], + _royaltyRecipient, + _newCreatorRoyaltyFee - i // It is not equal + ); + } + + _assertMakerOrderReturnValidationCode(makerBid, signature, BUNDLE_ERC2981_NOT_SUPPORTED); + + // Taker user action should revert + vm.prank(takerUser); + vm.expectRevert( + abi.encodeWithSelector( + ICreatorFeeManager.BundleEIP2981NotAllowed.selector, address(mockERC721WithRoyalties) + ) + ); + + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + /** + * 2. Same fee structure but different recipient + */ + // Adjust ERC721 with royalties + for (uint256 i; i < makerBid.itemIds.length; i++) { + mockERC721WithRoyalties.addCustomRoyaltyInformationForTokenId( + makerBid.itemIds[i], i == 0 ? _royaltyRecipient : address(50), _newCreatorRoyaltyFee + ); + } + + _assertMakerOrderReturnValidationCode(makerBid, signature, BUNDLE_ERC2981_NOT_SUPPORTED); + + vm.prank(takerUser); + vm.expectRevert( + abi.encodeWithSelector( + ICreatorFeeManager.BundleEIP2981NotAllowed.selector, address(mockERC721WithRoyalties) + ) + ); + + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testCreatorRoyaltiesRevertForEIP2981WithBundlesIfAtLeastOneCallReverts(uint256 revertIndex) public { + _setUpUsers(); + + uint256 numberItemsInBundle = 5; + vm.assume(revertIndex < numberItemsInBundle); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAskWithBundle(address(mockERC721WithRoyalties), address(weth), numberItemsInBundle); + + // Sign the order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint the items + mockERC721WithRoyalties.batchMint(takerUser, makerBid.itemIds); + + // Adjust ERC721 with royalties + for (uint256 i; i < makerBid.itemIds.length; i++) { + mockERC721WithRoyalties.addCustomRoyaltyInformationForTokenId( + makerBid.itemIds[i], + _royaltyRecipient, + // if greater than 10,000, will revert in royaltyInfo + i == revertIndex ? 10_001 : _newCreatorRoyaltyFee + ); + } + + _assertMakerOrderReturnValidationCode(makerBid, signature, BUNDLE_ERC2981_NOT_SUPPORTED); + + // Taker user action should revert + vm.prank(takerUser); + vm.expectRevert( + abi.encodeWithSelector( + ICreatorFeeManager.BundleEIP2981NotAllowed.selector, address(mockERC721WithRoyalties) + ) + ); + + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testCreatorRoyaltiesRevertIfFeeHigherThanLimit() public { + _setUpUsers(); + uint256 _creatorRoyaltyFeeTooHigh = looksRareProtocol.maxCreatorFeeBp() + 1; + + // Adjust royalties + _setUpRoyaltiesRegistry(_creatorRoyaltyFeeTooHigh); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint asset + mockERC721.mint(takerUser, makerBid.itemIds[0]); + + _assertMakerOrderReturnValidationCode(makerBid, signature, CREATOR_FEE_TOO_HIGH); + + vm.expectRevert(IExecutionManager.CreatorFeeBpTooHigh.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // 2. Maker ask + + // Mint asset + mockERC721.mint(makerUser, 1); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + // The itemId changes as it is already minted before + makerAsk.itemIds[0] = 1; + + signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, CREATOR_FEE_TOO_HIGH); + + vm.expectRevert(IExecutionManager.CreatorFeeBpTooHigh.selector); + vm.prank(takerUser); + + looksRareProtocol.executeTakerBid{value: 1 ether}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function _assertSuccessfulTakerAsk(OrderStructs.Maker memory makerBid) private { + uint256 price = makerBid.price; + + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - price); + assertEq( + weth.balanceOf(address(protocolFeeRecipient)), + (price * _newProtocolFee) / ONE_HUNDRED_PERCENT_IN_BP, + "ProtocolFeeRecipient should receive 2% of the whole price" + ); + // Taker ask user receives 95% of the whole price + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser + (price * 9500) / ONE_HUNDRED_PERCENT_IN_BP); + // Royalty recipient receives 3% of the whole price + assertEq( + weth.balanceOf(_royaltyRecipient), + _initialWETHBalanceRoyaltyRecipient + (price * _newCreatorRoyaltyFee) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + function _assertSuccessfulTakerAskBundle(OrderStructs.Maker memory makerBid) private { + uint256 price = makerBid.price; + + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - price); + // Royalty recipient receives royalties + assertEq( + weth.balanceOf(_royaltyRecipient), + _initialWETHBalanceRoyaltyRecipient + (price * _newCreatorRoyaltyFee) / ONE_HUNDRED_PERCENT_IN_BP + ); + assertEq( + weth.balanceOf(address(protocolFeeRecipient)), + (price * _newProtocolFee) / ONE_HUNDRED_PERCENT_IN_BP, + "ProtocolFeeRecipient should receive protocol fee" + ); + // Taker ask user receives 95% of the whole price + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser + (price * 9500) / ONE_HUNDRED_PERCENT_IN_BP); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } +} diff --git a/contracts/test/foundry/marketplace/CurrencyManager.t.sol b/contracts/test/foundry/marketplace/CurrencyManager.t.sol new file mode 100644 index 00000000..8c410dca --- /dev/null +++ b/contracts/test/foundry/marketplace/CurrencyManager.t.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {IOwnableTwoSteps} from "@looksrare/contracts-libs/contracts/interfaces/IOwnableTwoSteps.sol"; + +// Core contracts +import {CurrencyManager, ICurrencyManager} from "@hypercerts/marketplace/CurrencyManager.sol"; + +// Other mocks and utils +import {TestHelpers} from "./utils/TestHelpers.sol"; +import {TestParameters} from "./utils/TestParameters.sol"; +import {MockERC20} from "../../mock/MockERC20.sol"; + +contract CurrencyManagerTest is TestHelpers, TestParameters, ICurrencyManager { + CurrencyManager private currencyManager; + MockERC20 private mockERC20; + + function setUp() public asPrankedUser(_owner) { + currencyManager = new CurrencyManager(_owner); + mockERC20 = new MockERC20(); + } + + function testUpdateCurrencyStatus() public asPrankedUser(_owner) { + // Set to true + vm.expectEmit(true, false, false, true); + emit CurrencyStatusUpdated(address(mockERC20), true); + currencyManager.updateCurrencyStatus(address(mockERC20), true); + assertTrue(currencyManager.isCurrencyAllowed(address(mockERC20))); + + // Set to false + vm.expectEmit(true, false, false, true); + emit CurrencyStatusUpdated(address(mockERC20), false); + currencyManager.updateCurrencyStatus(address(mockERC20), false); + assertFalse(currencyManager.isCurrencyAllowed(address(mockERC20))); + } + + function testUpdateCurrencyStatusNotOwner() public { + vm.expectRevert(IOwnableTwoSteps.NotOwner.selector); + currencyManager.updateCurrencyStatus(address(mockERC20), true); + } +} diff --git a/contracts/test/foundry/marketplace/DelegationRecipientsTaker.t.sol b/contracts/test/foundry/marketplace/DelegationRecipientsTaker.t.sol new file mode 100644 index 00000000..ea5e6445 --- /dev/null +++ b/contracts/test/foundry/marketplace/DelegationRecipientsTaker.t.sol @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries and interfaces +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {CreatorFeeManagerWithRoyalties} from "@hypercerts/marketplace/CreatorFeeManagerWithRoyalties.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +contract DelegationRecipientsTakerTest is ProtocolBase { + function setUp() public { + _setUp(); + CreatorFeeManagerWithRoyalties creatorFeeManager = new CreatorFeeManagerWithRoyalties( + address(royaltyFeeRegistry) + ); + vm.prank(_owner); + looksRareProtocol.updateCreatorFeeManager(address(creatorFeeManager)); + } + + // Fixed price of sale + uint256 private constant price = 1 ether; + + /** + * One ERC721 is sold through a taker ask using WETH and the proceeds of the sale goes to a random recipient. + */ + function testTakerAskERC721WithRoyaltiesFromRegistryWithDelegation() public { + _setUpUsers(); + _setupRegistryRoyalties(address(mockERC721), _standardRoyaltyFee); + address randomRecipientSaleProceeds = address(420); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint asset + mockERC721.mint(takerUser, makerBid.itemIds[0]); + + // Adjust recipient + takerAsk.recipient = randomRecipientSaleProceeds; + + // Verify maker bid order + _assertValidMakerOrder(makerBid, signature); + + // Arrays for events + address[2] memory expectedRecipients; + expectedRecipients[0] = randomRecipientSaleProceeds; + expectedRecipients[1] = _royaltyRecipient; + + uint256[3] memory expectedFees; + expectedFees[2] = (price * _standardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + expectedFees[1] = (price * _standardRoyaltyFee) / ONE_HUNDRED_PERCENT_IN_BP; + expectedFees[0] = price - (expectedFees[1] + expectedFees[2]); + + vm.prank(takerUser); + vm.expectEmit(true, false, false, true); + + emit TakerAsk( + NonceInvalidationParameters({ + orderHash: _computeOrderHash(makerBid), + orderNonce: makerBid.orderNonce, + isNonceInvalidated: true + }), + takerUser, + makerUser, + makerBid.strategyId, + makerBid.currency, + makerBid.collection, + makerBid.itemIds, + makerBid.amounts, + expectedRecipients, + expectedFees + ); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockERC721.ownerOf(makerBid.itemIds[0]), makerUser); + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - price); + // Random recipient user receives 99.5% of the whole price and taker user receives nothing. + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser); + assertEq( + weth.balanceOf(randomRecipientSaleProceeds), + (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Royalty recipient receives 0.5% of the whole price + assertEq( + weth.balanceOf(_royaltyRecipient), + _initialWETHBalanceRoyaltyRecipient + (price * _standardRoyaltyFee) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + /** + * One ERC721 is sold through a taker bid and the NFT transfer goes to a random recipient. + */ + function testTakerBidERC721WithRoyaltiesFromRegistryWithDelegation() public { + address randomRecipientNFT = address(420); + + _setUpUsers(); + _setupRegistryRoyalties(address(mockERC721), _standardRoyaltyFee); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + + // Mint asset + mockERC721.mint(makerUser, makerAsk.itemIds[0]); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Adjust recipient to random recipient + takerBid.recipient = randomRecipientNFT; + + // Verify validity of maker ask order + _assertValidMakerOrder(makerAsk, signature); + + // Arrays for events + address[2] memory expectedRecipients; + expectedRecipients[0] = makerUser; + expectedRecipients[1] = _royaltyRecipient; + + uint256[3] memory expectedFees; + expectedFees[0] = price - (expectedFees[1] + expectedFees[0]); + expectedFees[1] = (price * _standardRoyaltyFee) / ONE_HUNDRED_PERCENT_IN_BP; + expectedFees[2] = (price * _standardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + + vm.prank(takerUser); + + emit TakerBid( + NonceInvalidationParameters({ + orderHash: _computeOrderHash(makerAsk), + orderNonce: makerAsk.orderNonce, + isNonceInvalidated: true + }), + takerUser, + randomRecipientNFT, + makerAsk.strategyId, + makerAsk.currency, + makerAsk.collection, + makerAsk.itemIds, + makerAsk.amounts, + expectedRecipients, + expectedFees + ); + + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Random recipient user has received the asset + assertEq(mockERC721.ownerOf(makerAsk.itemIds[0]), randomRecipientNFT); + // Taker bid user pays the whole price + assertEq(address(takerUser).balance, _initialETHBalanceUser - price); + // Maker ask user receives 99.5% of the whole price + assertEq( + address(makerUser).balance, + _initialETHBalanceUser + (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Royalty recipient receives 0.5% of the whole price + assertEq( + address(_royaltyRecipient).balance, + _initialETHBalanceRoyaltyRecipient + (price * _standardRoyaltyFee) / ONE_HUNDRED_PERCENT_IN_BP + ); + // No leftover in the balance of the contract + assertEq(address(looksRareProtocol).balance, 0); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } +} diff --git a/contracts/test/foundry/marketplace/DomainSeparatorUpdates.t.sol b/contracts/test/foundry/marketplace/DomainSeparatorUpdates.t.sol new file mode 100644 index 00000000..c1ed9701 --- /dev/null +++ b/contracts/test/foundry/marketplace/DomainSeparatorUpdates.t.sol @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {IOwnableTwoSteps} from "@looksrare/contracts-libs/contracts/interfaces/IOwnableTwoSteps.sol"; +import {SignatureEOAInvalid} from "@looksrare/contracts-libs/contracts/errors/SignatureCheckerErrors.sol"; + +// Libraries and interfaces +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {ILooksRareProtocol} from "@hypercerts/marketplace/interfaces/ILooksRareProtocol.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +contract DomainSeparatorUpdatesTest is ProtocolBase { + function setUp() public { + _setUp(); + } + + function testUpdateDomainSeparator(uint64 newChainId) public asPrankedUser(_owner) { + vm.assume(newChainId != block.chainid); + + vm.chainId(newChainId); + vm.expectEmit(true, false, false, true); + emit NewDomainSeparator(); + looksRareProtocol.updateDomainSeparator(); + assertEq(looksRareProtocol.chainId(), newChainId); + assertEq( + looksRareProtocol.domainSeparator(), + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256("LooksRareProtocol"), + keccak256(bytes("2")), + newChainId, + address(looksRareProtocol) + ) + ) + ); + } + + function testCannotTradeIfDomainSeparatorHasBeenUpdated(uint64 newChainId) public { + vm.assume(newChainId != block.chainid); + + _setUpUsers(); + + // ChainId update + vm.chainId(newChainId); + + // Owner updates the domain separator + vm.prank(_owner); + looksRareProtocol.updateDomainSeparator(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Mint asset + mockERC721.mint(makerUser, makerAsk.itemIds[0]); + + vm.prank(takerUser); + vm.expectRevert(SignatureEOAInvalid.selector); + looksRareProtocol.executeTakerBid{value: makerAsk.price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testCannotTradeIfChainIdHasChanged(uint64 newChainId) public { + vm.assume(newChainId != block.chainid); + + _setUpUsers(); + + // ChainId update + vm.chainId(newChainId); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Mint asset + mockERC721.mint(makerUser, makerAsk.itemIds[0]); + + vm.prank(takerUser); + vm.expectRevert(ILooksRareProtocol.ChainIdInvalid.selector); + looksRareProtocol.executeTakerBid{value: makerAsk.price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testUpdateDomainSeparatorSameDomainSeparator() public asPrankedUser(_owner) { + vm.expectRevert(SameDomainSeparator.selector); + looksRareProtocol.updateDomainSeparator(); + } + + function testUpdateDomainSeparatorNotOwner() public { + vm.expectRevert(IOwnableTwoSteps.NotOwner.selector); + looksRareProtocol.updateDomainSeparator(); + } +} diff --git a/contracts/test/foundry/marketplace/ExecutionManager.t.sol b/contracts/test/foundry/marketplace/ExecutionManager.t.sol new file mode 100644 index 00000000..b330d91a --- /dev/null +++ b/contracts/test/foundry/marketplace/ExecutionManager.t.sol @@ -0,0 +1,282 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {IOwnableTwoSteps} from "@looksrare/contracts-libs/contracts/interfaces/IOwnableTwoSteps.sol"; + +// Libraries and interfaces +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {IExecutionManager} from "@hypercerts/marketplace/interfaces/IExecutionManager.sol"; +import {IStrategyManager} from "@hypercerts/marketplace/interfaces/IStrategyManager.sol"; + +// Shared errors +import {OrderInvalid} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import { + MAKER_ORDER_INVALID_STANDARD_SALE, + STRATEGY_INVALID_QUOTE_TYPE, + STRATEGY_INVALID_QUOTE_TYPE, + STRATEGY_NOT_ACTIVE, + START_TIME_GREATER_THAN_END_TIME, + TOO_LATE_TO_EXECUTE_ORDER, + TOO_EARLY_TO_EXECUTE_ORDER +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +contract ExecutionManagerTest is ProtocolBase, IExecutionManager, IStrategyManager { + function setUp() public { + _setUp(); + } + + function testUpdateCreatorFeeManager() public asPrankedUser(_owner) { + vm.expectEmit(true, false, false, true); + emit NewCreatorFeeManager(address(1)); + looksRareProtocol.updateCreatorFeeManager(address(1)); + assertEq(address(looksRareProtocol.creatorFeeManager()), address(1)); + } + + function testUpdateCreatorFeeManagerNotOwner() public { + vm.expectRevert(IOwnableTwoSteps.NotOwner.selector); + looksRareProtocol.updateCreatorFeeManager(address(1)); + } + + function testUpdateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) public asPrankedUser(_owner) { + vm.assume(newMaxCreatorFeeBp <= 2500); + vm.expectEmit(true, false, false, true); + emit NewMaxCreatorFeeBp(newMaxCreatorFeeBp); + looksRareProtocol.updateMaxCreatorFeeBp(newMaxCreatorFeeBp); + assertEq(looksRareProtocol.maxCreatorFeeBp(), newMaxCreatorFeeBp); + } + + function testUpdateMaxCreatorFeeBpNotOwner() public { + vm.expectRevert(IOwnableTwoSteps.NotOwner.selector); + looksRareProtocol.updateMaxCreatorFeeBp(uint16(2500)); + } + + function testUpdateMaxCreatorFeeBpTooHigh(uint16 newMaxCreatorFeeBp) public asPrankedUser(_owner) { + vm.assume(newMaxCreatorFeeBp > 2500); + vm.expectRevert(CreatorFeeBpTooHigh.selector); + looksRareProtocol.updateMaxCreatorFeeBp(newMaxCreatorFeeBp); + } + + function testUpdateProtocolFeeRecipient() public asPrankedUser(_owner) { + vm.expectEmit(true, false, false, true); + emit NewProtocolFeeRecipient(address(1)); + looksRareProtocol.updateProtocolFeeRecipient(address(1)); + assertEq(looksRareProtocol.protocolFeeRecipient(), address(1)); + } + + function testUpdateProtocolFeeRecipientCannotBeNullAddress() public asPrankedUser(_owner) { + vm.expectRevert(IExecutionManager.NewProtocolFeeRecipientCannotBeNullAddress.selector); + looksRareProtocol.updateProtocolFeeRecipient(address(0)); + } + + function testUpdateProtocolFeeRecipientNotOwner() public { + vm.expectRevert(IOwnableTwoSteps.NotOwner.selector); + looksRareProtocol.updateProtocolFeeRecipient(address(1)); + } + + function testCannotValidateOrderIfTooEarlyToExecute(uint256 timestamp) public asPrankedUser(takerUser) { + // 300 because because it is deducted by 5 minutes + 1 second + vm.assume(timestamp > 300 && timestamp < type(uint256).max); + // Change timestamp to avoid underflow issues + vm.warp(timestamp); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + makerBid.startTime = block.timestamp; + makerBid.endTime = block.timestamp + 1 seconds; + + // Maker bid is valid if its start time is within 5 minutes into the future + vm.warp(makerBid.startTime - 5 minutes); + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + _assertMakerOrderReturnValidationCode(makerBid, signature, TOO_EARLY_TO_EXECUTE_ORDER); + + // Maker bid is invalid if its start time is not within 5 minutes into the future + vm.warp(makerBid.startTime - 5 minutes - 1 seconds); + vm.expectRevert(OutsideOfTimeRange.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testCannotValidateOrderIfTooLateToExecute(uint256 timestamp) public asPrankedUser(takerUser) { + vm.assume(timestamp > 0 && timestamp < type(uint256).max); + // Change timestamp to avoid underflow issues + vm.warp(timestamp); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + makerBid.startTime = block.timestamp - 1 seconds; + makerBid.endTime = block.timestamp; + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + vm.warp(block.timestamp); + _assertMakerOrderReturnValidationCode(makerBid, signature, TOO_LATE_TO_EXECUTE_ORDER); + + vm.warp(block.timestamp + 1 seconds); + vm.expectRevert(OutsideOfTimeRange.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testCannotValidateOrderIfStartTimeLaterThanEndTime(uint256 timestamp) public asPrankedUser(takerUser) { + vm.assume(timestamp < type(uint256).max); + // Change timestamp to avoid underflow issues + vm.warp(timestamp); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + makerBid.startTime = block.timestamp + 1 seconds; + makerBid.endTime = block.timestamp; + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerBid, signature, START_TIME_GREATER_THAN_END_TIME); + + vm.expectRevert(OutsideOfTimeRange.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testCannotValidateOrderIfMakerBidItemIdsIsEmpty() public { + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + uint256[] memory itemIds = new uint256[](0); + makerBid.itemIds = itemIds; + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_INVALID_STANDARD_SALE); + + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testCannotValidateOrderIfMakerBidItemIdsLengthMismatch(uint256 makerBidItemIdsLength) + public + asPrankedUser(takerUser) + { + vm.assume(makerBidItemIdsLength > 1 && makerBidItemIdsLength < 100_000); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + uint256[] memory itemIds = new uint256[](makerBidItemIdsLength); + makerBid.itemIds = itemIds; + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_INVALID_STANDARD_SALE); + + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testCannotValidateOrderIfMakerAskItemIdsIsEmpty() public asPrankedUser(takerUser) { + vm.deal(takerUser, 100 ether); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + + // Change maker itemIds array to make its length equal to 0 + uint256[] memory itemIds = new uint256[](0); + makerAsk.itemIds = itemIds; + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_INVALID_STANDARD_SALE); + + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid{value: makerAsk.price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testCannotValidateOrderIfMakerAskItemIdsLengthMismatch(uint256 makerAskItemIdsLength) + public + asPrankedUser(takerUser) + { + vm.deal(takerUser, 100 ether); + + vm.assume(makerAskItemIdsLength > 1 && makerAskItemIdsLength < 100_000); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + + uint256[] memory itemIds = new uint256[](makerAskItemIdsLength); + makerAsk.itemIds = itemIds; + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_INVALID_STANDARD_SALE); + + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid{value: makerAsk.price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + // TODO check is we need this test and replace the chainlink floor strategy + // function testCannotExecuteTransactionIfMakerBidWithStrategyForMakerAsk() public { + // _setUpUsers(); + + // vm.prank(_owner); + // StrategyChainlinkFloor strategy = new StrategyChainlinkFloor(_owner, address(weth)); + + // bool isMakerBid = true; + // vm.prank(_owner); + // looksRareProtocol.addStrategy( + // 250, + // 250, + // 300, + // StrategyChainlinkFloor.executeBasisPointsDiscountCollectionOfferStrategyWithTakerAsk.selector, + // isMakerBid, + // address(strategy) + // ); + + // (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + // _createMockMakerAskAndTakerBid(address(mockERC721)); + // makerAsk.strategyId = 1; // Fake strategy + + // bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // // Mint asset + // mockERC721.mint(makerUser, makerAsk.itemIds[0]); + + // _assertMakerOrderReturnValidationCode(makerAsk, signature, STRATEGY_INVALID_QUOTE_TYPE); + + // vm.prank(takerUser); + // vm.expectRevert(IExecutionManager.NoSelectorForStrategy.selector); + // looksRareProtocol.executeTakerBid{value: makerAsk.price}( + // takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE + // ); + // } + + // TODO check is we need this test and replace the chainlink floor strategy + // function testCannotExecuteTransactionIfMakerAskWithStrategyForMakerBid() public { + // _setUpUsers(); + + // vm.prank(_owner); + // StrategyChainlinkFloor strategy = new StrategyChainlinkFloor(_owner, address(weth)); + + // bool isMakerBid = false; + // vm.prank(_owner); + // // All parameters are random, including the selector and the implementation + // looksRareProtocol.addStrategy( + // 250, + // 250, + // 300, + // StrategyChainlinkFloor.executeFixedPremiumStrategyWithTakerBid.selector, + // isMakerBid, + // address(strategy) + // ); + + // (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + // _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + // makerBid.strategyId = 1; // Fake strategy + + // bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // // Mint asset to ask user + // mockERC721.mint(takerUser, makerBid.itemIds[0]); + + // _assertMakerOrderReturnValidationCode(makerBid, signature, STRATEGY_INVALID_QUOTE_TYPE); + + // vm.prank(takerUser); + // vm.expectRevert(IExecutionManager.NoSelectorForStrategy.selector); + // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + // } +} diff --git a/contracts/test/foundry/marketplace/GasGriefing.t.sol b/contracts/test/foundry/marketplace/GasGriefing.t.sol new file mode 100644 index 00000000..b973ddff --- /dev/null +++ b/contracts/test/foundry/marketplace/GasGriefing.t.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries and interfaces +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {WETH} from "solmate/src/tokens/WETH.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Mocks and other utils +import {GasGriefer} from "./utils/GasGriefer.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract GasGriefingTest is ProtocolBase { + uint256 private constant price = 1 ether; // Fixed price of sale + address private gasGriefer; + + // WETH events + event Deposit(address indexed from, uint256 amount); + event Transfer(address indexed from, address indexed to, uint256 amount); + + function setUp() public { + _setUp(); + gasGriefer = address(new GasGriefer()); + _setUpUser(gasGriefer); + _setUpUser(takerUser); + } + + function testTakerBidGasGriefing() public { + _setupRegistryRoyalties(address(mockERC721), _standardRoyaltyFee); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + makerAsk.signer = gasGriefer; + + // Mint asset + mockERC721.mint(gasGriefer, makerAsk.itemIds[0]); + + bytes memory signature; + + uint256 sellerProceed = (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + + vm.expectEmit(true, true, false, true); + emit Deposit(address(looksRareProtocol), sellerProceed); + + vm.expectEmit(true, true, true, true); + emit Transfer(address(looksRareProtocol), gasGriefer, sellerProceed); + + vm.prank(takerUser); + // Execute taker bid transaction + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockERC721.ownerOf(makerAsk.itemIds[0]), takerUser); + // Taker bid user pays the whole price + assertEq(address(takerUser).balance, _initialETHBalanceUser - price); + // Maker ask user receives 99.5% of the whole price + assertEq(weth.balanceOf(gasGriefer), _initialWETHBalanceUser + sellerProceed); + // Royalty recipient receives 0.5% of the whole price + assertEq( + address(_royaltyRecipient).balance, + _initialETHBalanceRoyaltyRecipient + (price * _standardRoyaltyFee) / ONE_HUNDRED_PERCENT_IN_BP + ); + // No leftover in the balance of the contract + assertEq(address(looksRareProtocol).balance, 0); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(gasGriefer, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + function testThreeTakerBidsGasGriefing() public { + uint256 numberPurchases = 3; + + OrderStructs.Maker[] memory makerAsks = new OrderStructs.Maker[](numberPurchases); + OrderStructs.Taker[] memory takerBids = new OrderStructs.Taker[](numberPurchases); + bytes[] memory signatures = new bytes[](numberPurchases); + + for (uint256 i; i < numberPurchases; i++) { + // Mint asset + mockERC721.mint(gasGriefer, i); + + makerAsks[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: i, + collection: address(mockERC721), + currency: ETH, + signer: gasGriefer, + price: price, // Fixed + itemId: i // (0, 1, etc.) + }); + + takerBids[i] = _genericTakerOrder(); + } + + // Other execution parameters + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](numberPurchases); + + uint256 sellerProceedPerItem = (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + + vm.expectEmit(true, true, false, true); + emit Deposit(address(looksRareProtocol), sellerProceedPerItem); + + vm.expectEmit(true, true, true, true); + emit Transfer(address(looksRareProtocol), gasGriefer, sellerProceedPerItem); + + vm.prank(takerUser); + // Execute taker bid transaction + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + for (uint256 i; i < numberPurchases; i++) { + // Taker user has received the asset + assertEq(mockERC721.ownerOf(i), takerUser); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(gasGriefer, i), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + // Taker bid user pays the whole price + assertEq(address(takerUser).balance, _initialETHBalanceUser - (numberPurchases * price)); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq(weth.balanceOf(gasGriefer), _initialWETHBalanceUser + sellerProceedPerItem * numberPurchases); + // No leftover in the balance of the contract + assertEq(address(looksRareProtocol).balance, 0); + } +} diff --git a/contracts/test/foundry/marketplace/InitialStates.t.sol b/contracts/test/foundry/marketplace/InitialStates.t.sol new file mode 100644 index 00000000..5817a403 --- /dev/null +++ b/contracts/test/foundry/marketplace/InitialStates.t.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Interfaces +import {IStrategyManager} from "@hypercerts/marketplace/interfaces/IStrategyManager.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +contract InitialStatesTest is ProtocolBase, IStrategyManager { + function setUp() public { + _setUp(); + } + + /** + * Verify initial post-deployment states are as expected + */ + function testInitialStates() public { + assertEq(looksRareProtocol.owner(), _owner); + assertEq(looksRareProtocol.protocolFeeRecipient(), address(protocolFeeRecipient)); + assertEq(address(looksRareProtocol.transferManager()), address(transferManager)); + assertEq(looksRareProtocol.WETH(), address(weth)); + assertEq(looksRareProtocol.chainId(), block.chainid); + + bytes32 domainSeparator = looksRareProtocol.domainSeparator(); + bytes32 expectedDomainSeparator = keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256("LooksRareProtocol"), + keccak256(bytes("2")), + block.chainid, + address(looksRareProtocol) + ) + ); + assertEq(domainSeparator, expectedDomainSeparator); + + ( + bool strategyIsActive, + uint16 strategyStandardProtocolFee, + uint16 strategyMinTotalFee, + uint16 strategyMaxProtocolFee, + bytes4 strategySelector, + bool strategyIsMakerBid, + address strategyImplementation + ) = looksRareProtocol.strategyInfo(0); + + assertTrue(strategyIsActive); + assertEq(strategyStandardProtocolFee, _standardProtocolFeeBp); + assertEq(strategyMinTotalFee, _minTotalFeeBp); + assertEq(strategyMaxProtocolFee, _maxProtocolFeeBp); + assertEq(strategySelector, _EMPTY_BYTES4); + assertFalse(strategyIsMakerBid); + assertEq(strategyImplementation, address(0)); + } +} diff --git a/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol b/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol new file mode 100644 index 00000000..5f685cec --- /dev/null +++ b/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol @@ -0,0 +1,268 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {IOwnableTwoSteps} from "@looksrare/contracts-libs/contracts/interfaces/IOwnableTwoSteps.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Shared errors +import { + AmountInvalid, + CallerInvalid, + CurrencyInvalid, + OrderInvalid, + QuoteTypeInvalid +} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import { + CURRENCY_NOT_ALLOWED, + MAKER_ORDER_INVALID_STANDARD_SALE +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Other mocks and utils +import {MockERC20} from "../../mock/MockERC20.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract LooksRareProtocolTest is ProtocolBase { + // Fixed price of sale + uint256 private constant price = 1 ether; + + // Mock files + MockERC20 private mockERC20; + + function setUp() public { + _setUp(); + vm.prank(_owner); + mockERC20 = new MockERC20(); + } + + function testCannotTradeIfInvalidAmounts() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + + // Mint asset + mockERC721.mint(makerUser, makerAsk.itemIds[0]); + + // 1. Amount = 0 + makerAsk.amounts[0] = 0; + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_INVALID_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // 2. Amount > 1 for ERC721 + makerAsk.amounts[0] = 2; + + // Sign order + signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_INVALID_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testCannotTradeIfCurrencyInvalid() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + makerAsk.currency = address(mockERC20); + + // Mint asset + mockERC721.mint(makerUser, makerAsk.itemIds[0]); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker ask order + _assertMakerOrderReturnValidationCode(makerAsk, signature, CURRENCY_NOT_ALLOWED); + + vm.prank(takerUser); + vm.expectRevert(CurrencyInvalid.selector); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + OrderStructs.Maker[] memory makerAsks = new OrderStructs.Maker[](1); + OrderStructs.Taker[] memory takerBids = new OrderStructs.Taker[](1); + bytes[] memory signatures = new bytes[](1); + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](1); + + makerAsks[0] = makerAsk; + takerBids[0] = takerBid; + signatures[0] = signature; + + vm.prank(takerUser); + vm.expectRevert(CurrencyInvalid.selector); + looksRareProtocol.executeMultipleTakerBids{value: price}( + takerBids, + makerAsks, + signatures, + merkleTrees, + true // Atomic + ); + + vm.prank(takerUser); + vm.expectRevert(CurrencyInvalid.selector); + looksRareProtocol.executeMultipleTakerBids{value: price}( + takerBids, + makerAsks, + signatures, + merkleTrees, + false // Non-atomic + ); + } + + function testCannotTradeIfETHIsUsedForMakerBid() public { + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), ETH); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Verify maker bid order + _assertMakerOrderReturnValidationCode(makerBid, signature, CURRENCY_NOT_ALLOWED); + + // Mint asset + mockERC721.mint(takerUser, makerBid.itemIds[0]); + + // Execute taker ask transaction + vm.prank(takerUser); + vm.expectRevert(CurrencyInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testCannotTradeIfInvalidQuoteType() public { + // 1. QuoteType = BID but executeTakerBid + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + vm.prank(takerUser); + vm.expectRevert(QuoteTypeInvalid.selector); + looksRareProtocol.executeTakerBid(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // 2. QuoteType = ASK but executeTakerAsk + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + makerAsk.currency = address(weth); + + // Sign order + signature = _signMakerOrder(makerAsk, makerUserPK); + + vm.prank(takerUser); + vm.expectRevert(QuoteTypeInvalid.selector); + looksRareProtocol.executeTakerAsk(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testUpdateETHGasLimitForTransfer() public asPrankedUser(_owner) { + vm.expectEmit(true, false, false, true); + emit NewGasLimitETHTransfer(10_000); + looksRareProtocol.updateETHGasLimitForTransfer(10_000); + assertEq(uint256(vm.load(address(looksRareProtocol), bytes32(uint256(12)))), 10_000); + } + + function testUpdateETHGasLimitForTransferRevertsIfTooLow() public asPrankedUser(_owner) { + uint256 newGasLimitETHTransfer = 2300; + vm.expectRevert(NewGasLimitETHTransferTooLow.selector); + looksRareProtocol.updateETHGasLimitForTransfer(newGasLimitETHTransfer - 1); + + looksRareProtocol.updateETHGasLimitForTransfer(newGasLimitETHTransfer); + assertEq(uint256(vm.load(address(looksRareProtocol), bytes32(uint256(12)))), newGasLimitETHTransfer); + } + + function testUpdateETHGasLimitForTransferNotOwner() public { + vm.expectRevert(IOwnableTwoSteps.NotOwner.selector); + looksRareProtocol.updateETHGasLimitForTransfer(10_000); + } + + function testCannotCallRestrictedExecuteTakerBid() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + + // Mint asset + mockERC721.mint(makerUser, makerAsk.itemIds[0]); + + vm.prank(takerUser); + vm.expectRevert(CallerInvalid.selector); + looksRareProtocol.restrictedExecuteTakerBid(takerBid, makerAsk, takerUser, _computeOrderHash(makerAsk)); + } + + /** + * Cannot execute two or more taker bids if the currencies are different + */ + function testCannotExecuteMultipleTakerBidsIfDifferentCurrenciesIsAtomic() public { + _testCannotExecuteMultipleTakerBidsIfDifferentCurrencies(true); + } + + function testCannotExecuteMultipleTakerBidsIfDifferentCurrenciesIsNonAtomic() public { + _testCannotExecuteMultipleTakerBidsIfDifferentCurrencies(false); + } + + function _testCannotExecuteMultipleTakerBidsIfDifferentCurrencies(bool isAtomic) public { + _setUpUsers(); + vm.prank(_owner); + looksRareProtocol.updateCurrencyStatus(address(mockERC20), true); + + uint256 numberPurchases = 2; + + OrderStructs.Maker[] memory makerAsks = new OrderStructs.Maker[](numberPurchases); + OrderStructs.Taker[] memory takerBids = new OrderStructs.Taker[](numberPurchases); + bytes[] memory signatures = new bytes[](numberPurchases); + + for (uint256 i; i < numberPurchases; i++) { + // Mint asset + mockERC721.mint(makerUser, i); + + makerAsks[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: i, + collection: address(mockERC721), + currency: ETH, + signer: makerUser, + price: price, // Fixed + itemId: i // (0, 1, etc.) + }); + + if (i == 1) { + makerAsks[i].currency = address(mockERC20); + } + + // Sign order + signatures[i] = _signMakerOrder(makerAsks[i], makerUserPK); + + takerBids[i] = _genericTakerOrder(); + } + + // Other execution parameters + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](numberPurchases); + + vm.prank(takerUser); + vm.expectRevert(CurrencyInvalid.selector); + looksRareProtocol.executeMultipleTakerBids{value: price}( + takerBids, makerAsks, signatures, merkleTrees, isAtomic + ); + } +} diff --git a/contracts/test/foundry/marketplace/NonceInvalidation.t.sol b/contracts/test/foundry/marketplace/NonceInvalidation.t.sol new file mode 100644 index 00000000..ae497f79 --- /dev/null +++ b/contracts/test/foundry/marketplace/NonceInvalidation.t.sol @@ -0,0 +1,355 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries, interfaces, errors +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {INonceManager} from "@hypercerts/marketplace/interfaces/INonceManager.sol"; +import {LengthsInvalid} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import { + INVALID_USER_GLOBAL_BID_NONCE, + INVALID_USER_GLOBAL_ASK_NONCE, + USER_SUBSET_NONCE_CANCELLED, + USER_ORDER_NONCE_IN_EXECUTION_WITH_OTHER_HASH, + USER_ORDER_NONCE_EXECUTED_OR_CANCELLED +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Other utils and tests +import {StrategyTestMultiFillCollectionOrder} from "./utils/StrategyTestMultiFillCollectionOrder.sol"; +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract NonceInvalidationTest is INonceManager, ProtocolBase { + uint256 private constant price = 1 ether; // Fixed price of sale + + function setUp() public { + _setUp(); + } + + /** + * Cannot execute an order if subset nonce is used + */ + function testCannotExecuteOrderIfSubsetNonceIsUsed(uint256 subsetNonce) public { + uint256 itemId = 420; + + // Mint asset + mockERC721.mint(makerUser, itemId); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + makerAsk.subsetNonce = subsetNonce; + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + uint256[] memory subsetNonces = new uint256[](1); + subsetNonces[0] = subsetNonce; + + vm.prank(makerUser); + vm.expectEmit(false, false, false, true); + emit SubsetNoncesCancelled(makerUser, subsetNonces); + looksRareProtocol.cancelSubsetNonces(subsetNonces); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, USER_SUBSET_NONCE_CANCELLED); + + vm.deal(takerUser, price); + + // Execute taker bid transaction + // Taker user actions + vm.prank(takerUser); + vm.expectRevert(NoncesInvalid.selector); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + /** + * Cannot execute an order if maker is at a different global ask nonce than signed + */ + function testCannotExecuteOrderIfInvalidUserGlobalAskNonce(uint256 userGlobalAskNonce) public { + uint256 quasiRandomNumber = 54_570_651_553_685_478_358_117_286_254_199_992_264; + vm.assume(userGlobalAskNonce < quasiRandomNumber); + // Change block number + vm.roll(1); + assertEq(quasiRandomNumber, uint256(blockhash(block.number - 1) >> 128)); + + uint256 newAskNonce = 0 + quasiRandomNumber; + + vm.prank(makerUser); + vm.expectEmit(false, false, false, true); + emit NewBidAskNonces(makerUser, 0, newAskNonce); + looksRareProtocol.incrementBidAskNonces(false, true); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + + // Mint asset + mockERC721.mint(makerUser, makerAsk.itemIds[0]); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, INVALID_USER_GLOBAL_ASK_NONCE); + + vm.deal(takerUser, price); + + // Execute taker bid transaction + // Taker user actions + vm.prank(takerUser); + vm.expectRevert(NoncesInvalid.selector); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + /** + * Cannot execute an order if maker is at a different global bid nonce than signed + */ + function testCannotExecuteOrderIfInvalidUserGlobalBidNonce(uint256 userGlobalBidNonce) public { + uint256 quasiRandomNumber = 54_570_651_553_685_478_358_117_286_254_199_992_264; + vm.assume(userGlobalBidNonce < quasiRandomNumber); + // Change block number + vm.roll(1); + assertEq(quasiRandomNumber, uint256(blockhash(block.number - 1) >> 128)); + + uint256 newBidNonce = 0 + quasiRandomNumber; + + vm.prank(makerUser); + vm.expectEmit(false, false, false, true); + emit NewBidAskNonces(makerUser, newBidNonce, 0); + looksRareProtocol.incrementBidAskNonces(true, false); + + uint256 itemId = 420; + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: userGlobalBidNonce, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: itemId + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerBid, signature, INVALID_USER_GLOBAL_BID_NONCE); + + // Mint asset + mockERC721.mint(takerUser, itemId); + + // Execute taker ask transaction + // Taker user actions + vm.prank(takerUser); + vm.expectRevert(NoncesInvalid.selector); + looksRareProtocol.executeTakerAsk(_genericTakerOrder(), makerBid, signature, _EMPTY_MERKLE_TREE); + } + + /** + * Cannot execute an order twice + */ + function testCannotExecuteAnOrderTwice() public { + _setUpUsers(); + _setupRegistryRoyalties(address(mockERC721), _standardRoyaltyFee); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint asset + mockERC721.mint(takerUser, makerBid.itemIds[0]); + + // Taker user actions + vm.startPrank(takerUser); + + { + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertMakerOrderReturnValidationCode(makerBid, signature, USER_ORDER_NONCE_EXECUTED_OR_CANCELLED); + + // Second one fails + vm.expectRevert(NoncesInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + vm.stopPrank(); + } + + /** + * Cannot execute an order sharing the same order nonce as another that is being partially filled + */ + function testCannotExecuteAnotherOrderAtNonceIfExecutionIsInProgress(uint256 orderNonce) public { + _setUpUsers(); + + // 0. Add the new strategy + bytes4 selector = StrategyTestMultiFillCollectionOrder.executeStrategyWithTakerAsk.selector; + + StrategyTestMultiFillCollectionOrder strategyMultiFillCollectionOrder = + new StrategyTestMultiFillCollectionOrder( + address(looksRareProtocol) + ); + + vm.prank(_owner); + _addStrategy(address(strategyMultiFillCollectionOrder), selector, true); + + // 1. Maker signs a message and execute a partial fill on it + uint256 amountsToFill = 4; + + uint256[] memory itemIds = new uint256[](0); + uint256[] memory amounts = new uint256[](1); + amounts[0] = amountsToFill; + + // Prepare the first order + OrderStructs.Maker memory makerBid = _createMultiItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, // Multi-fill bid offer + collectionType: CollectionType.ERC721, + orderNonce: orderNonce, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemIds: itemIds, + amounts: amounts + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // First taker user actions + { + itemIds = new uint256[](1); + amounts = new uint256[](1); + itemIds[0] = 0; + amounts[0] = 1; + + mockERC721.mint(takerUser, itemIds[0]); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(itemIds, amounts)); + + vm.prank(takerUser); + + // Execute taker ask transaction + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + // 2. Second maker order is signed sharing the same order nonce as the first one + { + uint256 itemId = 420; + + itemIds = new uint256[](1); + amounts = new uint256[](1); + itemIds[0] = itemId; + amounts[0] = 1; + + // Prepare the second order + makerBid = _createMultiItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: orderNonce, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemIds: itemIds, + amounts: amounts + }); + + // Sign order + signature = _signMakerOrder(makerBid, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerBid, signature, USER_ORDER_NONCE_IN_EXECUTION_WITH_OTHER_HASH); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = + OrderStructs.Taker(takerUser, abi.encode(new uint256[](0), new uint256[](0))); + + vm.prank(takerUser); + + // Second one fails when a taker user tries to execute + vm.expectRevert(NoncesInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + } + + function testCancelOrderNonces(uint256 nonceOne, uint256 nonceTwo) public asPrankedUser(makerUser) { + assertEq(looksRareProtocol.userOrderNonce(makerUser, nonceOne), bytes32(0)); + assertEq(looksRareProtocol.userOrderNonce(makerUser, nonceTwo), bytes32(0)); + + uint256[] memory orderNonces = new uint256[](2); + orderNonces[0] = nonceOne; + orderNonces[1] = nonceTwo; + vm.expectEmit(true, false, false, true); + emit OrderNoncesCancelled(makerUser, orderNonces); + looksRareProtocol.cancelOrderNonces(orderNonces); + + assertEq(looksRareProtocol.userOrderNonce(makerUser, nonceOne), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + assertEq(looksRareProtocol.userOrderNonce(makerUser, nonceTwo), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + /** + * Cannot execute an order if its nonce has been cancelled + */ + function testCannotExecuteAnOrderWhoseNonceIsCancelled(uint256 orderNonce) public { + _setUpUsers(); + _setupRegistryRoyalties(address(mockERC721), _standardRoyaltyFee); + + uint256 itemId = 0; + + uint256[] memory orderNonces = new uint256[](1); + orderNonces[0] = orderNonce; + vm.prank(makerUser); + looksRareProtocol.cancelOrderNonces(orderNonces); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: orderNonce, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: itemId + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerBid, signature, USER_ORDER_NONCE_EXECUTED_OR_CANCELLED); + + // Mint asset + mockERC721.mint(takerUser, itemId); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = + OrderStructs.Taker(takerUser, abi.encode(new uint256[](0), new uint256[](0))); + + vm.prank(takerUser); + vm.expectRevert(NoncesInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testCancelNoncesRevertIfEmptyArrays() public { + uint256[] memory nonces = new uint256[](0); + + vm.expectRevert(LengthsInvalid.selector); + looksRareProtocol.cancelSubsetNonces(nonces); + + vm.expectRevert(LengthsInvalid.selector); + looksRareProtocol.cancelOrderNonces(nonces); + } +} diff --git a/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol b/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol new file mode 100644 index 00000000..ca9a5c9c --- /dev/null +++ b/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol @@ -0,0 +1,378 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {LooksRareProtocol} from "@hypercerts/marketplace/LooksRareProtocol.sol"; +import {TransferManager} from "@hypercerts/marketplace/TransferManager.sol"; +import {CreatorFeeManagerWithRoyalties} from "@hypercerts/marketplace/CreatorFeeManagerWithRoyalties.sol"; + +import {OrderValidatorV2A} from "@hypercerts/marketplace/helpers/OrderValidatorV2A.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Shared errors +import { + ERC20_APPROVAL_INFERIOR_TO_PRICE, + ERC721_ITEM_ID_NOT_IN_BALANCE, + ERC721_NO_APPROVAL_FOR_ALL_OR_ITEM_ID, + ERC1155_BALANCE_OF_DOES_NOT_EXIST, + ERC1155_BALANCE_OF_ITEM_ID_INFERIOR_TO_AMOUNT, + ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST, + ERC1155_NO_APPROVAL_FOR_ALL, + MAKER_ORDER_INVALID_STANDARD_SALE, + MISSING_IS_VALID_SIGNATURE_FUNCTION_EIP1271, + POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC721, + POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155, + STRATEGY_NOT_IMPLEMENTED, + TRANSFER_MANAGER_APPROVAL_REVOKED_BY_OWNER_FOR_EXCHANGE +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Utils +import {TestParameters} from "./utils/TestParameters.sol"; + +// Mocks +import {MockRoyaltyFeeRegistry} from "../../mock/MockRoyaltyFeeRegistry.sol"; +import {MockERC721} from "../../mock/MockERC721.sol"; +import {MockERC1155} from "../../mock/MockERC1155.sol"; +import {MockERC1155WithoutBalanceOfBatch} from "../../mock/MockERC1155WithoutBalanceOfBatch.sol"; +import {MockERC1155WithoutAnyBalanceOf} from "../../mock/MockERC1155WithoutAnyBalanceOf.sol"; +import {MockERC1155WithoutIsApprovedForAll} from "../../mock/MockERC1155WithoutIsApprovedForAll.sol"; +import {MockERC721SupportsNoInterface} from "../../mock/MockERC721SupportsNoInterface.sol"; +import {MockERC1155SupportsNoInterface} from "../../mock/MockERC1155SupportsNoInterface.sol"; +import {MockERC20} from "../../mock/MockERC20.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +/** + * @dev Not everything is tested in this file. Most tests live in other files + * with the assert functions living in ProtocolBase.t.sol. + */ +contract OrderValidatorV2ATest is TestParameters { + CreatorFeeManagerWithRoyalties private creatorFeeManager; + LooksRareProtocol private looksRareProtocol; + MockRoyaltyFeeRegistry private royaltyFeeRegistry; + OrderValidatorV2A private orderValidator; + TransferManager private transferManager; + + function setUp() public { + transferManager = new TransferManager(address(this)); + looksRareProtocol = new LooksRareProtocol( + address(this), + address(this), + address(transferManager), + 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + ); + royaltyFeeRegistry = new MockRoyaltyFeeRegistry(address(this), 9_500); + creatorFeeManager = new CreatorFeeManagerWithRoyalties(address(royaltyFeeRegistry)); + looksRareProtocol.updateCreatorFeeManager(address(creatorFeeManager)); + looksRareProtocol.updateCurrencyStatus(ETH, true); + orderValidator = new OrderValidatorV2A(address(looksRareProtocol)); + } + + function testDeriveProtocolParameters() public { + orderValidator.deriveProtocolParameters(); + assertEq( + orderValidator.domainSeparator(), + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256("LooksRareProtocol"), + keccak256(bytes("2")), + block.chainid, + address(looksRareProtocol) + ) + ) + ); + + assertEq(address(orderValidator.creatorFeeManager()), address(creatorFeeManager)); + assertEq(orderValidator.maxCreatorFeeBp(), 1000); + } + + function testMakerAskStrategyNotImplemented() public { + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.strategyId = 1; + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[0], STRATEGY_NOT_IMPLEMENTED); + } + + function testMakerBidStrategyNotImplemented() public { + OrderStructs.Maker memory makerBid; + makerBid.quoteType = QuoteType.Bid; + address currency = address(1); // it cannot be 0 + looksRareProtocol.updateCurrencyStatus(currency, true); + makerBid.currency = currency; + makerBid.strategyId = 1; + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerBid, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[0], STRATEGY_NOT_IMPLEMENTED); + } + + function testMakerAskLooksRareProtocolIsNotAWhitelistedOperator() public { + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.signer = makerUser; + makerAsk.collectionType = CollectionType.ERC721; + makerAsk.collection = address(new MockERC721()); + + address[] memory operators = new address[](1); + operators[0] = address(orderValidator.looksRareProtocol()); + + transferManager.allowOperator(operators[0]); + + vm.prank(makerUser); + transferManager.grantApprovals(operators); + + transferManager.removeOperator(operators[0]); + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[7], TRANSFER_MANAGER_APPROVAL_REVOKED_BY_OWNER_FOR_EXCHANGE); + } + + function testMakerAskWrongCollectionTypeERC721() public { + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.collectionType = CollectionType.ERC721; + makerAsk.collection = address(new MockERC721SupportsNoInterface()); + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[6], POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC721); + } + + function testMakerBidWrongCollectionTypeERC721() public { + OrderStructs.Maker memory makerBid; + makerBid.quoteType = QuoteType.Bid; + makerBid.collectionType = CollectionType.ERC721; + makerBid.collection = address(new MockERC721SupportsNoInterface()); + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerBid, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[6], POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC721); + } + + function testMakerBidZeroAmount() public { + _testMakerBidERC721InvalidAmount(0); + } + + function testMakerBidERC721AmountNotEqualToOne() public { + _testMakerBidERC721InvalidAmount(2); + } + + function _testMakerBidERC721InvalidAmount(uint256 amount) public { + OrderStructs.Maker memory makerBid; + makerBid.quoteType = QuoteType.Bid; + makerBid.collectionType = CollectionType.ERC721; + makerBid.collection = address(new MockERC721()); + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = amount; + makerBid.itemIds = itemIds; + uint256[] memory amounts = new uint256[](1); + amounts[0] = amount; + makerBid.amounts = amounts; + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerBid, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[1], MAKER_ORDER_INVALID_STANDARD_SALE); + } + + function testMakerBidMissingIsValidSignature() public { + OrderStructs.Maker memory makerBid; + // This contract does not have isValidSignature implemented + makerBid.quoteType = QuoteType.Bid; + makerBid.signer = address(this); + makerBid.collectionType = CollectionType.ERC721; + makerBid.collection = address(new MockERC721()); + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerBid, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[3], MISSING_IS_VALID_SIGNATURE_FUNCTION_EIP1271); + } + + function testMakerAskWrongCollectionTypeERC1155() public { + OrderStructs.Maker memory makerAsk; + makerAsk.collectionType = CollectionType.ERC1155; + makerAsk.collection = address(new MockERC1155SupportsNoInterface()); + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[6], POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155); + } + + function testMakerBidWrongCollectionTypeERC1155() public { + OrderStructs.Maker memory makerBid; + makerBid.quoteType = QuoteType.Bid; + makerBid.collectionType = CollectionType.ERC1155; + makerBid.collection = address(new MockERC1155SupportsNoInterface()); + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerBid, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[6], POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155); + } + + function testMakerBidInsufficientERC20Allowance() public { + OrderStructs.Maker memory makerBid; + makerBid.quoteType = QuoteType.Bid; + MockERC20 mockERC20 = new MockERC20(); + makerBid.collectionType = CollectionType.ERC721; + makerBid.collection = address(new MockERC721()); + makerBid.signer = makerUser; + makerBid.currency = address(mockERC20); + makerBid.collectionType = CollectionType.ERC721; + makerBid.price = 1 ether; + + mockERC20.mint(makerUser, 1 ether); + + vm.startPrank(makerUser); + mockERC20.approve(address(orderValidator.looksRareProtocol()), makerBid.price - 1 wei); + vm.stopPrank(); + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerBid, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[5], ERC20_APPROVAL_INFERIOR_TO_PRICE); + } + + function testMakerAskERC721NotAllTokensAreApproved() public { + MockERC721 mockERC721 = new MockERC721(); + mockERC721.mint(makerUser, 0); + mockERC721.mint(makerUser, 1); + + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.collectionType = CollectionType.ERC721; + makerAsk.collection = address(mockERC721); + makerAsk.signer = makerUser; + makerAsk.collectionType = CollectionType.ERC721; + + // Only approve token 0 but not token 1, this is to test the loop + vm.prank(makerUser); + mockERC721.approve(address(transferManager), 0); + + uint256[] memory itemIds = new uint256[](2); + itemIds[0] = 0; + itemIds[1] = 1; + makerAsk.itemIds = itemIds; + + uint256[] memory amounts = new uint256[](2); + amounts[0] = 1; + amounts[1] = 1; + makerAsk.amounts = amounts; + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[5], ERC721_NO_APPROVAL_FOR_ALL_OR_ITEM_ID); + } + + function testMakerAskDoesNotOwnERC721() public { + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.collectionType = CollectionType.ERC721; + MockERC721 mockERC721 = new MockERC721(); + mockERC721.mint(address(this), 0); + makerAsk.collection = address(mockERC721); + makerAsk.signer = makerUser; + makerAsk.collectionType = CollectionType.ERC721; + uint256[] memory itemIds = new uint256[](1); + makerAsk.itemIds = itemIds; + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + + assertEq(validationCodes[5], ERC721_ITEM_ID_NOT_IN_BALANCE); + } + + function testMakerAskERC1155BalanceInferiorToAmountThroughBalanceOfBatch() public { + _testMakerAskERC1155BalanceInferiorToAmount(true); + } + + function testMakerAskERC1155BalanceInferiorToAmountThroughBalanceOf() public { + _testMakerAskERC1155BalanceInferiorToAmount(false); + } + + function _testMakerAskERC1155BalanceInferiorToAmount(bool revertBalanceOfBatch) public { + address collection; + if (revertBalanceOfBatch) { + MockERC1155WithoutBalanceOfBatch mockERC1155 = new MockERC1155WithoutBalanceOfBatch(); + collection = address(mockERC1155); + } else { + MockERC1155 mockERC1155 = new MockERC1155(); + collection = address(mockERC1155); + } + + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.collectionType = CollectionType.ERC1155; + makerAsk.collection = collection; + makerAsk.signer = makerUser; + makerAsk.collectionType = CollectionType.ERC1155; + uint256[] memory itemIds = new uint256[](1); + makerAsk.itemIds = itemIds; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerAsk.amounts = amounts; + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[5], ERC1155_BALANCE_OF_ITEM_ID_INFERIOR_TO_AMOUNT); + } + + function testMakerAskERC1155BalanceOfDoesNotExist() public { + MockERC1155WithoutAnyBalanceOf mockERC1155 = new MockERC1155WithoutAnyBalanceOf(); + + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.collectionType = CollectionType.ERC1155; + makerAsk.collection = address(mockERC1155); + makerAsk.signer = makerUser; + makerAsk.collectionType = CollectionType.ERC1155; + uint256[] memory itemIds = new uint256[](1); + makerAsk.itemIds = itemIds; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerAsk.amounts = amounts; + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[5], ERC1155_BALANCE_OF_DOES_NOT_EXIST); + } + + function testMakerAskERC1155IsApprovedForAllDoesNotExist() public { + MockERC1155WithoutIsApprovedForAll mockERC1155 = new MockERC1155WithoutIsApprovedForAll(); + mockERC1155.mint({to: makerUser, tokenId: 0, amount: 1}); + + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.collectionType = CollectionType.ERC1155; + makerAsk.collection = address(mockERC1155); + makerAsk.signer = makerUser; + makerAsk.collectionType = CollectionType.ERC1155; + uint256[] memory itemIds = new uint256[](1); + makerAsk.itemIds = itemIds; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerAsk.amounts = amounts; + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[5], ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST); + } + + function testMakerAskERC1155IsApprovedForAllReturnsFalse() public { + MockERC1155 mockERC1155 = new MockERC1155(); + mockERC1155.mint({to: makerUser, tokenId: 0, amount: 1}); + + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.collectionType = CollectionType.ERC1155; + makerAsk.collection = address(mockERC1155); + makerAsk.signer = makerUser; + makerAsk.collectionType = CollectionType.ERC1155; + uint256[] memory itemIds = new uint256[](1); + makerAsk.itemIds = itemIds; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerAsk.amounts = amounts; + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[5], ERC1155_NO_APPROVAL_FOR_ALL); + } +} diff --git a/contracts/test/foundry/marketplace/ProtocolBase.t.sol b/contracts/test/foundry/marketplace/ProtocolBase.t.sol new file mode 100644 index 00000000..8c3cee4b --- /dev/null +++ b/contracts/test/foundry/marketplace/ProtocolBase.t.sol @@ -0,0 +1,257 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.7; + +// WETH +import {WETH} from "solmate/src/tokens/WETH.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Core contracts +import {LooksRareProtocol, ILooksRareProtocol} from "@hypercerts/marketplace/LooksRareProtocol.sol"; +import {TransferManager} from "@hypercerts/marketplace/TransferManager.sol"; +import {ProtocolFeeRecipient} from "@hypercerts/marketplace/ProtocolFeeRecipient.sol"; + +// Other contracts +import {OrderValidatorV2A} from "@hypercerts/marketplace/helpers/OrderValidatorV2A.sol"; + +// Mock files +import {MockERC20} from "../../mock/MockERC20.sol"; +import {MockERC721} from "../../mock/MockERC721.sol"; +import {MockERC721WithRoyalties} from "../../mock/MockERC721WithRoyalties.sol"; +import {MockERC1155} from "../../mock/MockERC1155.sol"; +import {MockRoyaltyFeeRegistry} from "../../mock/MockRoyaltyFeeRegistry.sol"; + +// Utils +import {MockOrderGenerator} from "./utils/MockOrderGenerator.sol"; + +contract ProtocolBase is MockOrderGenerator, ILooksRareProtocol { + address[] public operators; + + MockERC20 public looksRareToken; + MockERC721WithRoyalties public mockERC721WithRoyalties; + MockERC721 public mockERC721; + MockERC1155 public mockERC1155; + + ProtocolFeeRecipient public protocolFeeRecipient; + LooksRareProtocol public looksRareProtocol; + TransferManager public transferManager; + MockRoyaltyFeeRegistry public royaltyFeeRegistry; + OrderValidatorV2A public orderValidator; + + WETH public weth; + + function _assertMakerOrderReturnValidationCode( + OrderStructs.Maker memory makerOrder, + bytes memory signature, + uint256 expectedValidationCode + ) internal { + _assertMakerOrderReturnValidationCode(makerOrder, signature, _EMPTY_MERKLE_TREE, expectedValidationCode); + } + + function _assertMakerOrderReturnValidationCodeWithMerkleTree( + OrderStructs.Maker memory makerOrder, + bytes memory signature, + OrderStructs.MerkleTree memory merkleTree, + uint256 expectedValidationCode + ) internal { + _assertMakerOrderReturnValidationCode(makerOrder, signature, merkleTree, expectedValidationCode); + } + + function _assertMakerOrderReturnValidationCode( + OrderStructs.Maker memory makerOrder, + bytes memory signature, + OrderStructs.MerkleTree memory merkleTree, + uint256 expectedValidationCode + ) private { + OrderStructs.Maker[] memory makerOrders = new OrderStructs.Maker[](1); + makerOrders[0] = makerOrder; + + bytes[] memory signatures = new bytes[](1); + signatures[0] = signature; + + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](1); + merkleTrees[0] = merkleTree; + + uint256[9][] memory validationCodes = + orderValidator.checkMultipleMakerOrderValidities(makerOrders, signatures, merkleTrees); + + uint256 index = expectedValidationCode / 100; + assertEq(validationCodes[0][index - 1], expectedValidationCode); + } + + function _assertValidMakerOrder(OrderStructs.Maker memory makerOrder, bytes memory signature) internal { + _assertValidMakerOrder(makerOrder, signature, _EMPTY_MERKLE_TREE); + } + + function _assertValidMakerOrderWithMerkleTree( + OrderStructs.Maker memory makerOrder, + bytes memory signature, + OrderStructs.MerkleTree memory merkleTree + ) internal { + _assertValidMakerOrder(makerOrder, signature, merkleTree); + } + + function _assertValidMakerOrder( + OrderStructs.Maker memory makerOrder, + bytes memory signature, + OrderStructs.MerkleTree memory merkleTree + ) private { + OrderStructs.Maker[] memory makerOrders = new OrderStructs.Maker[](1); + makerOrders[0] = makerOrder; + + bytes[] memory signatures = new bytes[](1); + signatures[0] = signature; + + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](1); + merkleTrees[0] = merkleTree; + + uint256[9][] memory validationCodes = + orderValidator.checkMultipleMakerOrderValidities(makerOrders, signatures, merkleTrees); + + _assertValidationCodesAllZeroes(validationCodes); + } + + function _assertValidationCodesAllZeroes(uint256[9][] memory validationCodes) private { + for (uint256 i; i < validationCodes.length; i++) { + for (uint256 j; j < 9; j++) { + assertEq(validationCodes[i][j], 0); + } + } + } + + function _setUpUser(address user) internal asPrankedUser(user) { + // Do approvals for collections and WETH + mockERC721.setApprovalForAll(address(transferManager), true); + mockERC1155.setApprovalForAll(address(transferManager), true); + mockERC721WithRoyalties.setApprovalForAll(address(transferManager), true); + weth.approve(address(looksRareProtocol), type(uint256).max); + + // Grant approvals for transfer manager + transferManager.grantApprovals(operators); + + // Receive ETH and WETH + vm.deal(user, _initialETHBalanceUser + _initialWETHBalanceUser); + weth.deposit{value: _initialWETHBalanceUser}(); + } + + function _setUpUsers() internal { + _setUpUser(makerUser); + _setUpUser(takerUser); + } + + function _setupRegistryRoyalties(address collection, uint256 standardRoyaltyFee) internal { + vm.prank(royaltyFeeRegistry.owner()); + royaltyFeeRegistry.updateRoyaltyInfoForCollection( + collection, _royaltyRecipient, _royaltyRecipient, standardRoyaltyFee + ); + } + + function _setUp() internal { + vm.startPrank(_owner); + weth = new WETH(); + looksRareToken = new MockERC20(); + mockERC721 = new MockERC721(); + mockERC1155 = new MockERC1155(); + + transferManager = new TransferManager(_owner); + royaltyFeeRegistry = new MockRoyaltyFeeRegistry(_owner, 9500); + protocolFeeRecipient = new ProtocolFeeRecipient(0x5924A28caAF1cc016617874a2f0C3710d881f3c1, address(weth)); + looksRareProtocol = new LooksRareProtocol( + _owner, + address(protocolFeeRecipient), + address(transferManager), + address(weth) + ); + mockERC721WithRoyalties = new MockERC721WithRoyalties(_royaltyRecipient, _standardRoyaltyFee); + + // Operations + transferManager.allowOperator(address(looksRareProtocol)); + looksRareProtocol.updateCurrencyStatus(ETH, true); + looksRareProtocol.updateCurrencyStatus(address(weth), true); + + // Fetch domain separator and store it as one of the operators + _domainSeparator = looksRareProtocol.domainSeparator(); + operators.push(address(looksRareProtocol)); + + // Deploy order validator contract + orderValidator = new OrderValidatorV2A(address(looksRareProtocol)); + + // Distribute ETH and WETH to protocol owner + vm.deal(_owner, _initialETHBalanceOwner + _initialWETHBalanceOwner); + weth.deposit{value: _initialWETHBalanceOwner}(); + vm.stopPrank(); + + // Distribute ETH and WETH to royalty recipient + vm.deal(_royaltyRecipient, _initialETHBalanceRoyaltyRecipient + _initialWETHBalanceRoyaltyRecipient); + vm.startPrank(_royaltyRecipient); + weth.deposit{value: _initialWETHBalanceRoyaltyRecipient}(); + vm.stopPrank(); + } + + function _genericTakerOrder() internal pure returns (OrderStructs.Taker memory takerOrder) { + takerOrder = OrderStructs.Taker(takerUser, abi.encode()); + } + + function _addStrategy(address strategy, bytes4 selector, bool isMakerBid) internal { + looksRareProtocol.addStrategy( + _standardProtocolFeeBp, _minTotalFeeBp, _maxProtocolFeeBp, selector, isMakerBid, strategy + ); + } + + function _assertStrategyAttributes( + address expectedStrategyAddress, + bytes4 expectedSelector, + bool expectedIsMakerBid + ) internal { + ( + bool strategyIsActive, + uint16 strategyStandardProtocolFee, + uint16 strategyMinTotalFee, + uint16 strategyMaxProtocolFee, + bytes4 strategySelector, + bool strategyIsMakerBid, + address strategyImplementation + ) = looksRareProtocol.strategyInfo(1); + + assertTrue(strategyIsActive); + assertEq(strategyStandardProtocolFee, _standardProtocolFeeBp); + assertEq(strategyMinTotalFee, _minTotalFeeBp); + assertEq(strategyMaxProtocolFee, _maxProtocolFeeBp); + assertEq(strategySelector, expectedSelector); + assertEq(strategyIsMakerBid, expectedIsMakerBid); + assertEq(strategyImplementation, expectedStrategyAddress); + } + + function _assertMockERC721Ownership(uint256[] memory itemIds, address owner) internal { + for (uint256 i; i < itemIds.length; i++) { + assertEq(mockERC721.ownerOf(itemIds[i]), owner); + } + } + + /** + * NOTE: It inherits from ILooksRareProtocol, so it + * needs to at least define the functions below. + */ + function executeTakerAsk( + OrderStructs.Taker calldata takerAsk, + OrderStructs.Maker calldata makerBid, + bytes calldata makerSignature, + OrderStructs.MerkleTree calldata merkleTree + ) external {} + + function executeTakerBid( + OrderStructs.Taker calldata takerBid, + OrderStructs.Maker calldata makerAsk, + bytes calldata makerSignature, + OrderStructs.MerkleTree calldata merkleTree + ) external payable {} + + function executeMultipleTakerBids( + OrderStructs.Taker[] calldata takerBids, + OrderStructs.Maker[] calldata makerAsks, + bytes[] calldata makerSignatures, + OrderStructs.MerkleTree[] calldata merkleTrees, + bool isAtomic + ) external payable {} +} diff --git a/contracts/test/foundry/marketplace/ProtocolFeeRecipient.t.sol b/contracts/test/foundry/marketplace/ProtocolFeeRecipient.t.sol new file mode 100644 index 00000000..0b30803f --- /dev/null +++ b/contracts/test/foundry/marketplace/ProtocolFeeRecipient.t.sol @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// LooksRare unopinionated libraries +import {IERC20} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC20.sol"; +import {IWETH} from "@looksrare/contracts-libs/contracts/interfaces/generic/IWETH.sol"; + +// Core contracts +import {ProtocolFeeRecipient} from "@hypercerts/marketplace/ProtocolFeeRecipient.sol"; + +// Other mocks and utils +import {MockERC20} from "../../mock/MockERC20.sol"; +import {TestParameters} from "./utils/TestParameters.sol"; + +contract ProtocolFeeRecipientTest is TestParameters { + ProtocolFeeRecipient private protocolFeeRecipient; + uint256 private feeSharingSetterInitialWETHBalance; + + address private constant FEE_SHARING_SETTER = 0x5924A28caAF1cc016617874a2f0C3710d881f3c1; + uint256 private constant DUST = 0.6942 ether; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl("mainnet")); + protocolFeeRecipient = new ProtocolFeeRecipient(FEE_SHARING_SETTER, WETH_MAINNET); + feeSharingSetterInitialWETHBalance = IERC20(WETH_MAINNET).balanceOf(FEE_SHARING_SETTER); + + vm.deal(address(protocolFeeRecipient), 0); + deal(WETH_MAINNET, address(protocolFeeRecipient), 0); + } + + function test_TransferETH_NoWETHBalance_WithETHBalance() public { + _sendETHToProtocolFeeRecipient(); + + protocolFeeRecipient.transferETH(); + + assertEq(address(protocolFeeRecipient).balance, 0); + assertEq(IERC20(WETH_MAINNET).balanceOf(address(protocolFeeRecipient)), 0); + assertEq(IERC20(WETH_MAINNET).balanceOf(FEE_SHARING_SETTER), feeSharingSetterInitialWETHBalance + 1 ether); + } + + function test_TransferETH_WithWETHBalance_WithETHBalance() public { + _sendETHToProtocolFeeRecipient(); + _sendWETHToProtocolFeeRecipient(); + + protocolFeeRecipient.transferETH(); + + assertEq(address(protocolFeeRecipient).balance, 0); + assertEq(IERC20(WETH_MAINNET).balanceOf(address(protocolFeeRecipient)), 0); + assertEq( + IERC20(WETH_MAINNET).balanceOf(FEE_SHARING_SETTER), feeSharingSetterInitialWETHBalance + 1 ether + DUST + ); + } + + function test_TransferETH_WithWETHBalance_NoETHBalance() public { + _sendWETHToProtocolFeeRecipient(); + + protocolFeeRecipient.transferETH(); + + assertEq(address(protocolFeeRecipient).balance, 0); + assertEq(IERC20(WETH_MAINNET).balanceOf(address(protocolFeeRecipient)), 0); + assertEq(IERC20(WETH_MAINNET).balanceOf(FEE_SHARING_SETTER), feeSharingSetterInitialWETHBalance + DUST); + } + + function test_TransferETH_RevertIf_NothingToTransfer() public { + vm.expectRevert(ProtocolFeeRecipient.NothingToTransfer.selector); + protocolFeeRecipient.transferETH(); + } + + function test_TransferWETH() public { + _sendWETHToProtocolFeeRecipient(); + + protocolFeeRecipient.transferERC20(WETH_MAINNET); + + assertEq(IERC20(WETH_MAINNET).balanceOf(address(protocolFeeRecipient)), 0); + assertEq(IERC20(WETH_MAINNET).balanceOf(FEE_SHARING_SETTER), feeSharingSetterInitialWETHBalance + DUST); + } + + function test_TransferWETH_RevertIf_NothingToTransfer() public { + vm.expectRevert(ProtocolFeeRecipient.NothingToTransfer.selector); + protocolFeeRecipient.transferERC20(WETH_MAINNET); + } + + function test_TransferERC20() public { + MockERC20 mockERC20 = new MockERC20(); + mockERC20.mint(address(protocolFeeRecipient), DUST); + + protocolFeeRecipient.transferERC20(address(mockERC20)); + + assertEq(mockERC20.balanceOf(address(protocolFeeRecipient)), 0); + assertEq(mockERC20.balanceOf(FEE_SHARING_SETTER), DUST); + } + + function test_TransferERC20_RevertIf_NothingToTransfer() public { + MockERC20 mockERC20 = new MockERC20(); + vm.expectRevert(ProtocolFeeRecipient.NothingToTransfer.selector); + protocolFeeRecipient.transferERC20(address(mockERC20)); + } + + function _sendETHToProtocolFeeRecipient() private { + (bool success,) = address(protocolFeeRecipient).call{value: 1 ether}(""); + assertTrue(success); + assertEq(address(protocolFeeRecipient).balance, 1 ether); + } + + function _sendWETHToProtocolFeeRecipient() private { + IWETH(WETH_MAINNET).deposit{value: DUST}(); + IERC20(WETH_MAINNET).transfer(address(protocolFeeRecipient), DUST); + assertEq(IERC20(WETH_MAINNET).balanceOf(address(protocolFeeRecipient)), DUST); + } +} diff --git a/contracts/test/foundry/marketplace/Sandbox.t.sol b/contracts/test/foundry/marketplace/Sandbox.t.sol new file mode 100644 index 00000000..9a349fd5 --- /dev/null +++ b/contracts/test/foundry/marketplace/Sandbox.t.sol @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {IERC721} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC721.sol"; +import {IERC1155} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC1155.sol"; + +// Libraries and interfaces +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract SandboxTest is ProtocolBase { + error ERC721TransferFromFail(); + + // Fixed price of sale + uint256 private constant price = 1 ether; + + // Sandbox on Ethereum mainnet + address private constant SANDBOX = 0xa342f5D851E866E18ff98F351f2c6637f4478dB5; + + // Forked block number to run the tests + uint256 private constant FORKED_BLOCK_NUMBER = 16_268_000; + + function _transferItemIdToUser(address user) private returns (uint256 itemId) { + // @dev This user had 23 of the itemId at the forked block number + address ownerOfItemId = 0x7A9fe22691c811ea339D9B73150e6911a5343DcA; + itemId = 55_464_657_044_963_196_816_950_587_289_035_428_064_568_320_970_692_304_673_817_341_489_688_428_423_171; + vm.prank(ownerOfItemId); + IERC1155(SANDBOX).safeTransferFrom(ownerOfItemId, user, itemId, 23, ""); + } + + function _setUpApprovalsForSandbox(address user) internal { + vm.prank(user); + IERC1155(SANDBOX).setApprovalForAll(address(transferManager), true); + } + + function setUp() public { + vm.createSelectFork(vm.rpcUrl("mainnet"), FORKED_BLOCK_NUMBER); + _setUp(); + _setUpUsers(); + } + + /** + * @notice Sandbox implements both ERC721 and ERC1155 interfaceIds. + * This test verifies that only collectionType = 1 works. + * It is for taker ask (matching maker bid). + */ + function testTakerAskCannotTransferSandboxWithERC721CollectionTypeButERC1155CollectionTypeWorks() public { + // Taker user is the one selling the item + _setUpApprovalsForSandbox(takerUser); + uint256 itemId = _transferItemIdToUser(takerUser); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, // it should be ERC1155 + orderNonce: 0, + collection: SANDBOX, + currency: address(weth), + signer: makerUser, + price: price, + itemId: itemId + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = _genericTakerOrder(); + + // It should fail with collectionType = 0 + vm.expectRevert(abi.encodeWithSelector(ERC721TransferFromFail.selector)); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Adjust the collection type and sign order again + makerBid.collectionType = CollectionType.ERC1155; + signature = _signMakerOrder(makerBid, makerUserPK); + + // It shouldn't fail with collectionType = 0 + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Maker user has received the Sandbox asset + assertEq(IERC1155(SANDBOX).balanceOf(makerUser, itemId), makerBid.amounts[0]); + } + + /** + * @notice Sandbox implements both ERC721 and ERC1155 interfaceIds. + * This test verifies that only collectionType = 1 works. + * It is for taker bid (matching maker ask). + */ + function testTakerBidCannotTransferSandboxWithERC721CollectionTypeButERC1155CollectionTypeWorks() public { + // Maker user is the one selling the item + _setUpApprovalsForSandbox(makerUser); + uint256 itemId = _transferItemIdToUser(makerUser); + + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, // it should be ERC1155 + orderNonce: 0, + collection: SANDBOX, + currency: ETH, + signer: makerUser, + price: price, + itemId: itemId + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Prepare the taker bid + OrderStructs.Taker memory takerBid = _genericTakerOrder(); + + // It should fail with collectionType = 0 + vm.expectRevert(abi.encodeWithSelector(ERC721TransferFromFail.selector)); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Adjust the collection type and sign order again + makerAsk.collectionType = CollectionType.ERC1155; + signature = _signMakerOrder(makerAsk, makerUserPK); + + // It shouldn't fail with collectionType = 0 + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the Sandbox asset + assertEq(IERC1155(SANDBOX).balanceOf(takerUser, itemId), makerAsk.amounts[0]); + } +} diff --git a/contracts/test/foundry/marketplace/SignaturesEIP2098.t.sol b/contracts/test/foundry/marketplace/SignaturesEIP2098.t.sol new file mode 100644 index 00000000..ea02561a --- /dev/null +++ b/contracts/test/foundry/marketplace/SignaturesEIP2098.t.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries, interfaces, errors +import "@looksrare/contracts-libs/contracts/errors/SignatureCheckerErrors.sol"; +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract SignaturesEIP2098Test is ProtocolBase { + function setUp() public { + _setUp(); + } + + function testCanSignValidMakerAskEIP2098(uint256 price, uint256 itemId) public { + vm.assume(price <= 2 ether); + + _setUpUsers(); + _setupRegistryRoyalties(address(mockERC721), _standardRoyaltyFee); + + (OrderStructs.Maker memory makerAsk,) = _createMockMakerAskAndTakerBid(address(mockERC721)); + makerAsk.price = price; + makerAsk.itemIds[0] = itemId; + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Mint asset + mockERC721.mint(makerUser, makerAsk.itemIds[0]); + + // Adjust the signature + signature = _eip2098Signature(signature); + + // Verify validity of maker ask order + _assertValidMakerOrder(makerAsk, signature); + } + + function testCanSignValidMakerBidEIP2098(uint256 price, uint256 itemId) public { + vm.assume(price <= 2 ether); + + _setUpUsers(); + _setupRegistryRoyalties(address(mockERC721), _standardRoyaltyFee); + + (OrderStructs.Maker memory makerBid,) = _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + makerBid.price = price; + makerBid.itemIds[0] = itemId; + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Adjust the signature + signature = _eip2098Signature(signature); + + // Mint asset + mockERC721.mint(takerUser, makerBid.itemIds[0]); + + // Verify validity of maker bid order + _assertValidMakerOrder(makerBid, signature); + } +} diff --git a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol new file mode 100644 index 00000000..2a96743c --- /dev/null +++ b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol @@ -0,0 +1,445 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries and interfaces +import {IReentrancyGuard} from "@looksrare/contracts-libs/contracts/interfaces/IReentrancyGuard.sol"; +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Mocks and other utils +import {ERC1271Wallet} from "./utils/ERC1271Wallet.sol"; +import {MaliciousERC1271Wallet} from "./utils/MaliciousERC1271Wallet.sol"; +import {MaliciousOnERC1155ReceivedERC1271Wallet} from "./utils/MaliciousOnERC1155ReceivedERC1271Wallet.sol"; +import {MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet} from + "./utils/MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet.sol"; +import {MaliciousIsValidSignatureERC1271Wallet} from "./utils/MaliciousIsValidSignatureERC1271Wallet.sol"; + +// Errors +import {SignatureERC1271Invalid} from "@looksrare/contracts-libs/contracts/errors/SignatureCheckerErrors.sol"; +import { + ERC1155SafeTransferFromFail, + ERC1155SafeBatchTransferFromFail +} from "@looksrare/contracts-libs/contracts/errors/LowLevelErrors.sol"; +import {SIGNATURE_INVALID_EIP1271} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +/** + * @dev ERC1271Wallet recovers a signature's signer using ECDSA. If it matches the mock wallet's + * owner, it returns the magic value. Otherwise it returns an empty bytes4 value. + */ +contract SignaturesERC1271WalletForERC1155Test is ProtocolBase { + uint256 private constant price = 1 ether; // Fixed price of sale + uint256 private constant itemId = 0; + bytes private constant _EMPTY_SIGNATURE = new bytes(0); + + function setUp() public { + _setUp(); + _setUpUser(takerUser); + _setupRegistryRoyalties(address(mockERC1155), _standardRoyaltyFee); + } + + function testTakerBid() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _takerBidSetup(address(wallet)); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + vm.startPrank(address(wallet)); + mockERC1155.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + _assertValidMakerOrder(makerAsk, signature); + + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + assertEq(mockERC1155.balanceOf(takerUser, itemId), 1); + } + + function testTakerBidInvalidSignature() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _takerBidSetup(address(wallet)); + + // Signed by a different private key + bytes memory signature = _signMakerOrder(makerAsk, takerUserPK); + + vm.startPrank(address(wallet)); + mockERC1155.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, SIGNATURE_INVALID_EIP1271); + + vm.expectRevert(SignatureERC1271Invalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerBidIsInvalidSignatureReentrancy() public { + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerBid); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _takerBidSetup(address(maliciousERC1271Wallet)); + + vm.expectRevert(IReentrancyGuard.ReentrancyFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, _EMPTY_SIGNATURE, _EMPTY_MERKLE_TREE); + } + + function testTakerAsk() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = _takerAskSetup(address(wallet)); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Wallet needs to hold WETH and have given WETH approval + deal(address(weth), address(wallet), price); + vm.prank(address(wallet)); + weth.approve(address(looksRareProtocol), price); + + _assertValidMakerOrder(makerBid, signature); + + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + assertEq(mockERC1155.balanceOf(address(wallet), itemId), 1); + } + + function testTakerAskInvalidSignature() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = _takerAskSetup(address(wallet)); + + // Signed by a different private key + bytes memory signature = _signMakerOrder(makerBid, takerUserPK); + + // Wallet needs to hold WETH and have given WETH approval + deal(address(weth), address(wallet), price); + vm.prank(address(wallet)); + weth.approve(address(looksRareProtocol), price); + + _assertMakerOrderReturnValidationCode(makerBid, signature, SIGNATURE_INVALID_EIP1271); + + vm.expectRevert(SignatureERC1271Invalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerAskIsValidSignatureReentrancy() public { + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerAsk); + + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = + _takerAskSetup(address(maliciousERC1271Wallet)); + + vm.expectRevert(IReentrancyGuard.ReentrancyFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, _EMPTY_SIGNATURE, _EMPTY_MERKLE_TREE); + } + + function testTakerAskOnERC1155ReceivedReentrancy() public { + MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = new MaliciousOnERC1155ReceivedERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = + _takerAskSetup(address(maliciousERC1271Wallet)); + + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerAsk); + + vm.expectRevert(ERC1155SafeTransferFromFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, _EMPTY_SIGNATURE, _EMPTY_MERKLE_TREE); + } + + function testBatchTakerAsk() public { + ERC1271Wallet wallet = new ERC1271Wallet(makerUser); + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = _batchTakerAskSetup(address(wallet)); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Wallet needs to hold WETH and have given WETH approval + deal(address(weth), address(wallet), price); + vm.prank(address(wallet)); + weth.approve(address(looksRareProtocol), price); + + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + for (uint256 i; i < 10; i++) { + assertEq(mockERC1155.balanceOf(address(wallet), i), 1); + } + } + + function testBatchTakerAskOnERC1155BatchReceivedReentrancy() public { + MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = new MaliciousOnERC1155ReceivedERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = + _batchTakerAskSetup(address(maliciousERC1271Wallet)); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Wallet needs to hold WETH and have given WETH approval + deal(address(weth), address(maliciousERC1271Wallet), price); + vm.prank(address(maliciousERC1271Wallet)); + weth.approve(address(looksRareProtocol), price); + + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerAsk); + + vm.expectRevert(ERC1155SafeBatchTransferFromFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + uint256 private constant numberOfPurchases = 3; + + function testExecuteMultipleTakerBids() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + + ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) = _multipleTakerBidsSetup(address(wallet)); + + vm.startPrank(address(wallet)); + mockERC1155.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberOfPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + for (uint256 i; i < numberOfPurchases; i++) { + assertEq(mockERC1155.balanceOf(takerUser, i), 1); + } + } + + function testExecuteMultipleTakerBidsInvalidSignatures() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + + ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) = _multipleTakerBidsSetup(address(wallet)); + + // Signed by a different private key + for (uint256 i; i < signatures.length; i++) { + signatures[i] = _signMakerOrder(makerAsks[i], takerUserPK); + } + + vm.startPrank(address(wallet)); + mockERC1155.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + vm.expectRevert(SignatureERC1271Invalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberOfPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + } + + function testExecuteMultipleTakerBidsIsValidSignatureReentrancy() public { + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteMultipleTakerBids); + + ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) = _multipleTakerBidsSetup(address(maliciousERC1271Wallet)); + + vm.expectRevert(IReentrancyGuard.ReentrancyFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberOfPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + for (uint256 i; i < numberOfPurchases - 1; i++) { + assertEq(mockERC1155.balanceOf(takerUser, i), 0); + } + } + + function testExecuteMultipleTakerBidsOnERC1155ReceivedReentrancyOnlyInTheLastCall() public { + MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet maliciousERC1271Wallet = + new MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet( + takerUser + ); + _setUpUser(makerUser); + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteMultipleTakerBids); + + ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) = _multipleTakerBidsSetup(makerUser); + + // Set the NFT recipient as the ERC1271 wallet to trigger onERC1155Received + for (uint256 i; i < numberOfPurchases; i++) { + takerBids[i].recipient = address(maliciousERC1271Wallet); + } + + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberOfPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + // First 2 purchases should go through, but the last one fails silently + for (uint256 i; i < numberOfPurchases - 1; i++) { + assertEq(mockERC1155.balanceOf(address(maliciousERC1271Wallet), i), 1); + } + assertEq(mockERC1155.balanceOf(address(maliciousERC1271Wallet), numberOfPurchases - 1), 0); + } + + function _takerBidSetup(address signer) + private + returns (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) + { + // Mint asset + mockERC1155.mint(signer, itemId, 1); + + makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC1155, + orderNonce: 0, + collection: address(mockERC1155), + currency: ETH, + signer: signer, + price: price, + itemId: itemId + }); + + // Prepare the taker bid + takerBid = _genericTakerOrder(); + } + + function _takerAskSetup(address signer) + private + returns (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) + { + makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC1155, + orderNonce: 0, + collection: address(mockERC1155), + currency: address(weth), + signer: signer, + price: price, + itemId: itemId + }); + + // Mint asset + mockERC1155.mint(takerUser, itemId, 1); + + // Prepare the taker ask + takerAsk = _genericTakerOrder(); + } + + function _batchTakerAskSetup(address signer) + private + returns (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) + { + uint256[] memory itemIds = new uint256[](10); + uint256[] memory amounts = new uint256[](10); + + for (uint256 i; i < 10; i++) { + itemIds[i] = i; + amounts[i] = 1; + + // Mint asset + mockERC1155.mint(takerUser, i, 1); + } + + // Prepare the first order + makerBid = _createMultiItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC1155, + orderNonce: 0, + collection: address(mockERC1155), + currency: address(weth), + signer: signer, + price: price, + itemIds: itemIds, + amounts: amounts + }); + + // Prepare the taker ask + takerAsk = _genericTakerOrder(); + } + + function _multipleTakerBidsSetup(address signer) + private + returns ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) + { + makerAsks = new OrderStructs.Maker[](numberOfPurchases); + takerBids = new OrderStructs.Taker[](numberOfPurchases); + signatures = new bytes[](numberOfPurchases); + + for (uint256 i; i < numberOfPurchases; i++) { + // Mint asset + mockERC1155.mint(signer, i, 1); + + makerAsks[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC1155, + orderNonce: i, + collection: address(mockERC1155), + currency: ETH, + signer: signer, + price: price, + itemId: i // 0, 1, etc. + }); + + signatures[i] = _signMakerOrder(makerAsks[i], makerUserPK); + + takerBids[i] = _genericTakerOrder(); + } + + // Other execution parameters + merkleTrees = new OrderStructs.MerkleTree[](numberOfPurchases); + } +} diff --git a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol new file mode 100644 index 00000000..638c416e --- /dev/null +++ b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol @@ -0,0 +1,278 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries and interfaces +import {IReentrancyGuard} from "@looksrare/contracts-libs/contracts/interfaces/IReentrancyGuard.sol"; +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Mocks and other utils +import {ERC1271Wallet} from "./utils/ERC1271Wallet.sol"; +import {MaliciousERC1271Wallet} from "./utils/MaliciousERC1271Wallet.sol"; +import {MaliciousIsValidSignatureERC1271Wallet} from "./utils/MaliciousIsValidSignatureERC1271Wallet.sol"; + +// Errors +import {SignatureERC1271Invalid} from "@looksrare/contracts-libs/contracts/errors/SignatureCheckerErrors.sol"; +import {SIGNATURE_INVALID_EIP1271} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +/** + * @dev ERC1271Wallet recovers a signature's signer using ECDSA. If it matches the mock wallet's + * owner, it returns the magic value. Otherwise it returns an empty bytes4 value. + */ +contract SignaturesERC1271WalletForERC721Test is ProtocolBase { + uint256 private constant price = 1 ether; // Fixed price of sale + bytes private constant _EMPTY_SIGNATURE = new bytes(0); + + function setUp() public { + _setUp(); + _setUpUser(takerUser); + _setupRegistryRoyalties(address(mockERC721), _standardRoyaltyFee); + } + + function testTakerBid() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _takerBidSetup(address(wallet)); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + vm.startPrank(address(wallet)); + mockERC721.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + _assertValidMakerOrder(makerAsk, signature); + + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + assertEq(mockERC721.ownerOf(makerAsk.itemIds[0]), takerUser); + } + + function testTakerBidInvalidSignature() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _takerBidSetup(address(wallet)); + + // Signed by a different private key + bytes memory signature = _signMakerOrder(makerAsk, takerUserPK); + + vm.startPrank(address(wallet)); + mockERC721.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, SIGNATURE_INVALID_EIP1271); + + vm.expectRevert(SignatureERC1271Invalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerBidReentrancy() public { + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerBid); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _takerBidSetup(address(maliciousERC1271Wallet)); + + vm.expectRevert(IReentrancyGuard.ReentrancyFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, _EMPTY_SIGNATURE, _EMPTY_MERKLE_TREE); + } + + function testTakerAsk() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = _takerAskSetup(address(wallet)); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Wallet needs to hold WETH and have given WETH approval + deal(address(weth), address(wallet), price); + vm.prank(address(wallet)); + weth.approve(address(looksRareProtocol), price); + + _assertValidMakerOrder(makerBid, signature); + + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + assertEq(mockERC721.ownerOf(makerBid.itemIds[0]), address(wallet)); + } + + function testTakerAskInvalidSignature() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = _takerAskSetup(address(wallet)); + + // Signed by a different private key + bytes memory signature = _signMakerOrder(makerBid, takerUserPK); + + // Wallet needs to hold WETH and have given WETH approval + deal(address(weth), address(wallet), price); + vm.prank(address(wallet)); + weth.approve(address(looksRareProtocol), price); + + _assertMakerOrderReturnValidationCode(makerBid, signature, SIGNATURE_INVALID_EIP1271); + + vm.expectRevert(SignatureERC1271Invalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerAskReentrancy() public { + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerAsk); + + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = + _takerAskSetup(address(maliciousERC1271Wallet)); + + vm.expectRevert(IReentrancyGuard.ReentrancyFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, _EMPTY_SIGNATURE, _EMPTY_MERKLE_TREE); + } + + uint256 private constant numberPurchases = 3; + + function testExecuteMultipleTakerBids() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + + ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) = _multipleTakerBidsSetup(address(wallet)); + + vm.startPrank(address(wallet)); + mockERC721.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + for (uint256 i; i < numberPurchases; i++) { + assertEq(mockERC721.ownerOf(i), takerUser); + } + } + + function testExecuteMultipleTakerBidsInvalidSignatures() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + + ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) = _multipleTakerBidsSetup(address(wallet)); + + // Signed by a different private key + for (uint256 i; i < signatures.length; i++) { + signatures[i] = _signMakerOrder(makerAsks[i], takerUserPK); + } + + vm.startPrank(address(wallet)); + mockERC721.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + vm.expectRevert(SignatureERC1271Invalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + } + + function testExecuteMultipleTakerBidsReentrancy() public { + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteMultipleTakerBids); + + ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) = _multipleTakerBidsSetup(address(maliciousERC1271Wallet)); + + vm.expectRevert(IReentrancyGuard.ReentrancyFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + } + + function _takerBidSetup(address signer) + private + returns (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) + { + (makerAsk, takerBid) = _createMockMakerAskAndTakerBid(address(mockERC721)); + makerAsk.signer = signer; + // Mint asset + mockERC721.mint(signer, makerAsk.itemIds[0]); + } + + function _takerAskSetup(address signer) + private + returns (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) + { + (makerBid, takerAsk) = _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + makerBid.signer = signer; + // Mint asset + mockERC721.mint(takerUser, makerBid.itemIds[0]); + } + + function _multipleTakerBidsSetup(address signer) + private + returns ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) + { + makerAsks = new OrderStructs.Maker[](numberPurchases); + takerBids = new OrderStructs.Taker[](numberPurchases); + signatures = new bytes[](numberPurchases); + + for (uint256 i; i < numberPurchases; i++) { + // Mint asset + mockERC721.mint(signer, i); + + makerAsks[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: i, + collection: address(mockERC721), + currency: ETH, + signer: signer, + price: price, + itemId: i // 0, 1, etc. + }); + + signatures[i] = _signMakerOrder(makerAsks[i], makerUserPK); + + takerBids[i] = _genericTakerOrder(); + } + + // Other execution parameters + merkleTrees = new OrderStructs.MerkleTree[](numberPurchases); + } +} diff --git a/contracts/test/foundry/marketplace/SignaturesRevertions.t.sol b/contracts/test/foundry/marketplace/SignaturesRevertions.t.sol new file mode 100644 index 00000000..c5f1ef18 --- /dev/null +++ b/contracts/test/foundry/marketplace/SignaturesRevertions.t.sol @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries, interfaces, errors +import { + SignatureParameterVInvalid, + SignatureParameterSInvalid, + SignatureEOAInvalid, + NullSignerAddress, + SignatureLengthInvalid +} from "@looksrare/contracts-libs/contracts/errors/SignatureCheckerErrors.sol"; +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; +import { + INVALID_S_PARAMETER_EOA, + INVALID_V_PARAMETER_EOA, + NULL_SIGNER_EOA, + INVALID_SIGNATURE_LENGTH, + INVALID_SIGNER_EOA +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract SignaturesRevertionsTest is ProtocolBase { + uint256 internal constant _MAX_PRIVATE_KEY = + 115_792_089_237_316_195_423_570_985_008_687_907_852_837_564_279_074_904_382_605_163_141_518_161_494_337; + + function setUp() public { + _setUp(); + } + + function testRevertIfSignatureEOAInvalid(uint256 itemId, uint256 price, uint256 randomPK) public { + // @dev Private keys 1 and 2 are used for maker/taker users + vm.assume(randomPK > 2 && randomPK < _MAX_PRIVATE_KEY); + + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: ETH, + signer: makerUser, + price: price, + itemId: itemId + }); + + address randomUser = vm.addr(randomPK); + _setUpUser(randomUser); + bytes memory signature = _signMakerOrder(makerAsk, randomPK); + _assertMakerOrderReturnValidationCode(makerAsk, signature, INVALID_SIGNER_EOA); + + vm.expectRevert(SignatureEOAInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(_genericTakerOrder(), makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testRevertIfInvalidVParameter(uint256 itemId, uint256 price, uint8 v) public { + vm.assume(v != 27 && v != 28); + + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: ETH, + signer: makerUser, + price: price, + itemId: itemId + }); + + // Sign but replace v by the fuzzed v + bytes32 orderHash = _computeOrderHash(makerAsk); + (, bytes32 r, bytes32 s) = + vm.sign(makerUserPK, keccak256(abi.encodePacked("\x19\x01", _domainSeparator, orderHash))); + bytes memory signature = abi.encodePacked(r, s, v); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, INVALID_V_PARAMETER_EOA); + + vm.expectRevert(abi.encodeWithSelector(SignatureParameterVInvalid.selector, v)); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(_genericTakerOrder(), makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testRevertIfInvalidSParameter(uint256 itemId, uint256 price, bytes32 s) public { + vm.assume(uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0); + + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: ETH, + signer: makerUser, + price: price, + itemId: itemId + }); + + // Sign but replace s by the fuzzed s + bytes32 orderHash = _computeOrderHash(makerAsk); + (uint8 v, bytes32 r,) = + vm.sign(makerUserPK, keccak256(abi.encodePacked("\x19\x01", _domainSeparator, orderHash))); + bytes memory signature = abi.encodePacked(r, s, v); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, INVALID_S_PARAMETER_EOA); + + vm.expectRevert(abi.encodeWithSelector(SignatureParameterSInvalid.selector)); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(_genericTakerOrder(), makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testRevertIfRecoveredSignerIsNullAddress(uint256 itemId, uint256 price) public { + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: ETH, + signer: makerUser, + price: price, + itemId: itemId + }); + + // Sign but replace r by empty bytes32 + bytes32 orderHash = _computeOrderHash(makerAsk); + (uint8 v,, bytes32 s) = + vm.sign(makerUserPK, keccak256(abi.encodePacked("\x19\x01", _domainSeparator, orderHash))); + + bytes32 r; + bytes memory signature = abi.encodePacked(r, s, v); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, NULL_SIGNER_EOA); + + vm.expectRevert(abi.encodeWithSelector(NullSignerAddress.selector)); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(_genericTakerOrder(), makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testRevertIfInvalidSignatureLength(uint256 itemId, uint256 price, uint256 length) public { + // @dev Getting OutOfGas starting from 16,776,985, probably due to memory cost + vm.assume(length != 64 && length != 65 && length < 16_776_985); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + makerAsk.itemIds[0] = itemId; + makerAsk.price = price; + + bytes memory signature = new bytes(length); + _assertMakerOrderReturnValidationCode(makerAsk, signature, INVALID_SIGNATURE_LENGTH); + + vm.expectRevert(abi.encodeWithSelector(SignatureLengthInvalid.selector, length)); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } +} diff --git a/contracts/test/foundry/marketplace/StandardTransactions.t.sol b/contracts/test/foundry/marketplace/StandardTransactions.t.sol new file mode 100644 index 00000000..6d5d8b38 --- /dev/null +++ b/contracts/test/foundry/marketplace/StandardTransactions.t.sol @@ -0,0 +1,508 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries, interfaces, errors +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {LengthsInvalid} from "@hypercerts/marketplace/errors/SharedErrors.sol"; + +import {CreatorFeeManagerWithRoyalties} from "@hypercerts/marketplace/CreatorFeeManagerWithRoyalties.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract StandardTransactionsTest is ProtocolBase { + error ERC721TransferFromFail(); + + uint256 private constant itemId = 420; + uint16 private constant NEW_ROYALTY_FEE = uint16(50); + + function setUp() public { + _setUp(); + CreatorFeeManagerWithRoyalties creatorFeeManager = new CreatorFeeManagerWithRoyalties( + address(royaltyFeeRegistry) + ); + vm.prank(_owner); + looksRareProtocol.updateCreatorFeeManager(address(creatorFeeManager)); + } + + /** + * One ERC721 (where royalties come from the registry) is sold through a taker bid + */ + function testTakerBidERC721WithRoyaltiesFromRegistry(uint256 price) public { + vm.assume(price <= 2 ether); + _setUpUsers(); + _setupRegistryRoyalties(address(mockERC721), NEW_ROYALTY_FEE); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + makerAsk.price = price; + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Mint asset + mockERC721.mint(makerUser, makerAsk.itemIds[0]); + + // Verify validity of maker ask order + _assertValidMakerOrder(makerAsk, signature); + + // Arrays for events + uint256[3] memory expectedFees = _calculateExpectedFees({price: price, royaltyFeeBp: NEW_ROYALTY_FEE}); + address[2] memory expectedRecipients; + + expectedRecipients[0] = makerUser; + expectedRecipients[1] = _royaltyRecipient; + + // Execute taker bid transaction + vm.prank(takerUser); + vm.expectEmit(true, false, false, true); + + emit TakerBid( + NonceInvalidationParameters({ + orderHash: _computeOrderHash(makerAsk), + orderNonce: makerAsk.orderNonce, + isNonceInvalidated: true + }), + takerUser, + takerUser, + makerAsk.strategyId, + makerAsk.currency, + makerAsk.collection, + makerAsk.itemIds, + makerAsk.amounts, + expectedRecipients, + expectedFees + ); + + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulExecutionThroughETH(takerUser, makerUser, price, expectedFees); + + // No leftover in the balance of the contract + assertEq(address(looksRareProtocol).balance, 0); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + /** + * One ERC721 is sold through taker bid. Address zero is specified as the recipient in the taker struct. + */ + function testTakerBidERC721WithAddressZeroSpecifiedAsRecipient(uint256 price) public { + vm.assume(price <= 2 ether); + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockERC721)); + makerAsk.price = price; + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Mint asset + mockERC721.mint(makerUser, makerAsk.itemIds[0]); + + // Adjustment + takerBid.recipient = address(0); + + // Verify validity of maker ask order + _assertValidMakerOrder(makerAsk, signature); + + // Arrays for events + uint256[3] memory expectedFees = _calculateExpectedFees({price: price, royaltyFeeBp: 0}); + address[2] memory expectedRecipients; + + expectedRecipients[0] = makerUser; + expectedRecipients[1] = address(0); // No royalties + + // Execute taker bid transaction + vm.prank(takerUser); + vm.expectEmit(true, false, false, true); + + emit TakerBid( + NonceInvalidationParameters({ + orderHash: _computeOrderHash(makerAsk), + orderNonce: makerAsk.orderNonce, + isNonceInvalidated: true + }), + takerUser, + takerUser, + makerAsk.strategyId, + makerAsk.currency, + makerAsk.collection, + makerAsk.itemIds, + makerAsk.amounts, + expectedRecipients, + expectedFees + ); + + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulExecutionThroughETH(takerUser, makerUser, price, expectedFees); + } + + /** + * One ERC721 (where royalties come from the registry) is sold through a taker ask using WETH + */ + function testTakerAskERC721WithRoyaltiesFromRegistry(uint256 price) public { + vm.assume(price <= 2 ether); + + _setUpUsers(); + _setupRegistryRoyalties(address(mockERC721), NEW_ROYALTY_FEE); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + makerBid.price = price; + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Verify maker bid order + _assertValidMakerOrder(makerBid, signature); + + // Mint asset + mockERC721.mint(takerUser, makerBid.itemIds[0]); + + // Arrays for events + uint256[3] memory expectedFees = _calculateExpectedFees({price: price, royaltyFeeBp: NEW_ROYALTY_FEE}); + address[2] memory expectedRecipients; + + expectedRecipients[0] = takerUser; + expectedRecipients[1] = _royaltyRecipient; + + // Execute taker ask transaction + vm.prank(takerUser); + + vm.expectEmit(true, false, false, true); + + emit TakerAsk( + NonceInvalidationParameters({ + orderHash: _computeOrderHash(makerBid), + orderNonce: makerBid.orderNonce, + isNonceInvalidated: true + }), + takerUser, + makerUser, + makerBid.strategyId, + makerBid.currency, + makerBid.collection, + makerBid.itemIds, + makerBid.amounts, + expectedRecipients, + expectedFees + ); + + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulExecutionThroughWETH(makerUser, takerUser, price, expectedFees); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + /** + * One ERC721 is sold through a taker ask using WETH. Address zero is specified as the recipient in the taker + * struct. + */ + function testTakerAskERC721WithAddressZeroSpecifiedAsRecipient(uint256 price) public { + vm.assume(price <= 2 ether); + _setUpUsers(); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + makerBid.price = price; + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Verify maker bid order + _assertValidMakerOrder(makerBid, signature); + + // Adjustment + takerAsk.recipient = address(0); + + // Mint asset + mockERC721.mint(takerUser, makerBid.itemIds[0]); + + // Arrays for events + uint256[3] memory expectedFees = _calculateExpectedFees({price: price, royaltyFeeBp: 0}); + address[2] memory expectedRecipients; + + expectedRecipients[0] = takerUser; + expectedRecipients[1] = address(0); // No royalties + + // Execute taker ask transaction + vm.prank(takerUser); + vm.expectEmit(true, false, false, true); + + emit TakerAsk( + NonceInvalidationParameters({ + orderHash: _computeOrderHash(makerBid), + orderNonce: makerBid.orderNonce, + isNonceInvalidated: true + }), + takerUser, + makerUser, + makerBid.strategyId, + makerBid.currency, + makerBid.collection, + makerBid.itemIds, + makerBid.amounts, + expectedRecipients, + expectedFees + ); + + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulExecutionThroughWETH(makerUser, takerUser, price, expectedFees); + } + + /** + * Three ERC721 are sold through 3 taker bids in one transaction with non-atomicity. + */ + function testThreeTakerBidsERC721() public { + uint256 price = 0.015 ether; + _setUpUsers(); + + uint256 numberPurchases = 3; + + OrderStructs.Maker[] memory makerAsks = new OrderStructs.Maker[](numberPurchases); + OrderStructs.Taker[] memory takerBids = new OrderStructs.Taker[](numberPurchases); + bytes[] memory signatures = new bytes[](numberPurchases); + + for (uint256 i; i < numberPurchases; i++) { + // Mint asset + mockERC721.mint(makerUser, i); + + makerAsks[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: i, + collection: address(mockERC721), + currency: ETH, + signer: makerUser, + price: price, // Fixed + itemId: i // (0, 1, etc.) + }); + + // Sign order + signatures[i] = _signMakerOrder(makerAsks[i], makerUserPK); + + takerBids[i] = _genericTakerOrder(); + } + + // Other execution parameters + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](numberPurchases); + + // Execute taker bid transaction + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + for (uint256 i; i < numberPurchases; i++) { + // Taker user has received the asset + assertEq(mockERC721.ownerOf(i), takerUser); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, i), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + // Taker bid user pays the whole price + assertEq(address(takerUser).balance, _initialETHBalanceUser - (numberPurchases * price)); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + address(makerUser).balance, + _initialETHBalanceUser + + ((price * _sellerProceedBpWithStandardProtocolFeeBp) * numberPurchases) / ONE_HUNDRED_PERCENT_IN_BP + ); + // No leftover in the balance of the contract + assertEq(address(looksRareProtocol).balance, 0); + } + + /** + * Transaction cannot go through if atomic, goes through if non-atomic (fund returns to buyer). + */ + function testThreeTakerBidsERC721OneFails() public { + _setUpUsers(); + + uint256 numberPurchases = 3; + uint256 faultyTokenId = numberPurchases - 1; + + OrderStructs.Maker[] memory makerAsks = new OrderStructs.Maker[](numberPurchases); + OrderStructs.Taker[] memory takerBids = new OrderStructs.Taker[](numberPurchases); + bytes[] memory signatures = new bytes[](numberPurchases); + + for (uint256 i; i < numberPurchases; i++) { + // Mint asset + mockERC721.mint(makerUser, i); + + makerAsks[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC721, + orderNonce: i, + collection: address(mockERC721), + currency: ETH, + signer: makerUser, + price: 1.4 ether, // Fixed + itemId: i // (0, 1, etc.) + }); + + // Sign order + signatures[i] = _signMakerOrder(makerAsks[i], makerUserPK); + + takerBids[i] = _genericTakerOrder(); + } + + // Transfer tokenId = 2 to random user + address randomUser = address(55); + vm.prank(makerUser); + mockERC721.transferFrom(makerUser, randomUser, faultyTokenId); + + /** + * 1. The whole purchase fails if execution is atomic + */ + { + // Other execution parameters + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](numberPurchases); + + vm.expectRevert(abi.encodeWithSelector(ERC721TransferFromFail.selector)); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: 1.4 ether * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, true + ); + } + + /** + * 2. The whole purchase doesn't fail if execution is not-atomic + */ + { + // Other execution parameters + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](numberPurchases); + + vm.prank(takerUser); + // Execute taker bid transaction + looksRareProtocol.executeMultipleTakerBids{value: 1.4 ether * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + } + + for (uint256 i; i < faultyTokenId; i++) { + // Taker user has received the first two assets + assertEq(mockERC721.ownerOf(i), takerUser); + // Verify the first two nonces are marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, i), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + // Taker user has not received the asset + assertEq(mockERC721.ownerOf(faultyTokenId), randomUser); + // Verify the nonce is NOT marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, faultyTokenId), bytes32(0)); + // Taker bid user pays the whole price + assertEq(address(takerUser).balance, _initialETHBalanceUser - 1 - ((numberPurchases - 1) * 1.4 ether)); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + address(makerUser).balance, + _initialETHBalanceUser + + ((1.4 ether * _sellerProceedBpWithStandardProtocolFeeBp) * (numberPurchases - 1)) + / ONE_HUNDRED_PERCENT_IN_BP + ); + // 1 wei left in the balance of the contract + assertEq(address(looksRareProtocol).balance, 1); + } + + function testThreeTakerBidsERC721LengthsInvalid() public { + _setUpUsers(); + + uint256 price = 1.12121111111 ether; + uint256 numberPurchases = 3; + + OrderStructs.Taker[] memory takerBids = new OrderStructs.Taker[](numberPurchases); + bytes[] memory signatures = new bytes[](numberPurchases); + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](numberPurchases); + + // 1. Invalid maker asks length + OrderStructs.Maker[] memory makerAsks = new OrderStructs.Maker[](numberPurchases - 1); + + vm.expectRevert(LengthsInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + // 2. Invalid signatures length + makerAsks = new OrderStructs.Maker[](numberPurchases); + signatures = new bytes[](numberPurchases - 1); + + vm.expectRevert(LengthsInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + // 3. Invalid merkle trees length + signatures = new bytes[](numberPurchases); + merkleTrees = new OrderStructs.MerkleTree[](numberPurchases - 1); + + vm.expectRevert(LengthsInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + } + + function _calculateExpectedFees(uint256 price, uint256 royaltyFeeBp) + private + pure + returns (uint256[3] memory expectedFees) + { + expectedFees[2] = (price * _standardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + expectedFees[1] = (price * royaltyFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + if (expectedFees[2] + expectedFees[1] < ((price * _minTotalFeeBp) / ONE_HUNDRED_PERCENT_IN_BP)) { + expectedFees[2] = ((price * _minTotalFeeBp) / ONE_HUNDRED_PERCENT_IN_BP) - expectedFees[1]; + } + expectedFees[0] = price - (expectedFees[1] + expectedFees[2]); + } + + function _assertSuccessfulExecutionThroughWETH( + address buyer, + address seller, + uint256 price, + uint256[3] memory expectedFees + ) private { + // Buyer has received the asset + assertEq(mockERC721.ownerOf(itemId), buyer); + // Buyer pays the whole price + assertEq(weth.balanceOf(buyer), _initialWETHBalanceUser - price); + // Seller receives 99.5% of the whole price + assertEq(weth.balanceOf(seller), _initialWETHBalanceUser + expectedFees[0]); + assertEq( + weth.balanceOf(address(protocolFeeRecipient)), + expectedFees[2], + "ProtocolFeeRecipient should receive 1.5% of the whole price" + ); + // Royalty recipient receives 0.5% of the whole price + assertEq(weth.balanceOf(_royaltyRecipient), _initialWETHBalanceRoyaltyRecipient + expectedFees[1]); + } + + function _assertSuccessfulExecutionThroughETH( + address buyer, + address seller, + uint256 price, + uint256[3] memory expectedFees + ) private { + assertEq(mockERC721.ownerOf(itemId), buyer); + // Buyer pays the whole price + assertEq(address(buyer).balance, _initialETHBalanceUser - price); + // Seller receives 99.5% of the whole price + assertEq(address(seller).balance, _initialETHBalanceUser + expectedFees[0]); + // Royalty recipient receives 0.5% of the whole price + assertEq(address(_royaltyRecipient).balance, _initialETHBalanceRoyaltyRecipient + expectedFees[1]); + } +} diff --git a/contracts/test/foundry/marketplace/StrategyManager.t.sol b/contracts/test/foundry/marketplace/StrategyManager.t.sol new file mode 100644 index 00000000..e59128f2 --- /dev/null +++ b/contracts/test/foundry/marketplace/StrategyManager.t.sol @@ -0,0 +1,213 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {IOwnableTwoSteps} from "@looksrare/contracts-libs/contracts/interfaces/IOwnableTwoSteps.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Interfaces +import {IStrategyManager} from "@hypercerts/marketplace/interfaces/IStrategyManager.sol"; +import {IStrategy} from "@hypercerts/marketplace/interfaces/IStrategy.sol"; + +// Random strategy +import {StrategyCollectionOffer} from "@hypercerts/marketplace/executionStrategies/StrategyCollectionOffer.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +contract FalseBaseStrategy is IStrategy { + /** + * @inheritdoc IStrategy + */ + function isMakerOrderValid(OrderStructs.Maker calldata, bytes4) + external + view + override + returns (bool isValid, bytes4 errorSelector) + { + // + } + + /** + * @inheritdoc IStrategy + */ + function isLooksRareV2Strategy() external pure override returns (bool) { + return false; + } +} + +contract StrategyManagerTest is ProtocolBase, IStrategyManager { + function setUp() public { + _setUp(); + } + + /** + * Owner can discontinue strategy + */ + function testOwnerCanDiscontinueStrategy() public asPrankedUser(_owner) { + uint256 strategyId = 0; + uint16 standardProtocolFeeBp = 100; + uint16 minTotalFeeBp = 200; + bool isActive = false; + + vm.expectEmit(false, false, false, true); + emit StrategyUpdated(strategyId, isActive, standardProtocolFeeBp, minTotalFeeBp); + looksRareProtocol.updateStrategy(strategyId, isActive, standardProtocolFeeBp, minTotalFeeBp); + + ( + bool strategyIsActive, + uint16 strategyStandardProtocolFee, + uint16 strategyMinTotalFee, + uint16 strategyMaxProtocolFee, + bytes4 strategySelector, + bool strategyIsMakerBid, + address strategyImplementation + ) = looksRareProtocol.strategyInfo(strategyId); + + assertFalse(strategyIsActive); + assertEq(strategyStandardProtocolFee, standardProtocolFeeBp); + assertEq(strategyMinTotalFee, minTotalFeeBp); + assertEq(strategyMaxProtocolFee, _maxProtocolFeeBp); + assertEq(strategySelector, _EMPTY_BYTES4); + assertFalse(strategyIsMakerBid); + assertEq(strategyImplementation, address(0)); + } + + function testNewStrategyEventIsEmitted() public asPrankedUser(_owner) { + StrategyCollectionOffer strategy = new StrategyCollectionOffer(); + + uint256 strategyId = 1; + bytes4 selector = StrategyCollectionOffer.executeCollectionStrategyWithTakerAsk.selector; + bool isMakerBid = true; + address implementation = address(strategy); + + vm.expectEmit(true, false, false, true); + emit NewStrategy( + strategyId, _standardProtocolFeeBp, _minTotalFeeBp, _maxProtocolFeeBp, selector, isMakerBid, implementation + ); + + _addStrategy(implementation, selector, isMakerBid); + } + + /** + * Owner can change protocol fee information + */ + function testOwnerCanChangeStrategyProtocolFees() public asPrankedUser(_owner) { + uint256 strategyId = 0; + uint16 newStandardProtocolFeeBp = 100; + uint16 newMinTotalFeeBp = 200; + bool isActive = true; + + vm.expectEmit(false, false, false, true); + emit StrategyUpdated(strategyId, isActive, newStandardProtocolFeeBp, newMinTotalFeeBp); + looksRareProtocol.updateStrategy(strategyId, isActive, newStandardProtocolFeeBp, newMinTotalFeeBp); + + ( + bool strategyIsActive, + uint16 strategyStandardProtocolFee, + uint16 strategyMinTotalFee, + uint16 strategyMaxProtocolFee, + bytes4 strategySelector, + bool strategyIsMakerBid, + address strategyImplementation + ) = looksRareProtocol.strategyInfo(strategyId); + + assertTrue(strategyIsActive); + assertEq(strategyStandardProtocolFee, newStandardProtocolFeeBp); + assertEq(strategyMinTotalFee, newMinTotalFeeBp); + assertEq(strategyMaxProtocolFee, _maxProtocolFeeBp); + assertEq(strategySelector, _EMPTY_BYTES4); + assertFalse(strategyIsMakerBid); + assertEq(strategyImplementation, address(0)); + } + + /** + * Owner functions for strategy updates revert as expected under multiple revertion scenarios + */ + function testOwnerRevertionsForInvalidParametersUpdateStrategy() public asPrankedUser(_owner) { + (, uint16 currentStandardProtocolFee, uint16 currentMinTotalFee, uint16 maxProtocolFeeBp,,,) = + looksRareProtocol.strategyInfo(0); + + // 1. newStandardProtocolFee is higher than maxProtocolFeeBp + uint16 newStandardProtocolFee = maxProtocolFeeBp + 1; + uint16 newMinTotalFee = currentMinTotalFee; + vm.expectRevert(StrategyProtocolFeeTooHigh.selector); + looksRareProtocol.updateStrategy(0, true, newStandardProtocolFee, newMinTotalFee); + + // 2. newMinTotalFee is higher than maxProtocolFeeBp + newStandardProtocolFee = currentStandardProtocolFee; + newMinTotalFee = maxProtocolFeeBp + 1; + vm.expectRevert(StrategyProtocolFeeTooHigh.selector); + looksRareProtocol.updateStrategy(0, true, newStandardProtocolFee, newMinTotalFee); + + // 3. It reverts if strategy doesn't exist + vm.expectRevert(StrategyNotUsed.selector); + looksRareProtocol.updateStrategy(1, true, currentStandardProtocolFee, currentMinTotalFee); + } + + /** + * Owner functions for strategy additions revert as expected under multiple revertion scenarios + */ + function testOwnerRevertionsForInvalidParametersAddStrategy() public asPrankedUser(_owner) { + uint16 standardProtocolFeeBp = 250; + uint16 minTotalFeeBp = 300; + uint16 maxProtocolFeeBp = 300; + address implementation = address(0); + + // 1. standardProtocolFeeBp is higher than maxProtocolFeeBp + maxProtocolFeeBp = standardProtocolFeeBp - 1; + vm.expectRevert(abi.encodeWithSelector(IStrategyManager.StrategyProtocolFeeTooHigh.selector)); + looksRareProtocol.addStrategy( + standardProtocolFeeBp, minTotalFeeBp, maxProtocolFeeBp, _EMPTY_BYTES4, true, implementation + ); + + // 2. minTotalFeeBp is higher than maxProtocolFeeBp + maxProtocolFeeBp = minTotalFeeBp - 1; + vm.expectRevert(abi.encodeWithSelector(IStrategyManager.StrategyProtocolFeeTooHigh.selector)); + looksRareProtocol.addStrategy( + standardProtocolFeeBp, minTotalFeeBp, maxProtocolFeeBp, _EMPTY_BYTES4, true, implementation + ); + + // 3. maxProtocolFeeBp is higher than _MAX_PROTOCOL_FEE + maxProtocolFeeBp = 500 + 1; + vm.expectRevert(abi.encodeWithSelector(IStrategyManager.StrategyProtocolFeeTooHigh.selector)); + looksRareProtocol.addStrategy( + standardProtocolFeeBp, minTotalFeeBp, maxProtocolFeeBp, _EMPTY_BYTES4, true, implementation + ); + } + + function testAddStrategyNoSelector() public asPrankedUser(_owner) { + vm.expectRevert(IStrategyManager.StrategyHasNoSelector.selector); + _addStrategy(address(0), _EMPTY_BYTES4, true); + } + + function testAddStrategyNotV2Strategy() public asPrankedUser(_owner) { + bytes4 randomSelector = StrategyCollectionOffer.executeCollectionStrategyWithTakerAsk.selector; + + // 1. EOA + vm.expectRevert(); + _addStrategy(address(0), randomSelector, true); + + // 2. Invalid contract (e.g. LooksRareProtocol) + vm.expectRevert(); + _addStrategy(address(looksRareProtocol), randomSelector, true); + + // 3. Contract that implements the function but returns false + FalseBaseStrategy falseStrategy = new FalseBaseStrategy(); + + vm.expectRevert(NotV2Strategy.selector); + _addStrategy(address(falseStrategy), randomSelector, true); + } + + function testAddStrategyNotOwner() public { + vm.expectRevert(IOwnableTwoSteps.NotOwner.selector); + _addStrategy(address(0), _EMPTY_BYTES4, true); + } + + function testUpdateStrategyNotOwner() public { + vm.expectRevert(IOwnableTwoSteps.NotOwner.selector); + looksRareProtocol.updateStrategy(0, false, 299, 100); + } +} diff --git a/contracts/test/foundry/marketplace/TransferManager.t.sol b/contracts/test/foundry/marketplace/TransferManager.t.sol new file mode 100644 index 00000000..d223cc59 --- /dev/null +++ b/contracts/test/foundry/marketplace/TransferManager.t.sol @@ -0,0 +1,527 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {IOwnableTwoSteps} from "@looksrare/contracts-libs/contracts/interfaces/IOwnableTwoSteps.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Core contracts +import {LooksRareProtocol} from "@hypercerts/marketplace/LooksRareProtocol.sol"; +import {ITransferManager, TransferManager} from "@hypercerts/marketplace/TransferManager.sol"; +import {AmountInvalid, LengthsInvalid} from "@hypercerts/marketplace/errors/SharedErrors.sol"; + +// Mocks and other utils +import {MockERC721} from "../../mock/MockERC721.sol"; +import {MockERC1155} from "../../mock/MockERC1155.sol"; +import {TestHelpers} from "./utils/TestHelpers.sol"; +import {TestParameters} from "./utils/TestParameters.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; + +contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { + address[] public operators; + MockERC721 public mockERC721; + MockERC1155 public mockERC1155; + TransferManager public transferManager; + + uint256 private constant tokenIdERC721 = 55; + uint256 private constant tokenId1ERC1155 = 1; + uint256 private constant amount1ERC1155 = 2; + uint256 private constant tokenId2ERC1155 = 2; + uint256 private constant amount2ERC1155 = 5; + + /** + * 0. Internal helper functions + */ + + function _grantApprovals(address user) private asPrankedUser(user) { + mockERC721.setApprovalForAll(address(transferManager), true); + mockERC1155.setApprovalForAll(address(transferManager), true); + address[] memory approvedOperators = new address[](1); + approvedOperators[0] = _transferrer; + + vm.expectEmit(true, false, false, true); + emit ApprovalsGranted(user, approvedOperators); + transferManager.grantApprovals(approvedOperators); + } + + function _allowOperator(address transferrer) private { + vm.prank(_owner); + vm.expectEmit(true, false, false, true); + emit OperatorAllowed(transferrer); + transferManager.allowOperator(transferrer); + } + + function setUp() public asPrankedUser(_owner) { + transferManager = new TransferManager(_owner); + mockERC721 = new MockERC721(); + mockERC1155 = new MockERC1155(); + operators.push(_transferrer); + + vm.deal(_transferrer, 100 ether); + vm.deal(_sender, 100 ether); + } + + /** + * 1. Happy cases + */ + + function testTransferSingleItemERC721() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + uint256 itemId = 500; + + vm.prank(_sender); + mockERC721.mint(_sender, itemId); + + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = itemId; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + + vm.prank(_transferrer); + transferManager.transferItemsERC721(address(mockERC721), _sender, _recipient, itemIds, amounts); + + assertEq(mockERC721.ownerOf(itemId), _recipient); + } + + function testTransferSingleItemERC1155() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + uint256 itemId = 1; + uint256 amount = 2; + + mockERC1155.mint(_sender, itemId, amount); + + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = itemId; + uint256[] memory amounts = new uint256[](1); + amounts[0] = amount; + + vm.prank(_transferrer); + transferManager.transferItemsERC1155(address(mockERC1155), _sender, _recipient, itemIds, amounts); + + assertEq(mockERC1155.balanceOf(_recipient, itemId), amount); + } + + function testTransferBatchItemsERC721() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + uint256 tokenId1 = 1; + uint256 tokenId2 = 2; + + uint256[] memory itemIds = new uint256[](2); + itemIds[0] = tokenId1; + itemIds[1] = tokenId2; + + uint256[] memory amounts = new uint256[](2); + amounts[0] = 1; + amounts[1] = 1; + + mockERC721.batchMint(_sender, itemIds); + + vm.prank(_transferrer); + transferManager.transferItemsERC721(address(mockERC721), _sender, _recipient, itemIds, amounts); + + assertEq(mockERC721.ownerOf(tokenId1), _recipient); + assertEq(mockERC721.ownerOf(tokenId2), _recipient); + } + + function testTransferBatchItemsERC1155() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + uint256 tokenId1 = 1; + uint256 amount1 = 2; + uint256 tokenId2 = 2; + uint256 amount2 = 5; + + mockERC1155.mint(_sender, tokenId1, amount1); + mockERC1155.mint(_sender, tokenId2, amount2); + + uint256[] memory itemIds = new uint256[](2); + itemIds[0] = tokenId1; + itemIds[1] = tokenId2; + + uint256[] memory amounts = new uint256[](2); + amounts[0] = amount1; + amounts[1] = amount2; + + vm.prank(_transferrer); + transferManager.transferItemsERC1155(address(mockERC1155), _sender, _recipient, itemIds, amounts); + + assertEq(mockERC1155.balanceOf(_recipient, tokenId1), amount1); + assertEq(mockERC1155.balanceOf(_recipient, tokenId2), amount2); + } + + function testTransferBatchItemsAcrossCollectionERC721AndERC1155() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); + + vm.prank(_transferrer); + transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); + + assertEq(mockERC721.ownerOf(tokenIdERC721), _recipient); + assertEq(mockERC1155.balanceOf(_recipient, tokenId1ERC1155), amount1ERC1155); + assertEq(mockERC1155.balanceOf(_recipient, tokenId2ERC1155), amount2ERC1155); + } + + function testTransferBatchItemsAcrossCollectionERC721AndERC1155ByOwner() public asPrankedUser(_sender) { + mockERC721.setApprovalForAll(address(transferManager), true); + mockERC1155.setApprovalForAll(address(transferManager), true); + + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); + + transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); + + assertEq(mockERC721.ownerOf(tokenIdERC721), _recipient); + assertEq(mockERC1155.balanceOf(_recipient, tokenId1ERC1155), amount1ERC1155); + assertEq(mockERC1155.balanceOf(_recipient, tokenId2ERC1155), amount2ERC1155); + } + + /** + * 2. Revertion patterns + */ + function testTransferItemsERC721AmountIsNotOne(uint256 amount) public { + vm.assume(amount != 1); + + _allowOperator(_transferrer); + _grantApprovals(_sender); + + uint256 itemId = 500; + + mockERC721.mint(_sender, itemId); + + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = itemId; + uint256[] memory amounts = new uint256[](1); + amounts[0] = amount; + + vm.expectRevert(AmountInvalid.selector); + vm.prank(_transferrer); + transferManager.transferItemsERC721(address(mockERC721), _sender, _recipient, itemIds, amounts); + } + + function testTransferSingleItemERC1155AmountIsZero() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + uint256 itemId = 500; + + mockERC1155.mint(_sender, itemId, 1); + + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = itemId; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 0; + + vm.expectRevert(AmountInvalid.selector); + vm.prank(_transferrer); + transferManager.transferItemsERC1155(address(mockERC1155), _sender, _recipient, itemIds, amounts); + } + + function testTransferMultipleItemsERC1155AmountIsZero() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + uint256 itemIdOne = 500; + uint256 itemIdTwo = 501; + + mockERC1155.mint(_sender, itemIdOne, 1); + mockERC1155.mint(_sender, itemIdTwo, 1); + + uint256[] memory itemIds = new uint256[](2); + itemIds[0] = itemIdOne; + itemIds[1] = itemIdTwo; + uint256[] memory amounts = new uint256[](2); + amounts[0] = 0; + amounts[1] = 0; + + vm.expectRevert(AmountInvalid.selector); + vm.prank(_transferrer); + transferManager.transferItemsERC1155(address(mockERC1155), _sender, _recipient, itemIds, amounts); + } + + function testTransferBatchItemsAcrossCollectionZeroLength() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + ITransferManager.BatchTransferItem[] memory items = new ITransferManager.BatchTransferItem[](0); + + vm.expectRevert(LengthsInvalid.selector); + vm.prank(_transferrer); + transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); + } + + function testCannotBatchTransferIfERC721AmountIsNotOne(uint256 amount) public { + vm.assume(amount != 1); + + _allowOperator(_transferrer); + _grantApprovals(_sender); + + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); + items[1].amounts[0] = amount; + + vm.expectRevert(AmountInvalid.selector); + vm.prank(_sender); + transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); + } + + function testCannotBatchTransferIfERC1155AmountIsZero() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); + items[0].amounts[0] = 0; + + vm.expectRevert(AmountInvalid.selector); + vm.prank(_sender); + transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); + } + + function testTransferBatchItemsAcrossCollectionPerCollectionItemIdsLengthZero() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); + items[0].itemIds = new uint256[](0); + items[0].amounts = new uint256[](0); + + vm.prank(_transferrer); + vm.expectRevert(LengthsInvalid.selector); + transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); + } + + function testCannotTransferERC721IfOperatorApprovalsRevokedByUserOrOperatorRemovedByOwner() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + // 1. User revokes the operator + vm.prank(_sender); + vm.expectEmit(false, false, false, true); + emit ApprovalsRemoved(_sender, operators); + transferManager.revokeApprovals(operators); + + uint256 itemId = 500; + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = itemId; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + + vm.prank(_transferrer); + vm.expectRevert(ITransferManager.TransferCallerInvalid.selector); + transferManager.transferItemsERC721(address(mockERC721), _sender, _recipient, itemIds, amounts); + + // 2. Sender grants again approvals but owner removes the operators + _grantApprovals(_sender); + vm.prank(_owner); + vm.expectEmit(false, false, false, true); + emit OperatorRemoved(_transferrer); + transferManager.removeOperator(_transferrer); + + vm.prank(_transferrer); + vm.expectRevert(ITransferManager.TransferCallerInvalid.selector); + transferManager.transferItemsERC721(address(mockERC721), _sender, _recipient, itemIds, amounts); + } + + function testCannotTransferERC1155IfOperatorApprovalsRevokedByUserOrOperatorRemovedByOwner() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + // 1. User revokes the operator + vm.prank(_sender); + vm.expectEmit(false, false, false, true); + emit ApprovalsRemoved(_sender, operators); + transferManager.revokeApprovals(operators); + + uint256 itemId = 500; + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = itemId; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 5; + + vm.prank(_transferrer); + vm.expectRevert(ITransferManager.TransferCallerInvalid.selector); + transferManager.transferItemsERC1155(address(mockERC1155), _sender, _recipient, itemIds, amounts); + + // 2. Sender grants again approvals but owner removes the operators + _grantApprovals(_sender); + vm.prank(_owner); + vm.expectEmit(false, false, false, true); + emit OperatorRemoved(_transferrer); + transferManager.removeOperator(_transferrer); + + vm.prank(_transferrer); + vm.expectRevert(ITransferManager.TransferCallerInvalid.selector); + transferManager.transferItemsERC1155(address(mockERC1155), _sender, _recipient, itemIds, amounts); + } + + function testCannotBatchTransferIfOperatorApprovalsRevoked() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + // 1. User revokes the operator + vm.prank(_sender); + vm.expectEmit(false, false, false, true); + emit ApprovalsRemoved(_sender, operators); + transferManager.revokeApprovals(operators); + + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); + + vm.prank(_transferrer); + vm.expectRevert(ITransferManager.TransferCallerInvalid.selector); + transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); + + // 2. Sender grants again approvals but owner removes the operators + _grantApprovals(_sender); + vm.prank(_owner); + vm.expectEmit(false, false, false, true); + emit OperatorRemoved(_transferrer); + transferManager.removeOperator(_transferrer); + + vm.prank(_transferrer); + vm.expectRevert(ITransferManager.TransferCallerInvalid.selector); + transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); + } + + function testCannotTransferERC721OrERC1155IfArrayLengthIs0() public { + uint256[] memory emptyArrayUint256 = new uint256[](0); + + // 1. ERC721 + vm.expectRevert(LengthsInvalid.selector); + transferManager.transferItemsERC721( + address(mockERC721), _sender, _recipient, emptyArrayUint256, emptyArrayUint256 + ); + + // 2. ERC1155 length is 0 + vm.expectRevert(LengthsInvalid.selector); + transferManager.transferItemsERC1155( + address(mockERC1155), _sender, _recipient, emptyArrayUint256, emptyArrayUint256 + ); + } + + function testCannotTransferERC1155IfArrayLengthDiffers() public { + uint256[] memory itemIds = new uint256[](2); + uint256[] memory amounts = new uint256[](3); + + vm.expectRevert(LengthsInvalid.selector); + transferManager.transferItemsERC1155(address(mockERC1155), _sender, _recipient, itemIds, amounts); + } + + function testUserCannotGrantOrRevokeApprovalsIfArrayLengthIs0() public { + address[] memory emptyArrayAddresses = new address[](0); + + // 1. Grant approvals + vm.expectRevert(LengthsInvalid.selector); + transferManager.grantApprovals(emptyArrayAddresses); + + // 2. Revoke approvals + vm.expectRevert(LengthsInvalid.selector); + transferManager.revokeApprovals(emptyArrayAddresses); + } + + function testUserCannotGrantApprovalIfOperatorOperatorNotAllowed() public asPrankedUser(_owner) { + address randomOperator = address(420); + transferManager.allowOperator(randomOperator); + vm.expectRevert(ITransferManager.OperatorAlreadyAllowed.selector); + transferManager.allowOperator(randomOperator); + } + + function testAllowOperatorNotOwner() public { + vm.expectRevert(IOwnableTwoSteps.NotOwner.selector); + transferManager.allowOperator(address(0)); + } + + function testOwnerCannotallowOperatorIfOperatorAlreadyAllowed() public asPrankedUser(_owner) { + address randomOperator = address(420); + transferManager.allowOperator(randomOperator); + vm.expectRevert(ITransferManager.OperatorAlreadyAllowed.selector); + transferManager.allowOperator(randomOperator); + } + + function testOwnerCannotRemoveOperatorIfOperatorNotAllowed() public asPrankedUser(_owner) { + address notOperator = address(420); + vm.expectRevert(ITransferManager.OperatorNotAllowed.selector); + transferManager.removeOperator(notOperator); + } + + function testUserCannotGrantApprovalsIfOperatorNotAllowed() public { + address[] memory approvedOperators = new address[](1); + approvedOperators[0] = _transferrer; + + vm.expectRevert(ITransferManager.OperatorNotAllowed.selector); + vm.prank(_sender); + transferManager.grantApprovals(approvedOperators); + } + + function testUserCannotGrantApprovalsIfOperatorAlreadyApprovedByUser() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + address[] memory approvedOperators = new address[](1); + approvedOperators[0] = _transferrer; + + vm.expectRevert(ITransferManager.OperatorAlreadyApprovedByUser.selector); + vm.prank(_sender); + transferManager.grantApprovals(approvedOperators); + } + + function testUserCannotRevokeApprovalsIfOperatorNotApprovedByUser() public { + address[] memory approvedOperators = new address[](1); + approvedOperators[0] = _transferrer; + + vm.expectRevert(ITransferManager.OperatorNotApprovedByUser.selector); + vm.prank(_sender); + transferManager.revokeApprovals(approvedOperators); + } + + function testRemoveOperatorNotOwner() public { + vm.expectRevert(IOwnableTwoSteps.NotOwner.selector); + transferManager.removeOperator(address(0)); + } + + function _generateValidBatchTransferItems() private returns (BatchTransferItem[] memory items) { + items = new ITransferManager.BatchTransferItem[](2); + + { + mockERC721.mint(_sender, tokenIdERC721); + mockERC1155.mint(_sender, tokenId1ERC1155, amount1ERC1155); + mockERC1155.mint(_sender, tokenId2ERC1155, amount2ERC1155); + + uint256[] memory tokenIdsERC1155 = new uint256[](2); + tokenIdsERC1155[0] = tokenId1ERC1155; + tokenIdsERC1155[1] = tokenId2ERC1155; + + uint256[] memory amountsERC1155 = new uint256[](2); + amountsERC1155[0] = amount1ERC1155; + amountsERC1155[1] = amount2ERC1155; + + uint256[] memory tokenIdsERC721 = new uint256[](1); + tokenIdsERC721[0] = tokenIdERC721; + + uint256[] memory amountsERC721 = new uint256[](1); + amountsERC721[0] = 1; + + items[0] = ITransferManager.BatchTransferItem({ + collection: address(mockERC1155), + collectionType: CollectionType.ERC1155, + itemIds: tokenIdsERC1155, + amounts: amountsERC1155 + }); + items[1] = ITransferManager.BatchTransferItem({ + collection: address(mockERC721), + collectionType: CollectionType.ERC721, + itemIds: tokenIdsERC721, + amounts: amountsERC721 + }); + } + } +} diff --git a/contracts/test/foundry/marketplace/assembly/VerifyOrderTimestampValidityEquivalence.t.sol b/contracts/test/foundry/marketplace/assembly/VerifyOrderTimestampValidityEquivalence.t.sol new file mode 100644 index 00000000..504f0049 --- /dev/null +++ b/contracts/test/foundry/marketplace/assembly/VerifyOrderTimestampValidityEquivalence.t.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +// Assembly +import { + OutsideOfTimeRange_error_selector, + OutsideOfTimeRange_error_length, + Error_selector_offset +} from "@hypercerts/marketplace/constants/AssemblyConstants.sol"; + +contract NonAssemblyCode { + error OutsideOfTimeRange(); + + function run(uint256 startTime, uint256 endTime) external view returns (bool) { + if (startTime > block.timestamp || endTime < block.timestamp) revert OutsideOfTimeRange(); + return true; + } +} + +contract AssemblyCode { + function run(uint256 startTime, uint256 endTime) external view returns (bool) { + assembly { + if or(gt(startTime, timestamp()), lt(endTime, timestamp())) { + mstore(0x00, OutsideOfTimeRange_error_selector) + revert(Error_selector_offset, OutsideOfTimeRange_error_length) + } + } + return true; + } +} + +contract VerifyOrderTimestampValidityEquivalenceTest is Test { + AssemblyCode private assemblyCode; + NonAssemblyCode private nonAssemblyCode; + + function setUp() public { + assemblyCode = new AssemblyCode(); + nonAssemblyCode = new NonAssemblyCode(); + } + + /** + * @dev The gap between start and end time is always at least + * 3 seconds so that we can test the 2 boundaries as well + * as the 2 timestamps inside the boundaries + */ + function testEquivalenceWithinBoundaries(uint256 startTime, uint256 endTime) public { + vm.assume(endTime > 3 && startTime < endTime - 3); + + vm.warp(startTime); + assertTrue(assemblyCode.run(startTime, endTime)); + assertTrue(nonAssemblyCode.run(startTime, endTime)); + + vm.warp(startTime + 1); + assertTrue(assemblyCode.run(startTime, endTime)); + assertTrue(nonAssemblyCode.run(startTime, endTime)); + + vm.warp(endTime - 1); + assertTrue(assemblyCode.run(startTime, endTime)); + assertTrue(nonAssemblyCode.run(startTime, endTime)); + + vm.warp(endTime); + assertTrue(assemblyCode.run(startTime, endTime)); + assertTrue(nonAssemblyCode.run(startTime, endTime)); + } + + function testEquivalenceTooEarly(uint256 startTime, uint256 endTime) public { + vm.assume(startTime > 0 && startTime < endTime); + + vm.warp(startTime - 1); + + vm.expectRevert(NonAssemblyCode.OutsideOfTimeRange.selector); + assemblyCode.run(startTime, endTime); + + vm.expectRevert(NonAssemblyCode.OutsideOfTimeRange.selector); + nonAssemblyCode.run(startTime, endTime); + } + + function testEquivalenceTooLate(uint256 startTime, uint256 endTime) public { + vm.assume(endTime > 0 && endTime < type(uint256).max && startTime < endTime); + + vm.warp(endTime + 1); + + vm.expectRevert(NonAssemblyCode.OutsideOfTimeRange.selector); + assemblyCode.run(startTime, endTime); + + vm.expectRevert(NonAssemblyCode.OutsideOfTimeRange.selector); + nonAssemblyCode.run(startTime, endTime); + } +} diff --git a/contracts/test/foundry/marketplace/executionStrategies/Chainlink/USDDynamicAskOrders.t.sol b/contracts/test/foundry/marketplace/executionStrategies/Chainlink/USDDynamicAskOrders.t.sol new file mode 100644 index 00000000..40a74239 --- /dev/null +++ b/contracts/test/foundry/marketplace/executionStrategies/Chainlink/USDDynamicAskOrders.t.sol @@ -0,0 +1,488 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// Libraries and interfaces +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {IExecutionManager} from "@hypercerts/marketplace/interfaces/IExecutionManager.sol"; +import {IStrategyManager} from "@hypercerts/marketplace/interfaces/IStrategyManager.sol"; + +// Errors and constants +import { + AmountInvalid, + BidTooLow, + OrderInvalid, + CurrencyInvalid, + FunctionSelectorInvalid, + QuoteTypeInvalid +} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import {ChainlinkPriceInvalid, PriceNotRecentEnough} from "@hypercerts/marketplace/errors/ChainlinkErrors.sol"; +import { + MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE, + MAKER_ORDER_TEMPORARILY_INVALID_NON_STANDARD_SALE, + STRATEGY_NOT_ACTIVE +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Strategies +import {StrategyChainlinkUSDDynamicAsk} from + "@hypercerts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.sol"; + +// Mocks and other tests +import {MockChainlinkAggregator} from "../../../../mock/MockChainlinkAggregator.sol"; +import {MockERC20} from "../../../../mock/MockERC20.sol"; +import {ProtocolBase} from "../../ProtocolBase.t.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract USDDynamicAskOrdersTest is ProtocolBase, IStrategyManager { + StrategyChainlinkUSDDynamicAsk public strategyUSDDynamicAsk; + bytes4 public selector = StrategyChainlinkUSDDynamicAsk.executeStrategyWithTakerBid.selector; + + // At block 15740567 + // roundId uint80 : 92233720368547793259 + // answer int256 : 126533075631 + // startedAt uint256 : 1665680123 + // updatedAt uint256 : 1665680123 + // answeredInRound uint80 : 92233720368547793259 + uint256 private constant CHAINLINK_PRICE_UPDATED_AT = 1_665_680_123; + uint256 private constant FORKED_BLOCK_NUMBER = 15_740_567; + uint256 private constant LATEST_CHAINLINK_ANSWER_IN_WAD = 126_533_075_631 * 1e10; + uint256 private constant MAXIMUM_LATENCY = 3600 seconds; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl("mainnet"), FORKED_BLOCK_NUMBER); + _setUp(); + _setUpUsers(); + _setUpNewStrategy(); + } + + function _setUpNewStrategy() private asPrankedUser(_owner) { + strategyUSDDynamicAsk = new StrategyChainlinkUSDDynamicAsk( + _owner, + address(weth), + 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 // Mainnet address of the Chainlink price feed + ); + _addStrategy(address(strategyUSDDynamicAsk), selector, false); + } + + function _createMakerAskAndTakerBid(uint256 numberOfItems, uint256 numberOfAmounts, uint256 desiredSalePriceInUSD) + private + returns (OrderStructs.Maker memory newMakerAsk, OrderStructs.Taker memory newTakerBid) + { + uint256[] memory itemIds = new uint256[](numberOfItems); + for (uint256 i; i < numberOfItems;) { + mockERC721.mint(makerUser, i + 1); + itemIds[i] = i + 1; + unchecked { + ++i; + } + } + + uint256[] memory amounts = new uint256[](numberOfAmounts); + for (uint256 i; i < numberOfAmounts;) { + amounts[i] = 1; + unchecked { + ++i; + } + } + + newMakerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: 0.99 ether, + itemId: 1 + }); + + newMakerAsk.itemIds = itemIds; + newMakerAsk.amounts = amounts; + newMakerAsk.additionalParameters = abi.encode(desiredSalePriceInUSD); + + newTakerBid = OrderStructs.Taker(takerUser, abi.encode(1 ether)); + } + + function testNewStrategy() public { + _assertStrategyAttributes(address(strategyUSDDynamicAsk), selector, false); + } + + function testMaxLatency() public { + assertEq(strategyUSDDynamicAsk.maxLatency(), 3600); + } + + function testUSDDynamicAskChainlinkPriceInvalid() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD + }); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + MockChainlinkAggregator priceFeed = new MockChainlinkAggregator(); + vm.etch(CHAINLINK_ETH_USD_PRICE_FEED, address(priceFeed).code); + + MockChainlinkAggregator(CHAINLINK_ETH_USD_PRICE_FEED).setAnswer(-1); + (bool isValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertFalse(isValid); + assertEq(errorSelector, ChainlinkPriceInvalid.selector); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + MockChainlinkAggregator(CHAINLINK_ETH_USD_PRICE_FEED).setAnswer(0); + (isValid, errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertFalse(isValid); + assertEq(errorSelector, ChainlinkPriceInvalid.selector); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testUSDDynamicAskUSDValueGreaterThanOrEqualToMinAcceptedEthValue() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD + }); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + (bool isValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertTrue(isValid); + assertEq(errorSelector, _EMPTY_BYTES4); + + // Execute taker bid transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockERC721.ownerOf(1), takerUser); + // Taker bid user pays the whole price + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser - 1 ether); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser + 0.995 ether); + } + + function testUSDDynamicAskUSDValueLessThanMinAcceptedEthValue() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + desiredSalePriceInUSD: (LATEST_CHAINLINK_ANSWER_IN_WAD * 98) / 100 + }); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + (bool isValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertTrue(isValid); + assertEq(errorSelector, _EMPTY_BYTES4); + + // Execute taker bid transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockERC721.ownerOf(1), takerUser); + + // Taker bid user pays the whole price + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser - 0.99 ether); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser + 0.98505 ether); + } + + // This tests that we can handle fractions + function testUSDDynamicAskUSDValueLessThanOneETH() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD / 2 + }); + + makerAsk.price = 0.49 ether; + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + (bool isValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertTrue(isValid); + assertEq(errorSelector, _EMPTY_BYTES4); + + // Execute taker bid transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockERC721.ownerOf(1), takerUser); + + // Taker bid user pays the whole price + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser - 0.5 ether); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser + 0.4975 ether); + } + + function testUSDDynamicAskBidderOverpaid() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD + }); + + makerAsk.currency = ETH; + // Bidder overpays by 0.1 ETH + uint256 maxPrice = 1.1 ether; + takerBid.additionalParameters = abi.encode(maxPrice); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + uint256 initialETHBalanceTakerUser = address(takerUser).balance; + uint256 initialETHBalanceMakerUser = address(makerUser).balance; + + (bool isValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertTrue(isValid); + assertEq(errorSelector, _EMPTY_BYTES4); + + // Execute taker bid transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: maxPrice}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockERC721.ownerOf(1), takerUser); + // Taker bid user pays the whole price, but without overpaying + assertEq(address(takerUser).balance, initialETHBalanceTakerUser - 1 ether - 1); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq(address(makerUser).balance, initialETHBalanceMakerUser + 0.995 ether); + } + + function testOraclePriceNotRecentEnough() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD + }); + + makerAsk.startTime = CHAINLINK_PRICE_UPDATED_AT; + uint256 latencyViolationTimestamp = CHAINLINK_PRICE_UPDATED_AT + MAXIMUM_LATENCY + 1 seconds; + makerAsk.endTime = latencyViolationTimestamp; + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + vm.warp(latencyViolationTimestamp); + + bytes4 errorSelector = PriceNotRecentEnough.selector; + + _assertOrderIsInvalid(makerAsk, errorSelector); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_TEMPORARILY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testCannotExecuteIfNotWETHOrETH() public { + MockERC20 fakeCurrency = new MockERC20(); + vm.prank(_owner); + looksRareProtocol.updateCurrencyStatus(address(fakeCurrency), true); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD + }); + + // Adjust the currency to something creative + makerAsk.currency = address(fakeCurrency); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + (bool isValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertFalse(isValid); + assertEq(errorSelector, CurrencyInvalid.selector); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testZeroItemIdsLength() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 0, + numberOfAmounts: 0, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD + }); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + (bool isValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertFalse(isValid); + assertEq(errorSelector, OrderInvalid.selector); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testItemIdsAndAmountsLengthMismatch() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 2, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD + }); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + (bool isValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertFalse(isValid); + assertEq(errorSelector, OrderInvalid.selector); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testWrongQuoteType() public { + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: 1 ether, + itemId: 420 + }); + + (bool orderIsValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerBid, selector); + + assertFalse(orderIsValid); + assertEq(errorSelector, QuoteTypeInvalid.selector); + } + + function testZeroAmount() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD + }); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 0; + makerAsk.amounts = amounts; + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Valid, taker struct validation only happens during execution + (bool isValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertFalse(isValid); + assertEq(errorSelector, OrderInvalid.selector); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testAmountGreaterThanOneForERC721() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD + }); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 2; + makerAsk.amounts = amounts; + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Valid, taker struct validation only happens during execution + _assertOrderIsInvalid(makerAsk, OrderInvalid.selector); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerBidTooLow() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD + }); + + takerBid.additionalParameters = abi.encode(0.99 ether); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Valid, taker struct validation only happens during execution + _assertOrderIsValid(makerAsk); + _assertValidMakerOrder(makerAsk, signature); + + vm.expectRevert(BidTooLow.selector); + vm.prank(takerUser); + + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testInactiveStrategy() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + desiredSalePriceInUSD: LATEST_CHAINLINK_ANSWER_IN_WAD + }); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + vm.prank(_owner); + looksRareProtocol.updateStrategy(1, false, _standardProtocolFeeBp, _minTotalFeeBp); + + _assertOrderIsValid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, STRATEGY_NOT_ACTIVE); + + vm.expectRevert(abi.encodeWithSelector(IExecutionManager.StrategyNotAvailable.selector, 1)); + vm.prank(takerUser); + + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testInvalidSelector() public { + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: 1 ether, + itemId: 420 + }); + + (bool orderIsValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, bytes4(0)); + assertFalse(orderIsValid); + assertEq(errorSelector, FunctionSelectorInvalid.selector); + } + + function _assertOrderIsInvalid(OrderStructs.Maker memory makerAsk, bytes4 expectedErrorSelector) private { + (bool isValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertFalse(isValid); + assertEq(errorSelector, expectedErrorSelector); + } + + function _assertOrderIsValid(OrderStructs.Maker memory makerAsk) private { + (bool isValid, bytes4 errorSelector) = strategyUSDDynamicAsk.isMakerOrderValid(makerAsk, selector); + assertTrue(isValid); + assertEq(errorSelector, _EMPTY_BYTES4); + } +} diff --git a/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol new file mode 100644 index 00000000..9f9efa3f --- /dev/null +++ b/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol @@ -0,0 +1,449 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Murky (third-party) library is used to compute Merkle trees in Solidity +import {Merkle} from "murky/Merkle.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Shared errors +import { + AmountInvalid, + OrderInvalid, + FunctionSelectorInvalid, + MerkleProofInvalid, + QuoteTypeInvalid +} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import {MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE} from + "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Strategies +import {StrategyCollectionOffer} from "@hypercerts/marketplace/executionStrategies/StrategyCollectionOffer.sol"; + +// Base test +import {ProtocolBase} from "../ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract CollectionOrdersTest is ProtocolBase { + StrategyCollectionOffer public strategyCollectionOffer; + bytes4 public selectorNoProof = strategyCollectionOffer.executeCollectionStrategyWithTakerAsk.selector; + bytes4 public selectorWithProof = strategyCollectionOffer.executeCollectionStrategyWithTakerAskWithProof.selector; + + uint256 private constant price = 1 ether; // Fixed price of sale + bytes32 private constant mockMerkleRoot = bytes32(keccak256("Mock")); // Mock merkle root + + function setUp() public { + _setUp(); + _setUpNewStrategies(); + } + + function _setUpNewStrategies() private asPrankedUser(_owner) { + strategyCollectionOffer = new StrategyCollectionOffer(); + _addStrategy(address(strategyCollectionOffer), selectorNoProof, true); + _addStrategy(address(strategyCollectionOffer), selectorWithProof, true); + } + + function testNewStrategies() public { + _assertStrategyAttributes(address(strategyCollectionOffer), selectorNoProof, true); + + ( + bool strategyIsActive, + uint16 strategyStandardProtocolFee, + uint16 strategyMinTotalFee, + uint16 strategyMaxProtocolFee, + bytes4 strategySelector, + bool strategyIsMakerBid, + address strategyImplementation + ) = looksRareProtocol.strategyInfo(2); + + assertTrue(strategyIsActive); + assertEq(strategyStandardProtocolFee, _standardProtocolFeeBp); + assertEq(strategyMinTotalFee, _minTotalFeeBp); + assertEq(strategyMaxProtocolFee, _maxProtocolFeeBp); + assertEq(strategySelector, selectorWithProof); + assertTrue(strategyIsMakerBid); + assertEq(strategyImplementation, address(strategyCollectionOffer)); + } + + function testMakerBidAmountsLengthNotOne() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + // Adjust strategy for collection order and sign order + // Change array to make it bigger than expected + uint256[] memory amounts = new uint256[](2); + amounts[0] = 1; + makerBid.strategyId = 1; + makerBid.amounts = amounts; + takerAsk.additionalParameters = abi.encode(1, 1); + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsInvalid(makerBid, false); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // With proof + makerBid.strategyId = 2; + makerBid.additionalParameters = abi.encode(mockMerkleRoot); + signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsInvalid(makerBid, true); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testZeroAmount() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 0; + makerBid.amounts = amounts; + makerBid.strategyId = 1; + makerBid.additionalParameters = abi.encode(mockMerkleRoot); + takerAsk.additionalParameters = abi.encode(1, 1); + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsInvalid(makerBid, false); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + /** + * Any itemId for ERC721 (where royalties come from the registry) is sold through a collection taker ask using WETH. + * We use fuzzing to generate the tokenId that is sold. + */ + function testTakerAskCollectionOrderERC721(uint256 tokenId) public { + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 // Not used + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Mint asset + mockERC721.mint(takerUser, tokenId); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(tokenId, 1)); + + _assertOrderIsValid(makerBid, false); + _assertValidMakerOrder(makerBid, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerAsk(makerBid, tokenId); + } + + /** + * A collection offer with merkle tree criteria + */ + function testTakerAskCollectionOrderWithMerkleTreeERC721() public { + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 // Not used + }); + + uint256 itemIdInMerkleTree = 2; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProof({ + owner: takerUser, + numberOfItemsInMerkleTree: 5, + itemIdInMerkleTree: itemIdInMerkleTree + }); + + makerBid.additionalParameters = abi.encode(merkleRoot); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(itemIdInMerkleTree, proof)); + + // Verify validity of maker bid order + _assertOrderIsValid(makerBid, true); + _assertValidMakerOrder(makerBid, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerAsk(makerBid, itemIdInMerkleTree); + } + + function testTakerAskCannotExecuteWithInvalidProof(uint256 itemIdSold) public { + vm.assume(itemIdSold > 5); + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 // Not used + }); + + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProof({ + owner: takerUser, + numberOfItemsInMerkleTree: 5, + // Doesn't matter what itemIdInMerkleTree is as we are are going to tamper with the proof + itemIdInMerkleTree: 4 + }); + makerBid.additionalParameters = abi.encode(merkleRoot); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Prepare the taker ask + proof[0] = bytes32(0); // Tamper with the proof + OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(itemIdSold, proof)); + + // Verify validity of maker bid order + _assertOrderIsValid(makerBid, true); + _assertValidMakerOrder(makerBid, signature); + + vm.prank(takerUser); + vm.expectRevert(MerkleProofInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testInvalidAmounts() public { + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(5)); + + // 1. Amount is 0 (without merkle proof) + makerBid.amounts[0] = 0; + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + _assertOrderIsInvalid(makerBid, false); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // 2. Amount is too high for ERC721 (without merkle proof) + makerBid.amounts[0] = 2; + signature = _signMakerOrder(makerBid, makerUserPK); + _assertOrderIsInvalid(makerBid, false); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // 3. Amount is 0 (with merkle proof) + makerBid.strategyId = 2; + uint256 itemIdInMerkleTree = 5; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProof({ + owner: takerUser, + numberOfItemsInMerkleTree: 6, + itemIdInMerkleTree: itemIdInMerkleTree + }); + + makerBid.additionalParameters = abi.encode(merkleRoot); + makerBid.amounts[0] = 0; + signature = _signMakerOrder(makerBid, makerUserPK); + + takerAsk.additionalParameters = abi.encode(itemIdInMerkleTree, proof); + + _assertOrderIsInvalid(makerBid, true); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // 4. Amount is too high for ERC721 (with merkle proof) + makerBid.amounts[0] = 2; + signature = _signMakerOrder(makerBid, makerUserPK); + _assertOrderIsInvalid(makerBid, true); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testMerkleRootLengthIsNot32() public { + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsInvalid(makerBid, true); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(); // It should revert without data (since the root cannot be extracted since the + // additionalParameters length is 0) + looksRareProtocol.executeTakerAsk(_genericTakerOrder(), makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testInvalidSelector() public { + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 3, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + (bool orderIsValid, bytes4 errorSelector) = strategyCollectionOffer.isMakerOrderValid(makerBid, bytes4(0)); + assertFalse(orderIsValid); + assertEq(errorSelector, FunctionSelectorInvalid.selector); + } + + function testWrongQuoteType() public { + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + (bool orderIsValid, bytes4 errorSelector) = strategyCollectionOffer.isMakerOrderValid(makerAsk, selectorNoProof); + + assertFalse(orderIsValid); + assertEq(errorSelector, QuoteTypeInvalid.selector); + } + + function _assertOrderIsValid(OrderStructs.Maker memory makerBid, bool withProof) private { + (bool orderIsValid, bytes4 errorSelector) = + strategyCollectionOffer.isMakerOrderValid(makerBid, withProof ? selectorWithProof : selectorNoProof); + assertTrue(orderIsValid); + assertEq(errorSelector, _EMPTY_BYTES4); + } + + function _assertOrderIsInvalid(OrderStructs.Maker memory makerBid, bool withProof) private { + (bool orderIsValid, bytes4 errorSelector) = + strategyCollectionOffer.isMakerOrderValid(makerBid, withProof ? selectorWithProof : selectorNoProof); + + assertFalse(orderIsValid); + assertEq(errorSelector, OrderInvalid.selector); + } + + function _mintNFTsToOwnerAndGetMerkleRootAndProof( + address owner, + uint256 numberOfItemsInMerkleTree, + uint256 itemIdInMerkleTree + ) private returns (bytes32 merkleRoot, bytes32[] memory proof) { + require(itemIdInMerkleTree < numberOfItemsInMerkleTree, "Invalid itemIdInMerkleTree"); + + // Initialize Merkle Tree + Merkle m = new Merkle(); + + bytes32[] memory merkleTreeIds = new bytes32[](numberOfItemsInMerkleTree); + for (uint256 i; i < numberOfItemsInMerkleTree; i++) { + mockERC721.mint(owner, i); + merkleTreeIds[i] = keccak256(abi.encodePacked(i)); + } + + // Compute merkle root + merkleRoot = m.getRoot(merkleTreeIds); + proof = m.getProof(merkleTreeIds, itemIdInMerkleTree); + + assertTrue(m.verifyProof(merkleRoot, proof, merkleTreeIds[itemIdInMerkleTree])); + } + + function _assertSuccessfulTakerAsk(OrderStructs.Maker memory makerBid, uint256 tokenId) private { + // Taker user has received the asset + assertEq(mockERC721.ownerOf(tokenId), makerUser); + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - price); + // Taker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + weth.balanceOf(takerUser), + _initialWETHBalanceUser + (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } +} diff --git a/contracts/test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol b/contracts/test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol new file mode 100644 index 00000000..4370cb3d --- /dev/null +++ b/contracts/test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol @@ -0,0 +1,407 @@ +/// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries and interfaces +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {IExecutionManager} from "@hypercerts/marketplace/interfaces/IExecutionManager.sol"; +import {IStrategyManager} from "@hypercerts/marketplace/interfaces/IStrategyManager.sol"; + +// Shared errors +import { + AmountInvalid, + BidTooLow, + OrderInvalid, + FunctionSelectorInvalid, + QuoteTypeInvalid +} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import { + STRATEGY_NOT_ACTIVE, + MAKER_ORDER_TEMPORARILY_INVALID_NON_STANDARD_SALE, + MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Strategies +import {StrategyDutchAuction} from "@hypercerts/marketplace/executionStrategies/StrategyDutchAuction.sol"; + +// Other tests +import {ProtocolBase} from "../ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract DutchAuctionOrdersTest is ProtocolBase, IStrategyManager { + StrategyDutchAuction public strategyDutchAuction; + bytes4 public selector = StrategyDutchAuction.executeStrategyWithTakerBid.selector; + + function setUp() public { + _setUp(); + } + + function _setUpNewStrategy() private asPrankedUser(_owner) { + strategyDutchAuction = new StrategyDutchAuction(); + _addStrategy(address(strategyDutchAuction), selector, false); + } + + function _createMakerAskAndTakerBid( + uint256 numberOfItems, + uint256 numberOfAmounts, + uint256 startPrice, + uint256 endPrice, + uint256 endTime + ) private returns (OrderStructs.Maker memory newMakerAsk, OrderStructs.Taker memory newTakerBid) { + uint256[] memory itemIds = new uint256[](numberOfItems); + for (uint256 i; i < numberOfItems;) { + mockERC721.mint(makerUser, i + 1); + itemIds[i] = i + 1; + unchecked { + ++i; + } + } + + uint256[] memory amounts = new uint256[](numberOfAmounts); + for (uint256 i; i < numberOfAmounts;) { + amounts[i] = 1; + unchecked { + ++i; + } + } + + newMakerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: endPrice, + itemId: 1 + }); + + newMakerAsk.itemIds = itemIds; + newMakerAsk.amounts = amounts; + + newMakerAsk.endTime = endTime; + newMakerAsk.additionalParameters = abi.encode(startPrice); + + // Using startPrice as the maxPrice + newTakerBid = OrderStructs.Taker(takerUser, abi.encode(startPrice)); + } + + function testNewStrategy() public { + _setUpNewStrategy(); + _assertStrategyAttributes(address(strategyDutchAuction), selector, false); + } + + function _fuzzAssumptions(uint256 _startPrice, uint256 _duration, uint256 _decayPerSecond, uint256 _elapsedTime) + private + returns (uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) + { + // Bound instead of assume to handle too many rejections + // These limits should be realistically way more than enough + // vm.assume(duration > 0 && duration <= 31_536_000); + // Assume the NFT is worth at least 0.01 USD at today's ETH price (2023-01-13 18:00:00 UTC) + // vm.assume(startPrice > 1e12 && startPrice <= 100_000 ether); + // vm.assume(decayPerSecond > 0 && decayPerSecond < startPrice); + // vm.assume(elapsedTime <= duration && startPrice > decayPerSecond * duration); + + duration = bound(_duration, 1, 31_536_600); + startPrice = bound(_startPrice, 1e12, 100_000 ether); + decayPerSecond = bound(_decayPerSecond, 1, startPrice); + + vm.assume(_elapsedTime <= duration && startPrice > decayPerSecond * duration); + elapsedTime = _elapsedTime; + } + + function _calculatePrices(uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) + private + pure + returns (uint256 endPrice, uint256 executionPrice) + { + endPrice = startPrice - decayPerSecond * duration; + uint256 discount = decayPerSecond * elapsedTime; + executionPrice = startPrice - discount; + } + + function testDutchAuction(uint256 _startPrice, uint256 _duration, uint256 _decayPerSecond, uint256 _elapsedTime) + public + { + (uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) = + _fuzzAssumptions(_startPrice, _duration, _decayPerSecond, _elapsedTime); + _setUpUsers(); + _setUpNewStrategy(); + + (uint256 endPrice, uint256 executionPrice) = _calculatePrices(startPrice, duration, decayPerSecond, elapsedTime); + + deal(address(weth), takerUser, executionPrice); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: startPrice, + endPrice: endPrice, + endTime: block.timestamp + duration + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertOrderIsValid(makerAsk); + _assertValidMakerOrder(makerAsk, signature); + + vm.warp(block.timestamp + elapsedTime); + + // Execute taker bid transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockERC721.ownerOf(1), takerUser); + + // Taker bid user pays the whole price + assertEq(weth.balanceOf(takerUser), 0, "taker balance incorrect"); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + uint256 protocolFee = (executionPrice * _standardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + assertEq( + weth.balanceOf(makerUser), + _initialWETHBalanceUser + (executionPrice - protocolFee), + "maker balance incorrect" + ); + } + + function testStartPriceTooLow(uint256 _startPrice, uint256 _duration, uint256 _decayPerSecond, uint256 _elapsedTime) + public + { + (uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) = + _fuzzAssumptions(_startPrice, _duration, _decayPerSecond, _elapsedTime); + _setUpUsers(); + _setUpNewStrategy(); + + (uint256 endPrice, uint256 executionPrice) = _calculatePrices(startPrice, duration, decayPerSecond, elapsedTime); + deal(address(weth), takerUser, executionPrice); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: startPrice, + endPrice: endPrice, + endTime: block.timestamp + duration + }); + + makerAsk.price = startPrice + 1 wei; + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerBidTooLow(uint256 _startPrice, uint256 _duration, uint256 _decayPerSecond, uint256 _elapsedTime) + public + { + (uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) = + _fuzzAssumptions(_startPrice, _duration, _decayPerSecond, _elapsedTime); + _setUpUsers(); + _setUpNewStrategy(); + + (uint256 endPrice, uint256 executionPrice) = _calculatePrices(startPrice, duration, decayPerSecond, elapsedTime); + deal(address(weth), takerUser, executionPrice); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: startPrice, + endPrice: endPrice, + endTime: block.timestamp + duration + }); + + takerBid.additionalParameters = abi.encode(executionPrice - 1 wei); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Valid, taker struct validation only happens during execution + _assertOrderIsValid(makerAsk); + _assertValidMakerOrder(makerAsk, signature); + + vm.expectRevert(BidTooLow.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testInactiveStrategy() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: 10 ether, + endPrice: 1 ether, + endTime: block.timestamp + 1 hours + }); + + vm.prank(_owner); + looksRareProtocol.updateStrategy(1, false, _standardProtocolFeeBp, _minTotalFeeBp); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertOrderIsValid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, STRATEGY_NOT_ACTIVE); + + vm.prank(takerUser); + vm.expectRevert(abi.encodeWithSelector(IExecutionManager.StrategyNotAvailable.selector, 1)); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testZeroItemIdsLength() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 0, + numberOfAmounts: 0, + startPrice: 10 ether, + endPrice: 1 ether, + endTime: block.timestamp + 1 hours + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testItemIdsAndAmountsLengthMismatch() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 2, + startPrice: 10 ether, + endPrice: 1 ether, + endTime: block.timestamp + 1 hours + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testInvalidAmounts() public { + _setUpUsers(); + _setUpNewStrategy(); + + // 1. Amount = 0 + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: 10 ether, + endPrice: 1 ether, + endTime: block.timestamp + 1 hours + }); + + makerAsk.amounts[0] = 0; + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(AmountInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // 2. ERC721 amount > 1 + makerAsk.amounts[0] = 2; + signature = _signMakerOrder(makerAsk, makerUserPK); + + errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testWrongQuoteType() public { + _setUpNewStrategy(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: 1 ether, + itemId: 420 + }); + + (bool orderIsValid, bytes4 errorSelector) = strategyDutchAuction.isMakerOrderValid(makerBid, selector); + + assertFalse(orderIsValid); + assertEq(errorSelector, QuoteTypeInvalid.selector); + } + + function testInvalidSelector() public { + _setUpNewStrategy(); + + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: 1 ether, + itemId: 420 + }); + + (bool orderIsValid, bytes4 errorSelector) = strategyDutchAuction.isMakerOrderValid(makerAsk, bytes4(0)); + assertFalse(orderIsValid); + assertEq(errorSelector, FunctionSelectorInvalid.selector); + } + + function _assertOrderIsValid(OrderStructs.Maker memory makerAsk) private { + (bool isValid, bytes4 errorSelector) = strategyDutchAuction.isMakerOrderValid(makerAsk, selector); + assertTrue(isValid); + assertEq(errorSelector, _EMPTY_BYTES4); + } + + function _assertOrderIsInvalid(OrderStructs.Maker memory makerAsk) private returns (bytes4) { + (bool isValid, bytes4 errorSelector) = strategyDutchAuction.isMakerOrderValid(makerAsk, selector); + assertFalse(isValid); + assertEq(errorSelector, OrderInvalid.selector); + + return errorSelector; + } +} diff --git a/contracts/test/foundry/marketplace/executionStrategies/ItemIdsRangeOrders.t.sol b/contracts/test/foundry/marketplace/executionStrategies/ItemIdsRangeOrders.t.sol new file mode 100644 index 00000000..07199143 --- /dev/null +++ b/contracts/test/foundry/marketplace/executionStrategies/ItemIdsRangeOrders.t.sol @@ -0,0 +1,486 @@ +/// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries and interfaces +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {IExecutionManager} from "@hypercerts/marketplace/interfaces/IExecutionManager.sol"; +import {IStrategyManager} from "@hypercerts/marketplace/interfaces/IStrategyManager.sol"; + +// Shared errors +import { + OrderInvalid, FunctionSelectorInvalid, QuoteTypeInvalid +} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import { + STRATEGY_NOT_ACTIVE, + MAKER_ORDER_TEMPORARILY_INVALID_NON_STANDARD_SALE, + MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Strategies +import {StrategyItemIdsRange} from "@hypercerts/marketplace/executionStrategies/StrategyItemIdsRange.sol"; + +// Base test +import {ProtocolBase} from "../ProtocolBase.t.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract ItemIdsRangeOrdersTest is ProtocolBase, IStrategyManager { + StrategyItemIdsRange public strategyItemIdsRange; + bytes4 public selector = StrategyItemIdsRange.executeStrategyWithTakerAsk.selector; + + function setUp() public { + _setUp(); + } + + function _setUpNewStrategy() private asPrankedUser(_owner) { + strategyItemIdsRange = new StrategyItemIdsRange(); + _addStrategy(address(strategyItemIdsRange), selector, true); + } + + function _offeredAmounts(uint256 length, uint256 amount) private pure returns (uint256[] memory offeredAmounts) { + offeredAmounts = new uint256[](length); + for (uint256 i; i < length; i++) { + offeredAmounts[i] = amount; + } + } + + function _createMakerBidAndTakerAsk(uint256 lowerBound, uint256 upperBound) + private + returns (OrderStructs.Maker memory newMakerBid, OrderStructs.Taker memory newTakerAsk) + { + uint256 mid = (lowerBound + upperBound) / 2; + + newMakerBid = _createMultiItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: 1 ether, + itemIds: new uint256[](0), + amounts: new uint256[](0) + }); + + newMakerBid.additionalParameters = abi.encode(lowerBound, upperBound, 3); + + // This way, we can test + // 1. lower bound is 0 + // 2. lower bound is > 0, and 0 is excluded + if (lowerBound > 0) { + mockERC721.mint(takerUser, lowerBound - 1); + } + + mockERC721.mint(takerUser, lowerBound); + mockERC721.mint(takerUser, mid); + mockERC721.mint(takerUser, upperBound); + mockERC721.mint(takerUser, upperBound + 1); + + uint256[] memory takerAskItemIds = new uint256[](3); + takerAskItemIds[0] = lowerBound; + takerAskItemIds[1] = mid; + takerAskItemIds[2] = upperBound; + + newTakerAsk = OrderStructs.Taker({ + recipient: takerUser, + additionalParameters: abi.encode(takerAskItemIds, _offeredAmounts({length: 3, amount: 1})) + }); + } + + function testNewStrategy() public { + _setUpNewStrategy(); + _assertStrategyAttributes(address(strategyItemIdsRange), selector, true); + } + + function testTokenIdsRangeERC721(uint256 lowerBound, uint256 upperBound) public { + vm.assume(lowerBound < type(uint128).max && upperBound < type(uint128).max && lowerBound + 1 < upperBound); + + uint256 mid = (lowerBound + upperBound) / 2; + + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMakerBidAndTakerAsk(lowerBound, upperBound); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsValid(makerBid); + _assertValidMakerOrder(makerBid, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Maker user has received the asset + assertEq(mockERC721.ownerOf(lowerBound), makerUser); + assertEq(mockERC721.ownerOf(mid), makerUser); + assertEq(mockERC721.ownerOf(upperBound), makerUser); + + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - 1 ether); + // Taker ask user receives 99.5% of the whole price (0.5% protocol fee) + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser + 0.995 ether); + } + + function testTokenIdsRangeERC1155(uint256 lowerBound, uint256 upperBound) public { + vm.assume(lowerBound < type(uint128).max && upperBound < type(uint128).max && lowerBound + 1 < upperBound); + + uint256 mid = (lowerBound + upperBound) / 2; + + _setUpUsers(); + _setUpNewStrategy(); + + OrderStructs.Maker memory makerBid = _createMultiItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.ERC1155, + orderNonce: 0, + collection: address(mockERC1155), + currency: address(weth), + signer: makerUser, + price: 1 ether, + itemIds: new uint256[](0), + amounts: new uint256[](0) + }); + + makerBid.additionalParameters = abi.encode(lowerBound, upperBound, 6); + + mockERC1155.mint(takerUser, lowerBound, 2); + mockERC1155.mint(takerUser, mid, 2); + mockERC1155.mint(takerUser, upperBound, 2); + + uint256[] memory takerAskItemIds = new uint256[](3); + takerAskItemIds[0] = lowerBound; + takerAskItemIds[1] = mid; + takerAskItemIds[2] = upperBound; + + OrderStructs.Taker memory takerAsk = OrderStructs.Taker({ + recipient: takerUser, + additionalParameters: abi.encode(takerAskItemIds, _offeredAmounts({length: 3, amount: 2})) + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsValid(makerBid); + _assertValidMakerOrder(makerBid, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Maker user has received the asset + assertEq(mockERC1155.balanceOf(makerUser, lowerBound), 2); + assertEq(mockERC1155.balanceOf(makerUser, mid), 2); + assertEq(mockERC1155.balanceOf(makerUser, upperBound), 2); + + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - 1 ether); + // Taker ask user receives 99.5% of the whole price (0.5% protocol fee) + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser + 0.995 ether); + } + + function testInvalidMakerBidAdditionalParameters() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = _createMakerBidAndTakerAsk(5, 10); + + makerBid.additionalParameters = abi.encode(6, 9); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + vm.expectRevert(); // EVM revert + strategyItemIdsRange.isMakerOrderValid(makerBid, selector); + + vm.expectRevert(); // EVM revert + orderValidator.checkMakerOrderValidity(makerBid, signature, _EMPTY_MERKLE_TREE); + + vm.expectRevert(); // EVM revert + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testZeroDesiredAmount() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = _createMakerBidAndTakerAsk(5, 10); + + makerBid.additionalParameters = abi.encode(5, 10, 0); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerBid); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testWrongQuoteType() public { + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid,) = _createMakerBidAndTakerAsk(5, 10); + makerBid.quoteType = QuoteType.Ask; + + (bool isValid, bytes4 errorSelector) = strategyItemIdsRange.isMakerOrderValid(makerBid, selector); + + assertFalse(isValid); + assertEq(errorSelector, QuoteTypeInvalid.selector); + } + + function testTakerAskItemIdsAmountsLengthMismatch() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = _createMakerBidAndTakerAsk(5, 10); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsValid(makerBid); + _assertValidMakerOrder(makerBid, signature); + + uint256[] memory takerAskItemIds = new uint256[](3); + takerAskItemIds[0] = 5; + takerAskItemIds[1] = 7; + takerAskItemIds[2] = 10; + takerAsk.additionalParameters = abi.encode(takerAskItemIds, _offeredAmounts({length: 4, amount: 1})); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerAskRevertIfAmountIsZeroOrGreaterThanOneERC721() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = _createMakerBidAndTakerAsk(5, 10); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + uint256[] memory takerAskItemIds = new uint256[](3); + takerAskItemIds[0] = 5; + takerAskItemIds[1] = 7; + takerAskItemIds[2] = 10; + + uint256[] memory invalidAmounts = new uint256[](3); + invalidAmounts[0] = 1; + invalidAmounts[1] = 2; + invalidAmounts[2] = 2; + + takerAsk.additionalParameters = abi.encode(takerAskItemIds, invalidAmounts); + + // The maker bid order is still valid since the error comes from the taker ask amounts + _assertOrderIsValid(makerBid); + _assertValidMakerOrder(makerBid, signature); + + // It fails at 2nd item in the array (greater than 1) + vm.expectRevert(OrderInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Re-adjust the amounts + invalidAmounts[0] = 0; + invalidAmounts[1] = 1; + invalidAmounts[2] = 1; + + takerAsk.additionalParameters = abi.encode(takerAskItemIds, invalidAmounts); + + // It now fails at 1st item in the array (equal to 0) + vm.expectRevert(OrderInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testMakerBidItemIdsLowerBandHigherThanOrEqualToUpperBand() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = _createMakerBidAndTakerAsk(5, 10); + + // lower band > upper band + makerBid.additionalParameters = abi.encode(5, 4, 1); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerBid); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // lower band == upper band + makerBid.additionalParameters = abi.encode(5, 5, 1); + + // Sign order + signature = _signMakerOrder(makerBid, makerUserPK); + + vm.expectRevert(OrderInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerAskDuplicatedItemIds() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = _createMakerBidAndTakerAsk(5, 10); + + uint256[] memory invalidItemIds = new uint256[](3); + invalidItemIds[0] = 5; + invalidItemIds[1] = 7; + invalidItemIds[2] = 7; + + takerAsk.additionalParameters = abi.encode(invalidItemIds, _offeredAmounts({length: 3, amount: 1})); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Valid, taker struct validation only happens during execution + _assertOrderIsValid(makerBid); + _assertValidMakerOrder(makerBid, signature); + + vm.expectRevert(OrderInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerAskUnsortedItemIds() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = _createMakerBidAndTakerAsk(5, 10); + + uint256[] memory invalidItemIds = new uint256[](3); + invalidItemIds[0] = 5; + invalidItemIds[1] = 10; + invalidItemIds[2] = 7; + + takerAsk.additionalParameters = abi.encode(invalidItemIds, _offeredAmounts({length: 3, amount: 1})); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Valid, taker struct validation only happens during execution + _assertOrderIsValid(makerBid); + _assertValidMakerOrder(makerBid, signature); + + vm.expectRevert(OrderInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerAskOfferedAmountNotEqualToDesiredAmount() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = _createMakerBidAndTakerAsk(5, 10); + + uint256[] memory itemIds = new uint256[](2); + itemIds[0] = 5; + itemIds[1] = 10; + + takerAsk.additionalParameters = abi.encode(itemIds, _offeredAmounts({length: 2, amount: 1})); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Valid, taker struct validation only happens during execution + _assertOrderIsValid(makerBid); + _assertValidMakerOrder(makerBid, signature); + + vm.expectRevert(OrderInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerAskOfferedItemIdTooLow() public { + _testTakerAskOfferedItemIdOutOfRange(3, 4); + } + + function testTakerAskOfferedItemIdTooHigh() public { + _testTakerAskOfferedItemIdOutOfRange(11, 12); + } + + function _testTakerAskOfferedItemIdOutOfRange(uint256 itemIdOne, uint256 itemIdTwo) private { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = _createMakerBidAndTakerAsk(5, 10); + uint256[] memory itemIds = new uint256[](2); + itemIds[0] = itemIdOne; + itemIds[1] = itemIdTwo; + + takerAsk.additionalParameters = abi.encode(itemIds, _offeredAmounts({length: 2, amount: 1})); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsValid(makerBid); + _assertValidMakerOrder(makerBid, signature); + + vm.expectRevert(OrderInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testInactiveStrategy() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = _createMakerBidAndTakerAsk(5, 10); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + vm.prank(_owner); + looksRareProtocol.updateStrategy(1, false, _standardProtocolFeeBp, _minTotalFeeBp); + + // Valid, taker struct validation only happens during execution + _assertOrderIsValid(makerBid); + // but... the OrderValidator catches this + _assertMakerOrderReturnValidationCode(makerBid, signature, STRATEGY_NOT_ACTIVE); + + vm.expectRevert(abi.encodeWithSelector(IExecutionManager.StrategyNotAvailable.selector, 1)); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testInvalidSelector() public { + _setUpNewStrategy(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: 1 ether, + itemId: 0 + }); + + (bool orderIsValid, bytes4 errorSelector) = strategyItemIdsRange.isMakerOrderValid(makerBid, bytes4(0)); + assertFalse(orderIsValid); + assertEq(errorSelector, FunctionSelectorInvalid.selector); + } + + function _assertOrderIsValid(OrderStructs.Maker memory makerBid) private { + (bool isValid, bytes4 errorSelector) = strategyItemIdsRange.isMakerOrderValid(makerBid, selector); + assertTrue(isValid); + assertEq(errorSelector, _EMPTY_BYTES4); + } + + function _assertOrderIsInvalid(OrderStructs.Maker memory makerBid) private returns (bytes4) { + (bool isValid, bytes4 errorSelector) = strategyItemIdsRange.isMakerOrderValid(makerBid, selector); + assertFalse(isValid); + assertEq(errorSelector, OrderInvalid.selector); + return errorSelector; + } +} diff --git a/contracts/test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol b/contracts/test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol new file mode 100644 index 00000000..5fd15bda --- /dev/null +++ b/contracts/test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol @@ -0,0 +1,187 @@ +/// SPDX-License-Identifier: MIT +pragma solidity >=0.8.7; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Interfaces +import {IExecutionManager} from "@hypercerts/marketplace/interfaces/IExecutionManager.sol"; +import {IStrategyManager} from "@hypercerts/marketplace/interfaces/IStrategyManager.sol"; + +// Mock files and other tests +import {StrategyTestMultiFillCollectionOrder} from "../utils/StrategyTestMultiFillCollectionOrder.sol"; +import {ProtocolBase} from "../ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract MultiFillCollectionOrdersTest is ProtocolBase, IStrategyManager { + uint256 private constant price = 1 ether; // Fixed price of sale + + bytes4 public selector = StrategyTestMultiFillCollectionOrder.executeStrategyWithTakerAsk.selector; + + StrategyTestMultiFillCollectionOrder public strategyMultiFillCollectionOrder; + + function setUp() public { + _setUp(); + } + + function _setUpNewStrategy() private asPrankedUser(_owner) { + strategyMultiFillCollectionOrder = new StrategyTestMultiFillCollectionOrder(address(looksRareProtocol)); + _addStrategy(address(strategyMultiFillCollectionOrder), selector, true); + } + + function testNewStrategy() public { + _setUpNewStrategy(); + _assertStrategyAttributes(address(strategyMultiFillCollectionOrder), selector, true); + } + + /** + * Maker bid user wants to buy 4 ERC721 items in a collection. The order can be filled in multiple parts. + * First takerUser sells 1 item. + * Second takerUser sells 3 items. + */ + function testMultiFill() public { + _setUpUsers(); + _setUpNewStrategy(); + + uint256 amountsToFill = 4; + + uint256[] memory itemIds = new uint256[](0); + uint256[] memory amounts = new uint256[](1); + amounts[0] = amountsToFill; + + OrderStructs.Maker memory makerBid = _createMultiItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, // Multi-fill bid offer + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemIds: itemIds, + amounts: amounts + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + itemIds = new uint256[](1); + amounts = new uint256[](1); + itemIds[0] = 0; + amounts[0] = 1; + + mockERC721.mint(takerUser, itemIds[0]); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(itemIds, amounts)); + + // Execute the first taker ask transaction by the first taker user + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockERC721.ownerOf(0), makerUser); + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - price); + // Taker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + weth.balanceOf(takerUser), + _initialWETHBalanceUser + (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Verify the nonce is not marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), _computeOrderHash(makerBid)); + + // Second taker user actions + address secondTakerUser = address(420); + _setUpUser(secondTakerUser); + + itemIds = new uint256[](3); + amounts = new uint256[](3); + + itemIds[0] = 1; // tokenId = 1 + itemIds[1] = 2; // tokenId = 2 + itemIds[2] = 3; // tokenId = 3 + amounts[0] = 1; + amounts[1] = 1; + amounts[2] = 1; + + mockERC721.batchMint(secondTakerUser, itemIds); + + // Prepare the taker ask + takerAsk = OrderStructs.Taker(secondTakerUser, abi.encode(itemIds, amounts)); + + // Execute a second taker ask transaction from the second taker user + vm.prank(secondTakerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the 3 assets + assertEq(mockERC721.ownerOf(1), makerUser); + assertEq(mockERC721.ownerOf(2), makerUser); + assertEq(mockERC721.ownerOf(3), makerUser); + + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - 4 * price); + // Taker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + weth.balanceOf(secondTakerUser), + _initialWETHBalanceUser + + 3 * ((price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP) + ); + // Verify the nonce is now marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + function testInactiveStrategy() public { + _setUpUsers(); + _setUpNewStrategy(); + + uint256 amountsToFill = 4; + + uint256[] memory itemIds = new uint256[](0); + uint256[] memory amounts = new uint256[](1); + amounts[0] = amountsToFill; + + OrderStructs.Maker memory makerBid = _createMultiItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, // Multi-fill bid offer + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemIds: itemIds, + amounts: amounts + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + vm.prank(_owner); + looksRareProtocol.updateStrategy(1, false, _standardProtocolFeeBp, _minTotalFeeBp); + + { + itemIds = new uint256[](1); + amounts = new uint256[](1); + itemIds[0] = 0; + amounts[0] = 1; + + mockERC721.mint(takerUser, itemIds[0]); + + // It should revert if strategy is not available + vm.prank(takerUser); + vm.expectRevert(abi.encodeWithSelector(IExecutionManager.StrategyNotAvailable.selector, 1)); + looksRareProtocol.executeTakerAsk(_genericTakerOrder(), makerBid, signature, _EMPTY_MERKLE_TREE); + } + } +} diff --git a/contracts/test/foundry/marketplace/utils/BytesLib.sol b/contracts/test/foundry/marketplace/utils/BytesLib.sol new file mode 100644 index 00000000..7d0a3ffa --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/BytesLib.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/* + * @title Solidity Bytes Arrays Utils + * @author Gonçalo Sá + * @notice We only copied the `slice` function from the original https://github.com/GNSPS/solidity-bytes-utils + * as that's the only function needed. + * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. + * The library lets you slice bytes arrays in memory. + */ +library BytesLib { + function slice(bytes memory _bytes, uint256 _start, uint256 _length) internal pure returns (bytes memory) { + require(_length + 31 >= _length, "slice_overflow"); + require(_bytes.length >= _start + _length, "slice_outOfBounds"); + + bytes memory tempBytes; + + assembly { + switch iszero(_length) + case 0 { + // Get a location of some free memory and store it in tempBytes as + // Solidity does for memory variables. + tempBytes := mload(0x40) + + // The first word of the slice result is potentially a partial + // word read from the original array. To read it, we calculate + // the length of that partial word and start copying that many + // bytes into the array. The first word we copy will start with + // data we don't care about, but the last `lengthmod` bytes will + // land at the beginning of the contents of the new array. When + // we're done copying, we overwrite the full first word with + // the actual length of the slice. + let lengthmod := and(_length, 31) + + // The multiplication in the next line is necessary + // because when slicing multiples of 32 bytes (lengthmod == 0) + // the following copy loop was copying the origin's length + // and then ending prematurely not copying everything it should. + let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) + let end := add(mc, _length) + + for { + // The multiplication in the next line has the same exact purpose + // as the one above. + let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) + } lt(mc, end) { + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { mstore(mc, mload(cc)) } + + mstore(tempBytes, _length) + + //update free-memory pointer + //allocating the array padded to 32 bytes like the compiler does now + mstore(0x40, and(add(mc, 31), not(31))) + } + //if we want a zero-length slice let's just return a zero-length array + default { + tempBytes := mload(0x40) + //zero out the 32 bytes slice we are about to return + //we need to do it because Solidity does not garbage collect + mstore(tempBytes, 0) + + mstore(0x40, add(tempBytes, 0x20)) + } + } + + return tempBytes; + } +} diff --git a/contracts/test/foundry/marketplace/utils/EIP712MerkleTree.sol b/contracts/test/foundry/marketplace/utils/EIP712MerkleTree.sol new file mode 100644 index 00000000..00e89a30 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/EIP712MerkleTree.sol @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Forge test +import {Test} from "forge-std/Test.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Core contracts +import {LooksRareProtocol} from "@hypercerts/marketplace/LooksRareProtocol.sol"; + +// Utils +import {MerkleWithPosition} from "./MerkleWithPosition.sol"; +import {MathLib} from "./MathLib.sol"; + +// Constants +import {MAX_CALLDATA_PROOF_LENGTH} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +contract EIP712MerkleTree is Test { + using OrderStructs for OrderStructs.Maker; + + LooksRareProtocol private looksRareProtocol; + + constructor(LooksRareProtocol _looksRareProtocol) { + looksRareProtocol = _looksRareProtocol; + } + + function sign(uint256 privateKey, OrderStructs.Maker[] memory makerOrders, uint256 makerOrderIndex) + external + returns (bytes memory signature, OrderStructs.MerkleTree memory merkleTree) + { + uint256 bidCount = makerOrders.length; + uint256 treeHeight = MathLib.log2(bidCount); + if (2 ** treeHeight != bidCount || treeHeight == 0) { + treeHeight += 1; + } + bytes32 batchOrderTypehash = _getBatchOrderTypehash(treeHeight); + uint256 leafCount = 2 ** treeHeight; + OrderStructs.MerkleTreeNode[] memory leaves = new OrderStructs.MerkleTreeNode[](leafCount); + + for (uint256 i; i < bidCount; i++) { + leaves[i] = OrderStructs.MerkleTreeNode({ + value: makerOrders[i].hash(), + position: i % 2 == 0 ? OrderStructs.MerkleTreeNodePosition.Left : OrderStructs.MerkleTreeNodePosition.Right + }); + } + + bytes32 emptyMakerOrderHash = _emptyMakerOrderHash(); + for (uint256 i = bidCount; i < leafCount; i++) { + leaves[i] = OrderStructs.MerkleTreeNode({ + value: emptyMakerOrderHash, + position: i % 2 == 0 ? OrderStructs.MerkleTreeNodePosition.Left : OrderStructs.MerkleTreeNodePosition.Right + }); + } + + MerkleWithPosition merkle = new MerkleWithPosition(); + OrderStructs.MerkleTreeNode[] memory proof = merkle.getProof(leaves, makerOrderIndex); + bytes32 root = merkle.getRoot(leaves); + + signature = _sign(privateKey, batchOrderTypehash, root); + merkleTree = OrderStructs.MerkleTree({root: root, proof: proof}); + } + + function _emptyMakerOrderHash() private pure returns (bytes32 makerOrderHash) { + OrderStructs.Maker memory makerOrder; + makerOrderHash = makerOrder.hash(); + } + + function _sign(uint256 privateKey, bytes32 batchOrderTypehash, bytes32 root) + private + view + returns (bytes memory signature) + { + bytes32 digest = keccak256(abi.encode(batchOrderTypehash, root)); + + bytes32 domainSeparator = looksRareProtocol.domainSeparator(); + + (uint8 v, bytes32 r, bytes32 s) = + vm.sign(privateKey, keccak256(abi.encodePacked("\x19\x01", domainSeparator, digest))); + + signature = abi.encodePacked(r, s, v); + } + + function _getBatchOrderTypehash(uint256 treeHeight) private pure returns (bytes32 batchOrderTypehash) { + if (treeHeight == 1) { + batchOrderTypehash = hex"9661287f7a4aa4867db46a2453ee15bebac4e8fc25667a58718da658f15de643"; + } else if (treeHeight == 2) { + batchOrderTypehash = hex"a54ab330ea9e1dfccee2b86f3666989e7fbd479704416c757c8de8e820142a08"; + } else if (treeHeight == 3) { + batchOrderTypehash = hex"93390f5d45ede9dea305f16aec86b2472af4f823851637f1b7019ad0775cea49"; + } else if (treeHeight == 4) { + batchOrderTypehash = hex"9dda2c8358da895e43d574bb15954ce5727b22e923a2d8f28261f297bce42f0b"; + } else if (treeHeight == 5) { + batchOrderTypehash = hex"92dc717124e161262f9d10c7079e7d54dc51271893fba54aa4a0f270fecdcc98"; + } else if (treeHeight == 6) { + batchOrderTypehash = hex"ce02aee5a7a35d40d974463c4c6e5534954fb07a7e7bc966fee268a15337bfd8"; + } else if (treeHeight == 7) { + batchOrderTypehash = hex"f7a65efd167a18f7091b2bb929d687dd94503cf0a43620487055ed7d6b727559"; + } else if (treeHeight == 8) { + batchOrderTypehash = hex"def24acacad1318b664520f7c10e8bc6d1e7f6f6f7c8b031e70624ceb42266a6"; + } else if (treeHeight == 9) { + batchOrderTypehash = hex"4cb4080dc4e7bae88b4dc4307ad5117fa4f26195998a1b5f40368809d7f4c7f2"; + } else if (treeHeight == 10) { + batchOrderTypehash = hex"f8b1f864164d8d6e0b45f1399bd711223117a4ab0b057a9c2d7779e86a7c88db"; + } else if (treeHeight == 11) { + batchOrderTypehash = hex"4787f505db237e03a7193c312d5159add8a5705278e1c7dcf92ab87126cbe490"; + } else if (treeHeight == 12) { + batchOrderTypehash = hex"7a6517e5a16c56b29947b57b748aa91736987376e1a366d948e7a802a9df3431"; + } else if (treeHeight == 13) { + batchOrderTypehash = hex"35806d347e9929042ce209d143da48f100f0ff0cbdb1fde68cf13af8059d79df"; + } + } +} diff --git a/contracts/test/foundry/marketplace/utils/ERC1271Wallet.sol b/contracts/test/foundry/marketplace/utils/ERC1271Wallet.sol new file mode 100644 index 00000000..f6eaf418 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/ERC1271Wallet.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {ERC1271WalletMock} from "openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol"; + +contract ERC1271Wallet is ERC1271WalletMock { + constructor(address originalOwner) ERC1271WalletMock(originalOwner) {} + + function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) { + return this.onERC1155Received.selector; + } + + function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata) + external + pure + returns (bytes4) + { + return this.onERC1155BatchReceived.selector; + } +} diff --git a/contracts/test/foundry/marketplace/utils/GasGriefer.sol b/contracts/test/foundry/marketplace/utils/GasGriefer.sol new file mode 100644 index 00000000..2589681c --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/GasGriefer.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +contract GasGriefer { + receive() external payable { + uint256 count; + while (true) { + count += 1; + } + } + + function isValidSignature(bytes32, bytes memory) external pure returns (bytes4 magicValue) { + magicValue = this.isValidSignature.selector; + } +} diff --git a/contracts/test/foundry/marketplace/utils/MaliciousERC1271Wallet.sol b/contracts/test/foundry/marketplace/utils/MaliciousERC1271Wallet.sol new file mode 100644 index 00000000..c13ff909 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/MaliciousERC1271Wallet.sol @@ -0,0 +1,66 @@ +/// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {ILooksRareProtocol} from "@hypercerts/marketplace/interfaces/ILooksRareProtocol.sol"; +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +abstract contract MaliciousERC1271Wallet { + enum FunctionToReenter { + None, + ExecuteTakerAsk, + ExecuteTakerBid, + ExecuteMultipleTakerBids + } + + ILooksRareProtocol internal immutable looksRareProtocol; + FunctionToReenter internal functionToReenter; + + constructor(address _looksRareProtocol) { + looksRareProtocol = ILooksRareProtocol(_looksRareProtocol); + } + + function setFunctionToReenter(FunctionToReenter _functionToReenter) external { + functionToReenter = _functionToReenter; + } + + function isValidSignature(bytes32, bytes calldata) external virtual returns (bytes4 magicValue) { + magicValue = this.isValidSignature.selector; + } + + function onERC1155Received(address, address, uint256, uint256, bytes calldata) external virtual returns (bytes4) { + return this.onERC1155Received.selector; + } + + function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata) + external + virtual + returns (bytes4) + { + return this.onERC1155BatchReceived.selector; + } + + function _executeTakerAsk(bytes memory signature) internal { + OrderStructs.Taker memory takerAsk; + OrderStructs.Maker memory makerBid; + OrderStructs.MerkleTree memory merkleTree; + + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, merkleTree); + } + + function _executeTakerBid(bytes memory signature) internal { + OrderStructs.Taker memory takerBid; + OrderStructs.Maker memory makerAsk; + OrderStructs.MerkleTree memory merkleTree; + + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, merkleTree); + } + + function _executeMultipleTakerBids() internal { + OrderStructs.Taker[] memory takerBids = new OrderStructs.Taker[](2); + OrderStructs.Maker[] memory makerAsks = new OrderStructs.Maker[](2); + bytes[] memory signatures = new bytes[](2); + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](2); + + looksRareProtocol.executeMultipleTakerBids(takerBids, makerAsks, signatures, merkleTrees, false); + } +} diff --git a/contracts/test/foundry/marketplace/utils/MaliciousIsValidSignatureERC1271Wallet.sol b/contracts/test/foundry/marketplace/utils/MaliciousIsValidSignatureERC1271Wallet.sol new file mode 100644 index 00000000..c8aaf1ef --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/MaliciousIsValidSignatureERC1271Wallet.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {MaliciousERC1271Wallet} from "./MaliciousERC1271Wallet.sol"; + +contract MaliciousIsValidSignatureERC1271Wallet is MaliciousERC1271Wallet { + constructor(address _looksRareProtocol) MaliciousERC1271Wallet(_looksRareProtocol) {} + + function isValidSignature(bytes32, bytes calldata signature) external override returns (bytes4 magicValue) { + if (functionToReenter == FunctionToReenter.ExecuteTakerAsk) { + _executeTakerAsk(signature); + } else if (functionToReenter == FunctionToReenter.ExecuteTakerBid) { + _executeTakerBid(signature); + } else if (functionToReenter == FunctionToReenter.ExecuteMultipleTakerBids) { + _executeMultipleTakerBids(); + } + + magicValue = this.isValidSignature.selector; + } +} diff --git a/contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedERC1271Wallet.sol b/contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedERC1271Wallet.sol new file mode 100644 index 00000000..cc790326 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedERC1271Wallet.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {MaliciousERC1271Wallet} from "./MaliciousERC1271Wallet.sol"; + +contract MaliciousOnERC1155ReceivedERC1271Wallet is MaliciousERC1271Wallet { + constructor(address _looksRareProtocol) MaliciousERC1271Wallet(_looksRareProtocol) {} + + function onERC1155Received(address, address, uint256, uint256, bytes memory) external override returns (bytes4) { + if (functionToReenter == FunctionToReenter.ExecuteTakerAsk) { + _executeTakerAsk(new bytes(0)); + } else if (functionToReenter == FunctionToReenter.ExecuteTakerBid) { + _executeTakerBid(new bytes(0)); + } else if (functionToReenter == FunctionToReenter.ExecuteMultipleTakerBids) { + _executeMultipleTakerBids(); + } + + return this.onERC1155Received.selector; + } + + function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata) + external + override + returns (bytes4) + { + if (functionToReenter == FunctionToReenter.ExecuteTakerAsk) { + _executeTakerAsk(new bytes(0)); + } else if (functionToReenter == FunctionToReenter.ExecuteTakerBid) { + _executeTakerBid(new bytes(0)); + } else if (functionToReenter == FunctionToReenter.ExecuteMultipleTakerBids) { + _executeMultipleTakerBids(); + } + + return this.onERC1155BatchReceived.selector; + } +} diff --git a/contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet.sol b/contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet.sol new file mode 100644 index 00000000..95ba4347 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {MaliciousERC1271Wallet} from "./MaliciousERC1271Wallet.sol"; + +contract MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet is MaliciousERC1271Wallet { + uint256 private isValidSignatureEnterCount; + + constructor(address _looksRareProtocol) MaliciousERC1271Wallet(_looksRareProtocol) {} + + function onERC1155Received(address, address, uint256, uint256, bytes memory) external override returns (bytes4) { + if (++isValidSignatureEnterCount == 3) { + if (functionToReenter == FunctionToReenter.ExecuteTakerAsk) { + _executeTakerAsk(new bytes(0)); + } else if (functionToReenter == FunctionToReenter.ExecuteTakerBid) { + _executeTakerBid(new bytes(0)); + } else if (functionToReenter == FunctionToReenter.ExecuteMultipleTakerBids) { + _executeMultipleTakerBids(); + } + } + + return this.onERC1155Received.selector; + } +} diff --git a/contracts/test/foundry/marketplace/utils/MathLib.sol b/contracts/test/foundry/marketplace/utils/MathLib.sol new file mode 100644 index 00000000..f0897c30 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/MathLib.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @author OpenZeppelin (last updated v4.8.0) (utils/math/Math.sol) + * @dev Standard math utilities missing in the Solidity language. + */ +library MathLib { + /** + * @dev Return the log in base 2, rounded down, of a positive value. + * Returns 0 if given 0. + */ + function log2(uint256 value) internal pure returns (uint256) { + uint256 result = 0; + unchecked { + if (value >> 128 > 0) { + value >>= 128; + result += 128; + } + if (value >> 64 > 0) { + value >>= 64; + result += 64; + } + if (value >> 32 > 0) { + value >>= 32; + result += 32; + } + if (value >> 16 > 0) { + value >>= 16; + result += 16; + } + if (value >> 8 > 0) { + value >>= 8; + result += 8; + } + if (value >> 4 > 0) { + value >>= 4; + result += 4; + } + if (value >> 2 > 0) { + value >>= 2; + result += 2; + } + if (value >> 1 > 0) { + result += 1; + } + } + return result; + } +} diff --git a/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol b/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol new file mode 100644 index 00000000..43857193 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol @@ -0,0 +1,157 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +/** + * @dev Modified from MurkyBase to add each node's position after hashing. + * hashLeafPair does not sort the nodes to match EIP-712. + */ +contract MerkleWithPosition { + /** + * + * PROOF GENERATION * + * + */ + + function getRoot(OrderStructs.MerkleTreeNode[] memory data) public pure returns (bytes32) { + require(data.length > 1, "won't generate root for single leaf"); + while (data.length > 1) { + data = hashLevel(data); + } + return data[0].value; + } + + function getProof(OrderStructs.MerkleTreeNode[] memory data, uint256 node) + public + pure + returns (OrderStructs.MerkleTreeNode[] memory result) + { + require(data.length > 1, "won't generate proof for single leaf"); + // The size of the proof is equal to the ceiling of log2(numLeaves) + result = new OrderStructs.MerkleTreeNode[](log2ceilBitMagic(data.length)); + uint256 pos = 0; + + // Two overflow risks: node, pos + // node: max array size is 2**256-1. Largest index in the array will be 1 less than that. Also, + // for dynamic arrays, size is limited to 2**64-1 + // pos: pos is bounded by log2(data.length), which should be less than type(uint256).max + while (data.length > 1) { + unchecked { + if (node & 0x1 == 1) { + result[pos] = data[node - 1]; + } else if (node + 1 == data.length) { + result[pos] = OrderStructs.MerkleTreeNode({ + value: bytes32(0), + position: OrderStructs.MerkleTreeNodePosition.Left + }); + } else { + result[pos] = data[node + 1]; + } + ++pos; + node /= 2; + } + data = hashLevel(data); + } + return result; + } + + ///@dev function is private to prevent unsafe data from being passed + function hashLevel(OrderStructs.MerkleTreeNode[] memory data) + private + pure + returns (OrderStructs.MerkleTreeNode[] memory result) + { + // Function is private, and all internal callers check that data.length >=2. + // Underflow is not possible as lowest possible value for data/result index is 1 + // overflow should be safe as length is / 2 always. + unchecked { + uint256 length = data.length; + if (length & 0x1 == 1) { + result = new OrderStructs.MerkleTreeNode[](length / 2 + 1); + bytes32 hashed = hashLeafPairs(data[length - 1].value, bytes32(0)); + result[result.length - 1] = + OrderStructs.MerkleTreeNode({value: hashed, position: OrderStructs.MerkleTreeNodePosition.Left}); + } else { + result = new OrderStructs.MerkleTreeNode[](length / 2); + } + // pos is upper bounded by data.length / 2, so safe even if array is at max size + uint256 pos = 0; + bool nextIsLeft = true; + for (uint256 i = 0; i < length - 1; i += 2) { + bytes32 hashed = hashLeafPairs(data[i].value, data[i + 1].value); + result[pos] = OrderStructs.MerkleTreeNode({ + value: hashed, + position: nextIsLeft + ? OrderStructs.MerkleTreeNodePosition.Left + : OrderStructs.MerkleTreeNodePosition.Right + }); + nextIsLeft = !nextIsLeft; + ++pos; + } + } + return result; + } + + /** + * + * MATH "LIBRARY" * + * + */ + + /// Original bitmagic adapted from https://github.com/paulrberg/prb-math/blob/main/contracts/PRBMath.sol + /// @dev Note that x assumed > 1 + function log2ceilBitMagic(uint256 x) public pure returns (uint256) { + if (x <= 1) { + return 0; + } + uint256 msb = 0; + uint256 _x = x; + if (x >= 2 ** 128) { + x >>= 128; + msb += 128; + } + if (x >= 2 ** 64) { + x >>= 64; + msb += 64; + } + if (x >= 2 ** 32) { + x >>= 32; + msb += 32; + } + if (x >= 2 ** 16) { + x >>= 16; + msb += 16; + } + if (x >= 2 ** 8) { + x >>= 8; + msb += 8; + } + if (x >= 2 ** 4) { + x >>= 4; + msb += 4; + } + if (x >= 2 ** 2) { + x >>= 2; + msb += 2; + } + if (x >= 2 ** 1) { + msb += 1; + } + + uint256 lsb = (~_x + 1) & _x; + if ((lsb == _x) && (msb > 0)) { + return msb; + } else { + return msb + 1; + } + } + + function hashLeafPairs(bytes32 left, bytes32 right) public pure returns (bytes32 _hash) { + assembly { + mstore(0x0, left) + mstore(0x20, right) + _hash := keccak256(0x0, 0x40) + } + } +} diff --git a/contracts/test/foundry/marketplace/utils/MockOrderGenerator.sol b/contracts/test/foundry/marketplace/utils/MockOrderGenerator.sol new file mode 100644 index 00000000..d6e695f5 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/MockOrderGenerator.sol @@ -0,0 +1,146 @@ +/// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Generic interfaces +import {IERC165} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC165.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Other helpers +import {ProtocolHelpers} from "../utils/ProtocolHelpers.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract MockOrderGenerator is ProtocolHelpers { + function _createMockMakerAskAndTakerBid(address collection) + internal + view + returns (OrderStructs.Maker memory newMakerAsk, OrderStructs.Taker memory newTakerBid) + { + CollectionType collectionType = _getCollectionType(collection); + + newMakerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: collectionType, + orderNonce: 0, + collection: collection, + currency: ETH, + signer: makerUser, + price: 1 ether, + itemId: 420 + }); + + newTakerBid = OrderStructs.Taker(takerUser, abi.encode()); + } + + function _createMockMakerBidAndTakerAsk(address collection, address currency) + internal + view + returns (OrderStructs.Maker memory newMakerBid, OrderStructs.Taker memory newTakerAsk) + { + CollectionType collectionType = _getCollectionType(collection); + + newMakerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: collectionType, + orderNonce: 0, + collection: collection, + currency: currency, + signer: makerUser, + price: 1 ether, + itemId: 420 + }); + + newTakerAsk = OrderStructs.Taker(takerUser, abi.encode()); + } + + function _createMockMakerAskAndTakerBidWithBundle(address collection, uint256 numberTokens) + internal + view + returns (OrderStructs.Maker memory newMakerAsk, OrderStructs.Taker memory newTakerBid) + { + CollectionType collectionType = _getCollectionType(collection); + + (uint256[] memory itemIds, uint256[] memory amounts) = _setBundleItemIdsAndAmounts(collectionType, numberTokens); + + newMakerAsk = _createMultiItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: collectionType, + orderNonce: 0, + collection: collection, + currency: ETH, + signer: makerUser, + price: 1 ether, + itemIds: itemIds, + amounts: amounts + }); + + newTakerBid = OrderStructs.Taker(takerUser, abi.encode()); + } + + function _createMockMakerBidAndTakerAskWithBundle(address collection, address currency, uint256 numberTokens) + internal + view + returns (OrderStructs.Maker memory newMakerBid, OrderStructs.Taker memory newTakerAsk) + { + CollectionType collectionType = _getCollectionType(collection); + + (uint256[] memory itemIds, uint256[] memory amounts) = _setBundleItemIdsAndAmounts(collectionType, numberTokens); + + newMakerBid = _createMultiItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: collectionType, + orderNonce: 0, + collection: collection, + currency: currency, + signer: makerUser, + price: 1 ether, + itemIds: itemIds, + amounts: amounts + }); + + newTakerAsk = OrderStructs.Taker(takerUser, abi.encode()); + } + + function _getCollectionType(address collection) private view returns (CollectionType collectionType) { + collectionType = CollectionType.ERC721; + + // If ERC1155, adjust the collection type + if (IERC165(collection).supportsInterface(0xd9b67a26)) { + collectionType = CollectionType.ERC1155; + } + } + + function _setBundleItemIdsAndAmounts(CollectionType collectionType, uint256 numberTokens) + private + pure + returns (uint256[] memory itemIds, uint256[] memory amounts) + { + itemIds = new uint256[](numberTokens); + amounts = new uint256[](numberTokens); + + for (uint256 i; i < itemIds.length; i++) { + itemIds[i] = i; + if (collectionType != CollectionType.ERC1155) { + amounts[i] = 1; + } else { + amounts[i] = 1 + i; + } + } + } +} diff --git a/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol b/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol new file mode 100644 index 00000000..a8c092b6 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol @@ -0,0 +1,107 @@ +/// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Dependencies +import {BatchOrderTypehashRegistry} from "@hypercerts/marketplace/BatchOrderTypehashRegistry.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Other tests +import {TestHelpers} from "./TestHelpers.sol"; +import {TestParameters} from "./TestParameters.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract ProtocolHelpers is TestHelpers, TestParameters { + using OrderStructs for OrderStructs.Maker; + + bytes32 internal _domainSeparator; + + receive() external payable {} + + function _createSingleItemMakerOrder( + QuoteType quoteType, + uint256 globalNonce, + uint256 subsetNonce, + uint256 strategyId, + CollectionType collectionType, + uint256 orderNonce, + address collection, + address currency, + address signer, + uint256 price, + uint256 itemId + ) internal view returns (OrderStructs.Maker memory makerOrder) { + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = itemId; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + + makerOrder = OrderStructs.Maker({ + quoteType: quoteType, + globalNonce: globalNonce, + subsetNonce: subsetNonce, + orderNonce: orderNonce, + strategyId: strategyId, + collectionType: collectionType, + collection: collection, + currency: currency, + signer: signer, + startTime: block.timestamp, + endTime: block.timestamp + 1, + price: price, + itemIds: itemIds, + amounts: amounts, + additionalParameters: abi.encode() + }); + } + + function _createMultiItemMakerOrder( + QuoteType quoteType, + uint256 globalNonce, + uint256 subsetNonce, + uint256 strategyId, + CollectionType collectionType, + uint256 orderNonce, + address collection, + address currency, + address signer, + uint256 price, + uint256[] memory itemIds, + uint256[] memory amounts + ) internal view returns (OrderStructs.Maker memory newMakerBid) { + newMakerBid = OrderStructs.Maker({ + quoteType: quoteType, + globalNonce: globalNonce, + subsetNonce: subsetNonce, + orderNonce: orderNonce, + strategyId: strategyId, + collectionType: collectionType, + collection: collection, + currency: currency, + signer: signer, + startTime: block.timestamp, + endTime: block.timestamp + 1, + price: price, + itemIds: itemIds, + amounts: amounts, + additionalParameters: abi.encode() + }); + } + + function _signMakerOrder(OrderStructs.Maker memory maker, uint256 signerKey) internal view returns (bytes memory) { + bytes32 orderHash = _computeOrderHash(maker); + + (uint8 v, bytes32 r, bytes32 s) = + vm.sign(signerKey, keccak256(abi.encodePacked("\x19\x01", _domainSeparator, orderHash))); + + return abi.encodePacked(r, s, v); + } + + function _computeOrderHash(OrderStructs.Maker memory maker) internal pure returns (bytes32) { + return maker.hash(); + } +} diff --git a/contracts/test/foundry/marketplace/utils/StrategyTestMultiFillCollectionOrder.sol b/contracts/test/foundry/marketplace/utils/StrategyTestMultiFillCollectionOrder.sol new file mode 100644 index 00000000..80323455 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/StrategyTestMultiFillCollectionOrder.sol @@ -0,0 +1,77 @@ +/// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Custom errors +import {OrderInvalid} from "@hypercerts/marketplace/errors/SharedErrors.sol"; + +// Base strategy contracts +import {BaseStrategy, IStrategy} from "@hypercerts/marketplace/executionStrategies/BaseStrategy.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; + +contract StrategyTestMultiFillCollectionOrder is BaseStrategy { + using OrderStructs for OrderStructs.Maker; + + // Address of the protocol + address public immutable LOOKSRARE_PROTOCOL; + + // Tracks historical fills + mapping(bytes32 => uint256) internal countItemsFilledForOrderHash; + + /** + * @notice Constructor + * @param _looksRareProtocol Address of the LooksRare protocol + */ + constructor(address _looksRareProtocol) { + LOOKSRARE_PROTOCOL = _looksRareProtocol; + } + + /** + * @notice Execute collection strategy with taker ask order + * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) + * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) + */ + function executeStrategyWithTakerAsk(OrderStructs.Taker calldata takerAsk, OrderStructs.Maker calldata makerBid) + external + returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) + { + if (msg.sender != LOOKSRARE_PROTOCOL) revert OrderInvalid(); + // Only available for ERC721 + if (makerBid.collectionType != CollectionType.ERC721) revert OrderInvalid(); + + bytes32 orderHash = makerBid.hash(); + uint256 countItemsFilled = countItemsFilledForOrderHash[orderHash]; + uint256 countItemsFillable = makerBid.amounts[0]; + + price = makerBid.price; + (itemIds, amounts) = abi.decode(takerAsk.additionalParameters, (uint256[], uint256[])); + uint256 countItemsToFill = amounts.length; + + if ( + countItemsToFill == 0 || makerBid.amounts.length != 1 || itemIds.length != countItemsToFill + || countItemsFillable < countItemsToFill + countItemsFilled + ) revert OrderInvalid(); + + price *= countItemsToFill; + + if (countItemsToFill + countItemsFilled == countItemsFillable) { + delete countItemsFilledForOrderHash[orderHash]; + isNonceInvalidated = true; + } else { + countItemsFilledForOrderHash[orderHash] += countItemsToFill; + } + } + + function isMakerOrderValid(OrderStructs.Maker calldata, bytes4) + external + view + override + returns (bool isValid, bytes4 errorSelector) + { + // + } +} diff --git a/contracts/test/foundry/marketplace/utils/TestHelpers.sol b/contracts/test/foundry/marketplace/utils/TestHelpers.sol new file mode 100644 index 00000000..66270688 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/TestHelpers.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; +import {BytesLib} from "./BytesLib.sol"; + +abstract contract TestHelpers is Test { + using BytesLib for bytes; + + modifier asPrankedUser(address user) { + vm.startPrank(user); + _; + vm.stopPrank(); + } + + /** + * @dev Transforms a standard signature into an EIP2098 compliant signature + * @param signature The secp256k1 65-bytes signature + * @return eip2098Signature The 64-bytes EIP2098 compliant signature + */ + function _eip2098Signature(bytes memory signature) internal pure returns (bytes memory eip2098Signature) { + eip2098Signature = signature.slice(0, 64); + uint8 parityBit = uint8(eip2098Signature[32]) | ((uint8(signature[64]) % 27) << 7); + eip2098Signature[32] = bytes1(parityBit); + } +} diff --git a/contracts/test/foundry/marketplace/utils/TestParameters.sol b/contracts/test/foundry/marketplace/utils/TestParameters.sol new file mode 100644 index 00000000..44d29cf9 --- /dev/null +++ b/contracts/test/foundry/marketplace/utils/TestParameters.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +abstract contract TestParameters is Test { + // Empty constants + OrderStructs.MerkleTree internal _EMPTY_MERKLE_TREE; + bytes4 internal constant _EMPTY_BYTES4 = bytes4(0); + bytes32 public constant MAGIC_VALUE_ORDER_NONCE_EXECUTED = keccak256("ORDER_NONCE_EXECUTED"); + + // Addresses + address internal constant _owner = address(42); + address internal constant _sender = address(88); + address internal constant _recipient = address(90); + address internal constant _transferrer = address(100); + address internal constant _royaltyRecipient = address(22); + + // Currencies + address internal constant ETH = address(0); + address internal constant WETH_MAINNET = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; + + // Generic fee parameters + uint16 internal constant _standardProtocolFeeBp = uint16(50); + uint16 internal constant _minTotalFeeBp = uint16(50); + uint16 internal constant _maxProtocolFeeBp = uint16(200); + uint16 internal constant _standardRoyaltyFee = uint16(0); + + uint256 internal constant _sellerProceedBpWithStandardProtocolFeeBp = 9950; + + // Public/Private keys for maker/taker user + uint256 internal constant makerUserPK = 1; + uint256 internal constant takerUserPK = 2; + // it is equal to vm.addr(makerUserPK) + address internal constant makerUser = 0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf; + // it is equal to vm.addr(takerUserPK) + address internal constant takerUser = 0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF; + + // Initial balances + // @dev The balances are on purpose different across users to make sure the tests are properly checking the + // assertion + uint256 internal constant _initialETHBalanceUser = 100 ether; + uint256 internal constant _initialWETHBalanceUser = 10 ether; + uint256 internal constant _initialETHBalanceRoyaltyRecipient = 10 ether; + uint256 internal constant _initialWETHBalanceRoyaltyRecipient = 25 ether; + uint256 internal constant _initialETHBalanceOwner = 50 ether; + uint256 internal constant _initialWETHBalanceOwner = 15 ether; + + // Chainlink ETH/USD price feed (Ethereum mainnet) + address internal constant CHAINLINK_ETH_USD_PRICE_FEED = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; + + // Strategy id + uint256 internal constant STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY = 0; +} diff --git a/contracts/test/foundry/AllowlistMinter.t.sol b/contracts/test/foundry/protocol/AllowlistMinter.t.sol similarity index 90% rename from contracts/test/foundry/AllowlistMinter.t.sol rename to contracts/test/foundry/protocol/AllowlistMinter.t.sol index 7ccb3aa9..a16c343c 100644 --- a/contracts/test/foundry/AllowlistMinter.t.sol +++ b/contracts/test/foundry/protocol/AllowlistMinter.t.sol @@ -1,20 +1,21 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; -import { AllowlistMinter } from "../../src/AllowlistMinter.sol"; -import { Errors } from "../../src/libs/Errors.sol"; +import {AllowlistMinter} from "@hypercerts/protocol/AllowlistMinter.sol"; +import {Errors} from "@hypercerts/protocol/libs/Errors.sol"; -import { Merkle } from "murky/Merkle.sol"; +import {Merkle} from "murky/Merkle.sol"; contract MerkleHelper is AllowlistMinter, Merkle { - function generateCustomData( - address[] calldata addresses, - uint256[] calldata units - ) public pure returns (bytes32[] memory data) { + function generateCustomData(address[] calldata addresses, uint256[] calldata units) + public + pure + returns (bytes32[] memory data) + { data = new bytes32[](addresses.length); for (uint256 i = 0; i < addresses.length; i++) { data[i] = _calculateLeaf(addresses[i], units[i]); @@ -39,7 +40,7 @@ contract MerkleHelper is AllowlistMinter, Merkle { function _getSum(uint256[] memory array) public pure returns (uint256 sum) { uint256 len = array.length; - for (uint256 i; i < len; ) { + for (uint256 i; i < len;) { sum += array[i]; unchecked { ++i; @@ -159,7 +160,7 @@ contract AllowlistTest is PRBTest, StdCheats, StdUtils { } function testBasicAllowlistFuzz(uint256 size) public { - size = bound(size, 4, 5_000); + size = bound(size, 4, 5000); uint256 units = 10_000; bytes32[] memory data = merkle.generateData(size, 10_000); bytes32 root = merkle.getRoot(data); @@ -173,7 +174,7 @@ contract AllowlistTest is PRBTest, StdCheats, StdUtils { } function testProcessClaimFuzz(uint256 size) public { - size = bound(size, 4, 5_000); + size = bound(size, 4, 5000); uint256 value = 10_000; bytes32[] memory data = merkle.generateData(size, value); bytes32 root = merkle.getRoot(data); diff --git a/contracts/test/foundry/Bitshifting.t.sol b/contracts/test/foundry/protocol/Bitshifting.t.sol similarity index 86% rename from contracts/test/foundry/Bitshifting.t.sol rename to contracts/test/foundry/protocol/Bitshifting.t.sol index 68bc2cc8..6c4d9fe2 100644 --- a/contracts/test/foundry/Bitshifting.t.sol +++ b/contracts/test/foundry/protocol/Bitshifting.t.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; contract Bitshifter { /// @dev Bitmask used to expose only upper 128 bits of uint256 @@ -47,21 +47,24 @@ contract BitshiftingTest is PRBTest, StdCheats, StdUtils, Bitshifter { function testTypeMask() public { // 128 1s, 128 0s - assertEq(TYPE_MASK, 115792089237316195423570985008687907852929702298719625575994209400481361428480); + assertEq( + TYPE_MASK, + 115_792_089_237_316_195_423_570_985_008_687_907_852_929_702_298_719_625_575_994_209_400_481_361_428_480 + ); // 128 0s, 128 1s - assertEq(NF_INDEX_MASK, 340282366920938463463374607431768211455); + assertEq(NF_INDEX_MASK, 340_282_366_920_938_463_463_374_607_431_768_211_455); } function testBaseType() public { uint256 baseID = 1 << 128; uint256 baseType = getBaseType(baseID); assertEq(baseID, baseType); - assertEq(baseID, 340282366920938463463374607431768211456); + assertEq(baseID, 340_282_366_920_938_463_463_374_607_431_768_211_456); assertTrue(isBaseType(baseID)); assertEq(getItemIndex(baseID), 0); - assertEq(getBaseType(baseID), 340282366920938463463374607431768211456); + assertEq(getBaseType(baseID), 340_282_366_920_938_463_463_374_607_431_768_211_456); assertFalse(isTypedItem(baseID)); } diff --git a/contracts/test/foundry/HypercertMinter.batchminting.t.sol b/contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol similarity index 86% rename from contracts/test/foundry/HypercertMinter.batchminting.t.sol rename to contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol index b5349919..3f8502d6 100644 --- a/contracts/test/foundry/HypercertMinter.batchminting.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol @@ -1,14 +1,15 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; -import { HypercertMinter } from "../../src/HypercertMinter.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {HypercertMinter} from "@hypercerts/protocol/HypercertMinter.sol"; //solhint-disable-next-line max-line-length -import { ERC1155HolderUpgradeable } from "openzeppelin-contracts-upgradeable/contracts/token/ERC1155/utils/ERC1155HolderUpgradeable.sol"; -import { Merkle } from "murky/Merkle.sol"; -import { IHypercertToken } from "../../src/interfaces/IHypercertToken.sol"; +import {ERC1155HolderUpgradeable} from + "openzeppelin-contracts-upgradeable/contracts/token/ERC1155/utils/ERC1155HolderUpgradeable.sol"; +import {Merkle} from "murky/Merkle.sol"; +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; contract BatchMintingHelper is Merkle, ERC1155HolderUpgradeable { event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values); @@ -20,10 +21,11 @@ contract BatchMintingHelper is Merkle, ERC1155HolderUpgradeable { bytes32 root; } - function generateCustomData( - address[] memory addresses, - uint256[] memory units - ) public pure returns (bytes32[] memory data) { + function generateCustomData(address[] memory addresses, uint256[] memory units) + public + pure + returns (bytes32[] memory data) + { data = new bytes32[](addresses.length); for (uint256 i = 0; i < addresses.length; i++) { data[i] = _calculateLeaf(addresses[i], units[i]); @@ -62,7 +64,7 @@ contract BatchMintingHelper is Merkle, ERC1155HolderUpgradeable { function _getSum(uint256[] memory array) public pure returns (uint256 sum) { uint256 len = array.length; - for (uint256 i; i < len; ) { + for (uint256 i; i < len;) { sum += array[i]; unchecked { ++i; @@ -107,7 +109,7 @@ contract HypercertBatchMintingTest is PRBTest, StdCheats, StdUtils, BatchMinting proofs[i] = getProof(dataset.data, index); ids[i] = (i + 1) << 128; units[i] = dataset.units[index]; - minter.createAllowlist(user, 10000, dataset.root, _uri, IHypercertToken.TransferRestrictions.AllowAll); + minter.createAllowlist(user, 10_000, dataset.root, _uri, IHypercertToken.TransferRestrictions.AllowAll); } units[3] = 0; @@ -151,8 +153,8 @@ contract HypercertBatchMintingTest is PRBTest, StdCheats, StdUtils, BatchMinting uint256[] memory zeroes = new uint256[](2); - minter.createAllowlist(user, 10000, one.root, _uri, IHypercertToken.TransferRestrictions.AllowAll); - minter.createAllowlist(user, 10000, two.root, _uri, IHypercertToken.TransferRestrictions.AllowAll); + minter.createAllowlist(user, 10_000, one.root, _uri, IHypercertToken.TransferRestrictions.AllowAll); + minter.createAllowlist(user, 10_000, two.root, _uri, IHypercertToken.TransferRestrictions.AllowAll); startHoax(user, 10 ether); @@ -179,7 +181,7 @@ contract HypercertBatchMintingTest is PRBTest, StdCheats, StdUtils, BatchMinting ids[i] = (i + 1) << 128; tokenIDs[i] = ids[i] + 1; units[i] = dataset.units[index]; - minter.createAllowlist(user, 10000, dataset.root, _uri, IHypercertToken.TransferRestrictions.AllowAll); + minter.createAllowlist(user, 10_000, dataset.root, _uri, IHypercertToken.TransferRestrictions.AllowAll); } startHoax(user, 10 ether); @@ -215,11 +217,7 @@ contract HypercertBatchMintingTest is PRBTest, StdCheats, StdUtils, BatchMinting tokenIDs[i] = ids[i] + 1; units[i] = dataset.units[index]; minter.createAllowlist( - user, - _getSum(units), - dataset.root, - _uri, - IHypercertToken.TransferRestrictions.AllowAll + user, _getSum(units), dataset.root, _uri, IHypercertToken.TransferRestrictions.AllowAll ); } @@ -254,7 +252,7 @@ contract HypercertBatchMintingTest is PRBTest, StdCheats, StdUtils, BatchMinting ids[i] = (i + 1) << 128; tokenIDs[i] = ids[i] + 1; units[i] = dataset.units[index]; - minter.createAllowlist(user, 10000, dataset.root, _uri, IHypercertToken.TransferRestrictions.DisallowAll); + minter.createAllowlist(user, 10_000, dataset.root, _uri, IHypercertToken.TransferRestrictions.DisallowAll); } startHoax(user, 10 ether); @@ -289,11 +287,7 @@ contract HypercertBatchMintingTest is PRBTest, StdCheats, StdUtils, BatchMinting tokenIDs[i] = ids[i] + 1; units[i] = dataset.units[index]; minter.createAllowlist( - user, - 10000, - dataset.root, - _uri, - IHypercertToken.TransferRestrictions.FromCreatorOnly + user, 10_000, dataset.root, _uri, IHypercertToken.TransferRestrictions.FromCreatorOnly ); } diff --git a/contracts/test/foundry/HypercertMinter.pausable.t.sol b/contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol similarity index 88% rename from contracts/test/foundry/HypercertMinter.pausable.t.sol rename to contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol index 716c8c5f..a4b63061 100644 --- a/contracts/test/foundry/HypercertMinter.pausable.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { HypercertMinter } from "../../src/HypercertMinter.sol"; -import { IHypercertToken } from "../../src/interfaces/IHypercertToken.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {HypercertMinter} from "@hypercerts/protocol/HypercertMinter.sol"; +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; contract PausableTestHelper { /** @@ -86,13 +86,7 @@ contract HypercertMinterPausableTest is PRBTest, StdCheats, StdUtils, PausableTe hypercertMinter.mintClaim(owner, 1, _uri, IHypercertToken.TransferRestrictions.AllowAll); vm.expectRevert("Pausable: paused"); - hypercertMinter.mintClaimWithFractions( - owner, - 1, - fractions, - _uri, - IHypercertToken.TransferRestrictions.AllowAll - ); + hypercertMinter.mintClaimWithFractions(owner, 1, fractions, _uri, IHypercertToken.TransferRestrictions.AllowAll); vm.expectRevert("Pausable: paused"); hypercertMinter.mintClaimFromAllowlist(owner, proofs, 2, 1000); diff --git a/contracts/test/foundry/HypercertMinter.t.sol b/contracts/test/foundry/protocol/HypercertMinter.t.sol similarity index 78% rename from contracts/test/foundry/HypercertMinter.t.sol rename to contracts/test/foundry/protocol/HypercertMinter.t.sol index ad15aada..86bbe1d5 100644 --- a/contracts/test/foundry/HypercertMinter.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.t.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; -import { Merkle } from "murky/Merkle.sol"; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { HypercertMinter } from "../../src/HypercertMinter.sol"; -import { IHypercertToken } from "../../src/interfaces/IHypercertToken.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {Merkle} from "murky/Merkle.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {HypercertMinter} from "@hypercerts/protocol/HypercertMinter.sol"; +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; contract MinterTestHelper { event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits); @@ -38,7 +38,9 @@ contract MinterTestHelper { return 0; } sum = 0; - for (uint256 i = 0; i < array.length; i++) sum += array[i]; + for (uint256 i = 0; i < array.length; i++) { + sum += array[i]; + } } function buildFractions(uint256 size) public pure returns (uint256[] memory) { @@ -76,7 +78,7 @@ contract HypercertMinterTest is PRBTest, StdCheats, StdUtils, MinterTestHelper { } function testClaimSingleFraction() public { - uint256 units = 10000; + uint256 units = 10_000; vm.expectEmit(true, true, true, true); emit ClaimStored(1 << 128, _uri, units); @@ -89,11 +91,7 @@ contract HypercertMinterTest is PRBTest, StdCheats, StdUtils, MinterTestHelper { vm.expectEmit(true, true, true, true); emit ClaimStored(1 << 128, _uri, totalUnits); hypercertMinter.mintClaimWithFractions( - alice, - totalUnits, - fractions, - _uri, - IHypercertToken.TransferRestrictions.AllowAll + alice, totalUnits, fractions, _uri, IHypercertToken.TransferRestrictions.AllowAll ); } @@ -104,11 +102,7 @@ contract HypercertMinterTest is PRBTest, StdCheats, StdUtils, MinterTestHelper { vm.expectEmit(true, true, true, true); emit ClaimStored(1 << 128, _uri, totalUnits); hypercertMinter.mintClaimWithFractions( - alice, - totalUnits, - fractions, - _uri, - IHypercertToken.TransferRestrictions.AllowAll + alice, totalUnits, fractions, _uri, IHypercertToken.TransferRestrictions.AllowAll ); } @@ -118,11 +112,7 @@ contract HypercertMinterTest is PRBTest, StdCheats, StdUtils, MinterTestHelper { vm.expectEmit(true, true, true, true); emit ClaimStored(1 << 128, _uri, totalUnits); hypercertMinter.mintClaimWithFractions( - alice, - totalUnits, - fractions, - _uri, - IHypercertToken.TransferRestrictions.DisallowAll + alice, totalUnits, fractions, _uri, IHypercertToken.TransferRestrictions.DisallowAll ); } @@ -132,11 +122,7 @@ contract HypercertMinterTest is PRBTest, StdCheats, StdUtils, MinterTestHelper { vm.expectEmit(true, true, true, true); emit ClaimStored(1 << 128, _uri, totalUnits); hypercertMinter.mintClaimWithFractions( - alice, - totalUnits, - fractions, - _uri, - IHypercertToken.TransferRestrictions.FromCreatorOnly + alice, totalUnits, fractions, _uri, IHypercertToken.TransferRestrictions.FromCreatorOnly ); } } diff --git a/contracts/test/foundry/HypercertMinter.transfers.t.sol b/contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol similarity index 92% rename from contracts/test/foundry/HypercertMinter.transfers.t.sol rename to contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol index 7c74edb1..cd2f1773 100644 --- a/contracts/test/foundry/HypercertMinter.transfers.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { Errors } from "../../src/libs/Errors.sol"; -import { HypercertMinter } from "../../src/HypercertMinter.sol"; -import { IHypercertToken } from "../../src/interfaces/IHypercertToken.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {Errors} from "@hypercerts/protocol/libs/Errors.sol"; +import {HypercertMinter} from "@hypercerts/protocol/HypercertMinter.sol"; +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; /// @dev Testing transfer restrictions on hypercerts contract HypercertMinterTransferTest is PRBTest, StdCheats, StdUtils { @@ -22,7 +22,7 @@ contract HypercertMinterTransferTest is PRBTest, StdCheats, StdUtils { function setUp() public { hypercertMinter = new HypercertMinter(); _uri = "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi"; - _units = 10000; + _units = 10_000; baseID = 1 << 128; tokenIndex = 1; tokenID = baseID + tokenIndex; diff --git a/contracts/test/foundry/PerformanceTesting.t.sol b/contracts/test/foundry/protocol/PerformanceTesting.t.sol similarity index 82% rename from contracts/test/foundry/PerformanceTesting.t.sol rename to contracts/test/foundry/protocol/PerformanceTesting.t.sol index 7ed5b2df..956fd3bb 100644 --- a/contracts/test/foundry/PerformanceTesting.t.sol +++ b/contracts/test/foundry/protocol/PerformanceTesting.t.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; -import { HypercertMinter } from "../../src/HypercertMinter.sol"; -import { Merkle } from "murky/Merkle.sol"; -import { IHypercertToken } from "../../src/interfaces/IHypercertToken.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {HypercertMinter} from "@hypercerts/protocol/HypercertMinter.sol"; +import {Merkle} from "murky/Merkle.sol"; +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; // forge test -vv --match-path test/foundry/PerformanceTesting.t.sol @@ -78,10 +78,11 @@ contract PerformanceTestHelper is Merkle { leaf = keccak256(bytes.concat(keccak256(abi.encode(account, amount)))); } - function generateCustomData( - address[] memory addresses, - uint256[] memory units - ) public pure returns (bytes32[] memory data) { + function generateCustomData(address[] memory addresses, uint256[] memory units) + public + pure + returns (bytes32[] memory data) + { data = new bytes32[](addresses.length); for (uint256 i = 0; i < addresses.length; i++) { data[i] = _calculateLeaf(addresses[i], units[i]); @@ -129,7 +130,7 @@ contract PerformanceTesting is PRBTest, StdCheats, StdUtils, PerformanceTestHelp function setUp() public { alice = address(1); hypercertMinter = new HypercertMinter(); - bytes32[] memory data = generateData(12, 10000); + bytes32[] memory data = generateData(12, 10_000); rootHash = getRoot(data); proof = getProof(data, 6); @@ -149,11 +150,7 @@ contract PerformanceTesting is PRBTest, StdCheats, StdUtils, PerformanceTestHelp ids[i] = (i + 1) << 128; units[i] = dataset.units[index]; hypercertMinter.createAllowlist( - alice, - dataset.units[index], - dataset.root, - _uri, - IHypercertToken.TransferRestrictions.AllowAll + alice, dataset.units[index], dataset.root, _uri, IHypercertToken.TransferRestrictions.AllowAll ); } } @@ -170,7 +167,7 @@ contract PerformanceTesting is PRBTest, StdCheats, StdUtils, PerformanceTestHelp // Mint Hypercert with 1 fraction function testClaimSingleFraction() public { - hypercertMinter.mintClaim(alice, 10000, _uri, IHypercertToken.TransferRestrictions.AllowAll); + hypercertMinter.mintClaim(alice, 10_000, _uri, IHypercertToken.TransferRestrictions.AllowAll); } function testClaimSingleFractionFuzz(address account, uint256 value) public { @@ -188,11 +185,7 @@ contract PerformanceTesting is PRBTest, StdCheats, StdUtils, PerformanceTestHelp uint256 totalUnits = getSum(fractions); hypercertMinter.mintClaimWithFractions( - alice, - totalUnits, - fractions, - _uri, - IHypercertToken.TransferRestrictions.AllowAll + alice, totalUnits, fractions, _uri, IHypercertToken.TransferRestrictions.AllowAll ); } @@ -201,11 +194,7 @@ contract PerformanceTesting is PRBTest, StdCheats, StdUtils, PerformanceTestHelp uint256 totalUnits = getSum(fractions); hypercertMinter.mintClaimWithFractions( - alice, - totalUnits, - fractions, - _uri, - IHypercertToken.TransferRestrictions.AllowAll + alice, totalUnits, fractions, _uri, IHypercertToken.TransferRestrictions.AllowAll ); } @@ -215,11 +204,7 @@ contract PerformanceTesting is PRBTest, StdCheats, StdUtils, PerformanceTestHelp uint256 totalUnits = getSum(fractions); hypercertMinter.mintClaimWithFractions( - alice, - totalUnits, - fractions, - "https://example.com/ipfsHash", - IHypercertToken.TransferRestrictions.AllowAll + alice, totalUnits, fractions, "https://example.com/ipfsHash", IHypercertToken.TransferRestrictions.AllowAll ); } diff --git a/contracts/test/foundry/SemiFungible1155.allowances.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol similarity index 94% rename from contracts/test/foundry/SemiFungible1155.allowances.t.sol rename to contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol index 438b1893..efe78bef 100644 --- a/contracts/test/foundry/SemiFungible1155.allowances.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; -import { SemiFungible1155Helper } from "./SemiFungibleHelper.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {SemiFungible1155Helper} from "./SemiFungibleHelper.sol"; /// @dev See the "Writing Tests" section in the Foundry Book if this is your first time with Forge. /// https://book.getfoundry.sh/forge/writing-tests diff --git a/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol new file mode 100644 index 00000000..1e3c21a4 --- /dev/null +++ b/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.16; + +import {PRBTest} from "prb-test/PRBTest.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {SemiFungible1155Helper} from "./SemiFungibleHelper.sol"; + +/// @dev See the "Writing Tests" section in the Foundry Book if this is your first time with Forge. +/// https://book.getfoundry.sh/forge/writing-tests +contract SemiFungible1155BurnTest is PRBTest, StdCheats, StdUtils, SemiFungible1155Helper { + SemiFungible1155Helper internal semiFungible; + string internal _uri; + address internal alice; + address internal bob; + + function setUp() public { + semiFungible = new SemiFungible1155Helper(); + _uri = "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi"; + alice = address(1); + bob = address(2); + } + + function testBurnFraction() public { + uint256 baseID = 1 << 128; + + uint256 size = 20; + uint256 value = 2000; + uint256[] memory values = semiFungible.buildValues(size, value); + uint256[] memory tokenIDs = semiFungible.buildIDs(baseID, size); + + startHoax(alice, 100 ether); + + semiFungible.mintValue(alice, values, _uri); + semiFungible.validateOwnerBalanceUnits(tokenIDs[1], alice, 1, values[1]); + + changePrank(bob); + vm.expectRevert(NotApprovedOrOwner.selector); + semiFungible.burnValue(alice, tokenIDs[1]); + + changePrank(alice); + vm.expectEmit(true, true, true, true); + emit TransferSingle(alice, alice, address(0), tokenIDs[1], 1); + semiFungible.burnValue(alice, tokenIDs[1]); + + semiFungible.validateNotOwnerNoBalanceNoUnits(tokenIDs[1], alice); + } + + function testBatchBurnFractions() public { + uint256 baseID = 1 << 128; + + uint256 size = 20; + uint256 value = 2000; + uint256[] memory values = semiFungible.buildValues(size, value); + uint256[] memory tokenIDs = semiFungible.buildIDs(baseID, size); + + uint256[] memory valueToBurn = new uint256[](2); + valueToBurn[0] = 1; + valueToBurn[1] = 1; + uint256[] memory idsToBurn = new uint256[](2); + idsToBurn[0] = tokenIDs[1]; + idsToBurn[1] = tokenIDs[7]; + uint256[] memory toTokens = new uint256[](2); + toTokens[0] = 0; + toTokens[1] = 0; + + startHoax(alice, 100 ether); + + semiFungible.mintValue(alice, values, _uri); + semiFungible.validateOwnerBalanceUnits(tokenIDs[1], alice, 1, values[1]); + + assertEq(semiFungible.unitsOf(tokenIDs[7]), 2000); + assertEq(semiFungible.unitsOf(baseID), size * value); + + changePrank(bob); + vm.expectRevert(NotApprovedOrOwner.selector); + semiFungible.batchBurnValues(alice, idsToBurn); + + changePrank(alice); + vm.expectEmit(true, true, true, true); + emit TransferBatch(alice, alice, address(0), idsToBurn, valueToBurn); + semiFungible.batchBurnValues(alice, idsToBurn); + + semiFungible.validateNotOwnerNoBalanceNoUnits(tokenIDs[1], alice); + assertEq(semiFungible.unitsOf(tokenIDs[1]), 0); + + semiFungible.validateNotOwnerNoBalanceNoUnits(tokenIDs[7], alice); + assertEq(semiFungible.unitsOf(tokenIDs[7]), 0); + + assertEq(semiFungible.unitsOf(baseID), size * value); + } + + function testCannotBurnClaim() public { + uint256 size = 20; + uint256 value = 2000; + uint256[] memory values = semiFungible.buildValues(size, value); + + startHoax(alice, 100 ether); + + uint256 baseID = semiFungible.mintValue(alice, values, _uri); + + vm.expectRevert("ERC1155: burn amount exceeds balance"); + semiFungible.burnValue(alice, baseID); + } + + function testCannotBatchBurnClaim() public { + uint256 size = 20; + uint256 value = 2000; + uint256[] memory values = semiFungible.buildValues(size, value); + + startHoax(alice, 100 ether); + + uint256 baseID = semiFungible.mintValue(alice, values, _uri); + + uint256[] memory idsToBurn = new uint256[](1); + idsToBurn[0] = baseID; + + vm.expectRevert("ERC1155: burn amount exceeds balance"); + semiFungible.batchBurnValues(alice, idsToBurn); + } +} diff --git a/contracts/test/foundry/SemiFungible1155.minting.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol similarity index 88% rename from contracts/test/foundry/SemiFungible1155.minting.t.sol rename to contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol index ae7f78d6..9458a8cc 100644 --- a/contracts/test/foundry/SemiFungible1155.minting.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { stdError } from "forge-std/StdError.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; -import { SemiFungible1155Helper } from "./SemiFungibleHelper.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {stdError} from "forge-std/StdError.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {SemiFungible1155Helper} from "./SemiFungibleHelper.sol"; /// @dev See the "Writing Tests" section in the Foundry Book if this is your first time with Forge. /// https://book.getfoundry.sh/forge/writing-tests @@ -64,7 +64,7 @@ contract SemiFungible1155MintingTest is PRBTest, StdCheats, StdUtils, SemiFungib semiFungible.setMaxType(); vm.expectRevert(stdError.arithmeticError); - semiFungible.mintValue(alice, 10000, _uri); + semiFungible.mintValue(alice, 10_000, _uri); } // HAPPY MINTING @@ -81,17 +81,17 @@ contract SemiFungible1155MintingTest is PRBTest, StdCheats, StdUtils, SemiFungib // uint256 value vm.expectEmit(true, true, true, true); emit TransferSingle(alice, address(0), address(0), _baseID, 0); - uint256 baseID = semiFungible.mintValue(alice, 10000, _uri); + uint256 baseID = semiFungible.mintValue(alice, 10_000, _uri); assertEq(baseID, _baseID); assertEq(semiFungible.ownerOf(baseID), address(0)); assertEq(semiFungible.creator(baseID), alice); - assertEq(semiFungible.unitsOf(baseID), 10000); + assertEq(semiFungible.unitsOf(baseID), 10_000); - semiFungible.validateOwnerBalanceUnits(baseID + 1, alice, 1, 10000); + semiFungible.validateOwnerBalanceUnits(baseID + 1, alice, 1, 10_000); - assertEq(semiFungible.tokenValue(baseID), 10000); - assertEq(semiFungible.tokenValue(baseID + 1), 10000); + assertEq(semiFungible.tokenValue(baseID), 10_000); + assertEq(semiFungible.tokenValue(baseID + 1), 10_000); assertEq(semiFungible.tokenValue(baseID + 2), 0); } @@ -123,7 +123,7 @@ contract SemiFungible1155MintingTest is PRBTest, StdCheats, StdUtils, SemiFungib values[2] = 5000; uint256 baseID = semiFungible.mintValue(alice, values, _uri); - assertEq(semiFungible.unitsOf(baseID), 15000); + assertEq(semiFungible.unitsOf(baseID), 15_000); assertEq(semiFungible.ownerOf(baseID), address(0)); // Swap because of splitting logic diff --git a/contracts/test/foundry/SemiFungible1155.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.t.sol similarity index 91% rename from contracts/test/foundry/SemiFungible1155.t.sol rename to contracts/test/foundry/protocol/SemiFungible1155.t.sol index 09918e69..ea5746c1 100644 --- a/contracts/test/foundry/SemiFungible1155.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; -import { SemiFungible1155Helper } from "./SemiFungibleHelper.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {SemiFungible1155Helper} from "./SemiFungibleHelper.sol"; /// @dev See the "Writing Tests" section in the Foundry Book if this is your first time with Forge. /// https://book.getfoundry.sh/forge/writing-tests @@ -35,16 +35,16 @@ contract SemiFungible1155DefaultTest is PRBTest, StdCheats, StdUtils, SemiFungib startHoax(alice, 100 ether); - semiFungible.mintValue(alice, 10000, _uri); + semiFungible.mintValue(alice, 10_000, _uri); semiFungible.splitValue(alice, tokenID, values); - assertEq(semiFungible.unitsOf(baseID), 10000); + assertEq(semiFungible.unitsOf(baseID), 10_000); semiFungible.validateOwnerBalanceUnits(tokenID, alice, 1, values[0]); semiFungible.validateOwnerBalanceUnits(tokenID + 1, alice, 1, values[1]); // Units - assertEq(semiFungible.unitsOf(baseID), 10000); + assertEq(semiFungible.unitsOf(baseID), 10_000); assertEq(semiFungible.unitsOf(tokenID), 7000); assertEq(semiFungible.unitsOf(tokenID + 1), 3000); } diff --git a/contracts/test/foundry/SemiFungible1155.transfers.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol similarity index 94% rename from contracts/test/foundry/SemiFungible1155.transfers.t.sol rename to contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol index 5a910740..bcad3900 100644 --- a/contracts/test/foundry/SemiFungible1155.transfers.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { SemiFungible1155Helper } from "./SemiFungibleHelper.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {SemiFungible1155Helper} from "./SemiFungibleHelper.sol"; /// @dev See the "Writing Tests" section in the Foundry Book if this is your first time with Forge. /// https://book.getfoundry.sh/forge/writing-tests @@ -24,14 +24,14 @@ contract SemiFungible1155TransferTest is PRBTest, StdCheats, StdUtils { // UNHAPPY PATHS function testFailTransferTypeIDToken() public { - semiFungible.mintValue(alice, 10000, _uri); + semiFungible.mintValue(alice, 10_000, _uri); //NotApprovedOrOWner, since no owner semiFungible.safeTransferFrom(alice, bob, 1 << 128, 1, ""); } function testFailTransferNonExistingFractionToken() public { - semiFungible.mintValue(alice, 10000, _uri); + semiFungible.mintValue(alice, 10_000, _uri); //NotApprovedOrOWner, since no owner semiFungible.safeTransferFrom(alice, bob, 1 << (128 + 2), 1, ""); @@ -59,10 +59,10 @@ contract SemiFungible1155TransferTest is PRBTest, StdCheats, StdUtils { uint256 baseID = 1 << 128; uint128 tokenID = 1; - semiFungible.mintValue(alice, 10000, _uri); + semiFungible.mintValue(alice, 10_000, _uri); assertEq(semiFungible.balanceOf(alice, baseID), 0); - semiFungible.validateOwnerBalanceUnits(baseID + tokenID, alice, 1, 10000); + semiFungible.validateOwnerBalanceUnits(baseID + tokenID, alice, 1, 10_000); assertEq(semiFungible.balanceOf(bob, baseID), 0); semiFungible.validateNotOwnerNoBalanceNoUnits(baseID + tokenID, bob); @@ -78,7 +78,7 @@ contract SemiFungible1155TransferTest is PRBTest, StdCheats, StdUtils { semiFungible.validateNotOwnerNoBalanceNoUnits(baseID + tokenID, alice); // Updates token ownership - semiFungible.validateOwnerBalanceUnits(baseID + tokenID, bob, 1, 10000); + semiFungible.validateOwnerBalanceUnits(baseID + tokenID, bob, 1, 10_000); } function testFuzzTransferFullToken(address from, address to, uint256 units) public { diff --git a/contracts/test/foundry/SemiFungible1155.units.sol b/contracts/test/foundry/protocol/SemiFungible1155.units.sol similarity index 89% rename from contracts/test/foundry/SemiFungible1155.units.sol rename to contracts/test/foundry/protocol/SemiFungible1155.units.sol index 654c1dbb..384bcdfb 100644 --- a/contracts/test/foundry/SemiFungible1155.units.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.units.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; -import { SemiFungible1155Helper } from "./SemiFungibleHelper.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {SemiFungible1155Helper} from "./SemiFungibleHelper.sol"; /// @dev See the "Writing Tests" section in the Foundry Book if this is your first time with Forge. /// https://book.getfoundry.sh/forge/writing-tests @@ -28,11 +28,11 @@ contract SemiFungible1155UnitsTest is PRBTest, StdCheats, StdUtils { uint256 baseID = 1 << 128; uint128 tokenID = 1; - semiFungible.mintValue(alice, 10000, _uri); + semiFungible.mintValue(alice, 10_000, _uri); assertEq(semiFungible.unitsOf(baseID), 10_000); - semiFungible.validateOwnerBalanceUnits(baseID + tokenID, alice, 1, 10000); + semiFungible.validateOwnerBalanceUnits(baseID + tokenID, alice, 1, 10_000); semiFungible.validateNotOwnerNoBalanceNoUnits(baseID + tokenID, bob); @@ -51,7 +51,7 @@ contract SemiFungible1155UnitsTest is PRBTest, StdCheats, StdUtils { semiFungible.validateNotOwnerNoBalanceNoUnits(baseID + tokenID, alice); assertEq(semiFungible.balanceOf(bob, baseID), 0); - semiFungible.validateOwnerBalanceUnits(baseID + tokenID, bob, 1, 10000); + semiFungible.validateOwnerBalanceUnits(baseID + tokenID, bob, 1, 10_000); } function testUnitsMultipleFractions() public { diff --git a/contracts/test/foundry/SemiFungibleHelper.sol b/contracts/test/foundry/protocol/SemiFungibleHelper.sol similarity index 87% rename from contracts/test/foundry/SemiFungibleHelper.sol rename to contracts/test/foundry/protocol/SemiFungibleHelper.sol index 4d43a810..82a1c264 100644 --- a/contracts/test/foundry/SemiFungibleHelper.sol +++ b/contracts/test/foundry/protocol/SemiFungibleHelper.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; -import { SemiFungible1155 } from "../../src/SemiFungible1155.sol"; -import { PRBTest } from "prb-test/PRBTest.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; + +import {SemiFungible1155} from "@hypercerts/protocol/SemiFungible1155.sol"; +import {PRBTest} from "prb-test/PRBTest.sol"; +import {StdCheats} from "forge-std/StdCheats.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; contract SemiFungible1155Helper is SemiFungible1155, PRBTest, StdCheats, StdUtils { error FractionalBurn(); @@ -51,6 +52,10 @@ contract SemiFungible1155Helper is SemiFungible1155, PRBTest, StdCheats, StdUtil _burnToken(account, tokenID); } + function batchBurnValues(address account, uint256[] memory tokenIDs) public { + _batchBurnToken(account, tokenIDs); + } + function unitsOf(uint256 tokenID) public view returns (uint256) { return _unitsOf(tokenID); } @@ -86,18 +91,24 @@ contract SemiFungible1155Helper is SemiFungible1155, PRBTest, StdCheats, StdUtil return 0; } sum = 0; - for (uint256 i = 0; i < array.length; i++) sum += array[i]; + for (uint256 i = 0; i < array.length; i++) { + sum += array[i]; + } } function buildValues(uint256 size, uint256 base) public pure returns (uint256[] memory) { uint256[] memory _values = new uint256[](size); - for (uint256 i = 0; i < size; i++) _values[i] = base; + for (uint256 i = 0; i < size; i++) { + _values[i] = base; + } return _values; } function buildIDs(uint256 baseID, uint256 size) public pure returns (uint256[] memory) { uint256[] memory _values = new uint256[](size); - for (uint256 i = 0; i < size; i++) _values[i] = baseID + i + 1; + for (uint256 i = 0; i < size; i++) { + _values[i] = baseID + i + 1; + } return _values; } diff --git a/contracts/test/mock/MockChainlinkAggregator.sol b/contracts/test/mock/MockChainlinkAggregator.sol new file mode 100644 index 00000000..a102b079 --- /dev/null +++ b/contracts/test/mock/MockChainlinkAggregator.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.17; + +contract MockChainlinkAggregator { + int256 private _answer; + uint8 private _decimals = 18; + + function setDecimals(uint8 newDecimals) external { + _decimals = newDecimals; + } + + function decimals() external view returns (uint8) { + return _decimals; + } + + function setAnswer(int256 answer) external { + _answer = answer; + } + + function latestRoundData() + external + view + returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + roundId = 1; + answer = _answer; + startedAt = block.timestamp; + updatedAt = block.timestamp; + answeredInRound = 1; + } +} diff --git a/contracts/test/mock/MockERC1155.sol b/contracts/test/mock/MockERC1155.sol new file mode 100644 index 00000000..4bbfdccd --- /dev/null +++ b/contracts/test/mock/MockERC1155.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.7; + +import {ERC1155} from "solmate/src/tokens/ERC1155.sol"; + +// LooksRare unopinionated libraries +import {IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; + +contract MockERC1155 is ERC1155 { + function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts) public { + _batchMint(to, tokenIds, amounts, ""); + } + + function mint(address to, uint256 tokenId, uint256 amount) public { + _mint(to, tokenId, amount, ""); + } + + function uri(uint256) public pure override returns (string memory) { + return "uri"; + } + + function royaltyInfo(uint256, uint256) external pure returns (address, uint256) { + return (address(0), 0); + } + + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); + } +} diff --git a/contracts/test/mock/MockERC1155SupportsNoInterface.sol b/contracts/test/mock/MockERC1155SupportsNoInterface.sol new file mode 100644 index 00000000..34b9da89 --- /dev/null +++ b/contracts/test/mock/MockERC1155SupportsNoInterface.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.7; + +import {MockERC1155} from "./MockERC1155.sol"; + +contract MockERC1155SupportsNoInterface is MockERC1155 { + function supportsInterface(bytes4) public view virtual override returns (bool) { + return false; + } +} diff --git a/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol b/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol new file mode 100644 index 00000000..4474f875 --- /dev/null +++ b/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.7; + +import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; + +/** + * @dev This contract has to inherit from OZ instead of Solmate because + * Solmate's implementation defines balanceOf as a public mapping + * and it cannot be overridden. + */ +contract MockERC1155WithoutAnyBalanceOf is ERC1155 { + constructor() ERC1155("https://example.com") {} + + function balanceOf(address, uint256) public view virtual override returns (uint256) { + revert("Not implemented"); + } + + function balanceOfBatch(address[] memory, uint256[] memory) public pure override returns (uint256[] memory) { + revert("Not implemented"); + } +} diff --git a/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol b/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol new file mode 100644 index 00000000..1c010cae --- /dev/null +++ b/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.7; + +import {MockERC1155} from "./MockERC1155.sol"; + +contract MockERC1155WithoutBalanceOfBatch is MockERC1155 { + function balanceOfBatch(address[] calldata, uint256[] calldata) public pure override returns (uint256[] memory) { + revert("Not implemented"); + } +} diff --git a/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol b/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol new file mode 100644 index 00000000..c02c4192 --- /dev/null +++ b/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.7; + +import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; + +/** + * @dev This contract has to inherit from OZ instead of Solmate because + * Solmate's implementation defines isApprovedForAll as a public mapping + * and it cannot be overridden. + */ +contract MockERC1155WithoutIsApprovedForAll is ERC1155 { + constructor() ERC1155("https://example.com") {} + + function mint(address to, uint256 tokenId, uint256 amount) public { + _mint(to, tokenId, amount, ""); + } + + function isApprovedForAll(address, address) public view virtual override returns (bool) { + revert("Not implemented"); + } +} diff --git a/contracts/test/mock/MockERC20.sol b/contracts/test/mock/MockERC20.sol new file mode 100644 index 00000000..019bed0e --- /dev/null +++ b/contracts/test/mock/MockERC20.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.7; + +import {ERC20} from "solmate/src/tokens/ERC20.sol"; + +contract MockERC20 is ERC20("MockERC20", "MockERC20", 18) { + function mint(address to, uint256 amount) public { + _mint(to, amount); + } +} diff --git a/contracts/test/mock/MockERC721.sol b/contracts/test/mock/MockERC721.sol new file mode 100644 index 00000000..4db2eed7 --- /dev/null +++ b/contracts/test/mock/MockERC721.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.7; + +import {ERC721} from "solmate/src/tokens/ERC721.sol"; +import {IERC165} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC165.sol"; + +contract MockERC721 is ERC721("MockERC721", "MockERC721") { + function mint(address to, uint256 tokenId) public { + _mint(to, tokenId); + } + + function batchMint(address to, uint256 amount) external { + for (uint256 i; i < amount; i++) { + _mint(to, i); + } + } + + function batchMint(address to, uint256[] memory tokenIds) public { + for (uint256 i; i < tokenIds.length; i++) { + _mint(to, tokenIds[i]); + } + } + + function tokenURI(uint256) public pure override returns (string memory) { + return "tokenURI"; + } + + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return super.supportsInterface(interfaceId); + } +} diff --git a/contracts/test/mock/MockERC721SupportsNoInterface.sol b/contracts/test/mock/MockERC721SupportsNoInterface.sol new file mode 100644 index 00000000..e5a6c5e3 --- /dev/null +++ b/contracts/test/mock/MockERC721SupportsNoInterface.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.7; + +import {MockERC721} from "./MockERC721.sol"; + +contract MockERC721SupportsNoInterface is MockERC721 { + function supportsInterface(bytes4) public view virtual override returns (bool) { + return false; + } +} diff --git a/contracts/test/mock/MockERC721WithRoyalties.sol b/contracts/test/mock/MockERC721WithRoyalties.sol new file mode 100644 index 00000000..071e2432 --- /dev/null +++ b/contracts/test/mock/MockERC721WithRoyalties.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {IERC165, IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; +import {MockERC721} from "./MockERC721.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +/** + * @dev This contract allows adding a royalty basis points higher than 10,000, which + * reverts during the royaltyInfo call. The purpose is to create a scenario where + * royaltyInfo returns the correct response for some token IDs and reverts for some + * other token IDs. This can potentially happen in a bundle transaction. + */ +contract MockERC721WithRoyalties is MockERC721, IERC2981 { + address public immutable DEFAULT_ROYALTY_RECIPIENT; + uint256 public immutable DEFAULT_ROYALTY_FEE; + + mapping(uint256 => uint256) internal _royaltyFeeForTokenId; + mapping(uint256 => address) internal _royaltyRecipientForTokenId; + + constructor(address _royaltyFeeRecipient, uint256 _royaltyFee) { + DEFAULT_ROYALTY_RECIPIENT = _royaltyFeeRecipient; + DEFAULT_ROYALTY_FEE = _royaltyFee; + } + + function addCustomRoyaltyInformationForTokenId(uint256 tokenId, address royaltyRecipient, uint256 royaltyFee) + external + { + _royaltyRecipientForTokenId[tokenId] = royaltyRecipient; + _royaltyFeeForTokenId[tokenId] = royaltyFee; + } + + function royaltyInfo(uint256 tokenId, uint256 salePrice) + external + view + override + returns (address royaltyRecipient, uint256 royaltyAmount) + { + royaltyRecipient = _royaltyRecipientForTokenId[tokenId] == address(0) + ? DEFAULT_ROYALTY_RECIPIENT + : _royaltyRecipientForTokenId[tokenId]; + uint256 _royaltyFee = _royaltyFeeForTokenId[tokenId]; + uint256 royaltyFee = _royaltyFee == 0 ? DEFAULT_ROYALTY_FEE : _royaltyFee; + require(royaltyFee <= ONE_HUNDRED_PERCENT_IN_BP, "Royalty too high"); + royaltyAmount = (royaltyFee * salePrice) / ONE_HUNDRED_PERCENT_IN_BP; + } + + function supportsInterface(bytes4 interfaceId) public view override(MockERC721, IERC165) returns (bool) { + return interfaceId == 0x2a55205a || super.supportsInterface(interfaceId); + } +} diff --git a/contracts/test/mock/MockRoyaltyFeeRegistry.sol b/contracts/test/mock/MockRoyaltyFeeRegistry.sol new file mode 100644 index 00000000..d9700825 --- /dev/null +++ b/contracts/test/mock/MockRoyaltyFeeRegistry.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// LooksRare unopinionated libraries +import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; + +// Royalty Fee Registry interface +import {IRoyaltyFeeRegistry} from "@hypercerts/marketplace/interfaces/IRoyaltyFeeRegistry.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +/** + * @title MockRoyaltyFeeRegistry + * @notice It is a royalty fee registry for the LooksRare exchange. + * @dev The original one used the standard Ownable library from OpenZeppelin. + */ +contract MockRoyaltyFeeRegistry is IRoyaltyFeeRegistry, OwnableTwoSteps { + struct FeeInfo { + address setter; + address receiver; + uint256 fee; + } + + // Limit (if enforced for fee royalty in basis point (10,000 = 100%) + uint256 public royaltyFeeLimit; + + mapping(address => FeeInfo) private _royaltyFeeInfoCollection; + + event NewRoyaltyFeeLimit(uint256 royaltyFeeLimit); + event RoyaltyFeeUpdate(address indexed collection, address indexed setter, address indexed receiver, uint256 fee); + + /** + * @notice Constructor + * @param _owner Owner address + * @param _royaltyFeeLimit new royalty fee limit (500 = 5%, 1,000 = 10%) + */ + constructor(address _owner, uint256 _royaltyFeeLimit) OwnableTwoSteps(_owner) { + require(_royaltyFeeLimit <= 9500, "Owner: Royalty fee limit too high"); + royaltyFeeLimit = _royaltyFeeLimit; + } + + /** + * @notice Update royalty info for collection + * @param _royaltyFeeLimit new royalty fee limit (500 = 5%, 1,000 = 10%) + */ + function updateRoyaltyFeeLimit(uint256 _royaltyFeeLimit) external onlyOwner { + require(_royaltyFeeLimit <= 9500, "Owner: Royalty fee limit too high"); + royaltyFeeLimit = _royaltyFeeLimit; + + emit NewRoyaltyFeeLimit(_royaltyFeeLimit); + } + + /** + * @notice Update royalty info for collection + * @param collection address of the NFT contract + * @param setter address that sets the receiver + * @param receiver receiver for the royalty fee + * @param fee fee (500 = 5%, 1,000 = 10%) + */ + function updateRoyaltyInfoForCollection(address collection, address setter, address receiver, uint256 fee) + external + onlyOwner + { + require(fee <= royaltyFeeLimit, "Registry: Royalty fee too high"); + _royaltyFeeInfoCollection[collection] = FeeInfo({setter: setter, receiver: receiver, fee: fee}); + + emit RoyaltyFeeUpdate(collection, setter, receiver, fee); + } + + /** + * @notice Calculate royalty info for a collection address and a sale gross amount + * @param collection collection address + * @param amount amount + * @return receiver address and amount received by royalty recipient + */ + function royaltyInfo(address collection, uint256 amount) external view returns (address, uint256) { + return ( + _royaltyFeeInfoCollection[collection].receiver, + (amount * _royaltyFeeInfoCollection[collection].fee) / ONE_HUNDRED_PERCENT_IN_BP + ); + } + + /** + * @notice View royalty info for a collection address + * @param collection collection address + */ + function royaltyFeeInfoCollection(address collection) external view returns (address, address, uint256) { + return ( + _royaltyFeeInfoCollection[collection].setter, + _royaltyFeeInfoCollection[collection].receiver, + _royaltyFeeInfoCollection[collection].fee + ); + } +} diff --git a/contracts/test/mock/MockSmartWallet.sol b/contracts/test/mock/MockSmartWallet.sol new file mode 100644 index 00000000..77d02b61 --- /dev/null +++ b/contracts/test/mock/MockSmartWallet.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.17; + +contract MockSmartWallet { + address public owner; + + bytes4 internal constant MAGICVALUE = bytes4(keccak256("isValidSignature(bytes32,bytes)")); + + modifier onlyOwner() { + if (msg.sender != owner) { + revert("Unauthorized"); + } + _; + } + + constructor() { + owner = msg.sender; + } + + receive() external payable {} + + function transferOwnership(address _newOwner) external onlyOwner { + owner = _newOwner; + } + + function executeBatch(address[] calldata dest, bytes[] calldata calldata_) external onlyOwner { + if (dest.length != calldata_.length) { + revert("Invalid array length"); + } + for (uint256 i = 0; i < dest.length; ++i) { + execute(dest[i], 0, calldata_[i]); + } + } + + function isValidSignature(bytes32 _hash, bytes memory _signature) external view returns (bytes4 magicValue) { + bytes32 r; + bytes32 s; + uint8 v; + + assembly { + r := mload(add(_signature, 0x20)) + s := mload(add(_signature, 0x40)) + v := byte(0, mload(add(_signature, 0x60))) + } + address recovered = ecrecover(_hash, v, r, s); + if (recovered == address(0)) { + revert("Invalid signature"); + } + if (owner != recovered) { + revert("Invalid signer"); + } + + return MAGICVALUE; + } + + function execute(address dest, uint256 value, bytes calldata calldata_) public onlyOwner { + (bool success, bytes memory result) = dest.call{value: value}(calldata_); + + if (!success) { + assembly { + revert(add(result, 32), mload(result)) + } + } + } +} diff --git a/contracts/tsconfig.build.json b/contracts/tsconfig.build.json index d2a57421..e9929279 100644 --- a/contracts/tsconfig.build.json +++ b/contracts/tsconfig.build.json @@ -22,11 +22,17 @@ }, "include": ["./src"], "files": [ - "src/abi/HypercertMinter.json", - "src/types/src/AllowlistMinter.ts", - "src/types/src/HypercertMinter.ts", - "src/types/src/interfaces/IAllowlist.ts", - "src/types/src/interfaces/IHypercertToken.ts", - "src/types/src/libs/Errors.ts" + "types/src/marketplace/CurrencyManager.ts", + "types/src/marketplace/ExecutionManager.ts", + "types/src/marketplace/LooksRareProtocol.ts", + "types/src/marketplace/NonceManager.ts", + "types/src/marketplace/helpers/OrderValidatorV2A.ts", + "types/src/marketplace/StrategyManager.ts", + "types/src/marketplace/TransferManager.ts", + "types/src/protocol/AllowlistMinter.ts", + "types/src/protocol/HypercertMinter.ts", + "types/src/protocol/interfaces/IAllowlist.ts", + "types/src/protocol/interfaces/IHypercertToken.ts", + "types/src/protocol/libs/Errors.ts" ] } diff --git a/contracts/tsconfig.json b/contracts/tsconfig.json index 8d0a6cfc..a3e3d8dc 100644 --- a/contracts/tsconfig.json +++ b/contracts/tsconfig.json @@ -20,14 +20,19 @@ "target": "ESNext", "outDir": "dist" }, - "include": ["./tasks", "./test", "./types", "./src"], + "include": ["./tasks", "./test", "./src"], "files": [ - "hardhat.config.ts", - "src/abi/HypercertMinter.json", - "src/types/src/AllowlistMinter.ts", - "src/types/src/HypercertMinter.ts", - "src/types/src/interfaces/IAllowlist.ts", - "src/types/src/interfaces/IHypercertToken.ts", - "src/types/src/libs/Errors.ts" + "types/src/marketplace/CurrencyManager.ts", + "types/src/marketplace/ExecutionManager.ts", + "types/src/marketplace/LooksRareProtocol.ts", + "types/src/marketplace/NonceManager.ts", + "types/src/marketplace/helpers/OrderValidatorV2A.ts", + "types/src/marketplace/StrategyManager.ts", + "types/src/marketplace/TransferManager.ts", + "types/src/protocol/AllowlistMinter.ts", + "types/src/protocol/HypercertMinter.ts", + "types/src/protocol/interfaces/IAllowlist.ts", + "types/src/protocol/interfaces/IHypercertToken.ts", + "types/src/protocol/libs/Errors.ts" ] } diff --git a/cors-proxy/src/index.ts b/cors-proxy/src/index.ts index e88e6e3d..aaa9a400 100644 --- a/cors-proxy/src/index.ts +++ b/cors-proxy/src/index.ts @@ -69,6 +69,9 @@ export default { // Rewrite request to point to API URL. This also makes the request mutable // so you can add the correct Origin header to make the API server think // that this request is not cross-site. + // TODO: Never use ts ignore + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore request = new Request(apiUrl, request); request.headers.set("Origin", new URL(apiUrl).origin); let response = await fetch(request); diff --git a/defender/.eslintrc.yml b/defender/.eslintrc.yml index fb4528bd..07ab4df0 100644 --- a/defender/.eslintrc.yml +++ b/defender/.eslintrc.yml @@ -9,7 +9,7 @@ parserOptions: plugins: - "@typescript-eslint" root: true -ignorePatterns: ["rollup.config.js", "jest.config.ts", "build/"] +ignorePatterns: ["build/"] rules: "@typescript-eslint/semi": - warn diff --git a/defender/package.json b/defender/package.json index f2da4c70..2d8a57f4 100644 --- a/defender/package.json +++ b/defender/package.json @@ -14,10 +14,10 @@ }, "dependencies": { "@hypercerts-org/contracts": "0.8.11", - "@openzeppelin/defender-autotask-client": "^1.48.0", - "@openzeppelin/defender-autotask-utils": "^1.48.0", - "@openzeppelin/defender-base-client": "^1.48.0", - "@openzeppelin/defender-sentinel-client": "^1.48.0", + "@openzeppelin/defender-autotask-client": "1.50.0", + "@openzeppelin/defender-autotask-utils": "1.50.0", + "@openzeppelin/defender-base-client": "1.49.0", + "@openzeppelin/defender-sentinel-client": "1.49.0", "@openzeppelin/merkle-tree": "^1.0.2", "@supabase/supabase-js": "^2.4.1", "axios": "^1.2.6", diff --git a/defender/src/auto-tasks/batch-mint-claims-from-allowlists.ts b/defender/src/auto-tasks/batch-mint-claims-from-allowlists.ts index 558983f6..578f6aa8 100644 --- a/defender/src/auto-tasks/batch-mint-claims-from-allowlists.ts +++ b/defender/src/auto-tasks/batch-mint-claims-from-allowlists.ts @@ -13,14 +13,6 @@ import { BigNumber, ethers } from "ethers"; import fetch from "node-fetch"; export async function handler(event: AutotaskEvent) { - console.log( - "Event: ", - JSON.stringify( - { ...event, secrets: "HIDDEN", credentials: "HIDDEN" }, - null, - 2, - ), - ); const network = getNetworkConfigFromName(event.autotaskName); const { SUPABASE_URL, SUPABASE_SECRET_API_KEY } = event.secrets; const ALCHEMY_KEY = event.secrets[network.alchemyKeyEnvName]; diff --git a/defender/src/networks.ts b/defender/src/networks.ts index ffbc1fba..80aa187b 100644 --- a/defender/src/networks.ts +++ b/defender/src/networks.ts @@ -30,7 +30,6 @@ export const NETWORKS: SupportedNetworks = { { networkKey: "sepolia", contractAddress: "0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941", - alchemyKeyEnvName: "ALCHEMY_SEPOLIA_KEY", chainId: 11155111, rpc: "https://rpc.sepolia.org", }, diff --git a/defender/src/update.ts b/defender/src/update.ts index 874b2d00..f7fbf463 100644 --- a/defender/src/update.ts +++ b/defender/src/update.ts @@ -27,8 +27,9 @@ export const updateAutotask = async (networks: NetworkConfig[]) => { autotaskClient .updateCodeFromFolder(autoTask.autotaskId, `./build/relay/${name}`) - .then((_) => { + .then((res) => { console.log(`Updated ${autoTask.autotaskId}`); + console.log(res); }) .catch((err) => { console.error(`Failed to update ${autoTask.autotaskId}`); @@ -67,8 +68,9 @@ export const updateSentinel = async (networks: NetworkConfig[]) => { addresses: [network.contractAddress], abi, }) - .then((_) => { + .then((res) => { console.log(`Updated: ", ${sentinel.subscriberId}`); + console.log(res); }) .catch((err) => { console.error(`Failed to update ${sentinel.subscriberId}`); diff --git a/docs/.eslintrc.yml b/docs/.eslintrc.yml new file mode 100644 index 00000000..c1258f9f --- /dev/null +++ b/docs/.eslintrc.yml @@ -0,0 +1,27 @@ +extends: + - "eslint:recommended" + - "plugin:@typescript-eslint/eslint-recommended" + - "plugin:@typescript-eslint/recommended" + - "prettier" +parser: "@typescript-eslint/parser" +parserOptions: + project: "./docs/tsconfig.json" +plugins: + - "@docusaurus" + - "@typescript-eslint" +root: true +ignorePatterns: ["build/"] +rules: + "@typescript-eslint/semi": + - warn + "@typescript-eslint/switch-exhaustiveness-check": + - warn + "@typescript-eslint/no-floating-promises": + - error + - ignoreIIFE: true + ignoreVoid: true + "@typescript-eslint/no-inferrable-types": "off" + "@typescript-eslint/no-unused-vars": + - error + - argsIgnorePattern: "_" + varsIgnorePattern: "_" diff --git a/docs/docs/developer/api/contracts/HypercertMinter.md b/docs/docs/developer/api/contracts/HypercertMinter.md index 785dd5cf..518efa42 100644 --- a/docs/docs/developer/api/contracts/HypercertMinter.md +++ b/docs/docs/developer/api/contracts/HypercertMinter.md @@ -60,6 +60,23 @@ _See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have t | ---- | --------- | ----------- | | \_0 | uint256[] | undefined | +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + ### batchMintClaimsFromAllowlists ```solidity @@ -82,30 +99,38 @@ _Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hy ### burn ```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable +function burn(address account, uint256 id, uint256) external nonpayable ``` +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + #### Parameters | Name | Type | Description | | ------- | ------- | ----------- | | account | address | undefined | | id | uint256 | undefined | -| value | uint256 | undefined | +| \_2 | uint256 | undefined | ### burnBatch ```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable ``` +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + #### Parameters | Name | Type | Description | | ------- | --------- | ----------- | | account | address | undefined | | ids | uint256[] | undefined | -| values | uint256[] | undefined | +| \_2 | uint256[] | undefined | ### burnFraction @@ -319,19 +344,19 @@ _Returns the address of the current owner._ function ownerOf(uint256 tokenID) external view returns (address _owner) ``` -READ +_Returns the owner of a given token ID._ #### Parameters -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | #### Returns -| Name | Type | Description | -| ------- | ------- | ----------- | -| \_owner | address | undefined | +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | ### pause diff --git a/docs/docs/developer/api/contracts/HypercertTrader.md b/docs/docs/developer/api/contracts/HypercertTrader.md new file mode 100644 index 00000000..e31e8840 --- /dev/null +++ b/docs/docs/developer/api/contracts/HypercertTrader.md @@ -0,0 +1,434 @@ +# HypercertTrader + +_bitbeckers_ + +> Contract for managing hypercert trades + +Implementation of the HypercertTrader Interface + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsForSale | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +### getOffer + +```solidity +function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------- | ----------- | +| \_0 | IHypercertTrader.Offer | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### offers + +```solidity +function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | --------------------------------- | ----------- | +| offerer | address | undefined | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsAvailable | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| offerType | enum IHypercertTrader.OfferType | undefined | +| status | enum IHypercertTrader.OfferStatus | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### totalUnitsForSale + +```solidity +function totalUnitsForSale(address, uint256) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +## Errors + +### InvalidBuy + +```solidity +error InvalidBuy(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### InvalidOffer + +```solidity +error InvalidOffer(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### NotAllowed + +```solidity +error NotAllowed() +``` diff --git a/docs/docs/developer/api/contracts/IHypercertMinter.md b/docs/docs/developer/api/contracts/IHypercertMinter.md new file mode 100644 index 00000000..13a84632 --- /dev/null +++ b/docs/docs/developer/api/contracts/IHypercertMinter.md @@ -0,0 +1,39 @@ +# IHypercertMinter + +## Methods + +### ownerOf + +```solidity +function ownerOf(uint256 id) external view returns (address) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 id) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/docs/developer/api/contracts/SemiFungible1155.md b/docs/docs/developer/api/contracts/SemiFungible1155.md index 444dfe22..a4086e37 100644 --- a/docs/docs/developer/api/contracts/SemiFungible1155.md +++ b/docs/docs/developer/api/contracts/SemiFungible1155.md @@ -129,19 +129,19 @@ _Returns the address of the current owner._ function ownerOf(uint256 tokenID) external view returns (address _owner) ``` -READ +_Returns the owner of a given token ID._ #### Parameters -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | #### Returns -| Name | Type | Description | -| ------- | ------- | ----------- | -| \_owner | address | undefined | +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | ### proxiableUUID @@ -285,19 +285,19 @@ _Upgrade the implementation of the proxy to `newImplementation`, and subsequentl function uri(uint256 tokenID) external view returns (string _uri) ``` -_see { openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol }Always returns the URI for the basetype so that it's managed in one place._ +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ #### Parameters -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | #### Returns -| Name | Type | Description | -| ----- | ------ | ----------- | -| \_uri | string | undefined | +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | ## Events diff --git a/docs/docs/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/docs/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md new file mode 100644 index 00000000..6be07157 --- /dev/null +++ b/docs/docs/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md @@ -0,0 +1,77 @@ +# AggregatorV3Interface + +## Methods + +### decimals + +```solidity +function decimals() external view returns (uint8) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ----- | ----------- | +| \_0 | uint8 | undefined | + +### description + +```solidity +function description() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### getRoundData + +```solidity +function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------ | ----------- | +| \_roundId | uint80 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### latestRoundData + +```solidity +function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### version + +```solidity +function version() external view returns (uint256) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/docs/developer/api/contracts/interfaces/IHypercertToken.md b/docs/docs/developer/api/contracts/interfaces/IHypercertToken.md index 6bd5a931..30ed6f95 100644 --- a/docs/docs/developer/api/contracts/interfaces/IHypercertToken.md +++ b/docs/docs/developer/api/contracts/interfaces/IHypercertToken.md @@ -8,6 +8,23 @@ This interface declares the required functionality for a hypercert tokenThis int ## Methods +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + ### burnFraction ```solidity diff --git a/docs/docs/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/docs/developer/api/contracts/interfaces/IHypercertTrader.md new file mode 100644 index 00000000..06fb700c --- /dev/null +++ b/docs/docs/developer/api/contracts/interfaces/IHypercertTrader.md @@ -0,0 +1,133 @@ +# IHypercertTrader + +_bitbeckers_ + +> Interface for hypercert token trading + +This interface declares the required functionality to interact with the hypercert marketplace + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| units | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +## Events + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | diff --git a/docs/docs/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md b/docs/docs/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md new file mode 100644 index 00000000..4cb96bfc --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md @@ -0,0 +1,46 @@ +# BatchOrderTypehashRegistry + +_LooksRare protocol team (👀,💎)_ + +> BatchOrderTypehashRegistry + +The contract generates the batch order hash that is used to compute the digest for signature verification. + +## Methods + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +## Errors + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | diff --git a/docs/docs/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md b/docs/docs/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md new file mode 100644 index 00000000..a32aef65 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md @@ -0,0 +1,76 @@ +# CreatorFeeManagerWithRebates + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRebates + +This contract returns the creator fee address and the creator rebate amount. + +## Methods + +### STANDARD_ROYALTY_FEE_BP + +```solidity +function STANDARD_ROYALTY_FEE_BP() external view returns (uint256) +``` + +Standard royalty fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/docs/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md b/docs/docs/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md new file mode 100644 index 00000000..41cab900 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md @@ -0,0 +1,64 @@ +# CreatorFeeManagerWithRoyalties + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRoyalties + +This contract returns the creator fee address and the creator fee amount. + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +_There are two on-chain sources for the royalty fee to distribute. 1. RoyaltyFeeRegistry: It is an on-chain registry where creator fee is defined for all items of a collection. 2. ERC2981: The NFT Royalty Standard where royalty fee is defined at a itemId level in a collection. The on-chain logic looks up the registry first. If it does not find anything, it checks if a collection is ERC2981. If so, it fetches the proper royalty information for the itemId. For a bundle that contains multiple itemIds (for a collection using ERC2981), if the royalty fee/recipient differ among the itemIds part of the bundle, the trade reverts. This contract DOES NOT enforce any restriction for extremely high creator fee, nor verifies the creator fee fetched is inferior to the total price. If any contract relies on it to build an on-chain royalty logic, it should implement protection against: (1) high royalties (2) potential unexpected royalty changes that can occur after the creation of the order._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/docs/developer/api/contracts/marketplace/CurrencyManager.md b/docs/docs/developer/api/contracts/marketplace/CurrencyManager.md new file mode 100644 index 00000000..9ff1c0fc --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/CurrencyManager.md @@ -0,0 +1,250 @@ +# CurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> CurrencyManager + +This contract manages the list of valid fungible currencies. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/docs/developer/api/contracts/marketplace/ExecutionManager.md b/docs/docs/developer/api/contracts/marketplace/ExecutionManager.md new file mode 100644 index 00000000..981cb3a7 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/ExecutionManager.md @@ -0,0 +1,751 @@ +# ExecutionManager + +_LooksRare protocol team (👀,💎)_ + +> ExecutionManager + +This contract handles the execution and resolution of transactions. A transaction is executed on-chain when an off-chain maker order is matched by on-chain taker order of a different kind. For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/docs/developer/api/contracts/marketplace/InheritedStrategy.md b/docs/docs/developer/api/contracts/marketplace/InheritedStrategy.md new file mode 100644 index 00000000..022cce57 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/InheritedStrategy.md @@ -0,0 +1,9 @@ +# InheritedStrategy + +_LooksRare protocol team (👀,💎)_ + +> InheritedStrategy + +This contract handles the verification of parameters for standard transactions. It does not verify the taker struct's itemIds and amounts array as well as minPrice (taker ask) / maxPrice (taker bid) because before the taker executes the transaction and the maker itemIds/amounts/price should have already been confirmed off-chain. + +_A standard transaction (bid or ask) is mapped to strategyId = 0._ diff --git a/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md new file mode 100644 index 00000000..fca005d6 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -0,0 +1,1157 @@ +# LooksRareProtocol + +_LooksRare protocol team (👀,💎)_ + +> LooksRareProtocol + +This contract is the core smart contract of the LooksRare protocol ("v2"). It is the main entry point for users to initiate transactions with taker orders and manage the cancellation of maker orders, which exist off-chain. ~~~~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~- ~~~~~~~~ ~~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~~ ~~~~~~~~ ~~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~~~~ + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ETH. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### chainId + +```solidity +function chainId() external view returns (uint256) +``` + +Current chainId. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +Current domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### restrictedExecuteTakerBid + +```solidity +function restrictedExecuteTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, address sender, bytes32 orderHash) external nonpayable returns (uint256 protocolFeeAmount) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| sender | address | undefined | +| orderHash | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| protocolFeeAmount | uint256 | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721 and ERC1155. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateDomainSeparator + +```solidity +function updateDomainSeparator() external nonpayable +``` + +This function allows the owner to update the domain separator (if possible). + +_Only callable by owner. If there is a fork of the network with a new chainId, it allows the owner to reset the domain separator for the new chain id._ + +### updateETHGasLimitForTransfer + +```solidity +function updateETHGasLimitForTransfer(uint256 newGasLimitETHTransfer) external nonpayable +``` + +This function allows the owner to update the maximum ETH gas limit for a standard transfer. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------ | +| newGasLimitETHTransfer | uint256 | New gas limit for ETH transfer | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------- | +| gasLimitETHTransfer | uint256 | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| askUser | address | undefined | +| bidUser | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| bidUser | address | undefined | +| bidRecipient | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +## Errors + +### CallerInvalid + +```solidity +error CallerInvalid() +``` + +It is returned if the function cannot be called by the sender. + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### CurrencyInvalid + +```solidity +error CurrencyInvalid() +``` + +It is returned if the currency is invalid. + +### ERC20TransferFromFail + +```solidity +error ERC20TransferFromFail() +``` + +It is emitted if the ERC20 transferFrom fails. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### QuoteTypeInvalid + +```solidity +error QuoteTypeInvalid() +``` + +It is returned if the maker quote type is invalid. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/docs/developer/api/contracts/marketplace/NonceManager.md b/docs/docs/developer/api/contracts/marketplace/NonceManager.md new file mode 100644 index 00000000..fea95495 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/NonceManager.md @@ -0,0 +1,193 @@ +# NonceManager + +_LooksRare protocol team (👀,💎)_ + +> NonceManager + +This contract handles the nonce logic that is used for invalidating maker orders that exist off-chain. The nonce logic revolves around three parts at the user level: - order nonce (orders sharing an order nonce are conditional, OCO-like) - subset (orders can be grouped under a same subset) - bid/ask (all orders can be executed only if the bid/ask nonce matches the user's one on-chain) Only the order nonce is invalidated at the time of the execution of a maker order that contains it. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). diff --git a/docs/docs/developer/api/contracts/marketplace/ProtocolFeeRecipient.md b/docs/docs/developer/api/contracts/marketplace/ProtocolFeeRecipient.md new file mode 100644 index 00000000..36f6a35c --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/ProtocolFeeRecipient.md @@ -0,0 +1,75 @@ +# ProtocolFeeRecipient + +_LooksRare protocol team (👀,💎)_ + +> ProtocolFeeRecipient + +This contract is used to receive protocol fees and transfer them to the fee sharing setter. Fee sharing setter cannot receive ETH directly, so we need to use this contract as a middleman to convert ETH into WETH before sending it. + +## Methods + +### FEE_SHARING_SETTER + +```solidity +function FEE_SHARING_SETTER() external view returns (address) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### WETH + +```solidity +function WETH() external view returns (contract IWETH) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------- | ----------- | +| \_0 | contract IWETH | undefined | + +### transferERC20 + +```solidity +function transferERC20(address currency) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------------- | +| currency | address | ERC20 currency address | + +### transferETH + +```solidity +function transferETH() external nonpayable +``` + +## Errors + +### ERC20TransferFail + +```solidity +error ERC20TransferFail() +``` + +It is emitted if the ERC20 transfer fails. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NothingToTransfer + +```solidity +error NothingToTransfer() +``` diff --git a/docs/docs/developer/api/contracts/marketplace/StrategyManager.md b/docs/docs/developer/api/contracts/marketplace/StrategyManager.md new file mode 100644 index 00000000..a55f3985 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/StrategyManager.md @@ -0,0 +1,391 @@ +# StrategyManager + +_LooksRare protocol team (👀,💎)_ + +> StrategyManager + +This contract handles the addition and the update of execution strategies. + +## Methods + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/docs/developer/api/contracts/marketplace/TransferManager.md b/docs/docs/developer/api/contracts/marketplace/TransferManager.md new file mode 100644 index 00000000..6091a918 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/TransferManager.md @@ -0,0 +1,547 @@ +# TransferManager + +_LooksRare protocol team (👀,💎)_ + +> TransferManager + +This contract provides the transfer functions for ERC721/ERC1155/Hypercert/Hyperboard for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. Collection type "3" refers to Hyperboard transfer functions. + +_"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ + +## Methods + +### allowOperator + +```solidity +function allowOperator(address operator) external nonpayable +``` + +This function allows an operator to be added for the shared transfer system. Once the operator is allowed, users can grant NFT approvals to this operator. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------------- | +| operator | address | Operator address to allow | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### grantApprovals + +```solidity +function grantApprovals(address[] operators) external nonpayable +``` + +This function allows a user to grant approvals for an array of operators. Users cannot grant approvals if the operator is not allowed by this contract's owner. + +_Each operator address must be globally allowed to be approved._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### hasUserApprovedOperator + +```solidity +function hasUserApprovedOperator(address, address) external view returns (bool) +``` + +This returns whether the user has approved the operator address. The first address is the user and the second address is the operator (e.g. LooksRareProtocol). + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isOperatorAllowed + +```solidity +function isOperatorAllowed(address) external view returns (bool) +``` + +This returns whether the operator address is allowed by this contract's owner. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### removeOperator + +```solidity +function removeOperator(address operator) external nonpayable +``` + +This function allows the user to remove an operator for the shared transfer system. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | -------------------------- | +| operator | address | Operator address to remove | + +### revokeApprovals + +```solidity +function revokeApprovals(address[] operators) external nonpayable +``` + +This function allows a user to revoke existing approvals for an array of operators. + +_Each operator address must be approved at the user level to be revoked._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### transferBatchItemsAcrossCollections + +```solidity +function transferBatchItemsAcrossCollections(ITransferManager.BatchTransferItem[] items, address from, address to) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------------------------ | ----------- | +| items | ITransferManager.BatchTransferItem[] | undefined | +| from | address | undefined | +| to | address | undefined | + +### transferItemsERC1155 + +```solidity +function transferItemsERC1155(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC1155 collection. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsERC721 + +```solidity +function transferItemsERC721(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC721 collection. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsHyperboard + +```solidity +function transferItemsHyperboard(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single Hyperboard. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsHypercert + +```solidity +function transferItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single Hypercert. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155, if amount is 0. + +### ERC1155SafeBatchTransferFromFail + +```solidity +error ERC1155SafeBatchTransferFromFail() +``` + +It is emitted if the ERC1155 safeBatchTransferFrom fails. + +### ERC1155SafeTransferFromFail + +```solidity +error ERC1155SafeTransferFromFail() +``` + +It is emitted if the ERC1155 safeTransferFrom fails. + +### ERC721TransferFromFail + +```solidity +error ERC721TransferFromFail() +``` + +It is emitted if the ERC721 transferFrom fails. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md new file mode 100644 index 00000000..2e428566 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md @@ -0,0 +1,779 @@ +# TransferSelectorNFT + +_LooksRare protocol team (👀,💎)_ + +> TransferSelectorNFT + +This contract handles the logic for transferring non-fungible items. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721 and ERC1155. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md new file mode 100644 index 00000000..37866658 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md @@ -0,0 +1,41 @@ +# BaseStrategy + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md new file mode 100644 index 00000000..c9503939 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md @@ -0,0 +1,212 @@ +# BaseStrategyChainlinkPriceLatency + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategyChainlinkPriceLatency + +This contract allows the owner to define the maximum acceptable Chainlink price latency. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md new file mode 100644 index 00000000..e2d77dd3 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md @@ -0,0 +1,342 @@ +# StrategyChainlinkUSDDynamicAsk + +_LooksRare protocol team (👀,💎)_ + +> StrategyChainlinkUSDDynamicAsk + +This contract allows a seller to sell an NFT priced in USD and the receivable amount to be in ETH. + +## Methods + +### ETH_USD_PRICE_FEED_DECIMALS + +```solidity +function ETH_USD_PRICE_FEED_DECIMALS() external view returns (uint256) +``` + +_It is possible to call priceFeed.decimals() to get the decimals, but to save gas, it is hard coded instead._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ether (WETH) address. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### priceFeed + +```solidity +function priceFeed() external view returns (contract AggregatorV3Interface) +``` + +ETH/USD Chainlink price feed + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------------ | ----------- | +| \_0 | contract AggregatorV3Interface | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### ChainlinkPriceInvalid + +```solidity +error ChainlinkPriceInvalid() +``` + +It is returned if the Chainlink price is invalid (e.g. negative). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. + +### PriceNotRecentEnough + +```solidity +error PriceNotRecentEnough() +``` + +It is returned if the current block time relative to the latest price's update time is greater than the latency tolerance. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md new file mode 100644 index 00000000..600967db --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md @@ -0,0 +1,107 @@ +# StrategyCollectionOffer + +_LooksRare protocol team (👀,💎)_ + +> StrategyCollectionOffer + +This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. + +_Use cases can include trait-based offers or rarity score offers._ + +## Methods + +### executeCollectionStrategyWithTakerAsk + +```solidity +function executeCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithProof + +```solidity +function executeCollectionStrategyWithTakerAskWithProof(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md new file mode 100644 index 00000000..1227878d --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md @@ -0,0 +1,83 @@ +# StrategyDutchAuction + +_LooksRare protocol team (👀,💎)_ + +> StrategyDutchAuction + +This contract offers a single execution strategy for users to create Dutch auctions. + +## Methods + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md new file mode 100644 index 00000000..6a1f0cd5 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md @@ -0,0 +1,75 @@ +# StrategyItemIdsRange + +_LooksRare protocol team (👀,💎)_ + +> StrategyItemIdsRange + +This contract offers a single execution strategy for users to bid on a specific amount of items in a range bounded by 2 item ids. + +## Methods + +### executeStrategyWithTakerAsk + +```solidity +function executeStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md new file mode 100644 index 00000000..2d6342fd --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md @@ -0,0 +1,201 @@ +# OrderValidatorV2A + +_LooksRare protocol team (👀,💎)_ + +> OrderValidatorV2A + +This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155 (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) + +_This version does not handle strategies with partial fills._ + +## Methods + +### CRITERIA_GROUPS + +```solidity +function CRITERIA_GROUPS() external view returns (uint256) +``` + +Number of distinct criteria groups checked to evaluate the validity of an order. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### ERC1155_INTERFACE_ID + +```solidity +function ERC1155_INTERFACE_ID() external view returns (bytes4) +``` + +ERC1155 interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_1 + +```solidity +function ERC721_INTERFACE_ID_1() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_2 + +```solidity +function ERC721_INTERFACE_ID_2() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### checkMakerOrderValidity + +```solidity +function checkMakerOrderValidity(OrderStructs.Maker makerOrder, bytes signature, OrderStructs.MerkleTree merkleTree) external view returns (uint256[9] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| signature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ---------- | ----------- | +| validationCodes | uint256[9] | undefined | + +### checkMultipleMakerOrderValidities + +```solidity +function checkMultipleMakerOrderValidities(OrderStructs.Maker[] makerOrders, bytes[] signatures, OrderStructs.MerkleTree[] merkleTrees) external view returns (uint256[9][] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------------------------- | ----------- | +| makerOrders | OrderStructs.Maker[] | undefined | +| signatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------------ | ----------- | +| validationCodes | uint256[9][] | undefined | + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +CreatorFeeManager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### deriveProtocolParameters + +```solidity +function deriveProtocolParameters() external nonpayable +``` + +Derive protocol parameters. Anyone can call this function. + +_It allows adjusting if the domain separator or creator fee manager address were to change._ + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +LooksRareProtocol domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +LooksRareProtocol. + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint256) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +TransferManager + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | diff --git a/docs/docs/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md b/docs/docs/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md new file mode 100644 index 00000000..91be29a9 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md @@ -0,0 +1,159 @@ +# ProtocolHelpers + +_LooksRare protocol team (👀,💎)_ + +> ProtocolHelpers + +This contract contains helper view functions for order creation. + +## Methods + +### computeDigestMerkleTree + +```solidity +function computeDigestMerkleTree(OrderStructs.MerkleTree merkleTree) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### computeMakerDigest + +```solidity +function computeMakerDigest(OrderStructs.Maker maker) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### verifyMakerSignature + +```solidity +function verifyMakerSignature(OrderStructs.Maker maker, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### verifyMerkleTree + +```solidity +function verifyMerkleTree(OrderStructs.MerkleTree merkleTree, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Errors + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | diff --git a/docs/docs/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md b/docs/docs/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md new file mode 100644 index 00000000..b832744e --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md @@ -0,0 +1,60 @@ +# ICreatorFeeManager + +_LooksRare protocol team (👀,💎)_ + +> ICreatorFeeManager + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry royaltyFeeRegistry) +``` + +It returns the royalty fee registry address/interface. + +#### Returns + +| Name | Type | Description | +| ------------------ | ---------------------------- | ------------------------------------- | +| royaltyFeeRegistry | contract IRoyaltyFeeRegistry | Interface of the royalty fee registry | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/docs/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md b/docs/docs/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md new file mode 100644 index 00000000..da683d8c --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md @@ -0,0 +1,22 @@ +# ICurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> ICurrencyManager + +## Events + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------------------------------- | +| currency | address | Currency address (address(0) = ETH) | +| isAllowed | bool | Whether the currency is allowed | diff --git a/docs/docs/developer/api/contracts/marketplace/interfaces/IExecutionManager.md b/docs/docs/developer/api/contracts/marketplace/interfaces/IExecutionManager.md new file mode 100644 index 00000000..0e86c75b --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/interfaces/IExecutionManager.md @@ -0,0 +1,99 @@ +# IExecutionManager + +_LooksRare protocol team (👀,💎)_ + +> IExecutionManager + +## Events + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | -------------------------------------- | +| creatorFeeManager | address | Address of the new creator fee manager | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ---------------------------------------- | +| maxCreatorFeeBp | uint256 | New maximum creator fee (in basis point) | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------------------------------------- | +| protocolFeeRecipient | address | Address of the new protocol fee recipient | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | diff --git a/docs/docs/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/docs/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md new file mode 100644 index 00000000..86e79020 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md @@ -0,0 +1,22 @@ +# IImmutableCreate2Factory + +## Methods + +### safeCreate2 + +```solidity +function safeCreate2(bytes32 salt, bytes initializationCode) external payable returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | diff --git a/docs/docs/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md b/docs/docs/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md new file mode 100644 index 00000000..e7414f54 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md @@ -0,0 +1,157 @@ +# ILooksRareProtocol + +_LooksRare protocol team (👀,💎)_ + +> ILooksRareProtocol + +## Methods + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +## Events + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------------------------- | +| gasLimitETHTransfer | uint256 | Gas limit for an ETH transfer | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| askUser | address | Address of the ask user | +| bidUser | address | Address of the bid user | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it can be the taker ask user or different) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| bidUser | address | Address of the bid user | +| bidRecipient | address | Address of the recipient of the bid | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it is the maker ask user) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +## Errors + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). diff --git a/docs/docs/developer/api/contracts/marketplace/interfaces/INonceManager.md b/docs/docs/developer/api/contracts/marketplace/interfaces/INonceManager.md new file mode 100644 index 00000000..eaa3f977 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/interfaces/INonceManager.md @@ -0,0 +1,53 @@ +# INonceManager + +_LooksRare protocol team (👀,💎)_ + +> INonceManager + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------- | +| user | address | Address of the user | +| bidNonce | uint256 | New bid nonce | +| askNonce | uint256 | New ask nonce | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ------------------------------- | +| user | address | Address of the user | +| orderNonces | uint256[] | Array of order nonces cancelled | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | -------------------------------- | +| user | address | Address of the user | +| subsetNonces | uint256[] | Array of subset nonces cancelled | diff --git a/docs/docs/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md b/docs/docs/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md new file mode 100644 index 00000000..5ed0ef6c --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md @@ -0,0 +1,29 @@ +# IRoyaltyFeeRegistry + +_LooksRare protocol team (👀,💎)_ + +> IRoyaltyFeeRegistry + +## Methods + +### royaltyInfo + +```solidity +function royaltyInfo(address collection, uint256 price) external view returns (address receiver, uint256 royaltyFee) +``` + +This function returns the royalty information for a collection at a given transaction price. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | + +#### Returns + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| receiver | address | Receiver address | +| royaltyFee | uint256 | Royalty fee amount | diff --git a/docs/docs/developer/api/contracts/marketplace/interfaces/IStrategy.md b/docs/docs/developer/api/contracts/marketplace/interfaces/IStrategy.md new file mode 100644 index 00000000..2b4a45bc --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/interfaces/IStrategy.md @@ -0,0 +1,41 @@ +# IStrategy + +_LooksRare protocol team (👀,💎)_ + +> IStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool isStrategy) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---------- | ---- | ---------------------------------------------- | +| isStrategy | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/docs/developer/api/contracts/marketplace/interfaces/IStrategyManager.md b/docs/docs/developer/api/contracts/marketplace/interfaces/IStrategyManager.md new file mode 100644 index 00000000..ae6ea7b1 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/interfaces/IStrategyManager.md @@ -0,0 +1,84 @@ +# IStrategyManager + +_LooksRare protocol team (👀,💎)_ + +> IStrategyManager + +## Events + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------------- | +| strategyId | uint256 | Id of the new strategy | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the transaction to be executed | +| isMakerBid | bool | Whether the strategyId is for maker bid | +| implementation | address | Address of the implementation of the strategy | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | -------------------------------------------------------- | +| strategyId | uint256 | Id of the strategy | +| isActive | bool | Whether the strategy is active (or not) after the update | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | + +## Errors + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ diff --git a/docs/docs/developer/api/contracts/marketplace/interfaces/ITransferManager.md b/docs/docs/developer/api/contracts/marketplace/interfaces/ITransferManager.md new file mode 100644 index 00000000..3ba8ca81 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/interfaces/ITransferManager.md @@ -0,0 +1,111 @@ +# ITransferManager + +_LooksRare protocol team (👀,💎)_ + +> ITransferManager + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +## Errors + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. diff --git a/docs/docs/developer/api/contracts/marketplace/libraries/CurrencyValidator.md b/docs/docs/developer/api/contracts/marketplace/libraries/CurrencyValidator.md new file mode 100644 index 00000000..1b1f41a2 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/libraries/CurrencyValidator.md @@ -0,0 +1,7 @@ +# CurrencyValidator + +_LooksRare protocol team (👀,💎)_ + +> CurrencyValidator + +This library validates the order currency to be the chain's native currency or the specified ERC20 token. diff --git a/docs/docs/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md b/docs/docs/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md new file mode 100644 index 00000000..943a54cd --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md @@ -0,0 +1,7 @@ +# MerkleProofCalldataWithNodes + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofCalldataWithNodes + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/docs/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md b/docs/docs/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md new file mode 100644 index 00000000..37529181 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md @@ -0,0 +1,7 @@ +# MerkleProofMemory + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofMemory + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md new file mode 100644 index 00000000..3c166bb7 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md @@ -0,0 +1,7 @@ +# OrderStructs + +_LooksRare protocol team (👀,💎)_ + +> OrderStructs + +This library contains all order struct types for the LooksRare protocol (v2). diff --git a/docs/docs/developer/api/contracts/protocol/AllowlistMinter.md b/docs/docs/developer/api/contracts/protocol/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/docs/developer/api/contracts/protocol/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/docs/developer/api/contracts/protocol/HypercertMinter.md b/docs/docs/developer/api/contracts/protocol/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/docs/developer/api/contracts/protocol/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/docs/developer/api/contracts/protocol/SemiFungible1155.md b/docs/docs/developer/api/contracts/protocol/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/docs/developer/api/contracts/protocol/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/docs/developer/api/contracts/protocol/interfaces/IAllowlist.md b/docs/docs/developer/api/contracts/protocol/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/docs/developer/api/contracts/protocol/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/docs/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/docs/developer/api/contracts/protocol/interfaces/IHypercertToken.md new file mode 100644 index 00000000..6bd5a931 --- /dev/null +++ b/docs/docs/developer/api/contracts/protocol/interfaces/IHypercertToken.md @@ -0,0 +1,175 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/docs/developer/api/contracts/protocol/libs/Errors.md b/docs/docs/developer/api/contracts/protocol/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/docs/developer/api/contracts/protocol/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/package.json b/docs/package.json index 7225bde0..674a836e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -30,6 +30,7 @@ "react-dom": "^18.2.0" }, "devDependencies": { + "@docusaurus/eslint-plugin": "^2.4.1", "@docusaurus/module-type-aliases": "^2.4.1", "@tsconfig/docusaurus": "^1.0.6", "typescript": "^4.9.4" diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json index d99797cb..fdcf77c2 100644 --- a/frontend/.eslintrc.json +++ b/frontend/.eslintrc.json @@ -16,11 +16,6 @@ "prettier", "next" ], - "ignorePatterns": [ - "**/graph/generated/*", - "**/vendor/*.js", - "vendor/**/*.js" - ], "parser": "@typescript-eslint/parser", "parserOptions": { "ecmaFeatures": { diff --git a/frontend/components/blueprint-create.tsx b/frontend/components/blueprint-create.tsx deleted file mode 100644 index 876b6a6c..00000000 --- a/frontend/components/blueprint-create.tsx +++ /dev/null @@ -1,487 +0,0 @@ -import { useAccountLowerCase } from "../hooks/account"; -import { useMintBlueprintToRegistry } from "../hooks/createBlueprintInRegistry"; -import { useListRegistries } from "../hooks/list-registries"; -import { parseListFromString } from "../lib/parsing"; -import { useConfetti } from "./confetti"; -import { useContractModal } from "./contract-interaction-dialog-context"; -import { DATE_INDEFINITE, DateIndefinite, FormContext } from "./forms"; -import { formatHypercertData } from "@hypercerts-org/sdk"; -import { DataProvider } from "@plasmicapp/loader-nextjs"; -import dayjs from "dayjs"; -import { Formik, FormikProps } from "formik"; -import html2canvas from "html2canvas"; -import _ from "lodash"; -import { useRouter } from "next/router"; -import qs from "qs"; -import React, { ReactNode } from "react"; -import { toast } from "react-toastify"; -import * as Yup from "yup"; - -/** - * Constants - */ -const FORM_SELECTOR = "currentForm"; -const IMAGE_SELECTOR = "hypercertimage"; -export const NAME_MIN_LENGTH = 2; -export const NAME_MAX_LENGTH = 50; - -export const DESCRIPTION_MIN_LENGTH = 20; -export const DESCRIPTION_MAX_LENGTH = 1500; - -export const DEFAULT_NUM_FRACTIONS = 10000; -export const DEFAULT_HYPERCERT_VERSION = "0.0.1"; - -//const DEFAULT_TIME = dayjs().format("YYYY-MM-DD"); -const DEFAULT_TIME = dayjs(); -const DEFAULT_FORM_DATA: BlueprintCreateFormData = { - registryId: "", - minterAddress: "", - name: "", - description: "", - externalLink: "", - logoUrl: "", - //logoImage: null, - bannerUrl: "", - //bannerImage: null, - impactScopes: ["all"] as string[], - //impactTimeStart: DEFAULT_TIME.format("YYYY-MM-DD"), - impactTimeEnd: DEFAULT_TIME.format("YYYY-MM-DD"), - workScopes: "", - workTimeStart: DEFAULT_TIME.format("YYYY-MM-DD"), - workTimeEnd: DEFAULT_TIME.format("YYYY-MM-DD"), - rights: ["Public Display"] as string[], - contributors: "", - agreeContributorsConsent: false, - agreeTermsConditions: false, - // Hidden - backgroundColor: "", - backgroundVectorArt: "", - metadataProperties: "", -}; - -interface BlueprintCreateFormData { - registryId: string; - minterAddress: string; - name: string; - description: string; - externalLink: string; - logoUrl: string; - //logoImage: File | null; - bannerUrl: string; - //bannerImage: File | null; - impactScopes: string[]; - //impactTimeStart?: string; - impactTimeEnd?: string | DateIndefinite; - workScopes: string; - workTimeStart?: string; - workTimeEnd?: string; - rights: string[]; - contributors: string; - agreeContributorsConsent: boolean; - agreeTermsConditions: boolean; - // Hidden - backgroundColor: string; - backgroundVectorArt: string; - metadataProperties: string; -} - -/** - * Generic utility function to check for valid URLs - * - We should probably move this to common.ts or util.ts - * @param value - * @param opts - * @returns - */ -const isValidUrl = ( - value: any, - opts: { - emptyAllowed?: boolean; - ipfsAllowed?: boolean; - }, -) => { - // Check empty, null, or undefined - if (opts.emptyAllowed && !value) { - return true; - } else if (!value) { - return false; - } - - // Check IPFS - const isIpfsUrl = value.match(/^(ipfs):\/\//); - if (opts.ipfsAllowed && isIpfsUrl) { - return true; - } - - try { - const urlSchema = Yup.string().url(); - urlSchema.validateSync(value); - return true; - } catch (e) { - return false; - } -}; - -/** - * Converts raw form data to a query string - * @param values - * @returns - */ -const formDataToQueryString = (values: Record) => { - // We will serialize our Dayjs objects - const formatDate = (key: string) => { - if (values[key] === DATE_INDEFINITE) { - values[key] = DATE_INDEFINITE; - } else if (values[key] && values[key].format) { - values[key] = values[key].format("YYYY-MM-DD"); - } - }; - ["impactTimeStart", "impactTimeEnd", "workTimeStart", "workTimeEnd"].forEach( - formatDate, - ); - const filteredValues = _.chain(values).pickBy().value(); - return qs.stringify(filteredValues); -}; - -/** - * Converts a query string into raw form data - * @param query - * @returns - */ -const queryStringToFormData = (query?: string) => { - const rawValues = qs.parse(query ?? ""); - const parseValue = (v: any) => { - return v === DATE_INDEFINITE ? DATE_INDEFINITE : dayjs(v as string); - }; - const values = { - ...rawValues, - // we need to parse dates to match the expected types - //impactTimeStart: parseValue(rawValues["impactTimeStart"]), - impactTimeEnd: parseValue(rawValues["impactTimeEnd"]), - workTimeStart: parseValue(rawValues["workTimeStart"]), - workTimeEnd: parseValue(rawValues["workTimeEnd"]), - }; - return values as any; -}; - -/** - * Form validation rules - */ -const ValidationSchema = Yup.object().shape({ - registryId: Yup.string().required("Required"), - minterAddress: Yup.string().required("Required"), - name: Yup.string() - .min(NAME_MIN_LENGTH, `Name must be at least ${NAME_MIN_LENGTH} characters`) - .max(NAME_MAX_LENGTH, `Name must be at most ${NAME_MAX_LENGTH} characters`) - .required("Required"), - description: Yup.string() - .min( - DESCRIPTION_MIN_LENGTH, - `Description must be at least ${DESCRIPTION_MIN_LENGTH} characters`, - ) - .max( - DESCRIPTION_MAX_LENGTH, - `Description must be at most ${DESCRIPTION_MAX_LENGTH} characters`, - ) - .required("Required"), - externalLink: Yup.string().test( - "valid uri", - "Please enter a valid URL", - (value) => - isValidUrl(value, { - emptyAllowed: true, - ipfsAllowed: true, - }), - ), - logoUrl: Yup.string().test("valid uri", "Please enter a valid URL", (value) => - isValidUrl(value, { - emptyAllowed: true, - ipfsAllowed: false, - }), - ), - bannerUrl: Yup.string().test( - "valid uri", - "Please enter a valid URL", - (value) => - isValidUrl(value, { - emptyAllowed: true, - ipfsAllowed: false, - }), - ), - impactScopes: Yup.array().min(1, "Please choose at least 1 item"), - impactTimeEnd: Yup.lazy((val: any) => { - switch (typeof val) { - case "string": - return Yup.string(); - default: - return Yup.date().when("workTimeStart", (workTimeStart) => { - return Yup.date().min( - workTimeStart, - "End date must be after start date", - ); - }); - } - }), - workScopes: Yup.string() - .required("Required") - .min( - NAME_MIN_LENGTH, - `Work scopes must be at least ${NAME_MIN_LENGTH} characters`, - ) - .test("no duplicates", "Please remove duplicate items", (value) => { - if (!value) { - return true; - } - const items = parseListFromString(value, { lowercase: "all" }); - const dedup = parseListFromString(value, { - lowercase: "all", - deduplicate: true, - }); - return _.isEqual(items, dedup); - }), - workTimeEnd: Yup.date().when("workTimeStart", (workTimeStart) => { - return Yup.date().min(workTimeStart, "End date must be after start date"); - }), - rights: Yup.array().min(1), - contributors: Yup.string() - .required("Required") - .test("no duplicates", "Please remove duplicate items", (value) => { - if (!value) { - return true; - } - const items = parseListFromString(value, { lowercase: "all" }); - const dedup = parseListFromString(value, { - lowercase: "all", - deduplicate: true, - }); - return _.isEqual(items, dedup); - }), - agreeContributorsConsent: Yup.boolean().oneOf( - [true], - "You must get the consent of contributors before creating", - ), - agreeTermsConditions: Yup.boolean().oneOf( - [true], - "You must agree to the terms and conditions", - ), -}); - -/** - * Hypercert creation form logic using Formik - * - For the actual layout of form elements, - * we assume it's passed in via the `children` prop. - * - Use the form elements defined in `./forms.tsx` - * - Make sure that there is a form element with a `fieldName` - * for each field in HypercertCreateFormData - */ -export interface HypercertCreateFormProps { - className?: string; // Plasmic CSS class - children?: ReactNode; // Form elements -} - -export function BlueprintCreateForm(props: HypercertCreateFormProps) { - const { data: registries = [] } = useListRegistries(); - const registryOptions = registries.map((r: any) => `${r.name} - ${r.id}`); - const { className, children } = props; - const { address } = useAccountLowerCase(); - const { push } = useRouter(); - const { hideModal } = useContractModal(); - const confetti = useConfetti(); - - // Query string - const [initialQuery, setInitialQuery] = React.useState( - undefined, - ); - // Load the querystring into React state only once on initial page load - React.useEffect(() => { - if (!initialQuery) { - window.location.hash.startsWith("#") - ? setInitialQuery(window.location.hash.slice(1)) - : setInitialQuery(window.location.hash); - } - }, [initialQuery]); - - const onComplete = async () => { - hideModal(); - confetti && - (await confetti.addConfetti({ - emojis: ["🌈", "⚡️", "💥", "✨", "💫", "🌸"], - })); - push("/app/dashboard"); - }; - - const { mutate: createBlueprint, isLoading: createBlueprintPending } = - useMintBlueprintToRegistry({ - onComplete, - }); - - return ( -
- { - // console.log(values); - if (typeof initialQuery !== "undefined") { - // The useEffect has run already, so it's safe to just update the query string directly - //const querystring = formDataToQueryString(values); - //const path = `${window.location.pathname}#${querystring}`; - //window.history.pushState(null, "", path); - } - }} - initialValues={{ - ...DEFAULT_FORM_DATA, - ...queryStringToFormData(initialQuery), - }} - enableReinitialize - onSubmit={async (values, { setSubmitting }) => { - const image = await exportAsImage(IMAGE_SELECTOR); - const metaData = formatValuesToMetaData( - values, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - address!, - image, - ); - console.log(`Metadata(valid=${metaData.valid}): `, metaData.data); - if (metaData.data) { - const registryId = values.registryId.split(" - ")[1]; - //return; // Used for testing - - if (!registryId) { - toast("Error creating blueprint. Please contact the team.", { - type: "error", - }); - console.error("Registry ID not found"); - return; - } - createBlueprint({ - registryId, - value: formDataToQueryString(values), - minterAddress: values.minterAddress, - }); - } else { - toast("Error creating hypercert. Please contact the team.", { - type: "error", - }); - console.error("SDK formatting errors: ", metaData.errors); - } - - if (!createBlueprintPending) { - setSubmitting(false); - } - }} - > - {(formikProps: FormikProps) => ( - - -
{ - e.preventDefault(); - console.log("Submitting form..."); - console.log("Form values: ", formikProps.values); - console.log("Form errors: ", formikProps.errors); - formikProps.handleSubmit(); - }} - > - {children} -
-
-
- )} -
-
- ); -} - -const formatValuesToMetaData = ( - val: BlueprintCreateFormData, - address: string, - image?: string, -) => { - // Split contributor names and addresses. - // - make sure addresses are always lower case - const contributorNamesAndAddresses = parseListFromString(val.contributors, { - lowercase: "addresses", - }); - // Split the work scopes - const workScopes = parseListFromString(val.workScopes); - - // Mint certificate using contract - // NOTE: we set the times to be UNIX time (seconds since the epoch) - // but Date.getTime() returns milliseconds since the epoch - // NOTE: we are fixing the impactTimeStart to be the same as workTimeStart - const impactTimeframeStart = val.workTimeStart - ? new Date(val.workTimeStart).getTime() / 1000 - : 0; - /** - const impactTimeframeStart = val.impactTimeStart - ? new Date(val.impactTimeStart).getTime() / 1000 - : 0; - */ - const impactTimeframeEnd = - val.impactTimeEnd !== "indefinite" && val.impactTimeEnd !== undefined - ? new Date(val.impactTimeEnd).getTime() / 1000 - : 0; - const workTimeframeStart = val.workTimeStart - ? new Date(val.workTimeStart).getTime() / 1000 - : 0; - const workTimeframeEnd = val.workTimeEnd - ? new Date(val.workTimeEnd).getTime() / 1000 - : 0; - - let properties = []; - if (val.metadataProperties) { - try { - properties = JSON.parse(val.metadataProperties); - } catch (e) { - console.warn( - `Unable to parse metadataProperties: ${val.metadataProperties}`, - ); - } - } - - return formatHypercertData({ - name: val.name, - description: val.description, - external_url: val.externalLink, - image: image ?? "", - contributors: contributorNamesAndAddresses, - workTimeframeStart, - workTimeframeEnd, - impactTimeframeStart, - impactTimeframeEnd, - workScope: workScopes, - impactScope: val.impactScopes, - rights: val.rights, - version: DEFAULT_HYPERCERT_VERSION, - properties: properties, - excludedImpactScope: [], - excludedRights: [], - excludedWorkScope: [], - }); -}; - -const exportAsImage = async (id: string) => { - const el = document.getElementById(id); - if (!el) { - return; - } - const canvas = await html2canvas(el, { - logging: true, - backgroundColor: null, - //useCORS: true, - proxy: "https://cors-proxy.hypercerts.workers.dev/", - imageTimeout: 0, - }); - const image = canvas.toDataURL("image/png", 1.0); - return image; -}; diff --git a/frontend/components/config.tsx b/frontend/components/config.tsx index 5cad0317..dc799b63 100644 --- a/frontend/components/config.tsx +++ b/frontend/components/config.tsx @@ -7,8 +7,8 @@ const PLASMIC_DATA_KEY = "Config"; interface ConfigData { domain: string; - chainId: number; - graphUrl: string; + chainId?: number; + graphUrl?: string; supabaseTable: string; } @@ -20,10 +20,17 @@ export interface ConfigProps { export function Config(props: ConfigProps) { const { className, children } = props; const { client: hypercertClient } = useHypercertClient(); + const chainId = hypercertClient.config.chain?.id + ? Number(hypercertClient.config.chain.id) + : undefined; + + console.log(chainId); + console.log("Config: ", hypercertClient.config); + const data: ConfigData = { domain: DOMAIN, - chainId: hypercertClient._config.chainId, - graphUrl: hypercertClient._config.graphUrl, + chainId: chainId, + graphUrl: hypercertClient?.config.graphUrl, supabaseTable: SUPABASE_TABLE, }; return ( diff --git a/frontend/components/contribution-blueprint-create.tsx b/frontend/components/contribution-blueprint-create.tsx deleted file mode 100644 index 8ca28c1a..00000000 --- a/frontend/components/contribution-blueprint-create.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { useListRegistries } from "../hooks/list-registries"; -import { Button, Divider } from "@mui/material"; -import { useState } from "react"; -import { AddRegistryDialog } from "./add-registry-dialog"; - -export const ContributionBlueprintCreate = () => { - const { data } = useListRegistries(); - const [showAddRegistryDialog, setShowAddRegistryDialog] = useState(false); - return ( -
- - {data?.map((registry: any) => ( -
-

{registry.name}

-

{registry.description}

-

{registry.owner_address}

- -
- ))} - setShowAddRegistryDialog(false)} - /> -
- ); -}; diff --git a/frontend/components/dapp-state.tsx b/frontend/components/dapp-state.tsx index 56e1947e..6b4e661a 100644 --- a/frontend/components/dapp-state.tsx +++ b/frontend/components/dapp-state.tsx @@ -1,6 +1,5 @@ import { useAccountLowerCase } from "../hooks/account"; import useCheckWriteable from "../hooks/checkWriteable"; -import { DEFAULT_CHAIN_ID } from "../lib/config"; import { claimedRecently } from "./claim-all-fractions-button"; import { PlasmicCanvasContext } from "@plasmicapp/loader-nextjs"; import { DataProvider } from "@plasmicapp/loader-nextjs"; @@ -15,7 +14,6 @@ const ALL_CHAINS = [optimism, goerli, hardhat, sepolia]; export interface DappStateData { myAddress?: string; - defaultChainId?: number; chain?: Chain; chains?: Chain[]; waitToClaim?: boolean; @@ -25,7 +23,6 @@ export interface DappStateData { //TODO revert to testnet data. Needed to override for local dev of WC-wagmi-safe integration export const DEFAULT_TEST_DATA: DappStateData = { myAddress: "0x22E4b9b003Cc7B7149CF2135dfCe2BaddC7a534f".toLowerCase(), - defaultChainId: 10, chain: optimism, chains: ALL_CHAINS, waitToClaim: false, @@ -63,7 +60,6 @@ export function DappState(props: DappStateProps) { myAddress: address, chain, chains, - defaultChainId: DEFAULT_CHAIN_ID, waitToClaim, writeable, }; diff --git a/frontend/components/hypercert-fetcher.tsx b/frontend/components/hypercert-fetcher.tsx index fd3076b5..db0c5f3f 100644 --- a/frontend/components/hypercert-fetcher.tsx +++ b/frontend/components/hypercert-fetcher.tsx @@ -79,7 +79,7 @@ export function HypercertFetcher(props: HypercertFetcherProps) { }, [useQueryString, byClaimId, byMetadataUri]); // Show when loading - if (!ignoreLoading && !!loading && !data) { + if (!client && !ignoreLoading && !!loading && !data) { return
{loading}
; } diff --git a/frontend/hooks/burnFraction.ts b/frontend/hooks/burnFraction.ts index 2c28bf11..3bff9e33 100644 --- a/frontend/hooks/burnFraction.ts +++ b/frontend/hooks/burnFraction.ts @@ -13,6 +13,7 @@ export const useBurnFraction = ({ const [txPending, setTxPending] = useState(false); const { client, isLoading } = useHypercertClient(); + const publicClient = client.config.publicClient; const stepDescriptions = { preparing: "Preparing to burn fraction", @@ -31,19 +32,22 @@ export const useBurnFraction = ({ setStep("burning"); - const tx = await client.burnClaimFraction(claimId); + const hash = await client.burnClaimFraction(claimId); - setStep("waiting"); + const receipt = await publicClient?.waitForTransactionReceipt({ + confirmations: 3, + hash: hash, + }); - const receipt = await tx.wait(5); + setStep("waiting"); - if (receipt.status === 0) { + if (receipt?.status === "reverted") { toast("Burning failed", { type: "error", }); console.error(receipt); } - if (receipt.status === 1) { + if (receipt?.status === "success") { toast(burnInteractionLabels.toastSuccess(receipt.transactionHash), { type: "success", }); diff --git a/frontend/hooks/hypercerts-client.ts b/frontend/hooks/hypercerts-client.ts index f616ab5c..e26c39ae 100644 --- a/frontend/hooks/hypercerts-client.ts +++ b/frontend/hooks/hypercerts-client.ts @@ -1,82 +1,44 @@ -import React, { useEffect, useMemo } from "react"; +import React, { useEffect } from "react"; import { - DEFAULT_CHAIN_ID, NFT_STORAGE_TOKEN, WEB3_STORAGE_TOKEN, - OVERRIDE_CHAIN_NAME, - OVERRIDE_GRAPH_URL, - CONTRACT_ADDRESS, - UNSAFE_FORCE_OVERRIDE_CONFIG, + NEXT_PUBLIC_DEFAULT_CHAIN_ID, } from "../lib/config"; import { HypercertClient, HypercertClientConfig } from "@hypercerts-org/sdk"; -import { providers } from "ethers"; -import { type WalletClient, useWalletClient, useNetwork } from "wagmi"; +import { useWalletClient, useNetwork } from "wagmi"; const clientConfig: Partial = { - chainId: DEFAULT_CHAIN_ID, + chain: { id: Number(NEXT_PUBLIC_DEFAULT_CHAIN_ID) }, nftStorageToken: NFT_STORAGE_TOKEN, web3StorageToken: WEB3_STORAGE_TOKEN, }; -function loadOverridingConfig(clientConfig: Partial) { - if (OVERRIDE_CHAIN_NAME) { - clientConfig.chainName = OVERRIDE_CHAIN_NAME; - } - - if (OVERRIDE_GRAPH_URL) { - clientConfig.graphUrl = OVERRIDE_GRAPH_URL; - } - - if (CONTRACT_ADDRESS) { - clientConfig.contractAddress = CONTRACT_ADDRESS; - } - - if (UNSAFE_FORCE_OVERRIDE_CONFIG) { - clientConfig.unsafeForceOverrideConfig = UNSAFE_FORCE_OVERRIDE_CONFIG; - } -} -loadOverridingConfig(clientConfig); - const defaultClient = new HypercertClient(clientConfig); -const walletClientToSigner = (walletClient: WalletClient) => { - const { account, chain, transport } = walletClient; - const network = { - chainId: chain.id, - name: chain.name, - ensAddress: chain.contracts?.ensRegistry?.address, - }; - const provider = new providers.Web3Provider(transport, network); - const signer = provider.getSigner(account.address); - return signer; -}; - -const useEthersSigner = ({ chainId }: { chainId?: number } = {}) => { - const { data: walletClient } = useWalletClient({ chainId }); - return useMemo( - () => (walletClient ? walletClientToSigner(walletClient) : undefined), - [walletClient], - ); -}; - export const useHypercertClient = () => { const { chain } = useNetwork(); - const signer = useEthersSigner({ chainId: chain?.id }); const [client, setClient] = React.useState(defaultClient); const [isLoading, setIsLoading] = React.useState(false); + const { + data: walletClient, + isError, + isLoading: walletClientLoading, + } = useWalletClient(); + useEffect(() => { - if (chain?.id && signer) { + if (chain?.id && !walletClientLoading && !isError && walletClient) { setIsLoading(true); - const config = { - chainId: chain.id, - operator: signer, - }; - loadOverridingConfig(config); try { + const config: Partial = { + ...clientConfig, + chain: { id: chain.id }, + walletClient, + }; + const client = new HypercertClient(config); setClient(client); } catch (e) { @@ -85,7 +47,7 @@ export const useHypercertClient = () => { } setIsLoading(false); - }, [chain?.id, signer]); + }, [chain?.id, walletClient, walletClientLoading]); return { client, isLoading }; }; diff --git a/frontend/hooks/mergeFractionUnits.ts b/frontend/hooks/mergeFractionUnits.ts index 2ebf4b8a..e984961f 100644 --- a/frontend/hooks/mergeFractionUnits.ts +++ b/frontend/hooks/mergeFractionUnits.ts @@ -13,6 +13,7 @@ export const useMergeFractionUnits = ({ const [txPending, setTxPending] = useState(false); const { client, isLoading } = useHypercertClient(); + const publicClient = client.config.publicClient; const stepDescriptions = { preparing: "Preparing to merge fraction values", @@ -29,17 +30,21 @@ export const useMergeFractionUnits = ({ try { setTxPending(true); - const tx = await client.mergeClaimUnits(ids); + const hash = await client.mergeFractionUnits(ids); + + const receipt = await publicClient?.waitForTransactionReceipt({ + confirmations: 3, + hash: hash, + }); setStep("waiting"); - const receipt = await tx.wait(5); - if (receipt.status === 0) { + if (receipt?.status === "reverted") { toast("Merging failed", { type: "error", }); console.error(receipt); } - if (receipt.status === 1) { + if (receipt?.status === "success") { toast(mintInteractionLabels.toastSuccess, { type: "success" }); setStep("complete"); diff --git a/frontend/hooks/mintClaim.ts b/frontend/hooks/mintClaim.ts index 4b152f5d..55abc6a1 100644 --- a/frontend/hooks/mintClaim.ts +++ b/frontend/hooks/mintClaim.ts @@ -10,6 +10,7 @@ export const useMintClaim = ({ onComplete }: { onComplete?: () => void }) => { const [txPending, setTxPending] = useState(false); const { client, isLoading } = useHypercertClient(); + const publicClient = client.config.publicClient; const stepDescriptions = { preparing: "Preparing to mint hypercert", @@ -29,21 +30,26 @@ export const useMintClaim = ({ onComplete }: { onComplete?: () => void }) => { try { setTxPending(true); - const tx = await client.mintClaim( + const hash = await client.mintClaim( metaData, - units, + BigInt(units), TransferRestrictions.FromCreatorOnly, ); + + const receipt = await publicClient?.waitForTransactionReceipt({ + confirmations: 3, + hash: hash, + }); + setStep("waiting"); - const receipt = await tx.wait(5); - if (receipt.status === 0) { + if (receipt?.status === "reverted") { toast("Minting failed", { type: "error", }); console.error(receipt); } - if (receipt.status === 1) { + if (receipt?.status === "success") { toast(mintInteractionLabels.toastSuccess, { type: "success" }); setStep("complete"); diff --git a/frontend/hooks/mintClaimAllowlist.ts b/frontend/hooks/mintClaimAllowlist.ts index 45debc0b..18273244 100644 --- a/frontend/hooks/mintClaimAllowlist.ts +++ b/frontend/hooks/mintClaimAllowlist.ts @@ -23,6 +23,7 @@ export const useMintClaimAllowlist = ({ const [txPending, setTxPending] = useState(false); const { client, isLoading } = useHypercertClient(); + const publicClient = client.config.publicClient; const stepDescriptions = { validateAllowlist: "Validating allowlist", @@ -121,22 +122,27 @@ export const useMintClaimAllowlist = ({ setStep("preparing"); setTxPending(true); - const tx = await client.createAllowlist( + const hash = await client.createAllowlist( _allowlist, metaData, _totalSupply, TransferRestrictions.FromCreatorOnly, ); + + const receipt = await publicClient?.waitForTransactionReceipt({ + confirmations: 3, + hash: hash, + }); + setStep("writing"); - const receipt = await tx.wait(5); - if (receipt.status === 0) { + if (receipt?.status === "reverted") { toast("Minting failed", { type: "error", }); console.error(receipt); } - if (receipt.status === 1) { + if (receipt?.status === "success") { toast(mintInteractionLabels.toastSuccess, { type: "success" }); setStep("complete"); diff --git a/frontend/hooks/mintFractionAllowlist.ts b/frontend/hooks/mintFractionAllowlist.ts index 09cd0ff5..822cba42 100644 --- a/frontend/hooks/mintFractionAllowlist.ts +++ b/frontend/hooks/mintFractionAllowlist.ts @@ -15,6 +15,8 @@ export const useMintFractionAllowlist = ({ const [txPending, setTxPending] = useState(false); const { client, isLoading } = useHypercertClient(); + const publicClient = client.config.publicClient; + const { setStep, showModal, hideModal } = useContractModal(); const stepDescriptions = { @@ -29,27 +31,32 @@ export const useMintFractionAllowlist = ({ const initializeWrite = async ( claimID: bigint, units: bigint, - proof: string[], + proof: `0x${string}`[], ) => { setStep("minting"); try { setTxPending(true); - const tx = await client.mintClaimFractionFromAllowlist( + const hash = await client.mintClaimFractionFromAllowlist( claimID, units, proof, ); + + const receipt = await publicClient?.waitForTransactionReceipt({ + confirmations: 3, + hash: hash, + }); + setStep("waiting"); - const receipt = await tx.wait(5); - if (receipt.status === 0) { + if (receipt?.status === "reverted") { toast("Minting failed", { type: "error", }); console.error(receipt); } - if (receipt.status === 1) { + if (receipt?.status === "success") { toast(mintInteractionLabels.toastSuccess, { type: "success" }); setStep("complete"); @@ -67,7 +74,7 @@ export const useMintFractionAllowlist = ({ }; return { - write: async (proof: string[], claimId: bigint, units: bigint) => { + write: async (proof: `0x${string}`[], claimId: bigint, units: bigint) => { showModal({ stepDescriptions }); setStep("initial"); await initializeWrite(claimId, units, proof); diff --git a/frontend/hooks/mintFractionAllowlistBatch.ts b/frontend/hooks/mintFractionAllowlistBatch.ts index e1c65c71..97c5b6f3 100644 --- a/frontend/hooks/mintFractionAllowlistBatch.ts +++ b/frontend/hooks/mintFractionAllowlistBatch.ts @@ -27,6 +27,8 @@ export const useMintFractionAllowlistBatch = ({ const { data: claimIds } = useGetAllEligibility(address ?? "", chain?.id); const parseError = useParseBlockchainError(); + const publicClient = client.config.publicClient; + const stepDescriptions = { initial: "Initializing interaction", proofs: "Getting and verifying proofs", @@ -56,7 +58,9 @@ export const useMintFractionAllowlistBatch = ({ const verified: ClaimProof[] = results.flat().filter((x) => x); const unique = _.uniqWith(verified, _.isEqual); - const claimIDs = unique.map((claimProof) => claimProof.claimIDContract); + const claimIDs = unique.map((claimProof) => + BigInt(claimProof.claimIDContract), + ); const units = unique.map((claimProof) => BigInt(claimProof.units)); const proofs = unique.map((claimProof) => claimProof.proof as HexString[]); @@ -69,21 +73,25 @@ export const useMintFractionAllowlistBatch = ({ try { setTxPending(true); - const tx = await client.batchMintClaimFractionsFromAllowlists( + const hash = await client.batchMintClaimFractionsFromAllowlists( claimIDs, units, proofs, ); + + const receipt = await publicClient?.waitForTransactionReceipt({ + confirmations: 3, + hash: hash, + }); setStep("waiting"); - const receipt = await tx.wait(5); - if (receipt.status === 0) { + if (receipt?.status === "reverted") { toast("Minting failed", { type: "error", }); console.error(receipt); } - if (receipt.status === 1) { + if (receipt?.status === "success") { toast(mintInteractionLabels.toastSuccess, { type: "success" }); setStep("complete"); diff --git a/frontend/hooks/splitClaimUnits.ts b/frontend/hooks/splitClaimUnits.ts index 47cd4859..640ad196 100644 --- a/frontend/hooks/splitClaimUnits.ts +++ b/frontend/hooks/splitClaimUnits.ts @@ -24,22 +24,29 @@ export const useSplitFractionUnits = ({ const { setStep, showModal, hideModal } = useContractModal(); const parseError = useParseBlockchainError(); + const publicClient = client.config.publicClient; + const initializeWrite = async (id: bigint, fractions: bigint[]) => { setStep("splitting"); try { setTxPending(true); - const tx = await client.splitClaimUnits(id, fractions); + const hash = await client.splitFractionUnits(id, fractions); + + const receipt = await publicClient?.waitForTransactionReceipt({ + confirmations: 3, + hash: hash, + }); + setStep("waiting"); - const receipt = await tx.wait(5); - if (receipt.status === 0) { + if (receipt?.status === "reverted") { toast("Splitting failed", { type: "error", }); console.error(receipt); } - if (receipt.status === 1) { + if (receipt?.status === "success") { toast(mintInteractionLabels.toastSuccess, { type: "success" }); setStep("complete"); diff --git a/frontend/lib/config.ts b/frontend/lib/config.ts index a30134c6..6ebe8eed 100644 --- a/frontend/lib/config.ts +++ b/frontend/lib/config.ts @@ -12,15 +12,11 @@ export const DOMAIN = requireEnv( export const isProduction = DOMAIN === "hypercerts.org"; -export const DEFAULT_CHAIN_ID = parseInt( - requireEnv( - process.env.NEXT_PUBLIC_DEFAULT_CHAIN_ID, - "NEXT_PUBLIC_DEFAULT_CHAIN_ID", - ), +export const NEXT_PUBLIC_DEFAULT_CHAIN_ID = requireEnv( + process.env.NEXT_PUBLIC_DEFAULT_CHAIN_ID, + "NEXT_PUBLIC_DEFAULT_CHAIN_ID", ); -export const CONTRACT_ADDRESS = process.env.NEXT_PUBLIC_CONTRACT_ADDRESS; - export const NFT_STORAGE_TOKEN = requireEnv( process.env.NEXT_PUBLIC_NFT_STORAGE_TOKEN, "NEXT_PUBLIC_NFT_STORAGE_TOKEN", @@ -53,7 +49,3 @@ export const SUPABASE_TABLE = requireEnv( export const UNSAFE_FORCE_OVERRIDE_CONFIG = process.env.NEXT_PUBLIC_UNSAFE_FORCE_OVERRIDE_CONFIG == "1"; - -export const OVERRIDE_CHAIN_NAME = process.env.NEXT_PUBLIC_CHAIN_NAME; - -export const OVERRIDE_GRAPH_URL = process.env.NEXT_PUBLIC_GRAPH_URL; diff --git a/frontend/lib/hypercert.test.ts b/frontend/lib/hypercert.test.ts index 7920637b..a2d4c549 100644 --- a/frontend/lib/hypercert.test.ts +++ b/frontend/lib/hypercert.test.ts @@ -23,7 +23,7 @@ function genClaimTokens( id: id, tokenID: tokenID, owner: owner, - chainName: options?.chainName ?? "test", + graphName: options?.chainName ?? "test", units: options?.units ?? "100", }); } @@ -37,7 +37,7 @@ function genClaim(totalUnits: string): Claim { contract: randomAddress(), tokenID: randomTokenID(), totalUnits: totalUnits, - chainName: "test", + graphName: "test", }; } diff --git a/frontend/lib/parse-blockchain-error.ts b/frontend/lib/parse-blockchain-error.ts index 1f28a411..8c169066 100644 --- a/frontend/lib/parse-blockchain-error.ts +++ b/frontend/lib/parse-blockchain-error.ts @@ -1,19 +1,20 @@ import { errorMessages } from "../content/readable-errors"; -import { useHypercertClient } from "../hooks/hypercerts-client"; +import { decodeErrorResult } from "viem"; +import { HypercertMinterAbi } from "@hypercerts-org/contracts"; export const useParseBlockchainError = () => { - const { - client: { contract }, - } = useHypercertClient(); return (e: any, fallbackMessage: string) => { const unparsedErrorData = e?.error?.data?.originalError?.data; if (unparsedErrorData) { - const errorData = contract?.interface?.parseError(unparsedErrorData); + const errorData = decodeErrorResult({ + abi: HypercertMinterAbi, + data: unparsedErrorData, + }); if (errorData) { console.log("Blockchain error", errorData); - const errorName = errorData.errorFragment.name; + const errorName = errorData.errorName; return errorMessages[errorName] || errorName; } } diff --git a/frontend/lib/parsing.test.ts b/frontend/lib/parsing.test.ts index 2b14fe6f..f98ec4d1 100644 --- a/frontend/lib/parsing.test.ts +++ b/frontend/lib/parsing.test.ts @@ -11,9 +11,9 @@ describe("allowlist", () => { true, ); expect(resultDeduped).toEqual([ - { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 100 }, - { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50 }, - { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40 }, + { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 100n }, + { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50n }, + { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40n }, ]); const resultNotDeduped = parseAllowlistCsv( @@ -25,9 +25,9 @@ describe("allowlist", () => { false, ); expect(resultNotDeduped).toEqual([ - { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 100 }, - { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50 }, - { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40 }, + { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 100n }, + { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50n }, + { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40n }, ]); }); @@ -43,9 +43,9 @@ describe("allowlist", () => { true, ); expect(result).toEqual([ - { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 200 }, - { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50 }, - { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 80 }, + { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 200n }, + { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50n }, + { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 80n }, ]); }); @@ -61,11 +61,11 @@ describe("allowlist", () => { false, ); expect(result).toEqual([ - { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 100 }, - { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50 }, - { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40 }, - { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 100 }, - { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40 }, + { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 100n }, + { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50n }, + { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40n }, + { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 100n }, + { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40n }, ]); }); @@ -85,10 +85,10 @@ describe("allowlist", () => { ], ); expect(result).toEqual([ - { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 100 }, - { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50 }, - { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40 }, - { address: "0x22e4b9b003cc7b7149cf2135dfce2baddc7a534f", units: 570 }, + { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 100n }, + { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50n }, + { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40n }, + { address: "0x22e4b9b003cc7b7149cf2135dfce2baddc7a534f", units: 570n }, ]); }); @@ -112,10 +112,10 @@ describe("allowlist", () => { ], ); expect(result).toEqual([ - { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 290 }, - { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50 }, - { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40 }, - { address: "0x22e4b9b003cc7b7149cf2135dfce2baddc7a534f", units: 380 }, + { address: "0x20326e144532f17f76aca759e61e19af20a58ef3", units: 290n }, + { address: "0x15c7281842a45465b4cbb8f89111d99e36e5bab8", units: 50n }, + { address: "0x1cca19b823afa773b09708d94d2ee6ff96c60057", units: 40n }, + { address: "0x22e4b9b003cc7b7149cf2135dfce2baddc7a534f", units: 380n }, ]); }); diff --git a/frontend/lib/parsing.ts b/frontend/lib/parsing.ts index e7444a9c..8315f860 100644 --- a/frontend/lib/parsing.ts +++ b/frontend/lib/parsing.ts @@ -27,12 +27,17 @@ export function parseAllowlistCsv( console.error("Errors parsing allowlist:", errors); throw new InvalidDataError("Errors parsing allowlist"); } + + console.log(rawData); // Get the addresses and units from the CSV const csvData = rawData.map((row: any) => ({ address: row["address"].trim().toLowerCase(), - units: parseInt(row["fractions"].trim(), 10), + units: BigInt(row["fractions"].trim()), })); - const csvTotalSupply = csvData.reduce((accum, curr) => accum + curr.units, 0); + const csvTotalSupply = csvData.reduce( + (accum, curr) => accum + curr.units, + 0n, + ); if (csvTotalSupply <= 0) { throw new InvalidDataError("Did not find any valid rows"); } @@ -52,12 +57,23 @@ export function parseAllowlistCsv( } } // Combine CSV data with manually added addresses + // 0.75 const csvTotalPercentage = 1.0 - addTotalPercentage; - const totalSupply = csvTotalSupply / csvTotalPercentage; + + // 75 + const csvTotalPercentageBigInt = BigInt(Math.floor(csvTotalPercentage * 100)); // convert percentage to BigInt + const addTotalPercentageBigInt = BigInt(Math.floor(addTotalPercentage * 100)); // convert percentage to BigInt + const creatorSupply = + (((csvTotalSupply * 100n) / csvTotalPercentageBigInt) * + addTotalPercentageBigInt) / + 100n; + const totalSupply = csvTotalSupply + creatorSupply; // calculate total supply + + // TODO risk over overflow on units - casting bigint to number const data = csvData.concat( add.map((x) => ({ address: x.address.trim().toLowerCase(), - units: Math.floor(totalSupply * x.percentage), + units: (totalSupply * BigInt(Math.floor(x.percentage * 100))) / 100n, })), ); @@ -69,7 +85,7 @@ export function parseAllowlistCsv( // Deduplicate const groups = _.groupBy(data, (x) => x.address); const addressToUnits = _.mapValues(groups, (x) => - x.reduce((accum, curr) => accum + curr.units, 0), + x.reduce((accum, curr) => accum + curr.units, 0n), ); const result = _.toPairs(addressToUnits).map(([address, units]) => ({ diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs index beb093bd..c8d52715 100644 --- a/frontend/next.config.mjs +++ b/frontend/next.config.mjs @@ -15,6 +15,7 @@ const nextConfig = { config.resolve.fallback = { fs: false, net: false, tls: false }; return config; }, + transpilePackages: ["@hypercerts-org/sdk"], }; export default withSentryConfig( diff --git a/frontend/package.json b/frontend/package.json index c9d96480..7c9186ee 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,9 +23,9 @@ "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@graphprotocol/client-cli": "^2.2.16", - "@hypercerts-org/contracts": "0.8.11", + "@hypercerts-org/contracts": "0.9.0", "@hypercerts-org/observabletreemap": "workspace: *", - "@hypercerts-org/sdk": "0.8.16", + "@hypercerts-org/sdk": "1.0.0-alpha.6", "@mui/icons-material": "^5.11.9", "@mui/material": "^5.11.2", "@mui/x-date-pickers": "^5.0.12", @@ -34,7 +34,7 @@ "@openzeppelin/merkle-tree": "^1.0.2", "@plasmicapp/host": "^1.0.171", "@plasmicapp/loader-nextjs": "^1.0.284", - "@rainbow-me/rainbowkit": "1.0.8", + "@rainbow-me/rainbowkit": "1.2.0", "@sentry/nextjs": "^7.73.0", "@sentry/utils": "^7.73.0", "@supabase/supabase-js": "^2.1.2", @@ -66,8 +66,8 @@ "react-toastify": "^9.1.1", "react-use": "^17.4.0", "serve": "^14.0.1", - "viem": "1.5.3", - "wagmi": "1.3.9", + "viem": "1.18.4", + "wagmi": "1.4.5", "yup": "^0.32.11" }, "devDependencies": { diff --git a/frontend/plasmic-init.ts b/frontend/plasmic-init.ts index c722eca3..42c167c4 100644 --- a/frontend/plasmic-init.ts +++ b/frontend/plasmic-init.ts @@ -1,9 +1,7 @@ -import { BlueprintCreateForm } from "./components/blueprint-create"; import { BurnFractionButton } from "./components/burn-fraction-button"; import ClaimAllFractionsButton from "./components/claim-all-fractions-button"; import { ClientGrid } from "./components/client-grid"; import { Config } from "./components/config"; -import { ContributionBlueprintCreate } from "./components/contribution-blueprint-create"; import { DEFAULT_TEST_DATA } from "./components/dapp-state"; import { FormField, @@ -240,29 +238,6 @@ PLASMIC.registerComponent(HypercertCreateForm, { importPath: "./components/hypercert-create", }); -PLASMIC.registerComponent(BlueprintCreateForm, { - name: "BlueprintCreateForm", - description: "Create a blueprint", - props: { - children: { - type: "slot", - defaultValue: { - type: "text", - value: "Placeholder", - }, - }, - }, - providesData: true, - importPath: "./components/blueprint-create", -}); - -PLASMIC.registerComponent(ContributionBlueprintCreate, { - name: "ContributionBlueprintCreate", - description: "Create a contribution blueprint", - importPath: "./components/contribution-blueprint-create", - props: {}, -}); - PLASMIC.registerComponent(FormError, { name: "FormError", description: "Displays the error associated with fieldName", diff --git a/graph/.eslintrc.yml b/graph/.eslintrc.yml new file mode 100644 index 00000000..2c49e547 --- /dev/null +++ b/graph/.eslintrc.yml @@ -0,0 +1,11 @@ +root: false +ignorePatterns: ["tests/", "generated/"] +parser: "@typescript-eslint/parser" +plugins: + - "@typescript-eslint" +extends: + - "eslint:recommended" + - "plugin:@typescript-eslint/recommended" +rules: + "@typescript-eslint/ban-types": + - "warn" diff --git a/graph/abis/HypercertMinter.json b/graph/abis/HypercertMinter.json index a0bb3aee..feb7ccb2 100644 --- a/graph/abis/HypercertMinter.json +++ b/graph/abis/HypercertMinter.json @@ -1,1065 +1,1130 @@ [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "ArraySize", - "type": "error" - }, - { - "inputs": [], - "name": "DoesNotExist", - "type": "error" - }, - { - "inputs": [], - "name": "DuplicateEntry", - "type": "error" - }, - { - "inputs": [], - "name": "FractionalBurn", - "type": "error" - }, - { - "inputs": [], - "name": "Invalid", - "type": "error" - }, - { - "inputs": [], - "name": "NotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "TransfersNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "TypeMismatch", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "AdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "tokenID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "root", - "type": "bytes32" - } - ], - "name": "AllowlistCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": false, - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "name": "ApprovalForAll", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256[]", - "name": "claimIDs", - "type": "uint256[]" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "fromTokenIDs", - "type": "uint256[]" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "toTokenIDs", - "type": "uint256[]" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - } - ], - "name": "BatchValueTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" - } - ], - "name": "BeaconUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "claimID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "uri", - "type": "string" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "totalUnits", - "type": "uint256" - } - ], - "name": "ClaimStored", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "tokenID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "leaf", - "type": "bytes32" - } - ], - "name": "LeafClaimed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "ids", - "type": "uint256[]" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - } - ], - "name": "TransferBatch", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "TransferSingle", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "string", - "name": "value", - "type": "string" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "URI", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "claimID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "fromTokenID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "toTokenID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "ValueTransfer", - "type": "event" - }, - { - "inputs": [], - "name": "__SemiFungible1155_init", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "__Upgradeable1155_init", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "accounts", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "ids", - "type": "uint256[]" - } - ], - "name": "balanceOfBatch", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[][]", - "name": "proofs", - "type": "bytes32[][]" - }, - { - "internalType": "uint256[]", - "name": "claimIDs", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "units", - "type": "uint256[]" - } - ], - "name": "batchMintClaimsFromAllowlists", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "ids", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - } - ], - "name": "burnBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_tokenID", - "type": "uint256" - } - ], - "name": "burnValue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "units", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "merkleRoot", - "type": "bytes32" - }, - { - "internalType": "string", - "name": "_uri", - "type": "string" - }, - { - "internalType": "enum IHypercertToken.TransferRestrictions", - "name": "restrictions", - "type": "uint8" - } - ], - "name": "createAllowlist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "hasBeenClaimed", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "proof", - "type": "bytes32[]" - }, - { - "internalType": "uint256", - "name": "claimID", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "leaf", - "type": "bytes32" - } - ], - "name": "isAllowedToClaim", - "outputs": [ - { - "internalType": "bool", - "name": "isAllowed", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "address", - "name": "operator", - "type": "address" - } - ], - "name": "isApprovedForAll", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "_fractionIDs", - "type": "uint256[]" - } - ], - "name": "mergeValue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "units", - "type": "uint256" - }, - { - "internalType": "string", - "name": "_uri", - "type": "string" - }, - { - "internalType": "enum IHypercertToken.TransferRestrictions", - "name": "restrictions", - "type": "uint8" - } - ], - "name": "mintClaim", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "proof", - "type": "bytes32[]" - }, - { - "internalType": "uint256", - "name": "claimID", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "units", - "type": "uint256" - } - ], - "name": "mintClaimFromAllowlist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "units", - "type": "uint256" - }, - { - "internalType": "uint256[]", - "name": "fractions", - "type": "uint256[]" - }, - { - "internalType": "string", - "name": "_uri", - "type": "string" - }, - { - "internalType": "enum IHypercertToken.TransferRestrictions", - "name": "restrictions", - "type": "uint8" - } - ], - "name": "mintClaimWithFractions", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tokenID", - "type": "uint256" - } - ], - "name": "ownerOf", - "outputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "proxiableUUID", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "ids", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "safeBatchTransferFrom", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "safeTransferFrom", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "name": "setApprovalForAll", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_tokenID", - "type": "uint256" - }, - { - "internalType": "uint256[]", - "name": "_values", - "type": "uint256[]" - } - ], - "name": "splitValue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenID", - "type": "uint256" - } - ], - "name": "unitsOf", - "outputs": [ - { - "internalType": "uint256", - "name": "units", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tokenID", - "type": "uint256" - } - ], - "name": "unitsOf", - "outputs": [ - { - "internalType": "uint256", - "name": "units", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tokenID", - "type": "uint256" - } - ], + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AlreadyClaimed", + "type": "error" + }, + { + "inputs": [], + "name": "ArraySize", + "type": "error" + }, + { + "inputs": [], + "name": "DoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "DuplicateEntry", + "type": "error" + }, + { + "inputs": [], + "name": "Invalid", + "type": "error" + }, + { + "inputs": [], + "name": "NotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "NotApprovedOrOwner", + "type": "error" + }, + { + "inputs": [], + "name": "TransfersNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "TypeMismatch", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "AllowlistCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256[]", + "name": "claimIDs", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "fromTokenIDs", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "toTokenIDs", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + } + ], + "name": "BatchValueTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "claimID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", "name": "uri", - "outputs": [ - { - "internalType": "string", - "name": "_uri", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - } + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalUnits", + "type": "uint256" + } + ], + "name": "ClaimStored", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "leaf", + "type": "bytes32" + } + ], + "name": "LeafClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + } + ], + "name": "TransferBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "TransferSingle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "value", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "URI", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "claimID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fromTokenID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "toTokenID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "ValueTransfer", + "type": "event" + }, + { + "inputs": [], + "name": "__SemiFungible1155_init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "accounts", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "balanceOfBatch", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "_tokenIDs", + "type": "uint256[]" + } + ], + "name": "batchBurnFraction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32[][]", + "name": "proofs", + "type": "bytes32[][]" + }, + { + "internalType": "uint256[]", + "name": "claimIDs", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "units", + "type": "uint256[]" + } + ], + "name": "batchMintClaimsFromAllowlists", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + } + ], + "name": "burnBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenID", + "type": "uint256" + } + ], + "name": "burnFraction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "merkleRoot", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "_uri", + "type": "string" + }, + { + "internalType": "enum IHypercertToken.TransferRestrictions", + "name": "restrictions", + "type": "uint8" + } + ], + "name": "createAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "hasBeenClaimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "claimID", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "leaf", + "type": "bytes32" + } + ], + "name": "isAllowedToClaim", + "outputs": [ + { + "internalType": "bool", + "name": "isAllowed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "_fractionIDs", + "type": "uint256[]" + } + ], + "name": "mergeFractions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_uri", + "type": "string" + }, + { + "internalType": "enum IHypercertToken.TransferRestrictions", + "name": "restrictions", + "type": "uint8" + } + ], + "name": "mintClaim", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "claimID", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + } + ], + "name": "mintClaimFromAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "fractions", + "type": "uint256[]" + }, + { + "internalType": "string", + "name": "_uri", + "type": "string" + }, + { + "internalType": "enum IHypercertToken.TransferRestrictions", + "name": "restrictions", + "type": "uint8" + } + ], + "name": "mintClaimWithFractions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "readTransferRestriction", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeBatchTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenID", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "_newFractions", + "type": "uint256[]" + } + ], + "name": "splitFraction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "unitsOf", + "outputs": [ + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "unitsOf", + "outputs": [ + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "uri", + "outputs": [ + { + "internalType": "string", + "name": "_uri", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } ] diff --git a/graph/generated/HypercertMinter/HypercertMinter.ts b/graph/generated/HypercertMinter/HypercertMinter.ts index 41fdeb8c..988629ae 100644 --- a/graph/generated/HypercertMinter/HypercertMinter.ts +++ b/graph/generated/HypercertMinter/HypercertMinter.ts @@ -7,7 +7,7 @@ import { Entity, Bytes, Address, - BigInt + BigInt, } from "@graphprotocol/graph-ts"; export class AdminChanged extends ethereum.Event { @@ -401,8 +401,8 @@ export class HypercertMinter extends ethereum.SmartContract { "balanceOf(address,uint256):(uint256)", [ ethereum.Value.fromAddress(account), - ethereum.Value.fromUnsignedBigInt(id) - ] + ethereum.Value.fromUnsignedBigInt(id), + ], ); return result[0].toBigInt(); @@ -414,8 +414,8 @@ export class HypercertMinter extends ethereum.SmartContract { "balanceOf(address,uint256):(uint256)", [ ethereum.Value.fromAddress(account), - ethereum.Value.fromUnsignedBigInt(id) - ] + ethereum.Value.fromUnsignedBigInt(id), + ], ); if (result.reverted) { return new ethereum.CallResult(); @@ -430,8 +430,8 @@ export class HypercertMinter extends ethereum.SmartContract { "balanceOfBatch(address[],uint256[]):(uint256[])", [ ethereum.Value.fromAddressArray(accounts), - ethereum.Value.fromUnsignedBigIntArray(ids) - ] + ethereum.Value.fromUnsignedBigIntArray(ids), + ], ); return result[0].toBigIntArray(); @@ -439,15 +439,15 @@ export class HypercertMinter extends ethereum.SmartContract { try_balanceOfBatch( accounts: Array
, - ids: Array + ids: Array, ): ethereum.CallResult> { let result = super.tryCall( "balanceOfBatch", "balanceOfBatch(address[],uint256[]):(uint256[])", [ ethereum.Value.fromAddressArray(accounts), - ethereum.Value.fromUnsignedBigIntArray(ids) - ] + ethereum.Value.fromUnsignedBigIntArray(ids), + ], ); if (result.reverted) { return new ethereum.CallResult(); @@ -462,8 +462,8 @@ export class HypercertMinter extends ethereum.SmartContract { "hasBeenClaimed(uint256,bytes32):(bool)", [ ethereum.Value.fromUnsignedBigInt(param0), - ethereum.Value.fromFixedBytes(param1) - ] + ethereum.Value.fromFixedBytes(param1), + ], ); return result[0].toBoolean(); @@ -471,15 +471,15 @@ export class HypercertMinter extends ethereum.SmartContract { try_hasBeenClaimed( param0: BigInt, - param1: Bytes + param1: Bytes, ): ethereum.CallResult { let result = super.tryCall( "hasBeenClaimed", "hasBeenClaimed(uint256,bytes32):(bool)", [ ethereum.Value.fromUnsignedBigInt(param0), - ethereum.Value.fromFixedBytes(param1) - ] + ethereum.Value.fromFixedBytes(param1), + ], ); if (result.reverted) { return new ethereum.CallResult(); @@ -495,8 +495,8 @@ export class HypercertMinter extends ethereum.SmartContract { [ ethereum.Value.fromFixedBytesArray(proof), ethereum.Value.fromUnsignedBigInt(claimID), - ethereum.Value.fromFixedBytes(leaf) - ] + ethereum.Value.fromFixedBytes(leaf), + ], ); return result[0].toBoolean(); @@ -505,7 +505,7 @@ export class HypercertMinter extends ethereum.SmartContract { try_isAllowedToClaim( proof: Array, claimID: BigInt, - leaf: Bytes + leaf: Bytes, ): ethereum.CallResult { let result = super.tryCall( "isAllowedToClaim", @@ -513,8 +513,8 @@ export class HypercertMinter extends ethereum.SmartContract { [ ethereum.Value.fromFixedBytesArray(proof), ethereum.Value.fromUnsignedBigInt(claimID), - ethereum.Value.fromFixedBytes(leaf) - ] + ethereum.Value.fromFixedBytes(leaf), + ], ); if (result.reverted) { return new ethereum.CallResult(); @@ -529,8 +529,8 @@ export class HypercertMinter extends ethereum.SmartContract { "isApprovedForAll(address,address):(bool)", [ ethereum.Value.fromAddress(account), - ethereum.Value.fromAddress(operator) - ] + ethereum.Value.fromAddress(operator), + ], ); return result[0].toBoolean(); @@ -538,15 +538,15 @@ export class HypercertMinter extends ethereum.SmartContract { try_isApprovedForAll( account: Address, - operator: Address + operator: Address, ): ethereum.CallResult { let result = super.tryCall( "isApprovedForAll", "isApprovedForAll(address,address):(bool)", [ ethereum.Value.fromAddress(account), - ethereum.Value.fromAddress(operator) - ] + ethereum.Value.fromAddress(operator), + ], ); if (result.reverted) { return new ethereum.CallResult(); @@ -587,7 +587,7 @@ export class HypercertMinter extends ethereum.SmartContract { ownerOf(tokenID: BigInt): Address { let result = super.call("ownerOf", "ownerOf(uint256):(address)", [ - ethereum.Value.fromUnsignedBigInt(tokenID) + ethereum.Value.fromUnsignedBigInt(tokenID), ]); return result[0].toAddress(); @@ -595,7 +595,7 @@ export class HypercertMinter extends ethereum.SmartContract { try_ownerOf(tokenID: BigInt): ethereum.CallResult
{ let result = super.tryCall("ownerOf", "ownerOf(uint256):(address)", [ - ethereum.Value.fromUnsignedBigInt(tokenID) + ethereum.Value.fromUnsignedBigInt(tokenID), ]); if (result.reverted) { return new ethereum.CallResult(); @@ -629,7 +629,7 @@ export class HypercertMinter extends ethereum.SmartContract { let result = super.tryCall( "proxiableUUID", "proxiableUUID():(bytes32)", - [] + [], ); if (result.reverted) { return new ethereum.CallResult(); @@ -638,11 +638,34 @@ export class HypercertMinter extends ethereum.SmartContract { return ethereum.CallResult.fromValue(value[0].toBytes()); } + readTransferRestriction(tokenID: BigInt): string { + let result = super.call( + "readTransferRestriction", + "readTransferRestriction(uint256):(string)", + [ethereum.Value.fromUnsignedBigInt(tokenID)], + ); + + return result[0].toString(); + } + + try_readTransferRestriction(tokenID: BigInt): ethereum.CallResult { + let result = super.tryCall( + "readTransferRestriction", + "readTransferRestriction(uint256):(string)", + [ethereum.Value.fromUnsignedBigInt(tokenID)], + ); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toString()); + } + supportsInterface(interfaceId: Bytes): boolean { let result = super.call( "supportsInterface", "supportsInterface(bytes4):(bool)", - [ethereum.Value.fromFixedBytes(interfaceId)] + [ethereum.Value.fromFixedBytes(interfaceId)], ); return result[0].toBoolean(); @@ -652,7 +675,7 @@ export class HypercertMinter extends ethereum.SmartContract { let result = super.tryCall( "supportsInterface", "supportsInterface(bytes4):(bool)", - [ethereum.Value.fromFixedBytes(interfaceId)] + [ethereum.Value.fromFixedBytes(interfaceId)], ); if (result.reverted) { return new ethereum.CallResult(); @@ -664,7 +687,7 @@ export class HypercertMinter extends ethereum.SmartContract { unitsOf(account: Address, tokenID: BigInt): BigInt { let result = super.call("unitsOf", "unitsOf(address,uint256):(uint256)", [ ethereum.Value.fromAddress(account), - ethereum.Value.fromUnsignedBigInt(tokenID) + ethereum.Value.fromUnsignedBigInt(tokenID), ]); return result[0].toBigInt(); @@ -676,8 +699,8 @@ export class HypercertMinter extends ethereum.SmartContract { "unitsOf(address,uint256):(uint256)", [ ethereum.Value.fromAddress(account), - ethereum.Value.fromUnsignedBigInt(tokenID) - ] + ethereum.Value.fromUnsignedBigInt(tokenID), + ], ); if (result.reverted) { return new ethereum.CallResult(); @@ -688,7 +711,7 @@ export class HypercertMinter extends ethereum.SmartContract { unitsOf1(tokenID: BigInt): BigInt { let result = super.call("unitsOf", "unitsOf(uint256):(uint256)", [ - ethereum.Value.fromUnsignedBigInt(tokenID) + ethereum.Value.fromUnsignedBigInt(tokenID), ]); return result[0].toBigInt(); @@ -696,7 +719,7 @@ export class HypercertMinter extends ethereum.SmartContract { try_unitsOf1(tokenID: BigInt): ethereum.CallResult { let result = super.tryCall("unitsOf", "unitsOf(uint256):(uint256)", [ - ethereum.Value.fromUnsignedBigInt(tokenID) + ethereum.Value.fromUnsignedBigInt(tokenID), ]); if (result.reverted) { return new ethereum.CallResult(); @@ -707,7 +730,7 @@ export class HypercertMinter extends ethereum.SmartContract { uri(tokenID: BigInt): string { let result = super.call("uri", "uri(uint256):(string)", [ - ethereum.Value.fromUnsignedBigInt(tokenID) + ethereum.Value.fromUnsignedBigInt(tokenID), ]); return result[0].toString(); @@ -715,7 +738,7 @@ export class HypercertMinter extends ethereum.SmartContract { try_uri(tokenID: BigInt): ethereum.CallResult { let result = super.tryCall("uri", "uri(uint256):(string)", [ - ethereum.Value.fromUnsignedBigInt(tokenID) + ethereum.Value.fromUnsignedBigInt(tokenID), ]); if (result.reverted) { return new ethereum.CallResult(); @@ -777,28 +800,36 @@ export class __SemiFungible1155_initCall__Outputs { } } -export class __Upgradeable1155_initCall extends ethereum.Call { - get inputs(): __Upgradeable1155_initCall__Inputs { - return new __Upgradeable1155_initCall__Inputs(this); +export class BatchBurnFractionCall extends ethereum.Call { + get inputs(): BatchBurnFractionCall__Inputs { + return new BatchBurnFractionCall__Inputs(this); } - get outputs(): __Upgradeable1155_initCall__Outputs { - return new __Upgradeable1155_initCall__Outputs(this); + get outputs(): BatchBurnFractionCall__Outputs { + return new BatchBurnFractionCall__Outputs(this); } } -export class __Upgradeable1155_initCall__Inputs { - _call: __Upgradeable1155_initCall; +export class BatchBurnFractionCall__Inputs { + _call: BatchBurnFractionCall; - constructor(call: __Upgradeable1155_initCall) { + constructor(call: BatchBurnFractionCall) { this._call = call; } + + get _account(): Address { + return this._call.inputValues[0].value.toAddress(); + } + + get _tokenIDs(): Array { + return this._call.inputValues[1].value.toBigIntArray(); + } } -export class __Upgradeable1155_initCall__Outputs { - _call: __Upgradeable1155_initCall; +export class BatchBurnFractionCall__Outputs { + _call: BatchBurnFractionCall; - constructor(call: __Upgradeable1155_initCall) { + constructor(call: BatchBurnFractionCall) { this._call = call; } } @@ -820,16 +851,20 @@ export class BatchMintClaimsFromAllowlistsCall__Inputs { this._call = call; } + get account(): Address { + return this._call.inputValues[0].value.toAddress(); + } + get proofs(): Array> { - return this._call.inputValues[0].value.toBytesMatrix(); + return this._call.inputValues[1].value.toBytesMatrix(); } get claimIDs(): Array { - return this._call.inputValues[1].value.toBigIntArray(); + return this._call.inputValues[2].value.toBigIntArray(); } get units(): Array { - return this._call.inputValues[2].value.toBigIntArray(); + return this._call.inputValues[3].value.toBigIntArray(); } } @@ -917,20 +952,20 @@ export class BurnBatchCall__Outputs { } } -export class BurnValueCall extends ethereum.Call { - get inputs(): BurnValueCall__Inputs { - return new BurnValueCall__Inputs(this); +export class BurnFractionCall extends ethereum.Call { + get inputs(): BurnFractionCall__Inputs { + return new BurnFractionCall__Inputs(this); } - get outputs(): BurnValueCall__Outputs { - return new BurnValueCall__Outputs(this); + get outputs(): BurnFractionCall__Outputs { + return new BurnFractionCall__Outputs(this); } } -export class BurnValueCall__Inputs { - _call: BurnValueCall; +export class BurnFractionCall__Inputs { + _call: BurnFractionCall; - constructor(call: BurnValueCall) { + constructor(call: BurnFractionCall) { this._call = call; } @@ -943,10 +978,10 @@ export class BurnValueCall__Inputs { } } -export class BurnValueCall__Outputs { - _call: BurnValueCall; +export class BurnFractionCall__Outputs { + _call: BurnFractionCall; - constructor(call: BurnValueCall) { + constructor(call: BurnFractionCall) { this._call = call; } } @@ -968,20 +1003,24 @@ export class CreateAllowlistCall__Inputs { this._call = call; } + get account(): Address { + return this._call.inputValues[0].value.toAddress(); + } + get units(): BigInt { - return this._call.inputValues[0].value.toBigInt(); + return this._call.inputValues[1].value.toBigInt(); } get merkleRoot(): Bytes { - return this._call.inputValues[1].value.toBytes(); + return this._call.inputValues[2].value.toBytes(); } get _uri(): string { - return this._call.inputValues[2].value.toString(); + return this._call.inputValues[3].value.toString(); } get restrictions(): i32 { - return this._call.inputValues[3].value.toI32(); + return this._call.inputValues[4].value.toI32(); } } @@ -1019,32 +1058,36 @@ export class InitializeCall__Outputs { } } -export class MergeValueCall extends ethereum.Call { - get inputs(): MergeValueCall__Inputs { - return new MergeValueCall__Inputs(this); +export class MergeFractionsCall extends ethereum.Call { + get inputs(): MergeFractionsCall__Inputs { + return new MergeFractionsCall__Inputs(this); } - get outputs(): MergeValueCall__Outputs { - return new MergeValueCall__Outputs(this); + get outputs(): MergeFractionsCall__Outputs { + return new MergeFractionsCall__Outputs(this); } } -export class MergeValueCall__Inputs { - _call: MergeValueCall; +export class MergeFractionsCall__Inputs { + _call: MergeFractionsCall; - constructor(call: MergeValueCall) { + constructor(call: MergeFractionsCall) { this._call = call; } + get _account(): Address { + return this._call.inputValues[0].value.toAddress(); + } + get _fractionIDs(): Array { - return this._call.inputValues[0].value.toBigIntArray(); + return this._call.inputValues[1].value.toBigIntArray(); } } -export class MergeValueCall__Outputs { - _call: MergeValueCall; +export class MergeFractionsCall__Outputs { + _call: MergeFractionsCall; - constructor(call: MergeValueCall) { + constructor(call: MergeFractionsCall) { this._call = call; } } @@ -1066,16 +1109,20 @@ export class MintClaimCall__Inputs { this._call = call; } + get account(): Address { + return this._call.inputValues[0].value.toAddress(); + } + get units(): BigInt { - return this._call.inputValues[0].value.toBigInt(); + return this._call.inputValues[1].value.toBigInt(); } get _uri(): string { - return this._call.inputValues[1].value.toString(); + return this._call.inputValues[2].value.toString(); } get restrictions(): i32 { - return this._call.inputValues[2].value.toI32(); + return this._call.inputValues[3].value.toI32(); } } @@ -1104,16 +1151,20 @@ export class MintClaimFromAllowlistCall__Inputs { this._call = call; } + get account(): Address { + return this._call.inputValues[0].value.toAddress(); + } + get proof(): Array { - return this._call.inputValues[0].value.toBytesArray(); + return this._call.inputValues[1].value.toBytesArray(); } get claimID(): BigInt { - return this._call.inputValues[1].value.toBigInt(); + return this._call.inputValues[2].value.toBigInt(); } get units(): BigInt { - return this._call.inputValues[2].value.toBigInt(); + return this._call.inputValues[3].value.toBigInt(); } } @@ -1142,20 +1193,24 @@ export class MintClaimWithFractionsCall__Inputs { this._call = call; } + get account(): Address { + return this._call.inputValues[0].value.toAddress(); + } + get units(): BigInt { - return this._call.inputValues[0].value.toBigInt(); + return this._call.inputValues[1].value.toBigInt(); } get fractions(): Array { - return this._call.inputValues[1].value.toBigIntArray(); + return this._call.inputValues[2].value.toBigIntArray(); } get _uri(): string { - return this._call.inputValues[2].value.toString(); + return this._call.inputValues[3].value.toString(); } get restrictions(): i32 { - return this._call.inputValues[3].value.toI32(); + return this._call.inputValues[4].value.toI32(); } } @@ -1345,20 +1400,20 @@ export class SetApprovalForAllCall__Outputs { } } -export class SplitValueCall extends ethereum.Call { - get inputs(): SplitValueCall__Inputs { - return new SplitValueCall__Inputs(this); +export class SplitFractionCall extends ethereum.Call { + get inputs(): SplitFractionCall__Inputs { + return new SplitFractionCall__Inputs(this); } - get outputs(): SplitValueCall__Outputs { - return new SplitValueCall__Outputs(this); + get outputs(): SplitFractionCall__Outputs { + return new SplitFractionCall__Outputs(this); } } -export class SplitValueCall__Inputs { - _call: SplitValueCall; +export class SplitFractionCall__Inputs { + _call: SplitFractionCall; - constructor(call: SplitValueCall) { + constructor(call: SplitFractionCall) { this._call = call; } @@ -1370,15 +1425,15 @@ export class SplitValueCall__Inputs { return this._call.inputValues[1].value.toBigInt(); } - get _values(): Array { + get _newFractions(): Array { return this._call.inputValues[2].value.toBigIntArray(); } } -export class SplitValueCall__Outputs { - _call: SplitValueCall; +export class SplitFractionCall__Outputs { + _call: SplitFractionCall; - constructor(call: SplitValueCall) { + constructor(call: SplitFractionCall) { this._call = call; } } diff --git a/graph/generated/schema.ts b/graph/generated/schema.ts index 7834b274..cf492abf 100644 --- a/graph/generated/schema.ts +++ b/graph/generated/schema.ts @@ -222,6 +222,23 @@ export class Claim extends Entity { this.set("totalUnits", Value.fromBigInt(value)); } } + + get allowlist(): string | null { + let value = this.get("allowlist"); + if (!value || value.kind == ValueKind.NULL) { + return null; + } else { + return value.toString(); + } + } + + set allowlist(value: string | null) { + if (!value) { + this.unset("allowlist"); + } else { + this.set("allowlist", Value.fromString(value)); + } + } } export class ClaimToken extends Entity { @@ -314,4 +331,417 @@ export class ClaimToken extends Entity { set units(value: BigInt) { this.set("units", Value.fromBigInt(value)); } + + get offers(): OfferLoader { + return new OfferLoader("ClaimToken", this.get("id")!.toString(), "offers"); + } +} + +export class Token extends Entity { + constructor(id: string) { + super(); + this.set("id", Value.fromString(id)); + } + + save(): void { + let id = this.get("id"); + assert(id != null, "Cannot save Token entity without an ID"); + if (id) { + assert( + id.kind == ValueKind.STRING, + `Entities of type Token must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, + ); + store.set("Token", id.toString(), this); + } + } + + static loadInBlock(id: string): Token | null { + return changetype(store.get_in_block("Token", id)); + } + + static load(id: string): Token | null { + return changetype(store.get("Token", id)); + } + + get id(): string { + let value = this.get("id"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set id(value: string) { + this.set("id", Value.fromString(value)); + } + + get name(): string { + let value = this.get("name"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set name(value: string) { + this.set("name", Value.fromString(value)); + } + + get symbol(): string | null { + let value = this.get("symbol"); + if (!value || value.kind == ValueKind.NULL) { + return null; + } else { + return value.toString(); + } + } + + set symbol(value: string | null) { + if (!value) { + this.unset("symbol"); + } else { + this.set("symbol", Value.fromString(value)); + } + } + + get decimals(): BigInt | null { + let value = this.get("decimals"); + if (!value || value.kind == ValueKind.NULL) { + return null; + } else { + return value.toBigInt(); + } + } + + set decimals(value: BigInt | null) { + if (!value) { + this.unset("decimals"); + } else { + this.set("decimals", Value.fromBigInt(value)); + } + } +} + +export class AcceptedToken extends Entity { + constructor(id: string) { + super(); + this.set("id", Value.fromString(id)); + } + + save(): void { + let id = this.get("id"); + assert(id != null, "Cannot save AcceptedToken entity without an ID"); + if (id) { + assert( + id.kind == ValueKind.STRING, + `Entities of type AcceptedToken must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, + ); + store.set("AcceptedToken", id.toString(), this); + } + } + + static loadInBlock(id: string): AcceptedToken | null { + return changetype( + store.get_in_block("AcceptedToken", id), + ); + } + + static load(id: string): AcceptedToken | null { + return changetype(store.get("AcceptedToken", id)); + } + + get id(): string { + let value = this.get("id"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set id(value: string) { + this.set("id", Value.fromString(value)); + } + + get token(): string { + let value = this.get("token"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set token(value: string) { + this.set("token", Value.fromString(value)); + } + + get minimumAmountPerUnit(): BigInt { + let value = this.get("minimumAmountPerUnit"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set minimumAmountPerUnit(value: BigInt) { + this.set("minimumAmountPerUnit", Value.fromBigInt(value)); + } + + get accepted(): boolean { + let value = this.get("accepted"); + if (!value || value.kind == ValueKind.NULL) { + return false; + } else { + return value.toBoolean(); + } + } + + set accepted(value: boolean) { + this.set("accepted", Value.fromBoolean(value)); + } +} + +export class Offer extends Entity { + constructor(id: string) { + super(); + this.set("id", Value.fromString(id)); + } + + save(): void { + let id = this.get("id"); + assert(id != null, "Cannot save Offer entity without an ID"); + if (id) { + assert( + id.kind == ValueKind.STRING, + `Entities of type Offer must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, + ); + store.set("Offer", id.toString(), this); + } + } + + static loadInBlock(id: string): Offer | null { + return changetype(store.get_in_block("Offer", id)); + } + + static load(id: string): Offer | null { + return changetype(store.get("Offer", id)); + } + + get id(): string { + let value = this.get("id"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set id(value: string) { + this.set("id", Value.fromString(value)); + } + + get fractionID(): string { + let value = this.get("fractionID"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set fractionID(value: string) { + this.set("fractionID", Value.fromString(value)); + } + + get unitsAvailable(): BigInt { + let value = this.get("unitsAvailable"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set unitsAvailable(value: BigInt) { + this.set("unitsAvailable", Value.fromBigInt(value)); + } + + get minUnitsPerTrade(): BigInt { + let value = this.get("minUnitsPerTrade"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set minUnitsPerTrade(value: BigInt) { + this.set("minUnitsPerTrade", Value.fromBigInt(value)); + } + + get maxUnitsPerTrade(): BigInt { + let value = this.get("maxUnitsPerTrade"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set maxUnitsPerTrade(value: BigInt) { + this.set("maxUnitsPerTrade", Value.fromBigInt(value)); + } + + get status(): string { + let value = this.get("status"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set status(value: string) { + this.set("status", Value.fromString(value)); + } + + get acceptedTokens(): Array { + let value = this.get("acceptedTokens"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toStringArray(); + } + } + + set acceptedTokens(value: Array) { + this.set("acceptedTokens", Value.fromStringArray(value)); + } +} + +export class Trade extends Entity { + constructor(id: string) { + super(); + this.set("id", Value.fromString(id)); + } + + save(): void { + let id = this.get("id"); + assert(id != null, "Cannot save Trade entity without an ID"); + if (id) { + assert( + id.kind == ValueKind.STRING, + `Entities of type Trade must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, + ); + store.set("Trade", id.toString(), this); + } + } + + static loadInBlock(id: string): Trade | null { + return changetype(store.get_in_block("Trade", id)); + } + + static load(id: string): Trade | null { + return changetype(store.get("Trade", id)); + } + + get id(): string { + let value = this.get("id"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set id(value: string) { + this.set("id", Value.fromString(value)); + } + + get buyer(): Bytes { + let value = this.get("buyer"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBytes(); + } + } + + set buyer(value: Bytes) { + this.set("buyer", Value.fromBytes(value)); + } + + get offerID(): string { + let value = this.get("offerID"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set offerID(value: string) { + this.set("offerID", Value.fromString(value)); + } + + get unitsSold(): BigInt { + let value = this.get("unitsSold"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set unitsSold(value: BigInt) { + this.set("unitsSold", Value.fromBigInt(value)); + } + + get token(): string { + let value = this.get("token"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set token(value: string) { + this.set("token", Value.fromString(value)); + } + + get amountPerUnit(): BigInt { + let value = this.get("amountPerUnit"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set amountPerUnit(value: BigInt) { + this.set("amountPerUnit", Value.fromBigInt(value)); + } +} + +export class OfferLoader extends Entity { + _entity: string; + _field: string; + _id: string; + + constructor(entity: string, id: string, field: string) { + super(); + this._entity = entity; + this._id = id; + this._field = field; + } + + load(): Offer[] { + let value = store.loadRelated(this._entity, this._id, this._field); + return changetype(value); + } } diff --git a/graph/schema.graphql b/graph/schema.graphql index 85e54ed2..d6ec32ef 100644 --- a/graph/schema.graphql +++ b/graph/schema.graphql @@ -13,6 +13,7 @@ type Claim @entity { creator: Bytes owner: Bytes totalUnits: BigInt + allowlist: Allowlist } type ClaimToken @entity { @@ -21,4 +22,44 @@ type ClaimToken @entity { claim: Claim! owner: Bytes! units: BigInt! + offers: [Offer!] @derivedFrom(field: "fractionID") +} + +type Token @entity { + id: String! + name: String! + symbol: String + decimals: BigInt +} + +type AcceptedToken @entity { + id: String! + token: Token! + minimumAmountPerUnit: BigInt! + accepted: Boolean! +} + +enum OfferStatus { + Open + Fulfilled + Cancelled +} + +type Offer @entity { + id: String! + fractionID: ClaimToken! + unitsAvailable: BigInt! + minUnitsPerTrade: BigInt! + maxUnitsPerTrade: BigInt! + status: OfferStatus! + acceptedTokens: [AcceptedToken!]! +} + +type Trade @entity { + id: String! + buyer: Bytes! + offerID: Offer! + unitsSold: BigInt! + token: Token! + amountPerUnit: BigInt! } diff --git a/graph/src/hypercert-minter.ts b/graph/src/hypercert-minter.ts index d88fbacf..fbee62a8 100644 --- a/graph/src/hypercert-minter.ts +++ b/graph/src/hypercert-minter.ts @@ -12,6 +12,7 @@ import { ValueTransfer as ValueTransferEvent, } from "../generated/HypercertMinter/HypercertMinter"; import { + ZERO_ADDRESS, getID, getOrCreateAllowlist, getOrCreateClaim, @@ -21,7 +22,7 @@ import { log } from "@graphprotocol/graph-ts"; import { ClaimToken } from "../generated/schema"; export function handleAllowlistCreated(event: AllowlistCreatedEvent): void { - let allowlist = getOrCreateAllowlist( + const allowlist = getOrCreateAllowlist( event.params.tokenID, event.params.root, event.address, @@ -30,10 +31,11 @@ export function handleAllowlistCreated(event: AllowlistCreatedEvent): void { allowlist.save(); } -export function handleApprovalForAll(event: ApprovalForAllEvent): void {} +// eslint-disable-next-line @typescript-eslint/no-empty-function +export function handleApprovalForAll(_event: ApprovalForAllEvent): void {} export function handleClaimStored(event: ClaimStoredEvent): void { - let claim = getOrCreateClaim( + const claim = getOrCreateClaim( event.params.claimID, event.address, event.block.timestamp, @@ -47,21 +49,24 @@ export function handleClaimStored(event: ClaimStoredEvent): void { claim.save(); } -export function handleInitialized(event: InitializedEvent): void {} +// eslint-disable-next-line @typescript-eslint/no-empty-function +export function handleInitialized(_: InitializedEvent): void {} -export function handleLeafClaimed(event: LeafClaimedEvent): void {} +// eslint-disable-next-line @typescript-eslint/no-empty-function +export function handleLeafClaimed(_: LeafClaimedEvent): void {} export function handleOwnershipTransferred( - event: OwnershipTransferredEvent, + _event: OwnershipTransferredEvent, + // eslint-disable-next-line @typescript-eslint/no-empty-function, ): void {} export function handleTransferBatch(event: TransferBatchEvent): void { - let ids = event.params.ids; - let size = ids.length; + const ids = event.params.ids; + const size = ids.length; for (let i = 0; i < size; i++) { - let id = getID(ids[i], event.address); - let token = ClaimToken.load(id); + const id = getID(ids[i], event.address); + const token = ClaimToken.load(id); if (!token) { log.debug("Transfered ClaimToken does not exist: {}", [id]); @@ -75,8 +80,8 @@ export function handleTransferBatch(event: TransferBatchEvent): void { } export function handleTransferSingle(event: TransferSingleEvent): void { - let id = getID(event.params.id, event.address); - let token = ClaimToken.load(id); + const id = getID(event.params.id, event.address); + const token = ClaimToken.load(id); if (!token) { log.debug("Transfered ClaimToken does not exist: {}", [id]); @@ -87,7 +92,8 @@ export function handleTransferSingle(event: TransferSingleEvent): void { token.save(); } -export function handleURI(event: URIEvent): void {} +// eslint-disable-next-line @typescript-eslint/no-empty-function +export function handleURI(_event: URIEvent): void {} export function handleValueTransfer(event: ValueTransferEvent): void { log.debug("Received ValueTransferEvent claimID: {}", [ @@ -104,18 +110,18 @@ export function handleValueTransfer(event: ValueTransferEvent): void { event.params.value.toString(), ]); - let from = getOrCreateClaimToken( + const from = getOrCreateClaimToken( event.params.claimID, event.params.fromTokenID, event.address, ); - let to = getOrCreateClaimToken( + const to = getOrCreateClaimToken( event.params.claimID, event.params.toTokenID, event.address, ); - let value = event.params.value; + const value = event.params.value; log.debug("Got from: {}", [from.id]); log.debug("Got to: {}", [to.id]); @@ -135,6 +141,7 @@ export function handleValueTransfer(event: ValueTransferEvent): void { // Burn value if (!from.tokenID.isZero() && to.tokenID.isZero()) { from.units = from.units.minus(value); + from.owner = ZERO_ADDRESS; } log.debug("Saving from: {}", [from.id]); @@ -146,18 +153,23 @@ export function handleValueTransfer(event: ValueTransferEvent): void { //TODO cleanup to nicer state handling export function handleBatchValueTransfer(event: BatchValueTransfer): void { - let claimIDs = event.params.claimIDs; - let fromIDs = event.params.fromTokenIDs; - let toIDs = event.params.toTokenIDs; - let values = event.params.values; + const claimIDs = event.params.claimIDs; + const fromIDs = event.params.fromTokenIDs; + const toIDs = event.params.toTokenIDs; + const values = event.params.values; + const contractAddress = event.address; - let size = claimIDs.length; + const size = claimIDs.length; for (let i = 0; i < size; i++) { - let from = getOrCreateClaimToken(claimIDs[i], fromIDs[i], event.address); - let to = getOrCreateClaimToken(claimIDs[i], toIDs[i], event.address); + const from = getOrCreateClaimToken( + claimIDs[i], + fromIDs[i], + contractAddress, + ); + const to = getOrCreateClaimToken(claimIDs[i], toIDs[i], contractAddress); - let value = values[i]; + const value = values[i]; log.debug("Got from: {}", [from.id]); log.debug("Got to: {}", [to.id]); @@ -176,6 +188,7 @@ export function handleBatchValueTransfer(event: BatchValueTransfer): void { // Burn value if (!from.tokenID.isZero() && to.tokenID.isZero()) { from.units = from.units.minus(value); + from.owner = ZERO_ADDRESS; } log.debug("Saving from: {}", [from.id]); diff --git a/graph/src/utils.ts b/graph/src/utils.ts index a401c245..2828cc15 100644 --- a/graph/src/utils.ts +++ b/graph/src/utils.ts @@ -1,6 +1,17 @@ -import { Address, BigInt, Bytes, log } from "@graphprotocol/graph-ts"; -import { Allowlist, Claim, ClaimToken } from "../generated/schema"; import { HypercertMinter } from "../generated/HypercertMinter/HypercertMinter"; +import { + AcceptedToken, + Allowlist, + Claim, + ClaimToken, + Offer, + Token, +} from "../generated/schema"; +import { Address, BigInt, Bytes, log } from "@graphprotocol/graph-ts"; + +export const ZERO_ADDRESS = Address.fromString( + "0x0000000000000000000000000000000000000000", +); export function getID(tokenID: BigInt, contract: Address): string { return contract.toHexString().concat("-".concat(tokenID.toString())); @@ -9,9 +20,9 @@ export function getID(tokenID: BigInt, contract: Address): string { export function getOrCreateAllowlist( claimID: BigInt, root: Bytes, - contract: Address + contract: Address, ): Allowlist { - let id = getID(claimID, contract); + const id = getID(claimID, contract); let list = Allowlist.load(id); log.debug("Created allowlistID: {}", [id]); @@ -29,18 +40,24 @@ export function getOrCreateAllowlist( export function getOrCreateClaim( claimID: BigInt, contract: Address, - timestamp: BigInt + timestamp: BigInt, ): Claim { - let id = getID(claimID, contract); + const id = getID(claimID, contract); let claim = Claim.load(id); log.debug("Created claimID: {}", [id]); if (claim == null) { claim = new Claim(id); + const list = Allowlist.load(id); + if (timestamp) { claim.creation = timestamp; } + + if (list) { + claim.allowlist = list.id; + } claim.tokenID = claimID; claim.contract = contract.toHexString(); claim.save(); @@ -52,17 +69,17 @@ export function getOrCreateClaim( export function getOrCreateClaimToken( claimID: BigInt, tokenID: BigInt, - contract: Address + contract: Address, ): ClaimToken { - let minterContract = HypercertMinter.bind(contract); + const minterContract = HypercertMinter.bind(contract); - let id = getID(tokenID, contract); + const id = getID(tokenID, contract); let fraction = ClaimToken.load(id); if (fraction == null) { log.debug("Creating claimToken: {}", [id]); - let owner = minterContract.ownerOf(tokenID); + const owner = minterContract.ownerOf(tokenID); fraction = new ClaimToken(id); fraction.owner = owner; @@ -74,3 +91,108 @@ export function getOrCreateClaimToken( return fraction; } + +export function getOrCreateToken(token: Address): Token { + const _tokenID = token.toHexString(); + let _token = Token.load(_tokenID); + + if (_token == null) { + _token = new Token(_tokenID); + log.debug("Created Token: {}", [_tokenID]); + _token.name = "Native"; + _token.save(); + } + + log.debug("Returning Token: {}", [_tokenID]); + + return _token; +} + +export function getOrCreateAcceptedToken( + offerID: BigInt, + token: Address, + minimumAmountPerUnit: BigInt, +): AcceptedToken { + const _acceptedTokenID = offerID + .toHexString() + .concat("-".concat(token.toHexString())); + let acceptedToken = AcceptedToken.load(_acceptedTokenID); + + if (acceptedToken == null) { + acceptedToken = new AcceptedToken(_acceptedTokenID); + log.debug("Created acceptedToken: {}", [_acceptedTokenID]); + + acceptedToken.token = getOrCreateToken(token).id; + acceptedToken.minimumAmountPerUnit = minimumAmountPerUnit; + acceptedToken.accepted = true; + acceptedToken.save(); + } + + log.debug("Returning acceptedToken: {}", [_acceptedTokenID]); + return acceptedToken; +} + +export function getOrCreateOffer( + hypercertContract: Address, + traderContract: Address, + fractionID: BigInt, + offerID: BigInt, +): Offer { + const _traderContract = HypercertTrader.bind(traderContract); + + const _fractionID = getID(fractionID, hypercertContract); + const _offerID = fractionID + .toHexString() + .concat("-".concat(offerID.toString())); + let offer = Offer.load(_offerID); + + if (offer == null) { + const offerOnChain = _traderContract.getOffer(offerID); + offer = new Offer(_offerID); + log.debug("Created offer: {}", [_offerID]); + + offer.fractionID = _fractionID; + offer.unitsAvailable = offerOnChain.unitsAvailable; + offer.minUnitsPerTrade = offerOnChain.minUnitsPerTrade; + offer.maxUnitsPerTrade = offerOnChain.maxUnitsPerTrade; + offer.acceptedTokens = []; + offer.status = "Open"; + + for (let i = 0; i < offerOnChain.acceptedTokens.length; i++) { + const _acceptedToken = offerOnChain.acceptedTokens[i]; + const parsedToken = getOrCreateAcceptedToken( + offerID, + _acceptedToken.token, + _acceptedToken.minimumAmountPerUnit, + ); + offer.acceptedTokens.push(parsedToken.id.toString()); + log.debug("Added accepted token to offer {} at place {}", [ + _offerID, + _acceptedToken.length.toString(), + ]); + } + + log.debug("Created offerID: {}", [_offerID]); + offer.save(); + } + + log.debug("Returning offer: {}", [_offerID]); + + return offer; +} + +export function getOrCreateOfferByID( + hypercertContract: Address, + fractionID: BigInt, + offerID: BigInt, +): Offer | null { + const _fractionID = getID(fractionID, hypercertContract); + const _offerID = _fractionID.concat("-".concat(offerID.toString())); + const offer = Offer.load(_offerID); + + if (offer == null) { + log.error("Offer with ID {} does not exist", [_offerID]); + } + + return offer; +} diff --git a/graph/subgraph.yaml b/graph/subgraph.yaml index ada9aab5..6b664dde 100644 --- a/graph/subgraph.yaml +++ b/graph/subgraph.yaml @@ -33,11 +33,9 @@ dataSources: handler: handleLeafClaimed - event: OwnershipTransferred(indexed address,indexed address) handler: handleOwnershipTransferred - - event: TransferBatch(indexed address,indexed address,indexed - address,uint256[],uint256[]) + - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) handler: handleTransferBatch - - event: TransferSingle(indexed address,indexed address,indexed - address,uint256,uint256) + - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) handler: handleTransferSingle - event: URI(string,indexed uint256) handler: handleURI diff --git a/graph/tests/.latest.json b/graph/tests/.latest.json index ff6bf392..9bf8a349 100644 --- a/graph/tests/.latest.json +++ b/graph/tests/.latest.json @@ -1,4 +1,4 @@ { "version": "0.6.0", - "timestamp": 1698760525590 + "timestamp": 1699280746839 } diff --git a/graph/tests/hypercert-minter-burn.test.ts b/graph/tests/hypercert-minter-burn.test.ts new file mode 100644 index 00000000..09d35de4 --- /dev/null +++ b/graph/tests/hypercert-minter-burn.test.ts @@ -0,0 +1,189 @@ +import { + handleTransferSingle, + handleValueTransfer, + handleBatchValueTransfer, + handleTransferBatch, +} from "../src/hypercert-minter"; +import { + createBatchValueTransferEvent, + createTransferBatchEvent, + createTransferSingleEvent, + createValueTransferEvent, + getDefaultContractAddress, + ZERO_ADDRESS, + ZERO_TOKEN, +} from "./hypercert-minter-utils"; +import { Address, BigInt, ethereum } from "@graphprotocol/graph-ts"; +import { + assert, + describe, + test, + clearStore, + beforeAll, + createMockedFunction, + afterEach, +} from "matchstick-as/assembly/index"; + +export { handleTransferSingle, handleValueTransfer, handleBatchValueTransfer }; + +describe("Describe entity assertions", () => { + beforeAll(() => {}); + + afterEach(() => { + clearStore(); + }); + + test("TransferSingle and TransferValue for an existing token to zero address burns the fraction", () => { + let from = Address.fromString("0x0000000000000000000000000000000000000001"); + + let claimID = BigInt.fromI64(1); + let fromID = BigInt.fromI64(0); + let toID = BigInt.fromI64(1); + let units = BigInt.fromI64(10000); + + // Create fraction token + let valueTransferEvent = createValueTransferEvent( + claimID, + fromID, + toID, + units, + ); + + createMockedFunction( + getDefaultContractAddress(), + "ownerOf", + "ownerOf(uint256):(address)", + ) + .withArgs([ethereum.Value.fromUnsignedBigInt(toID)]) + .returns([ethereum.Value.fromAddress(from)]); + + createMockedFunction( + getDefaultContractAddress(), + "ownerOf", + "ownerOf(uint256):(address)", + ) + .withArgs([ethereum.Value.fromUnsignedBigInt(fromID)]) + .returns([ethereum.Value.fromAddress(from)]); + + handleValueTransfer(valueTransferEvent); + + let fractionId = getDefaultContractAddress().toHexString().concat("-1"); + + assert.fieldEquals("ClaimToken", fractionId, "owner", from.toHexString()); + assert.fieldEquals("ClaimToken", fractionId, "units", "10000"); + + // Handle 1155 transfer to zero address + let transferSingleEvent = createTransferSingleEvent( + from, + from, + ZERO_ADDRESS, + BigInt.fromI64(1), + BigInt.fromI64(1), + ); + + handleTransferSingle(transferSingleEvent); + + assert.fieldEquals( + "ClaimToken", + fractionId, + "owner", + ZERO_ADDRESS.toHexString(), + ); + assert.fieldEquals("ClaimToken", fractionId, "units", "10000"); + + // Handle hypercert units transfer + let valueTransferEvent2 = createValueTransferEvent( + claimID, + toID, + ZERO_TOKEN, + units, + ); + + handleValueTransfer(valueTransferEvent2); + + assert.fieldEquals( + "ClaimToken", + fractionId, + "owner", + ZERO_ADDRESS.toHexString(), + ); + assert.fieldEquals("ClaimToken", fractionId, "units", "0"); + }); + + test("TransferBatch and BatchTransferValue for an existing token to zero address burns the fraction", () => { + let from = Address.fromString("0x0000000000000000000000000000000000000001"); + + let claimID = BigInt.fromI64(1); + let fromID = BigInt.fromI64(0); + let toID = BigInt.fromI64(1); + let units = BigInt.fromI64(10000); + + // Create fraction token + let valueTransferEvent = createBatchValueTransferEvent( + [claimID], + [fromID], + [toID], + [units], + ); + + createMockedFunction( + getDefaultContractAddress(), + "ownerOf", + "ownerOf(uint256):(address)", + ) + .withArgs([ethereum.Value.fromUnsignedBigInt(toID)]) + .returns([ethereum.Value.fromAddress(from)]); + + createMockedFunction( + getDefaultContractAddress(), + "ownerOf", + "ownerOf(uint256):(address)", + ) + .withArgs([ethereum.Value.fromUnsignedBigInt(fromID)]) + .returns([ethereum.Value.fromAddress(from)]); + + handleBatchValueTransfer(valueTransferEvent); + + let fractionId = getDefaultContractAddress().toHexString().concat("-1"); + + assert.fieldEquals("ClaimToken", fractionId, "owner", from.toHexString()); + assert.fieldEquals("ClaimToken", fractionId, "units", "10000"); + + // Handle 1155 transfer to zero address + let transferBatchEvent = createTransferBatchEvent( + from, + from, + ZERO_ADDRESS, + [BigInt.fromI64(1)], + [BigInt.fromI64(1)], + ); + + handleTransferBatch(transferBatchEvent); + + assert.fieldEquals( + "ClaimToken", + fractionId, + "owner", + ZERO_ADDRESS.toHexString(), + ); + assert.fieldEquals("ClaimToken", fractionId, "units", "10000"); + + // Handle hypercert units transfer + let valueTransferEvent2 = createBatchValueTransferEvent( + [claimID], + [toID], + [ZERO_TOKEN], + [units], + ); + + handleBatchValueTransfer(valueTransferEvent2); + + assert.fieldEquals( + "ClaimToken", + fractionId, + "owner", + ZERO_ADDRESS.toHexString(), + ); + assert.fieldEquals("ClaimToken", fractionId, "units", "0"); + }); +}); diff --git a/graph/tests/hypercert-minter-claim.test.ts b/graph/tests/hypercert-minter-claim.test.ts index 38c403c0..b7a6e45a 100644 --- a/graph/tests/hypercert-minter-claim.test.ts +++ b/graph/tests/hypercert-minter-claim.test.ts @@ -20,7 +20,7 @@ describe("Describe entity assertions", () => { let claimStoredEvent = createClaimStoredEvent( BigInt.fromI64(1), "ipfs://exampleshash", - BigInt.fromI64(10000) + BigInt.fromI64(10000), ); handleClaimStored(claimStoredEvent); }); @@ -43,13 +43,13 @@ describe("Describe entity assertions", () => { "Claim", claimId, "creator", - "0xa16081f360e3847006db660bae1c6d1b2e17ec2a" + "0xa16081f360e3847006db660bae1c6d1b2e17ec2a", ); assert.fieldEquals( "Claim", claimId, "owner", - "0xa16081f360e3847006db660bae1c6d1b2e17ec2a" + "0xa16081f360e3847006db660bae1c6d1b2e17ec2a", ); assert.fieldEquals("Claim", claimId, "totalUnits", "10000"); }); diff --git a/graph/tests/hypercert-minter-utils.ts b/graph/tests/hypercert-minter-utils.ts index 53a64853..e1694735 100644 --- a/graph/tests/hypercert-minter-utils.ts +++ b/graph/tests/hypercert-minter-utils.ts @@ -1,5 +1,3 @@ -import { newMockEvent } from "matchstick-as"; -import { ethereum, Address, BigInt, Bytes } from "@graphprotocol/graph-ts"; import { AllowlistCreated, BatchValueTransfer, @@ -10,6 +8,13 @@ import { URI, ValueTransfer, } from "../generated/HypercertMinter/HypercertMinter"; +import { ethereum, Address, BigInt, Bytes } from "@graphprotocol/graph-ts"; +import { newMockEvent } from "matchstick-as"; + +export const ZERO_ADDRESS = Address.fromString( + "0x0000000000000000000000000000000000000000", +); +export const ZERO_TOKEN = BigInt.fromI32(0); export function getDefaultContractAddress(): Address { return Address.fromString("0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7"); @@ -28,7 +33,7 @@ export function buildZeroes(size: BigInt): BigInt[] { export function buildIDs( size: BigInt, - start: BigInt = BigInt.zero() + start: BigInt = BigInt.zero(), ): BigInt[] { let array: BigInt[] = []; for (let i = 0; i < size.toI32(); i++) { @@ -54,7 +59,7 @@ export function buildValues(size: BigInt): BigInt[] { export function createAllowlistCreatedEvent( tokenID: BigInt, - root: Bytes + root: Bytes, ): AllowlistCreated { let mockEvent = newMockEvent(); let parameters: ethereum.EventParam[] = new Array(); @@ -64,11 +69,11 @@ export function createAllowlistCreatedEvent( parameters.push( new ethereum.EventParam( "tokenID", - ethereum.Value.fromUnsignedBigInt(tokenID) - ) + ethereum.Value.fromUnsignedBigInt(tokenID), + ), ); parameters.push( - new ethereum.EventParam("root", ethereum.Value.fromFixedBytes(root)) + new ethereum.EventParam("root", ethereum.Value.fromFixedBytes(root)), ); let allowlistCreatedEvent = new AllowlistCreated( @@ -79,7 +84,7 @@ export function createAllowlistCreatedEvent( mockEvent.block, mockEvent.transaction, parameters, - mockEvent.receipt + mockEvent.receipt, ); return allowlistCreatedEvent; @@ -88,7 +93,7 @@ export function createAllowlistCreatedEvent( export function createClaimStoredEvent( claimID: BigInt, uri: string, - totalUnits: BigInt + totalUnits: BigInt, ): ClaimStored { let mockEvent = newMockEvent(); let parameters: ethereum.EventParam[] = new Array(); @@ -96,18 +101,18 @@ export function createClaimStoredEvent( parameters.push( new ethereum.EventParam( "claimID", - ethereum.Value.fromUnsignedBigInt(claimID) - ) + ethereum.Value.fromUnsignedBigInt(claimID), + ), ); parameters.push( - new ethereum.EventParam("uri", ethereum.Value.fromString(uri)) + new ethereum.EventParam("uri", ethereum.Value.fromString(uri)), ); parameters.push( new ethereum.EventParam( "totalUnits", - ethereum.Value.fromUnsignedBigInt(totalUnits) - ) + ethereum.Value.fromUnsignedBigInt(totalUnits), + ), ); let claimStoredEvent = new ClaimStored( @@ -118,7 +123,7 @@ export function createClaimStoredEvent( mockEvent.block, mockEvent.transaction, parameters, - mockEvent.receipt + mockEvent.receipt, ); return claimStoredEvent; @@ -126,7 +131,7 @@ export function createClaimStoredEvent( export function createLeafClaimedEvent( tokenID: BigInt, - leaf: Bytes + leaf: Bytes, ): LeafClaimed { let leafClaimedEvent = changetype(newMockEvent()); @@ -135,11 +140,11 @@ export function createLeafClaimedEvent( leafClaimedEvent.parameters.push( new ethereum.EventParam( "tokenID", - ethereum.Value.fromUnsignedBigInt(tokenID) - ) + ethereum.Value.fromUnsignedBigInt(tokenID), + ), ); leafClaimedEvent.parameters.push( - new ethereum.EventParam("leaf", ethereum.Value.fromFixedBytes(leaf)) + new ethereum.EventParam("leaf", ethereum.Value.fromFixedBytes(leaf)), ); return leafClaimedEvent; @@ -150,29 +155,39 @@ export function createTransferBatchEvent( from: Address, to: Address, ids: Array, - values: Array + values: Array, ): TransferBatch { - let transferBatchEvent = changetype(newMockEvent()); - - transferBatchEvent.parameters = new Array(); + let mockEvent = newMockEvent(); + let parameters: ethereum.EventParam[] = new Array(); - transferBatchEvent.parameters.push( - new ethereum.EventParam("operator", ethereum.Value.fromAddress(operator)) + parameters.push( + new ethereum.EventParam("operator", ethereum.Value.fromAddress(operator)), ); - transferBatchEvent.parameters.push( - new ethereum.EventParam("from", ethereum.Value.fromAddress(from)) + parameters.push( + new ethereum.EventParam("from", ethereum.Value.fromAddress(from)), ); - transferBatchEvent.parameters.push( - new ethereum.EventParam("to", ethereum.Value.fromAddress(to)) + parameters.push( + new ethereum.EventParam("to", ethereum.Value.fromAddress(to)), ); - transferBatchEvent.parameters.push( - new ethereum.EventParam("ids", ethereum.Value.fromUnsignedBigIntArray(ids)) + parameters.push( + new ethereum.EventParam("ids", ethereum.Value.fromUnsignedBigIntArray(ids)), ); - transferBatchEvent.parameters.push( + parameters.push( new ethereum.EventParam( "values", - ethereum.Value.fromUnsignedBigIntArray(values) - ) + ethereum.Value.fromUnsignedBigIntArray(values), + ), + ); + + let transferBatchEvent = new TransferBatch( + getDefaultContractAddress(), + mockEvent.logIndex, + mockEvent.transactionLogIndex, + mockEvent.logType, + mockEvent.block, + mockEvent.transaction, + parameters, + mockEvent.receipt, ); return transferBatchEvent; @@ -183,25 +198,25 @@ export function createTransferSingleEvent( from: Address, to: Address, id: BigInt, - value: BigInt + value: BigInt, ): TransferSingle { let mockEvent = newMockEvent(); let parameters: ethereum.EventParam[] = new Array(); parameters.push( - new ethereum.EventParam("operator", ethereum.Value.fromAddress(operator)) + new ethereum.EventParam("operator", ethereum.Value.fromAddress(operator)), ); parameters.push( - new ethereum.EventParam("from", ethereum.Value.fromAddress(from)) + new ethereum.EventParam("from", ethereum.Value.fromAddress(from)), ); parameters.push( - new ethereum.EventParam("to", ethereum.Value.fromAddress(to)) + new ethereum.EventParam("to", ethereum.Value.fromAddress(to)), ); parameters.push( - new ethereum.EventParam("id", ethereum.Value.fromUnsignedBigInt(id)) + new ethereum.EventParam("id", ethereum.Value.fromUnsignedBigInt(id)), ); parameters.push( - new ethereum.EventParam("value", ethereum.Value.fromUnsignedBigInt(value)) + new ethereum.EventParam("value", ethereum.Value.fromUnsignedBigInt(value)), ); let transferSingleEvent = new TransferSingle( @@ -212,7 +227,7 @@ export function createTransferSingleEvent( mockEvent.block, mockEvent.transaction, parameters, - mockEvent.receipt + mockEvent.receipt, ); return transferSingleEvent; @@ -224,20 +239,20 @@ export function createURIEvent(value: string, id: BigInt): URI { uriEvent.parameters = new Array(); uriEvent.parameters.push( - new ethereum.EventParam("value", ethereum.Value.fromString(value)) + new ethereum.EventParam("value", ethereum.Value.fromString(value)), ); uriEvent.parameters.push( - new ethereum.EventParam("id", ethereum.Value.fromUnsignedBigInt(id)) + new ethereum.EventParam("id", ethereum.Value.fromUnsignedBigInt(id)), ); return uriEvent; } export function createHypercertMinterUpgradedEvent( - implementation: Address + implementation: Address, ): HypercertMinterUpgraded { let hypercertMinterUpgradedEvent = changetype( - newMockEvent() + newMockEvent(), ); hypercertMinterUpgradedEvent.parameters = new Array(); @@ -245,8 +260,8 @@ export function createHypercertMinterUpgradedEvent( hypercertMinterUpgradedEvent.parameters.push( new ethereum.EventParam( "implementation", - ethereum.Value.fromAddress(implementation) - ) + ethereum.Value.fromAddress(implementation), + ), ); return hypercertMinterUpgradedEvent; @@ -256,7 +271,7 @@ export function createValueTransferEvent( claimID: BigInt, fromTokenID: BigInt, toTokenID: BigInt, - value: BigInt + value: BigInt, ): ValueTransfer { let mockEvent = newMockEvent(); let parameters: ethereum.EventParam[] = new Array(); @@ -264,24 +279,24 @@ export function createValueTransferEvent( parameters.push( new ethereum.EventParam( "claimID", - ethereum.Value.fromUnsignedBigInt(claimID) - ) + ethereum.Value.fromUnsignedBigInt(claimID), + ), ); parameters.push( new ethereum.EventParam( "fromTokenID", - ethereum.Value.fromUnsignedBigInt(fromTokenID) - ) + ethereum.Value.fromUnsignedBigInt(fromTokenID), + ), ); parameters.push( new ethereum.EventParam( "toTokenID", - ethereum.Value.fromUnsignedBigInt(toTokenID) - ) + ethereum.Value.fromUnsignedBigInt(toTokenID), + ), ); parameters.push( - new ethereum.EventParam("value", ethereum.Value.fromUnsignedBigInt(value)) + new ethereum.EventParam("value", ethereum.Value.fromUnsignedBigInt(value)), ); let valueTransferEvent = new ValueTransfer( @@ -292,7 +307,7 @@ export function createValueTransferEvent( mockEvent.block, mockEvent.transaction, parameters, - mockEvent.receipt + mockEvent.receipt, ); return valueTransferEvent; @@ -302,7 +317,7 @@ export function createBatchValueTransferEvent( claimIDs: BigInt[], fromTokenIDs: BigInt[], toTokenIDs: BigInt[], - values: BigInt[] + values: BigInt[], ): BatchValueTransfer { let mockEvent = newMockEvent(); let parameters: ethereum.EventParam[] = new Array(); @@ -310,26 +325,26 @@ export function createBatchValueTransferEvent( parameters.push( new ethereum.EventParam( "claimIDs", - ethereum.Value.fromUnsignedBigIntArray(claimIDs) - ) + ethereum.Value.fromUnsignedBigIntArray(claimIDs), + ), ); parameters.push( new ethereum.EventParam( "fromTokenIDs", - ethereum.Value.fromUnsignedBigIntArray(fromTokenIDs) - ) + ethereum.Value.fromUnsignedBigIntArray(fromTokenIDs), + ), ); parameters.push( new ethereum.EventParam( "toTokenIDs", - ethereum.Value.fromUnsignedBigIntArray(toTokenIDs) - ) + ethereum.Value.fromUnsignedBigIntArray(toTokenIDs), + ), ); parameters.push( new ethereum.EventParam( "values", - ethereum.Value.fromUnsignedBigIntArray(values) - ) + ethereum.Value.fromUnsignedBigIntArray(values), + ), ); let batchValueTransferEvent = new BatchValueTransfer( @@ -340,7 +355,7 @@ export function createBatchValueTransferEvent( mockEvent.block, mockEvent.transaction, parameters, - mockEvent.receipt + mockEvent.receipt, ); return batchValueTransferEvent; diff --git a/package.json b/package.json index 38706568..19c7c402 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,13 @@ "type": "git", "url": "git+https://github.com/hypercerts-org/hypercerts.git" }, - "resolutions": { + "overrides": { "graphql": "^16.6.0", - "ethers": "^5.7.2" + "@hypercerts/contracts": { + "ethers": "6.8.0" + }, + "@hypercerts/frontend": { + "ethers": "5.7.2" + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 531025b1..203d74fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,10 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - graphql: ^16.6.0 - ethers: ^5.7.2 - importers: .: @@ -32,7 +28,14 @@ importers: version: 1.10.16 contracts: + dependencies: + hardhat: + specifier: ^2.18.3 + version: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) devDependencies: + '@chainlink/contracts': + specifier: ^0.8.0 + version: 0.8.0(ethers@6.8.0) '@commitlint/cli': specifier: ^17.1.2 version: 17.8.1 @@ -41,40 +44,22 @@ importers: version: 17.8.1 '@dlsl/hardhat-markup': specifier: ^1.0.0-rc.7 - version: 1.0.0-rc.14(hardhat@2.13.1)(prettier@2.8.8) - '@ethersproject/abi': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/bytes': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/providers': - specifier: ^5.7.2 - version: 5.7.2 - '@nomicfoundation/hardhat-chai-matchers': - specifier: ^1.0.5 - version: 1.0.6(@nomiclabs/hardhat-ethers@2.2.3)(chai@4.3.10)(ethers@5.7.2)(hardhat@2.13.1) - '@nomicfoundation/hardhat-network-helpers': - specifier: ^1.0.7 - version: 1.0.9(hardhat@2.13.1) + version: 1.0.0-rc.14(hardhat@2.18.3)(prettier@2.8.8) + '@looksrare/contracts-libs': + specifier: ^3.4.0 + version: 3.4.0 '@nomicfoundation/hardhat-toolbox': - specifier: ^2.0.0 - version: 2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(@typechain/ethers-v5@11.1.2)(@typechain/hardhat@9.1.0)(@types/chai@4.3.9)(@types/mocha@9.1.0)(@types/node@18.18.6)(chai@4.3.10)(ethers@5.7.2)(hardhat-gas-reporter@1.0.9)(hardhat@2.13.1)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.2)(typescript@4.9.5) - '@nomiclabs/hardhat-ethers': - specifier: ^2.2.1 - version: 2.2.3(ethers@5.7.2)(hardhat@2.13.1) - '@nomiclabs/hardhat-etherscan': - specifier: ^3.1.3 - version: 3.1.7(hardhat@2.13.1) - '@openzeppelin/hardhat-defender': - specifier: ^1.8.2 - version: 1.9.0(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.13.1) + specifier: ^3.0.0 + version: 3.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.2)(@nomicfoundation/hardhat-ethers@3.0.4)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomicfoundation/hardhat-verify@1.1.1)(@typechain/ethers-v6@0.4.3)(@typechain/hardhat@8.0.3)(@types/chai@4.3.9)(@types/mocha@9.1.0)(@types/node@18.18.7)(chai@4.3.10)(ethers@6.8.0)(hardhat-gas-reporter@1.0.9)(hardhat@2.18.3)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.2)(typescript@4.9.5) + '@openzeppelin/contracts': + specifier: <5.0.0 + version: 4.9.3 '@openzeppelin/hardhat-upgrades': - specifier: ^1.28 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.13.1) + specifier: 2.3.3 + version: 2.3.3(@nomicfoundation/hardhat-ethers@3.0.4)(@nomicfoundation/hardhat-verify@1.1.1)(ethers@6.8.0)(hardhat@2.18.3) '@primitivefi/hardhat-dodoc': specifier: ^0.2.3 - version: 0.2.3(hardhat@2.13.1)(squirrelly@8.0.8) + version: 0.2.3(hardhat@2.18.3)(squirrelly@8.0.8) '@rollup/plugin-commonjs': specifier: ^24.0.1 version: 24.1.0(rollup@4.1.4) @@ -87,42 +72,24 @@ importers: '@trivago/prettier-plugin-sort-imports': specifier: ^3.3.0 version: 3.4.0(prettier@2.8.8) - '@typechain/ethers-v5': - specifier: ^11.1.1 - version: 11.1.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) - '@typechain/hardhat': - specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2) - '@types/chai': - specifier: ^4.3.4 - version: 4.3.9 - '@types/mocha': - specifier: 9.1.0 - version: 9.1.0 '@types/node': specifier: ^18.11.11 - version: 18.18.6 + version: 18.18.7 '@typescript-eslint/eslint-plugin': specifier: ^5.38.0 version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.52.0)(typescript@4.9.5) '@typescript-eslint/parser': specifier: ^5.38.0 version: 5.62.0(eslint@8.52.0)(typescript@4.9.5) - chai: - specifier: ^4.3.7 - version: 4.3.10 commitizen: specifier: ^4.2.5 - version: 4.3.0 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 + version: 4.3.0(typescript@4.9.5) cross-env: specifier: ^7.0.3 version: 7.0.3 cz-conventional-changelog: specifier: ^3.3.0 - version: 3.3.0 + version: 3.3.0(typescript@4.9.5) dotenv: specifier: ^16.0.2 version: 16.3.1 @@ -133,20 +100,14 @@ importers: specifier: ^8.5.0 version: 8.10.0(eslint@8.52.0) ethers: - specifier: ^5.7.2 - version: 5.7.2 - hardhat: - specifier: 2.13.1 - version: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + specifier: ^6.8.0 + version: 6.8.0 hardhat-abi-exporter: specifier: ^2.10.1 - version: 2.10.1(hardhat@2.13.1) - hardhat-gas-reporter: - specifier: ^1.0.9 - version: 1.0.9(hardhat@2.13.1) + version: 2.10.1(hardhat@2.18.3) hardhat-preprocessor: specifier: ^0.1.5 - version: 0.1.5(hardhat@2.13.1) + version: 0.1.5(hardhat@2.18.3) husky: specifier: ^8.0.1 version: 8.0.3 @@ -186,12 +147,12 @@ importers: solhint-plugin-prettier: specifier: ^0.0.5 version: 0.0.5(prettier-plugin-solidity@1.1.3)(prettier@2.8.8) - solidity-coverage: - specifier: ^0.8.2 - version: 0.8.5(hardhat@2.13.1) + solmate: + specifier: ^6.2.0 + version: 6.2.0 ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + version: 10.9.1(@types/node@18.18.7)(typescript@4.9.5) typechain: specifier: ^8.3.1 version: 8.3.2(typescript@4.9.5) @@ -203,7 +164,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: ^4.20230115.0 - version: 4.20231016.0 + version: 4.20231025.0 typescript: specifier: ^4.9.5 version: 4.9.5 @@ -220,23 +181,23 @@ importers: specifier: 0.8.11 version: 0.8.11 '@openzeppelin/defender-autotask-client': - specifier: ^1.48.0 - version: 1.49.0 + specifier: 1.50.0 + version: 1.50.0 '@openzeppelin/defender-autotask-utils': - specifier: ^1.48.0 - version: 1.49.0 + specifier: 1.50.0 + version: 1.50.0 '@openzeppelin/defender-base-client': - specifier: ^1.48.0 + specifier: 1.49.0 version: 1.49.0(debug@4.3.4) '@openzeppelin/defender-sentinel-client': - specifier: ^1.48.0 + specifier: 1.49.0 version: 1.49.0 '@openzeppelin/merkle-tree': specifier: ^1.0.2 version: 1.0.5 '@supabase/supabase-js': specifier: ^2.4.1 - version: 2.38.2 + version: 2.38.3 axios: specifier: ^1.2.6 version: 1.5.1(debug@4.3.4) @@ -244,7 +205,7 @@ importers: specifier: ^16.0.3 version: 16.3.1 ethers: - specifier: ^5.7.2 + specifier: 5.7.2 version: 5.7.2 node-fetch: specifier: ^3.3.0 @@ -252,7 +213,7 @@ importers: devDependencies: '@types/node': specifier: ^18.11.18 - version: 18.18.6 + version: 18.18.7 rimraf: specifier: ^5.0.5 version: 5.0.5 @@ -264,7 +225,7 @@ importers: version: 9.5.0(typescript@4.9.5)(webpack@5.89.0) ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + version: 10.9.1(@types/node@18.18.7)(typescript@4.9.5) tsx: specifier: ^3.14.0 version: 3.14.0 @@ -282,13 +243,13 @@ importers: dependencies: '@docusaurus/core': specifier: ^2.4.1 - version: 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + version: 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/preset-classic': specifier: ^2.4.1 - version: 2.4.3(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5) + version: 2.4.3(@algolia/client-search@4.20.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5) '@docusaurus/theme-mermaid': specifier: ^2.4.1 - version: 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + version: 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@mdx-js/react': specifier: ^1.6.22 version: 1.6.22(react@18.2.0) @@ -314,6 +275,9 @@ importers: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) devDependencies: + '@docusaurus/eslint-plugin': + specifier: ^2.4.1 + version: 2.4.3(eslint@8.52.0)(typescript@4.9.5) '@docusaurus/module-type-aliases': specifier: ^2.4.1 version: 2.4.3(react-dom@18.2.0)(react@18.2.0) @@ -331,34 +295,34 @@ importers: version: 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@celo/rainbowkit-celo': specifier: ^1.1.0 - version: 1.1.0(@rainbow-me/rainbowkit@1.0.8)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(wagmi@1.3.9)(zod@3.22.4) + version: 1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(wagmi@1.4.5)(zod@3.22.4) '@emotion/react': specifier: ^11.10.5 - version: 11.11.1(@types/react@18.2.31)(react@18.2.0) + version: 11.11.1(@types/react@18.2.33)(react@18.2.0) '@emotion/styled': specifier: ^11.10.5 - version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) + version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) '@graphprotocol/client-cli': specifier: ^2.2.16 - version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': - specifier: 0.8.11 - version: 0.8.11 + specifier: 0.9.0 + version: 0.9.0(typescript@5.1.6) '@hypercerts-org/observabletreemap': specifier: 'workspace: *' version: link:../vendor/observabletreemap '@hypercerts-org/sdk': - specifier: 0.8.16 - version: 0.8.16(@envelop/core@3.0.6)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3) + specifier: 1.0.0-alpha.6 + version: 1.0.0-alpha.6(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4) '@mui/icons-material': specifier: ^5.11.9 - version: 5.14.14(@mui/material@5.14.14)(@types/react@18.2.31)(react@18.2.0) + version: 5.14.15(@mui/material@5.14.15)(@types/react@18.2.33)(react@18.2.0) '@mui/material': specifier: ^5.11.2 - version: 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@mui/x-date-pickers': specifier: ^5.0.12 - version: 5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(@mui/system@5.14.14)(@types/react@18.2.31)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + version: 5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.15)(@mui/system@5.14.15)(@types/react@18.2.33)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@next/eslint-plugin-next': specifier: ^13.4.12 version: 13.5.6 @@ -375,17 +339,17 @@ importers: specifier: ^1.0.284 version: 1.0.333(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) '@rainbow-me/rainbowkit': - specifier: 1.0.8 - version: 1.0.8(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0)(viem@1.5.3)(wagmi@1.3.9) + specifier: 1.2.0 + version: 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.4)(wagmi@1.4.5) '@sentry/nextjs': specifier: ^7.73.0 - version: 7.74.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0) + version: 7.75.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0) '@sentry/utils': specifier: ^7.73.0 - version: 7.74.1 + version: 7.75.1 '@supabase/supabase-js': specifier: ^2.1.2 - version: 2.38.2 + version: 2.38.3 '@tanstack/react-query': specifier: ^4.36.1 version: 4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0) @@ -411,17 +375,17 @@ importers: specifier: ^16.0.3 version: 16.3.1 ethers: - specifier: ^5.7.2 + specifier: 5.7.2 version: 5.7.2 formik: specifier: ^2.2.9 version: 2.4.5(react@18.2.0) formik-mui: specifier: ^5.0.0-alpha.0 - version: 5.0.0-alpha.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3) + version: 5.0.0-alpha.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.15)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3) formik-mui-x-date-pickers: specifier: ^0.0.1 - version: 0.0.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(@mui/system@5.14.14)(@mui/x-date-pickers@5.0.20)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3) + version: 0.0.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.15)(@mui/system@5.14.15)(@mui/x-date-pickers@5.0.20)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3) graphql: specifier: ^16.6.0 version: 16.8.1 @@ -442,7 +406,7 @@ importers: version: 5.4.1 primereact: specifier: ^9.6.0 - version: 9.6.3(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 9.6.3(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) qs: specifier: ^6.11.0 version: 6.11.2 @@ -460,7 +424,7 @@ importers: version: 14.2.3(react@18.2.0) react-markdown: specifier: ^8.0.7 - version: 8.0.7(@types/react@18.2.31)(react@18.2.0) + version: 8.0.7(@types/react@18.2.33)(react@18.2.0) react-toastify: specifier: ^9.1.1 version: 9.1.3(react-dom@18.2.0)(react@18.2.0) @@ -471,11 +435,11 @@ importers: specifier: ^14.0.1 version: 14.2.1 viem: - specifier: 1.5.3 - version: 1.5.3(typescript@5.1.6)(zod@3.22.4) + specifier: 1.18.4 + version: 1.18.4(typescript@5.1.6)(zod@3.22.4) wagmi: - specifier: 1.3.9 - version: 1.3.9(@types/react@18.2.31)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) + specifier: 1.4.5 + version: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) yup: specifier: ^0.32.11 version: 0.32.11 @@ -494,7 +458,7 @@ importers: version: 14.5.1(@testing-library/dom@9.3.3) '@types/node': specifier: ^18.0.0 - version: 18.18.6 + version: 18.18.7 '@types/papaparse': specifier: ^5.3.7 version: 5.3.10 @@ -503,7 +467,7 @@ importers: version: 6.9.9 '@types/react': specifier: ^18.0.14 - version: 18.2.31 + version: 18.2.33 '@types/react-dom': specifier: ^18.0.5 version: 18.2.14 @@ -530,7 +494,7 @@ importers: version: 1.1.7 jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) + version: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) jest-environment-jsdom: specifier: ^29.5.0 version: 29.7.0 @@ -542,7 +506,7 @@ importers: devDependencies: '@graphprotocol/graph-cli': specifier: 0.60.0 - version: 0.60.0(@types/node@18.18.6)(node-fetch@3.3.2)(typescript@4.9.5) + version: 0.60.0(@types/node@18.18.7)(node-fetch@3.3.2)(typescript@4.9.5) '@graphprotocol/graph-ts': specifier: 0.31.0 version: 0.31.0 @@ -556,44 +520,44 @@ importers: sdk: dependencies: '@ethereum-attestation-service/eas-sdk': - specifier: ^0.28.3 - version: 0.28.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ts-node@10.9.1)(typescript@4.9.5) + specifier: 1.2.2-beta.0 + version: 1.2.2-beta.0(ts-node@10.9.1)(typescript@5.1.6) '@ethersproject/abstract-signer': specifier: ^5.7.0 version: 5.7.0 '@graphprotocol/client-add-source-name': specifier: ^1.0.16 - version: 1.0.20(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + version: 1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) '@graphprotocol/client-polling-live': specifier: ^2.0.0 version: 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) '@graphql-mesh/cache-localforage': specifier: ^0.95.7 - version: 0.95.7(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/cross-helpers': specifier: ^0.4.1 version: 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/graphql': specifier: ^0.95.7 - version: 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': specifier: ^0.96.13 - version: 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.12)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': specifier: ^0.95.7 - version: 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/runtime': specifier: ^0.96.12 - version: 0.96.12(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/store': specifier: ^0.95.7 - version: 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': specifier: ^0.95.7 - version: 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': specifier: ^0.95.7 - version: 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': specifier: ^3.2.0 version: 3.2.0(graphql@16.8.1) @@ -605,7 +569,7 @@ importers: version: 1.0.5 '@whatwg-node/fetch': specifier: ^0.9.13 - version: 0.9.13 + version: 0.9.14 ajv: specifier: ^8.11.2 version: 8.12.0 @@ -616,7 +580,7 @@ importers: specifier: ^16.0.3 version: 16.3.1 ethers: - specifier: ^5.7.2 + specifier: 5.7.2 version: 5.7.2 graphql: specifier: ^16.6.0 @@ -624,9 +588,6 @@ importers: ipfs-core: specifier: ^0.17.0 version: 0.17.0(uint8arraylist@2.4.3) - jest: - specifier: ^29.3.1 - version: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) loglevel: specifier: ^1.8.1 version: 1.8.1 @@ -636,6 +597,9 @@ importers: nft.storage: specifier: ^7.1.1 version: 7.1.1(node-fetch@3.3.2) + viem: + specifier: ^1.18.4 + version: 1.18.4(typescript@5.1.6)(zod@3.22.4) web3.storage: specifier: ^4.5.5 version: 4.5.5(node-fetch@3.3.2) @@ -654,7 +618,7 @@ importers: version: 8.2.0 '@graphprotocol/client-cli': specifier: ^3.0.0 - version: 3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + version: 3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@jest/globals': specifier: ^29.7.0 version: 29.7.0 @@ -676,12 +640,21 @@ importers: '@types/jest': specifier: ^29.2.5 version: 29.5.6 + '@types/mocha': + specifier: 9.1.0 + version: 9.1.0 '@types/node': specifier: ^18.11.17 - version: 18.18.6 + version: 18.18.7 '@types/sinon': specifier: ^10.0.15 version: 10.0.20 + '@viem/anvil': + specifier: ^0.0.6 + version: 0.0.6 + abitype: + specifier: ^0.10.2 + version: 0.10.2(typescript@5.1.6)(zod@3.22.4) babel-jest: specifier: ^29.7.0 version: 29.7.0(@babel/core@7.23.2) @@ -699,19 +672,22 @@ importers: version: 0.17.19 ethereum-waffle: specifier: ^4.0.10 - version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@4.9.5) + version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.1.6) it-all: specifier: ^2.0.0 version: 2.0.1 + jest: + specifier: ^29.3.1 + version: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) jest-extended: specifier: ^4.0.0 version: 4.0.2(jest@29.7.0) + jest-fetch-mock: + specifier: ^3.0.3 + version: 3.0.3 json-schema-to-typescript: specifier: ^12.0.0 version: 12.0.0 - msw: - specifier: ^1.2.1 - version: 1.3.2(typescript@4.9.5) nyc: specifier: ^15.1.0 version: 15.1.0 @@ -723,7 +699,7 @@ importers: version: 2.0.0(rollup@3.29.4) rollup-plugin-dts: specifier: ^5.2.0 - version: 5.3.1(rollup@3.29.4)(typescript@4.9.5) + version: 5.3.1(rollup@3.29.4)(typescript@5.1.6) rollup-plugin-esbuild: specifier: ^5.0.0 version: 5.0.0(esbuild@0.17.19)(rollup@3.29.4) @@ -738,7 +714,7 @@ importers: version: 15.2.0 ts-jest: specifier: ^29.0.3 - version: 29.1.1(@babel/core@7.23.2)(babel-jest@29.7.0)(esbuild@0.17.19)(jest@29.7.0)(typescript@4.9.5) + version: 29.1.1(@babel/core@7.23.2)(babel-jest@29.7.0)(esbuild@0.17.19)(jest@29.7.0)(typescript@5.1.6) ts-jest-resolver: specifier: ^2.0.0 version: 2.0.1 @@ -747,7 +723,7 @@ importers: version: 10.0.0(mocha@10.2.0) ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + version: 10.9.1(@types/node@18.18.7)(typescript@5.1.6) tslib: specifier: ^2.5.0 version: 2.6.2 @@ -756,16 +732,16 @@ importers: version: 3.14.0 typedoc: specifier: ^0.23.25 - version: 0.23.28(typescript@4.9.5) + version: 0.23.28(typescript@5.1.6) typedoc-plugin-markdown: specifier: ^3.14.0 - version: 3.16.0(typedoc@0.23.28) + version: 3.17.0(typedoc@0.23.28) typedoc-plugin-missing-exports: specifier: ^2.0.0 version: 2.1.0(typedoc@0.23.28) typescript: - specifier: ^4.9.0 - version: 4.9.5 + specifier: 5.1.6 + version: 5.1.6 vendor/observabletreemap: dependencies: @@ -778,7 +754,6 @@ packages: /@aashutoshrathi/word-wrap@1.2.6: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - dev: true /@achingbrain/ip-address@8.1.0: resolution: {integrity: sha512-Zus4vMKVRDm+R1o0QJNhD0PD/8qRGO3Zx8YPsFG5lANt5utVtGg3iHVGBSAF80TfQmhi8rP+Kg/OigdxY0BXHw==} @@ -792,7 +767,7 @@ packages: resolution: {integrity: sha512-rU4G75TEOTIPlkeDnPEVwx/VmMMFta42kY2SMmVobRkrtNLnxtU08Yhriu6tSBc9oO0wXdfNNeuLnNnEnL7w/A==} dependencies: '@achingbrain/ssdp': 4.0.6 - '@libp2p/logger': 3.0.3 + '@libp2p/logger': 3.0.4 default-gateway: 7.2.2 err-code: 3.0.1 it-first: 3.0.3 @@ -816,8 +791,16 @@ packages: resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} dev: true + /@adraffy/ens-normalize@1.10.0: + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + /@adraffy/ens-normalize@1.9.0: resolution: {integrity: sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ==} + dev: true + + /@adraffy/ens-normalize@1.9.4: + resolution: {integrity: sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw==} + dev: false /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} @@ -967,7 +950,7 @@ packages: /@apollo/client@3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-FnHg3vhQP8tQzgBs6oTJCFFIbovelDGYujj6MK7CJneiHf62TJstCIO0Ot4A1h7XrgFEtgl8a/OgajQWqrTuYw==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 graphql-ws: ^5.5.5 react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -983,8 +966,8 @@ packages: optional: true dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@wry/context': 0.7.3 - '@wry/equality': 0.5.6 + '@wry/context': 0.7.4 + '@wry/equality': 0.5.7 '@wry/trie': 0.4.3 graphql: 16.8.1 graphql-tag: 2.12.6(graphql@16.8.1) @@ -1016,7 +999,7 @@ packages: resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} hasBin: true peerDependencies: - graphql: ^16.6.0 + graphql: '*' dependencies: '@babel/core': 7.23.2 '@babel/generator': 7.23.0 @@ -1500,7 +1483,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.10.4 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.12.9) dev: false @@ -1565,6 +1548,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: true /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} @@ -2605,12 +2589,13 @@ packages: /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true /@braintree/sanitize-url@6.0.4: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} dev: false - /@celo/rainbowkit-celo@1.1.0(@rainbow-me/rainbowkit@1.0.8)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(wagmi@1.3.9)(zod@3.22.4): + /@celo/rainbowkit-celo@1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(wagmi@1.4.5)(zod@3.22.4): resolution: {integrity: sha512-/G4HFhJNwUk6uU1yqGfQ/LIoNg9UAA4BUcEvFdd0M3DImnKlhodNLUdCmzqv96sjc/I7tMJqBeTnmbhwXdlsjQ==} peerDependencies: '@rainbow-me/rainbowkit': '>=1.0.2 && <=2.0.0' @@ -2618,10 +2603,10 @@ packages: wagmi: '>=1.0.0 && <=2.0.0' dependencies: '@metamask/providers': 11.1.2 - '@rainbow-me/rainbowkit': 1.0.8(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0)(viem@1.5.3)(wagmi@1.3.9) - '@wagmi/connectors': 2.6.6(@wagmi/chains@1.6.0)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) - viem: 1.5.3(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.3.9(@types/react@18.2.31)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) + '@rainbow-me/rainbowkit': 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.4)(wagmi@1.4.5) + '@wagmi/connectors': 2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) + viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@wagmi/chains' @@ -2635,6 +2620,19 @@ packages: - zod dev: false + /@chainlink/contracts@0.8.0(ethers@6.8.0): + resolution: {integrity: sha512-nUv1Uxw5Mn92wgLs2bgPYmo8hpdQ3s9jB/lcbdU0LmNOVu0hbfmouVnqwRLa28Ll50q6GczUA+eO0ikNIKLZsA==} + dependencies: + '@eth-optimism/contracts': 0.5.40(ethers@6.8.0) + '@openzeppelin/contracts': 4.3.3 + '@openzeppelin/contracts-upgradeable-4.7.3': /@openzeppelin/contracts-upgradeable@4.7.3 + '@openzeppelin/contracts-v0.7': /@openzeppelin/contracts@3.4.2 + transitivePeerDependencies: + - bufferutil + - ethers + - utf-8-validate + dev: true + /@chainsafe/as-sha256@0.3.1: resolution: {integrity: sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==} @@ -2735,8 +2733,8 @@ packages: mime: 3.0.0 dev: true - /@cloudflare/workers-types@4.20231016.0: - resolution: {integrity: sha512-eGB0cRVyoJpeyGJx2re5sbd9R316a61sY73xwnqm4cwGpb+OxCK2gc651RxGiN7H4w6LY1RpysUgeGLmj5B3+g==} + /@cloudflare/workers-types@4.20231025.0: + resolution: {integrity: sha512-TkcZkntUTOcvJ4vgmwpNfLTclpMbmbClZCe62B25/VTukmyv91joRa4eKzSjzCZUXTbFHNmVdOpmGaaJU2U3+A==} dev: true /@coinbase/wallet-sdk@3.7.2: @@ -2808,12 +2806,12 @@ packages: ajv: 8.12.0 dev: true - /@commitlint/config-validator@18.0.0: - resolution: {integrity: sha512-PlXy5QZzQeMgQM7jb0odIhxsI6GWcbGgfy+Hkz5ap31KES/oJgtEvgD8pjg0Z9Ri296bT6zK3ts6brS0MAcMgg==} + /@commitlint/config-validator@18.1.0: + resolution: {integrity: sha512-kbHkIuItXn93o2NmTdwi5Mk1ujyuSIysRE/XHtrcps/27GuUKEIqBJp6TdJ4Sq+ze59RlzYSHMKuDKZbfg9+uQ==} engines: {node: '>=v18'} requiresBuild: true dependencies: - '@commitlint/types': 18.0.0 + '@commitlint/types': 18.1.0 ajv: 8.12.0 dev: true optional: true @@ -2835,8 +2833,8 @@ packages: engines: {node: '>=v14'} dev: true - /@commitlint/execute-rule@18.0.0: - resolution: {integrity: sha512-eNUSaHajb+g3sgZeIrfc6cXNnKIkYN2SXtDVXuiE+hOa055T0bLdZK29gSd945JCztxPVwdOkPLDeLg3NfDubg==} + /@commitlint/execute-rule@18.1.0: + resolution: {integrity: sha512-w3Vt4K+O7+nSr9/gFSEfZ1exKUOPSlJaRpnk7Y+XowEhvwT7AIk1HNANH+gETf0zGZ020+hfiMW/Ome+SNCUsg==} engines: {node: '>=v18'} requiresBuild: true dev: true @@ -2891,28 +2889,25 @@ packages: - '@swc/wasm' dev: true - /@commitlint/load@18.0.0: - resolution: {integrity: sha512-ocvMSkzNZCJ4yV673xjd4Y7sFVG/mg7S6yvL5ioM0OIG2XTbcCdzpmq+BeJcIwsRYU9g/b688yh7RDzGlbai6w==} + /@commitlint/load@18.2.0(typescript@4.9.5): + resolution: {integrity: sha512-xjX3d3CRlOALwImhOsmLYZh14/+gW/KxsY7+bPKrzmGuFailf9K7ckhB071oYZVJdACnpY4hDYiosFyOC+MpAA==} engines: {node: '>=v18'} requiresBuild: true dependencies: - '@commitlint/config-validator': 18.0.0 - '@commitlint/execute-rule': 18.0.0 - '@commitlint/resolve-extends': 18.0.0 - '@commitlint/types': 18.0.0 - '@types/node': 18.18.6 + '@commitlint/config-validator': 18.1.0 + '@commitlint/execute-rule': 18.1.0 + '@commitlint/resolve-extends': 18.1.0 + '@commitlint/types': 18.1.0 + '@types/node': 18.18.7 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.2.2) - cosmiconfig-typescript-loader: 4.4.0(@types/node@18.18.6)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@5.2.2) + cosmiconfig: 8.3.6(typescript@4.9.5) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.18.7)(cosmiconfig@8.3.6)(typescript@4.9.5) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@types/node@18.18.6)(typescript@5.2.2) - typescript: 5.2.2 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + - typescript dev: true optional: true @@ -2953,13 +2948,13 @@ packages: resolve-global: 1.0.0 dev: true - /@commitlint/resolve-extends@18.0.0: - resolution: {integrity: sha512-MD9+6GSiWvqgdJtfos+1gqz+zmy2vV7TbUVz2ETZzpfECgmUZSZSYzyivivBAQK6feS71KxmMLL8+YFF9+FFRQ==} + /@commitlint/resolve-extends@18.1.0: + resolution: {integrity: sha512-3mZpzOEJkELt7BbaZp6+bofJyxViyObebagFn0A7IHaLARhPkWTivXdjvZHS12nAORftv88Yhbh8eCPKfSvB7g==} engines: {node: '>=v18'} requiresBuild: true dependencies: - '@commitlint/config-validator': 18.0.0 - '@commitlint/types': 18.0.0 + '@commitlint/config-validator': 18.1.0 + '@commitlint/types': 18.1.0 import-fresh: 3.3.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 @@ -2997,8 +2992,8 @@ packages: chalk: 4.1.2 dev: true - /@commitlint/types@18.0.0: - resolution: {integrity: sha512-FDzAdSm7kIir0NW0bZLENdrEgf/9Ihs1AAqE9DK9R+dRFby4ookkxPMaz7elZmG+e5rBl7hGrWJzJINqG9cDDg==} + /@commitlint/types@18.1.0: + resolution: {integrity: sha512-65vGxZmbs+2OVwEItxhp3Ul7X2m2LyLfifYI/NdPwRqblmuES2w2aIRhIjb7cwUIBHHSTT8WXj4ixVHQibmvLQ==} engines: {node: '>=v18'} requiresBuild: true dependencies: @@ -3012,8 +3007,8 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@cypress/code-coverage@3.12.5(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0): - resolution: {integrity: sha512-0hczq2kgzkh/fBLm74rHcDRX//W3bhJJw/aPWu57/pPaRp5c+LcatWuv8ZtIWNXit2kBClueOrVj0I20Arh80A==} + /@cypress/code-coverage@3.12.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0): + resolution: {integrity: sha512-QeOB54dkxee8LKdbK9NqMinlMtzy60K2DexSvx4XZdrU52gut9Ukc7sUvRe44gK1yJFYno977Kx9miNIeYWVtA==} peerDependencies: '@babel/core': ^7.0.1 '@babel/preset-env': ^7.0.0 @@ -3166,13 +3161,13 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - /@dlsl/hardhat-markup@1.0.0-rc.14(hardhat@2.13.1)(prettier@2.8.8): + /@dlsl/hardhat-markup@1.0.0-rc.14(hardhat@2.18.3)(prettier@2.8.8): resolution: {integrity: sha512-fhkjuHjM6sDzjY6xiNHiENTdNRQGDEZ8RTkFnmvGVSYP2G7VKjVvay0ZWxILIXb+WvK+JdkcVtpvR00eo8wuWg==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: hardhat: ^2.10.0 dependencies: - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) json2md: 2.0.0 prettier-plugin-solidity: 1.1.3(prettier@2.8.8) solidity-ast: 0.4.52 @@ -3212,7 +3207,7 @@ packages: - '@algolia/client-search' dev: false - /@docusaurus/core@2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/core@2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA==} engines: {node: '>=16.14'} hasBin: true @@ -3271,7 +3266,7 @@ packages: postcss-loader: 7.3.3(postcss@8.4.31)(typescript@4.9.5)(webpack@5.89.0) prompts: 2.4.2 react: 18.2.0 - react-dev-utils: 12.0.1(typescript@4.9.5)(webpack@5.89.0) + react-dev-utils: 12.0.1(eslint@8.52.0)(typescript@4.9.5)(webpack@5.89.0) react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) @@ -3279,7 +3274,7 @@ packages: react-router: 5.3.4(react@18.2.0) react-router-config: 5.1.1(react-router@5.3.4)(react@18.2.0) react-router-dom: 5.3.4(react@18.2.0) - rtl-detect: 1.0.4 + rtl-detect: 1.1.2 semver: 7.5.4 serve-handler: 6.1.5 shelljs: 0.8.5 @@ -3322,6 +3317,20 @@ packages: tslib: 2.6.2 dev: false + /@docusaurus/eslint-plugin@2.4.3(eslint@8.52.0)(typescript@4.9.5): + resolution: {integrity: sha512-CckN1JCU7biEP4JMDCNGJf6VcmaCqqIruYrvSU91pKYrFuYi0gblfkljagkHc9+mw1ZX2jtoTm4XfoZ/Q9WDCA==} + engines: {node: '>=16.14'} + peerDependencies: + eslint: '>=6' + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.52.0)(typescript@4.9.5) + eslint: 8.52.0 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@docusaurus/logger@2.4.3: resolution: {integrity: sha512-Zxws7r3yLufk9xM1zq9ged0YHs65mlRmtsobnFkdZTxWXdTYlWWLWdKyNKAsVC+D7zg+pv2fGbyabdOnyZOM3w==} engines: {node: '>=16.14'} @@ -3374,7 +3383,7 @@ packages: '@docusaurus/react-loadable': 5.5.2(react@18.2.0) '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@types/history': 4.7.11 - '@types/react': 18.2.31 + '@types/react': 18.2.33 '@types/react-router-config': 5.0.9 '@types/react-router-dom': 5.3.3 react: 18.2.0 @@ -3387,14 +3396,14 @@ packages: - uglify-js - webpack-cli - /@docusaurus/plugin-content-blog@2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/plugin-content-blog@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-PVhypqaA0t98zVDpOeTqWUTvRqCEjJubtfFUQ7zJNYdbYTbS/E/ytq6zbLVsN/dImvemtO/5JQgjLxsh8XLo8Q==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/logger': 2.4.3 '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) @@ -3430,14 +3439,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-content-docs@2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/plugin-content-docs@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-N7Po2LSH6UejQhzTCsvuX5NOzlC+HiXOVvofnEPj0WhMu1etpLEXE6a4aTxrtg95lQ5kf0xUIdjX9sh3d3G76A==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/logger': 2.4.3 '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) '@docusaurus/module-type-aliases': 2.4.3(react-dom@18.2.0)(react@18.2.0) @@ -3473,14 +3482,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-content-pages@2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/plugin-content-pages@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-txtDVz7y3zGk67q0HjG0gRttVPodkHqE0bpJ+7dOaTH40CQFLSh7+aBeGnPOTl+oCPG+hxkim4SndqPqXjQ8Bg==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) @@ -3508,14 +3517,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-debug@2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/plugin-debug@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-LkUbuq3zCmINlFb+gAd4ZvYr+bPAzMC0hwND4F7V9bZ852dCX8YoWyovVUBKq4er1XsOwSQaHmNGtObtn8Av8Q==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) fs-extra: 10.1.0 @@ -3543,14 +3552,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-analytics@2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/plugin-google-analytics@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-KzBV3k8lDkWOhg/oYGxlK5o9bOwX7KpPc/FTWoB+SfKhlHfhq7qcQdMi1elAaVEIop8tgK6gD1E58Q+XC6otSQ==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) react: 18.2.0 @@ -3574,14 +3583,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-gtag@2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/plugin-google-gtag@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) react: 18.2.0 @@ -3605,14 +3614,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-tag-manager@2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/plugin-google-tag-manager@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-1jTzp71yDGuQiX9Bi0pVp3alArV0LSnHXempvQTxwCGAEzUWWaBg4d8pocAlTpbP9aULQQqhgzrs8hgTRPOM0A==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) react: 18.2.0 @@ -3636,14 +3645,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-sitemap@2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/plugin-sitemap@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-LRQYrK1oH1rNfr4YvWBmRzTL0LN9UAPxBbghgeFRBm5yloF6P+zv1tm2pe2hQTX/QP5bSKdnajCvfnScgKXMZQ==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/logger': 2.4.3 '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) @@ -3672,25 +3681,25 @@ packages: - webpack-cli dev: false - /@docusaurus/preset-classic@2.4.3(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5): + /@docusaurus/preset-classic@2.4.3(@algolia/client-search@4.20.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5): resolution: {integrity: sha512-tRyMliepY11Ym6hB1rAFSNGwQDpmszvWYJvlK1E+md4SW8i6ylNHtpZjaYFff9Mdk3i/Pg8ItQq9P0daOJAvQw==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-blog': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-docs': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-pages': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-debug': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-google-analytics': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-google-gtag': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-google-tag-manager': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-sitemap': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-classic': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-search-algolia': 2.4.3(@algolia/client-search@4.20.0)(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-content-blog': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-content-docs': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-content-pages': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-debug': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-google-analytics': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-google-gtag': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-google-tag-manager': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-sitemap': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/theme-classic': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/theme-search-algolia': 2.4.3(@algolia/client-search@4.20.0)(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5) '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3721,24 +3730,24 @@ packages: peerDependencies: react: '*' dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 prop-types: 15.8.1 react: 18.2.0 - /@docusaurus/theme-classic@2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/theme-classic@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-QKRAJPSGPfDY2yCiPMIVyr+MqwZCIV2lxNzqbyUW0YkrlmdzzP3WuQJPMGLCjWgQp/5c9kpWMvMxjhpZx1R32Q==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) '@docusaurus/module-type-aliases': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/plugin-content-blog': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-docs': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-pages': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-content-blog': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-content-docs': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-content-pages': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/theme-translations': 2.4.3 '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) @@ -3777,7 +3786,7 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-common@2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/theme-common@2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-7KaDJBXKBVGXw5WOVt84FtN8czGWhM0lbyWEZXGp8AFfL6sZQfRTluFp4QriR97qwzSyOfQb+nzcDZZU4tezUw==} engines: {node: '>=16.14'} peerDependencies: @@ -3786,13 +3795,13 @@ packages: dependencies: '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) '@docusaurus/module-type-aliases': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/plugin-content-blog': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-docs': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-pages': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-content-blog': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-content-docs': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-content-pages': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) '@docusaurus/utils-common': 2.4.3(@docusaurus/types@2.4.3) '@types/history': 4.7.11 - '@types/react': 18.2.31 + '@types/react': 18.2.33 '@types/react-router-config': 5.0.9 clsx: 1.2.1 parse-numeric-range: 1.3.0 @@ -3821,16 +3830,16 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-mermaid@2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): + /@docusaurus/theme-mermaid@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-S1tZ3xpowtFiTrpTKmvVbRHUYGOlEG5CnPzWlO4huJT1sAwLR+pD6f9DYUlPv2+9NezF3EfUrUyW9xLH0UP58w==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/module-type-aliases': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) '@mdx-js/react': 1.6.22(react@18.2.0) @@ -3856,7 +3865,7 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-search-algolia@2.4.3(@algolia/client-search@4.20.0)(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5): + /@docusaurus/theme-search-algolia@2.4.3(@algolia/client-search@4.20.0)(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5): resolution: {integrity: sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q==} engines: {node: '>=16.14'} peerDependencies: @@ -3864,15 +3873,15 @@ packages: react-dom: ^16.8.4 || ^17.0.0 dependencies: '@docsearch/react': 3.5.2(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0) - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/logger': 2.4.3 - '@docusaurus/plugin-content-docs': 2.4.3(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/plugin-content-docs': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@docusaurus/theme-translations': 2.4.3 '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) algoliasearch: 4.20.0 - algoliasearch-helper: 3.14.2(algoliasearch@4.20.0) + algoliasearch-helper: 3.15.0(algoliasearch@4.20.0) clsx: 1.2.1 eta: 2.2.0 fs-extra: 10.1.0 @@ -3918,7 +3927,7 @@ packages: react-dom: ^16.8.4 || ^17.0.0 dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.31 + '@types/react': 18.2.33 commander: 5.1.0 joi: 17.11.0 react: 18.2.0 @@ -4049,7 +4058,7 @@ packages: resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} dev: false - /@emotion/react@11.11.1(@types/react@18.2.31)(react@18.2.0): + /@emotion/react@11.11.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} peerDependencies: '@types/react': '*' @@ -4065,7 +4074,7 @@ packages: '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 - '@types/react': 18.2.31 + '@types/react': 18.2.33 hoist-non-react-statics: 3.3.2 react: 18.2.0 dev: false @@ -4084,7 +4093,7 @@ packages: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} dev: false - /@emotion/styled@11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0): + /@emotion/styled@11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 @@ -4097,11 +4106,11 @@ packages: '@babel/runtime': 7.23.2 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.1 - '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.33)(react@18.2.0) '@emotion/serialize': 1.1.2 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 - '@types/react': 18.2.31 + '@types/react': 18.2.33 react: 18.2.0 dev: false @@ -4159,7 +4168,7 @@ packages: resolution: {integrity: sha512-aXAf1bg5Z71YfEKLCZ8OMUZAOYPGHV/a+7avd5TIMFNDxl5wJTmIonep3T+kdMpwRInDphfNPGFD0GcGdGxpHg==} peerDependencies: '@envelop/core': ^3.0.6 - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@envelop/core': 3.0.6 '@graphql-tools/utils': 8.13.1(graphql@16.8.1) @@ -4171,7 +4180,7 @@ packages: engines: {node: '>=18.0.0'} peerDependencies: '@envelop/core': ^5.0.0 - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@envelop/core': 5.0.0 '@graphql-tools/utils': 10.0.7(graphql@16.8.1) @@ -4184,7 +4193,7 @@ packages: engines: {node: '>=18.0.0'} peerDependencies: '@envelop/core': ^5.0.0 - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@envelop/core': 5.0.0 graphql: 16.8.1 @@ -4209,7 +4218,7 @@ packages: resolution: {integrity: sha512-MkzcScQHJJQ/9YCAPdWShEi3xZv4F4neTs+NszzSrZOdlU8z/THuRt7gZ0sO0y2be+sx+SKjHQP8Gq3VXXcTTg==} peerDependencies: '@envelop/core': ^3.0.6 - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@envelop/core': 3.0.6 graphql: 16.8.1 @@ -5045,12 +5054,10 @@ packages: dependencies: eslint: 8.52.0 eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.9.1: - resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true /@eslint/eslintrc@1.4.1: resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} @@ -5084,58 +5091,54 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true /@eslint/js@8.52.0: resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@ethereum-attestation-service/eas-contracts@0.27.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(ts-node@10.9.1)(typescript@4.9.5): - resolution: {integrity: sha512-ly1N/jLbXJjACDL7dnMSkzViBxxuVc+aMZ3EB1kpFxeMWrXkb7nN6w9gxGTH+m3gJztaKvyMsyr/13pA0OYq6Q==} + /@eth-optimism/contracts@0.5.40(ethers@6.8.0): + resolution: {integrity: sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w==} + peerDependencies: + ethers: ^5 dependencies: - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) - '@typechain/hardhat': 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2) - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) - typechain: 8.3.2(typescript@4.9.5) + '@eth-optimism/core-utils': 0.12.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + ethers: 6.8.0 transitivePeerDependencies: - - '@ethersproject/abi' - - '@ethersproject/providers' - bufferutil - - ethers - - supports-color - - ts-node - - typescript - utf-8-validate - dev: false + dev: true - /@ethereum-attestation-service/eas-contracts@0.27.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.1.6): - resolution: {integrity: sha512-ly1N/jLbXJjACDL7dnMSkzViBxxuVc+aMZ3EB1kpFxeMWrXkb7nN6w9gxGTH+m3gJztaKvyMsyr/13pA0OYq6Q==} + /@eth-optimism/core-utils@0.12.0: + resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} dependencies: - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.1.6) - '@typechain/hardhat': 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2) - hardhat: 2.13.1(typescript@5.1.6) - typechain: 8.3.2(typescript@5.1.6) + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bufio: 1.2.1 + chai: 4.3.10 transitivePeerDependencies: - - '@ethersproject/abi' - - '@ethersproject/providers' - bufferutil - - ethers - - supports-color - - ts-node - - typescript - utf-8-validate - dev: false + dev: true - /@ethereum-attestation-service/eas-sdk@0.28.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ts-node@10.9.1)(typescript@4.9.5): - resolution: {integrity: sha512-Z197jE5oi8Eh9SmjldTnkPKKhOId2NA9OyEFvbXDMafoHtfC6V117r0GHj9IlsOGtaK8Y0fiZYX1EKMKcJb6UQ==} + /@ethereum-attestation-service/eas-contracts@1.2.0-beta.1(ts-node@10.9.1)(typescript@5.1.6): + resolution: {integrity: sha512-NOicVFjm3UOY6HHmMPIpFTZJ7ieuETl7GRJyceW/CPPXxMMBBu9tf9eDVbVrDn6D7fYX3NMDIR39RoK5BhpWYA==} dependencies: - '@ethereum-attestation-service/eas-contracts': 0.27.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(ts-node@10.9.1)(typescript@4.9.5) - ethers: 5.7.2 - multiformats: 9.9.0 + hardhat: 2.18.2(ts-node@10.9.1)(typescript@5.1.6) transitivePeerDependencies: - - '@ethersproject/abi' - - '@ethersproject/providers' - bufferutil - supports-color - ts-node @@ -5143,15 +5146,17 @@ packages: - utf-8-validate dev: false - /@ethereum-attestation-service/eas-sdk@0.28.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(typescript@5.1.6): - resolution: {integrity: sha512-Z197jE5oi8Eh9SmjldTnkPKKhOId2NA9OyEFvbXDMafoHtfC6V117r0GHj9IlsOGtaK8Y0fiZYX1EKMKcJb6UQ==} + /@ethereum-attestation-service/eas-sdk@1.2.2-beta.0(ts-node@10.9.1)(typescript@5.1.6): + resolution: {integrity: sha512-penkXiCKvHY8jN9UVV3B9IX001YnwWCNjbrBNE5e8Wy1rAzcPv7tqTBuvqXzjqmHfcASv7UFOIbfPEc5hd9mpA==} dependencies: - '@ethereum-attestation-service/eas-contracts': 0.27.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.1.6) - ethers: 5.7.2 + '@ethereum-attestation-service/eas-contracts': 1.2.0-beta.1(ts-node@10.9.1)(typescript@5.1.6) + ethers: 6.8.0 + js-base64: 3.7.5 + lodash: 4.17.21 multiformats: 9.9.0 + pako: 2.1.0 + semver: 7.5.4 transitivePeerDependencies: - - '@ethersproject/abi' - - '@ethersproject/providers' - bufferutil - supports-color - ts-node @@ -5163,7 +5168,7 @@ packages: resolution: {integrity: sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==} engines: {node: '>=10.0'} peerDependencies: - ethers: ^5.7.2 + ethers: '*' dependencies: '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) debug: 4.3.4(supports-color@8.1.1) @@ -5175,24 +5180,24 @@ packages: - supports-color dev: true - /@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@4.9.5): + /@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@5.1.6): resolution: {integrity: sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==} engines: {node: '>=10.0'} peerDependencies: - ethers: ^5.7.2 + ethers: '*' solc: '*' typechain: ^8.0.0 dependencies: '@resolver-engine/imports': 0.3.3 '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.1.6) '@types/mkdirp': 0.5.2 - '@types/node-fetch': 2.6.7 + '@types/node-fetch': 2.6.8 ethers: 5.7.2 mkdirp: 0.5.6 node-fetch: 2.7.0 solc: 0.8.15 - typechain: 8.3.2(typescript@4.9.5) + typechain: 8.3.2(typescript@5.1.6) transitivePeerDependencies: - '@ethersproject/abi' - '@ethersproject/providers' @@ -5207,7 +5212,7 @@ packages: peerDependencies: '@ensdomains/ens': ^0.4.4 '@ensdomains/resolver': ^0.2.4 - ethers: ^5.7.2 + ethers: '*' dependencies: '@ensdomains/ens': 0.4.5 '@ensdomains/resolver': 0.2.4 @@ -5218,7 +5223,7 @@ packages: resolution: {integrity: sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==} engines: {node: '>=10.0'} peerDependencies: - ethers: ^5.7.2 + ethers: '*' dependencies: ethers: 5.7.2 dev: true @@ -5227,7 +5232,7 @@ packages: resolution: {integrity: sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==} engines: {node: '>=10.0'} peerDependencies: - ethers: ^5.7.2 + ethers: '*' dependencies: '@ethereum-waffle/ens': 4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) '@ganache/ethereum-options': 0.1.4 @@ -5268,7 +5273,7 @@ packages: resolution: {integrity: sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==} dependencies: crc-32: 1.2.2 - ethereumjs-util: 7.1.3 + ethereumjs-util: 7.1.5 dev: true /@ethereumjs/common@2.6.5: @@ -5298,7 +5303,7 @@ packages: resolution: {integrity: sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==} dependencies: '@ethereumjs/common': 2.6.0 - ethereumjs-util: 7.1.3 + ethereumjs-util: 7.1.5 dev: true /@ethereumjs/tx@3.5.2: @@ -5327,7 +5332,7 @@ packages: async-eventemitter: 0.2.4 core-js-pure: 3.33.1 debug: 2.6.9 - ethereumjs-util: 7.1.3 + ethereumjs-util: 7.1.5 functional-red-black-tree: 1.0.1 mcl-wasm: 0.7.9 merkle-patricia-tree: 4.2.4 @@ -5759,7 +5764,7 @@ packages: '@graphql-tools/delegate': ^9.0.32 '@graphql-tools/utils': ^9.2.1 '@graphql-tools/wrap': ^9.4.2 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) @@ -5770,16 +5775,16 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 '@graphql-tools/delegate': ^9.0.32 '@graphql-tools/utils': ^9.2.1 '@graphql-tools/wrap': ^9.4.2 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) @@ -5788,7 +5793,7 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-add-source-name@2.0.0(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + /@graphprotocol/client-add-source-name@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-3vX8mVPIEJFwAoRhjTPd9IjQrBuE+Gv+JB7IEf8/9222qiU9EzHVFUekKxVtcxQXD40CfageS41CxOreWQ1enA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5796,9 +5801,9 @@ packages: '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) @@ -5814,7 +5819,7 @@ packages: '@graphql-tools/delegate': ^9.0.32 '@graphql-tools/utils': ^9.2.1 '@graphql-tools/wrap': ^9.4.2 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) @@ -5825,7 +5830,7 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-auto-pagination@2.0.0(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + /@graphprotocol/client-auto-pagination@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-TouHgs6rQLpZSgnMoPdes8/ZTtMMEoxWeUUCkfho/xfSi49prb5DcsI83pykln0OEAUnNPnaX0MhP+xA5LtFSg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5833,9 +5838,9 @@ packages: '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) @@ -5849,7 +5854,7 @@ packages: peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 '@graphql-tools/delegate': ^9.0.32 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -5860,16 +5865,16 @@ packages: - '@graphql-mesh/utils' dev: false - /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): + /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-mxqXKHK2lO+k4r02Q44n3qhd5dufo+SSDduD8zGUDBsYcRQAtQD9PwmXRHyUoB9nw4A+NC+CtVh+76fueXCG1w==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -5881,7 +5886,7 @@ packages: resolution: {integrity: sha512-Eim0fZ0AgukHt5770j/UYDxfrqJroOhDe8FfNKKN7mDVRoMBoCsNknH47i03fh4A/kE8R+J6Job/zEJZPTtKnQ==} peerDependencies: '@graphql-tools/delegate': ^9.0.32 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -5894,7 +5899,7 @@ packages: engines: {node: '>=16.0.0'} peerDependencies: '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 10.0.7(graphql@16.8.1) @@ -5902,19 +5907,19 @@ packages: tslib: 2.6.2 dev: true - /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-PIi8rFibYZVup+0jb08399RmbGF1ZrqUe6RXzLtKZBT57OWIMWwsFvdJyUAdr8Y8f0rrMn6A+Oy4nP1lf3hc1g==} hasBin: true peerDependencies: - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-polling-live': 1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) - '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -5940,20 +5945,20 @@ packages: - utf-8-validate dev: false - /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-hTISbOzKavlDifBNsR6JqQMfdYwY7++hflPy+c3WHRrZ4OMoxFmW7ZuvaP6LvgKdJV77O8w9dnT/uxeHs6a90g==} engines: {node: '>=16.0.0'} hasBin: true peerDependencies: - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) + '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 2.0.0(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) - '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -5984,7 +5989,7 @@ packages: peerDependencies: '@envelop/core': ^2.4.2 || ^3.0.0 '@graphql-tools/merge': ^8.3.14 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: '@envelop/core': 3.0.6 '@graphql-tools/merge': 8.4.2(graphql@16.8.1) @@ -5999,7 +6004,7 @@ packages: peerDependencies: '@envelop/core': ^2.4.2 || ^3.0.0 || ^4.0.0 '@graphql-tools/merge': ^8.3.14 || ^9.0.0 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: '@envelop/core': 3.0.6 '@graphql-tools/merge': 8.4.2(graphql@16.8.1) @@ -6014,7 +6019,7 @@ packages: peerDependencies: '@envelop/core': ^2.4.2 || ^3.0.0 || ^4.0.0 '@graphql-tools/merge': ^8.3.14 || ^9.0.0 - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: '@envelop/core': 3.0.6 '@graphql-tools/merge': 9.0.0(graphql@16.8.1) @@ -6022,15 +6027,15 @@ packages: graphql: 16.8.1 tslib: 2.6.2 - /@graphprotocol/graph-cli@0.60.0(@types/node@18.18.6)(node-fetch@3.3.2)(typescript@4.9.5): + /@graphprotocol/graph-cli@0.60.0(@types/node@18.18.7)(node-fetch@3.3.2)(typescript@4.9.5): resolution: {integrity: sha512-8tGaQJ0EzAPtkDXCAijFGoVdJXM+pKFlGxjiU31TdG5bS4cIUoSB6yWojVsFFod0yETAwf+giel/0/8sudYsDw==} engines: {node: '>=14'} hasBin: true dependencies: '@float-capital/float-subgraph-uncrashable': 0.0.0-internal-testing.5 - '@oclif/core': 2.8.6(@types/node@18.18.6)(typescript@4.9.5) - '@oclif/plugin-autocomplete': 2.3.10(@types/node@18.18.6)(typescript@4.9.5) - '@oclif/plugin-not-found': 2.4.3(@types/node@18.18.6)(typescript@4.9.5) + '@oclif/core': 2.8.6(@types/node@18.18.7)(typescript@4.9.5) + '@oclif/plugin-autocomplete': 2.3.10(@types/node@18.18.7)(typescript@4.9.5) + '@oclif/plugin-not-found': 2.4.3(@types/node@18.18.7)(typescript@4.9.5) '@whatwg-node/fetch': 0.8.8 assemblyscript: 0.19.23 binary-install-raw: 0.0.13(debug@4.3.4) @@ -6042,7 +6047,7 @@ packages: fs-extra: 9.1.0 glob: 9.3.5 gluegun: 5.1.2(debug@4.3.4) - graphql: 16.8.1 + graphql: 15.5.0 immutable: 4.2.1 ipfs-http-client: 55.0.0(node-fetch@3.3.2) jayson: 4.0.0 @@ -6076,7 +6081,7 @@ packages: /@graphql-codegen/core@3.1.0(graphql@16.8.1): resolution: {integrity: sha512-DH1/yaR7oJE6/B+c6ZF2Tbdh7LixF1K8L+8BoSubjNyQ8pNwR4a70mvc1sv6H7qgp6y1bPQ9tKE+aazRRshysw==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-codegen/plugin-helpers': 4.2.0(graphql@16.8.1) '@graphql-tools/schema': 9.0.19(graphql@16.8.1) @@ -6087,7 +6092,7 @@ packages: /@graphql-codegen/plugin-helpers@2.7.2(graphql@16.8.1): resolution: {integrity: sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-tools/utils': 8.13.1(graphql@16.8.1) change-case-all: 1.0.14 @@ -6100,7 +6105,7 @@ packages: /@graphql-codegen/plugin-helpers@3.1.2(graphql@16.8.1): resolution: {integrity: sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) change-case-all: 1.0.15 @@ -6113,7 +6118,7 @@ packages: /@graphql-codegen/plugin-helpers@4.2.0(graphql@16.8.1): resolution: {integrity: sha512-THFTCfg+46PXlXobYJ/OoCX6pzjI+9woQqCjdyKtgoI0tn3Xq2HUUCiidndxUpEYVrXb5pRiRXb7b/ZbMQqD0A==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) change-case-all: 1.0.15 @@ -6126,7 +6131,7 @@ packages: /@graphql-codegen/schema-ast@3.0.1(graphql@16.8.1): resolution: {integrity: sha512-rTKTi4XiW4QFZnrEqetpiYEWVsOFNoiR/v3rY9mFSttXFbIwNXPme32EspTiGWmEEdHY8UuTDtZN3vEcs/31zw==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-codegen/plugin-helpers': 4.2.0(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6136,7 +6141,7 @@ packages: /@graphql-codegen/typed-document-node@4.0.1(graphql@16.8.1): resolution: {integrity: sha512-mQNYCd12JsFSaK6xLry4olY9TdYG7GxQPexU6qU4Om++eKhseGwk2eGmQDRG4Qp8jEDFLMXuHMVUKqMQ1M+F/A==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-codegen/plugin-helpers': 4.2.0(graphql@16.8.1) '@graphql-codegen/visitor-plugin-common': 3.1.1(graphql@16.8.1) @@ -6151,7 +6156,7 @@ packages: /@graphql-codegen/typescript-generic-sdk@3.1.0(graphql-tag@2.12.6)(graphql@16.8.1): resolution: {integrity: sha512-nQZi/YGRI1+qCZZsh0V5nz6+hCHSN4OU9tKyOTDsEPyDFnGEukDuRdCH2IZasGn22a3Iu5TUDkgp5w9wEQwGmg==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 graphql-tag: ^2.0.0 dependencies: '@graphql-codegen/plugin-helpers': 3.1.2(graphql@16.8.1) @@ -6167,7 +6172,7 @@ packages: /@graphql-codegen/typescript-operations@3.0.4(graphql@16.8.1): resolution: {integrity: sha512-6yE2OL2+WJ1vd5MwFEGXpaxsFGzjAGUytPVHDML3Bi3TwP1F3lnQlIko4untwvHW0JhZEGQ7Ck30H9HjcxpdKA==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-codegen/plugin-helpers': 4.2.0(graphql@16.8.1) '@graphql-codegen/typescript': 3.0.4(graphql@16.8.1) @@ -6182,7 +6187,7 @@ packages: /@graphql-codegen/typescript-resolvers@3.2.1(graphql@16.8.1): resolution: {integrity: sha512-2ZIHk5J6HTuylse5ZIxw+aega54prHxvj7vM8hiKJ6vejZ94kvVPAq4aWmSFOkZ5lqU3YnM/ZyWfnhT5CUDj1g==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-codegen/plugin-helpers': 4.2.0(graphql@16.8.1) '@graphql-codegen/typescript': 3.0.4(graphql@16.8.1) @@ -6198,7 +6203,7 @@ packages: /@graphql-codegen/typescript@3.0.4(graphql@16.8.1): resolution: {integrity: sha512-x4O47447DZrWNtE/l5CU9QzzW4m1RbmCEdijlA3s2flG/y1Ckqdemob4CWfilSm5/tZ3w1junVDY616RDTSvZw==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-codegen/plugin-helpers': 4.2.0(graphql@16.8.1) '@graphql-codegen/schema-ast': 3.0.1(graphql@16.8.1) @@ -6213,7 +6218,7 @@ packages: /@graphql-codegen/visitor-plugin-common@2.13.1(graphql@16.8.1): resolution: {integrity: sha512-mD9ufZhDGhyrSaWQGrU1Q1c5f01TeWtSWy/cDwXYjJcHIj1Y/DG2x0tOflEfCvh5WcnmHNIw4lzDsg1W7iFJEg==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-codegen/plugin-helpers': 2.7.2(graphql@16.8.1) '@graphql-tools/optimize': 1.4.0(graphql@16.8.1) @@ -6233,7 +6238,7 @@ packages: /@graphql-codegen/visitor-plugin-common@3.1.1(graphql@16.8.1): resolution: {integrity: sha512-uAfp+zu/009R3HUAuTK2AamR1bxIltM6rrYYI6EXSmkM3rFtFsLTuJhjUDj98HcUCszJZrADppz8KKLGRUVlNg==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-codegen/plugin-helpers': 4.2.0(graphql@16.8.1) '@graphql-tools/optimize': 1.4.0(graphql@16.8.1) @@ -6253,7 +6258,7 @@ packages: /@graphql-inspector/core@3.3.0(graphql@16.8.1): resolution: {integrity: sha512-LRtk9sHgj9qqVPIkkThAVq3iZ7QxgHCx6elEwd0eesZBCmaIYQxD/BFu+VT8jr10YfOURBZuAnVdyGu64vYpBg==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: dependency-graph: 0.11.0 graphql: 16.8.1 @@ -6264,7 +6269,7 @@ packages: resolution: {integrity: sha512-1CWfFYucnRdULGiN1NDSinlNlpucBT+0x4i4AIthKe5n5jD9RIVyJtkA8zBbujUFrP++YE3l+TQifwbN1yTQsw==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: dependency-graph: 0.11.0 graphql: 16.8.1 @@ -6276,7 +6281,7 @@ packages: peerDependencies: '@graphql-mesh/types': ^0.93.1 '@graphql-mesh/utils': ^0.93.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -6285,27 +6290,27 @@ packages: localforage: 1.10.0 tslib: 2.6.2 - /@graphql-mesh/cache-localforage@0.95.7(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-/e9sFn0kgSxGE6O/GWfdGnFMOIfk1Y+IZwRqPIofHmIPdyC5cZ/gnkN6oRQv7nnx+c9hzQQ5OnxiOGdOKwb1cg==} + /@graphql-mesh/cache-localforage@0.95.8(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-PgCTHh1dLwjmusWEWAMQkglL7gR8VyyT9pzTcYBVFhGYNXysepCrl85QtaqtEMnR/YijgpCWaKGIYK+bosQZsg==} engines: {node: '>=16.0.0'} peerDependencies: - '@graphql-mesh/types': ^0.95.7 - '@graphql-mesh/utils': ^0.95.7 - graphql: ^16.6.0 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 + graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 localforage: 1.10.0 tslib: 2.6.2 dev: false - /@graphql-mesh/cli@0.82.35(@babel/core@7.23.2)(@types/node@18.18.6)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphql-mesh/cli@0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-5IuXpk+Zpg05u6qNPX19VzC5/HCiLdDRF6EPZ3ze57FIRgGA3YsB1CUGga6Ky3inalURYwx0kWqmdjbdKZYx1w==} hasBin: true peerDependencies: - graphql: ^16.6.0 + graphql: '*' dependencies: '@graphql-codegen/core': 3.1.0(graphql@16.8.1) '@graphql-codegen/typed-document-node': 4.0.1(graphql@16.8.1) @@ -6335,7 +6340,7 @@ packages: open: 7.4.2 pascal-case: 3.1.2 rimraf: 5.0.5 - ts-node: 10.9.1(@types/node@18.18.6)(typescript@5.1.6) + ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.1.6) tsconfig-paths: 4.2.0 tslib: 2.6.2 typescript: 5.1.6 @@ -6363,7 +6368,7 @@ packages: '@graphql-mesh/types': ^0.93.1 '@graphql-mesh/utils': ^0.93.1 '@graphql-tools/utils': ^9.2.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@envelop/core': 3.0.6 @@ -6393,7 +6398,7 @@ packages: resolution: {integrity: sha512-jseNppSNEwNWjcjDDwsxmRBK+ub8tz2qc/ca2ZfCTebuCk/+D3dI3LJ95ceNFOIhInK0g2HVq8BO8lMMX1pQtg==} peerDependencies: '@graphql-tools/utils': ^9.2.1 - graphql: ^16.6.0 + graphql: '*' dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 @@ -6409,13 +6414,13 @@ packages: engines: {node: '>=16.0.0'} peerDependencies: '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: ^16.6.0 + graphql: '*' dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 path-browserify: 1.0.1 - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6423,7 +6428,7 @@ packages: '@graphql-mesh/types': ^0.93.1 '@graphql-mesh/utils': ^0.93.1 '@graphql-tools/utils': ^9.2.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) @@ -6432,7 +6437,7 @@ packages: '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) - '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.6)(graphql@16.8.1) + '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) graphql: 16.8.1 @@ -6445,7 +6450,7 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6453,16 +6458,16 @@ packages: '@graphql-mesh/types': ^0.93.1 '@graphql-mesh/utils': ^0.93.1 '@graphql-tools/utils': ^9.2.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) - '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.6)(graphql@16.8.1) + '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) graphql: 16.8.1 @@ -6475,26 +6480,26 @@ packages: - utf-8-validate dev: true - /@graphql-mesh/graphql@0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): - resolution: {integrity: sha512-Fjf1Ti2HYOEP+dFLVnVxafD/Z4Ev+sR6BUbx3E7Mw8r/XGY28KmCA/QftBOB6BRNKMLe5w7RsgjCrO+Qp0klNg==} + /@graphql-mesh/graphql@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): + resolution: {integrity: sha512-mEbz2XYSgRTdNidUBWB7FT3QzLliJwxJIoqipSbZNputJqSbUZZ6QD/oI1IrdPXqVl/ELE2CuLiogkOSO24C1Q==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/store': ^0.95.7 - '@graphql-mesh/types': ^0.95.7 - '@graphql-mesh/utils': ^0.95.7 + '@graphql-mesh/store': ^0.95.8 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/string-interpolation': 0.5.2(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/federation': 1.1.10(@types/node@18.18.6)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) - '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.6)(graphql@16.8.1) + '@graphql-tools/federation': 1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 lodash.get: 4.4.2 @@ -6517,7 +6522,7 @@ packages: '@graphql-mesh/runtime': ^0.93.2 '@graphql-mesh/types': ^0.93.1 '@graphql-mesh/utils': ^0.93.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) @@ -6529,22 +6534,22 @@ packages: graphql-yoga: 3.9.1(graphql@16.8.1) tslib: 2.6.2 - /@graphql-mesh/http@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.12)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-WNiOJkwuRKoVCv/+9bp8/PFdclyTN0COIwSXjzIf36QICPtUXhokPLkXKhR7Xdtk175aIIpUHYRRwlgQw3BC1w==} + /@graphql-mesh/http@0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-38Mxw2K2RABBBO0IiXKZDu2o+jlM4vcUSEg+9h2Dz67oOJZHpKeId6z1PFb7uYMzAs29yoMcqXIEnews+HVhrQ==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/runtime': ^0.96.12 - '@graphql-mesh/types': ^0.95.7 - '@graphql-mesh/utils': ^0.95.7 - graphql: ^16.6.0 + '@graphql-mesh/runtime': ^0.96.13 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/runtime': 0.96.12(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@whatwg-node/server': 0.9.15 + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@whatwg-node/server': 0.9.16 graphql: 16.8.1 graphql-yoga: 5.0.0(graphql@16.8.1) tslib: 2.6.2 @@ -6556,7 +6561,7 @@ packages: '@graphql-mesh/types': ^0.93.1 '@graphql-mesh/utils': ^0.93.1 '@graphql-tools/utils': ^9.2.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/merger-stitching': 0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -6569,19 +6574,19 @@ packages: transitivePeerDependencies: - '@graphql-mesh/store' - /@graphql-mesh/merger-bare@0.95.7(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-QNLm5otrzcpClR8Puks4Md7Mh6AON+EWK+l3NBKvEkiOINFcnDRFv4FrSEXSfrAv/vHrSBbxAEXGUWHjjbQ8Kw==} + /@graphql-mesh/merger-bare@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-E5R8Sv5Dkp+eswYKEDHgu8puwSeolPX1j9IHwBVe1npRRCXc3CjMsQJ9+kcTln453vbSBcM1a3fQspIaKA1Tcg==} engines: {node: '>=16.0.0'} peerDependencies: - '@graphql-mesh/types': ^0.95.7 - '@graphql-mesh/utils': ^0.95.7 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/merger-stitching': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/merger-stitching': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/schema': 10.0.0(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 @@ -6597,7 +6602,7 @@ packages: '@graphql-mesh/types': ^0.93.1 '@graphql-mesh/utils': ^0.93.1 '@graphql-tools/utils': ^9.2.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -6611,20 +6616,20 @@ packages: graphql: 16.8.1 tslib: 2.6.2 - /@graphql-mesh/merger-stitching@0.95.7(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-0fooZHNseNrrVIm+OPfy7NdN1f/Cq6yhpW7d9lXjB8kPWjRGaX6gBUxpfCsRqSrfBDP1VwusZ6Z9EmW+84AtCQ==} + /@graphql-mesh/merger-stitching@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-eAukU8AsjK8jIT3vFhalGoERh98xZgzKkTCQL7w2wPpFXveSDMn+9fVvCJ1EBKTsLa7SkNXqzAFkfYp21hW0ng==} engines: {node: '>=16.0.0'} peerDependencies: - '@graphql-mesh/store': ^0.95.7 - '@graphql-mesh/types': ^0.95.7 - '@graphql-mesh/utils': ^0.95.7 + '@graphql-mesh/store': ^0.95.8 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/store': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/schema': 10.0.0(graphql@16.8.1) '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) @@ -6640,7 +6645,7 @@ packages: '@graphql-mesh/types': ^0.93.1 '@graphql-mesh/utils': ^0.93.1 '@graphql-tools/utils': ^9.2.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@envelop/core': 3.0.6 @@ -6658,22 +6663,22 @@ packages: graphql: 16.8.1 tslib: 2.6.2 - /@graphql-mesh/runtime@0.96.12(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-b3a/XjbTtS8gF30wu35M4pA2KyUYkYcWlnYNGXWOObtdEtEXjj+GkX//yO2XzTGI/sGWKElAAKIv4asPsye4jA==} + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.7 - '@graphql-mesh/utils': ^0.95.7 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@envelop/core': 5.0.0 '@envelop/extended-validation': 4.0.0(@envelop/core@5.0.0)(graphql@16.8.1) '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/string-interpolation': 0.5.2(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) @@ -6681,36 +6686,36 @@ packages: '@graphql-tools/executor': 1.2.0(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) - '@whatwg-node/fetch': 0.9.13 + '@whatwg-node/fetch': 0.9.14 graphql: 16.8.1 graphql-jit: 0.8.2(graphql@16.8.1) tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.96.12(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-b3a/XjbTtS8gF30wu35M4pA2KyUYkYcWlnYNGXWOObtdEtEXjj+GkX//yO2XzTGI/sGWKElAAKIv4asPsye4jA==} + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.7 - '@graphql-mesh/utils': ^0.95.7 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@envelop/core': 5.0.0 '@envelop/extended-validation': 4.0.0(@envelop/core@5.0.0)(graphql@16.8.1) '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/string-interpolation': 0.5.2(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) - '@whatwg-node/fetch': 0.9.13 + '@whatwg-node/fetch': 0.9.14 graphql: 16.8.1 graphql-jit: 0.8.2(graphql@16.8.1) tslib: 2.6.2 @@ -6723,7 +6728,7 @@ packages: '@graphql-mesh/types': ^0.93.1 '@graphql-mesh/utils': ^0.93.1 '@graphql-tools/utils': ^9.2.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-inspector/core': 3.3.0(graphql@16.8.1) @@ -6734,21 +6739,21 @@ packages: graphql: 16.8.1 tslib: 2.6.2 - /@graphql-mesh/store@0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-4T5MnkdV70gPzM3Hj+Er2Qg4FTzePzbzGdHdWRSbW++4K+05Hbe1gKPix2f3s3BGkAO4Et5XkkdILL5QynhQFw==} + /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.7 - '@graphql-mesh/utils': ^0.95.7 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-inspector/core': 5.0.1(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -6756,7 +6761,7 @@ packages: /@graphql-mesh/string-interpolation@0.4.4(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-IotswBYZRaPswOebcr2wuOFuzD3dHIJxVEkPiiQubqjUIR8HhQI22XHJv0WNiQZ65z8NR9+GYWwEDIc2JRCNfQ==} peerDependencies: - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: dayjs: 1.11.7 @@ -6765,11 +6770,11 @@ packages: lodash.get: 4.4.2 tslib: 2.6.2 - /@graphql-mesh/string-interpolation@0.5.2(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-TkSAJ9pj1zesQyDlHrEUevVGOc1s/z9IQC0AONcpMHAunb8uYGO4Yryl8JIRIvDl5DlexHt3z8kLDNCInRGWNQ==} + /@graphql-mesh/string-interpolation@0.5.3(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-/R4kj3M1uqUie/7RZ58zgRrT8RBrDsCCR6ii00s62DbLsl+jZYOZFyTqHGsFbP7L7aHnl0fo1dwhEJIs+rjCLg==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: dayjs: 1.11.10 @@ -6783,7 +6788,7 @@ packages: peerDependencies: '@graphql-mesh/types': ^0.93.1 '@graphql-mesh/utils': ^0.93.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -6794,16 +6799,16 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} peerDependencies: '@graphql-mesh/types': ^0.93.1 '@graphql-mesh/utils': ^0.93.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) graphql: 16.8.1 @@ -6815,7 +6820,7 @@ packages: peerDependencies: '@graphql-mesh/store': ^0.93.1 '@graphql-tools/utils': ^9.2.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -6826,16 +6831,16 @@ packages: graphql: 16.8.1 tslib: 2.6.2 - /@graphql-mesh/types@0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-afM2uuGR//lBoDrQvyfDmCcPwObpouRauahKVrXGyxkWe9LuIBG+scBZcynSbKotO1SgFcbJtToafMAIk5CefQ==} + /@graphql-mesh/types@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-H2xh5KGc3+Ly3VdAPnRdKTibZpW9zEFgUzsozL9MQhCs6WLX+/kOADb0uIDqYFKX5c/2axmcy87BFNOausXYig==} engines: {node: '>=16.0.0'} peerDependencies: - '@graphql-mesh/store': ^0.95.7 + '@graphql-mesh/store': ^0.95.8 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/store': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6849,7 +6854,7 @@ packages: '@graphql-mesh/cross-helpers': ^0.3.4 '@graphql-mesh/types': ^0.93.2 '@graphql-tools/utils': ^9.2.1 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) @@ -6857,7 +6862,7 @@ packages: '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - dset: 3.1.2 + dset: 3.1.3 graphql: 16.8.1 js-yaml: 4.1.0 lodash.get: 4.4.2 @@ -6865,23 +6870,23 @@ packages: tiny-lru: 8.0.2 tslib: 2.6.2 - /@graphql-mesh/utils@0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-6YQTMTrLt6m/cAdesrBgbGVSrLd+68xTo1dRIhxUFHSgucSAqA47Q8E71Lc9cLHh80HQT+/pauKHHG40csy1Ng==} + /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.7 + '@graphql-mesh/types': ^0.95.8 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: ^16.6.0 + graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/string-interpolation': 0.5.2(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@whatwg-node/fetch': 0.9.13 - dset: 3.1.2 + '@whatwg-node/fetch': 0.9.14 + dset: 3.1.3 graphql: 16.8.1 js-yaml: 4.1.0 lodash.get: 4.4.2 @@ -6892,7 +6897,7 @@ packages: /@graphql-tools/batch-delegate@8.4.27(graphql@16.8.1): resolution: {integrity: sha512-efgDDJhljma9d3Ky/LswIu1xm/if2oS27XA1sOcxcShW+Ze+Qxi0hZZ6iyI4eQxVDX5Lyy/n+NvQEZAK1riqnQ==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6905,7 +6910,7 @@ packages: resolution: {integrity: sha512-23NmxcHQeKcfhMQyrRPTZfW4/+bSpAyR/qAhRjx+/hikDIa1Uv2XVgV9jIitSgM0OEk/KGPB4VQv+LCOWvAYiw==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 10.0.7(graphql@16.8.1) @@ -6917,7 +6922,7 @@ packages: /@graphql-tools/batch-execute@8.5.22(graphql@16.8.1): resolution: {integrity: sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) dataloader: 2.2.2 @@ -6929,7 +6934,7 @@ packages: resolution: {integrity: sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 10.0.7(graphql@16.8.1) dataloader: 2.2.2 @@ -6940,7 +6945,7 @@ packages: /@graphql-tools/code-file-loader@7.3.23(@babel/core@7.23.2)(graphql@16.8.1): resolution: {integrity: sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/graphql-tag-pluck': 7.5.2(@babel/core@7.23.2)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6956,7 +6961,7 @@ packages: resolution: {integrity: sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/batch-execute': 9.0.2(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -6969,7 +6974,7 @@ packages: /@graphql-tools/delegate@9.0.35(graphql@16.8.1): resolution: {integrity: sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/batch-execute': 8.5.22(graphql@16.8.1) '@graphql-tools/executor': 0.0.20(graphql@16.8.1) @@ -6983,7 +6988,7 @@ packages: /@graphql-tools/executor-graphql-ws@0.0.14(graphql@16.8.1): resolution: {integrity: sha512-P2nlkAsPZKLIXImFhj0YTtny5NQVGSsKnhi7PzXiaHSXc6KkzqbWZHKvikD4PObanqg+7IO58rKFpGXP7eeO+w==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@repeaterjs/repeater': 3.0.4 @@ -7001,7 +7006,7 @@ packages: resolution: {integrity: sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 10.0.7(graphql@16.8.1) '@types/ws': 8.5.8 @@ -7015,35 +7020,35 @@ packages: - utf-8-validate dev: false - /@graphql-tools/executor-http@0.1.10(@types/node@18.18.6)(graphql@16.8.1): + /@graphql-tools/executor-http@0.1.10(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-hnAfbKv0/lb9s31LhWzawQ5hghBfHS+gYWtqxME6Rl0Aufq9GltiiLBcl7OVVOnkLF0KhwgbYP1mB5VKmgTGpg==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@repeaterjs/repeater': 3.0.4 '@whatwg-node/fetch': 0.8.8 - dset: 3.1.2 + dset: 3.1.3 extract-files: 11.0.0 graphql: 16.8.1 - meros: 1.3.0(@types/node@18.18.6) + meros: 1.3.0(@types/node@18.18.7) tslib: 2.6.2 value-or-promise: 1.0.12 transitivePeerDependencies: - '@types/node' - /@graphql-tools/executor-http@1.0.3(@types/node@18.18.6)(graphql@16.8.1): + /@graphql-tools/executor-http@1.0.3(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-5WZIMBevRaxMabZ8U2Ty0dTUPy/PpeYSlMNEmC/YJjKKykgSfc/AwSejx2sE4FFKZ0I2kxRKRenyoWMHRAV49Q==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 10.0.7(graphql@16.8.1) '@repeaterjs/repeater': 3.0.4 - '@whatwg-node/fetch': 0.9.13 + '@whatwg-node/fetch': 0.9.14 extract-files: 11.0.0 graphql: 16.8.1 - meros: 1.3.0(@types/node@18.18.6) + meros: 1.3.0(@types/node@18.18.7) tslib: 2.6.2 value-or-promise: 1.0.12 transitivePeerDependencies: @@ -7053,7 +7058,7 @@ packages: /@graphql-tools/executor-legacy-ws@0.0.11(graphql@16.8.1): resolution: {integrity: sha512-4ai+NnxlNfvIQ4c70hWFvOZlSUN8lt7yc+ZsrwtNFbFPH/EroIzFMapAxM9zwyv9bH38AdO3TQxZ5zNxgBdvUw==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@types/ws': 8.5.8 @@ -7069,7 +7074,7 @@ packages: resolution: {integrity: sha512-b7aGuRekZDS+m3af3BIvMKxu15bmVPMt5eGQVuP2v5pxmbaPTh+iv5mx9b3Plt32z5Ke5tycBnNm5urSFtW8ng==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 10.0.7(graphql@16.8.1) '@types/ws': 8.5.8 @@ -7085,7 +7090,7 @@ packages: /@graphql-tools/executor@0.0.18(graphql@16.8.1): resolution: {integrity: sha512-xZC0C+/npXoSHBB5bsJdwxDLgtl1Gu4fL9J2TPQmXoZC3L2N506KJoppf9LgWdHU/xK04luJrhP6WjhfkIN0pQ==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) @@ -7097,7 +7102,7 @@ packages: /@graphql-tools/executor@0.0.20(graphql@16.8.1): resolution: {integrity: sha512-GdvNc4vszmfeGvUqlcaH1FjBoguvMYzxAfT6tDd4/LgwymepHhinqLNA5otqwVLW+JETcDaK7xGENzFomuE6TA==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) @@ -7110,7 +7115,7 @@ packages: resolution: {integrity: sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 10.0.7(graphql@16.8.1) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) @@ -7119,14 +7124,14 @@ packages: tslib: 2.6.2 value-or-promise: 1.0.12 - /@graphql-tools/federation@1.1.10(@types/node@18.18.6)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): + /@graphql-tools/federation@1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-H51qTYwbtfIYBO1uHXlImRWzo9tknSoIGBgJckDh+hdxJx43sZaMjJiLHc2DjRc/A8d2Bf0bi0HbH++HqOos/w==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/executor-http': 1.0.3(@types/node@18.18.6)(graphql@16.8.1) + '@graphql-tools/executor-http': 1.0.3(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/merge': 9.0.0(graphql@16.8.1) '@graphql-tools/schema': 10.0.0(graphql@16.8.1) '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) @@ -7148,7 +7153,7 @@ packages: /@graphql-tools/graphql-file-loader@7.5.17(graphql@16.8.1): resolution: {integrity: sha512-hVwwxPf41zOYgm4gdaZILCYnKB9Zap7Ys9OhY1hbwuAuC4MMNY9GpUjoTU3CQc3zUiPoYStyRtUGkHSJZ3HxBw==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/import': 6.7.18(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -7160,7 +7165,7 @@ packages: /@graphql-tools/graphql-tag-pluck@7.5.2(@babel/core@7.23.2)(graphql@16.8.1): resolution: {integrity: sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@babel/parser': 7.23.0 '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.2) @@ -7176,7 +7181,7 @@ packages: /@graphql-tools/import@6.7.18(graphql@16.8.1): resolution: {integrity: sha512-XQDdyZTp+FYmT7as3xRWH/x8dx0QZA2WZqfMF5EWb36a0PiH7WwlRQYIdyYXj8YCLpiWkeBXgBRHmMnwEYR8iQ==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 @@ -7186,7 +7191,7 @@ packages: /@graphql-tools/load@7.8.14(graphql@16.8.1): resolution: {integrity: sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/schema': 9.0.19(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -7197,7 +7202,7 @@ packages: /@graphql-tools/merge@8.4.2(graphql@16.8.1): resolution: {integrity: sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 @@ -7207,7 +7212,7 @@ packages: resolution: {integrity: sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 10.0.7(graphql@16.8.1) graphql: 16.8.1 @@ -7216,7 +7221,7 @@ packages: /@graphql-tools/optimize@1.4.0(graphql@16.8.1): resolution: {integrity: sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: graphql: 16.8.1 tslib: 2.6.2 @@ -7224,7 +7229,7 @@ packages: /@graphql-tools/relay-operation-optimizer@6.5.18(graphql@16.8.1): resolution: {integrity: sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/relay-compiler': 12.0.0(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -7238,7 +7243,7 @@ packages: resolution: {integrity: sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/merge': 9.0.0(graphql@16.8.1) '@graphql-tools/utils': 10.0.7(graphql@16.8.1) @@ -7249,7 +7254,7 @@ packages: /@graphql-tools/schema@9.0.19(graphql@16.8.1): resolution: {integrity: sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/merge': 8.4.2(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -7260,7 +7265,7 @@ packages: /@graphql-tools/stitch@8.7.50(graphql@16.8.1): resolution: {integrity: sha512-VB1/uZyXjj1P5Wj0c4EKX3q8Q1Maj4dy6uNwodEPaO3EHMpaJU/DqyN0Bvnhxu0ol7RzdY3kgsvsdUjU2QMImw==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/batch-delegate': 8.4.27(graphql@16.8.1) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) @@ -7277,7 +7282,7 @@ packages: resolution: {integrity: sha512-G03XahiHDu1pnaS8z2GNfsV/5BribMEUATT5dCHBAqj13Te5y1amZNQePrmw8DLtbf5qDbU6CO7kGHPxv0XO9A==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) @@ -7294,22 +7299,22 @@ packages: /@graphql-tools/stitching-directives@2.3.34(graphql@16.8.1): resolution: {integrity: sha512-DVlo1/SW9jN6jN1IL279c7voEJiEHsLbYRD7tYsAW472zrHqn0rpB6jRzZDzLOlCpm7JRWPsegXVlkqf0qvqFQ==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 - /@graphql-tools/url-loader@7.17.18(@types/node@18.18.6)(graphql@16.8.1): + /@graphql-tools/url-loader@7.17.18(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-ear0CiyTj04jCVAxi7TvgbnGDIN2HgqzXzwsfcqiVg9cvjT40NcMlZ2P1lZDgqMkZ9oyLTV8Bw6j+SyG6A+xPw==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/executor-graphql-ws': 0.0.14(graphql@16.8.1) - '@graphql-tools/executor-http': 0.1.10(@types/node@18.18.6)(graphql@16.8.1) + '@graphql-tools/executor-http': 0.1.10(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/executor-legacy-ws': 0.0.11(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) @@ -7326,21 +7331,21 @@ packages: - encoding - utf-8-validate - /@graphql-tools/url-loader@8.0.0(@types/node@18.18.6)(graphql@16.8.1): + /@graphql-tools/url-loader@8.0.0(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor-graphql-ws': 1.1.0(graphql@16.8.1) - '@graphql-tools/executor-http': 1.0.3(@types/node@18.18.6)(graphql@16.8.1) + '@graphql-tools/executor-http': 1.0.3(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/executor-legacy-ws': 1.0.4(graphql@16.8.1) '@graphql-tools/utils': 10.0.7(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) '@types/ws': 8.5.8 - '@whatwg-node/fetch': 0.9.13 + '@whatwg-node/fetch': 0.9.14 graphql: 16.8.1 isomorphic-ws: 5.0.0(ws@8.14.2) tslib: 2.6.2 @@ -7357,17 +7362,17 @@ packages: resolution: {integrity: sha512-KOdeMj6Hd/MENDaqPbws3YJl3wVy0DeYnL7PyUms5Skyf7uzI9INynDwPMhLXfSb0/ph6BXTwMd5zBtWbF8tBQ==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - dset: 3.1.2 + dset: 3.1.3 graphql: 16.8.1 tslib: 2.6.2 /@graphql-tools/utils@8.13.1(graphql@16.8.1): resolution: {integrity: sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: graphql: 16.8.1 tslib: 2.6.2 @@ -7375,7 +7380,7 @@ packages: /@graphql-tools/utils@9.2.1(graphql@16.8.1): resolution: {integrity: sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) graphql: 16.8.1 @@ -7385,7 +7390,7 @@ packages: resolution: {integrity: sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg==} engines: {node: '>=16.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/schema': 10.0.0(graphql@16.8.1) @@ -7398,7 +7403,7 @@ packages: /@graphql-tools/wrap@9.4.2(graphql@16.8.1): resolution: {integrity: sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA==} peerDependencies: - graphql: ^16.6.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/schema': 9.0.19(graphql@16.8.1) @@ -7410,7 +7415,7 @@ packages: /@graphql-typed-document-node/core@3.2.0(graphql@16.8.1): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: graphql: 16.8.1 @@ -7475,7 +7480,6 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true /@humanwhocodes/config-array@0.9.5: resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} @@ -7491,7 +7495,6 @@ packages: /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} @@ -7499,59 +7502,66 @@ packages: /@humanwhocodes/object-schema@2.0.1: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - dev: true /@hypercerts-org/contracts@0.8.11: resolution: {integrity: sha512-n6fwMsaoR50VITM2upR4OOi4EZJmZvU6vvXrHWCSakP9e1OeDuAOk+kHiK+egqDRYj6uKtg9VTUFKZBYvu3jRg==} dev: false - /@hypercerts-org/sdk@0.8.16(@envelop/core@3.0.6)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.6)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3): - resolution: {integrity: sha512-WkxYb5RYhv3QI7+N5y4xg5IL4azLqCq4ia1/bgFB55vWJLjnmoMj3VYbiybMxyfgnPfh5O8n2DU86u8ClLgyhg==} + /@hypercerts-org/contracts@0.9.0(typescript@5.1.6): + resolution: {integrity: sha512-enXkIzZxYMDaOchL9peq6ddIfo0uJeJb1o+nj3LMy5AzK5B+3ijNkJFDUx0N8RZPO2jVgqO3/4czAavndLfNww==} + dependencies: + hardhat: 2.18.3(typescript@5.1.6) + transitivePeerDependencies: + - bufferutil + - supports-color + - ts-node + - typescript + - utf-8-validate + dev: false + + /@hypercerts-org/sdk@1.0.0-alpha.6(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4): + resolution: {integrity: sha512-WnZJfKGGqaQAPasvKjAuQ1eyWJT8kfY5Z445SjeFU8xWDelLRGuwaMT1w+B3e16YbZFQXBr/eB/dabMVb9ZPrQ==} dependencies: - '@ethereum-attestation-service/eas-sdk': 0.28.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(typescript@5.1.6) + '@ethereum-attestation-service/eas-sdk': 1.2.2-beta.0(ts-node@10.9.1)(typescript@5.1.6) '@ethersproject/abstract-signer': 5.7.0 - '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.95.7)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) - '@graphql-mesh/cache-localforage': 0.95.7(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/cache-localforage': 0.95.8(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/graphql': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(@types/node@18.18.6)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) - '@graphql-mesh/http': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.12)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/merger-bare': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/runtime': 0.96.12(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/store': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-mesh/utils@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.7(@graphql-mesh/store@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.7(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.7)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/graphql': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) + '@graphql-mesh/http': 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/merger-bare': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': 0.8.11 '@openzeppelin/merkle-tree': 1.0.5 - '@whatwg-node/fetch': 0.9.13 + '@whatwg-node/fetch': 0.9.14 ajv: 8.12.0 axios: 1.5.1(debug@4.3.4) dotenv: 16.3.1 ethers: 5.7.2 graphql: 16.8.1 ipfs-core: 0.17.0(uint8arraylist@2.4.3) - jest: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) loglevel: 1.8.1 mime: 3.0.0 nft.storage: 7.1.1(node-fetch@3.3.2) + viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) web3.storage: 4.5.5(node-fetch@3.3.2) transitivePeerDependencies: - '@envelop/core' - - '@ethersproject/abi' - - '@ethersproject/providers' - '@graphql-tools/delegate' - '@graphql-tools/merge' - '@graphql-tools/utils' - '@graphql-tools/wrap' - '@types/node' - - babel-plugin-macros - bufferutil - debug - encoding - graphql-ws - node-fetch - - node-notifier - react - react-dom - subscriptions-transport-ws @@ -7561,6 +7571,7 @@ packages: - typescript - uint8arraylist - utf-8-validate + - zod dev: false /@iarna/toml@2.2.5: @@ -7580,8 +7591,8 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: '@ipld/dag-cbor': 9.0.6 - cborg: 4.0.4 - multiformats: 12.1.2 + cborg: 4.0.5 + multiformats: 12.1.3 varint: 6.0.0 dev: false @@ -7610,8 +7621,8 @@ packages: resolution: {integrity: sha512-3kNab5xMppgWw6DVYx2BzmFq8t7I56AGWfp5kaU1fIPkwHVpBRglJJTYsGtbVluCi/s/q97HZM3bC+aDW4sxbQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - cborg: 4.0.4 - multiformats: 12.1.2 + cborg: 4.0.5 + multiformats: 12.1.3 dev: false /@ipld/dag-json@8.0.11: @@ -7661,21 +7672,24 @@ packages: get-package-type: 0.1.0 js-yaml: 3.14.1 resolve-from: 5.0.0 + dev: true /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} + dev: true /@jest/console@29.7.0: resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 + dev: true /@jest/core@29.7.0(ts-node@10.9.1): resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} @@ -7691,14 +7705,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -7718,6 +7732,7 @@ packages: - babel-plugin-macros - supports-color - ts-node + dev: true /@jest/create-cache-key-function@29.7.0: resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} @@ -7731,7 +7746,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 jest-mock: 29.7.0 /@jest/expect-utils@29.7.0: @@ -7739,6 +7754,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.6.3 + dev: true /@jest/expect@29.7.0: resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} @@ -7748,6 +7764,7 @@ packages: jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color + dev: true /@jest/fake-timers@29.7.0: resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} @@ -7755,7 +7772,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.18.6 + '@types/node': 18.18.7 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -7770,6 +7787,7 @@ packages: jest-mock: 29.7.0 transitivePeerDependencies: - supports-color + dev: true /@jest/reporters@29.7.0: resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} @@ -7786,7 +7804,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.20 - '@types/node': 18.18.6 + '@types/node': 18.18.7 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -7806,6 +7824,7 @@ packages: v8-to-istanbul: 9.1.3 transitivePeerDependencies: - supports-color + dev: true /@jest/schemas@29.6.3: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} @@ -7820,6 +7839,7 @@ packages: '@jridgewell/trace-mapping': 0.3.20 callsites: 3.1.0 graceful-fs: 4.2.11 + dev: true /@jest/test-result@29.7.0: resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} @@ -7829,6 +7849,7 @@ packages: '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.5 collect-v8-coverage: 1.0.2 + dev: true /@jest/test-sequencer@29.7.0: resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} @@ -7838,6 +7859,7 @@ packages: graceful-fs: 4.2.11 jest-haste-map: 29.7.0 slash: 3.0.0 + dev: true /@jest/transform@29.7.0: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} @@ -7860,6 +7882,7 @@ packages: write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color + dev: true /@jest/types@26.6.2: resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} @@ -7867,7 +7890,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.5 '@types/istanbul-reports': 3.0.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 '@types/yargs': 15.0.17 chalk: 4.1.2 @@ -7877,7 +7900,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.5 '@types/istanbul-reports': 3.0.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 '@types/yargs': 16.0.7 chalk: 4.1.2 @@ -7888,7 +7911,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.5 '@types/istanbul-reports': 3.0.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 '@types/yargs': 17.0.29 chalk: 4.1.2 @@ -8342,14 +8365,14 @@ packages: - supports-color dev: false - /@libp2p/interface@0.1.3: - resolution: {integrity: sha512-C1O7Xqd2TGVWrIOEDx6kGJSk4YOysWGmYG5Oh3chnsCY0wjUSsLDpl9+wKrdiM/lJbAlHlV65ZOvSkIQ9cWPBQ==} + /@libp2p/interface@0.1.4: + resolution: {integrity: sha512-Pk8mzit/w7PbTh28n77RDLTU1CQBBzLygiNC07MvcEjaIwqXdNPN3Vuzr/5qiF6aDsbM9fA1W5dWoCif9xBdxg==} dependencies: '@multiformats/multiaddr': 12.1.7 abortable-iterator: 5.0.1 it-pushable: 3.2.1 it-stream-types: 2.0.1 - multiformats: 12.1.2 + multiformats: 12.1.3 p-defer: 4.0.0 race-signal: 1.0.1 uint8arraylist: 2.4.3 @@ -8428,14 +8451,14 @@ packages: - supports-color dev: false - /@libp2p/logger@3.0.3: - resolution: {integrity: sha512-85ioPX10QN4ZOZeurAZe5sQeRUCkIBT2DikKRbE/AIWKauIKHvvIrN4CSdCdzLw29XNA+xxNO2FVkf51HGgCeQ==} + /@libp2p/logger@3.0.4: + resolution: {integrity: sha512-MF42c7SOJIx5YmHhIsFaSYfaC266YYmMbAJHjjH8Zl5unFsqW82M+Xr7sGVj9/WXrWAd37ts8xJaQrkIXc3OZQ==} dependencies: - '@libp2p/interface': 0.1.3 + '@libp2p/interface': 0.1.4 '@multiformats/multiaddr': 12.1.7 debug: 4.3.4(supports-color@8.1.1) interface-datastore: 8.2.5 - multiformats: 12.1.2 + multiformats: 12.1.3 transitivePeerDependencies: - supports-color dev: false @@ -8812,6 +8835,11 @@ packages: '@lit-labs/ssr-dom-shim': 1.1.2 dev: false + /@looksrare/contracts-libs@3.4.0: + resolution: {integrity: sha512-tRFHcz9D4J0PLQg4ETWlvlRqrHpEoZhKsCTbyqATDXmekXvxbgk8+sRtaZK9Zo4gHpt6x+TcOgdUdARCg2elWg==} + engines: {node: '>=8.3.0'} + dev: true + /@mdx-js/mdx@1.6.22: resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==} dependencies: @@ -8860,8 +8888,8 @@ packages: tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 - /@metamask/object-multiplex@1.2.0: - resolution: {integrity: sha512-hksV602d3NWE2Q30Mf2Np1WfVKaGqfJRy9vpHAmelbaD0OkDt06/0KQkRR6UVYdMbTbkuEu8xN5JDUU80inGwQ==} + /@metamask/object-multiplex@1.3.0: + resolution: {integrity: sha512-czcQeVYdSNtabd+NcYQnrM69MciiJyd1qvKH8WM2Id3C0ZiUUX5Xa/MK+/VUk633DBhVOwdNzAKIQ33lGyA+eQ==} engines: {node: '>=12.0.0'} dependencies: end-of-stream: 1.4.4 @@ -8873,10 +8901,10 @@ packages: resolution: {integrity: sha512-xjE4cKrGpKZjripkMKMStc0H4LXrWJPijfbaj1kKeDLVhRH2Yu3ZecV3iIhf1EIJePeA+Kx6Pcm7d0IVJ+ea7g==} engines: {node: '>=16.0.0'} dependencies: - '@metamask/object-multiplex': 1.2.0 + '@metamask/object-multiplex': 1.3.0 '@metamask/safe-event-emitter': 3.0.0 detect-browser: 5.3.0 - eth-rpc-errors: 4.0.2 + eth-rpc-errors: 4.0.3 extension-port-stream: 2.1.1 fast-deep-equal: 3.1.3 is-stream: 2.0.1 @@ -9139,32 +9167,8 @@ packages: tslib: 2.6.2 dev: false - /@mswjs/cookies@0.2.2: - resolution: {integrity: sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==} - engines: {node: '>=14'} - dependencies: - '@types/set-cookie-parser': 2.4.5 - set-cookie-parser: 2.6.0 - dev: true - - /@mswjs/interceptors@0.17.10: - resolution: {integrity: sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==} - engines: {node: '>=14'} - dependencies: - '@open-draft/until': 1.0.3 - '@types/debug': 4.1.10 - '@xmldom/xmldom': 0.8.10 - debug: 4.3.4(supports-color@8.1.1) - headers-polyfill: 3.2.5 - outvariant: 1.4.0 - strict-event-emitter: 0.2.8 - web-encoding: 1.1.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@mui/base@5.0.0-beta.20(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==} + /@mui/base@5.0.0-beta.21(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-eTKWx3WV/nwmRUK4z4K1MzlMyWCsi3WJ3RtV4DiXZeRh4qd4JCyp1Zzzi8Wv9xM4dEBmqQntFoei716PzwmFfA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -9176,22 +9180,22 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@mui/types': 7.2.6(@types/react@18.2.31) - '@mui/utils': 5.14.14(@types/react@18.2.31)(react@18.2.0) + '@mui/types': 7.2.7(@types/react@18.2.33) + '@mui/utils': 5.14.15(@types/react@18.2.33)(react@18.2.0) '@popperjs/core': 2.11.8 - '@types/react': 18.2.31 + '@types/react': 18.2.33 clsx: 2.0.0 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@mui/core-downloads-tracker@5.14.14: - resolution: {integrity: sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==} + /@mui/core-downloads-tracker@5.14.15: + resolution: {integrity: sha512-ZCDzBWtCKjAYAlKKM3PA/jG/3uVIDT9ZitOtVixIVmTCQyc5jSV1qhJX8+qIGz4RQZ9KLzPWO2tXd0O5hvzouQ==} dev: false - /@mui/icons-material@5.14.14(@mui/material@5.14.14)(@types/react@18.2.31)(react@18.2.0): - resolution: {integrity: sha512-vwuaMsKvI7AWTeYqR8wYbpXijuU8PzMAJWRAq2DDIuOZPxjKyHlr8WQ25+azZYkIXtJ7AqnVb1ZmHdEyB4/kug==} + /@mui/icons-material@5.14.15(@mui/material@5.14.15)(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-Dqu21vN/mVNzebJ+ofnKG+CeJYIhHuDs5+0fMEpdpzRt6UojelzdrEkNv+XkO0e1JMclzeXIRx404FirK/CFRw==} engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 @@ -9202,13 +9206,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@mui/material': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@mui/material': 5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@mui/material@5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-cAmCwAHFQXxb44kWbVFkhKATN8tACgMsFwrXo8ro6WzYW73U/qsR5AcCiJIhCyYYg+gcftfkmNcpRaV3JjhHCg==} + /@mui/material@5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Gq65rHjvLzkxmhG8bvag851Oqsmru7qkUb/cCI2xu7dQzmY345f9xJRJi72sRGjhaqHXWeRKw/yIwp/7oQoeXg==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -9225,14 +9229,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) - '@mui/base': 5.0.0-beta.20(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.14.14 - '@mui/system': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react@18.2.0) - '@mui/types': 7.2.6(@types/react@18.2.31) - '@mui/utils': 5.14.14(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@emotion/react': 11.11.1(@types/react@18.2.33)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) + '@mui/base': 5.0.0-beta.21(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@mui/core-downloads-tracker': 5.14.15 + '@mui/system': 5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.33)(react@18.2.0) + '@mui/types': 7.2.7(@types/react@18.2.33) + '@mui/utils': 5.14.15(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-transition-group': 4.4.8 clsx: 2.0.0 csstype: 3.1.2 @@ -9243,8 +9247,8 @@ packages: react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) dev: false - /@mui/private-theming@5.14.14(@types/react@18.2.31)(react@18.2.0): - resolution: {integrity: sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==} + /@mui/private-theming@5.14.15(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-V2Xh+Tu6A07NoSpup0P9m29GwvNMYl5DegsGWqlOTJyAV7cuuVjmVPqxgvL8xBng4R85xqIQJRMjtYYktoPNuQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -9254,14 +9258,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@mui/utils': 5.14.14(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@mui/utils': 5.14.15(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/styled-engine@5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==} + /@mui/styled-engine@5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-mbOjRf867BysNpexe5Z/P8s3bWzDPNowmKhi7gtNDP/LPEeqAfiDSuC4WPTXmtvse1dCl30Nl755OLUYuoi7Mw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -9275,15 +9279,15 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.33)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) csstype: 3.1.2 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/system@5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react@18.2.0): - resolution: {integrity: sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==} + /@mui/system@5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-zr0Gdk1RgKiEk+tCMB900LaOpEC8NaGvxtkmMdL/CXgkqQZSVZOt2PQsxJWaw7kE4YVkIe4VukFVc43qcq9u3w==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -9299,32 +9303,32 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) - '@mui/private-theming': 5.14.14(@types/react@18.2.31)(react@18.2.0) - '@mui/styled-engine': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/types': 7.2.6(@types/react@18.2.31) - '@mui/utils': 5.14.14(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@emotion/react': 11.11.1(@types/react@18.2.33)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) + '@mui/private-theming': 5.14.15(@types/react@18.2.33)(react@18.2.0) + '@mui/styled-engine': 5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.7(@types/react@18.2.33) + '@mui/utils': 5.14.15(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 clsx: 2.0.0 csstype: 3.1.2 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/types@7.2.6(@types/react@18.2.31): - resolution: {integrity: sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==} + /@mui/types@7.2.7(@types/react@18.2.33): + resolution: {integrity: sha512-sofpWmcBqOlTzRbr1cLQuUDKaUYVZTw8ENQrtL39TECRNENEzwgnNPh6WMfqMZlMvf1Aj9DLg74XPjnLr0izUQ==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 dev: false - /@mui/utils@5.14.14(@types/react@18.2.31)(react@18.2.0): - resolution: {integrity: sha512-3AKp8uksje5sRfVrtgG9Q/2TBsHWVBUtA0NaXliZqGcXo8J+A+Agp0qUW2rJ+ivgPWTCCubz9FZVT2IQZ3bGsw==} + /@mui/utils@5.14.15(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-QBfHovAvTa0J1jXuYDaXGk+Yyp7+Fm8GSqx6nK2JbezGqzCFfirNdop/+bL9Flh/OQ/64PeXcW4HGDdOge+n3A==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -9335,13 +9339,13 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@types/prop-types': 15.7.9 - '@types/react': 18.2.31 + '@types/react': 18.2.33 prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 dev: false - /@mui/x-date-pickers@5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(@mui/system@5.14.14)(@types/react@18.2.31)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-date-pickers@5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.15)(@mui/system@5.14.15)(@types/react@18.2.33)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA==} engines: {node: '>=12.0.0'} peerDependencies: @@ -9375,11 +9379,11 @@ packages: '@date-io/dayjs': 2.17.0(dayjs@1.11.10) '@date-io/luxon': 2.17.0 '@date-io/moment': 2.17.0 - '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) - '@mui/material': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react@18.2.0) - '@mui/utils': 5.14.14(@types/react@18.2.31)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.33)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) + '@mui/material': 5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.33)(react@18.2.0) + '@mui/utils': 5.14.15(@types/react@18.2.33)(react@18.2.0) '@types/react-transition-group': 4.4.8 clsx: 1.2.1 dayjs: 1.11.10 @@ -9438,9 +9442,9 @@ packages: dependencies: '@chainsafe/is-ip': 2.0.2 '@chainsafe/netmask': 2.0.0 - '@libp2p/interface': 0.1.3 + '@libp2p/interface': 0.1.4 dns-over-http-resolver: 2.1.2 - multiformats: 12.1.2 + multiformats: 12.1.3 uint8-varint: 2.0.1 uint8arrays: 4.0.6 transitivePeerDependencies: @@ -9458,7 +9462,7 @@ packages: resolution: {integrity: sha512-Yf0UpAaONjed+8PTt5NM/GG4Z4Ai4m1qfT7bqevjnkwRQ12K+0jxtRomirz+VJx4PokpA2St1ZSD1iMkZTqPRQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - multiformats: 12.1.2 + multiformats: 12.1.3 murmurhash3js-revisited: 3.0.0 dev: false @@ -9563,6 +9567,7 @@ packages: resolution: {integrity: sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==} dependencies: '@noble/hashes': 1.3.0 + dev: true /@noble/curves@1.1.0: resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} @@ -9574,7 +9579,6 @@ packages: resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} dependencies: '@noble/hashes': 1.3.2 - dev: false /@noble/ed25519@1.7.3: resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} @@ -9585,6 +9589,7 @@ packages: /@noble/hashes@1.3.0: resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} + dev: true /@noble/hashes@1.3.1: resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} @@ -9594,7 +9599,6 @@ packages: /@noble/hashes@1.3.2: resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} - dev: false /@noble/secp256k1@1.7.1: resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} @@ -9617,32 +9621,32 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@nomicfoundation/ethereumjs-block@5.0.0: - resolution: {integrity: sha512-DfhVbqM5DjriguuSv6r3TgOpyXC76oX8D/VEODsSwJQ1bZGqu4xLLfYPPTacpCAYOnewzJsZli+Ao9TBTAo2uw==} + /@nomicfoundation/ethereumjs-block@5.0.2: + resolution: {integrity: sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.0 - '@nomicfoundation/ethereumjs-rlp': 5.0.0 - '@nomicfoundation/ethereumjs-trie': 6.0.0 - '@nomicfoundation/ethereumjs-tx': 5.0.0 - '@nomicfoundation/ethereumjs-util': 9.0.0 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 ethereum-cryptography: 0.1.3 ethers: 5.7.2 transitivePeerDependencies: - bufferutil - utf-8-validate - /@nomicfoundation/ethereumjs-blockchain@7.0.0: - resolution: {integrity: sha512-cVRCrXZminZr0Mbx2hm0/109GZLn1v5bf0/k+SIbGn50yZm6YCdQt9CgGT0Gk56N2vy8NhXD4apo167m4LWk6Q==} + /@nomicfoundation/ethereumjs-blockchain@7.0.2: + resolution: {integrity: sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.0 - '@nomicfoundation/ethereumjs-common': 4.0.0 - '@nomicfoundation/ethereumjs-ethash': 3.0.0 - '@nomicfoundation/ethereumjs-rlp': 5.0.0 - '@nomicfoundation/ethereumjs-trie': 6.0.0 - '@nomicfoundation/ethereumjs-tx': 5.0.0 - '@nomicfoundation/ethereumjs-util': 9.0.0 + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-ethash': 3.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 abstract-level: 1.0.3 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 @@ -9654,19 +9658,19 @@ packages: - supports-color - utf-8-validate - /@nomicfoundation/ethereumjs-common@4.0.0: - resolution: {integrity: sha512-UPpm5FAGAf2B6hQ8aVgO44Rdo0k73oMMCViqNJcKMlk1s9l3rxwuPTp1l20NiGvNO2Pzqk3chFL+BzmLL2g4wQ==} + /@nomicfoundation/ethereumjs-common@4.0.2: + resolution: {integrity: sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==} dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.0 + '@nomicfoundation/ethereumjs-util': 9.0.2 crc-32: 1.2.2 - /@nomicfoundation/ethereumjs-ethash@3.0.0: - resolution: {integrity: sha512-6zNv5Y3vNIsxjrsbKjMInVpo8cmR0c7yjZbBpy7NYuIMtm0JKhQoXsiFN56t/1sfn9V3v0wgrkAixo5v6bahpA==} + /@nomicfoundation/ethereumjs-ethash@3.0.2: + resolution: {integrity: sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.0 - '@nomicfoundation/ethereumjs-rlp': 5.0.0 - '@nomicfoundation/ethereumjs-util': 9.0.0 + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 abstract-level: 1.0.3 bigint-crypto-utils: 3.3.0 ethereum-cryptography: 0.1.3 @@ -9674,14 +9678,14 @@ packages: - bufferutil - utf-8-validate - /@nomicfoundation/ethereumjs-evm@2.0.0: - resolution: {integrity: sha512-D+tr3M9sictopr3E20OVgme7YF/d0fU566WKh+ofXwmxapz/Dd8RSLSaVeKgfCI2BkzVA+XqXY08NNCV8w8fWA==} + /@nomicfoundation/ethereumjs-evm@2.0.2: + resolution: {integrity: sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==} engines: {node: '>=14'} dependencies: '@ethersproject/providers': 5.7.2 - '@nomicfoundation/ethereumjs-common': 4.0.0 - '@nomicfoundation/ethereumjs-tx': 5.0.0 - '@nomicfoundation/ethereumjs-util': 9.0.0 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 mcl-wasm: 0.7.9 @@ -9691,16 +9695,16 @@ packages: - supports-color - utf-8-validate - /@nomicfoundation/ethereumjs-rlp@5.0.0: - resolution: {integrity: sha512-U1A0y330PtGb8Wft4yPVv0myWYJTesi89ItGoB0ICdqz7793KmUhpfQb2vJUXBi98wSdnxkIABO/GmsQvGKVDw==} + /@nomicfoundation/ethereumjs-rlp@5.0.2: + resolution: {integrity: sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==} engines: {node: '>=14'} hasBin: true - /@nomicfoundation/ethereumjs-statemanager@2.0.0: - resolution: {integrity: sha512-tgXtsx8yIDlxWMN+ThqPtGK0ITAuITrDy+GYIgGrnT6ZtelvXWM7SUYR0Mcv578lmGCoIwyHFtSBqOkOBYHLjw==} + /@nomicfoundation/ethereumjs-statemanager@2.0.2: + resolution: {integrity: sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==} dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.0 - '@nomicfoundation/ethereumjs-rlp': 5.0.0 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 ethers: 5.7.2 @@ -9710,51 +9714,51 @@ packages: - supports-color - utf-8-validate - /@nomicfoundation/ethereumjs-trie@6.0.0: - resolution: {integrity: sha512-YqPWiNxrZvL+Ef7KHqgru1IlaIGXhu78wd2fxNFOvi/NAQBF845dVfTKKXs1L9x0QBRRQRephgxHCKMuISGppw==} + /@nomicfoundation/ethereumjs-trie@6.0.2: + resolution: {integrity: sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.0 - '@nomicfoundation/ethereumjs-util': 9.0.0 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 '@types/readable-stream': 2.3.15 ethereum-cryptography: 0.1.3 readable-stream: 3.6.2 - /@nomicfoundation/ethereumjs-tx@5.0.0: - resolution: {integrity: sha512-LTyxI+zBJ+HuEBblUGbxvfKl1hg1uJlz2XhnszNagiBWQSgLb1vQCa1QaXV5Q8cUDYkr/Xe4NXWiUGEvH4e6lA==} + /@nomicfoundation/ethereumjs-tx@5.0.2: + resolution: {integrity: sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==} engines: {node: '>=14'} dependencies: '@chainsafe/ssz': 0.9.4 '@ethersproject/providers': 5.7.2 - '@nomicfoundation/ethereumjs-common': 4.0.0 - '@nomicfoundation/ethereumjs-rlp': 5.0.0 - '@nomicfoundation/ethereumjs-util': 9.0.0 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 ethereum-cryptography: 0.1.3 transitivePeerDependencies: - bufferutil - utf-8-validate - /@nomicfoundation/ethereumjs-util@9.0.0: - resolution: {integrity: sha512-9EG98CsEC9BnI7AY27F4QXZ8Vf0re8R9XoxQ0//KWF+B7quu6GQvgTq1RlNUjGh/XNCCJNf8E3LOY9ULR85wFQ==} + /@nomicfoundation/ethereumjs-util@9.0.2: + resolution: {integrity: sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==} engines: {node: '>=14'} dependencies: '@chainsafe/ssz': 0.10.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.0 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 ethereum-cryptography: 0.1.3 - /@nomicfoundation/ethereumjs-vm@7.0.0: - resolution: {integrity: sha512-eHkEoe/4r4+g+fZyIIlQjBHEjCPFs8CHiIEEMvMfvFrV4hyHnuTg4LH7l92ok7TGZqpWxgMG2JOEUFkNsXrKuQ==} + /@nomicfoundation/ethereumjs-vm@7.0.2: + resolution: {integrity: sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.0 - '@nomicfoundation/ethereumjs-blockchain': 7.0.0 - '@nomicfoundation/ethereumjs-common': 4.0.0 - '@nomicfoundation/ethereumjs-evm': 2.0.0 - '@nomicfoundation/ethereumjs-rlp': 5.0.0 - '@nomicfoundation/ethereumjs-statemanager': 2.0.0 - '@nomicfoundation/ethereumjs-trie': 6.0.0 - '@nomicfoundation/ethereumjs-tx': 5.0.0 - '@nomicfoundation/ethereumjs-util': 9.0.0 + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-blockchain': 7.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-evm': 2.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-statemanager': 2.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 mcl-wasm: 0.7.9 @@ -9764,78 +9768,106 @@ packages: - supports-color - utf-8-validate - /@nomicfoundation/hardhat-chai-matchers@1.0.6(@nomiclabs/hardhat-ethers@2.2.3)(chai@4.3.10)(ethers@5.7.2)(hardhat@2.13.1): - resolution: {integrity: sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==} + /@nomicfoundation/hardhat-chai-matchers@2.0.2(@nomicfoundation/hardhat-ethers@3.0.4)(chai@4.3.10)(ethers@6.8.0)(hardhat@2.18.3): + resolution: {integrity: sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==} peerDependencies: - '@nomiclabs/hardhat-ethers': ^2.0.0 + '@nomicfoundation/hardhat-ethers': ^3.0.0 chai: ^4.2.0 - ethers: ^5.7.2 + ethers: ^6.1.0 hardhat: ^2.9.4 dependencies: - '@ethersproject/abi': 5.7.0 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.13.1) + '@nomicfoundation/hardhat-ethers': 3.0.4(ethers@6.8.0)(hardhat@2.18.3) '@types/chai-as-promised': 7.1.7 chai: 4.3.10 chai-as-promised: 7.1.1(chai@4.3.10) deep-eql: 4.1.3 - ethers: 5.7.2 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + ethers: 6.8.0 + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) ordinal: 1.0.3 dev: true - /@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.13.1): + /@nomicfoundation/hardhat-ethers@3.0.4(ethers@6.8.0)(hardhat@2.18.3): + resolution: {integrity: sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==} + peerDependencies: + ethers: ^6.1.0 + hardhat: ^2.0.0 + dependencies: + debug: 4.3.4(supports-color@8.1.1) + ethers: 6.8.0 + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.18.3): resolution: {integrity: sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==} peerDependencies: hardhat: ^2.9.5 dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) dev: true - /@nomicfoundation/hardhat-toolbox@2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(@typechain/ethers-v5@11.1.2)(@typechain/hardhat@9.1.0)(@types/chai@4.3.9)(@types/mocha@9.1.0)(@types/node@18.18.6)(chai@4.3.10)(ethers@5.7.2)(hardhat-gas-reporter@1.0.9)(hardhat@2.13.1)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.2)(typescript@4.9.5): - resolution: {integrity: sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==} + /@nomicfoundation/hardhat-toolbox@3.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.2)(@nomicfoundation/hardhat-ethers@3.0.4)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomicfoundation/hardhat-verify@1.1.1)(@typechain/ethers-v6@0.4.3)(@typechain/hardhat@8.0.3)(@types/chai@4.3.9)(@types/mocha@9.1.0)(@types/node@18.18.7)(chai@4.3.10)(ethers@6.8.0)(hardhat-gas-reporter@1.0.9)(hardhat@2.18.3)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.2)(typescript@4.9.5): + resolution: {integrity: sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==} peerDependencies: - '@ethersproject/abi': ^5.4.7 - '@ethersproject/providers': ^5.4.7 - '@nomicfoundation/hardhat-chai-matchers': ^1.0.0 + '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 + '@nomicfoundation/hardhat-ethers': ^3.0.0 '@nomicfoundation/hardhat-network-helpers': ^1.0.0 - '@nomiclabs/hardhat-ethers': ^2.0.0 - '@nomiclabs/hardhat-etherscan': ^3.0.0 - '@typechain/ethers-v5': ^10.1.0 - '@typechain/hardhat': ^6.1.2 + '@nomicfoundation/hardhat-verify': ^1.0.0 + '@typechain/ethers-v6': ^0.4.0 + '@typechain/hardhat': ^8.0.0 '@types/chai': ^4.2.0 '@types/mocha': '>=9.1.0' '@types/node': '>=12.0.0' chai: ^4.2.0 - ethers: ^5.7.2 + ethers: ^6.4.0 hardhat: ^2.11.0 hardhat-gas-reporter: ^1.0.8 solidity-coverage: ^0.8.1 ts-node: '>=8.0.0' - typechain: ^8.1.0 + typechain: ^8.2.0 typescript: '>=4.5.0' dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - '@nomicfoundation/hardhat-chai-matchers': 1.0.6(@nomiclabs/hardhat-ethers@2.2.3)(chai@4.3.10)(ethers@5.7.2)(hardhat@2.13.1) - '@nomicfoundation/hardhat-network-helpers': 1.0.9(hardhat@2.13.1) - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.13.1) - '@nomiclabs/hardhat-etherscan': 3.1.7(hardhat@2.13.1) - '@typechain/ethers-v5': 11.1.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2) + '@nomicfoundation/hardhat-chai-matchers': 2.0.2(@nomicfoundation/hardhat-ethers@3.0.4)(chai@4.3.10)(ethers@6.8.0)(hardhat@2.18.3) + '@nomicfoundation/hardhat-ethers': 3.0.4(ethers@6.8.0)(hardhat@2.18.3) + '@nomicfoundation/hardhat-network-helpers': 1.0.9(hardhat@2.18.3) + '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.18.3) + '@typechain/ethers-v6': 0.4.3(ethers@6.8.0)(typechain@8.3.2)(typescript@4.9.5) + '@typechain/hardhat': 8.0.3(@typechain/ethers-v6@0.4.3)(ethers@6.8.0)(hardhat@2.18.3)(typechain@8.3.2) '@types/chai': 4.3.9 '@types/mocha': 9.1.0 - '@types/node': 18.18.6 + '@types/node': 18.18.7 chai: 4.3.10 - ethers: 5.7.2 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) - hardhat-gas-reporter: 1.0.9(hardhat@2.13.1) - solidity-coverage: 0.8.5(hardhat@2.13.1) - ts-node: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + ethers: 6.8.0 + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) + hardhat-gas-reporter: 1.0.9(hardhat@2.18.3) + solidity-coverage: 0.8.5(hardhat@2.18.3) + ts-node: 10.9.1(@types/node@18.18.7)(typescript@4.9.5) typechain: 8.3.2(typescript@4.9.5) typescript: 4.9.5 dev: true + /@nomicfoundation/hardhat-verify@1.1.1(hardhat@2.18.3): + resolution: {integrity: sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA==} + peerDependencies: + hardhat: ^2.0.4 + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.7.0 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.3.4(supports-color@8.1.1) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) + lodash.clonedeep: 4.5.0 + semver: 6.3.1 + table: 6.8.1 + undici: 5.26.5 + transitivePeerDependencies: + - supports-color + dev: true + /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1: resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} engines: {node: '>= 10'} @@ -9931,36 +9963,6 @@ packages: '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 - /@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.13.1): - resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==} - peerDependencies: - ethers: ^5.7.2 - hardhat: ^2.0.0 - dependencies: - ethers: 5.7.2 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) - dev: true - - /@nomiclabs/hardhat-etherscan@3.1.7(hardhat@2.13.1): - resolution: {integrity: sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==} - peerDependencies: - hardhat: ^2.0.4 - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.7.0 - cbor: 8.1.0 - chalk: 2.4.2 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 7.0.1 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) - lodash: 4.17.21 - semver: 6.3.1 - table: 6.8.1 - undici: 5.26.5 - transitivePeerDependencies: - - supports-color - dev: true - /@observablehq/inspector@5.0.0: resolution: {integrity: sha512-Vvg/TQdsZTUaeYbH0IKxYEz37FbRO6kdowoz2PrHLQif54NC1CjEihEjg+ZMSBn587GQxTFABu0CGkFZgtR1UQ==} dependencies: @@ -9983,7 +9985,7 @@ packages: d3-require: 1.3.0 dev: false - /@oclif/core@2.15.0(@types/node@18.18.6)(typescript@4.9.5): + /@oclif/core@2.15.0(@types/node@18.18.7)(typescript@4.9.5): resolution: {integrity: sha512-fNEMG5DzJHhYmI3MgpByTvltBOMyFcnRIUMxbiz2ai8rhaYgaTHMG3Q38HcosfIvtw9nCjxpcQtC8MN8QtVCcA==} engines: {node: '>=14.0.0'} dependencies: @@ -10010,7 +10012,7 @@ packages: strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 - ts-node: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + ts-node: 10.9.1(@types/node@18.18.7)(typescript@4.9.5) tslib: 2.6.2 widest-line: 3.1.0 wordwrap: 1.0.0 @@ -10022,7 +10024,7 @@ packages: - typescript dev: true - /@oclif/core@2.8.6(@types/node@18.18.6)(typescript@4.9.5): + /@oclif/core@2.8.6(@types/node@18.18.7)(typescript@4.9.5): resolution: {integrity: sha512-1QlPaHMhOORySCXkQyzjsIsy2GYTilOw3LkjeHkCgsPJQjAT4IclVytJusWktPbYNys9O+O4V23J44yomQvnBQ==} engines: {node: '>=14.0.0'} dependencies: @@ -10050,7 +10052,7 @@ packages: strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 - ts-node: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + ts-node: 10.9.1(@types/node@18.18.7)(typescript@4.9.5) tslib: 2.6.2 widest-line: 3.1.0 wordwrap: 1.0.0 @@ -10062,11 +10064,11 @@ packages: - typescript dev: true - /@oclif/plugin-autocomplete@2.3.10(@types/node@18.18.6)(typescript@4.9.5): + /@oclif/plugin-autocomplete@2.3.10(@types/node@18.18.7)(typescript@4.9.5): resolution: {integrity: sha512-Ow1AR8WtjzlyCtiWWPgzMyT8SbcDJFr47009riLioHa+MHX2BCDtVn2DVnN/E6b9JlPV5ptQpjefoRSNWBesmg==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.15.0(@types/node@18.18.6)(typescript@4.9.5) + '@oclif/core': 2.15.0(@types/node@18.18.7)(typescript@4.9.5) chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: @@ -10077,11 +10079,11 @@ packages: - typescript dev: true - /@oclif/plugin-not-found@2.4.3(@types/node@18.18.6)(typescript@4.9.5): + /@oclif/plugin-not-found@2.4.3(@types/node@18.18.7)(typescript@4.9.5): resolution: {integrity: sha512-nIyaR4y692frwh7wIHZ3fb+2L6XEecQwRDIb4zbEam0TvaVmBQWZoColQyWA84ljFBPZ8XWiQyTz+ixSwdRkqg==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.15.0(@types/node@18.18.6)(typescript@4.9.5) + '@oclif/core': 2.15.0(@types/node@18.18.7)(typescript@4.9.5) chalk: 4.1.2 fast-levenshtein: 3.0.0 transitivePeerDependencies: @@ -10091,14 +10093,26 @@ packages: - typescript dev: true - /@open-draft/until@1.0.3: - resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} + /@openzeppelin/contracts-upgradeable@4.7.3: + resolution: {integrity: sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A==} + dev: true + + /@openzeppelin/contracts@3.4.2: + resolution: {integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==} + dev: true + + /@openzeppelin/contracts@4.3.3: + resolution: {integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==} + dev: true + + /@openzeppelin/contracts@4.9.3: + resolution: {integrity: sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==} dev: true - /@openzeppelin/defender-admin-client@1.49.0: - resolution: {integrity: sha512-ka+GTbsnGO6j1R2AGj027uu29es/EBVs3VjJStb+7u/1lNhx1xSRS11JBD0a0GNhrwqsKU4czIemlIKMlUzhhQ==} + /@openzeppelin/defender-admin-client@1.50.0(debug@4.3.4): + resolution: {integrity: sha512-JxeA111ifCIzXho2gFymhepufB0ElI1UMvFIMEfJLvRL7g7V69wSiN8v+OqZyqZTahiY32Rb+TwdhVjKF5Zu+A==} dependencies: - '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4) + '@openzeppelin/defender-base-client': 1.50.0(debug@4.3.4) axios: 1.5.1(debug@4.3.4) ethers: 5.7.2 lodash: 4.17.21 @@ -10110,11 +10124,11 @@ packages: - utf-8-validate dev: true - /@openzeppelin/defender-autotask-client@1.49.0: - resolution: {integrity: sha512-FhqFB/E0jaDNEgx0WklodpRS2RPfE181+kwtGL23a8uzGiyQRs7+Ia/a8ARGaLEqD9gWwAte6ODiqZAaim7/jg==} + /@openzeppelin/defender-autotask-client@1.50.0: + resolution: {integrity: sha512-QWob3F6xuOu8r8oPy0Y2XLfAL1PTuKE2F4nC4wGeu3JJT8/pJz3xnHX5DgUYwiGIMqnkitUNUoBcmi4CPI31yw==} hasBin: true dependencies: - '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4) + '@openzeppelin/defender-base-client': 1.50.0(debug@4.3.4) axios: 1.5.1(debug@4.3.4) dotenv: 10.0.0 glob: 7.2.3 @@ -10126,8 +10140,8 @@ packages: - encoding dev: false - /@openzeppelin/defender-autotask-utils@1.49.0: - resolution: {integrity: sha512-rJls6HOuddBsPJwbSmIN/nugdIsgdrwzgpVJC/hxv+amu0HsSkrH26LbcoDig7Eb2dp68Avtmo0EOyAUP1bNGA==} + /@openzeppelin/defender-autotask-utils@1.50.0: + resolution: {integrity: sha512-wuhm5idjsIiC7hdLj+z5ewDmyKx5q0tRXKHp05K9X8uo1CyLdHV2kKZjBrWzGE9qxVhJ79f9PzHZrLcyPHNDOg==} dev: false /@openzeppelin/defender-base-client@1.49.0(debug@4.3.4): @@ -10142,66 +10156,83 @@ packages: - debug - encoding - /@openzeppelin/defender-sentinel-client@1.49.0: - resolution: {integrity: sha512-fr39U1GRWvJP1fWgwqjTYCz7uhfVfXJReWcivwxMeaoyMl+jYFxj8NkMhqkkbmI6O4TUyNMsmAQ34qFf0IS0/A==} + /@openzeppelin/defender-base-client@1.50.0(debug@4.3.4): + resolution: {integrity: sha512-V5uJ4t3kr9ex1RrqGH2DwsHuyW7/hl3VK0sSkq3VVbAewtcsW3cdg/UkXd5ITu6mtz76RoYkvUBHtkYUm0nb+w==} dependencies: - '@ethersproject/abi': 5.7.0 - '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4) + amazon-cognito-identity-js: 6.3.6 + async-retry: 1.3.3 axios: 1.5.1(debug@4.3.4) lodash: 4.17.21 node-fetch: 2.7.0 transitivePeerDependencies: - debug - encoding - dev: false - /@openzeppelin/hardhat-defender@1.9.0(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.13.1): - resolution: {integrity: sha512-dl2pQyBvwEZVq1sgw/i+mLQiu4ZD7iKn2/ghD9RbAGHIM8hZQ4ou8cXl1S6wCA92prpeO1rPGQ+NcJajbY4MCw==} - deprecated: '@openzeppelin/hardhat-defender is deprecated. This functionality is now included as part of @openzeppelin/hardhat-upgrades' + /@openzeppelin/defender-sdk-base-client@1.3.0: + resolution: {integrity: sha512-OMMt7NaAL8C95ralF9nMeKZpg96COLZT9FPpGpPsI7aB8fVZfCM8+6k99gTF44hMS6IsRdN2WthS3m7VzQeeoA==} dependencies: - '@openzeppelin/defender-admin-client': 1.49.0 - '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4) - '@openzeppelin/hardhat-upgrades': 1.28.0(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.13.1) - ethereumjs-util: 7.1.5 + amazon-cognito-identity-js: 6.3.6 + async-retry: 1.3.3 + transitivePeerDependencies: + - encoding + dev: true + + /@openzeppelin/defender-sdk-deploy-client@1.3.0(debug@4.3.4): + resolution: {integrity: sha512-RTYM3HnVvD2d5NoYfTug8UwT41e0Jjwb13lk9v0Jl8z7mcclUVvAnKD4DHJ4b8RhKpg4B15oLQK/Igzjg1HHRA==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@openzeppelin/defender-sdk-base-client': 1.3.0 + axios: 1.5.1(debug@4.3.4) + lodash: 4.17.21 transitivePeerDependencies: - - '@nomiclabs/hardhat-ethers' - - '@nomiclabs/hardhat-etherscan' - - '@nomiclabs/harhdat-etherscan' - - bufferutil - debug - encoding - - ethers - - hardhat - - supports-color - - utf-8-validate dev: true - /@openzeppelin/hardhat-upgrades@1.28.0(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.13.1): - resolution: {integrity: sha512-7sb/Jf+X+uIufOBnmHR0FJVWuxEs2lpxjJnLNN6eCJCP8nD0v+Ot5lTOW2Qb/GFnh+fLvJtEkhkowz4ZQ57+zQ==} + /@openzeppelin/defender-sentinel-client@1.49.0: + resolution: {integrity: sha512-fr39U1GRWvJP1fWgwqjTYCz7uhfVfXJReWcivwxMeaoyMl+jYFxj8NkMhqkkbmI6O4TUyNMsmAQ34qFf0IS0/A==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4) + axios: 1.5.1(debug@4.3.4) + lodash: 4.17.21 + node-fetch: 2.7.0 + transitivePeerDependencies: + - debug + - encoding + dev: false + + /@openzeppelin/hardhat-upgrades@2.3.3(@nomicfoundation/hardhat-ethers@3.0.4)(@nomicfoundation/hardhat-verify@1.1.1)(ethers@6.8.0)(hardhat@2.18.3): + resolution: {integrity: sha512-rF87xYSz6Q2WFq5zcUF1T1tx3Kiq83hmke0xOBn5Qgrl++osseiDwS5oXfDK3NSWvj06oYGLERRGHcXnpQ31FQ==} hasBin: true peerDependencies: - '@nomiclabs/hardhat-ethers': ^2.0.0 - '@nomiclabs/hardhat-etherscan': ^3.1.0 - '@nomiclabs/harhdat-etherscan': '*' - ethers: ^5.7.2 + '@nomicfoundation/hardhat-ethers': ^3.0.0 + '@nomicfoundation/hardhat-verify': ^1.1.0 + ethers: ^6.6.0 hardhat: ^2.0.2 peerDependenciesMeta: - '@nomiclabs/harhdat-etherscan': + '@nomicfoundation/hardhat-verify': optional: true dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.13.1) - '@nomiclabs/hardhat-etherscan': 3.1.7(hardhat@2.13.1) + '@nomicfoundation/hardhat-ethers': 3.0.4(ethers@6.8.0)(hardhat@2.18.3) + '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.18.3) + '@openzeppelin/defender-admin-client': 1.50.0(debug@4.3.4) '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4) - '@openzeppelin/platform-deploy-client': 0.8.0(debug@4.3.4) + '@openzeppelin/defender-sdk-base-client': 1.3.0 + '@openzeppelin/defender-sdk-deploy-client': 1.3.0(debug@4.3.4) '@openzeppelin/upgrades-core': 1.31.0 chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) - ethers: 5.7.2 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + ethereumjs-util: 7.1.5 + ethers: 6.8.0 + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) proper-lockfile: 4.1.2 + undici: 5.26.5 transitivePeerDependencies: + - bufferutil - encoding - supports-color + - utf-8-validate dev: true /@openzeppelin/merkle-tree@1.0.5: @@ -10211,20 +10242,6 @@ packages: ethereum-cryptography: 1.2.0 dev: false - /@openzeppelin/platform-deploy-client@0.8.0(debug@4.3.4): - resolution: {integrity: sha512-POx3AsnKwKSV/ZLOU/gheksj0Lq7Is1q2F3pKmcFjGZiibf+4kjGxr4eSMrT+2qgKYZQH1ZLQZ+SkbguD8fTvA==} - deprecated: '@openzeppelin/platform-deploy-client is deprecated. Please use @openzeppelin/defender-sdk-deploy-client' - dependencies: - '@ethersproject/abi': 5.7.0 - '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4) - axios: 0.21.4(debug@4.3.4) - lodash: 4.17.21 - node-fetch: 2.7.0 - transitivePeerDependencies: - - debug - - encoding - dev: true - /@openzeppelin/upgrades-core@1.31.0: resolution: {integrity: sha512-E1Cz8lVpo2mnBeFWxiGDLWtuTYMFNTEWwbnhle4dZ+5UHX6xTRO+Q/CaWBHm33HHhuuiUbRwgGNnAR9zOu+fyQ==} hasBin: true @@ -10426,13 +10443,13 @@ packages: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@primitivefi/hardhat-dodoc@0.2.3(hardhat@2.13.1)(squirrelly@8.0.8): + /@primitivefi/hardhat-dodoc@0.2.3(hardhat@2.18.3)(squirrelly@8.0.8): resolution: {integrity: sha512-ver9uHa79LTDTeebOKZ/eOVRL/FP1k0s0x/5Bo/8ZaDdLWFVClKqZyZYVjjW4CJqTPCt8uU9b9p71P2vzH4O9A==} peerDependencies: hardhat: ^2.6.4 squirrelly: ^8.0.8 dependencies: - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) squirrelly: 8.0.8 dev: true @@ -10469,25 +10486,27 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - /@rainbow-me/rainbowkit@1.0.8(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0)(viem@1.5.3)(wagmi@1.3.9): - resolution: {integrity: sha512-m1B9/X3p8MLmj4fDfs2NpJlFRmKz7vOR0jmcdBw2SMFzXqP1FQFQc4pjvtLEeyfEUGSNNceGrecFZRVS0Qk//A==} + /@rainbow-me/rainbowkit@1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.4)(wagmi@1.4.5): + resolution: {integrity: sha512-XjdeX31GwFdRR/1rCRqPXiO94nbq2qOlnaox5P4K/KMRIUwyelKzak27uWw8Krmor/Hcrd5FisfepGDS0tUfEA==} engines: {node: '>=12.4'} peerDependencies: react: '>=17' react-dom: '>=17' viem: ~0.3.19 || ^1.0.0 - wagmi: ~1.0.1 || ~1.1.0 || ~1.2.0 || ~1.3.0 + wagmi: ~1.0.1 || ~1.1.0 || ~1.2.0 || ~1.3.0 || ~1.4.0 dependencies: '@vanilla-extract/css': 1.9.1 '@vanilla-extract/dynamic': 2.0.2 '@vanilla-extract/sprinkles': 1.5.0(@vanilla-extract/css@1.9.1) clsx: 1.1.1 + i18n-js: 4.3.2 qrcode: 1.5.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.4(@types/react@18.2.31)(react@18.2.0) - viem: 1.5.3(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.3.9(@types/react@18.2.31)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) + react-remove-scroll: 2.5.4(@types/react@18.2.33)(react@18.2.0) + ua-parser-js: 1.0.36 + viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) transitivePeerDependencies: - '@types/react' dev: false @@ -11026,7 +11045,7 @@ packages: resolution: {integrity: sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.12.0 - viem: 1.5.3(typescript@5.1.6)(zod@3.22.4) + viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -11038,7 +11057,7 @@ packages: resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.12.0 - viem: 1.5.3(typescript@5.1.6)(zod@3.22.4) + viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -11065,17 +11084,26 @@ packages: resolution: {integrity: sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==} dependencies: '@noble/curves': 1.0.0 - '@noble/hashes': 1.3.0 + '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 + dev: true /@scure/bip32@1.3.1: resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} dependencies: '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.1 + '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 dev: true + /@scure/bip32@1.3.2: + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + dependencies: + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 + dev: false + /@scure/bip39@1.1.1: resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} dependencies: @@ -11085,36 +11113,34 @@ packages: /@scure/bip39@1.2.0: resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==} dependencies: - '@noble/hashes': 1.3.0 + '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 + dev: true /@scure/bip39@1.2.1: resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} dependencies: - '@noble/hashes': 1.3.1 + '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 - dev: true - /@sentry-internal/tracing@7.74.1: - resolution: {integrity: sha512-nNaiZreQxCitG2PzYPaC7XtyA9OMsETGYMKAtiK4p62/uTmeYbsBva9BoNx1XeiHRwbrVQYRMKQ9nV5e2jS4/A==} + /@sentry-internal/tracing@7.75.1: + resolution: {integrity: sha512-nynV+7iVcF8k3CqhvI2K7iA8h4ovJhgYHKnXR8RDDevQOqNG2AEX9+hjCj9fZM4MhKHYFqf1od2oO9lTr38kwg==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.74.1 - '@sentry/types': 7.74.1 - '@sentry/utils': 7.74.1 - tslib: 2.6.2 + '@sentry/core': 7.75.1 + '@sentry/types': 7.75.1 + '@sentry/utils': 7.75.1 dev: false - /@sentry/browser@7.74.1: - resolution: {integrity: sha512-OYWNne/KO60lOvkIpIlJUyiJt/9j8DGI57thSDFEYSmmbNqMitczUTBOaEStouvHKyfchqLZm1CZfWKt+z0VOA==} + /@sentry/browser@7.75.1: + resolution: {integrity: sha512-0+jPfPA5P9HVYYRQraDokGCY2NiMknSfz11dggClK4VmjvG+hOXiEyf73SFVwLFnv/hwrkWySjoIrVCX65xXQA==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.74.1 - '@sentry/core': 7.74.1 - '@sentry/replay': 7.74.1 - '@sentry/types': 7.74.1 - '@sentry/utils': 7.74.1 - tslib: 2.6.2 + '@sentry-internal/tracing': 7.75.1 + '@sentry/core': 7.75.1 + '@sentry/replay': 7.75.1 + '@sentry/types': 7.75.1 + '@sentry/utils': 7.75.1 dev: false /@sentry/cli@1.75.2: @@ -11160,13 +11186,12 @@ packages: '@sentry/utils': 5.30.0 tslib: 1.14.1 - /@sentry/core@7.74.1: - resolution: {integrity: sha512-LvEhOSfdIvwkr+PdlrT/aA/iOLhkXrSkvjqAQyogE4ddCWeYfS0NoirxNt1EaxMBAWKhYZRqzkA7WA4LDLbzlA==} + /@sentry/core@7.75.1: + resolution: {integrity: sha512-Kw4KyKBxbxbh8OKO0S11Tm0gWP+6AaXXYrsq3hp8H338l/wOmIzyckmCbUrc/XJeoRqaFLJbdcCrcUEDZUvsVQ==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.74.1 - '@sentry/utils': 7.74.1 - tslib: 2.6.2 + '@sentry/types': 7.75.1 + '@sentry/utils': 7.75.1 dev: false /@sentry/hub@5.30.0: @@ -11177,15 +11202,14 @@ packages: '@sentry/utils': 5.30.0 tslib: 1.14.1 - /@sentry/integrations@7.74.1: - resolution: {integrity: sha512-Q7chPehHpHB4WOQ1J/X6NiN2ptiqJMmxtL+6wHumzIAyrjup3c9XekR83qEs8zpqYJAlb/4MUlwd9fPbkhGXnQ==} + /@sentry/integrations@7.75.1: + resolution: {integrity: sha512-qSCyTNX3DiL1aYRmdq10LRhPLfh1KJYKhbmGszC1PII4mt9FbLVmC8fSXiDbhgiuSUKKrDE+J2lC//w688lvHw==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.74.1 - '@sentry/types': 7.74.1 - '@sentry/utils': 7.74.1 + '@sentry/core': 7.75.1 + '@sentry/types': 7.75.1 + '@sentry/utils': 7.75.1 localforage: 1.10.0 - tslib: 2.6.2 dev: false /@sentry/minimal@5.30.0: @@ -11196,8 +11220,8 @@ packages: '@sentry/types': 5.30.0 tslib: 1.14.1 - /@sentry/nextjs@7.74.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0): - resolution: {integrity: sha512-1RySEs3WBEqlpQCAFQ/XwV+oW4wEAtpYglvAyDBwPen/s6KnkkZ0za0l3Ug0O6S9HvMiNll1rPhvnkH5nM37Tg==} + /@sentry/nextjs@7.75.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0): + resolution: {integrity: sha512-5DEW6Ksjuox8idf3O0NclF/rHSS0Z1VCIoFHW6d28FHFKU+/RkFwJTB13KfpQMBj1fiA9qSNJdy/2QlGUWVRmA==} engines: {node: '>=8'} peerDependencies: next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 @@ -11208,13 +11232,13 @@ packages: optional: true dependencies: '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) - '@sentry/core': 7.74.1 - '@sentry/integrations': 7.74.1 - '@sentry/node': 7.74.1 - '@sentry/react': 7.74.1(react@18.2.0) - '@sentry/types': 7.74.1 - '@sentry/utils': 7.74.1 - '@sentry/vercel-edge': 7.74.1 + '@sentry/core': 7.75.1 + '@sentry/integrations': 7.75.1 + '@sentry/node': 7.75.1 + '@sentry/react': 7.75.1(react@18.2.0) + '@sentry/types': 7.75.1 + '@sentry/utils': 7.75.1 + '@sentry/vercel-edge': 7.75.1 '@sentry/webpack-plugin': 1.20.0 chalk: 3.0.0 next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) @@ -11222,7 +11246,6 @@ packages: resolve: 1.22.8 rollup: 2.78.0 stacktrace-parser: 0.1.10 - tslib: 2.6.2 webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - encoding @@ -11245,43 +11268,40 @@ packages: transitivePeerDependencies: - supports-color - /@sentry/node@7.74.1: - resolution: {integrity: sha512-aMUQ2LFZF64FBr+cgjAqjT4OkpYBIC9lyWI8QqjEHqNho5+LGu18/iVrJPD4fgs4UhGdCuAiQjpC36MbmnIDZA==} + /@sentry/node@7.75.1: + resolution: {integrity: sha512-E174NbP3j7OIqQQYPtpMGz1FfL/KE5PeGnhoACyMIk0D5MGB7Ia7Y9+nYfHB7+EOJPV2Ob6BYlhemX/MxPrYWg==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.74.1 - '@sentry/core': 7.74.1 - '@sentry/types': 7.74.1 - '@sentry/utils': 7.74.1 - cookie: 0.5.0 + '@sentry-internal/tracing': 7.75.1 + '@sentry/core': 7.75.1 + '@sentry/types': 7.75.1 + '@sentry/utils': 7.75.1 https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 2.6.2 transitivePeerDependencies: - supports-color dev: false - /@sentry/react@7.74.1(react@18.2.0): - resolution: {integrity: sha512-16oTsNi2hl/S5AL/e5bo9DQZDwXPkX0nC8ajrpU0z2pH4cwjQZUZt/9Xq1+MKqDIEZkqDcMwpTmBptOvy1Pvkw==} + /@sentry/react@7.75.1(react@18.2.0): + resolution: {integrity: sha512-5zFcIor8vwQa13VRwk7yDE8U7uspj0eKpsjOcYcfSvDkiL7LW0sA6rXxvO3jwd1AKaB3EAfr1F4oIdEz8aRIkA==} engines: {node: '>=8'} peerDependencies: react: 15.x || 16.x || 17.x || 18.x dependencies: - '@sentry/browser': 7.74.1 - '@sentry/types': 7.74.1 - '@sentry/utils': 7.74.1 + '@sentry/browser': 7.75.1 + '@sentry/types': 7.75.1 + '@sentry/utils': 7.75.1 hoist-non-react-statics: 3.3.2 react: 18.2.0 - tslib: 2.6.2 dev: false - /@sentry/replay@7.74.1: - resolution: {integrity: sha512-qmbOl+jYdyhoHFbPp9WemKx8UojID5hVmuVLxNIP0ANqAwmE9OQEK9YFg2cf7L/TpKb1tqz0qLgi5MYIdcdpgQ==} + /@sentry/replay@7.75.1: + resolution: {integrity: sha512-MKQTDWNYs9QXCJ+irGX5gu8Kxdk/Ds5puhILy8+DnCoXgXuPFRMGob1Sxt8qXmbQmcGeogsx221MNTselsRS6g==} engines: {node: '>=12'} dependencies: - '@sentry/core': 7.74.1 - '@sentry/types': 7.74.1 - '@sentry/utils': 7.74.1 + '@sentry-internal/tracing': 7.75.1 + '@sentry/core': 7.75.1 + '@sentry/types': 7.75.1 + '@sentry/utils': 7.75.1 dev: false /@sentry/tracing@5.30.0: @@ -11298,8 +11318,8 @@ packages: resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} engines: {node: '>=6'} - /@sentry/types@7.74.1: - resolution: {integrity: sha512-2jIuPc+YKvXqZETwr2E8VYnsH1zsSUR/wkIvg1uTVeVNyoowJv+YsOtCdeGyL2AwiotUBSPKu7O1Lz0kq5rMOQ==} + /@sentry/types@7.75.1: + resolution: {integrity: sha512-km+ygqgMDaFfTrbQwdhrptFqx0Oq15jZABqIoIpbaOCkCAMm+tyCqrFS8dTfaq5wpCktqWOy2qU/DOpppO99Cg==} engines: {node: '>=8'} dev: false @@ -11310,22 +11330,20 @@ packages: '@sentry/types': 5.30.0 tslib: 1.14.1 - /@sentry/utils@7.74.1: - resolution: {integrity: sha512-qUsqufuHYcy5gFhLZslLxA5kcEOkkODITXW3c7D+x+8iP/AJqa8v8CeUCVNS7RetHCuIeWAbbTClC4c411EwQg==} + /@sentry/utils@7.75.1: + resolution: {integrity: sha512-QzW2eRjY20epD//9/tQ0FTNwdAL6XZi+LyJNUQIeK3NMnc5NgHrgpxId87gmFq8cNx47utH1Blub8RuMbKqiwQ==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.74.1 - tslib: 2.6.2 + '@sentry/types': 7.75.1 dev: false - /@sentry/vercel-edge@7.74.1: - resolution: {integrity: sha512-E2lTfEtDFSh57EkjVe4EcgcdjOM8UvfZVsmANBqG4bnwRKrNX9GouClzKU2Ckd5vQnOiCH9r8x2aJ/dTqyBswQ==} + /@sentry/vercel-edge@7.75.1: + resolution: {integrity: sha512-TCiObqegXdWkObf0YUDTvAPgGS5rOpRtZKQmjJ03ZahwrSMZTWESvlKo1V/5JhgfZSRWJTvDnJAtomteopT5/A==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.74.1 - '@sentry/types': 7.74.1 - '@sentry/utils': 7.74.1 - tslib: 2.6.2 + '@sentry/core': 7.75.1 + '@sentry/types': 7.75.1 + '@sentry/utils': 7.75.1 dev: false /@sentry/webpack-plugin@1.20.0: @@ -11594,8 +11612,8 @@ packages: '@supabase/node-fetch': 2.6.14 dev: false - /@supabase/realtime-js@2.8.1: - resolution: {integrity: sha512-bka5U4OeoKMdorGMPjdF30cl8n8nbhn+I9H4iySKzbN45W6AGxi7xoODnxdq/QwaDGtVyTMVbU+GVWre0QCdtw==} + /@supabase/realtime-js@2.8.4: + resolution: {integrity: sha512-5C9slLTGikHnYmAnIBOaPogAgbcNY68vnIyE6GpqIKjHElVb6LIi4clwNcjHSj4z6szuvvzj8T/+ePEgGEGekw==} dependencies: '@supabase/node-fetch': 2.6.14 '@types/phoenix': 1.6.3 @@ -11611,14 +11629,14 @@ packages: '@supabase/node-fetch': 2.6.14 dev: false - /@supabase/supabase-js@2.38.2: - resolution: {integrity: sha512-yOCi94oO5WVUBhQ890BvtT7J3p8spP47PMhn22YldIcDLEQWE6N6X2JzfWCLHktXw+oCYUJfQBuqYhyLHAKb0w==} + /@supabase/supabase-js@2.38.3: + resolution: {integrity: sha512-qIQxXZJN42iM41VChBo3kmGNyRhM0LOk27fkTX8A4tHnWxt0zmxMGFKVCX7Qnrz8zttiJkcym/BZreM/F9k0FQ==} dependencies: '@supabase/functions-js': 2.1.5 '@supabase/gotrue-js': 2.57.0 '@supabase/node-fetch': 2.6.14 '@supabase/postgrest-js': 1.8.5 - '@supabase/realtime-js': 2.8.1 + '@supabase/realtime-js': 2.8.4 '@supabase/storage-js': 2.5.4 transitivePeerDependencies: - supports-color @@ -11788,7 +11806,7 @@ packages: engines: {node: '>=14'} hasBin: true dependencies: - '@cypress/code-coverage': 3.12.5(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0) + '@cypress/code-coverage': 3.12.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0) '@cypress/webpack-dev-server': 3.6.1(debug@4.3.4)(webpack@5.89.0) '@drptbl/gremlins.js': 2.2.1 '@foundry-rs/easy-foundryup': 0.1.3 @@ -11812,7 +11830,7 @@ packages: dotenv: 16.3.1 dotenv-parse-variables: 2.0.0 download: 8.0.0 - ethers: 5.7.2 + ethers: 6.8.0 etherscan-api: 10.3.0(debug@4.3.4) find-config: 1.0.0 get-port: 6.1.2 @@ -12015,7 +12033,7 @@ packages: '@babel/parser': 7.18.9 '@babel/traverse': 7.17.3 '@babel/types': 7.17.0 - '@vue/compiler-sfc': 3.3.6 + '@vue/compiler-sfc': 3.3.7 javascript-natural-sort: 0.7.1 lodash: 4.17.21 prettier: 2.8.8 @@ -12061,29 +12079,12 @@ packages: /@tsconfig/node16@1.0.4: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5): - resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} - peerDependencies: - '@ethersproject/abi': ^5.0.0 - '@ethersproject/providers': ^5.0.0 - ethers: ^5.7.2 - typechain: ^8.1.1 - typescript: '>=4.3.0' - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - ethers: 5.7.2 - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@4.9.5) - typechain: 8.3.2(typescript@4.9.5) - typescript: 4.9.5 - /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.1.6): resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} peerDependencies: '@ethersproject/abi': ^5.0.0 '@ethersproject/providers': ^5.0.0 - ethers: ^5.7.2 + ethers: ^5.1.3 typechain: ^8.1.1 typescript: '>=4.3.0' dependencies: @@ -12094,71 +12095,34 @@ packages: ts-essentials: 7.0.3(typescript@5.1.6) typechain: 8.3.2(typescript@5.1.6) typescript: 5.1.6 - dev: false - - /@typechain/ethers-v5@11.1.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5): - resolution: {integrity: sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ==} - peerDependencies: - '@ethersproject/abi': ^5.0.0 - '@ethersproject/providers': ^5.0.0 - ethers: ^5.7.2 - typechain: ^8.3.2 - typescript: '>=4.3.0' - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - ethers: 5.7.2 - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@4.9.5) - typechain: 8.3.2(typescript@4.9.5) - typescript: 4.9.5 dev: true - /@typechain/ethers-v6@0.5.1(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5): - resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} + /@typechain/ethers-v6@0.4.3(ethers@6.8.0)(typechain@8.3.2)(typescript@4.9.5): + resolution: {integrity: sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==} peerDependencies: - ethers: ^5.7.2 - typechain: ^8.3.2 + ethers: 6.x + typechain: ^8.3.1 typescript: '>=4.7.0' dependencies: - ethers: 5.7.2 + ethers: 6.8.0 lodash: 4.17.21 ts-essentials: 7.0.3(typescript@4.9.5) typechain: 8.3.2(typescript@4.9.5) typescript: 4.9.5 dev: true - /@typechain/hardhat@6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2): - resolution: {integrity: sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==} + /@typechain/hardhat@8.0.3(@typechain/ethers-v6@0.4.3)(ethers@6.8.0)(hardhat@2.18.3)(typechain@8.3.2): + resolution: {integrity: sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==} peerDependencies: - '@ethersproject/abi': ^5.4.7 - '@ethersproject/providers': ^5.4.7 - '@typechain/ethers-v5': ^10.2.1 - ethers: ^5.7.2 + '@typechain/ethers-v6': ^0.4.3 + ethers: ^6.1.0 hardhat: ^2.9.9 - typechain: ^8.1.1 + typechain: ^8.3.1 dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) - ethers: 5.7.2 + '@typechain/ethers-v6': 0.4.3(ethers@6.8.0)(typechain@8.3.2)(typescript@4.9.5) + ethers: 6.8.0 fs-extra: 9.1.0 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) - typechain: 8.3.2(typescript@4.9.5) - dev: false - - /@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1)(ethers@5.7.2)(hardhat@2.13.1)(typechain@8.3.2): - resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} - peerDependencies: - '@typechain/ethers-v6': ^0.5.1 - ethers: ^5.7.2 - hardhat: ^2.9.9 - typechain: ^8.3.2 - dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) - ethers: 5.7.2 - fs-extra: 9.1.0 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) typechain: 8.3.2(typescript@4.9.5) dev: true @@ -12182,49 +12146,53 @@ packages: '@types/babel__generator': 7.6.6 '@types/babel__template': 7.4.3 '@types/babel__traverse': 7.20.3 + dev: true /@types/babel__generator@7.6.6: resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} dependencies: '@babel/types': 7.23.0 + dev: true /@types/babel__template@7.4.3: resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} dependencies: '@babel/parser': 7.23.0 '@babel/types': 7.23.0 + dev: true /@types/babel__traverse@7.20.3: resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} dependencies: '@babel/types': 7.23.0 + dev: true /@types/better-sqlite3@7.6.6: resolution: {integrity: sha512-nuFAptzt0hZYBvyLzKQCbuCCK+RN9PHH4ezar5EJLIg2qpVhwQ/uLvLO/K8A9O7N8DafawgFupiyXQSs0U48Ng==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: true /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/bn.js@5.1.3: resolution: {integrity: sha512-wT1B4iIO82ecXkdN6waCK8Ou7E71WU+mP1osDA5Q8c6Ur+ozU2vIKUIhSpUr6uE5L2YHocKS1Z2jG2fBC1YVeg==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/body-parser@1.19.4: resolution: {integrity: sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==} dependencies: '@types/connect': 3.4.37 - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/bonjour@3.5.12: resolution: {integrity: sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/chai-as-promised@7.1.7: resolution: {integrity: sha512-APucaP5rlmTRYKtRA6FE5QPP87x76ejw5t5guRJ4y5OgMnwtsvigw7HHhKZlx2MGXLeZd6R/GNZR/IqDHcbtQw==} @@ -12245,39 +12213,36 @@ packages: /@types/cli-progress@3.11.4: resolution: {integrity: sha512-yufTxeeNCZuEIxx2uebK8lpSAsJM4lvzakm/VxzYhDtqhXCzwH9jpn7nPCxzrROuEbLATqhFq4MIPoG0tlrsvw==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: true /@types/concat-stream@1.6.1: resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: true /@types/connect-history-api-fallback@1.5.2: resolution: {integrity: sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==} dependencies: '@types/express-serve-static-core': 4.17.39 - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/connect@3.4.37: resolution: {integrity: sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==} dependencies: - '@types/node': 18.18.6 - - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - dev: true + '@types/node': 18.18.7 /@types/debug@4.1.10: resolution: {integrity: sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==} dependencies: '@types/ms': 0.7.33 + dev: false /@types/dns-packet@5.6.2: resolution: {integrity: sha512-vgUZ0ilYvpnTDx7tBmmAUn1HsyzK3huAtulHaDbBBCW5UdaDrEei5XJjWHnD4s8r9/MSL1hJ8s+nvJdcvNKgMA==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: false /@types/eslint-scope@3.7.6: @@ -12298,7 +12263,7 @@ packages: /@types/express-serve-static-core@4.17.39: resolution: {integrity: sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 '@types/qs': 6.9.9 '@types/range-parser': 1.2.6 '@types/send': 0.17.3 @@ -12314,20 +12279,21 @@ packages: /@types/form-data@0.0.33: resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: true /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: true /@types/graceful-fs@4.1.8: resolution: {integrity: sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 + dev: true /@types/hast@2.3.7: resolution: {integrity: sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw==} @@ -12341,7 +12307,7 @@ packages: /@types/hoist-non-react-statics@3.3.4: resolution: {integrity: sha512-ZchYkbieA+7tnxwX/SCBySx9WwvWR8TaP5tb2jRAzwvLb/rWchGw3v0w3pqUbUvj0GCwW2Xz/AVPSk6kUGctXQ==} dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 hoist-non-react-statics: 3.3.2 dev: false @@ -12358,7 +12324,7 @@ packages: /@types/http-proxy@1.17.13: resolution: {integrity: sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/istanbul-lib-coverage@2.0.5: resolution: {integrity: sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==} @@ -12384,14 +12350,10 @@ packages: resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} dev: false - /@types/js-levenshtein@1.1.2: - resolution: {integrity: sha512-/NCbMABw2uacuyE16Iwka1EzREDD50/W2ggRBad0y1WHBvAkvR9OEINxModVY7D428gXBe0igeVX7bUc9GaslQ==} - dev: true - /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 '@types/tough-cookie': 4.0.4 parse5: 7.1.2 dev: true @@ -12407,7 +12369,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/level-errors@3.0.1: resolution: {integrity: sha512-eFJZWaOUhgjSqgEsPKJZrqXS9aEDUQh/5F9saFhhkR5uEVKlYb4GSG8XyoVC7APklcQKPGDVenTointTZBGIQg==} @@ -12418,7 +12380,7 @@ packages: dependencies: '@types/abstract-leveldown': 7.2.4 '@types/level-errors': 3.0.1 - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: true /@types/lodash@4.14.200: @@ -12455,7 +12417,7 @@ packages: /@types/mkdirp@0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: true /@types/mocha@9.1.0: @@ -12464,18 +12426,19 @@ packages: /@types/ms@0.7.33: resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} + dev: false /@types/multicast-dns@7.2.3: resolution: {integrity: sha512-2SZ079yRhuhDn5BssqkQGp07vErjm3PD8S/JAlduWXacZ8SVHF0q6R2m0PwjjgTDU1vE3kibNPlmnr1iKbP/Sw==} dependencies: '@types/dns-packet': 5.6.2 - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: false - /@types/node-fetch@2.6.7: - resolution: {integrity: sha512-lX17GZVpJ/fuCjguZ5b3TjEbSENxmEk1B2z02yoXSK9WMEWRivhdSY73wWMn6bpcCDAOh6qAdktpKHIlkDk2lg==} + /@types/node-fetch@2.6.8: + resolution: {integrity: sha512-nnH5lV9QCMPsbEVdTb5Y+F3GQxLSw1xQgIydrb2gSfEavRPs50FnMr+KUaa+LoPSqibm2N+ZZxH7lavZlAT4GA==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 form-data: 4.0.0 dev: true @@ -12498,8 +12461,13 @@ packages: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false - /@types/node@18.18.6: - resolution: {integrity: sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==} + /@types/node@18.15.13: + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + + /@types/node@18.18.7: + resolution: {integrity: sha512-bw+lEsxis6eqJYW8Ql6+yTqkE6RuFtsQPSe5JxXbqYRFQEER5aJA9a5UH9igqDWm3X4iLHIKOHlnAXLM4mi7uQ==} + dependencies: + undici-types: 5.26.5 /@types/node@20.5.1: resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} @@ -12515,7 +12483,7 @@ packages: /@types/papaparse@5.3.10: resolution: {integrity: sha512-mS1Fta/xJ9EDYmAvpeWzcV9Gr0cOl1ClpW7di9+wSUNDIDO55tBtyXg97O7K+Syrd9rDEmuejM2iqmJIJ1SO5g==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: true /@types/parse-json@4.0.1: @@ -12528,7 +12496,7 @@ packages: /@types/pbkdf2@3.1.1: resolution: {integrity: sha512-4HCoGwR3221nOc7G0Z/6KgTNGgaaFGkbGrtUJsB+zlKX2LBVjFHHIUkieMBgHHXgBH5Gq6dZHJKdBYdtlhBQvw==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/phoenix@1.6.3: resolution: {integrity: sha512-D8TtchWVnU2ZdPVDY6tBJuz8MUDmCNVduilZTrf0Gn/u5I/uZEXOsaL4Gs4F0j43cysHsU/4h7eqAKc+SF2boQ==} @@ -12536,6 +12504,7 @@ packages: /@types/prettier@2.7.3: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true /@types/prop-types@15.7.9: resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} @@ -12549,37 +12518,37 @@ packages: /@types/react-dom@18.2.14: resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 dev: true /@types/react-router-config@5.0.9: resolution: {integrity: sha512-a7zOj9yVUtM3Ns5stoseQAAsmppNxZpXDv6tZiFV5qlRmV4W96u53on1vApBX1eRSc8mrFOiB54Hc0Pk1J8GFg==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.31 + '@types/react': 18.2.33 '@types/react-router': 5.1.20 /@types/react-router-dom@5.3.3: resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.31 + '@types/react': 18.2.33 '@types/react-router': 5.1.20 /@types/react-router@5.1.20: resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.31 + '@types/react': 18.2.33 /@types/react-transition-group@4.4.8: resolution: {integrity: sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==} dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 dev: false - /@types/react@18.2.31: - resolution: {integrity: sha512-c2UnPv548q+5DFh03y8lEDeMfDwBn9G3dRwfkrxQMo/dOtRHUUO57k6pHvBIfH/VF4Nh+98mZ5aaSe+2echD5g==} + /@types/react@18.2.33: + resolution: {integrity: sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==} dependencies: '@types/prop-types': 15.7.9 '@types/scheduler': 0.16.5 @@ -12588,7 +12557,7 @@ packages: /@types/readable-stream@2.3.15: resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 safe-buffer: 5.1.2 /@types/resolve@1.20.2: @@ -12598,7 +12567,7 @@ packages: /@types/responselike@1.0.2: resolution: {integrity: sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -12610,7 +12579,7 @@ packages: /@types/sax@1.2.6: resolution: {integrity: sha512-A1mpYCYu1aHFayy8XKN57ebXeAbh9oQIZ1wXcno6b1ESUAfMBDMx7mf/QGlYwcMRaFryh9YBuH03i/3FlPGDkQ==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: false /@types/scheduler@0.16.5: @@ -12619,7 +12588,7 @@ packages: /@types/secp256k1@4.0.5: resolution: {integrity: sha512-aIonTBMErtE3T9MxDvTZRzcrT/mCqpEZBw3CCY/i+oG9n57N/+7obBkhFgavUAIrX21bU0LHg1XRgtaLdelBhA==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/seedrandom@3.0.1: resolution: {integrity: sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==} @@ -12633,7 +12602,7 @@ packages: resolution: {integrity: sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==} dependencies: '@types/mime': 1.3.4 - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/serve-index@1.9.3: resolution: {integrity: sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==} @@ -12645,28 +12614,18 @@ packages: dependencies: '@types/http-errors': 2.0.3 '@types/mime': 3.0.3 - '@types/node': 18.18.6 - - /@types/set-cookie-parser@2.4.5: - resolution: {integrity: sha512-ZPmztaAQ4rbnW/WTUnT1dwSENQo4bjGqxCSeyK+gZxmd+zJl/QAeF6dpEXcS5UEJX22HwiggFSaY8nE1nRmkbg==} - dependencies: - '@types/node': 18.18.6 - dev: true + '@types/node': 18.18.7 /@types/sinon@10.0.20: resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} dependencies: - '@types/sinonjs__fake-timers': 8.1.4 + '@types/sinonjs__fake-timers': 8.1.1 dev: true /@types/sinonjs__fake-timers@8.1.1: resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} dev: true - /@types/sinonjs__fake-timers@8.1.4: - resolution: {integrity: sha512-GDV68H0mBSN449sa5HEj51E0wfpVQb8xNSMzxf/PrypMFcLTMwJMOM/cgXiv71Mq5drkOQmUGvL1okOZcu6RrQ==} - dev: true - /@types/sizzle@2.3.5: resolution: {integrity: sha512-tAe4Q+OLFOA/AMD+0lq8ovp8t3ysxAOeaScnfNdZpUxaGl51ZMDEITxkvFl1STudQ58mz6gzVGl9VhMKhwRnZQ==} dev: true @@ -12674,7 +12633,7 @@ packages: /@types/sockjs@0.3.35: resolution: {integrity: sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/source-list-map@0.1.4: resolution: {integrity: sha512-Kdfm7Sk5VX8dFW7Vbp18+fmAatBewzBILa1raHYxrGEFXT0jNl9x3LWfuW7bTbjEKFNey9Dfkj/UzT6z/NvRlg==} @@ -12725,7 +12684,7 @@ packages: /@types/webpack-sources@3.2.2: resolution: {integrity: sha512-acCzhuVe+UJy8abiSFQWXELhhNMZjQjQKpLNEi1pKGgKXZj0ul614ATcx4kkhunPost6Xw+aCq8y8cn1/WwAiA==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 '@types/source-list-map': 0.1.4 source-map: 0.7.4 dev: true @@ -12733,7 +12692,7 @@ packages: /@types/webpack@4.41.35: resolution: {integrity: sha512-XRC6HLGHtNfN8/xWeu1YUQV1GSE+28q8lSqvcJ+0xt/zW9Wmn4j9pCSvaXPyRlCKrl5OuqECQNEJUy2vo8oWqg==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 '@types/tapable': 1.0.10 '@types/uglify-js': 3.17.3 '@types/webpack-sources': 3.2.2 @@ -12744,18 +12703,18 @@ packages: /@types/websocket@1.0.8: resolution: {integrity: sha512-wvkOpWApbuxVfHhSQ1XrjVN4363vsfLJwEo4AboIZk0g1vJA5nmLp8GXUHuIdf4/Fe7+/V0Efe2HvWiLqHtlqw==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: false /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/ws@8.5.8: resolution: {integrity: sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /@types/yargs-parser@21.0.2: resolution: {integrity: sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==} @@ -12779,7 +12738,7 @@ packages: resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==} requiresBuild: true dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 dev: true optional: true @@ -12794,7 +12753,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.9.1 + '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 5.62.0(eslint@8.19.0)(typescript@5.1.6) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.19.0)(typescript@5.1.6) @@ -12822,7 +12781,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.9.1 + '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 5.62.0(eslint@8.52.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.52.0)(typescript@4.9.5) @@ -13024,7 +12983,6 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true /@vanilla-extract/css@1.9.1: resolution: {integrity: sha512-pu2SFiff5jRhPwvGoj8cM5l/qIyLvigOmy22ss5DGjwV5pJYezRjDLxWumi2luIwioMWvh9EozCjyfH8nq+7fQ==} @@ -13077,6 +13035,19 @@ packages: - utf-8-validate dev: true + /@viem/anvil@0.0.6: + resolution: {integrity: sha512-OjKR/+FVwzuygXYFqP8MBal1SXG8bT2gbZwqqB0XuLw81LNBBvmE/Repm6+5kkBh4IUj0PhYdrqOsnayS14Gtg==} + dependencies: + execa: 7.2.0 + get-port: 6.1.2 + http-proxy: 1.18.1(debug@4.3.4) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: true + /@vitest/expect@0.28.5: resolution: {integrity: sha512-gqTZwoUTwepwGIatnw4UKpQfnoyV0Z9Czn9+Lo2/jLIt4/AXLTn+oVZxlQ7Ng8bzcNkR+3DqLJ08kNr8jRmdNQ==} dependencies: @@ -13109,56 +13080,56 @@ packages: pretty-format: 27.5.1 dev: true - /@vue/compiler-core@3.3.6: - resolution: {integrity: sha512-2JNjemwaNwf+MkkatATVZi7oAH1Hx0B04DdPH3ZoZ8vKC1xZVP7nl4HIsk8XYd3r+/52sqqoz9TWzYc3yE9dqA==} + /@vue/compiler-core@3.3.7: + resolution: {integrity: sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==} dependencies: '@babel/parser': 7.23.0 - '@vue/shared': 3.3.6 + '@vue/shared': 3.3.7 estree-walker: 2.0.2 source-map-js: 1.0.2 dev: true - /@vue/compiler-dom@3.3.6: - resolution: {integrity: sha512-1MxXcJYMHiTPexjLAJUkNs/Tw2eDf2tY3a0rL+LfuWyiKN2s6jvSwywH3PWD8bKICjfebX3GWx2Os8jkRDq3Ng==} + /@vue/compiler-dom@3.3.7: + resolution: {integrity: sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==} dependencies: - '@vue/compiler-core': 3.3.6 - '@vue/shared': 3.3.6 + '@vue/compiler-core': 3.3.7 + '@vue/shared': 3.3.7 dev: true - /@vue/compiler-sfc@3.3.6: - resolution: {integrity: sha512-/Kms6du2h1VrXFreuZmlvQej8B1zenBqIohP0690IUBkJjsFvJxY0crcvVRJ0UhMgSR9dewB+khdR1DfbpArJA==} + /@vue/compiler-sfc@3.3.7: + resolution: {integrity: sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==} dependencies: '@babel/parser': 7.23.0 - '@vue/compiler-core': 3.3.6 - '@vue/compiler-dom': 3.3.6 - '@vue/compiler-ssr': 3.3.6 - '@vue/reactivity-transform': 3.3.6 - '@vue/shared': 3.3.6 + '@vue/compiler-core': 3.3.7 + '@vue/compiler-dom': 3.3.7 + '@vue/compiler-ssr': 3.3.7 + '@vue/reactivity-transform': 3.3.7 + '@vue/shared': 3.3.7 estree-walker: 2.0.2 magic-string: 0.30.5 postcss: 8.4.31 source-map-js: 1.0.2 dev: true - /@vue/compiler-ssr@3.3.6: - resolution: {integrity: sha512-QTIHAfDCHhjXlYGkUg5KH7YwYtdUM1vcFl/FxFDlD6d0nXAmnjizka3HITp8DGudzHndv2PjKVS44vqqy0vP4w==} + /@vue/compiler-ssr@3.3.7: + resolution: {integrity: sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==} dependencies: - '@vue/compiler-dom': 3.3.6 - '@vue/shared': 3.3.6 + '@vue/compiler-dom': 3.3.7 + '@vue/shared': 3.3.7 dev: true - /@vue/reactivity-transform@3.3.6: - resolution: {integrity: sha512-RlJl4dHfeO7EuzU1iJOsrlqWyJfHTkJbvYz/IOJWqu8dlCNWtxWX377WI0VsbAgBizjwD+3ZjdnvSyyFW1YVng==} + /@vue/reactivity-transform@3.3.7: + resolution: {integrity: sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==} dependencies: '@babel/parser': 7.23.0 - '@vue/compiler-core': 3.3.6 - '@vue/shared': 3.3.6 + '@vue/compiler-core': 3.3.7 + '@vue/shared': 3.3.7 estree-walker: 2.0.2 magic-string: 0.30.5 dev: true - /@vue/shared@3.3.6: - resolution: {integrity: sha512-Xno5pEqg8SVhomD0kTSmfh30ZEmV/+jZtyh39q6QflrjdJCXah5lrnOLi9KB6a5k5aAHXMXjoMnxlzUkCNfWLQ==} + /@vue/shared@3.3.7: + resolution: {integrity: sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==} dev: true /@wagmi/chains@1.0.0(typescript@5.1.6): @@ -13172,26 +13143,47 @@ packages: typescript: 5.1.6 dev: true - /@wagmi/chains@1.6.0(typescript@5.1.6): - resolution: {integrity: sha512-5FRlVxse5P4ZaHG3GTvxwVANSmYJas1eQrTBHhjxVtqXoorm0aLmCHbhmN8Xo1yu09PaWKlleEvfE98yH4AgIw==} + /@wagmi/connectors@2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4): + resolution: {integrity: sha512-1KOL0HTJl5kzSC/YdKwFwiokr6poUQn1V/tcT0TpG3iH2x0lSM7FTkvCjVVY/6lKzTXrLlo9y2aE7AsOPnkvqg==} peerDependencies: + '@wagmi/chains': '>=1.7.0' typescript: '>=5.0.4' + viem: '>=0.3.35' peerDependenciesMeta: + '@wagmi/chains': + optional: true typescript: optional: true dependencies: + '@coinbase/wallet-sdk': 3.7.2 + '@ledgerhq/connect-kit-loader': 1.1.2 + '@safe-global/safe-apps-provider': 0.17.1(typescript@5.1.6)(zod@3.22.4) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.1.6)(zod@3.22.4) + '@walletconnect/ethereum-provider': 2.9.2(@walletconnect/modal@2.6.1) + '@walletconnect/legacy-provider': 2.0.0 + '@walletconnect/modal': 2.6.1(react@18.2.0) + '@walletconnect/utils': 2.9.2 + abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) + eventemitter3: 4.0.7 typescript: 5.1.6 + viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - react + - supports-color + - utf-8-validate + - zod dev: false - /@wagmi/connectors@2.6.6(@wagmi/chains@1.6.0)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4): - resolution: {integrity: sha512-/o1c/TCivQs8DOAUOcQvY2UIt3p2mWOAHi39D0LC74+ncpXzLC5/gyaWU38qnTxPM8s/PmTmaWDgz+VhICXrag==} + /@wagmi/connectors@3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4): + resolution: {integrity: sha512-UgwsQKQDFObJVJMf9pDfFoXTv710o4zrTHyhIWKBTMMkLpCMsMxN5+ZaDhBYt/BgoRinfRYQo8uwuwLhxE6Log==} peerDependencies: - '@wagmi/chains': '>=1.3.0' typescript: '>=5.0.4' viem: '>=0.3.35' peerDependenciesMeta: - '@wagmi/chains': - optional: true typescript: optional: true dependencies: @@ -13199,17 +13191,17 @@ packages: '@ledgerhq/connect-kit-loader': 1.1.2 '@safe-global/safe-apps-provider': 0.17.1(typescript@5.1.6)(zod@3.22.4) '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.1.6)(zod@3.22.4) - '@wagmi/chains': 1.6.0(typescript@5.1.6) - '@walletconnect/ethereum-provider': 2.9.0(@walletconnect/modal@2.5.9) + '@walletconnect/ethereum-provider': 2.10.2(@walletconnect/modal@2.6.2) '@walletconnect/legacy-provider': 2.0.0 - '@walletconnect/modal': 2.5.9(react@18.2.0) - '@walletconnect/utils': 2.9.0 + '@walletconnect/modal': 2.6.2(@types/react@18.2.33)(react@18.2.0) + '@walletconnect/utils': 2.10.2 abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.5.3(typescript@5.1.6)(zod@3.22.4) + viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' + - '@types/react' - bufferutil - encoding - lokijs @@ -13219,8 +13211,8 @@ packages: - zod dev: false - /@wagmi/core@1.3.8(@types/react@18.2.31)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4): - resolution: {integrity: sha512-OYSxikoMizqVnpSkFTwGE7PwFaz2k0PXteSiI0W2Mtk4j4sZzRFdP+9AWeDB6AYm0yU3WvgN1IATx0EEBKUe3w==} + /@wagmi/core@1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4): + resolution: {integrity: sha512-N9luRb1Uk4tBN9kaYcQSWKE9AsRt/rvZaFt5IZech4JPzNN2sQlfhKd9GEjOXYRDqEPHdDvos7qyBKiDNTz4GA==} peerDependencies: typescript: '>=5.0.4' viem: '>=0.3.35' @@ -13228,13 +13220,12 @@ packages: typescript: optional: true dependencies: - '@wagmi/chains': 1.6.0(typescript@5.1.6) - '@wagmi/connectors': 2.6.6(@wagmi/chains@1.6.0)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) + '@wagmi/connectors': 3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.5.3(typescript@5.1.6)(zod@3.22.4) - zustand: 4.4.4(@types/react@18.2.31)(react@18.2.0) + viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) + zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@types/react' @@ -13248,22 +13239,48 @@ packages: - zod dev: false - /@walletconnect/core@2.9.0: - resolution: {integrity: sha512-MZYJghS9YCvGe32UOgDj0mCasaOoGHQaYXWeQblXE/xb8HuaM6kAWhjIQN9P+MNp5QP134BHP5olQostcCotXQ==} + /@walletconnect/core@2.10.2: + resolution: {integrity: sha512-JQz/xp3SLEpTeRQctdck2ugSBVEpMxoSE+lFi2voJkZop1hv6P+uqr6E4PzjFluAjeAnKlT1xvra0aFWjPWVcw==} + 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.10.2 + '@walletconnect/utils': 2.10.2 + events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/core@2.9.2: + resolution: {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.12 + '@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.0 - '@walletconnect/utils': 2.9.0 + '@walletconnect/types': 2.9.2 + '@walletconnect/utils': 2.9.2 events: 3.3.0 lodash.isequal: 4.5.0 uint8arrays: 3.1.1 @@ -13299,8 +13316,34 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/ethereum-provider@2.9.0(@walletconnect/modal@2.5.9): - resolution: {integrity: sha512-rSXkC0SXMigJRdIi/M2RMuEuATY1AwtlTWQBnqyxoht7xbO2bQNPCXn0XL4s/GRNrSUtoKSY4aPMHXV4W4yLBA==} + /@walletconnect/ethereum-provider@2.10.2(@walletconnect/modal@2.6.2): + resolution: {integrity: sha512-QMYFZ6+rVq2CJLdIPdKK0j1Qm66UA27oQU5V2SrL8EVwl7wFfm0Bq7fnL+qAWeDpn612dNeNErpk/ROa1zWlWg==} + peerDependencies: + '@walletconnect/modal': '>=2' + peerDependenciesMeta: + '@walletconnect/modal': + optional: true + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.2(@types/react@18.2.33)(react@18.2.0) + '@walletconnect/sign-client': 2.10.2 + '@walletconnect/types': 2.10.2 + '@walletconnect/universal-provider': 2.10.2 + '@walletconnect/utils': 2.10.2 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/ethereum-provider@2.9.2(@walletconnect/modal@2.6.1): + resolution: {integrity: sha512-eO1dkhZffV1g7vpG19XUJTw09M/bwGUwwhy1mJ3AOPbOSbMPvwiCuRz2Kbtm1g9B0Jv15Dl+TvJ9vTgYF8zoZg==} peerDependencies: '@walletconnect/modal': '>=2' peerDependenciesMeta: @@ -13311,11 +13354,11 @@ packages: '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/modal': 2.5.9(react@18.2.0) - '@walletconnect/sign-client': 2.9.0 - '@walletconnect/types': 2.9.0 - '@walletconnect/universal-provider': 2.9.0 - '@walletconnect/utils': 2.9.0 + '@walletconnect/modal': 2.6.1(react@18.2.0) + '@walletconnect/sign-client': 2.9.2 + '@walletconnect/types': 2.9.2 + '@walletconnect/universal-provider': 2.9.2 + '@walletconnect/utils': 2.9.2 events: 3.3.0 transitivePeerDependencies: - '@react-native-async-storage/async-storage' @@ -13374,8 +13417,8 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/jsonrpc-ws-connection@1.0.12: - resolution: {integrity: sha512-HAcadga3Qjt1Cqy+qXEW6zjaCs8uJGdGQrqltzl3OjiK4epGZRdvSzTe63P+t/3z+D2wG+ffEPn0GVcDozmN1w==} + /@walletconnect/jsonrpc-ws-connection@1.0.13: + resolution: {integrity: sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg==} dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/safe-json': 1.0.2 @@ -13466,32 +13509,62 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/modal-core@2.5.9(react@18.2.0): - resolution: {integrity: sha512-isIebwF9hOknGouhS/Ob4YJ9Sa/tqNYG2v6Ua9EkCqIoLimepkG5eC53tslUWW29SLSfQ9qqBNG2+iE7yQXqgw==} + /@walletconnect/modal-core@2.6.1(react@18.2.0): + resolution: {integrity: sha512-f2hYlJ5pwzGvjyaZ6BoGR5uiMgXzWXt6w6ktt1N8lmY6PiYp8whZgqx2hTxVWwVlsGnaIfh6UHp1hGnANx0eTQ==} dependencies: - buffer: 6.0.3 - valtio: 1.10.6(react@18.2.0) + valtio: 1.11.0(react@18.2.0) transitivePeerDependencies: - react dev: false - /@walletconnect/modal-ui@2.5.9(react@18.2.0): - resolution: {integrity: sha512-nfBaAT9Ls7RZTBBgAq+Nt/3AoUcinIJ9bcq5UHXTV3lOPu/qCKmUC/0HY3GvUK8ykabUAsjr0OAGmcqkB91qug==} + /@walletconnect/modal-core@2.6.2(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==} dependencies: - '@walletconnect/modal-core': 2.5.9(react@18.2.0) - lit: 2.7.5 + valtio: 1.11.2(@types/react@18.2.33)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + dev: false + + /@walletconnect/modal-ui@2.6.1(react@18.2.0): + resolution: {integrity: sha512-RFUOwDAMijSK8B7W3+KoLKaa1l+KEUG0LCrtHqaB0H0cLnhEGdLR+kdTdygw+W8+yYZbkM5tXBm7MlFbcuyitA==} + dependencies: + '@walletconnect/modal-core': 2.6.1(react@18.2.0) + lit: 2.7.6 motion: 10.16.2 qrcode: 1.5.3 transitivePeerDependencies: - react dev: false - /@walletconnect/modal@2.5.9(react@18.2.0): - resolution: {integrity: sha512-Zs2RvPwbBNRdBhb50FuJCxi3FJltt1KSpI7odjU/x9GTpTOcSOkmR66PBCy2JvNA0+ztnS1Xs0LVEr3lu7/Jzw==} + /@walletconnect/modal-ui@2.6.2(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==} dependencies: - '@walletconnect/modal-core': 2.5.9(react@18.2.0) - '@walletconnect/modal-ui': 2.5.9(react@18.2.0) + '@walletconnect/modal-core': 2.6.2(@types/react@18.2.33)(react@18.2.0) + lit: 2.8.0 + motion: 10.16.2 + qrcode: 1.5.3 transitivePeerDependencies: + - '@types/react' + - react + dev: false + + /@walletconnect/modal@2.6.1(react@18.2.0): + resolution: {integrity: sha512-G84tSzdPKAFk1zimgV7JzIUFT5olZUVtI3GcOk77OeLYjlMfnDT23RVRHm5EyCrjkptnvpD0wQScXePOFd2Xcw==} + dependencies: + '@walletconnect/modal-core': 2.6.1(react@18.2.0) + '@walletconnect/modal-ui': 2.6.1(react@18.2.0) + transitivePeerDependencies: + - react + dev: false + + /@walletconnect/modal@2.6.2(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} + dependencies: + '@walletconnect/modal-core': 2.6.2(@types/react@18.2.33)(react@18.2.0) + '@walletconnect/modal-ui': 2.6.2(@types/react@18.2.33)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' - react dev: false @@ -13528,17 +13601,36 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/sign-client@2.9.0: - resolution: {integrity: sha512-mEKc4LlLMebCe45qzqh+MX4ilQK4kOEBzLY6YJpG8EhyT45eX4JMNA7qQoYa9MRMaaVb/7USJcc4e3ZrjZvQmA==} + /@walletconnect/sign-client@2.10.2: + resolution: {integrity: sha512-vviSLV3f92I0bReX+OLr1HmbH0uIzYEQQFd1MzIfDk9PkfFT/LLAHhUnDaIAMkIdippqDcJia+5QEtT4JihL3Q==} dependencies: - '@walletconnect/core': 2.9.0 + '@walletconnect/core': 2.10.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.0 - '@walletconnect/utils': 2.9.0 + '@walletconnect/types': 2.10.2 + '@walletconnect/utils': 2.10.2 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/sign-client@2.9.2: + resolution: {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 transitivePeerDependencies: - '@react-native-async-storage/async-storage' @@ -13553,8 +13645,8 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/types@2.9.0: - resolution: {integrity: sha512-ORopsMfSRvUYqtjKKd6scfg8o4/aGebipLxx92AuuUgMTERSU6cGmIrK6rdLu7W6FBJkmngPLEGc9mRqAb9Lug==} + /@walletconnect/types@2.10.2: + resolution: {integrity: sha512-luNV+07Wdla4STi9AejseCQY31tzWKQ5a7C3zZZaRK/di+rFaAAb7YW04OP4klE7tw/mJRGPTlekZElmHxO8kQ==} dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 @@ -13567,17 +13659,31 @@ packages: - lokijs dev: false - /@walletconnect/universal-provider@2.9.0: - resolution: {integrity: sha512-k3nkSBkF69sJJVoe17IVoPtnhp/sgaa2t+x7BvA/BKeMxE0DGdtRJdEXotTc8DBmI7o2tkq6l8+HyFBGjQ/CjQ==} + /@walletconnect/types@2.9.2: + resolution: {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 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + + /@walletconnect/universal-provider@2.10.2: + resolution: {integrity: sha512-wFgI0LbQ3D56sgaUMsgOHCM5m8WLxiC71BGuCKQfApgsbNMVKugYVy2zWHyUyi8sqTQHI+uSaVpDev4UHq9LEw==} dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.7 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.0.1 - '@walletconnect/sign-client': 2.9.0 - '@walletconnect/types': 2.9.0 - '@walletconnect/utils': 2.9.0 + '@walletconnect/sign-client': 2.10.2 + '@walletconnect/types': 2.10.2 + '@walletconnect/utils': 2.10.2 events: 3.3.0 transitivePeerDependencies: - '@react-native-async-storage/async-storage' @@ -13587,8 +13693,50 @@ packages: - utf-8-validate dev: false - /@walletconnect/utils@2.9.0: - resolution: {integrity: sha512-7Tu3m6dZL84KofrNBcblsgpSqU2vdo9ImLD7zWimLXERVGNQ8smXG+gmhQYblebIBhsPzjy9N38YMC3nPlfQNw==} + /@walletconnect/universal-provider@2.9.2: + resolution: {integrity: sha512-JmaolkO8D31UdRaQCHwlr8uIFUI5BYhBzqYFt54Mc6gbIa1tijGOmdyr6YhhFO70LPmS6gHIjljwOuEllmlrxw==} + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/sign-client': 2.9.2 + '@walletconnect/types': 2.9.2 + '@walletconnect/utils': 2.9.2 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/utils@2.10.2: + resolution: {integrity: sha512-syxXRpc2yhSknMu3IfiBGobxOY7fLfLTJuw+ppKaeO6WUdZpIit3wfuGOcc0Ms3ZPFCrGfyGOoZsCvgdXtptRg==} + 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.10.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.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + + /@walletconnect/utils@2.9.2: + resolution: {integrity: sha512-D44hwXET/8JhhIjqljY6qxSu7xXnlPrf63UN/Qfl98vDjWlYVcDl2+JIQRxD9GPastw0S8XZXdRq59XDXLuZBg==} dependencies: '@stablelib/chacha20poly1305': 1.0.1 '@stablelib/hkdf': 1.0.1 @@ -13598,7 +13746,7 @@ packages: '@walletconnect/relay-api': 1.0.9 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.9.0 + '@walletconnect/types': 2.9.2 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 detect-browser: 5.3.0 @@ -13825,11 +13973,11 @@ packages: urlpattern-polyfill: 8.0.2 web-streams-polyfill: 3.2.1 - /@whatwg-node/fetch@0.9.13: - resolution: {integrity: sha512-PPtMwhjtS96XROnSpowCQM85gCUG2m7AXZFw0PZlGbhzx2GK7f2iOXilfgIJ0uSlCuuGbOIzfouISkA7C4FJOw==} + /@whatwg-node/fetch@0.9.14: + resolution: {integrity: sha512-wurZC82zzZwXRDSW0OS9l141DynaJQh7Yt0FD1xZ8niX7/Et/7RoiLiltbVU1fSF1RR9z6ndEaTUQBAmddTm1w==} engines: {node: '>=16.0.0'} dependencies: - '@whatwg-node/node-fetch': 0.4.19 + '@whatwg-node/node-fetch': 0.5.0 urlpattern-polyfill: 9.0.0 /@whatwg-node/node-fetch@0.3.6: @@ -13841,8 +13989,8 @@ packages: fast-url-parser: 1.1.3 tslib: 2.6.2 - /@whatwg-node/node-fetch@0.4.19: - resolution: {integrity: sha512-AW7/m2AuweAoSXmESrYQr/KBafueScNbn2iNO0u6xFr2JZdPmYsSm5yvAXYk6yDLv+eDmSSKrf7JnFZ0CsJIdA==} + /@whatwg-node/node-fetch@0.5.0: + resolution: {integrity: sha512-q76lDAafvHNGWedNAVHrz/EyYTS8qwRLcwne8SJQdRN5P3HydxU6XROFvJfTML6KZXQX2FDdGY4/SnaNyd7M0Q==} engines: {node: '>=16.0.0'} dependencies: '@whatwg-node/events': 0.1.1 @@ -13857,24 +14005,26 @@ packages: '@whatwg-node/fetch': 0.8.8 tslib: 2.6.2 - /@whatwg-node/server@0.9.15: - resolution: {integrity: sha512-MDmw3HYfZt8hzP8Vac/LPwD8LyZFByVuO1vHPBDsOMYNf4XWv6eHbRCk4UFfLT8OMFgd+qMy/zNYc74o+3tXZg==} + /@whatwg-node/server@0.9.16: + resolution: {integrity: sha512-gktQkRyONEw2EGpx7UZaC6zNlUm21CGlqAHQXU3QC6W0zlLM5ZQNDCeD66q/nsPHDV08X2NTHlABsuAEk5rh/w==} engines: {node: '>=16.0.0'} dependencies: - '@whatwg-node/fetch': 0.9.13 + '@whatwg-node/fetch': 0.9.14 tslib: 2.6.2 dev: false - /@wry/context@0.7.3: - resolution: {integrity: sha512-Nl8WTesHp89RF803Se9X3IiHjdmLBrIvPMaJkl+rKVJAYyPsz1TEUbu89943HpvujtSJgDUx9W4vZw3K1Mr3sA==} + /@wry/context@0.7.4: + resolution: {integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==} engines: {node: '>=8'} + requiresBuild: true dependencies: tslib: 2.6.2 dev: false - /@wry/equality@0.5.6: - resolution: {integrity: sha512-D46sfMTngaYlrH+OspKf8mIJETntFnf6Hsjb0V41jAXJ7Bx2kB8Rv8RCUujuVWYttFtHkUNp7g+FwxNQAr6mXA==} + /@wry/equality@0.5.7: + resolution: {integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==} engines: {node: '>=8'} + requiresBuild: true dependencies: tslib: 2.6.2 dev: false @@ -13882,15 +14032,11 @@ packages: /@wry/trie@0.4.3: resolution: {integrity: sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==} engines: {node: '>=8'} + requiresBuild: true dependencies: tslib: 2.6.2 dev: false - /@xmldom/xmldom@0.8.10: - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} - engines: {node: '>=10.0.0'} - dev: true - /@xobotyi/scrollbar-width@1.9.5: resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} dev: false @@ -13908,6 +14054,7 @@ packages: /@zxing/text-encoding@0.9.0: resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} requiresBuild: true + dev: false optional: true /JSONStream@1.3.2: @@ -13933,6 +14080,21 @@ packages: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} dev: true + /abitype@0.10.2(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-1XndI+RKFWK4+TXCNv1683MRyX5NGmlHXCvqzjOqhSS3PQrxT2QYRZq1bMPPRNjn89B3eVaM2w7y3jVj/OIUzA==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.1.6 + zod: 3.22.4 + dev: true + /abitype@0.8.7(typescript@5.1.6)(zod@3.22.4): resolution: {integrity: sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w==} peerDependencies: @@ -13945,8 +14107,8 @@ packages: typescript: 5.1.6 zod: 3.22.4 - /abitype@0.9.3(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-dz4qCQLurx97FQhnb/EIYTk/ldQ+oafEDUqC0VVIeQS1Q48/YWt/9YNfMmp9SLFqN41ktxny3c8aYxHjmFIB/w==} + /abitype@0.9.8(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.19.1 @@ -14054,7 +14216,6 @@ packages: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.10.0 - dev: true /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} @@ -14080,6 +14241,9 @@ packages: resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} dev: false + /aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -14156,8 +14320,8 @@ packages: require-from-string: 2.0.2 uri-js: 4.4.1 - /algoliasearch-helper@3.14.2(algoliasearch@4.20.0): - resolution: {integrity: sha512-FjDSrjvQvJT/SKMW74nPgFpsoPUwZCzGbCqbp8HhBFfSk/OvNFxzCaCmuO0p7AWeLy1gD+muFwQEkBwcl5H4pg==} + /algoliasearch-helper@3.15.0(algoliasearch@4.20.0): + resolution: {integrity: sha512-DGUnK3TGtDQsaUE4ayF/LjSN0DGsuYThB8WBgnnDY0Wq04K6lNVruO3LfqJOgSfDiezp+Iyt8Tj4YKHi+/ivSA==} peerDependencies: algoliasearch: '>= 3.1 < 6' dependencies: @@ -14407,10 +14571,12 @@ packages: /array-back@3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} + dev: true /array-back@4.0.2: resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} engines: {node: '>=8'} + dev: true /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} @@ -14675,7 +14841,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.22.1 - caniuse-lite: 1.0.30001553 + caniuse-lite: 1.0.30001554 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -14781,6 +14947,7 @@ packages: slash: 3.0.0 transitivePeerDependencies: - supports-color + dev: true /babel-loader@8.3.0(@babel/core@7.23.2)(webpack@5.89.0): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} @@ -14843,6 +15010,7 @@ packages: test-exclude: 6.0.0 transitivePeerDependencies: - supports-color + dev: true /babel-plugin-jest-hoist@29.6.3: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} @@ -14852,6 +15020,7 @@ packages: '@babel/types': 7.23.0 '@types/babel__core': 7.20.3 '@types/babel__traverse': 7.20.3 + dev: true /babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} @@ -14952,6 +15121,7 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) + dev: true /babel-preset-fbjs@3.4.0(@babel/core@7.23.2): resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} @@ -14996,6 +15166,7 @@ packages: '@babel/core': 7.23.2 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + dev: true /babel-runtime@6.26.0: resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} @@ -15080,7 +15251,6 @@ packages: /bignumber.js@9.1.2: resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - dev: true /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} @@ -15367,8 +15537,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001553 - electron-to-chromium: 1.4.564 + caniuse-lite: 1.0.30001554 + electron-to-chromium: 1.4.567 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) @@ -15462,6 +15632,11 @@ packages: dependencies: node-gyp-build: 4.6.1 + /bufio@1.2.1: + resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} + engines: {node: '>=14.0.0'} + dev: true + /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -15627,13 +15802,13 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.22.1 - caniuse-lite: 1.0.30001553 + caniuse-lite: 1.0.30001554 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: false - /caniuse-lite@1.0.30001553: - resolution: {integrity: sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==} + /caniuse-lite@1.0.30001554: + resolution: {integrity: sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==} /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -15689,8 +15864,8 @@ packages: resolution: {integrity: sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==} hasBin: true - /cborg@4.0.4: - resolution: {integrity: sha512-nu+JXYskYqWN/tFWQVjL2ZYlUwK+dapqkTpruAtJkwmDv7XaTgg8PStUbO+sXfhqSWaeQ9LPSPCTrO2WZ2Bxfg==} + /cborg@4.0.5: + resolution: {integrity: sha512-q8TAjprr8pn9Fp53rOIGp/UFDdFY6os2Nq62YogPSIzczJD9M6g2b6igxMkpCiZZKJ0kn/KzDLDvG+EqBIEeCg==} hasBin: true dev: false @@ -15823,6 +15998,7 @@ packages: /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} + dev: true /character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -15925,6 +16101,7 @@ packages: /cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true /class-is@1.1.0: resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} @@ -16144,6 +16321,7 @@ packages: /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true /code-point-at@1.1.0: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} @@ -16156,6 +16334,7 @@ packages: /collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -16219,6 +16398,7 @@ packages: find-replace: 3.0.0 lodash.camelcase: 4.3.0 typical: 4.0.0 + dev: true /command-line-usage@6.1.3: resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} @@ -16228,6 +16408,7 @@ packages: chalk: 2.4.2 table-layout: 1.0.2 typical: 5.2.0 + dev: true /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} @@ -16274,13 +16455,13 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - /commitizen@4.3.0: + /commitizen@4.3.0(typescript@4.9.5): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0 + cz-conventional-changelog: 3.3.0(typescript@4.9.5) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -16294,8 +16475,7 @@ packages: strip-bom: 4.0.0 strip-json-comments: 3.1.1 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + - typescript dev: true /common-path-prefix@3.0.0: @@ -16456,7 +16636,7 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} dependencies: - is-what: 4.1.15 + is-what: 4.1.16 dev: false /copy-text-to-clipboard@3.2.0: @@ -16485,19 +16665,6 @@ packages: webpack: 5.89.0(webpack-cli@5.1.4) dev: false - /copyfiles@2.4.1: - resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} - hasBin: true - dependencies: - glob: 7.2.3 - minimatch: 3.1.2 - mkdirp: 1.0.4 - noms: 0.0.0 - through2: 2.0.5 - untildify: 4.0.0 - yargs: 16.2.0 - dev: true - /core-js-compat@3.33.1: resolution: {integrity: sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ==} dependencies: @@ -16536,7 +16703,7 @@ packages: layout-base: 2.0.1 dev: false - /cosmiconfig-typescript-loader@4.4.0(@types/node@18.18.6)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@5.2.2): + /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@4.9.5): resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} engines: {node: '>=v14.21.3'} peerDependencies: @@ -16545,27 +16712,27 @@ packages: ts-node: '>=10' typescript: '>=4' dependencies: - '@types/node': 18.18.6 - cosmiconfig: 8.3.6(typescript@5.2.2) - ts-node: 10.9.1(@types/node@18.18.6)(typescript@5.2.2) - typescript: 5.2.2 + '@types/node': 20.5.1 + cosmiconfig: 8.3.6(typescript@4.9.5) + ts-node: 10.9.1(@types/node@20.5.1)(typescript@4.9.5) + typescript: 4.9.5 dev: true - optional: true - /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@4.9.5): - resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} - engines: {node: '>=v14.21.3'} + /cosmiconfig-typescript-loader@5.0.0(@types/node@18.18.7)(cosmiconfig@8.3.6)(typescript@4.9.5): + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + requiresBuild: true peerDependencies: '@types/node': '*' - cosmiconfig: '>=7' - ts-node: '>=10' + cosmiconfig: '>=8.2' typescript: '>=4' dependencies: - '@types/node': 20.5.1 + '@types/node': 18.18.7 cosmiconfig: 8.3.6(typescript@4.9.5) - ts-node: 10.9.1(@types/node@20.5.1)(typescript@4.9.5) + jiti: 1.20.0 typescript: 4.9.5 dev: true + optional: true /cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} @@ -16639,23 +16806,6 @@ packages: path-type: 4.0.0 typescript: 5.1.6 - /cosmiconfig@8.3.6(typescript@5.2.2): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - typescript: 5.2.2 - dev: true - optional: true - /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} @@ -16680,7 +16830,7 @@ packages: safe-buffer: 5.2.1 sha.js: 2.4.11 - /create-jest@29.7.0(@types/node@18.18.6)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -16689,7 +16839,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -16697,6 +16847,7 @@ packages: - babel-plugin-macros - supports-color - ts-node + dev: true /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -17036,21 +17187,20 @@ packages: lodash: 4.17.21 dev: false - /cz-conventional-changelog@3.3.0: + /cz-conventional-changelog@3.3.0(typescript@4.9.5): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0 + commitizen: 4.3.0(typescript@4.9.5) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 18.0.0 + '@commitlint/load': 18.2.0(typescript@4.9.5) transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + - typescript dev: true /d3-array@3.2.4: @@ -17573,6 +17723,7 @@ packages: peerDependenciesMeta: babel-plugin-macros: optional: true + dev: true /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} @@ -17610,7 +17761,6 @@ packages: /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true /deep-object-diff@1.1.9: resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} @@ -17779,6 +17929,7 @@ packages: /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + dev: true /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -17810,6 +17961,7 @@ packages: /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true /diff@3.5.0: resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} @@ -17927,7 +18079,6 @@ packages: engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 - dev: true /docusaurus-plugin-remote-content@3.1.0(@docusaurus/core@2.4.3): resolution: {integrity: sha512-859WYmC75l9hRYa1f/2FNF+FLcKbkHCM/0dehN1Wl1fIuoFzEPf3tcWs4jcEobRHYnoMjyupqAhmu0q5j3JoIg==} @@ -17935,7 +18086,7 @@ packages: peerDependencies: '@docusaurus/core': 2.x dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) axios: 0.26.1 picocolors: 1.0.0 pretty-ms: 7.0.1 @@ -18064,8 +18215,8 @@ packages: pify: 4.0.1 dev: true - /dset@3.1.2: - resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==} + /dset@3.1.3: + resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} /duplexer3@0.1.5: @@ -18119,8 +18270,8 @@ packages: dependencies: encoding: 0.1.13 - /electron-to-chromium@1.4.564: - resolution: {integrity: sha512-bGAx9+teIzL5I4esQwCMtiXtb78Ysc8xOKTPOvmafbJZ4SQ40kDO1ym3yRcGSkfaBtV81fGgHOgPoe6DsmpmkA==} + /electron-to-chromium@1.4.567: + resolution: {integrity: sha512-8KR114CAYQ4/r5EIEsOmOMqQ9j0MRbJZR3aXD/KFA8RuKzyoUB4XrUCg+l8RUGqTVQgKNIgTpjaG8YHRPAbX2w==} /elkjs@0.8.2: resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} @@ -18149,6 +18300,7 @@ packages: /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} + dev: true /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -18807,7 +18959,6 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true /eslint-utils@3.0.0(eslint@8.19.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} @@ -18827,7 +18978,6 @@ packages: /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true /eslint@8.19.0: resolution: {integrity: sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==} @@ -18879,7 +19029,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) - '@eslint-community/regexpp': 4.9.1 + '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.2 '@eslint/js': 8.52.0 '@humanwhocodes/config-array': 0.11.13 @@ -18918,7 +19068,6 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} @@ -18927,7 +19076,6 @@ packages: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 - dev: true /esprima@2.7.3: resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} @@ -18945,7 +19093,6 @@ packages: engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 - dev: true /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -19056,6 +19203,12 @@ packages: fast-safe-stringify: 2.1.1 dev: false + /eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + dependencies: + fast-safe-stringify: 2.1.1 + dev: false + /ethereum-bloom-filters@1.0.10: resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} dependencies: @@ -19098,20 +19251,20 @@ packages: '@scure/bip39': 1.2.1 dev: true - /ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@4.9.5): + /ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.1.6): resolution: {integrity: sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==} engines: {node: '>=10.0'} hasBin: true peerDependencies: - ethers: ^5.7.2 + ethers: '*' dependencies: '@ethereum-waffle/chai': 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) - '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@4.9.5) + '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@5.1.6) '@ethereum-waffle/mock-contract': 4.0.4(ethers@5.7.2) '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) ethers: 5.7.2 solc: 0.8.15 - typechain: 8.3.2(typescript@4.9.5) + typechain: 8.3.2(typescript@5.1.6) transitivePeerDependencies: - '@ensdomains/ens' - '@ensdomains/resolver' @@ -19199,6 +19352,21 @@ packages: - bufferutil - utf-8-validate + /ethers@6.8.0: + resolution: {integrity: sha512-zrFbmQRlraM+cU5mE4CZTLBurZTs2gdp2ld0nG/f3ecBK+x6lZ69KSxBqZ4NjclxwfTxl5LeNufcBbMsTdY53Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.5.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + /etherscan-api@10.3.0(debug@4.3.4): resolution: {integrity: sha512-XH+E7J2c6Wq750stvFuIIMdiLv5v65nTRftQojXuQXNfEsQaZOOgeY11WHdrGh6yh90ekDJQldgf033tIS1rCw==} dependencies: @@ -19228,7 +19396,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 require-like: 0.1.2 dev: false @@ -19335,6 +19503,7 @@ packages: /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} + dev: true /expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} @@ -19352,6 +19521,7 @@ packages: jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 jest-util: 29.7.0 + dev: true /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} @@ -19503,7 +19673,6 @@ packages: /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true /fast-levenshtein@3.0.0: resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} @@ -19648,7 +19817,6 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.1.1 - dev: true /file-loader@6.2.0(webpack@5.89.0): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} @@ -19822,6 +19990,7 @@ packages: engines: {node: '>=4.0.0'} dependencies: array-back: 3.1.0 + dev: true /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} @@ -19885,7 +20054,6 @@ packages: flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 - dev: true /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} @@ -19893,7 +20061,6 @@ packages: /flatted@3.2.9: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true /flow-enums-runtime@0.0.5: resolution: {integrity: sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ==} @@ -19962,7 +20129,7 @@ packages: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true - /fork-ts-checker-webpack-plugin@6.5.3(typescript@4.9.5)(webpack@5.89.0): + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.52.0)(typescript@4.9.5)(webpack@5.89.0): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -19982,6 +20149,7 @@ packages: chokidar: 3.5.3 cosmiconfig: 6.0.0 deepmerge: 4.3.1 + eslint: 8.52.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.5.3 @@ -20025,7 +20193,7 @@ packages: dependencies: fetch-blob: 3.2.0 - /formik-mui-x-date-pickers@0.0.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(@mui/system@5.14.14)(@mui/x-date-pickers@5.0.20)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3): + /formik-mui-x-date-pickers@0.0.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.15)(@mui/system@5.14.15)(@mui/x-date-pickers@5.0.20)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3): resolution: {integrity: sha512-IxZsY6er+g0eNsucIDHcNs6DLaPDdG14IYx/lS2HSuKnTgV4vGEWpXyGMpkY/vGyh+W3N5U4TrBVu+7eRb5rLA==} peerDependencies: '@emotion/react': '>=11.5.0' @@ -20037,17 +20205,17 @@ packages: react: '>=17.0.2' tiny-warning: '>=1.0.3' dependencies: - '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) - '@mui/material': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react@18.2.0) - '@mui/x-date-pickers': 5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(@mui/system@5.14.14)(@types/react@18.2.31)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.33)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) + '@mui/material': 5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.33)(react@18.2.0) + '@mui/x-date-pickers': 5.0.20(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.15)(@mui/system@5.14.15)(@types/react@18.2.33)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) formik: 2.4.5(react@18.2.0) react: 18.2.0 tiny-warning: 1.0.3 dev: false - /formik-mui@5.0.0-alpha.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.14)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3): + /formik-mui@5.0.0-alpha.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.15)(formik@2.4.5)(react@18.2.0)(tiny-warning@1.0.3): resolution: {integrity: sha512-tcY8B4I3N2UK9ghgVpeBWsXGMDe1y4LVKwI8GiUbLKGB86fI/CN9UMr4FuNo6kzNXvO42LFNmCxdEVzovNCyYQ==} peerDependencies: '@emotion/react': '>=11.5.0' @@ -20057,9 +20225,9 @@ packages: react: '>=17.0.2' tiny-warning: '>=1.0.3' dependencies: - '@emotion/react': 11.11.1(@types/react@18.2.31)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.31)(react@18.2.0) - '@mui/material': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.33)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) + '@mui/material': 5.14.15(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) formik: 2.4.5(react@18.2.0) react: 18.2.0 tiny-warning: 1.0.3 @@ -20302,6 +20470,7 @@ packages: /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + dev: true /get-port@3.2.0: resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} @@ -20563,7 +20732,6 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.20.2 - dev: true /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} @@ -20723,19 +20891,18 @@ packages: /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true /graphql-import-node@0.0.5(graphql@16.8.1): resolution: {integrity: sha512-OXbou9fqh9/Lm7vwXT0XoRN9J5+WCYKnbiTalgFDvkQERITRmcfncZs6aVABedd5B85yQU5EULS4a5pnbpuI0Q==} peerDependencies: - graphql: ^16.6.0 + graphql: '*' dependencies: graphql: 16.8.1 /graphql-jit@0.8.2(graphql@16.8.1): resolution: {integrity: sha512-P9KtM/UY4JTtHVRqRlZzFXPmDEtps1Bd27Mvj/naQIa5d0j83zPxAx4jewq1wueF3UEZu1JFZwX1XVBBkoo1Mg==} peerDependencies: - graphql: ^16.6.0 + graphql: '>=15' dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) fast-json-stringify: 1.21.0 @@ -20751,7 +20918,7 @@ packages: resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} peerDependencies: - graphql: ^16.6.0 + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: graphql: 16.8.1 tslib: 2.6.2 @@ -20760,7 +20927,7 @@ packages: resolution: {integrity: sha512-umt4f5NnMK46ChM2coO36PTFhHouBrK9stWWBczERguwYrGnPNxJ9dimU6IyOBfOkC6Izhkg4H8+F51W/8CYDg==} engines: {node: '>=10'} peerDependencies: - graphql: ^16.6.0 + graphql: '>=0.11 <=16' dependencies: graphql: 16.8.1 @@ -20768,14 +20935,14 @@ packages: resolution: {integrity: sha512-LycmCwhZ+Op2GlHz4BZDsUYHKRiiUz+3r9wbhBATMETNlORQJAaFlAgTFoeRh6xQoQegwYwIylVD1Qns9/DA3w==} engines: {node: '>=10'} peerDependencies: - graphql: ^16.6.0 + graphql: '>=0.11 <=16' dependencies: graphql: 16.8.1 /graphql-yoga@3.9.1(graphql@16.8.1): resolution: {integrity: sha512-BB6EkN64VBTXWmf9Kym2OsVZFzBC0mAsQNo9eNB5xIr3t+x7qepQ34xW5A353NWol3Js3xpzxwIKFVF6l9VsPg==} peerDependencies: - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: '@envelop/core': 3.0.6 '@envelop/validation-cache': 5.1.3(@envelop/core@3.0.6)(graphql@16.8.1) @@ -20786,7 +20953,7 @@ packages: '@graphql-yoga/subscription': 3.1.0 '@whatwg-node/fetch': 0.8.8 '@whatwg-node/server': 0.7.7 - dset: 3.1.2 + dset: 3.1.3 graphql: 16.8.1 lru-cache: 7.18.3 tslib: 2.6.2 @@ -20795,7 +20962,7 @@ packages: resolution: {integrity: sha512-ZvZlO8MHMDWuLRoDhvJQnXg8SOJD0iDaCA+M/zWuD26AlhEugOEbpnhw/645oqXTYtvHsM91WyxtV7p5XJWYMg==} engines: {node: '>=18.0.0'} peerDependencies: - graphql: ^16.6.0 + graphql: ^15.2.0 || ^16.0.0 dependencies: '@envelop/core': 5.0.0 '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -20803,14 +20970,19 @@ packages: '@graphql-tools/utils': 10.0.7(graphql@16.8.1) '@graphql-yoga/logger': 2.0.0 '@graphql-yoga/subscription': 5.0.0 - '@whatwg-node/fetch': 0.9.13 - '@whatwg-node/server': 0.9.15 - dset: 3.1.2 + '@whatwg-node/fetch': 0.9.14 + '@whatwg-node/server': 0.9.16 + dset: 3.1.3 graphql: 16.8.1 lru-cache: 10.0.1 tslib: 2.6.2 dev: false + /graphql@15.5.0: + resolution: {integrity: sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA==} + engines: {node: '>= 10.x'} + dev: true + /graphql@16.8.1: resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} @@ -20882,7 +21054,7 @@ packages: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} - /hardhat-abi-exporter@2.10.1(hardhat@2.13.1): + /hardhat-abi-exporter@2.10.1(hardhat@2.18.3): resolution: {integrity: sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ==} engines: {node: '>=14.14.0'} peerDependencies: @@ -20890,17 +21062,17 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 delete-empty: 3.0.0 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) dev: true - /hardhat-gas-reporter@1.0.9(hardhat@2.13.1): + /hardhat-gas-reporter@1.0.9(hardhat@2.18.3): resolution: {integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==} peerDependencies: hardhat: ^2.0.2 dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -20909,18 +21081,17 @@ packages: - utf-8-validate dev: true - /hardhat-preprocessor@0.1.5(hardhat@2.13.1): + /hardhat-preprocessor@0.1.5(hardhat@2.18.3): resolution: {integrity: sha512-j8m44mmPxpxAAd0G8fPHRHOas/INZdzptSur0TNJvMEGcFdLDhbHHxBcqZVQ/bmiW42q4gC60AP4CXn9EF018g==} peerDependencies: hardhat: ^2.0.5 dependencies: - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) murmur-128: 0.2.1 dev: true - /hardhat@2.13.1(ts-node@10.9.1)(typescript@4.9.5): - resolution: {integrity: sha512-ZZL7LQxHmbw4JQJsiEv2qE35nbR+isr2sIdtgZVPp0+zWqRkpr1OT7gmvhCNYfjpEPyfjZIxWriQWlphJhVPLQ==} - engines: {node: '>=14.0.0'} + /hardhat@2.18.2(ts-node@10.9.1)(typescript@5.1.6): + resolution: {integrity: sha512-lUVmJg7DsKcUCDpqv57CJl6vHqo/1PeHSfM3+WIa8UtRKmXyVTj1qQK01TDiuetkZBVg9Dn52qU+ZwaJQynaKA==} hasBin: true peerDependencies: ts-node: '*' @@ -20933,21 +21104,88 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/ethereumjs-block': 5.0.0 - '@nomicfoundation/ethereumjs-blockchain': 7.0.0 - '@nomicfoundation/ethereumjs-common': 4.0.0 - '@nomicfoundation/ethereumjs-evm': 2.0.0 - '@nomicfoundation/ethereumjs-rlp': 5.0.0 - '@nomicfoundation/ethereumjs-statemanager': 2.0.0 - '@nomicfoundation/ethereumjs-trie': 6.0.0 - '@nomicfoundation/ethereumjs-tx': 5.0.0 - '@nomicfoundation/ethereumjs-util': 9.0.0 - '@nomicfoundation/ethereumjs-vm': 7.0.0 + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-blockchain': 7.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-evm': 2.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-statemanager': 2.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + '@nomicfoundation/ethereumjs-vm': 7.0.2 + '@nomicfoundation/solidity-analyzer': 0.1.1 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.3 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + chalk: 2.4.2 + chokidar: 3.5.3 + ci-info: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 2.1.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + glob: 7.2.0 + immutable: 4.3.4 + io-ts: 1.10.4 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.2.0 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.7.3(debug@4.3.4) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.1.6) + tsort: 0.0.1 + typescript: 5.1.6 + undici: 5.26.5 + uuid: 8.3.2 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /hardhat@2.18.3(ts-node@10.9.1)(typescript@4.9.5): + resolution: {integrity: sha512-JuYaTG+4ZHVjEHCW5Hn6jCHH3LpO75dtgznZpM/dLv12RcSlw/xHbeQh3FAsGahQr1epKryZcZEMHvztVZHe0g==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-blockchain': 7.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-evm': 2.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-statemanager': 2.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + '@nomicfoundation/ethereumjs-vm': 7.0.2 '@nomicfoundation/solidity-analyzer': 0.1.1 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.3 '@types/lru-cache': 5.1.1 - abort-controller: 3.0.0 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 @@ -20970,14 +21208,13 @@ packages: mnemonist: 0.38.5 mocha: 10.2.0 p-map: 4.0.0 - qs: 6.11.2 raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 solc: 0.7.3(debug@4.3.4) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + ts-node: 10.9.1(@types/node@18.18.7)(typescript@4.9.5) tsort: 0.0.1 typescript: 4.9.5 undici: 5.26.5 @@ -20988,9 +21225,8 @@ packages: - supports-color - utf-8-validate - /hardhat@2.13.1(typescript@5.1.6): - resolution: {integrity: sha512-ZZL7LQxHmbw4JQJsiEv2qE35nbR+isr2sIdtgZVPp0+zWqRkpr1OT7gmvhCNYfjpEPyfjZIxWriQWlphJhVPLQ==} - engines: {node: '>=14.0.0'} + /hardhat@2.18.3(typescript@5.1.6): + resolution: {integrity: sha512-JuYaTG+4ZHVjEHCW5Hn6jCHH3LpO75dtgznZpM/dLv12RcSlw/xHbeQh3FAsGahQr1epKryZcZEMHvztVZHe0g==} hasBin: true peerDependencies: ts-node: '*' @@ -21003,21 +21239,20 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/ethereumjs-block': 5.0.0 - '@nomicfoundation/ethereumjs-blockchain': 7.0.0 - '@nomicfoundation/ethereumjs-common': 4.0.0 - '@nomicfoundation/ethereumjs-evm': 2.0.0 - '@nomicfoundation/ethereumjs-rlp': 5.0.0 - '@nomicfoundation/ethereumjs-statemanager': 2.0.0 - '@nomicfoundation/ethereumjs-trie': 6.0.0 - '@nomicfoundation/ethereumjs-tx': 5.0.0 - '@nomicfoundation/ethereumjs-util': 9.0.0 - '@nomicfoundation/ethereumjs-vm': 7.0.0 + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-blockchain': 7.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-evm': 2.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-statemanager': 2.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + '@nomicfoundation/ethereumjs-vm': 7.0.2 '@nomicfoundation/solidity-analyzer': 0.1.1 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.3 '@types/lru-cache': 5.1.1 - abort-controller: 3.0.0 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 @@ -21040,7 +21275,6 @@ packages: mnemonist: 0.38.5 mocha: 10.2.0 p-map: 4.0.0 - qs: 6.11.2 raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 @@ -21225,10 +21459,6 @@ packages: capital-case: 1.0.4 tslib: 2.6.2 - /headers-polyfill@3.2.5: - resolution: {integrity: sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==} - dev: true - /heap@0.2.7: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} @@ -21270,6 +21500,7 @@ packages: /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + requiresBuild: true dependencies: react-is: 16.13.1 dev: false @@ -21313,6 +21544,7 @@ packages: /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true /html-minifier-terser@5.1.1: resolution: {integrity: sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==} @@ -21563,6 +21795,14 @@ packages: resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} dev: false + /i18n-js@4.3.2: + resolution: {integrity: sha512-n8gbEbQEueym2/q2yrZk5/xKWjFcKtg3/Escw4JHSVWa8qtKqP8j7se3UjkRbHlO/REqFA0V/MG1q8tEfyHeOA==} + dependencies: + bignumber.js: 9.1.2 + lodash: 4.17.21 + make-plural: 7.3.0 + dev: false + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -21739,27 +21979,6 @@ packages: wrap-ansi: 7.0.0 dev: true - /inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 6.2.0 - dev: true - /interface-blockstore@2.0.3: resolution: {integrity: sha512-OwVUnlNcx7H5HloK0Myv6c/C1q9cNG11HX6afdeU6q6kbuNj8jKCwVnmJHhC94LZaJ+9hvVOk4IUstb3Esg81w==} dependencies: @@ -22013,7 +22232,7 @@ packages: '@libp2p/interface-peer-info': 1.0.10 '@libp2p/interface-pubsub': 3.0.7 '@multiformats/multiaddr': 11.6.1 - '@types/node': 18.18.6 + '@types/node': 18.18.7 interface-datastore: 7.0.4 ipfs-unixfs: 8.0.0 multiformats: 10.0.3 @@ -22659,6 +22878,7 @@ packages: /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} + dev: true /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} @@ -22736,10 +22956,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - dev: true - /is-npm@5.0.0: resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} engines: {node: '>=10'} @@ -22961,8 +23177,8 @@ packages: get-intrinsic: 1.2.2 dev: true - /is-what@4.1.15: - resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==} + /is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} dev: false @@ -23052,6 +23268,7 @@ packages: ws: '*' dependencies: ws: 8.12.0 + dev: true /isomorphic-ws@5.0.0(ws@8.13.0): resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} @@ -23067,6 +23284,14 @@ packages: dependencies: ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + /isows@1.0.3(ws@8.13.0): + resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.13.0 + dev: false + /isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} dev: true @@ -23079,6 +23304,7 @@ packages: /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} + dev: true /istanbul-lib-hook@3.0.0: resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} @@ -23110,6 +23336,7 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: true /istanbul-lib-instrument@6.0.1: resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} @@ -23122,6 +23349,7 @@ packages: semver: 7.5.4 transitivePeerDependencies: - supports-color + dev: true /istanbul-lib-processinfo@2.0.3: resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} @@ -23142,6 +23370,7 @@ packages: istanbul-lib-coverage: 3.2.0 make-dir: 4.0.0 supports-color: 7.2.0 + dev: true /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} @@ -23152,6 +23381,7 @@ packages: source-map: 0.6.1 transitivePeerDependencies: - supports-color + dev: true /istanbul-reports@3.1.6: resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} @@ -23159,6 +23389,7 @@ packages: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + dev: true /isurl@1.0.0: resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==} @@ -23545,6 +23776,7 @@ packages: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 + dev: true /jest-circus@29.7.0: resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} @@ -23554,7 +23786,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -23573,8 +23805,9 @@ packages: transitivePeerDependencies: - babel-plugin-macros - supports-color + dev: true - /jest-cli@29.7.0(@types/node@18.18.6)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -23588,10 +23821,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -23600,8 +23833,9 @@ packages: - babel-plugin-macros - supports-color - ts-node + dev: true - /jest-config@29.7.0(@types/node@18.18.6)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -23616,7 +23850,7 @@ packages: '@babel/core': 7.23.2 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 babel-jest: 29.7.0(@babel/core@7.23.2) chalk: 4.1.2 ci-info: 3.9.0 @@ -23636,10 +23870,11 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.18.6)(typescript@4.9.5) + ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.1.6) transitivePeerDependencies: - babel-plugin-macros - supports-color + dev: true /jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} @@ -23649,12 +23884,14 @@ packages: diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 + dev: true /jest-docblock@29.7.0: resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 + dev: true /jest-each@29.7.0: resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} @@ -23665,6 +23902,7 @@ packages: jest-get-type: 29.6.3 jest-util: 29.7.0 pretty-format: 29.7.0 + dev: true /jest-environment-jsdom@29.7.0: resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} @@ -23679,7 +23917,7 @@ packages: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 18.18.6 + '@types/node': 18.18.7 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -23696,7 +23934,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -23709,11 +23947,20 @@ packages: jest: optional: true dependencies: - jest: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) + jest: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) jest-diff: 29.7.0 jest-get-type: 29.6.3 dev: true + /jest-fetch-mock@3.0.3: + resolution: {integrity: sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==} + dependencies: + cross-fetch: 3.1.8 + promise-polyfill: 8.3.0 + transitivePeerDependencies: + - encoding + dev: true + /jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -23724,7 +23971,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.8 - '@types/node': 18.18.6 + '@types/node': 18.18.7 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -23735,6 +23982,7 @@ packages: walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 + dev: true /jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} @@ -23742,6 +23990,7 @@ packages: dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 + dev: true /jest-matcher-utils@29.7.0: resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} @@ -23751,6 +24000,7 @@ packages: jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 + dev: true /jest-message-util@29.7.0: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} @@ -23771,7 +24021,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 jest-util: 29.7.0 /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -23784,6 +24034,7 @@ packages: optional: true dependencies: jest-resolve: 29.7.0 + dev: true /jest-regex-util@27.5.1: resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} @@ -23792,6 +24043,7 @@ packages: /jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true /jest-resolve-dependencies@29.7.0: resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} @@ -23801,6 +24053,7 @@ packages: jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color + dev: true /jest-resolve@29.7.0: resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} @@ -23815,6 +24068,7 @@ packages: resolve: 1.22.8 resolve.exports: 2.0.2 slash: 3.0.0 + dev: true /jest-runner@29.7.0: resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} @@ -23825,7 +24079,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -23843,6 +24097,7 @@ packages: source-map-support: 0.5.13 transitivePeerDependencies: - supports-color + dev: true /jest-runtime@29.7.0: resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} @@ -23855,7 +24110,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -23872,6 +24127,7 @@ packages: strip-bom: 4.0.0 transitivePeerDependencies: - supports-color + dev: true /jest-snapshot@29.7.0: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} @@ -23899,13 +24155,14 @@ packages: semver: 7.5.4 transitivePeerDependencies: - supports-color + dev: true /jest-util@27.5.1: resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 18.18.7 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -23916,7 +24173,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -23939,18 +24196,19 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.6 + '@types/node': 18.18.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 jest-util: 29.7.0 string-length: 4.0.2 + dev: true /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -23958,12 +24216,12 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@29.7.0(@types/node@18.18.6)(ts-node@10.9.1): + /jest@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -23976,17 +24234,17 @@ packages: '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + dev: true /jiti@1.20.0: resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==} hasBin: true - dev: false /joi@17.11.0: resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==} @@ -24002,6 +24260,10 @@ packages: engines: {node: '>=10'} dev: true + /js-base64@3.7.5: + resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} + dev: false + /js-confetti@0.11.0: resolution: {integrity: sha512-Hc7I3VI4r4H0nq5q/oQK+JJwGoYRYVHK72fGk8E9Ay1dbh+aiZ9yl0yFp1K4oYeq7YFDQAndYChwqLPA3QWQuA==} dev: false @@ -24009,11 +24271,6 @@ packages: /js-cookie@2.2.1: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} - /js-levenshtein@1.1.6: - resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} - engines: {node: '>=0.10.0'} - dev: true - /js-sdsl@4.4.2: resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} @@ -24147,7 +24404,6 @@ packages: /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true /json-logic-js@2.0.2: resolution: {integrity: sha512-ZBtBdMJieqQcH7IX/LaBsr5pX+Y5JIW+EhejtM3Ffg2jdN9Iwf+Ht6TbHnvAZ/YtwyuhPaCBlnvzrwVeWdvGDQ==} @@ -24169,7 +24425,7 @@ packages: engines: {node: '>=10.0.0'} dependencies: '@metamask/safe-event-emitter': 2.0.0 - eth-rpc-errors: 4.0.2 + eth-rpc-errors: 4.0.3 dev: false /json-rpc-middleware-stream@4.2.3: @@ -24225,7 +24481,6 @@ packages: /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -24239,6 +24494,7 @@ packages: /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + requiresBuild: true dependencies: minimist: 1.2.8 dev: true @@ -24382,7 +24638,6 @@ packages: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 - dev: true /keyvaluestorage-interface@1.0.0: resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} @@ -24581,7 +24836,6 @@ packages: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true /libp2p-crypto@0.21.2: resolution: {integrity: sha512-EXFrhSpiHtJ+/L8xXDvQNK5VjUMG51u878jzZcaT5XhuN/zFg6PWJFnl/qB2Y2j7eMWnvCRP7Kp+ua2H36cG4g==} @@ -24763,8 +25017,16 @@ packages: '@types/trusted-types': 2.0.5 dev: false - /lit@2.7.5: - resolution: {integrity: sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ==} + /lit@2.7.6: + resolution: {integrity: sha512-1amFHA7t4VaaDe+vdQejSVBklwtH9svGoG6/dZi9JhxtJBBlqY5D1RV7iLUYY0trCqQc4NfhYYZilZiVHt7Hxg==} + dependencies: + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 + dev: false + + /lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} dependencies: '@lit/reactive-element': 1.6.3 lit-element: 3.3.3 @@ -24877,10 +25139,15 @@ packages: /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true /lodash.clone@4.5.0: resolution: {integrity: sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==} + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: true + /lodash.curry@4.1.1: resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} dev: false @@ -24913,7 +25180,6 @@ packages: /lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: false /lodash.isfunction@3.0.9: resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} @@ -25212,10 +25478,15 @@ packages: engines: {node: '>=10'} dependencies: semver: 7.5.4 + dev: true /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + /make-plural@7.3.0: + resolution: {integrity: sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw==} + dev: false + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: @@ -25502,7 +25773,7 @@ packages: web-worker: 1.2.0 dev: false - /meros@1.3.0(@types/node@18.18.6): + /meros@1.3.0(@types/node@18.18.7): resolution: {integrity: sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==} engines: {node: '>=13'} peerDependencies: @@ -25511,7 +25782,7 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -26300,42 +26571,6 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /msw@1.3.2(typescript@4.9.5): - resolution: {integrity: sha512-wKLhFPR+NitYTkQl5047pia0reNGgf0P6a1eTnA5aNlripmiz0sabMvvHcicE8kQ3/gZcI0YiPFWmYfowfm3lA==} - engines: {node: '>=14'} - hasBin: true - requiresBuild: true - peerDependencies: - typescript: '>= 4.4.x <= 5.2.x' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@mswjs/cookies': 0.2.2 - '@mswjs/interceptors': 0.17.10 - '@open-draft/until': 1.0.3 - '@types/cookie': 0.4.1 - '@types/js-levenshtein': 1.1.2 - chalk: 4.1.2 - chokidar: 3.5.3 - cookie: 0.4.2 - graphql: 16.8.1 - headers-polyfill: 3.2.5 - inquirer: 8.2.6 - is-node-process: 1.2.0 - js-levenshtein: 1.1.6 - node-fetch: 2.7.0 - outvariant: 1.4.0 - path-to-regexp: 6.2.1 - strict-event-emitter: 0.4.6 - type-fest: 2.19.0 - typescript: 4.9.5 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - /multiaddr-to-uri@8.0.0(node-fetch@3.3.2): resolution: {integrity: sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA==} deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr-to-uri @@ -26376,8 +26611,8 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dev: false - /multiformats@12.1.2: - resolution: {integrity: sha512-6mRIsrZXyw5xNPO31IGBMmxgDXBSgCGDsBAtazkZ02ip4hMwZNrQvfxXZtytRoBSWuzSq5f9VmMnXj76fIz5FQ==} + /multiformats@12.1.3: + resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dev: false @@ -26537,7 +26772,7 @@ packages: '@next/env': 13.5.6 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001553 + caniuse-lite: 1.0.30001554 postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -26682,13 +26917,6 @@ packages: engines: {node: '>=12.19'} dev: true - /noms@0.0.0: - resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} - dependencies: - inherits: 2.0.4 - readable-stream: 1.0.34 - dev: true - /non-layered-tidy-tree-layout@2.0.2: resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} dev: false @@ -27017,8 +27245,9 @@ packages: /optimism@0.17.5: resolution: {integrity: sha512-TEcp8ZwK1RczmvMnvktxHSF2tKgMWjJ71xEFGX5ApLh67VsMSTy1ZUlipJw8W+KaqgOmQ+4pqwkeivY89j+4Vw==} + requiresBuild: true dependencies: - '@wry/context': 0.7.3 + '@wry/context': 0.7.4 '@wry/trie': 0.4.3 tslib: 2.6.2 dev: false @@ -27045,7 +27274,6 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true /ora@4.0.2: resolution: {integrity: sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==} @@ -27102,10 +27330,6 @@ packages: resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} dev: false - /outvariant@1.4.0: - resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} - dev: true - /p-cancelable@0.4.1: resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==} engines: {node: '>=4'} @@ -28135,7 +28359,6 @@ packages: /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - dev: true /prepend-http@2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} @@ -28170,6 +28393,7 @@ packages: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true + dev: true /pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} @@ -28227,7 +28451,7 @@ packages: engines: {node: '>=4'} dev: false - /primereact@9.6.3(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /primereact@9.6.3(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-E1Apj4zHeEqFuNR43PFmcpYO51V17PDaVuZmYggEUxZHUo7XWoqkOGg7896SRRMDMBQcO3+HXdJQXi6DOWRV1g==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -28237,7 +28461,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 '@types/react-transition-group': 4.4.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -28298,6 +28522,10 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + /promise-polyfill@8.3.0: + resolution: {integrity: sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==} + dev: true + /promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} dependencies: @@ -28359,7 +28587,7 @@ packages: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/long': 4.0.2 - '@types/node': 18.18.6 + '@types/node': 18.18.7 long: 4.0.0 /protobufjs@7.2.5: @@ -28377,7 +28605,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.18.6 + '@types/node': 18.18.7 long: 5.2.3 dev: false @@ -28462,6 +28690,7 @@ packages: /pure-rand@6.0.4: resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + dev: true /pvtsutils@1.3.5: resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} @@ -28658,7 +28887,7 @@ packages: pure-color: 1.3.0 dev: false - /react-dev-utils@12.0.1(typescript@4.9.5)(webpack@5.89.0): + /react-dev-utils@12.0.1(eslint@8.52.0)(typescript@4.9.5)(webpack@5.89.0): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -28677,7 +28906,7 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(typescript@4.9.5)(webpack@5.89.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.52.0)(typescript@4.9.5)(webpack@5.89.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -28700,8 +28929,8 @@ packages: - vue-template-compiler dev: false - /react-devtools-core@4.28.4: - resolution: {integrity: sha512-IUZKLv3CimeM07G3vX4H4loxVpByrzq3HvfTX7v9migalwvLs9ZY5D3S3pKR33U+GguYfBBdMMZyToFhsSE/iQ==} + /react-devtools-core@4.28.5: + resolution: {integrity: sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==} dependencies: shell-quote: 1.8.1 ws: 7.5.9 @@ -28757,6 +28986,7 @@ packages: /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + requiresBuild: true /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -28797,7 +29027,7 @@ packages: webpack: 5.89.0(webpack-cli@5.1.4) dev: false - /react-markdown@8.0.7(@types/react@18.2.31)(react@18.2.0): + /react-markdown@8.0.7(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} peerDependencies: '@types/react': '>=16' @@ -28805,7 +29035,7 @@ packages: dependencies: '@types/hast': 2.3.7 '@types/prop-types': 15.7.9 - '@types/react': 18.2.31 + '@types/react': 18.2.33 '@types/unist': 2.0.9 comma-separated-tokens: 2.0.3 hast-util-whitespace: 2.0.1 @@ -28879,7 +29109,7 @@ packages: pretty-format: 26.6.2 promise: 8.3.0 react: 18.2.0 - react-devtools-core: 4.28.4 + react-devtools-core: 4.28.5 react-refresh: 0.4.3 react-shallow-renderer: 16.15.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -28901,7 +29131,7 @@ packages: resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} engines: {node: '>=0.10.0'} - /react-remove-scroll-bar@2.3.4(@types/react@18.2.31)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -28911,13 +29141,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.31)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.33)(react@18.2.0) tslib: 2.6.2 dev: false - /react-remove-scroll@2.5.4(@types/react@18.2.31)(react@18.2.0): + /react-remove-scroll@2.5.4(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} engines: {node: '>=10'} peerDependencies: @@ -28927,13 +29157,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.31)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.31)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.33)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.33)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.0(@types/react@18.2.31)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.31)(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.33)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.33)(react@18.2.0) dev: false /react-router-config@5.1.1(react-router@5.3.4)(react@18.2.0): @@ -28988,7 +29218,7 @@ packages: react: 18.2.0 react-is: 18.2.0 - /react-style-singleton@2.2.1(@types/react@18.2.31)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -28998,7 +29228,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 @@ -29232,6 +29462,7 @@ packages: /reduce-flatten@2.0.0: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} + dev: true /reflect.getprototypeof@1.0.4: resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} @@ -29574,6 +29805,7 @@ packages: /resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} + dev: true /resolve@1.1.7: resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} @@ -29604,6 +29836,7 @@ packages: /response-iterator@0.2.6: resolution: {integrity: sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==} engines: {node: '>=0.8'} + requiresBuild: true dev: false /responselike@1.0.2: @@ -29730,7 +29963,7 @@ packages: semver: 5.7.2 dev: true - /rollup-plugin-dts@5.3.1(rollup@3.29.4)(typescript@4.9.5): + /rollup-plugin-dts@5.3.1(rollup@3.29.4)(typescript@5.1.6): resolution: {integrity: sha512-gusMi+Z4gY/JaEQeXnB0RUdU82h1kF0WYzCWgVmV4p3hWXqelaKuCvcJawfeg+EKn2T1Ie+YWF2OiN1/L8bTVg==} engines: {node: '>=v14.21.3'} peerDependencies: @@ -29739,7 +29972,7 @@ packages: dependencies: magic-string: 0.30.5 rollup: 3.29.4 - typescript: 4.9.5 + typescript: 5.1.6 optionalDependencies: '@babel/code-frame': 7.22.13 dev: true @@ -29868,8 +30101,8 @@ packages: '@babel/runtime': 7.23.2 dev: false - /rtl-detect@1.0.4: - resolution: {integrity: sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==} + /rtl-detect@1.1.2: + resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} dev: false /rtlcss@3.5.0: @@ -30578,7 +30811,7 @@ packages: resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} dev: true - /solidity-coverage@0.8.5(hardhat@2.13.1): + /solidity-coverage@0.8.5(hardhat@2.18.3): resolution: {integrity: sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==} hasBin: true peerDependencies: @@ -30594,7 +30827,7 @@ packages: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.13.1(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) jsonschema: 1.4.1 lodash: 4.17.21 mocha: 10.2.0 @@ -30609,6 +30842,10 @@ packages: - supports-color dev: true + /solmate@6.2.0: + resolution: {integrity: sha512-AM38ioQ2P8zRsA42zenb9or6OybRjOLXIu3lhIT8rhddUuduCt76pUEuLxOIg9GByGojGz+EbpFdCB6B+QZVVA==} + dev: true + /sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} dependencies: @@ -30657,6 +30894,7 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + dev: true /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -30919,16 +31157,6 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - /strict-event-emitter@0.2.8: - resolution: {integrity: sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==} - dependencies: - events: 3.3.0 - dev: true - - /strict-event-emitter@0.4.6: - resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} - dev: true - /strict-uri-encode@1.1.0: resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} engines: {node: '>=0.10.0'} @@ -30946,6 +31174,7 @@ packages: /string-format@2.0.0: resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + dev: true /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} @@ -30953,6 +31182,7 @@ packages: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 + dev: true /string-similarity@4.0.4: resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} @@ -31105,6 +31335,7 @@ packages: /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} + dev: true /strip-dirs@2.1.0: resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} @@ -31296,6 +31527,7 @@ packages: /symbol-observable@4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} + requiresBuild: true dev: false /symbol-tree@3.2.4: @@ -31325,6 +31557,7 @@ packages: deep-extend: 0.6.0 typical: 5.2.0 wordwrapjs: 4.0.1 + dev: true /table@6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} @@ -31436,6 +31669,7 @@ packages: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 + dev: true /testrpc@0.0.1: resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} @@ -31743,6 +31977,7 @@ packages: command-line-args: 5.2.1 command-line-usage: 6.1.3 string-format: 2.0.0 + dev: true /ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} @@ -31759,6 +31994,7 @@ packages: typescript: '>=3.7.0' dependencies: typescript: 4.9.5 + dev: true /ts-essentials@7.0.3(typescript@5.1.6): resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} @@ -31766,7 +32002,7 @@ packages: typescript: '>=3.7.0' dependencies: typescript: 5.1.6 - dev: false + dev: true /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -31775,6 +32011,7 @@ packages: /ts-invariant@0.10.3: resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} engines: {node: '>=8'} + requiresBuild: true dependencies: tslib: 2.6.2 dev: false @@ -31785,7 +32022,7 @@ packages: jest-resolve: 29.7.0 dev: true - /ts-jest@29.1.1(@babel/core@7.23.2)(babel-jest@29.7.0)(esbuild@0.17.19)(jest@29.7.0)(typescript@4.9.5): + /ts-jest@29.1.1(@babel/core@7.23.2)(babel-jest@29.7.0)(esbuild@0.17.19)(jest@29.7.0)(typescript@5.1.6): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -31811,13 +32048,13 @@ packages: bs-logger: 0.2.6 esbuild: 0.17.19 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.18.6)(ts-node@10.9.1) + jest: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.4 - typescript: 4.9.5 + typescript: 5.1.6 yargs-parser: 21.1.1 dev: true @@ -31850,7 +32087,7 @@ packages: tsconfig-paths: 3.14.2 dev: true - /ts-node@10.9.1(@types/node@18.18.6)(typescript@4.9.5): + /ts-node@10.9.1(@types/node@18.18.7)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -31869,7 +32106,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.18.6 + '@types/node': 18.18.7 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -31880,7 +32117,7 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-node@10.9.1(@types/node@18.18.6)(typescript@5.1.6): + /ts-node@10.9.1(@types/node@18.18.7)(typescript@5.1.6): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -31899,7 +32136,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.18.6 + '@types/node': 18.18.7 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -31910,38 +32147,6 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-node@10.9.1(@types/node@18.18.6)(typescript@5.2.2): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.18.6 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.2.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - optional: true - /ts-node@10.9.1(@types/node@20.5.1)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -31990,6 +32195,7 @@ packages: /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + requiresBuild: true dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -32008,6 +32214,9 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + /tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} @@ -32142,7 +32351,6 @@ packages: engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 - dev: true /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} @@ -32180,6 +32388,7 @@ packages: /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} + dev: false /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} @@ -32213,6 +32422,7 @@ packages: typescript: 4.9.5 transitivePeerDependencies: - supports-color + dev: true /typechain@8.3.2(typescript@5.1.6): resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} @@ -32233,7 +32443,7 @@ packages: typescript: 5.1.6 transitivePeerDependencies: - supports-color - dev: false + dev: true /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} @@ -32282,13 +32492,13 @@ packages: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true - /typedoc-plugin-markdown@3.16.0(typedoc@0.23.28): - resolution: {integrity: sha512-eeiC78fDNGFwemPIHiwRC+mEC7W5jwt3fceUev2gJ2nFnXpVHo8eRrpC9BLWZDee6ehnz/sPmNjizbXwpfaTBw==} + /typedoc-plugin-markdown@3.17.0(typedoc@0.23.28): + resolution: {integrity: sha512-+uh5fHNfNSGdUxae0FWOuJ8Xu9Sl08jkdshOg6dilAqN/ZXmYsUFFDKw70fYfiGxdCLvpUuyr9FYO+WAa2lHeA==} peerDependencies: typedoc: '>=0.24.0' dependencies: handlebars: 4.7.8 - typedoc: 0.23.28(typescript@4.9.5) + typedoc: 0.23.28(typescript@5.1.6) dev: true /typedoc-plugin-missing-exports@2.1.0(typedoc@0.23.28): @@ -32296,10 +32506,10 @@ packages: peerDependencies: typedoc: 0.24.x || 0.25.x dependencies: - typedoc: 0.23.28(typescript@4.9.5) + typedoc: 0.23.28(typescript@5.1.6) dev: true - /typedoc@0.23.28(typescript@4.9.5): + /typedoc@0.23.28(typescript@5.1.6): resolution: {integrity: sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==} engines: {node: '>= 14.14'} hasBin: true @@ -32310,7 +32520,7 @@ packages: marked: 4.3.0 minimatch: 7.4.6 shiki: 0.14.5 - typescript: 4.9.5 + typescript: 5.1.6 dev: true /typescript@4.9.5: @@ -32323,21 +32533,15 @@ packages: engines: {node: '>=14.17'} hasBin: true - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - requiresBuild: true - dev: true - optional: true - /typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} + dev: true /typical@5.2.0: resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} engines: {node: '>=8'} + dev: true /ua-parser-js@1.0.36: resolution: {integrity: sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==} @@ -32394,7 +32598,7 @@ packages: /uint8arrays@4.0.6: resolution: {integrity: sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw==} dependencies: - multiformats: 12.1.2 + multiformats: 12.1.3 dev: false /unbox-primitive@1.0.2: @@ -32421,6 +32625,9 @@ packages: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici@5.26.5: resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} engines: {node: '>=14.0'} @@ -32722,7 +32929,7 @@ packages: /urlpattern-polyfill@9.0.0: resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} - /use-callback-ref@1.3.0(@types/react@18.2.31)(react@18.2.0): + /use-callback-ref@1.3.0(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: @@ -32732,7 +32939,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 react: 18.2.0 tslib: 2.6.2 dev: false @@ -32770,7 +32977,7 @@ packages: use-isomorphic-layout-effect: 1.1.2(react@18.2.0) dev: false - /use-sidecar@1.1.2(@types/react@18.2.31)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -32780,7 +32987,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 @@ -32841,6 +33048,7 @@ packages: is-generator-function: 1.0.10 is-typed-array: 1.1.12 which-typed-array: 1.1.13 + dev: false /utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} @@ -32899,6 +33107,7 @@ packages: '@jridgewell/trace-mapping': 0.3.20 '@types/istanbul-lib-coverage': 2.0.5 convert-source-map: 2.0.0 + dev: true /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -32913,15 +33122,33 @@ packages: builtins: 5.0.1 dev: true - /valtio@1.10.6(react@18.2.0): - resolution: {integrity: sha512-SxN1bHUmdhW6V8qsQTpCgJEwp7uHbntuH0S9cdLQtiohuevwBksbpXjwj5uDMA7bLwg1WKyq9sEpZrx3TIMrkA==} + /valtio@1.11.0(react@18.2.0): + resolution: {integrity: sha512-65Yd0yU5qs86b5lN1eu/nzcTgQ9/6YnD6iO+DDaDbQLn1Zv2w12Gwk43WkPlUBxk5wL/6cD5YMFf7kj6HZ1Kpg==} + engines: {node: '>=12.20.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + dependencies: + proxy-compare: 2.5.1 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /valtio@1.11.2(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} engines: {node: '>=12.20.0'} peerDependencies: + '@types/react': '>=16.8' react: '>=16.8' peerDependenciesMeta: + '@types/react': + optional: true react: optional: true dependencies: + '@types/react': 18.2.33 proxy-compare: 2.5.1 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) @@ -33017,32 +33244,30 @@ packages: - zod dev: true - /viem@1.5.3(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-oImpSDDvm8Y72qxXV0pCAGAqQLYgo8YENdz9EKS8ExnnOJLascpex4LNazNyp9cksjm3ORpVpbqGMr9Cy1z2mg==} + /viem@1.18.4(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-im+y30k+IGT6VtfD/q1V0RX5PaiHPsFTHkKqvTjTqV+ZT8RgJXzOGPXr5E0uPIm2cbJAJp6A9nR9BCHY7BKR2Q==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true dependencies: - '@adraffy/ens-normalize': 1.9.0 - '@noble/curves': 1.0.0 - '@noble/hashes': 1.3.0 - '@scure/bip32': 1.3.0 - '@scure/bip39': 1.2.0 - '@types/ws': 8.5.8 - '@wagmi/chains': 1.6.0(typescript@5.1.6) - abitype: 0.9.3(typescript@5.1.6)(zod@3.22.4) - isomorphic-ws: 5.0.0(ws@8.12.0) + '@adraffy/ens-normalize': 1.9.4 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 0.9.8(typescript@5.1.6)(zod@3.22.4) + isows: 1.0.3(ws@8.13.0) typescript: 5.1.6 - ws: 8.12.0 + ws: 8.13.0 transitivePeerDependencies: - bufferutil - utf-8-validate - zod dev: false - /vite-node@0.28.5(@types/node@18.18.6): + /vite-node@0.28.5(@types/node@18.18.7): resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} engines: {node: '>=v14.16.0'} hasBin: true @@ -33054,7 +33279,7 @@ packages: picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 - vite: 4.5.0(@types/node@18.18.6) + vite: 4.5.0(@types/node@18.18.7) transitivePeerDependencies: - '@types/node' - less @@ -33066,7 +33291,7 @@ packages: - terser dev: true - /vite@4.5.0(@types/node@18.18.6): + /vite@4.5.0(@types/node@18.18.7): resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -33094,7 +33319,7 @@ packages: terser: optional: true dependencies: - '@types/node': 18.18.6 + '@types/node': 18.18.7 esbuild: 0.18.20 postcss: 8.4.31 rollup: 3.29.4 @@ -33126,7 +33351,7 @@ packages: dependencies: '@types/chai': 4.3.9 '@types/chai-subset': 1.3.4 - '@types/node': 18.18.6 + '@types/node': 18.18.7 '@vitest/expect': 0.28.5 '@vitest/runner': 0.28.5 '@vitest/spy': 0.28.5 @@ -33145,8 +33370,8 @@ packages: tinybench: 2.5.1 tinypool: 0.3.1 tinyspy: 1.1.1 - vite: 4.5.0(@types/node@18.18.6) - vite-node: 0.28.5(@types/node@18.18.6) + vite: 4.5.0(@types/node@18.18.7) + vite-node: 0.28.5(@types/node@18.18.7) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -33195,8 +33420,8 @@ packages: hasBin: true dev: true - /wagmi@1.3.9(@types/react@18.2.31)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4): - resolution: {integrity: sha512-BQbl+vWLNpLraXd/MWsl1P3I41l7DHrujx6qshIa1HDV7Mdh0GNrDuluRYBtuK2bBx9WM/Fjw45Ef2aKADan9A==} + /wagmi@1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4): + resolution: {integrity: sha512-Ph62E6cO5n2Z8Z5LTyZrkaNprxTsbC4w0qZJT4OJdXrEELziI8z/b4FO6amVFXdu2rDp/wpvF56e4mhKC8/Kdw==} peerDependencies: react: '>=17.0.0' typescript: '>=5.0.4' @@ -33208,12 +33433,12 @@ packages: '@tanstack/query-sync-storage-persister': 4.36.1 '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0) '@tanstack/react-query-persist-client': 4.36.1(@tanstack/react-query@4.36.1) - '@wagmi/core': 1.3.8(@types/react@18.2.31)(react@18.2.0)(typescript@5.1.6)(viem@1.5.3)(zod@3.22.4) + '@wagmi/core': 1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) react: 18.2.0 typescript: 5.1.6 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 1.5.3(typescript@5.1.6)(zod@3.22.4) + viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@types/react' @@ -33284,6 +33509,7 @@ packages: util: 0.12.5 optionalDependencies: '@zxing/text-encoding': 0.9.0 + dev: false /web-namespaces@1.1.4: resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} @@ -33744,6 +33970,7 @@ packages: dependencies: reduce-flatten: 2.0.0 typical: 5.2.0 + dev: true /workerpool@6.2.1: resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} @@ -33834,6 +34061,7 @@ packages: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 + dev: true /ws@6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} @@ -33896,6 +34124,7 @@ packages: optional: true utf-8-validate: optional: true + dev: true /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} @@ -33924,6 +34153,18 @@ packages: bufferutil: 4.0.8 utf-8-validate: 5.0.10 + /ws@8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + /xdg-basedir@4.0.0: resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} engines: {node: '>=8'} @@ -34152,12 +34393,14 @@ packages: /zen-observable-ts@1.2.5: resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} + requiresBuild: true dependencies: zen-observable: 0.8.15 dev: false /zen-observable@0.8.15: resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} + requiresBuild: true dev: false /zod-to-json-schema@3.21.4(zod@3.22.4): @@ -34170,7 +34413,7 @@ packages: /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - /zustand@4.4.4(@types/react@18.2.31)(react@18.2.0): + /zustand@4.4.4(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-5UTUIAiHMNf5+mFp7/AnzJXS7+XxktULFN0+D1sCiZWyX7ZG+AQpqs2qpYrynRij4QvoDdCD+U+bmg/cG3Ucxw==} engines: {node: '>=12.7.0'} peerDependencies: @@ -34185,7 +34428,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index aaa9186b..fcd6e04d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,6 +4,6 @@ packages: - "docs" - "frontend" - "graph" - - "vendor/observabletreemap" - "sdk" + - "vendor/observabletreemap" - "contracts" diff --git a/sdk/.graphclient/index.ts b/sdk/.graphclient/index.ts index ee00cdac..95f59d60 100644 --- a/sdk/.graphclient/index.ts +++ b/sdk/.graphclient/index.ts @@ -282,7 +282,7 @@ export type Claim = { creator?: Maybe; owner?: Maybe; totalUnits?: Maybe; - chainName: Scalars['String']; + graphName: Scalars['String']; }; export type ClaimToken = { @@ -291,7 +291,7 @@ export type ClaimToken = { claim: Claim; owner: Scalars['Bytes']; units: Scalars['BigInt']; - chainName: Scalars['String']; + graphName: Scalars['String']; }; export type ClaimToken_filter = { @@ -681,21 +681,21 @@ export type ResolversParentTypes = ResolversObject<{ export type entityDirectiveArgs = { }; -export type entityDirectiveResolver = DirectiveResolverFn; +export type entityDirectiveResolver = DirectiveResolverFn; export type subgraphIdDirectiveArgs = { id: Scalars['String']; }; -export type subgraphIdDirectiveResolver = DirectiveResolverFn; +export type subgraphIdDirectiveResolver = DirectiveResolverFn; export type derivedFromDirectiveArgs = { field: Scalars['String']; }; -export type derivedFromDirectiveResolver = DirectiveResolverFn; +export type derivedFromDirectiveResolver = DirectiveResolverFn; -export type QueryResolvers = ResolversObject<{ +export type QueryResolvers = ResolversObject<{ allowlist?: Resolver, ParentType, ContextType, RequireFields>; allowlists?: Resolver, ParentType, ContextType, RequireFields>; claim?: Resolver, ParentType, ContextType, RequireFields>; @@ -705,7 +705,7 @@ export type QueryResolvers, ParentType, ContextType, Partial>; }>; -export type SubscriptionResolvers = ResolversObject<{ +export type SubscriptionResolvers = ResolversObject<{ allowlist?: SubscriptionResolver, "allowlist", ParentType, ContextType, RequireFields>; allowlists?: SubscriptionResolver, "allowlists", ParentType, ContextType, RequireFields>; claim?: SubscriptionResolver, "claim", ParentType, ContextType, RequireFields>; @@ -715,7 +715,7 @@ export type SubscriptionResolvers, "_meta", ParentType, ContextType, Partial>; }>; -export type AllowlistResolvers = ResolversObject<{ +export type AllowlistResolvers = ResolversObject<{ id?: Resolver; root?: Resolver; claim?: Resolver; @@ -734,7 +734,7 @@ export interface BytesScalarConfig extends GraphQLScalarTypeConfig = ResolversObject<{ +export type ClaimResolvers = ResolversObject<{ id?: Resolver; creation?: Resolver; tokenID?: Resolver; @@ -743,17 +743,17 @@ export type ClaimResolvers, ParentType, ContextType>; owner?: Resolver, ParentType, ContextType>; totalUnits?: Resolver, ParentType, ContextType>; - chainName?: Resolver; + graphName?: Resolver; __isTypeOf?: IsTypeOfResolverFn; }>; -export type ClaimTokenResolvers = ResolversObject<{ +export type ClaimTokenResolvers = ResolversObject<{ id?: Resolver; tokenID?: Resolver; claim?: Resolver; owner?: Resolver; units?: Resolver; - chainName?: Resolver; + graphName?: Resolver; __isTypeOf?: IsTypeOfResolverFn; }>; @@ -761,21 +761,21 @@ export interface Int8ScalarConfig extends GraphQLScalarTypeConfig = ResolversObject<{ +export type _Block_Resolvers = ResolversObject<{ hash?: Resolver, ParentType, ContextType>; number?: Resolver; timestamp?: Resolver, ParentType, ContextType>; __isTypeOf?: IsTypeOfResolverFn; }>; -export type _Meta_Resolvers = ResolversObject<{ +export type _Meta_Resolvers = ResolversObject<{ block?: Resolver; deployment?: Resolver; hasIndexingErrors?: Resolver; __isTypeOf?: IsTypeOfResolverFn; }>; -export type Resolvers = ResolversObject<{ +export type Resolvers = ResolversObject<{ Query?: QueryResolvers; Subscription?: SubscriptionResolvers; Allowlist?: AllowlistResolvers; @@ -789,7 +789,7 @@ export type Resolvers; }>; -export type DirectiveResolvers = ResolversObject<{ +export type DirectiveResolvers = ResolversObject<{ entity?: entityDirectiveResolver; subgraphId?: subgraphIdDirectiveResolver; derivedFrom?: derivedFromDirectiveResolver; @@ -798,8 +798,7 @@ export type DirectiveResolvers(moduleId: string) => { const relativeModuleId = (pathModule.isAbsolute(moduleId) ? pathModule.relative(baseDir, moduleId) : moduleId).split('\\').join('/').replace(baseDir + '/', ''); @@ -853,7 +852,7 @@ sources[0] = { handler: hypercertsHandler, transforms: hypercertsTransforms } -const additionalTypeDefs = [parse("extend type Claim {\n chainName: String!\n}\n\nextend type ClaimToken {\n chainName: String!\n}"),] as any[]; +const additionalTypeDefs = [parse("extend type Claim {\n graphName: String!\n}\n\nextend type ClaimToken {\n graphName: String!\n}"),] as any[]; additionalEnvelopPlugins[0] = await UsePollingLive({ ...({ "defaultInterval": 5000 @@ -969,7 +968,7 @@ export type ClaimsByOwnerQueryVariables = Exact<{ }>; -export type ClaimsByOwnerQuery = { claims: Array> }; +export type ClaimsByOwnerQuery = { claims: Array> }; export type RecentClaimsQueryVariables = Exact<{ orderDirection?: InputMaybe; @@ -978,14 +977,14 @@ export type RecentClaimsQueryVariables = Exact<{ }>; -export type RecentClaimsQuery = { claims: Array> }; +export type RecentClaimsQuery = { claims: Array> }; export type ClaimByIdQueryVariables = Exact<{ id: Scalars['ID']; }>; -export type ClaimByIdQuery = { claim?: Maybe> }; +export type ClaimByIdQuery = { claim?: Maybe> }; export type ClaimTokensByOwnerQueryVariables = Exact<{ owner?: InputMaybe; @@ -996,7 +995,7 @@ export type ClaimTokensByOwnerQueryVariables = Exact<{ export type ClaimTokensByOwnerQuery = { claimTokens: Array<( - Pick + Pick & { claim: Pick } )> }; @@ -1008,7 +1007,7 @@ export type ClaimTokensByClaimQueryVariables = Exact<{ }>; -export type ClaimTokensByClaimQuery = { claimTokens: Array> }; +export type ClaimTokensByClaimQuery = { claimTokens: Array> }; export type ClaimTokenByIdQueryVariables = Exact<{ claimTokenId: Scalars['ID']; @@ -1016,7 +1015,7 @@ export type ClaimTokenByIdQueryVariables = Exact<{ export type ClaimTokenByIdQuery = { claimToken?: Maybe<( - Pick + Pick & { claim: Pick } )> }; @@ -1029,7 +1028,7 @@ export const ClaimsByOwnerDocument = gql` first: $first orderDirection: $orderDirection ) { - chainName + graphName contract tokenID creator @@ -1043,7 +1042,7 @@ export const ClaimsByOwnerDocument = gql` export const RecentClaimsDocument = gql` query RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) { claims(orderDirection: $orderDirection, orderBy: creation, first: $first) { - chainName + graphName contract tokenID creator @@ -1057,7 +1056,7 @@ export const RecentClaimsDocument = gql` export const ClaimByIdDocument = gql` query ClaimById($id: ID!) { claim(id: $id) { - chainName + graphName contract tokenID creator @@ -1076,7 +1075,7 @@ export const ClaimTokensByOwnerDocument = gql` first: $first orderDirection: $orderDirection ) { - chainName + graphName id owner tokenID @@ -1098,7 +1097,7 @@ export const ClaimTokensByClaimDocument = gql` first: $first orderDirection: $orderDirection ) { - chainName + graphName id owner tokenID @@ -1109,7 +1108,7 @@ export const ClaimTokensByClaimDocument = gql` export const ClaimTokenByIdDocument = gql` query ClaimTokenById($claimTokenId: ID!) { claimToken(id: $claimTokenId) { - chainName + graphName id owner tokenID diff --git a/sdk/.graphclient/schema.graphql b/sdk/.graphclient/schema.graphql index 8694426f..56dc3bc8 100644 --- a/sdk/.graphclient/schema.graphql +++ b/sdk/.graphclient/schema.graphql @@ -281,7 +281,7 @@ type Claim { creator: Bytes owner: Bytes totalUnits: BigInt - chainName: String! + graphName: String! } type ClaimToken { @@ -290,7 +290,7 @@ type ClaimToken { claim: Claim! owner: Bytes! units: BigInt! - chainName: String! + graphName: String! } input ClaimToken_filter { diff --git a/sdk/.graphclientrc.yml b/sdk/.graphclientrc.yml index bf07ad3d..9087a374 100644 --- a/sdk/.graphclientrc.yml +++ b/sdk/.graphclientrc.yml @@ -8,10 +8,10 @@ sources: additionalTypeDefs: | extend type Claim { - chainName: String! + graphName: String! } extend type ClaimToken { - chainName: String! + graphName: String! } additionalResolvers: @@ -21,7 +21,7 @@ documents: - ./src/indexer/queries/*.graphql codegen: - contextType: "MeshContext & { graphUrl: string, chainName: string }" + contextType: "MeshContext & { graphUrl: string, graphName: string }" plugins: - pollingLive: diff --git a/sdk/jest.config.ts b/sdk/jest.config.ts index 263def76..7d3d6afb 100644 --- a/sdk/jest.config.ts +++ b/sdk/jest.config.ts @@ -6,7 +6,6 @@ const config: Config = { setupFiles: ["./test/setup-env.ts"], setupFilesAfterEnv: ["jest-extended/all"], rootDir: ".", - moduleDirectories: ["node_modules", "/src", ".graphclient"], moduleNameMapper: { "^(\\.{1,2}/.*)\\.js$": "$1", "^@hypercerts-org/contracts$": require.resolve("@hypercerts-org/contracts"), // this is the trick! @@ -15,6 +14,7 @@ const config: Config = { resolver: "ts-jest-resolver", moduleFileExtensions: ["js", "jsx", "json", "ts"], transform: {}, + workerThreads: true, }; export default config; diff --git a/sdk/package.json b/sdk/package.json index 1227f74b..91b39d68 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "0.8.16", + "version": "1.0.0-alpha.6", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -23,7 +23,7 @@ "package.json" ], "dependencies": { - "@ethereum-attestation-service/eas-sdk": "^0.28.3", + "@ethereum-attestation-service/eas-sdk": "1.2.2-beta.0", "@ethersproject/abstract-signer": "^5.7.0", "@graphprotocol/client-add-source-name": "^1.0.16", "@graphprotocol/client-polling-live": "^2.0.0", @@ -43,13 +43,13 @@ "ajv": "^8.11.2", "axios": "^1.2.2", "dotenv": "^16.0.3", - "ethers": "^5.7.2", + "ethers": "5.7.2", "graphql": "^16.6.0", "ipfs-core": "^0.17.0", - "jest": "^29.3.1", "loglevel": "^1.8.1", "mime": "^3.0.0", "nft.storage": "^7.1.1", + "viem": "^1.18.4", "web3.storage": "^4.5.5" }, "devDependencies": { @@ -65,8 +65,11 @@ "@types/chai": "^4.3.4", "@types/chai-subset": "^1.3.3", "@types/jest": "^29.2.5", + "@types/mocha": "9.1.0", "@types/node": "^18.11.17", "@types/sinon": "^10.0.15", + "@viem/anvil": "^0.0.6", + "abitype": "^0.10.2", "babel-jest": "^29.7.0", "chai": "^4.3.7", "chai-assertions-count": "^1.0.2", @@ -74,9 +77,10 @@ "esbuild": "^0.17.10", "ethereum-waffle": "^4.0.10", "it-all": "^2.0.0", + "jest": "^29.3.1", "jest-extended": "^4.0.0", + "jest-fetch-mock": "^3.0.3", "json-schema-to-typescript": "^12.0.0", - "msw": "^1.2.1", "nyc": "^15.1.0", "rollup": "^3.17.2", "rollup-plugin-auto-external": "^2.0.0", @@ -94,7 +98,7 @@ "typedoc": "^0.23.25", "typedoc-plugin-markdown": "^3.14.0", "typedoc-plugin-missing-exports": "^2.0.0", - "typescript": "^4.9.0" + "typescript": "5.1.6" }, "scripts": { "build": "pnpm types:json && pnpm graph:build:esm && rollup -c", @@ -106,7 +110,7 @@ "clean": "rm -rf ./dist", "prebuild": "pnpm clean", "prepack": "pnpm build", - "test": "NODE_OPTIONS=\"--no-warnings --experimental-vm-modules\" jest", + "test": "NODE_OPTIONS=\"--no-warnings --experimental-vm-modules\" jest --detectOpenHandles --forceExit", "types:json": "pnpm json2ts -i './src/resources/schema/' -o 'src/types' --cwd './src/resources/schema'" } } diff --git a/sdk/src/client.ts b/sdk/src/client.ts index 6163bf03..63b24c01 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -1,11 +1,9 @@ -import { HypercertMinter, HypercertMinterAbi } from "@hypercerts-org/contracts"; +import { HypercertMinterAbi } from "@hypercerts-org/contracts"; import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; -import { BigNumber, BigNumberish, BytesLike, ContractTransaction, ethers, providers } from "ethers"; - -import { DEFAULT_CHAIN_ID } from "./constants.js"; -import HypercertEvaluator from "./evaluations/index.js"; -import HypercertIndexer from "./indexer.js"; -import HypercertsStorage from "./storage.js"; +import { ByteArray, GetContractReturnType, Hex, PublicClient, WalletClient, getContract, parseAbi } from "viem"; +import HypercertEvaluator from "./evaluations"; +import HypercertIndexer from "./indexer"; +import HypercertsStorage from "./storage"; import { AllowlistEntry, ClientError, @@ -14,52 +12,60 @@ import { HypercertMetadata, InvalidOrMissingError, MalformedDataError, + SupportedOverrides, TransferRestrictions, -} from "./types/index.js"; -import { getConfig } from "./utils/config.js"; -import logger from "./utils/logger.js"; -import { validateAllowlist, validateMetaData, verifyMerkleProof, verifyMerkleProofs } from "./validator/index.js"; +} from "./types"; +import { getConfig } from "./utils/config"; +import logger from "./utils/logger"; +import { validateAllowlist, validateMetaData, verifyMerkleProof, verifyMerkleProofs } from "./validator"; /** - * Hypercerts client factory - * @dev Creates a Hypercerts client instance - * @notice The client is readonly if no signer is set or if the contract address is not set + * The `HypercertClient` is a core class in the hypercerts SDK, providing a high-level interface to interact with the hypercerts system. + * + * It encapsulates the logic for storage, evaluation, indexing, and wallet interactions, abstracting the complexity and providing a simple API for users. + * The client is read-only if the storage is read-only (no nft.storage/web3.storage keys) or if no walletClient was found. + * + * Here's an example of how to create a new instance of `HypercertClient`: + * + * ```typescript + * const config: Partial = { + * id: 5 + * }; + * + * const client = new HypercertClient(config); + * ``` + * * @param config - Hypercerts client configuration - * @param storage - Hypercerts storage object + * @dev Creates a Hypercerts client instance */ export default class HypercertClient implements HypercertClientInterface { - readonly _config: HypercertClientConfig; + readonly _config; private _storage: HypercertsStorage; - private _evaluator: HypercertEvaluator; + // TODO better handling readonly. For now not needed since we don't use this class; + private _evaluator?: HypercertEvaluator; private _indexer: HypercertIndexer; - //TODO added the TypedDataSigner since that's needed for EAS signing. Will this work on front-end? - private _operator: ethers.providers.Provider | ethers.Signer; - private _contract: HypercertMinter; + private _publicClient: PublicClient; + private _walletClient?: WalletClient; readonly: boolean; /** * Creates a new instance of the `HypercertClient` class. * @param config The configuration options for the client. */ - constructor(config = { chainId: DEFAULT_CHAIN_ID } as Partial) { + constructor(config: Partial) { this._config = getConfig(config); - this._operator = this._config.operator; + if (!this._config.publicClient) { + throw new ClientError("Could not connect to public client."); + } - this._contract = ( - new ethers.Contract(this._config.contractAddress, HypercertMinterAbi, this._operator) - ); + this._publicClient = this._config.publicClient; + this._walletClient = this._config?.walletClient; this._storage = new HypercertsStorage(this._config); this._indexer = new HypercertIndexer(this._config); - this._evaluator = new HypercertEvaluator(this._config); - - this.readonly = - providers.Provider.isProvider(this._operator) || - !ethers.Signer.isSigner(this._operator) || - !this._config.contractAddress || - this._storage.readonly; + this.readonly = this._config.readOnly || this._storage.readonly || !this._walletClient; if (this.readonly) { logger.warn("HypercertsClient is in readonly mode", "client"); @@ -70,7 +76,7 @@ export default class HypercertClient implements HypercertClientInterface { * Gets the config for the client. * @returns The client config. */ - get config(): HypercertClientConfig { + get config(): Partial { return this._config; } @@ -94,8 +100,13 @@ export default class HypercertClient implements HypercertClientInterface { * Gets the HypercertMinter contract used by the client. * @returns The contract. */ - get contract(): HypercertMinter { - return this._contract; + get contract(): GetContractReturnType { + return getContract({ + address: this._config.contractAddress as `0x${string}`, + abi: parseAbi(HypercertMinterAbi), + publicClient: this._publicClient, + walletClient: this._walletClient, + }); } /** @@ -108,17 +119,11 @@ export default class HypercertClient implements HypercertClientInterface { */ mintClaim = async ( metaData: HypercertMetadata, - totalUnits: BigNumberish, + totalUnits: bigint, transferRestriction: TransferRestrictions, - overrides?: ethers.Overrides, - ): Promise => { - this.checkWritable(); - - if (!ethers.Signer.isSigner(this._config.operator)) { - throw new InvalidOrMissingError("Invalid operator: not a signer", { operator: this._config.operator }); - } - - const signerAddress = await this._config.operator.getAddress(); + overrides?: SupportedOverrides, + ) => { + const { account } = this.getWallet(); // validate metadata const { valid, errors } = validateMetaData(metaData); @@ -129,9 +134,15 @@ export default class HypercertClient implements HypercertClientInterface { // store metadata on IPFS const cid = await this.storage.storeMetadata(metaData); - return overrides - ? this.contract.mintClaim(signerAddress, totalUnits, cid, transferRestriction, overrides) - : this.contract.mintClaim(signerAddress, totalUnits, cid, transferRestriction); + const { request } = await this._publicClient.simulateContract({ + functionName: "mintClaim", + account, + args: [account?.address, totalUnits, cid, transferRestriction], + ...this.getContractConfig(), + ...this.getCleanedOverrides(overrides), + }); + + return this.submitRequest(request); }; /** @@ -147,17 +158,11 @@ export default class HypercertClient implements HypercertClientInterface { createAllowlist = async ( allowList: AllowlistEntry[], metaData: HypercertMetadata, - totalUnits: BigNumberish, + totalUnits: bigint, transferRestriction: TransferRestrictions, - overrides?: ethers.Overrides, + overrides?: SupportedOverrides, ) => { - this.checkWritable(); - - if (!ethers.Signer.isSigner(this._config.operator)) { - throw new InvalidOrMissingError("Invalid operator: not a signer", { operator: this._config.operator }); - } - - const signerAddress = await this._config.operator.getAddress(); + const { account } = this.getWallet(); // validate allowlist const { valid: validAllowlist, errors: allowlistErrors } = validateAllowlist(allowList, totalUnits); @@ -172,105 +177,129 @@ export default class HypercertClient implements HypercertClientInterface { } // create allowlist - const tuples = allowList.map((p) => [p.address, p.units]); + const tuples = allowList.map((p) => [p.address, p.units.toString()]); const tree = StandardMerkleTree.of(tuples, ["address", "uint256"]); const cidMerkle = await this.storage.storeData(JSON.stringify(tree.dump())); - metaData.allowList = cidMerkle; - // store metadata on IPFS - const cid = await this.storage.storeMetadata(metaData); + const cid = await this.storage.storeMetadata({ ...metaData, allowList: cidMerkle }); + + const { request } = await this._publicClient.simulateContract({ + functionName: "createAllowlist", + account, + args: [account?.address, totalUnits, tree.root, cid, transferRestriction], + ...this.getContractConfig(), + ...this.getCleanedOverrides(overrides), + }); - return overrides - ? this.contract.createAllowlist(signerAddress, totalUnits, tree.root, cid, transferRestriction, overrides) - : this.contract.createAllowlist(signerAddress, totalUnits, tree.root, cid, transferRestriction); + return this.submitRequest(request); }; /** * Split a Hypercert's unit into multiple claims with the given fractions * @dev Submit the ID of the claim to split and new fraction values. * @notice The sum of the fractions must be equal to the total units of the claim - * @param claimId - Hypercert claim id - * @param fractions - Fractions of the Hypercert claim to split + * @param fractionId - Hypercert claim id + * @param newFractions - Fractions of the Hypercert claim to split * @returns Contract transaction */ - splitClaimUnits = async (claimId: BigNumberish, fractions: BigNumberish[], overrides?: ethers.Overrides) => { - this.checkWritable(); + splitFractionUnits = async (fractionId: bigint, fractions: bigint[], overrides?: SupportedOverrides) => { + const { account } = this.getWallet(); - // check if claim exists and is owned by the signer - if (!ethers.Signer.isSigner(this._config.operator)) { - throw new InvalidOrMissingError("Invalid operator: not a signer", { operator: this._config.operator }); - } + const readContract = getContract({ + ...this.getContractConfig(), + publicClient: this._publicClient, + }); - const signerAddress = await this._config.operator.getAddress(); + const fractionOwner = (await readContract.read.ownerOf([fractionId])) as `0x${string}`; + const totalUnits = (await readContract.read.unitsOf([fractionId])) as bigint; - const claimOwner = await this._contract.ownerOf(claimId); - if (claimOwner.toLowerCase() !== signerAddress.toLowerCase()) - throw new ClientError("Claim is not owned by the signer", { signer: signerAddress, claimOwner }); + if (fractionOwner.toLowerCase() !== account?.address.toLowerCase()) + throw new ClientError("Claim is not owned by the signer", { signer: account?.address, fractionOwner }); // check if the sum of the fractions is equal to the total units - const totalUnits = await this._contract["unitsOf(uint256)"](claimId); - const sumFractions = fractions.reduce((a, b) => BigNumber.from(a).add(b), BigNumber.from(0)); - if (!BigNumber.from(sumFractions).eq(totalUnits)) + const sumFractions = fractions.reduce((a, b) => a + b, 0n); + if (sumFractions != totalUnits) throw new ClientError("Sum of fractions is not equal to the total units", { totalUnits, sumFractions }); - return overrides - ? this.contract.splitFraction(signerAddress, claimId, fractions, overrides) - : this.contract.splitFraction(signerAddress, claimId, fractions); + const { request } = await this._publicClient.simulateContract({ + functionName: "splitFraction", + account, + args: [account.address, fractionId, fractions], + ...this.getContractConfig(), + ...this.getCleanedOverrides(overrides), + }); + + return this.submitRequest(request); }; /** * Merge multiple Hypercert claims fractions into one * @dev Merges multiple Hypercert claims into one - * @param claimIds - Hypercert claim ids + * @param fractionIds - Hypercert claim ids * @returns Contract transaction */ - mergeClaimUnits = async (claimIds: BigNumberish[], overrides?: ethers.Overrides) => { - this.checkWritable(); + mergeFractionUnits = async (fractionIds: bigint[], overrides?: SupportedOverrides) => { + const { account } = this.getWallet(); - // check if all claims exist and are owned by the signer - if (!ethers.Signer.isSigner(this._config.operator)) { - throw new InvalidOrMissingError("Invalid operator: not a signer", { operator: this._config.operator }); - } + const readContract = getContract({ + ...this.getContractConfig(), + publicClient: this._publicClient, + }); - const signerAddress = await this._config.operator.getAddress(); + const fractions = await Promise.all( + fractionIds.map(async (id) => ({ id, owner: (await readContract.read.ownerOf([id])) as `0x${string}` })), + ); + + const notOwned = fractions.filter((fraction) => fraction.owner.toLowerCase() !== account?.address.toLowerCase()); - const claims = await Promise.all(claimIds.map(async (id) => ({ id, owner: await this._contract.ownerOf(id) }))); - if (claims.some((c) => c.owner.toLowerCase() !== signerAddress.toLowerCase())) { - const invalidClaimIDs = claims.filter((c) => c.owner !== signerAddress).map((c) => c.id); - throw new ClientError("One or more claims are not owned by the signer", { - signer: signerAddress, - claims: invalidClaimIDs, + if (notOwned.length > 0) { + throw new ClientError("One or more fractions are not owned by the signer", { + signer: account?.address, + notOwned, }); } - return overrides - ? this.contract.mergeFractions(signerAddress, claimIds, overrides) - : this.contract.mergeFractions(signerAddress, claimIds); + const { request } = await this._publicClient.simulateContract({ + functionName: "mergeFractions", + account, + args: [account?.address, fractionIds], + ...this.getContractConfig(), + ...this.getCleanedOverrides(overrides), + }); + + return this.submitRequest(request); }; /** * Burn a Hypercert claim by providing the claim id * @dev Burns a Hypercert claim - * @param claimId - Hypercert claim id + * @param fractionId - Hypercert claim id * @returns Contract transaction */ - burnClaimFraction = async (claimId: BigNumberish, overrides?: ethers.Overrides) => { - this.checkWritable(); + burnClaimFraction = async (claimId: bigint, overrides?: SupportedOverrides) => { + const { account } = this.getWallet(); + + const readContract = getContract({ + ...this.getContractConfig(), + publicClient: this._publicClient, + }); + + const claimOwner = (await readContract.read.ownerOf([claimId])) as `0x${string}`; - // check if claim exists and is owned by the signer - if (!ethers.Signer.isSigner(this._config.operator)) { - throw new InvalidOrMissingError("Invalid operator: not a signer", { operator: this._config.operator }); + if (claimOwner.toLowerCase() !== account?.address.toLowerCase()) { + throw new ClientError("Claim is not owned by the signer", { signer: account?.address, claimOwner }); } - const signerAddress = await this._config.operator.getAddress(); - const claimOwner = await this._contract.ownerOf(claimId); - if (claimOwner.toLowerCase() !== signerAddress.toLowerCase()) - throw new ClientError("Claim is not owned by the signer", { signer: signerAddress, claimOwner }); + const { request } = await this._publicClient.simulateContract({ + functionName: "burnFraction", + account, + args: [account?.address, claimId], + ...this.getContractConfig(), + ...this.getCleanedOverrides(overrides), + }); - return overrides - ? this.contract.burnFraction(signerAddress, claimId, overrides) - : this.contract.burnFraction(signerAddress, claimId); + return this.submitRequest(request); }; /** @@ -283,32 +312,34 @@ export default class HypercertClient implements HypercertClientInterface { * @returns Contract transaction */ mintClaimFractionFromAllowlist = async ( - claimId: BigNumberish, - units: BigNumberish, - proof: BytesLike[], - root?: BytesLike, - overrides?: ethers.Overrides, - ): Promise => { - this.checkWritable(); - - if (!ethers.Signer.isSigner(this._config.operator)) { - throw new InvalidOrMissingError("Invalid operator: not a signer", { operator: this._config.operator }); - } + claimId: bigint, + units: bigint, + proof: (Hex | ByteArray)[], + root?: Hex | ByteArray, + overrides?: SupportedOverrides, + ) => { + const { account } = this.getWallet(); - const signerAddress = await this._config.operator.getAddress(); //verify the proof using the OZ merkle tree library if (root && root.length > 0) { + if (!account?.address) throw new InvalidOrMissingError("No wallet address found, are you connected?"); verifyMerkleProof( root.toString(), - signerAddress, + account?.address, units, proof.map((p) => p.toString()), ); } - return overrides - ? this.contract.mintClaimFromAllowlist(signerAddress, proof, claimId, units, overrides) - : this.contract.mintClaimFromAllowlist(signerAddress, proof, claimId, units); + const { request } = await this._publicClient.simulateContract({ + functionName: "mintClaimFromAllowlist", + account, + args: [account?.address, proof, claimId, units], + ...this.getContractConfig(), + ...this.getCleanedOverrides(overrides), + }); + + return this.submitRequest(request); }; /** @@ -322,39 +353,73 @@ export default class HypercertClient implements HypercertClientInterface { * @returns A Promise that resolves to the transaction receipt */ batchMintClaimFractionsFromAllowlists = async ( - claimIds: BigNumberish[], - units: BigNumberish[], - proofs: BytesLike[][], - roots?: BytesLike[], - overrides?: ethers.Overrides, - ): Promise => { - this.checkWritable(); - - if (!ethers.Signer.isSigner(this._config.operator)) { - throw new InvalidOrMissingError("Invalid operator: not a signer", { operator: this._config.operator }); - } - - const signerAddress = await this._config.operator.getAddress(); + claimIds: bigint[], + units: bigint[], + proofs: (Hex | ByteArray)[][], + roots?: (Hex | ByteArray)[], + overrides?: SupportedOverrides, + ) => { + const { account } = this.getWallet(); //verify the proof using the OZ merkle tree library if (roots && roots.length > 0) { + if (!account?.address) throw new InvalidOrMissingError("No wallet address found, are you connected?"); + verifyMerkleProofs( roots.map((r) => r.toString()), - signerAddress, + account?.address, units, proofs.map((p) => p.map((p) => p.toString())), ); } - return overrides - ? this.contract.batchMintClaimsFromAllowlists(signerAddress, proofs, claimIds, units, overrides) - : this.contract.batchMintClaimsFromAllowlists(signerAddress, proofs, claimIds, units); + const { request } = await this._publicClient.simulateContract({ + functionName: "batchMintClaimsFromAllowlists", + account, + args: [account?.address, proofs, claimIds, units], + ...this.getContractConfig(), + ...this.getCleanedOverrides(overrides), + }); + + return this.submitRequest(request); }; - private checkWritable = () => { - //TODO add check on ContractRunner when migrating to ethers v6 + private getContractConfig = () => { + if (!this.config?.contractAddress) throw new ClientError("No contract address found", { config: this.config }); + + return getContract({ + address: this.config.contractAddress as `0x${string}`, + abi: parseAbi(HypercertMinterAbi), + }); + }; + + private getCleanedOverrides = (overrides?: SupportedOverrides) => { + const _overrides = { + value: overrides?.value, + gas: overrides?.gasLimit, + gasPrice: overrides?.gasPrice, + }; + + return Object.fromEntries(Object.entries(_overrides).filter(([_, value]) => value !== undefined)); + }; + + private getWallet = () => { + if (!this._walletClient) { + throw new ClientError("Could not connect to wallet; sending transactions not allowed.", { client: this }); + } if (this.readonly) throw new ClientError("Client is readonly", { client: this }); - return true; + return { walletClient: this._walletClient, account: this._walletClient.account }; + }; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private submitRequest = async (request: any) => { + const hash = this._walletClient?.writeContract(request); + + if (!hash) { + throw new ClientError("Something went wrong when executing request", { request, hash }); + } + + return hash; }; } diff --git a/sdk/src/constants.ts b/sdk/src/constants.ts index da4383b5..05307613 100644 --- a/sdk/src/constants.ts +++ b/sdk/src/constants.ts @@ -2,37 +2,30 @@ * Constants */ -import { Deployment, SupportedChainIds } from "./types/index.js"; - -// Goerli is default if nothing specified -const DEFAULT_CHAIN_ID = 5; +import { Deployment, SupportedChainIds } from "./types"; const DEFAULT_GRAPH_BASE_URL = "https://api.thegraph.com/subgraphs/name/hypercerts-admin"; // These are the deployments we manage -const DEPLOYMENTS: { [key in SupportedChainIds]: Deployment } = { +const DEPLOYMENTS: { [key in SupportedChainIds]: Partial } = { 5: { - chainId: 5, - chainName: "goerli", contractAddress: "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + graphName: "hypercerts-testnet", graphUrl: `${DEFAULT_GRAPH_BASE_URL}/hypercerts-testnet`, } as const, 10: { - chainId: 10, - chainName: "optimism-mainnet", contractAddress: "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + graphName: "hypercerts-optimism-mainnet", graphUrl: `${DEFAULT_GRAPH_BASE_URL}/hypercerts-optimism-mainnet`, } as const, 42220: { - chainId: 42220, - chainName: "celo-mainnet", contractAddress: "0x16ba53b74c234c870c61efc04cd418b8f2865959", + graphName: "hypercerts-arbitrum", graphUrl: `${DEFAULT_GRAPH_BASE_URL}/hypercerts-celo`, }, 11155111: { - chainId: 11155111, - chainName: "sepolia", contractAddress: "0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941", + graphName: "hypercerts-sepolia", graphUrl: `${DEFAULT_GRAPH_BASE_URL}/hypercerts-sepolia`, } as const, }; @@ -52,4 +45,4 @@ const EAS_SCHEMAS = { }, } as const; -export { DEFAULT_CHAIN_ID, DEPLOYMENTS, EAS_SCHEMAS }; +export { DEPLOYMENTS, EAS_SCHEMAS }; diff --git a/sdk/src/evaluations/eas.ts b/sdk/src/evaluations/eas.ts deleted file mode 100644 index 3a7923b1..00000000 --- a/sdk/src/evaluations/eas.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { Offchain, SchemaEncoder, SignedOffchainAttestation } from "@ethereum-attestation-service/eas-sdk"; -import { TypedDataSigner } from "@ethersproject/abstract-signer"; -import { ethers } from "ethers"; - -import { EAS_SCHEMAS } from "../constants.js"; -import { - DuplicateEvaluation, - EvaluationData, - HypercertClientConfig, - InvalidOrMissingError, - MalformedDataError, - SimpleTextEvaluation, -} from "../types/index.js"; -import { validateDuplicateEvaluationData, validateSimpleTextEvaluationData } from "../validator/index.js"; - -/** - * The EasEvaluator class provides methods for signing off-chain attestations of evaluations. - * Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. - */ -export default class EasEvaluator { - /** - * The Offchain instance used for signing off-chain attestations. - */ - offChain: Offchain; - - /** - * The TypedDataSigner instance used for signing typed data. - */ - signer?: ethers.Signer & TypedDataSigner; - - readonly = true; - - /** - * Creates a new EasEvaluator instance. - * @param {EasEvaluatorConfig} config - The configuration options for the EasEvaluator instance. - */ - constructor(config: Partial) { - const { easContractAddress, chainId, operator } = config; - - if (!easContractAddress || !chainId || !operator) { - const missingValue = !easContractAddress ? "easContractAddress" : !chainId ? "chainId" : "operator"; - - throw new InvalidOrMissingError(`Invalid or missing config value: ${missingValue}`, { easConfig: config }); - } - - //TODO when expanding the Evaluator functionallity, we should review if readonly makes sense - if (ethers.Signer.isSigner(config.operator)) { - this.signer = config.operator as ethers.Signer & TypedDataSigner; - this.readonly = false; - } - - this.offChain = new Offchain({ address: easContractAddress, chainId: chainId, version: "0.26" }); - } - - /** - * Gets a signature for an off-chain attestation. - * @param {string} encodedData - The encoded data to sign. - * @param {string} recipient - The address of the recipient of the attestation. - * @param {string} schemaUid - The UID of the schema to use for the attestation. - * @returns {Promise} - The signature for the attestation. - */ - getSignature = async ( - encodedData: string, - recipient: string, - schemaUid: string, - ): Promise => { - if (!this.signer) { - throw new InvalidOrMissingError("No valid signer available.", { signer: this.signer }); - } - - return await this.offChain.signOffchainAttestation( - { - // TODO who will be the recipient? The contract it points to? The creator? - recipient, - // Unix timestamp of when attestation expires. (0 for no expiration) - expirationTime: 0, - // Unix timestamp of current time - time: Date.now(), - revocable: true, - nonce: 0, - schema: schemaUid, - refUID: "0x0000000000000000000000000000000000000000000000000000000000000000", - data: encodedData, - }, - this.signer, - ); - }; - - /** - * Signs an offline evaluation. - * @param {EvaluationData} evaluation - The evaluation data to sign. - * @returns {Promise} - The signature for the evaluation. - * @throws {MalformedDataError} - If the evaluation data is malformed. - */ - signOfflineEvaluation = async (evaluation: EvaluationData) => { - if (isDuplicateEvaluation(evaluation)) { - const validation = validateDuplicateEvaluationData(evaluation); - if (!validation.valid) { - throw new MalformedDataError("Invalid evaluation data", { errors: validation.errors }); - } - - const duplicateSchema = EAS_SCHEMAS["sepolia"].duplicate; - const schemaEncoder = new SchemaEncoder(duplicateSchema.schema); - const recipient = evaluation.realHypercert.contract; - - // Initialize SchemaEncoder with the schema string - // TODO validate schema values - const encodedData = schemaEncoder.encodeData([ - { name: "chainId", value: evaluation.realHypercert.chainId as string, type: "uint256" }, - { name: "contract", value: evaluation.realHypercert.contract as string, type: "address" }, - { name: "claimId", value: evaluation.realHypercert.claimId as string, type: "uint256" }, - ]); - - return this.getSignature(encodedData, recipient, duplicateSchema.uid); - } - - if (isSimpleTextEvaluation(evaluation)) { - const validation = validateSimpleTextEvaluationData(evaluation); - if (!validation.valid) { - throw new MalformedDataError("Invalid evaluation data", { errors: validation.errors }); - } - - const simpleTextSchema = EAS_SCHEMAS["sepolia"].contentHash; - const schemaEncoder = new SchemaEncoder(simpleTextSchema.schema); - const recipient = evaluation.hypercert.contract; - - const contentHash = ethers.utils.id(evaluation.text); - - // Initialize SchemaEncoder with the schema string - // TODO validate schema values - const encodedData = schemaEncoder.encodeData([{ name: "contentHash", value: contentHash, type: "bytes32" }]); - - return this.getSignature(encodedData, recipient, simpleTextSchema.uid); - } - - assertNever(evaluation); - }; -} - -const isDuplicateEvaluation = (evaluation: EvaluationData): evaluation is DuplicateEvaluation => { - return ( - evaluation.type === "duplicate" && - "realHypercert" in evaluation && - "duplicateHypercerts" in evaluation && - "explanation" in evaluation - ); -}; - -const isSimpleTextEvaluation = (evaluation: EvaluationData): evaluation is SimpleTextEvaluation => { - return evaluation.type === "simpleText" && "hypercert" in evaluation && "text" in evaluation; -}; - -const assertNever = (evaluation: never): never => { - throw new Error(`Unexpected evaluation type: ${evaluation}`); -}; diff --git a/sdk/src/evaluations/index.ts b/sdk/src/evaluations/index.ts index 9092b0b7..44f13c23 100644 --- a/sdk/src/evaluations/index.ts +++ b/sdk/src/evaluations/index.ts @@ -1,20 +1,10 @@ -import type { TypedDataSigner } from "@ethersproject/abstract-signer"; -import { ethers } from "ethers"; -import { isAddress } from "ethers/lib/utils.js"; +import { isAddress } from "viem"; +//eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import { CIDString } from "nft.storage"; -import { DEFAULT_CHAIN_ID } from "../constants.js"; -import HypercertsStorage from "../storage.js"; -import { - EASEvaluation, - EvaluationSource, - HypercertClientConfig, - HypercertEvaluationSchema, - MalformedDataError, -} from "../types/index.js"; -import EasEvaluator from "./eas.js"; - -const EASContractAddress = "0xC2679fBD37d54388Ce493F1DB75320D236e1815e"; // Sepolia v0.26 +import HypercertsStorage from "../storage"; +import { HypercertClientConfig, HypercertEvaluationSchema, MalformedDataError } from "../types"; export interface EvaluatorInterface { /** @@ -26,28 +16,17 @@ export interface EvaluatorInterface { } export default class HypercertEvaluator implements EvaluatorInterface { - signer?: ethers.Signer & TypedDataSigner; - storage: HypercertsStorage; - eas: EasEvaluator; - readonly = true; - constructor( - config = { - chainId: DEFAULT_CHAIN_ID, - easContractAddress: EASContractAddress, - operator: new ethers.VoidSigner(""), - } as Partial, - ) { + constructor(config: Partial) { //TODO when expanding the Evaluator functionallity, we should review if readonly makes sense - if (ethers.Signer.isSigner(config.operator)) { - this.signer = config.operator as ethers.Signer & TypedDataSigner; + if (config?.walletClient?.account) { this.readonly = false; } + this.storage = new HypercertsStorage(config); - this.eas = new EasEvaluator(config); } submitEvaluation = async (evaluation: HypercertEvaluationSchema): Promise => { @@ -55,22 +34,6 @@ export default class HypercertEvaluator implements EvaluatorInterface { throw new MalformedDataError(`Invalid creator address: ${evaluation.creator}`); } - if (isEasEvaluation(evaluation.evaluationSource)) { - const signedData = await this.eas.signOfflineEvaluation(evaluation.evaluationData); - const evaluationData = { ...evaluation.evaluationData, signedData }; - - return this.storage.storeData({ ...evaluation, evaluationData }); - } - throw new Error(`Unexpected evaluation source: ${evaluation.evaluationSource.toString()}`); }; } - -const isEasEvaluation = (evaluationSource: EvaluationSource): evaluationSource is EASEvaluation => { - return ( - evaluationSource.type === "EAS" && - "chainId" in evaluationSource && - "contract" in evaluationSource && - "uid" in evaluationSource - ); -}; diff --git a/sdk/src/index.ts b/sdk/src/index.ts index 4bbdfcd6..abe5436b 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -1,9 +1,9 @@ import type { HypercertMinter, IHypercertToken } from "@hypercerts-org/contracts"; import { execute } from "../.graphclient"; -import HypercertClient from "./client.js"; -import HypercertsStorage from "./storage.js"; -import { DEPLOYMENTS } from "./constants.js"; +import HypercertClient from "./client"; +import HypercertsStorage from "./storage"; +import { DEPLOYMENTS } from "./constants"; /** * Protocol @@ -24,17 +24,17 @@ export { HypercertsStorage }; /** * Types */ -export * from "./types/index.js"; +export * from "./types"; /** * Validators */ -export * from "./validator/index.js"; +export * from "./validator"; /** * Formatters */ -export * from "./utils/formatter.js"; +export * from "./utils/formatter"; /** * Graph diff --git a/sdk/src/indexer.ts b/sdk/src/indexer.ts index 793e77ab..c3438f45 100644 --- a/sdk/src/indexer.ts +++ b/sdk/src/indexer.ts @@ -1,6 +1,6 @@ import { getBuiltGraphSDK, Sdk as GraphClient } from "../.graphclient"; -import { defaultQueryParams } from "./indexer/utils.js"; -import { HypercertIndexerInterface, QueryParams } from "./types/index.js"; +import { defaultQueryParams } from "./indexer/utils"; +import { HypercertClientConfig, HypercertIndexerInterface, QueryParams } from "./types"; /** * A class that provides indexing functionality for Hypercerts. @@ -14,9 +14,10 @@ export default class HypercertIndexer implements HypercertIndexerInterface { * Creates a new instance of the `HypercertIndexer` class. * @param options The configuration options for the indexer. */ - constructor(options: { graphUrl?: string }) { + constructor(options: Partial) { this._graphClient = getBuiltGraphSDK({ - graphUrl: options.graphUrl || "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet", + graphUrl: options.graphUrl, + graphName: options.graphName, }); } diff --git a/sdk/src/indexer/queries/claims.graphql b/sdk/src/indexer/queries/claims.graphql index 776ee260..9e143ae8 100644 --- a/sdk/src/indexer/queries/claims.graphql +++ b/sdk/src/indexer/queries/claims.graphql @@ -1,6 +1,6 @@ query ClaimsByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) { claims(where: { owner: $owner }, skip: $skip, first: $first, orderDirection: $orderDirection) { - chainName + graphName contract tokenID creator @@ -13,7 +13,7 @@ query ClaimsByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: query RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) { claims(orderDirection: $orderDirection, orderBy: creation, first: $first) { - chainName + graphName contract tokenID creator @@ -26,7 +26,7 @@ query RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) { query ClaimById($id: ID!) { claim(id: $id) { - chainName + graphName contract tokenID creator diff --git a/sdk/src/indexer/queries/fractions.graphql b/sdk/src/indexer/queries/fractions.graphql index 20eb8ad0..df07f421 100644 --- a/sdk/src/indexer/queries/fractions.graphql +++ b/sdk/src/indexer/queries/fractions.graphql @@ -1,6 +1,6 @@ query ClaimTokensByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) { claimTokens(where: { owner: $owner }, skip: $skip, first: $first, orderDirection: $orderDirection) { - chainName + graphName id owner tokenID @@ -16,7 +16,7 @@ query ClaimTokensByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $f query ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) { claimTokens(where: { claim: $claimId }, skip: $skip, first: $first, orderDirection: $orderDirection) { - chainName + graphName id owner tokenID @@ -26,7 +26,7 @@ query ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $fi query ClaimTokenById($claimTokenId: ID!) { claimToken(id: $claimTokenId) { - chainName + graphName id owner tokenID diff --git a/sdk/src/indexer/utils.ts b/sdk/src/indexer/utils.ts index d016677e..28329336 100644 --- a/sdk/src/indexer/utils.ts +++ b/sdk/src/indexer/utils.ts @@ -1,4 +1,4 @@ -import { QueryParams } from "../types/index.js"; +import { QueryParams } from "../types"; export const defaultQueryParams: QueryParams = { orderDirections: "desc", diff --git a/sdk/src/storage.ts b/sdk/src/storage.ts index 8dd23c2a..19bab0e8 100644 --- a/sdk/src/storage.ts +++ b/sdk/src/storage.ts @@ -1,17 +1,21 @@ import axios from "axios"; +//eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import { CIDString, NFTStorage } from "nft.storage"; +//eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import { Blob, File, Web3Storage } from "web3.storage"; -import { validateMetaData } from "./validator/index.js"; +import { validateMetaData } from "./validator"; import { HypercertStorageConfig, HypercertStorageInterface, HypercertMetadata, MalformedDataError, StorageError, -} from "./types/index.js"; -import logger from "./utils/logger.js"; -import { getConfig } from "./utils/config.js"; +} from "./types"; +import logger from "./utils/logger"; +import { getNftStorageToken, getWeb3StorageToken } from "./utils/config"; const getCid = (cidOrIpfsUri: string) => cidOrIpfsUri.replace("ipfs://", ""); @@ -31,26 +35,45 @@ export default class HypercertsStorage implements HypercertStorageInterface { * @param overrides The configuration overrides for the storage. */ constructor(overrides: Partial) { - const { nftStorageToken, web3StorageToken } = getConfig(overrides); - - if (!nftStorageToken || nftStorageToken === "") { - logger.warn(`NFT Storage API key is missing or invalid: ${nftStorageToken}}`); - } - - if (!web3StorageToken || web3StorageToken === "") { - logger.warn(`Web3 Storage API key is missing or invalid: ${web3StorageToken}`); - } + const nftStorageToken = getNftStorageToken(overrides); + const web3StorageToken = getWeb3StorageToken(overrides); if (!nftStorageToken || !web3StorageToken) { logger.warn("HypercertsStorage is read only", "storage"); this.readonly = true; + + if (!nftStorageToken) { + logger.warn(`NFT Storage API key is missing or invalid: ${nftStorageToken}}`); + } + + if (!web3StorageToken) { + logger.warn(`Web3 Storage API key is missing or invalid: ${web3StorageToken}`); + } } else { - this.nftStorageClient = new NFTStorage({ token: nftStorageToken }); - this.web3StorageClient = new Web3Storage({ token: web3StorageToken }); + this.nftStorageClient = new NFTStorage({ token: nftStorageToken.nftStorageToken || "" }); + this.web3StorageClient = new Web3Storage({ token: web3StorageToken.web3StorageToken || "" }); this.readonly = false; } } + getFromIPFS = async (cidOrIpfsUri: string, timeout = 10000) => { + const nftStorageGatewayLink = this.getNftStorageGatewayUri(cidOrIpfsUri); + const web3StorageGatewayLink = this.getWeb3StorageGatewayUri(cidOrIpfsUri); + logger.debug(`Getting metadata ${cidOrIpfsUri} at ${nftStorageGatewayLink}`); + + const res = await axios.get(nftStorageGatewayLink, { timeout }).catch(() => { + logger.debug(`${nftStorageGatewayLink} timed out.`); + logger.debug(`Getting metadata ${cidOrIpfsUri} at ${web3StorageGatewayLink}`); + return axios.get(web3StorageGatewayLink, { timeout }); + }); + + if (!res || !res.data) { + throw new StorageError(`Failed to get ${cidOrIpfsUri}`); + } + + return res.data; + }; + /** * Stores metadata for a Hypercert. * @param data The metadata to store. @@ -91,22 +114,14 @@ export default class HypercertsStorage implements HypercertStorageInterface { * @throws A `MalformedDataError` if the metadata is invalid. E.g. unknown schema */ public async getMetadata(cidOrIpfsUri: string): Promise { - const nftStorageGatewayLink = this.getNftStorageGatewayUri(cidOrIpfsUri); - logger.debug(`Getting metadata ${cidOrIpfsUri} at ${nftStorageGatewayLink}`); - - const res = await axios.get(nftStorageGatewayLink); - - if (!res || !res.data) { - throw new StorageError(`Failed to get ${cidOrIpfsUri}`); - } + const res = await this.getFromIPFS(cidOrIpfsUri); - const data = res.data; - const validation = validateMetaData(data); + const validation = validateMetaData(res); if (!validation.valid) { throw new MalformedDataError(`Invalid metadata at ${cidOrIpfsUri}`, { errors: validation.errors }); } - return data; + return res; } /** @@ -168,14 +183,18 @@ export default class HypercertsStorage implements HypercertStorageInterface { */ // TODO: replace current temporary fix of just using NFT.Storage IPFS gateway - const nftStorageGatewayLink = this.getNftStorageGatewayUri(cidOrIpfsUri); - logger.info(`Getting data ${cidOrIpfsUri} at ${nftStorageGatewayLink}`, "storage"); + const res = await this.getFromIPFS(cidOrIpfsUri); - return axios.get(nftStorageGatewayLink).then((result) => result.data); + return res; } getNftStorageGatewayUri = (cidOrIpfsUri: string) => { const NFT_STORAGE_IPFS_GATEWAY = "https://nftstorage.link/ipfs/{cid}"; return NFT_STORAGE_IPFS_GATEWAY.replace("{cid}", getCid(cidOrIpfsUri)); }; + + getWeb3StorageGatewayUri = (cidOrIpfsUri: string) => { + const WEB3_STORAGE_IPFS_GATEWAY = "https://w3s.link/ipfs/{cid}"; + return WEB3_STORAGE_IPFS_GATEWAY.replace("{cid}", getCid(cidOrIpfsUri)); + }; } diff --git a/sdk/src/types/client.ts b/sdk/src/types/client.ts index 7d803a0c..0dd1082d 100644 --- a/sdk/src/types/client.ts +++ b/sdk/src/types/client.ts @@ -1,26 +1,31 @@ import { PartialTypedDataConfig } from "@ethereum-attestation-service/eas-sdk"; -import { HypercertMinter } from "@hypercerts-org/contracts"; -import { BigNumberish, BytesLike, ContractTransaction, ethers } from "ethers"; +//eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import { CIDString } from "nft.storage"; -import HypercertIndexer from "../indexer.js"; -import { AllowlistEntry, TransferRestrictions } from "./hypercerts.js"; -import { HypercertMetadata } from "./metadata.js"; +import HypercertIndexer from "../indexer"; +import { AllowlistEntry, TransferRestrictions } from "./hypercerts"; +import { HypercertMetadata } from "./metadata"; + +import { ByteArray, Chain, Hex, PublicClient, WalletClient, Abi } from "viem"; export type SupportedChainIds = 5 | 10 | 42220 | 11155111; +export type SupportedOverrides = { + value?: bigint; + gasPrice?: bigint; + gasLimit?: bigint; +}; /** * Represents a deployment of a contract on a specific network. */ export type Deployment = { - /** The ID of the network on which the contract is deployed. */ - chainId: number; - /** The name of the network on which the contract is deployed. */ - chainName: string; + chain: Partial; /** The address of the deployed contract. */ contractAddress: string; /** The url to the subgraph that indexes the contract events. Override for localized testing */ graphUrl: string; + graphName: string; }; /** @@ -29,10 +34,15 @@ export type Deployment = { export type HypercertClientConfig = Deployment & HypercertStorageConfig & HypercertEvaluatorConfig & { - /** The provider is inherently read-only */ - operator: ethers.providers.Provider | ethers.Signer; + /** The PublicClient is inherently read-only */ + publicClient: PublicClient; + walletClient: WalletClient; /** Force the use of overridden values */ unsafeForceOverrideConfig?: boolean; + /** Boolean to assert if the client is in readOnly mode */ + readOnly: boolean; + /** Reason for readOnly mode */ + readOnlyReason?: string; }; /** @@ -110,8 +120,7 @@ export interface HypercertClientState { storage: HypercertStorageInterface; /** The indexer used by the client. */ indexer: HypercertIndexer; - /** The contract used by the client. */ - contract: HypercertMinter; + contract: { abi: Abi; address?: `0x${string}` }; } /** @@ -127,9 +136,9 @@ export interface HypercertClientMethods { */ mintClaim: ( metaData: HypercertMetadata, - totalUnits: BigNumberish, + totalUnits: bigint, transferRestriction: TransferRestrictions, - ) => Promise; + ) => Promise<`0x${string}`>; /** * Creates a new allowlist and mints a new claim with the allowlist. @@ -142,31 +151,31 @@ export interface HypercertClientMethods { createAllowlist: ( allowList: AllowlistEntry[], metaData: HypercertMetadata, - totalUnits: BigNumberish, + totalUnits: bigint, transferRestriction: TransferRestrictions, - ) => Promise; + ) => Promise<`0x${string}`>; /** * Splits a claim into multiple fractions. - * @param claimId The ID of the claim to split. - * @param fractions The number of units for each fraction. + * @param fractionId The ID of the claim to split. + * @param newFractions The number of units for each fraction. * @returns A Promise that resolves to the transaction receipt */ - splitClaimUnits: (claimId: BigNumberish, fractions: BigNumberish[]) => Promise; + splitFractionUnits: (fractionId: bigint, fractions: bigint[]) => Promise<`0x${string}`>; /** * Merges multiple claim fractions into a single claim. - * @param claimIds The IDs of the claim fractions to merge. + * @param fractionIds The IDs of the claim fractions to merge. * @returns A Promise that resolves to the transaction receipt */ - mergeClaimUnits: (claimIds: BigNumberish[]) => Promise; + mergeFractionUnits: (fractionIds: bigint[]) => Promise<`0x${string}`>; /** * Burns a claim fraction. - * @param claimId The ID of the claim fraction to burn. + * @param fractionId The ID of the claim fraction to burn. * @returns A Promise that resolves to the transaction receipt */ - burnClaimFraction: (claimId: BigNumberish) => Promise; + burnClaimFraction: (fractionId: bigint) => Promise<`0x${string}`>; /** * Mints a claim fraction from an allowlist. @@ -176,10 +185,10 @@ export interface HypercertClientMethods { * @returns A Promise that resolves to the transaction receipt */ mintClaimFractionFromAllowlist: ( - claimId: BigNumberish, - units: BigNumberish, - proof: BytesLike[], - ) => Promise; + claimId: bigint, + units: bigint, + proof: (Hex | ByteArray)[], + ) => Promise<`0x${string}`>; /** * Batch mints a claim fraction from an allowlist @@ -192,8 +201,8 @@ export interface HypercertClientMethods { * @returns A Promise that resolves to the transaction receipt */ batchMintClaimFractionsFromAllowlists: ( - claimIds: BigNumberish[], - units: BigNumberish[], - proofs: BytesLike[][], - ) => Promise; + claimIds: bigint[], + units: bigint[], + proofs: (Hex | ByteArray)[][], + ) => Promise<`0x${string}`>; } diff --git a/sdk/src/types/hypercerts.ts b/sdk/src/types/hypercerts.ts index 31df75cb..9851d633 100644 --- a/sdk/src/types/hypercerts.ts +++ b/sdk/src/types/hypercerts.ts @@ -1,5 +1,3 @@ -import { BigNumberish } from "ethers"; - /** * Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol * @dev AllowAll: All transfers are allowed @@ -21,5 +19,5 @@ export type TransferRestrictions = (typeof TransferRestrictions)[keyof typeof Tr */ export type AllowlistEntry = { address: string; - units: BigNumberish; + units: bigint; }; diff --git a/sdk/src/types/index.ts b/sdk/src/types/index.ts index b3f7dfc7..39d19b46 100644 --- a/sdk/src/types/index.ts +++ b/sdk/src/types/index.ts @@ -1,8 +1,8 @@ -export type { HypercertClaimdata } from "./claimdata.js"; -export * from "./client.js"; -export * from "./errors.js"; -export * from "./hypercerts.js"; -export * from "./indexer.js"; +export type { HypercertClaimdata } from "./claimdata"; +export * from "./client"; +export * from "./errors"; +export * from "./hypercerts"; +export * from "./indexer"; export type { EvaluationData, EvaluationSource, @@ -12,6 +12,6 @@ export type { EASEvaluation, IPFSEvaluation, HypercertPointer, -} from "./evaluation.js"; -export type { ClaimByIdQuery, ClaimTokensByClaimQuery, Claim, ClaimToken } from "./global.js"; -export type { HypercertMetadata } from "./metadata.js"; +} from "./evaluation"; +export type { ClaimByIdQuery, ClaimTokensByClaimQuery, Claim, ClaimToken } from "./global"; +export type { HypercertMetadata } from "./metadata"; diff --git a/sdk/src/utils/adapters.ts b/sdk/src/utils/adapters.ts new file mode 100644 index 00000000..9c33a336 --- /dev/null +++ b/sdk/src/utils/adapters.ts @@ -0,0 +1,41 @@ +import { providers } from "ethers"; +import { PublicClient, HttpTransport, WalletClient } from "viem"; +import logger from "./logger"; +import { Signer, TypedDataSigner } from "@ethersproject/abstract-signer"; + +export function publicClientToProvider(publicClient: PublicClient) { + const { chain, transport } = publicClient; + if (!chain) { + logger.warn("No chain found in public client, stopping signature request."); + return; + } + const network = { + chainId: chain.id, + name: chain.name, + ensAddress: chain.contracts?.ensRegistry?.address, + }; + if (transport.type === "fallback") + return new providers.FallbackProvider( + (transport.transports as ReturnType[]).map( + ({ value }) => new providers.JsonRpcProvider(value?.url, network), + ), + ); + return new providers.JsonRpcProvider(transport.url, network); +} + +export function walletClientToSigner(walletClient: WalletClient) { + const { account, chain, transport } = walletClient; + if (!chain) { + logger.warn("No chain found in public client, stopping signature request."); + return; + } + const network = { + chainId: chain.id, + name: chain.name, + ensAddress: chain.contracts?.ensRegistry?.address, + }; + const provider = new providers.Web3Provider(transport, network); + const signer = provider.getSigner(account?.address); + + return signer as Signer & TypedDataSigner; +} diff --git a/sdk/src/utils/config.ts b/sdk/src/utils/config.ts index a9dfb228..d8ad86d3 100644 --- a/sdk/src/utils/config.ts +++ b/sdk/src/utils/config.ts @@ -1,7 +1,6 @@ -import { ethers } from "ethers"; -import { isAddress } from "ethers/lib/utils.js"; +import { sepolia, goerli, optimism, celo, Chain } from "viem/chains"; -import { DEFAULT_CHAIN_ID, DEPLOYMENTS } from "../constants.js"; +import { DEPLOYMENTS } from "../constants"; import { ConfigurationError, Deployment, @@ -9,100 +8,109 @@ import { InvalidOrMissingError, SupportedChainIds, UnsupportedChainError, -} from "../types/index.js"; -import logger from "./logger.js"; +} from "../types"; +import logger from "./logger"; +import { createPublicClient, http, isAddress } from "viem"; +import { deployments } from "../../src"; /** * Returns the configuration for the Hypercert client, based on the given overrides. - * @param overrides An object containing overrides for the default configuration. + * @param config An object containing overrides for the default configuration. * @returns The configuration for the Hypercert client. - * @throws An `UnsupportedChainError` if the chain ID is not 5 or 10, or if the chain ID is missing or not found. + * @throws An `ConfigurationError` if the `environment` in `config` is not a supported environment, or if the chain ID was not found. + * @dev 5, 10, 42220, 11155111 and "test", "production" are supported environments. + * Test and production merge the Graphs by environment, while the chain IDs are specific to the chain. */ export const getConfig = (overrides: Partial) => { // Get the chainId, first from overrides, then environment variables, then the constant - const { chainId } = getChainConfig(overrides); + const chain = getChainConfig(overrides); + if (!chain) { + logger.warn("[getConfig]: No default config for chain found"); + } - let baseDeployment: Deployment & { unsafeForceOverrideConfig?: boolean }; + let baseDeployment: (Partial & { unsafeForceOverrideConfig?: boolean }) | undefined; if (overrides.unsafeForceOverrideConfig) { - if (!overrides.chainName || !overrides.contractAddress || !overrides.graphUrl) { - throw new UnsupportedChainError( - `attempted to override with chainId=${chainId}, but requires chainName, graphUrl, and contractAddress to be set`, - { chainID: chainId?.toString() || "undefined" }, + if (!overrides.chain?.id || !overrides.contractAddress || !overrides.graphUrl) { + throw new InvalidOrMissingError( + `attempted to override with chainId=${overrides.chain?.id}, but requires chainName, graphUrl, and contractAddress to be set`, + { + chainID: overrides.chain?.id?.toString(), + graphUrl: overrides.graphUrl, + contractAddress: overrides.contractAddress, + }, ); } baseDeployment = { - chainId: chainId, - chainName: overrides.chainName, + chain: { ...chain, id: overrides.chain?.id }, contractAddress: overrides.contractAddress, graphUrl: overrides.graphUrl, unsafeForceOverrideConfig: overrides.unsafeForceOverrideConfig, }; } else { - if (!chainId || [5, 10, 42220, 11155111].indexOf(chainId) === -1) { - throw new UnsupportedChainError(`chainId=${chainId} is not yet supported`, { - chainID: chainId?.toString() || "undefined", - }); - } - - baseDeployment = DEPLOYMENTS[chainId as SupportedChainIds]; + //TODO doo many casts + baseDeployment = overrides.chain?.id + ? (getDeployment(overrides.chain?.id as SupportedChainIds) as Partial & { + unsafeForceOverrideConfig?: boolean; + }) + : chain?.id + ? (getDeployment(chain.id as SupportedChainIds) as Partial & { unsafeForceOverrideConfig?: boolean }) + : undefined; if (!baseDeployment) { - throw new UnsupportedChainError(`Default config for chainId=${chainId} is missing in SDK`, { - chainID: chainId, + throw new UnsupportedChainError(`Default config for chainId=${overrides.chain?.id} is missing in SDK`, { + chainID: overrides.chain?.id, }); } + + baseDeployment = { ...baseDeployment, chain }; } - const config = { + const config: Partial = { // Start with the hardcoded values ...baseDeployment, // Let the user override from environment variables - ...getChainConfig(overrides), - ...getOperator(overrides), + ...getWalletClient(overrides), + ...getPublicClient(overrides), ...getContractAddress(overrides), ...getGraphUrl(overrides), ...getNftStorageToken(overrides), ...getWeb3StorageToken(overrides), ...getEasContractAddress(overrides), - } as HypercertClientConfig; + }; + + const missingKeys = []; for (const [key, value] of Object.entries(config)) { if (!value) { - logger.warn(`Cannot get chain config. ${key} is possibly undefined`); + missingKeys.push(key); } } + if (missingKeys.length > 0) logger.warn(`Missing properties in config: ${missingKeys.join(", ")}`); + return config; }; +const getDeployment = (chainId: SupportedChainIds) => { + return deployments[chainId]; +}; + const getChainConfig = (overrides: Partial) => { - const chainId = - overrides?.chainId ?? (process.env.DEFAULT_CHAIN_ID ? parseInt(process.env.DEFAULT_CHAIN_ID) : DEFAULT_CHAIN_ID); - let chainName: string; - - switch (chainId) { - case 5: - chainName = "goerli"; - break; - case 10: - chainName = "optimism-mainnet"; - break; - case 42220: - chainName = "celo"; - break; - case 11155111: - chainName = "sepolia"; - break; - default: - chainName = overrides?.chainName ?? ""; - if (!chainName) { - throw new UnsupportedChainError(`chainId=${chainId} is not yet supported`, { - chainID: chainId?.toString() || "undefined", - }); - } + const chainId = overrides?.chain?.id ? overrides.chain?.id : undefined; + + if (!chainId) { + throw new ConfigurationError("No chainId specified in config or environment variables"); + } + + const chain = getDefaultChain(chainId); + + if (!chain) { + throw new UnsupportedChainError(`No default config for chainId=${chainId} found in SDK`, { + chainID: chainId?.toString(), + }); } - return { chainId, chainName }; + return chain; }; const getContractAddress = (overrides: Partial) => { @@ -112,11 +120,6 @@ const getContractAddress = (overrides: Partial) => { } return { contractAddress: overrides.contractAddress }; } - const contractAddress = process.env.CONTRACT_ADDRESS; - if (contractAddress && !isAddress(contractAddress)) { - throw new InvalidOrMissingError("Invalid contract address.", { contractAddress }); - } - return contractAddress ? { contractAddress } : undefined; }; const getGraphUrl = (overrides: Partial) => { @@ -134,12 +137,12 @@ const getGraphUrl = (overrides: Partial) => { return { graphUrl }; } - const { chainId } = getChainConfig(overrides); + const chain = getChainConfig(overrides); - graphUrl = DEPLOYMENTS[chainId as keyof typeof DEPLOYMENTS].graphUrl ?? process.env.GRAPH_URL; + graphUrl = DEPLOYMENTS[chain?.id as keyof typeof DEPLOYMENTS].graphUrl ?? process.env.GRAPH_URL; if (!graphUrl) { - throw new UnsupportedChainError(`chainId=${chainId} is not yet supported`, { - chainID: chainId?.toString() || "undefined", + throw new UnsupportedChainError(`No Graph URL found in deployments or env vars`, { + chainID: chain?.toString(), }); } try { @@ -151,77 +154,56 @@ const getGraphUrl = (overrides: Partial) => { return { graphUrl }; }; -const getOperator = (overrides: Partial) => { - let operator: ethers.Signer | ethers.providers.Provider; +const getWalletClient = (overrides: Partial) => { + const walletClient = overrides.walletClient; - if ( - overrides.operator && - !ethers.providers.Provider.isProvider(overrides.operator) && - !ethers.Signer.isSigner(overrides.operator) - ) { - throw new InvalidOrMissingError("Invalid operator.", { operator: overrides.operator }); + if (!walletClient) { + logger.warn("No wallet client found", "getWalletClient", walletClient); } - if (ethers.Signer.isSigner(overrides.operator)) { - operator = overrides.operator; - } else if (ethers.providers.Provider.isProvider(overrides.operator)) { - operator = overrides.operator; - operator.on("network", (newNetwork, oldNetwork) => { - // When a Provider makes its initial connection, it emits a "network" - // event with a null oldNetwork along with the newNetwork. So, if the - // oldNetwork exists, it represents a changing network - - if (typeof window === "undefined") return; - if (oldNetwork && window.location) { - window.location.reload(); - } - }); - } else if (process.env.PRIVATE_KEY) { - const provider = ethers.getDefaultProvider(DEFAULT_CHAIN_ID); - operator = new ethers.Wallet(process.env.PRIVATE_KEY, provider); - } else { - operator = ethers.getDefaultProvider(DEFAULT_CHAIN_ID); + return { walletClient }; +}; + +const getPublicClient = (overrides: Partial) => { + const chain = getChainConfig(overrides); + let publicClient; + + publicClient = createPublicClient({ + chain: chain, + transport: http(), + }); + + if (overrides.publicClient) { + publicClient = overrides.publicClient; } - return { operator }; + return { publicClient }; }; -const getNftStorageToken = (overrides: Partial) => { +export const getNftStorageToken = (overrides: Partial) => { if (overrides.nftStorageToken) { return { nftStorageToken: overrides.nftStorageToken }; } - - if (process.env.NFT_STORAGE_TOKEN) { - return { nftStorageToken: process.env.NFT_STORAGE_TOKEN }; - } - - if (process.env.NEXT_PUBLIC_NFT_STORAGE_TOKEN) { - return { nftStorageToken: process.env.NEXT_PUBLIC_NFT_STORAGE_TOKEN }; - } - - return {}; }; -const getWeb3StorageToken = (overrides: Partial) => { +export const getWeb3StorageToken = (overrides: Partial) => { if (overrides.web3StorageToken) { return { web3StorageToken: overrides.web3StorageToken }; } - - if (process.env.WEB3_STORAGE_TOKEN) { - return { web3StorageToken: process.env.WEB3_STORAGE_TOKEN }; - } - - if (process.env.NEXT_PUBLIC_WEB3_STORAGE_TOKEN) { - return { web3StorageToken: process.env.NEXT_PUBLIC_WEB3_STORAGE_TOKEN }; - } - - return {}; }; const getEasContractAddress = (overrides: Partial) => { - if (overrides.easContractAddress) { - return { easContractAddress: overrides.easContractAddress }; - } + return { easContractAddress: overrides.easContractAddress }; +}; - return { easContractAddress: "0xC2679fBD37d54388Ce493F1DB75320D236e1815e" }; +const getDefaultChain = (chainId: number) => { + const _chains = [sepolia, goerli, optimism, celo]; + + for (const chain of Object.values(_chains)) { + if ("id" in chain) { + if (chain.id === chainId) { + return chain as Chain; + } + } + } }; diff --git a/sdk/src/utils/errors.ts b/sdk/src/utils/errors.ts index 2b44580d..29bd9c12 100644 --- a/sdk/src/utils/errors.ts +++ b/sdk/src/utils/errors.ts @@ -8,7 +8,7 @@ import { StorageError, UnknownSchemaError, UnsupportedChainError, -} from "../types/errors.js"; +} from "../types/errors"; /** * diff --git a/sdk/src/utils/formatter.ts b/sdk/src/utils/formatter.ts index d966b6b4..fa413cd9 100644 --- a/sdk/src/utils/formatter.ts +++ b/sdk/src/utils/formatter.ts @@ -1,5 +1,5 @@ -import { HypercertClaimdata, HypercertMetadata } from "../types/index.js"; -import { validateClaimData, validateMetaData } from "../validator/index.js"; +import { HypercertClaimdata, HypercertMetadata } from "../types"; +import { validateClaimData, validateMetaData } from "../validator"; export const INDEFINITE_DATE_STRING = "indefinite"; const formatUnixTime = (seconds: number) => { diff --git a/sdk/src/utils/resolvers.ts b/sdk/src/utils/resolvers.ts index 566795d1..3c52ea6d 100644 --- a/sdk/src/utils/resolvers.ts +++ b/sdk/src/utils/resolvers.ts @@ -1,10 +1,10 @@ -import { Resolvers } from "../../.graphclient/index.js"; +import { Resolvers } from "../../.graphclient"; export const resolvers: Resolvers = { Claim: { - chainName: (root, args, context) => context.chainName || "hypercerts-testnet", // The value we provide in the config + graphName: (root, args, context) => context.graphName, // The value we provide in the config }, ClaimToken: { - chainName: (root, args, context) => context.chainName || "hypercerts-testnet", // The value we provide in the config + graphName: (root, args, context) => context.graphName, // The value we provide in the config }, }; diff --git a/sdk/src/validator/index.ts b/sdk/src/validator/index.ts index b24244ce..e843fd84 100644 --- a/sdk/src/validator/index.ts +++ b/sdk/src/validator/index.ts @@ -1,7 +1,5 @@ import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; import Ajv from "ajv"; -import { BigNumber, BigNumberish } from "ethers"; -import { isAddress } from "ethers/lib/utils.js"; import claimDataSchema from "../resources/schema/claimdata.json"; import evaluationSchema from "../resources/schema/evaluation.json"; @@ -13,7 +11,8 @@ import { HypercertMetadata, MintingError, SimpleTextEvaluation, -} from "../types/index.js"; +} from "../types"; +import { isAddress } from "viem"; const ajv = new Ajv({ allErrors: true }); // options can be passed, e.g. {allErrors: true} ajv.addSchema(metaDataSchema, "metaData"); @@ -88,16 +87,16 @@ const validateClaimData = (data: HypercertClaimdata): ValidationResult => { * @param units The total number of units in the allowlist. * @returns A `ValidationResult` object indicating whether the data is valid and any errors that were found. */ -const validateAllowlist = (data: AllowlistEntry[], units: BigNumberish) => { +const validateAllowlist = (data: AllowlistEntry[], units: bigint) => { const errors: Record = {}; - const totalUnits = data.reduce((acc, curr) => acc.add(curr.units), BigNumber.from(0)); - if (!totalUnits.eq(units)) { + const totalUnits = data.reduce((acc, curr) => acc + BigInt(curr.units.toString()), 0n); + if (totalUnits != units) { errors[ "units" ] = `Total units in allowlist must match total units [expected: ${units}, got: ${totalUnits.toString()}]`; } - if (totalUnits.eq(0)) { + if (totalUnits == 0n) { errors["units"] = "Total units in allowlist must be greater than 0"; } @@ -167,7 +166,7 @@ const validateSimpleTextEvaluationData = (data: SimpleTextEvaluation): Validatio * @param proof The Merkle proof to verify. * @throws {MintingError} If the Merkle proof verification fails. */ -function verifyMerkleProof(root: string, signerAddress: string, units: BigNumberish, proof: string[]): void { +function verifyMerkleProof(root: string, signerAddress: string, units: bigint, proof: string[]): void { if (!isAddress(signerAddress)) { throw new MintingError("Invalid address", { signerAddress }); } @@ -187,7 +186,7 @@ function verifyMerkleProof(root: string, signerAddress: string, units: BigNumber * @throws {MintingError} If the Merkle proof verification fails. * @notice Wrapper around `verifyMerkleProof` to batch verify multiple proofs */ -function verifyMerkleProofs(roots: string[], signerAddress: string, units: BigNumberish[], proofs: string[][]) { +function verifyMerkleProofs(roots: string[], signerAddress: string, units: bigint[], proofs: string[][]) { if (roots.length !== units.length || units.length !== proofs.length) { throw new MintingError("Invalid input", { roots, units, proofs }); } diff --git a/sdk/test/client.test.ts b/sdk/test/client.test.ts index 8540404b..6f9e124e 100644 --- a/sdk/test/client.test.ts +++ b/sdk/test/client.test.ts @@ -1,13 +1,9 @@ import { expect } from "chai"; -import { MockProvider } from "ethereum-waffle"; -import { ethers } from "ethers"; import sinon from "sinon"; -import { HypercertClient, HypercertMetadata, TransferRestrictions } from "../src/index.js"; -import { AllowlistEntry, ClientError, UnsupportedChainError } from "../src/types/index.js"; - -const provider = new MockProvider(); -sinon.stub(provider, "on"); +import { HypercertClient, HypercertMetadata, TransferRestrictions } from "../src"; +import { AllowlistEntry, ClientError, UnsupportedChainError } from "../src/types"; +import { publicClient, walletClient } from "./helpers"; describe("HypercertClient setup tests", () => { afterAll(() => { @@ -15,51 +11,50 @@ describe("HypercertClient setup tests", () => { }); it("should be able to create a new read only instance when missing storage keys", () => { - sinon.stub(process, "env").value({ NFT_STORAGE_TOKEN: null }); - sinon.stub(process, "env").value({ WEB3_STORAGE_TOKEN: null }); - sinon.stub(process, "env").value({ NEXT_PUBLIC_NFT_STORAGE_TOKEN: null }); - sinon.stub(process, "env").value({ NEXT_PUBLIC_WEB3_STORAGE_TOKEN: null }); - - const client = new HypercertClient({ operator: provider }); + const readOnlyClient = new HypercertClient({ + chain: { id: 5 }, + publicClient, + }); - expect(client).to.be.an.instanceOf(HypercertClient); - expect(client.readonly).to.be.true; + expect(readOnlyClient).to.be.an.instanceOf(HypercertClient); + expect(readOnlyClient.readonly).to.be.true; }); it("should be able to create a new instance", () => { - const operator = ethers.Wallet.createRandom(); - - const config = { chainId: 5, operator, nftStorageToken: "test", web3StorageToken: "test" }; - const client = new HypercertClient(config); + const client = new HypercertClient({ + chain: { id: 5 }, + publicClient, + walletClient, + nftStorageToken: "test", + web3StorageToken: "test", + }); expect(client).to.be.an.instanceOf(HypercertClient); + + //TODO currently only publicClient added as a test, also add other flows expect(client.readonly).to.be.false; }); it("should throw an error when the chainId is not supported", () => { + const falseChainId = 1337; try { - new HypercertClient({ operator: provider, chainId: 1337 }); + new HypercertClient({ chain: { id: falseChainId } }); expect.fail("Should throw UnsupportedChainError"); } catch (e) { expect(e).to.be.instanceOf(UnsupportedChainError); const error = e as UnsupportedChainError; - expect(error.message).to.eq("chainId=1337 is not yet supported"); - expect(Number(error.payload?.chainID)).to.eq(1337); + expect(error.message).to.eq("No default config for chainId=1337 found in SDK"); + expect(Number(error.payload?.chainID)).to.eq(falseChainId); } }); it("should throw an error when executing write method in readonly mode", async () => { - sinon.stub(process, "env").value({ NFT_STORAGE_TOKEN: null }); - sinon.stub(process, "env").value({ WEB3_STORAGE_TOKEN: null }); - sinon.stub(process, "env").value({ NEXT_PUBLIC_NFT_STORAGE_TOKEN: null }); - sinon.stub(process, "env").value({ NEXT_PUBLIC_WEB3_STORAGE_TOKEN: null }); - - const client = new HypercertClient({ operator: provider }); + const client = new HypercertClient({ chain: { id: 5 } }); // mintClaim try { const metaData = { name: "test" } as HypercertMetadata; - const totalUnits = 1; + const totalUnits = 1n; const transferRestrictions = TransferRestrictions.AllowAll; await client.mintClaim(metaData, totalUnits, transferRestrictions); @@ -68,15 +63,15 @@ describe("HypercertClient setup tests", () => { expect(e).to.be.instanceOf(ClientError); const error = e as ClientError; - expect(error.message).to.eq("Client is readonly"); + expect(error.message).to.eq("Could not connect to wallet; sending transactions not allowed."); expect(error.payload?.client instanceof HypercertClient).to.be.true; } // createAllowlist try { - const allowlist: AllowlistEntry[] = [{ address: "0x0000000", units: 100 }]; + const allowlist: AllowlistEntry[] = [{ address: "0x0000000", units: 100n }]; const metaData = { name: "test" } as HypercertMetadata; - const totalUnits = 1; + const totalUnits = 1n; const transferRestrictions = TransferRestrictions.AllowAll; await client.createAllowlist(allowlist, metaData, totalUnits, transferRestrictions); @@ -85,42 +80,42 @@ describe("HypercertClient setup tests", () => { expect(e).to.be.instanceOf(ClientError); const error = e as ClientError; - expect(error.message).to.eq("Client is readonly"); + expect(error.message).to.eq("Could not connect to wallet; sending transactions not allowed."); expect(error.payload?.client).to.be.instanceOf(HypercertClient); } // splitClaimUnits try { - const claimId = 1; - const fractions = [100, 200]; + const claimId = 1n; + const fractions = [100n, 200n]; - await client.splitClaimUnits(claimId, fractions); + await client.splitFractionUnits(claimId, fractions); expect.fail("Should throw ClientError"); } catch (e) { expect(e).to.be.instanceOf(ClientError); const error = e as ClientError; - expect(error.message).to.eq("Client is readonly"); + expect(error.message).to.eq("Could not connect to wallet; sending transactions not allowed."); expect(error.payload?.client).to.be.instanceOf(HypercertClient); } // mergeClaimUnits try { - const claimIds = [1, 2]; + const claimIds = [1n, 2n]; - await client.mergeClaimUnits(claimIds); + await client.mergeFractionUnits(claimIds); expect.fail("Should throw ClientError"); } catch (e) { expect(e).to.be.instanceOf(ClientError); const error = e as ClientError; - expect(error.message).to.eq("Client is readonly"); + expect(error.message).to.eq("Could not connect to wallet; sending transactions not allowed."); expect(error.payload?.client).to.be.instanceOf(HypercertClient); } // burnClaimFraction try { - const claimId = 1; + const claimId = 1n; await client.burnClaimFraction(claimId); expect.fail("Should throw ClientError"); @@ -128,16 +123,16 @@ describe("HypercertClient setup tests", () => { expect(e).to.be.instanceOf(ClientError); const error = e as ClientError; - expect(error.message).to.eq("Client is readonly"); + expect(error.message).to.eq("Could not connect to wallet; sending transactions not allowed."); expect(error.payload?.client).to.be.instanceOf(HypercertClient); } // mintClaimFractionFromAllowlist try { - const claimId = 1; - const units = 100; - const proof = ["0x1", "0x2", "0x3"]; - const root = "0x4"; + const claimId = 1n; + const units = 100n; + const proof = ["0x1", "0x2", "0x3"] as `0x${string}`[]; + const root = "0x4" as `0x${string}`; await client.mintClaimFractionFromAllowlist(claimId, units, proof, root); expect.fail("Should throw ClientError"); @@ -145,19 +140,16 @@ describe("HypercertClient setup tests", () => { expect(e).to.be.instanceOf(ClientError); const error = e as ClientError; - expect(error.message).to.eq("Client is readonly"); + expect(error.message).to.eq("Could not connect to wallet; sending transactions not allowed."); expect(error.payload?.client).to.be.instanceOf(HypercertClient); } // batchMintClaimFractionsFromAllowlist try { - const claimIds = [1, 2]; - const units = [100, 200]; - const proofs = [ - ["0x1", "0x2", "0x3"], - ["0x4", "0x5", "0x6"], - ]; - const roots = ["0x7", "0x8"]; + const claimIds = [1n, 2n]; + const units = [100n, 200n]; + const proofs = [["0x1", "0x2", "0x3"] as `0x${string}`[], ["0x4", "0x5", "0x6"] as `0x${string}`[]]; + const roots = ["0x7", "0x8"] as `0x${string}`[]; await client.batchMintClaimFractionsFromAllowlists(claimIds, units, proofs, roots); expect.fail("Should throw ClientError"); @@ -165,7 +157,7 @@ describe("HypercertClient setup tests", () => { expect(e).to.be.instanceOf(ClientError); const error = e as ClientError; - expect(error.message).to.eq("Client is readonly"); + expect(error.message).to.eq("Could not connect to wallet; sending transactions not allowed."); expect(error.payload?.client).to.be.instanceOf(HypercertClient); } }); diff --git a/sdk/test/client/allowlist.minting.test.ts b/sdk/test/client/allowlist.minting.test.ts index b2b9eb3c..efc6ac2f 100644 --- a/sdk/test/client/allowlist.minting.test.ts +++ b/sdk/test/client/allowlist.minting.test.ts @@ -1,59 +1,57 @@ -import { MockContract, MockProvider, deployMockContract } from "ethereum-waffle"; -import { BigNumber, ethers } from "ethers"; import sinon from "sinon"; import { expect } from "@jest/globals"; -import { HypercertClient } from "../../src/index.js"; +import { HypercertClient } from "../../src"; import HypercertsStorage from "../../src/storage.js"; -import { MalformedDataError, MintingError, TransferRestrictions } from "../../src/types/index.js"; -import { getAllowlist, getFormattedMetadata } from "../helpers.js"; -import { HypercertMinter, HypercertMinterAbi } from "@hypercerts-org/contracts"; -const mockCorrectMetadataCid = "testCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u"; +import { MalformedDataError, MintingError, TransferRestrictions } from "../../src/types"; +import { getAllowlist, getFormattedMetadata, publicClient, walletClient, mockDataSets } from "../helpers"; +import { HypercertMinterAbi } from "@hypercerts-org/contracts"; +import { encodeFunctionResult, isHex, parseAbi, stringToHex } from "viem"; describe("Allows for minting claims from an allowlist", () => { - const metaDataStub = sinon.stub(HypercertsStorage.prototype, "storeMetadata").resolves(mockCorrectMetadataCid); - const dataStub = sinon.stub(HypercertsStorage.prototype, "storeData").resolves(mockCorrectMetadataCid); + const { hypercertData, hypercertMetadata } = mockDataSets; + const metaDataStub = sinon.stub(HypercertsStorage.prototype, "storeMetadata").resolves(hypercertMetadata.cid); + const dataStub = sinon.stub(HypercertsStorage.prototype, "storeData").resolves(hypercertData.cid); + const wallet = walletClient; + const userAddress = wallet.account?.address; + const client = new HypercertClient({ + chain: { id: 5 }, + walletClient, + publicClient, + nftStorageToken: "test", + web3StorageToken: "test", + }); - const setUp = async () => { - const provider = new MockProvider(); - const [user, other, admin] = provider.getWallets(); - const stub = sinon.stub(provider, "on"); + const readSpy = sinon.stub(publicClient, "readContract"); + let writeSpy = sinon.stub(walletClient, "writeContract"); - const minter = await deployMockContract(user, HypercertMinterAbi); + const mintClaimFromAllowlistResult = encodeFunctionResult({ + abi: parseAbi(HypercertMinterAbi), + functionName: "mintClaimFromAllowlist", + result: [], + }); - const client = new HypercertClient({ - chainId: 5, - operator: user, - }); + const batchMintClaimFromAllowlistResult = encodeFunctionResult({ + abi: parseAbi(HypercertMinterAbi), + functionName: "batchMintClaimsFromAllowlists", + result: [], + }); - sinon.replaceGetter(client, "contract", () => minter as unknown as HypercertMinter); - - return { - client, - provider, - users: { user, other, admin }, - minter, - stub, - }; - }; - - let _client: HypercertClient; - let _provider: MockProvider; - let _users: { user: ethers.Wallet; other: ethers.Wallet; admin: ethers.Wallet }; - let _minter: MockContract; - let _stub: sinon.SinonStub; - - beforeAll(async () => { - const { client, provider, users, minter, stub } = await setUp(); - _client = client; - _provider = provider; - _users = users; - _minter = minter; - _stub = stub; + const mintClaimResult = encodeFunctionResult({ + abi: parseAbi(HypercertMinterAbi), + functionName: "createAllowlist", + result: [], }); - beforeEach(() => { - _provider.clearCallHistory(); + beforeEach(async () => { + readSpy.resetBehavior(); + readSpy.resetHistory(); + + writeSpy.resetBehavior(); + writeSpy.resetHistory(); + + metaDataStub.resetHistory(); + dataStub.resetHistory(); }); afterAll(() => { @@ -65,22 +63,24 @@ describe("Allows for minting claims from an allowlist", () => { const { allowlist, totalUnits } = getAllowlist(); const metaData = getFormattedMetadata(); - await _minter.mock.createAllowlist.returns(); - const res = await _client.createAllowlist(allowlist, metaData, totalUnits, TransferRestrictions.FromCreatorOnly); + writeSpy = writeSpy.resolves(mintClaimResult); - sinon.assert.calledOnce(metaDataStub); - sinon.assert.calledOnce(dataStub); + const hash = await client.createAllowlist(allowlist, metaData, totalUnits, TransferRestrictions.FromCreatorOnly); - expect(res.chainId).toBe(1337); - expect(_provider.callHistory.length).toBe(2); + expect(isHex(hash)).toBeTruthy(); + expect(metaDataStub.callCount).toBe(1); + expect(dataStub.callCount).toBe(1); + expect(readSpy.callCount).toBe(0); + expect(writeSpy.callCount).toBe(1); }); it("should not create an allowlist if the total units mismatch", async () => { const { allowlist, totalUnits } = getAllowlist(); const metaData = getFormattedMetadata(); + let hash; try { - await _client.createAllowlist(allowlist, metaData, totalUnits.add(1), TransferRestrictions.FromCreatorOnly); + hash = await client.createAllowlist(allowlist, metaData, totalUnits + 1n, TransferRestrictions.FromCreatorOnly); } catch (e) { expect(e instanceof MalformedDataError).toBeTruthy(); @@ -91,28 +91,40 @@ describe("Allows for minting claims from an allowlist", () => { }); } - expect(_provider.callHistory.length).toBe(0); - expect.assertions(4); + expect(hash).toBeUndefined(); + expect(metaDataStub.callCount).toBe(0); + expect(dataStub.callCount).toBe(0); + expect(readSpy.callCount).toBe(0); + expect(writeSpy.callCount).toBe(0); + expect.assertions(8); }); it("should not create an allowlist if the allowlist is empty", async () => { - const { allowlist, totalUnits } = getAllowlist({ size: 1 }); + const { allowlist, totalUnits } = getAllowlist(); const metaData = getFormattedMetadata(); - allowlist[0].units = BigNumber.from(0); + let hash; + + allowlist[0].units = 0n; try { - await _client.createAllowlist(allowlist, metaData, totalUnits, TransferRestrictions.FromCreatorOnly); + hash = await client.createAllowlist(allowlist, metaData, totalUnits, TransferRestrictions.FromCreatorOnly); } catch (e) { expect(e instanceof MalformedDataError).toBeTruthy(); const error = e as MalformedDataError; expect(error.message).toBe("Allowlist validation failed"); - expect(error.payload).toEqual({ units: "Total units in allowlist must be greater than 0" }); + expect(error.payload).toEqual({ + units: "Total units in allowlist must match total units [expected: 10, got: 9]", + }); } - expect(_provider.callHistory.length).toBe(0); - expect.assertions(4); + expect(hash).toBeUndefined(); + expect(metaDataStub.callCount).toBe(0); + expect(dataStub.callCount).toBe(0); + expect(readSpy.callCount).toBe(0); + expect(writeSpy.callCount).toBe(0); + expect.assertions(8); }); }); @@ -120,41 +132,53 @@ describe("Allows for minting claims from an allowlist", () => { it("should allow to mint a claim from an allowlist without the root", async () => { const { allowlist, merkleTree } = getAllowlist({ size: 1 }); - await _minter.mock.mintClaimFromAllowlist.returns(); + writeSpy = writeSpy.resolves(mintClaimFromAllowlistResult); - await _client.mintClaimFractionFromAllowlist( - 1, + const hash = await client.mintClaimFractionFromAllowlist( + 1n, allowlist[0].units, - merkleTree.getProof([allowlist[0].address, allowlist[0].units.toString()]), + merkleTree.getProof([allowlist[0].address, allowlist[0].units.toString()]) as `0x${string}`[], ); - expect(_provider.callHistory.length).toBe(2); + expect(isHex(hash)).toBeTruthy(); + expect(metaDataStub.callCount).toBe(0); + expect(dataStub.callCount).toBe(0); + expect(readSpy.callCount).toBe(0); + expect(writeSpy.callCount).toBe(1); + expect.assertions(5); }); it("should allow to mint a claim from an allowlist with a correct root", async () => { - const { allowlist, merkleTree } = getAllowlist({ size: 1, address: _users.user.address as `0x${string}` }); + const { allowlist, merkleTree } = getAllowlist({ size: 1, address: userAddress }); - await _minter.mock.mintClaimFromAllowlist.returns(); + writeSpy = writeSpy.resolves(mintClaimFromAllowlistResult); - await _client.mintClaimFractionFromAllowlist( - 1, + const hash = await client.mintClaimFractionFromAllowlist( + 1n, allowlist[0].units, - merkleTree.getProof([allowlist[0].address, allowlist[0].units.toString()]), - merkleTree.root, + merkleTree.getProof([allowlist[0].address, allowlist[0].units.toString()]) as `0x${string}`[], + merkleTree.root as `0x${string}`, ); - expect(_provider.callHistory.length).toBe(2); + expect(isHex(hash)).toBeTruthy(); + expect(metaDataStub.callCount).toBe(0); + expect(dataStub.callCount).toBe(0); + expect(readSpy.callCount).toBe(0); + expect(writeSpy.callCount).toBe(1); + expect.assertions(5); }); it("should not allow to mint a claim from an allowlist with an incorrect root", async () => { - const { allowlist, merkleTree } = getAllowlist({ size: 1, address: _users.user.address as `0x${string}` }); + const { allowlist, merkleTree } = getAllowlist({ size: 1, address: userAddress }); + + const mockRoot = stringToHex("MOCK_ROOT", { size: 32 }); - const mockRoot = ethers.utils.formatBytes32String("MOCK_ROOT"); + let hash; try { - await _client.mintClaimFractionFromAllowlist( - 1, + hash = await client.mintClaimFractionFromAllowlist( + 1n, allowlist[0].units, - merkleTree.getProof([allowlist[0].address, allowlist[0].units.toString()]), + merkleTree.getProof([allowlist[0].address, allowlist[0].units.toString()]) as `0x${string}`[], mockRoot, ); } catch (e) { @@ -168,17 +192,21 @@ describe("Allows for minting claims from an allowlist", () => { }); } - expect(_provider.callHistory.length).toBe(0); - expect.assertions(4); + expect(hash).toBeUndefined(); + expect(metaDataStub.callCount).toBe(0); + expect(dataStub.callCount).toBe(0); + expect(readSpy.callCount).toBe(0); + expect(writeSpy.callCount).toBe(0); + expect.assertions(8); }); }); describe("Batch mint fractions", () => { it("should allow to batch mint a claim from an allowlist without the root", async () => { const firstList = getAllowlist({ size: 1 }); - const secondList = getAllowlist({ size: 1, units: 42 }); + const secondList = getAllowlist({ size: 1, units: 42n }); - await _minter.mock.batchMintClaimsFromAllowlists.returns(); + writeSpy = writeSpy.resolves(batchMintClaimFromAllowlistResult); const firstProofs = firstList.merkleTree.getProof([ firstList.allowlist[0].address, @@ -188,20 +216,25 @@ describe("Allows for minting claims from an allowlist", () => { secondList.allowlist[0].address, secondList.allowlist[0].units.toString(), ]); - await _client.batchMintClaimFractionsFromAllowlists( - [1, 2], + const hash = await client.batchMintClaimFractionsFromAllowlists( + [1n, 2n], [firstList.allowlist[0].units, secondList.allowlist[0].units], - [firstProofs, secondProofs], + [firstProofs, secondProofs] as `0x${string}`[][], ); - expect(_provider.callHistory.length).toBe(2); + expect(isHex(hash)).toBeTruthy(); + expect(metaDataStub.callCount).toBe(0); + expect(dataStub.callCount).toBe(0); + expect(readSpy.callCount).toBe(0); + expect(writeSpy.callCount).toBe(1); + expect.assertions(5); }); it("should allow to mint a claim from an allowlist with a correct root", async () => { - const firstList = getAllowlist({ size: 1, address: _users.user.address as `0x${string}` }); - const secondList = getAllowlist({ size: 1, units: 42, address: _users.user.address as `0x${string}` }); + const firstList = getAllowlist({ size: 1, address: userAddress }); + const secondList = getAllowlist({ size: 1, units: 42n, address: userAddress }); - await _minter.mock.batchMintClaimsFromAllowlists.returns(); + writeSpy = writeSpy.resolves(batchMintClaimFromAllowlistResult); const firstProofs = firstList.merkleTree.getProof([ firstList.allowlist[0].address, @@ -211,21 +244,26 @@ describe("Allows for minting claims from an allowlist", () => { secondList.allowlist[0].address, secondList.allowlist[0].units.toString(), ]); - await _client.batchMintClaimFractionsFromAllowlists( - [1, 2], + const hash = await client.batchMintClaimFractionsFromAllowlists( + [1n, 2n], [firstList.allowlist[0].units, secondList.allowlist[0].units], - [firstProofs, secondProofs], - [firstList.merkleTree.root, secondList.merkleTree.root], + [firstProofs, secondProofs] as `0x${string}`[][], + [firstList.merkleTree.root, secondList.merkleTree.root] as `0x${string}`[], ); - expect(_provider.callHistory.length).toBe(2); + expect(isHex(hash)).toBeTruthy(); + expect(metaDataStub.callCount).toBe(0); + expect(dataStub.callCount).toBe(0); + expect(readSpy.callCount).toBe(0); + expect(writeSpy.callCount).toBe(1); + expect.assertions(5); }); it("should not allow to mint a claim from an allowlist with an incorrect root", async () => { - const firstList = getAllowlist({ size: 1, address: _users.user.address as `0x${string}` }); - const secondList = getAllowlist({ size: 1, units: 42, address: _users.user.address as `0x${string}` }); + const firstList = getAllowlist({ size: 1, address: userAddress }); + const secondList = getAllowlist({ size: 1, units: 42n, address: userAddress }); - await _minter.mock.batchMintClaimsFromAllowlists.returns(); + writeSpy = writeSpy.resolves(batchMintClaimFromAllowlistResult); const firstProofs = firstList.merkleTree.getProof([ firstList.allowlist[0].address, @@ -236,13 +274,14 @@ describe("Allows for minting claims from an allowlist", () => { secondList.allowlist[0].units.toString(), ]); - const mockRoot = ethers.utils.formatBytes32String("MOCK_ROOT"); + const mockRoot = stringToHex("MOCK_ROOT", { size: 32 }); + let hash; try { - await _client.batchMintClaimFractionsFromAllowlists( - [1, 2], + hash = await client.batchMintClaimFractionsFromAllowlists( + [1n, 2n], [firstList.allowlist[0].units, secondList.allowlist[0].units], - [firstProofs, secondProofs], - [firstList.merkleTree.root, mockRoot], + [firstProofs, secondProofs] as `0x${string}`[][], + [firstList.merkleTree.root as `0x${string}`, mockRoot], ); } catch (e) { expect(e instanceof MintingError).toBeTruthy(); @@ -255,8 +294,12 @@ describe("Allows for minting claims from an allowlist", () => { }); } - // Signer getAddress - expect(_provider.callHistory.length).toBe(1); + expect(hash).toBeUndefined(); + expect(metaDataStub.callCount).toBe(0); + expect(dataStub.callCount).toBe(0); + expect(readSpy.callCount).toBe(0); + expect(writeSpy.callCount).toBe(0); + expect.assertions(8); }); }); }); diff --git a/sdk/test/client/burn.test.ts b/sdk/test/client/burn.test.ts index c0d83887..64b2d877 100644 --- a/sdk/test/client/burn.test.ts +++ b/sdk/test/client/burn.test.ts @@ -1,68 +1,63 @@ -import { MockProvider, deployMockContract } from "ethereum-waffle"; -import { BigNumber, Wallet } from "ethers"; +import HypercertClient from "../../src/client"; +import { walletClient, publicClient } from "../helpers"; +import { ContractFunctionExecutionError, isHex, toHex } from "viem"; import sinon from "sinon"; +import { faker } from "@faker-js/faker"; +import { ClientError } from "../../src"; -import HypercertClient from "../../src/client.js"; -import { ClientError } from "../../src/types/errors.js"; -import { HypercertMinterAbi } from "@hypercerts-org/contracts"; describe("burn fraction tokens in HypercertClient", () => { - let stub: sinon.SinonStub; - let provider: MockProvider; - let user: Wallet; - let other: Wallet; - const fractionId = BigNumber.from("9868188640707215440437863615521278132232"); + const wallet = walletClient; + const userAddress = wallet.account?.address; + const client = new HypercertClient({ + chain: { id: 5 }, + walletClient, + publicClient, + nftStorageToken: "test", + web3StorageToken: "test", + }); - beforeAll(() => { - provider = new MockProvider(); - [user, other] = provider.getWallets(); + const fractionId = 9868188640707215440437863615521278132232n; - stub = sinon.stub(provider, "on"); - }); - beforeEach(() => { - provider.clearCallHistory(); + let readSpy = sinon.stub(publicClient, "readContract"); + let writeSpy = sinon.stub(walletClient, "writeContract"); + + beforeEach(async () => { + readSpy.resetBehavior(); + readSpy.resetHistory(); + + writeSpy.resetBehavior(); + writeSpy.resetHistory(); }); afterAll(() => { - stub.restore(); + sinon.restore(); }); it("allows for a hypercert fraction to be burned", async () => { - const userAddress = await user.getAddress(); - const mockMinter = await deployMockContract(user, HypercertMinterAbi); - await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); - await mockMinter.mock["burnFraction(address,uint256)"].withArgs(userAddress, fractionId).returns(); + readSpy = readSpy.resolves(userAddress); - const client = new HypercertClient({ - chainId: 5, - operator: user, - contractAddress: mockMinter.address, - }); + writeSpy = writeSpy.resolves(toHex(420)); expect(client.readonly).toBe(false); - await client.burnClaimFraction(fractionId); + const hash = await client.burnClaimFraction(fractionId); + console.log(hash); //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(provider.callHistory.length).toBe(5); + expect(isHex(hash)).toBeTruthy(); + expect(readSpy.callCount).toBe(1); + expect(writeSpy.callCount).toBe(1); }); it("throws on burning fraction not owned by signer", async () => { - const otherUser = await other.getAddress(); - const mockMinter = await deployMockContract(user, HypercertMinterAbi); - await mockMinter.mock.ownerOf.withArgs(fractionId).returns(otherUser); - - const client = new HypercertClient({ - chainId: 5, - operator: user, - contractAddress: mockMinter.address, - }); + readSpy = readSpy.resolves(faker.finance.ethereumAddress()); expect(client.readonly).toBe(false); + let hash; try { - await client.burnClaimFraction(fractionId); + hash = await client.burnClaimFraction(fractionId); } catch (e) { - console.log(e); expect(e instanceof ClientError).toBeTruthy(); const error = e as ClientError; @@ -70,34 +65,36 @@ describe("burn fraction tokens in HypercertClient", () => { } //TODO determine underlying calls and mock those out. Some are provider simulation calls - // Owner - expect(provider.callHistory.length).toBe(3); - expect.assertions(4); + expect(hash).toBeUndefined(); + expect(readSpy.callCount).toBe(1); + expect(writeSpy.callCount).toBe(0); + expect.assertions(6); }); it("allows for a hypercert fraction to be burned with override params", async () => { - const userAddress = await user.getAddress(); - const mockMinter = await deployMockContract(user, HypercertMinterAbi); - await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); - await mockMinter.mock["burnFraction(address,uint256)"].withArgs(userAddress, fractionId).returns(); + readSpy = readSpy.resolves(userAddress); - const client = new HypercertClient({ - chainId: 5, - operator: user, - contractAddress: mockMinter.address, - }); + writeSpy = writeSpy.resolves(toHex(420)); expect(client.readonly).toBe(false); + let noHash; + try { - await client.burnClaimFraction(fractionId, { gasLimit: "FALSE_VALUE" }); + noHash = await client.burnClaimFraction(fractionId, { gasLimit: "FALSE_VALUE" as unknown as bigint }); + expect.fail("should have thrown on incorrect gasLimit value"); } catch (e) { - expect((e as Error).message).toMatch(/invalid BigNumber string/); + expect(e instanceof ContractFunctionExecutionError).toBeTruthy(); } - await client.burnClaimFraction(fractionId, { gasLimit: "12300000" }); + const hash = await client.burnClaimFraction(fractionId, { gasLimit: 12300000n }); //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(provider.callHistory.length).toBe(6); + expect(noHash).toBeUndefined(); + + expect(isHex(hash)).toBeTrue(); + expect(readSpy.callCount).toBe(2); + expect(writeSpy.callCount).toBe(1); + expect.assertions(6); }); }); diff --git a/sdk/test/client/minting.test.ts b/sdk/test/client/minting.test.ts index 2d657062..1136704d 100644 --- a/sdk/test/client/minting.test.ts +++ b/sdk/test/client/minting.test.ts @@ -1,60 +1,45 @@ import { expect } from "chai"; -import { MockContract, MockProvider, deployMockContract } from "ethereum-waffle"; -import { ethers } from "ethers"; import sinon from "sinon"; -import { jest, test } from "@jest/globals"; +import { ContractFunctionExecutionError, encodeFunctionResult, isHex, parseAbi } from "viem"; -import HypercertClient from "../../src/client.js"; -import { HypercertMetadata, HypercertsStorage, formatHypercertData } from "../../src/index.js"; -import { MalformedDataError } from "../../src/types/errors.js"; -import { TransferRestrictions } from "../../src/types/hypercerts.js"; -import { getRawInputData } from "../helpers.js"; -import { HypercertMinter, HypercertMinterAbi } from "@hypercerts-org/contracts"; -const mockCorrectMetadataCid = "testCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u"; +import HypercertClient from "../../src/client"; +import { HypercertMetadata, formatHypercertData } from "../../src"; +import { MalformedDataError } from "../../src/types/errors"; +import { TransferRestrictions } from "../../src/types/hypercerts"; +import { getRawInputData, publicClient, walletClient } from "../helpers"; +import { HypercertMinterAbi } from "@hypercerts-org/contracts"; + +//eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import { CIDString, NFTStorage } from "nft.storage"; describe("mintClaim in HypercertClient", () => { - const metaDataStub = sinon.stub(HypercertsStorage.prototype, "storeMetadata").resolves(mockCorrectMetadataCid); - - const setUp = async () => { - const provider = new MockProvider(); - const [user, other, admin] = provider.getWallets(); - const stub = sinon.stub(provider, "on"); - - const minter = await deployMockContract(user, HypercertMinterAbi); - - const client = new HypercertClient({ - chainId: 5, - operator: user, - }); - - sinon.replaceGetter(client, "contract", () => minter as unknown as HypercertMinter); - - return { - client, - provider, - users: { user, other, admin }, - minter, - stub, - }; - }; - - let _client: HypercertClient; - let _provider: MockProvider; - let _users: { user: ethers.Wallet; other: ethers.Wallet; admin: ethers.Wallet }; - let _minter: MockContract; - let _stub: sinon.SinonStub; - - beforeAll(async () => { - const { client, provider, users, minter, stub } = await setUp(); - _client = client; - _provider = provider; - _users = users; - _minter = minter; - _stub = stub; + const mockCorrectMetadataCid = "testCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u" as CIDString; + + const storeBlobMock = sinon.stub(NFTStorage, "storeBlob").resolves(mockCorrectMetadataCid); + + const client = new HypercertClient({ + chain: { id: 5 }, + walletClient, + publicClient, + nftStorageToken: "test", + web3StorageToken: "test", }); - beforeEach(() => { - _provider.clearCallHistory(); + const readSpy = sinon.stub(publicClient, "readContract"); + let writeSpy = sinon.stub(walletClient, "writeContract"); + + const mintClaimResult = encodeFunctionResult({ + abi: parseAbi(HypercertMinterAbi), + functionName: "mintClaim", + result: [], + }); + + beforeEach(async () => { + writeSpy.resetBehavior(); + writeSpy.resetHistory(); + + storeBlobMock.resetHistory(); }); afterAll(() => { @@ -62,49 +47,59 @@ describe("mintClaim in HypercertClient", () => { }); it("mints a hypercerts", async () => { - expect(_client.readonly).to.be.false; + expect(client.readonly).to.be.false; const rawData = getRawInputData(); const { data: formattedData } = formatHypercertData(rawData); - await _minter.mock.mintClaim.returns(); + writeSpy = writeSpy.resolves(mintClaimResult); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - await _client.mintClaim(formattedData!, 1000, TransferRestrictions.AllowAll); + const hash = await client.mintClaim(formattedData!, 1000n, TransferRestrictions.AllowAll); - sinon.assert.calledOnce(metaDataStub); - expect(_provider.callHistory.length).to.equal(2); - }, 10000); + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.equal(0); + expect(writeSpy.callCount).to.equal(1); + expect(storeBlobMock.callCount).to.equal(1); + }); it("throws on malformed metadata", async () => { try { - await _client.mintClaim({} as HypercertMetadata, 1000, TransferRestrictions.AllowAll); + await client.mintClaim({} as HypercertMetadata, 1000n, TransferRestrictions.AllowAll); expect.fail("Should throw MalformedDataError"); } catch (e) { expect(e).to.be.instanceOf(MalformedDataError); const error = e as MalformedDataError; expect(error.message).to.equal("Metadata validation failed"); } - expect(_provider.callHistory.length).to.equal(0); + expect(writeSpy.callCount).to.equal(0); }); it("mints a hypercerts with override params", async () => { const rawData = getRawInputData(); - await _minter.mock.mintClaim.returns(); const { data: formattedData } = formatHypercertData(rawData); + writeSpy = writeSpy.resolves(mintClaimResult); + + let hash; + try { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - await _client.mintClaim(formattedData!, 1000, TransferRestrictions.AllowAll, { gasPrice: "FALSE_VALUE" }); + hash = await client.mintClaim(formattedData!, 1000n, TransferRestrictions.AllowAll, { + gasPrice: "FALSE_VALUE" as unknown as bigint, + }); expect.fail("Should throw Error"); } catch (e) { - expect((e as Error).message).to.match(/.*invalid BigNumber string.*/); + expect(e).to.be.instanceOf(ContractFunctionExecutionError); } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - await _client.mintClaim(formattedData!, 1000, TransferRestrictions.AllowAll, { gasPrice: "100" }); + hash = await client.mintClaim(formattedData!, 1000n, TransferRestrictions.AllowAll, { gasPrice: 100n }); - expect(_provider.callHistory.length).to.equal(2); - }, 10000); + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.equal(0); + expect(writeSpy.callCount).to.equal(1); + expect(storeBlobMock.callCount).to.equal(2); + }); }); diff --git a/sdk/test/client/split.merge.test.ts b/sdk/test/client/split.merge.test.ts index fec89bf8..57d19762 100644 --- a/sdk/test/client/split.merge.test.ts +++ b/sdk/test/client/split.merge.test.ts @@ -1,252 +1,218 @@ -import { MockProvider, deployMockContract } from "ethereum-waffle"; -import { BigNumber, Wallet } from "ethers"; import sinon from "sinon"; -import HypercertClient from "../../src/client.js"; -import { ClientError } from "../../src/types/errors.js"; +import HypercertClient from "../../src/client"; -import { HypercertMinterAbi } from "@hypercerts-org/contracts"; +import { publicClient, walletClient } from "../helpers"; +import { ContractFunctionExecutionError, isHex, toHex } from "viem"; describe("splitClaimUnits in HypercertClient", () => { - let stub: sinon.SinonStub; - let provider: MockProvider; - let wallet: Wallet; - const fractionId = BigNumber.from("9868188640707215440437863615521278132232"); + const wallet = walletClient; + const userAddress = wallet.account?.address; + + let readSpy = sinon.stub(publicClient, "readContract"); + let writeSpy = sinon.stub(walletClient, "writeContract"); + + const client = new HypercertClient({ + chain: { id: 5 }, + walletClient, + publicClient, + nftStorageToken: "test", + web3StorageToken: "test", + }); - beforeAll(() => { - provider = new MockProvider(); - wallet = provider.getWallets()[0]; + const fractionId = 9868188640707215440437863615521278132232n; - stub = sinon.stub(provider, "on"); - }); - beforeEach(() => { - provider.clearCallHistory(); + beforeEach(async () => { + readSpy.resetBehavior(); + readSpy.resetHistory(); + + writeSpy.resetBehavior(); + writeSpy.resetHistory(); }); afterAll(() => { - stub.restore(); + sinon.restore(); }); it("allows for a hypercert fractions to be splitted over value", async () => { - const userAddress = await wallet.getAddress(); - const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); - await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); - await mockMinter.mock["unitsOf(uint256)"].withArgs(fractionId).returns(300); - await mockMinter.mock["splitFraction(address,uint256,uint256[])"] - .withArgs(userAddress, fractionId, [100, 200]) - .returns(); - - const signer = wallet.connect(provider); - - const client = new HypercertClient({ - chainId: 5, - operator: signer, - contractAddress: mockMinter.address, - }); - - expect(client.readonly).toBe(false); - - await client.splitClaimUnits(fractionId, [100, 200]); - - //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(provider.callHistory.length).toBe(7); - }, 10000); - - it("allows for a hypercert fractions to be splitted over value with override params", async () => { - const userAddress = await wallet.getAddress(); - const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); - await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); - await mockMinter.mock["unitsOf(uint256)"].withArgs(fractionId).returns(300); - await mockMinter.mock["splitFraction(address,uint256,uint256[])"] - .withArgs(userAddress, fractionId, [100, 200]) - .returns(); - - const signer = wallet.connect(provider); - - const client = new HypercertClient({ - chainId: 5, - operator: signer, - contractAddress: mockMinter.address, - }); - expect(client.readonly).toBe(false); - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - try { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - await client.splitClaimUnits(fractionId, [100, 200], { gasLimit: "FALSE_VALUE" }); - } catch (e) { - expect((e as Error).message).toMatch(/invalid BigNumber string/); - } - - await client.splitClaimUnits(fractionId, [100, 200], { gasLimit: "12300000" }); - - //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(provider.callHistory.length).toBe(9); - }, 10000); - - it("throws on splitting with incorrect new total value", async () => { - const userAddress = await wallet.getAddress(); - const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); - await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); - await mockMinter.mock["unitsOf(uint256)"].withArgs(fractionId).returns(42); - - const signer = wallet.connect(provider); - - const client = new HypercertClient({ - chainId: 5, - operator: signer, - contractAddress: mockMinter.address, - }); - expect(client.readonly).toBe(false); - - try { - await client.splitClaimUnits(fractionId, [100, 200]); - } catch (e) { - expect(e instanceof ClientError).toBeTruthy(); - - const error = e as ClientError; - expect(error.message).toBe("Sum of fractions is not equal to the total units"); - } - - //TODO determine underlying calls and mock those out. Some are provider simulation calls - // Owner - // UnitsOf - expect(provider.callHistory.length).toBe(5); - expect.assertions(4); - }); - - it("throws on splitting fractions not owned by signer", async () => { - const otherUser = await provider.getWallets()[1].getAddress(); - const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); - await mockMinter.mock.ownerOf.withArgs(fractionId).returns(otherUser); - - const signer = wallet.connect(provider); + readSpy = readSpy.onFirstCall().resolves(userAddress).onSecondCall().resolves(300n); + writeSpy = writeSpy.resolves(toHex(420)); - const client = new HypercertClient({ - chainId: 5, - operator: signer, - contractAddress: mockMinter.address, - }); expect(client.readonly).toBe(false); - try { - await client.splitClaimUnits(fractionId, [100, 200]); - } catch (e) { - expect(e instanceof ClientError).toBeTruthy(); - - const error = e as ClientError; - expect(error.message).toBe("Claim is not owned by the signer"); - } + const hash = await client.splitFractionUnits(fractionId, [100n, 200n]); //TODO determine underlying calls and mock those out. Some are provider simulation calls - // Owner - expect(provider.callHistory.length).toBe(3); + expect(isHex(hash)).toBeTruthy(); + expect(readSpy.callCount).toBe(2); + expect(writeSpy.callCount).toBe(1); expect.assertions(4); }); -}); - -describe("mergeClaimUnits in HypercertClient", () => { - let stub: sinon.SinonStub; - let provider: MockProvider; - let wallet: Wallet; - const fractionId = BigNumber.from("9868188640707215440437863615521278132232"); - beforeAll(() => { - provider = new MockProvider(); - wallet = provider.getWallets()[0]; - stub = sinon.stub(provider, "on"); - }); - beforeEach(() => { - provider.clearCallHistory(); - }); - - afterAll(() => { - stub.restore(); - }); - - it("allows for hypercert fractions to merge value", async () => { - const userAddress = await wallet.getAddress(); - const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); - await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); - await mockMinter.mock.ownerOf.withArgs(fractionId.add(1)).returns(userAddress); - await mockMinter.mock["mergeFractions(address,uint256[])"] - .withArgs(userAddress, [fractionId, fractionId.add(1)]) - .returns(); - - const signer = wallet.connect(provider); - - const client = new HypercertClient({ - chainId: 5, - operator: signer, - contractAddress: mockMinter.address, - }); - expect(client.readonly).toBe(false); - - await client.mergeClaimUnits([fractionId, fractionId.add(1)]); + it("allows for a hypercert fractions to be splitted over value with override params", async () => { + readSpy = readSpy + .onFirstCall() + .resolves(userAddress) + .onSecondCall() + .resolves(300n) + .onThirdCall() + .resolves(userAddress) + .onCall(3) + .resolves(300n); + + writeSpy = writeSpy.resolves(toHex(420)); - //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(provider.callHistory.length).toBe(7); - }, 10000); - - it("allows for hypercert fractions to merge value with override params", async () => { - const userAddress = await wallet.getAddress(); - const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); - await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); - await mockMinter.mock.ownerOf.withArgs(fractionId.add(1)).returns(userAddress); - await mockMinter.mock["mergeFractions(address,uint256[])"] - .withArgs(userAddress, [fractionId, fractionId.add(1)]) - .returns(); - - const signer = wallet.connect(provider); - - const client = new HypercertClient({ - chainId: 5, - operator: signer, - contractAddress: mockMinter.address, - }); expect(client.readonly).toBe(false); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion try { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - await client.mergeClaimUnits([fractionId, fractionId.add(1)], { gasLimit: "FALSE_VALUE" }); + await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: "FALSE_VALUE" as unknown as bigint }); } catch (e) { - expect((e as Error).message).toMatch(/invalid BigNumber string/); + expect(e instanceof ContractFunctionExecutionError).toBeTruthy(); } - await client.mergeClaimUnits([fractionId, fractionId.add(1)], { gasLimit: "12300000" }); + const hash = await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: 12300000n }); //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(provider.callHistory.length).toBe(9); - }, 10000); - - it("throws on splitting fractions not owned by signer", async () => { - const userAddress = await wallet.getAddress(); - const otherUser = await provider.getWallets()[1].getAddress(); - - const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); - await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); - await mockMinter.mock.ownerOf.withArgs(fractionId.add(1)).returns(otherUser); - - const signer = wallet.connect(provider); - - const client = new HypercertClient({ - chainId: 5, - operator: signer, - contractAddress: mockMinter.address, - }); - expect(client.readonly).toBe(false); - - try { - await client.mergeClaimUnits([fractionId, fractionId.add(1)]); - } catch (e) { - expect(e instanceof ClientError).toBeTruthy(); - - const error = e as ClientError; - expect(error.message).toBe("One or more claims are not owned by the signer"); - } - - //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(provider.callHistory.length).toBe(5); + expect(isHex(hash)).toBeTruthy(); + expect(readSpy.callCount).toBe(4); + expect(writeSpy.callCount).toBe(1); + expect.assertions(5); }); + + // it("throws on splitting with incorrect new total value", async () => { + // const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); + // await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); + // await mockMinter.mock["unitsOf(uint256)"].withArgs(fractionId).returns(42); + + // const client = new HypercertClient({ + // chainId: 5, + // operator: walletClient, + // contractAddress: mockMinter.address, + // }); + // expect(client.readonly).toBe(false); + + // try { + // await client.splitClaimUnits(fractionId, [100n, 200n]); + // } catch (e) { + // expect(e instanceof ClientError).toBeTruthy(); + + // const error = e as ClientError; + // expect(error.message).toBe("Sum of fractions is not equal to the total units"); + // } + + // //TODO determine underlying calls and mock those out. Some are provider simulation calls + // // Owner + // // UnitsOf + // expect(provider.callHistory.length).toBe(5); + // expect.assertions(4); + // }); + + // it("throws on splitting fractions not owned by signer", async () => { + // const otherUser = await provider.getWallets()[1].getAddress(); + // const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); + // await mockMinter.mock.ownerOf.withArgs(fractionId).returns(otherUser); + + // const client = new HypercertClient({ + // chainId: 5, + // operator: walletClient, + // contractAddress: mockMinter.address, + // }); + // expect(client.readonly).toBe(false); + + // try { + // await client.splitClaimUnits(fractionId, [100n, 200n]); + // } catch (e) { + // expect(e instanceof ClientError).toBeTruthy(); + + // const error = e as ClientError; + // expect(error.message).toBe("Claim is not owned by the signer"); + // } + + // //TODO determine underlying calls and mock those out. Some are provider simulation calls + // // Owner + // expect(provider.callHistory.length).toBe(3); + // expect.assertions(4); + // }); }); + +// describe("mergeClaimUnits in HypercertClient", () => { +// const provider = testClient; +// const wallet = walletClient; +// const fractionId = 9868188640707215440437863615521278132232n; +// const userAddress = wallet.account.address; + +// it("allows for hypercert fractions to merge value", async () => { +// const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); +// await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); +// await mockMinter.mock.ownerOf.withArgs(fractionId + 1n).returns(userAddress); +// await mockMinter.mock["mergeFractions(address,uint256[])"] +// .withArgs(userAddress, [fractionId, fractionId + 1n]) +// .returns(); + +// const client = new HypercertClient({ +// chainId: 5, +// operator: walletClient, +// contractAddress: mockMinter.address, +// }); +// expect(client.readonly).toBe(false); + +// await client.mergeClaimUnits([fractionId, fractionId + 1n]); + +// //TODO determine underlying calls and mock those out. Some are provider simulation calls +// expect(provider.callHistory.length).toBe(7); +// }, 10000); + +// it("allows for hypercert fractions to merge value with override params", async () => { +// const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); +// await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); +// await mockMinter.mock.ownerOf.withArgs(fractionId + 1n).returns(userAddress); +// await mockMinter.mock["mergeFractions(address,uint256[])"] +// .withArgs(userAddress, [fractionId, fractionId + 1n]) +// .returns(); + +// const client = new HypercertClient({ +// chainId: 5, +// operator: walletClient, +// contractAddress: mockMinter.address, +// }); +// expect(client.readonly).toBe(false); + +// try { +// await client.mergeClaimUnits([fractionId, fractionId + 1n], { gasLimit: "FALSE_VALUE" as unknown as bigint }); +// } catch (e) { +// expect((e as Error).message).toMatch(/invalid BigNumber string/); +// } + +// await client.mergeClaimUnits([fractionId, fractionId + 1n], { gasLimit: 12300000n }); + +// //TODO determine underlying calls and mock those out. Some are provider simulation calls +// expect(provider.callHistory.length).toBe(9); +// }, 10000); + +// it("throws on splitting fractions not owned by signer", async () => { +// const otherUser = await provider.getWallets()[1].getAddress(); + +// const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); +// await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); +// await mockMinter.mock.ownerOf.withArgs(fractionId + 1n).returns(otherUser); + +// const client = new HypercertClient({ +// chainId: 5, +// operator: walletClient, +// contractAddress: mockMinter.address, +// }); +// expect(client.readonly).toBe(false); + +// try { +// await client.mergeClaimUnits([fractionId, fractionId + 1n]); +// } catch (e) { +// expect(e instanceof ClientError).toBeTruthy(); + +// const error = e as ClientError; +// expect(error.message).toBe("One or more claims are not owned by the signer"); +// } + +// //TODO determine underlying calls and mock those out. Some are provider simulation calls +// expect(provider.callHistory.length).toBe(5); +// }); +// }); diff --git a/sdk/test/evaluations/easEvaluator.test.ts b/sdk/test/evaluations/easEvaluator.test.ts deleted file mode 100644 index 048ec024..00000000 --- a/sdk/test/evaluations/easEvaluator.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { MockProvider } from "ethereum-waffle"; -import sinon from "sinon"; - -import { EAS_SCHEMAS } from "../../src/constants.js"; -import EasEvaluator from "../../src/evaluations/eas.js"; -import { HypercertClientConfig } from "../../src/index.js"; -import { DuplicateEvaluation, SimpleTextEvaluation } from "../../src/types/evaluation.js"; - -describe("EasEvaluator", () => { - let stub: sinon.SinonStub; - const provider = new MockProvider(); - - beforeAll(() => { - stub = sinon.stub(provider, "on"); - }); - const [wallet] = provider.getWallets(); - const signer = wallet.connect(provider); - - afterAll(() => { - stub.restore(); - }); - - const config = { - chainId: 5, - easContractAddress: "0xC2679fBD37d54388Ce493F1DB75320D236e1815e", - operator: signer, - } as Partial; - const easEvaluator = new EasEvaluator(config); - - describe("getSignature", () => { - it("should return a signature", async () => { - const encodedData = "0x1234567890abcdef"; - const recipient = "0x0987654321098765432109876543210987654321"; - const schema = EAS_SCHEMAS["sepolia"].duplicate; - - const signature = await easEvaluator.getSignature(encodedData, recipient, schema.uid); - - expect(signature).toBeDefined(); - expect(signature.message.schema).toEqual(schema.uid); - expect(Object.keys(signature)).toEqual( - expect.arrayContaining(["domain", "message", "primaryType", "signature", "types", "uid"]), - ); - }); - }); - - describe("signOfflineEvaluation", () => { - it("should sign a duplicate evaluation", async () => { - const evaluation = { - type: "duplicate", - realHypercert: { - chainId: "0x1", - contract: "0x1234567890123456789012345678901234567890", - claimId: "1", - }, - duplicateHypercerts: [ - { - chainId: "0x1", - contract: "0x0987654321098765432109876543210987654321", - claimId: "2", - }, - ], - explanation: "explanation", - } as DuplicateEvaluation; - - const signature = await easEvaluator.signOfflineEvaluation(evaluation); - - expect(signature).toBeDefined(); - expect(signature?.message.schema).toEqual(EAS_SCHEMAS["sepolia"].duplicate.uid); - expect(signature).toContainKeys(["domain", "message", "primaryType", "signature", "types", "uid"]); - }); - - it("should sign a simple text evaluation", async () => { - const evaluation = { - type: "simpleText", - hypercert: { - chainId: "0x1", - contract: "0x0987654321098765432109876543210987654321", - claimId: "2", - }, - text: "text", - } as SimpleTextEvaluation; - - const signature = await easEvaluator.signOfflineEvaluation(evaluation); - - expect(signature).toBeDefined(); - expect(signature?.message.schema).toEqual(EAS_SCHEMAS["sepolia"].contentHash.uid); - expect(signature).toContainKeys(["domain", "message", "primaryType", "signature", "types", "uid"]); - }); - }); -}); diff --git a/sdk/test/evaluations/evaluator.test.ts b/sdk/test/evaluations/evaluator.test.ts index b3ca52c7..542abd21 100644 --- a/sdk/test/evaluations/evaluator.test.ts +++ b/sdk/test/evaluations/evaluator.test.ts @@ -1,30 +1,17 @@ import { expect } from "@jest/globals"; -import { providers } from "ethers"; -import { Wallet, ethers } from "ethers"; -import { CIDString } from "nft.storage"; import sinon from "sinon"; import HypercertEvaluator from "../../src/evaluations/index.js"; -import { InvalidOrMissingError, MalformedDataError, StorageError } from "../../src/types/errors.js"; +import { MalformedDataError, StorageError } from "../../src/types/errors.js"; import { HypercertEvaluationSchema } from "../../src/types/evaluation.js"; -import { getEvaluationData } from "../helpers.js"; +import { getEvaluationData, publicClient, walletClient } from "../helpers.js"; describe("HypercertEvaluator", () => { - let stubSubscription: sinon.SinonStub; - let stubStorage: sinon.SinonStub; - let signer: Wallet; - let evaluator: HypercertEvaluator; - const mockCid = "bafybeibxm2nsadl3fnxv2sxcxmxaco2jl53wpeorjdzidjwf5aqdg7wa6u"; - - beforeAll(() => { - stubSubscription = sinon.stub(providers.JsonRpcProvider.prototype, "on"); - signer = ethers.Wallet.createRandom(); - evaluator = new HypercertEvaluator({ - chainId: 5, - easContractAddress: "0xC2679fBD37d54388Ce493F1DB75320D236e1815e", - operator: signer, - }); - stubStorage = sinon.stub(evaluator.storage, "storeData").resolves(mockCid); + const signer = walletClient.account; + const evaluator = new HypercertEvaluator({ + chain: { id: 5 }, + easContractAddress: "0xC2679fBD37d54388Ce493F1DB75320D236e1815e", + publicClient, }); beforeEach(() => { @@ -32,42 +19,13 @@ describe("HypercertEvaluator", () => { }); afterAll(() => { - // reloadEnv(); - - stubStorage.restore(); - stubSubscription.restore(); + sinon.restore(); }); describe("submitEvaluation", () => { - it("should submit an EAS evaluation", async () => { - const evaluation: HypercertEvaluationSchema = getEvaluationData({ creator: await signer.getAddress() }); - - const result: CIDString = await evaluator.submitEvaluation(evaluation); - - console.log(result); - - expect(result).toEqual("bafybeibxm2nsadl3fnxv2sxcxmxaco2jl53wpeorjdzidjwf5aqdg7wa6u"); - sinon.assert.calledOnce(stubStorage); - }); - - it("should throw an error for missing signer", async () => { - try { - new HypercertEvaluator({ - chainId: 5, - easContractAddress: "0xC2679fBD37d54388Ce493F1DB75320D236e1815e", - }); - } catch (e) { - expect(e).toBeInstanceOf(InvalidOrMissingError); - const error = e as InvalidOrMissingError; - expect(error.message).toEqual("Invalid or missing config value: operator"); - } - - expect.assertions(2); - }); - it("should throw an error for unexpected evaluation source", async () => { const evaluation = { - creator: await signer.getAddress(), + creator: signer?.address, evaluationSource: { type: "invalid", }, @@ -105,25 +63,20 @@ describe("HypercertEvaluator", () => { }); it("should throw an error for readonly storage", async () => { - sinon.stub(process, "env").value({ NFT_STORAGE_TOKEN: null }); - sinon.stub(process, "env").value({ WEB3_STORAGE_TOKEN: null }); - sinon.stub(process, "env").value({ NEXT_PUBLIC_NFT_STORAGE_TOKEN: null }); - sinon.stub(process, "env").value({ NEXT_PUBLIC_WEB3_STORAGE_TOKEN: null }); - - const evaluation: HypercertEvaluationSchema = getEvaluationData({ creator: await signer.getAddress() }); + const evaluation: HypercertEvaluationSchema = getEvaluationData({ creator: signer?.address }); const readonlyEvaluator = new HypercertEvaluator({ - chainId: 5, + chain: { id: 5 }, easContractAddress: "0xC2679fBD37d54388Ce493F1DB75320D236e1815e", - operator: signer, + publicClient, }); try { await readonlyEvaluator.submitEvaluation(evaluation); } catch (e) { - expect(e).toBeInstanceOf(StorageError); - const error = e as StorageError; - expect(error.message).toEqual("Web3.storage client is not configured"); + const error = e as Error; + expect(error).toBeInstanceOf(Error); + expect(error.message).toMatch(/Unexpected evaluation source/); } expect.assertions(2); diff --git a/sdk/test/helpers.ts b/sdk/test/helpers.ts index ccc5b712..a35aedb1 100644 --- a/sdk/test/helpers.ts +++ b/sdk/test/helpers.ts @@ -1,15 +1,74 @@ import { faker } from "@faker-js/faker"; import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; -import { BigNumber, BigNumberish, ContractReceipt, ContractTransaction } from "ethers"; -import { HypercertMetadata } from "../src/index.js"; -import { - AllowlistEntry, - DuplicateEvaluation, - HypercertEvaluationSchema, - SimpleTextEvaluation, -} from "../src/types/index.js"; -import { formatHypercertData } from "../src/utils/formatter.js"; +import { HypercertMetadata } from "../src"; +import { AllowlistEntry, DuplicateEvaluation, HypercertEvaluationSchema, SimpleTextEvaluation } from "../src/types"; +import { formatHypercertData } from "../src/utils/formatter"; +import { Chain, foundry } from "viem/chains"; +import { PublicClient, WalletClient, createPublicClient, createTestClient, createWalletClient, http } from "viem"; +import * as HypercertMinter from "./resources/HypercertMinter.json"; +import mockMetadata from "./res/mockMetadata"; +import mockData from "./res/mockData"; + +const mockCorrectMetadataCid = "testCIDMETAfkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u"; +const mockCorrectDataCid = "testCIDDATAfkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u"; +const mockSomeDataCid = "someCIDDATAfkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u"; + +export const mockDataSets = { + hypercertMetadata: { + cid: mockCorrectMetadataCid, + data: mockMetadata, + }, + hypercertData: { + cid: mockCorrectDataCid, + data: mockMetadata.hypercert, + }, + someData: { + cid: mockSomeDataCid, + data: mockData, + }, +}; + +export const pool = Number(process.env.VITEST_POOL_ID ?? 1); +export const anvil = { + ...foundry, // We are using a mainnet fork for testing. + id: foundry.id, + rpcUrls: { + // These rpc urls are automatically used in the transports. + default: { + // Note how we append the worker id to the local rpc urls. + http: [`http://127.0.0.1:8545/${pool}`], + webSocket: [`ws://127.0.0.1:8545/${pool}`], + }, + public: { + // Note how we append the worker id to the local rpc urls. + http: [`http://127.0.0.1:8545/${pool}`], + webSocket: [`ws://127.0.0.1:8545/${pool}`], + }, + }, +} as const satisfies Chain; + +export const testClient = createTestClient({ + chain: anvil, + mode: "anvil", + transport: http(), +}); + +export const publicClient: PublicClient = createPublicClient({ + chain: anvil, + batch: { + multicall: true, + }, + transport: http(), +}); + +export const walletClient: WalletClient = createWalletClient({ + chain: anvil, + transport: http(), + account: faker.finance.ethereumAddress() as `0x${string}`, +}); + +export const HypercertMinterByteCode = HypercertMinter.bytecode as `0x${string}`; export type TestDataType = Parameters[0]; @@ -19,12 +78,12 @@ export type TestDataType = Parameters[0]; */ const getAllowlist = ({ size = 10, - units = 1, + units = 1n, address, }: { size?: number; address?: `0x${string}`; - units?: BigNumberish; + units?: bigint; } = {}) => { //generate allowlist array based on possible overrides const allowlist: AllowlistEntry[] = []; @@ -43,7 +102,7 @@ const getAllowlist = ({ const merkleTree = StandardMerkleTree.of(mappedAllowlist, ["address", "uint256"]); - const totalUnits = allowlist.reduce((acc, entry) => acc.add(entry.units), BigNumber.from(0)); + const totalUnits = allowlist.reduce((acc, entry) => acc + BigInt(entry.units), 0n); return { allowlist, merkleTree, totalUnits }; }; @@ -78,42 +137,6 @@ const getFormattedMetadata = (overrides?: Partial): HypercertMetad return formattedData as HypercertMetadata; }; -const mockContractResponse = (): Promise => { - // mock transaction receipt - const receipt: ContractReceipt = { - to: "0x0", - from: "0x0", - contractAddress: "0x0", - transactionIndex: 0, - gasUsed: BigNumber.from(0), - logsBloom: "0x0", - blockHash: "0x0", - transactionHash: "0x0", - logs: [], - blockNumber: 0, - confirmations: 0, - cumulativeGasUsed: BigNumber.from(0), - effectiveGasPrice: BigNumber.from(0), - byzantium: true, - type: 0, - status: 1, - }; - - const transaction: ContractTransaction = { - gasLimit: BigNumber.from(0), - data: "0x0", - value: BigNumber.from(0), - chainId: 1337, - hash: "0x0", - confirmations: 1, - from: "0x0", - nonce: 0, - wait: () => Promise.resolve(receipt), - }; - - return Promise.resolve(transaction); -}; - const getEvaluationData = (overrides?: Partial): HypercertEvaluationSchema => { const mockData: HypercertEvaluationSchema = { creator: "0x17ec8597ff92C3F44523bDc65BF0f1bE632917ff", @@ -139,10 +162,8 @@ const getEvaluationData = (overrides?: Partial): Hype explanation: "These hypercerts are duplicates", }, evaluationSource: { - type: "EAS", - chainId: "0x1", - contract: "0xC2679fBD37d54388Ce493F1DB75320D236e1815e", - uid: "0x1234567890abcdef", + type: "IPFS", + cid: "0xC2679fBD37d54388Ce493F1DB75320D236e1815e", }, }; @@ -193,7 +214,6 @@ export { getAllowlist, getFormattedMetadata, getRawInputData, - mockContractResponse, getEvaluationData, getDuplicateEvaluationData, getSimpleTextEvaluationData, diff --git a/sdk/test/indexer.test.ts b/sdk/test/indexer.test.ts index fb80767a..71c12b13 100644 --- a/sdk/test/indexer.test.ts +++ b/sdk/test/indexer.test.ts @@ -1,6 +1,6 @@ import { expect } from "chai"; -import HypercertsIndexer from "../src/indexer.js"; +import HypercertsIndexer from "../src/indexer"; describe("HypercertsIndexer", () => { it("should be able to create a new instance without valid graphName", () => { diff --git a/sdk/test/resources/HypercertMinter.json b/sdk/test/resources/HypercertMinter.json new file mode 100644 index 00000000..39fdd403 --- /dev/null +++ b/sdk/test/resources/HypercertMinter.json @@ -0,0 +1,1139 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "HypercertMinter", + "sourceName": "src/protocol/HypercertMinter.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AlreadyClaimed", + "type": "error" + }, + { + "inputs": [], + "name": "ArraySize", + "type": "error" + }, + { + "inputs": [], + "name": "DoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "DuplicateEntry", + "type": "error" + }, + { + "inputs": [], + "name": "Invalid", + "type": "error" + }, + { + "inputs": [], + "name": "NotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "NotApprovedOrOwner", + "type": "error" + }, + { + "inputs": [], + "name": "TransfersNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "TypeMismatch", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "AllowlistCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256[]", + "name": "claimIDs", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "fromTokenIDs", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "toTokenIDs", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + } + ], + "name": "BatchValueTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "claimID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "uri", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalUnits", + "type": "uint256" + } + ], + "name": "ClaimStored", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "leaf", + "type": "bytes32" + } + ], + "name": "LeafClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + } + ], + "name": "TransferBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "TransferSingle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "value", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "URI", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "claimID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fromTokenID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "toTokenID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "ValueTransfer", + "type": "event" + }, + { + "inputs": [], + "name": "__SemiFungible1155_init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "accounts", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "balanceOfBatch", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "_tokenIDs", + "type": "uint256[]" + } + ], + "name": "batchBurnFraction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32[][]", + "name": "proofs", + "type": "bytes32[][]" + }, + { + "internalType": "uint256[]", + "name": "claimIDs", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "units", + "type": "uint256[]" + } + ], + "name": "batchMintClaimsFromAllowlists", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "name": "burnBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenID", + "type": "uint256" + } + ], + "name": "burnFraction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "merkleRoot", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "_uri", + "type": "string" + }, + { + "internalType": "enum IHypercertToken.TransferRestrictions", + "name": "restrictions", + "type": "uint8" + } + ], + "name": "createAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "hasBeenClaimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "claimID", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "leaf", + "type": "bytes32" + } + ], + "name": "isAllowedToClaim", + "outputs": [ + { + "internalType": "bool", + "name": "isAllowed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "_fractionIDs", + "type": "uint256[]" + } + ], + "name": "mergeFractions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_uri", + "type": "string" + }, + { + "internalType": "enum IHypercertToken.TransferRestrictions", + "name": "restrictions", + "type": "uint8" + } + ], + "name": "mintClaim", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "claimID", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + } + ], + "name": "mintClaimFromAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "fractions", + "type": "uint256[]" + }, + { + "internalType": "string", + "name": "_uri", + "type": "string" + }, + { + "internalType": "enum IHypercertToken.TransferRestrictions", + "name": "restrictions", + "type": "uint8" + } + ], + "name": "mintClaimWithFractions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "readTransferRestriction", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeBatchTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenID", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "_newFractions", + "type": "uint256[]" + } + ], + "name": "splitFraction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "unitsOf", + "outputs": [ + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "unitsOf", + "outputs": [ + { + "internalType": "uint256", + "name": "units", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "uri", + "outputs": [ + { + "internalType": "string", + "name": "_uri", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e7565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e5576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051615dcb6200011f60003960008181610b1601528181610bac01528181610f6701528181610ffd01526110f80152615dcb6000f3fe6080604052600436106102695760003560e01c8063715018a611610153578063b316962f116100cb578063f242432a1161007f578063f5298aca11610064578063f5298aca14610732578063f6b1229314610752578063fda4823c1461077257600080fd5b8063f242432a146106f2578063f2fde38b1461071257600080fd5b8063e985e9c5116100b0578063e985e9c514610669578063eb568a14146106b2578063f1169062146106d257600080fd5b8063b316962f14610629578063c7b26c541461064957600080fd5b80638fc202dd1161012257806399f771a71161010757806399f771a7146105ad578063a21ed980146105cd578063a22cb4651461060957600080fd5b80638fc202dd14610578578063993de1841461058d57600080fd5b8063715018a61461051b5780638129fc1c146105305780638456cb59146105455780638da5cb5b1461055a57600080fd5b80633f4ba83a116101e657806352d1902d116101b55780636352211e1161019a5780636352211e1461048c5780636b20c454146104db5780636ebd893f146104fb57600080fd5b806352d1902d1461045e5780635c975abb1461047357600080fd5b80633f4ba83a146103e95780633f71e944146103fe5780634e1273f41461041e5780634f1ef2861461044b57600080fd5b80631a2e98241161023d5780632eb2c2d6116102225780632eb2c2d6146103895780633659cfe6146103a95780633e11eefe146103c957600080fd5b80631a2e9824146103475780631e75a8b51461036757600080fd5b8062fdd58e1461026e57806301ffc9a7146102a157806306fdde03146102d15780630e89341c14610327575b600080fd5b34801561027a57600080fd5b5061028e610289366004614d0a565b610792565b6040519081526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc366004614d62565b610840565b6040519015158152602001610298565b3480156102dd57600080fd5b5061031a6040518060400160405280600f81526020017f4879706572636572744d696e746572000000000000000000000000000000000081525081565b6040516102989190614dcf565b34801561033357600080fd5b5061031a610342366004614de2565b610923565b34801561035357600080fd5b5061028e610362366004614d0a565b61092e565b34801561037357600080fd5b50610387610382366004614f26565b610941565b005b34801561039557600080fd5b506103876103a436600461504e565b610a6a565b3480156103b557600080fd5b506103876103c43660046150f8565b610b0c565b3480156103d557600080fd5b506102c16103e4366004615113565b610ca9565b3480156103f557600080fd5b50610387610cd0565b34801561040a57600080fd5b5061031a610419366004614de2565b610ce2565b34801561042a57600080fd5b5061043e610439366004615164565b610e1f565b604051610298919061526a565b61038761045936600461527d565b610f5d565b34801561046a57600080fd5b5061028e6110eb565b34801561047f57600080fd5b506101cd5460ff166102c1565b34801561049857600080fd5b506104c36104a7366004614de2565b600090815261019260205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610298565b3480156104e757600080fd5b506103876104f63660046152c1565b6111b1565b34801561050757600080fd5b50610387610516366004615335565b6111c8565b34801561052757600080fd5b506103876111e2565b34801561053c57600080fd5b506103876111f4565b34801561055157600080fd5b50610387611355565b34801561056657600080fd5b5060fb546001600160a01b03166104c3565b34801561058457600080fd5b50610387611365565b34801561059957600080fd5b506103876105a836600461538f565b611408565b3480156105b957600080fd5b5061028e6105c8366004614de2565b61142f565b3480156105d957600080fd5b506102c16105e83660046153f4565b6101b060209081526000928352604080842090915290825290205460ff1681565b34801561061557600080fd5b50610387610624366004615416565b611444565b34801561063557600080fd5b50610387610644366004615452565b61144f565b34801561065557600080fd5b506103876106643660046154c4565b6114e4565b34801561067557600080fd5b506102c1610684366004615517565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205460ff1690565b3480156106be57600080fd5b506103876106cd36600461554a565b611529565b3480156106de57600080fd5b506103876106ed36600461558e565b61153b565b3480156106fe57600080fd5b5061038761070d366004615639565b6115ce565b34801561071e57600080fd5b5061038761072d3660046150f8565b611669565b34801561073e57600080fd5b5061038761074d36600461569e565b6116f6565b34801561075e57600080fd5b5061038761076d366004614d0a565b611708565b34801561077e57600080fd5b5061038761078d3660046156d1565b61171a565b60006001600160a01b0383166108155760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060008181526065602090815260408083206001600160a01b03861684529091529020545b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014806108d357507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061083a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461083a565b606061083a826117cc565b600061093a83836117ea565b9392505050565b610949611822565b336001600160a01b0387161461097257604051631eb49d6d60e11b815260040160405180910390fd5b846109af85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061187692505050565b146109e6576040517f6dac6a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109f4878686866118f5565b60008181526101ff602052604090208054919250839160ff19166001836002811115610a2257610a22615739565b0217905550807f19789dde2d660b739733377add05f87576a360d2d4adea587c2592264f7f6d4e8488604051610a59929190615768565b60405180910390a250505050505050565b6001600160a01b038516331480610a865750610a868533610684565b610af85760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f766564000000000000000000000000000000000000606482015260840161080c565b610b05858585858561196f565b5050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610baa5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161080c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c057f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610c815760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161080c565b610c8a81611c24565b60408051600080825260208201909252610ca691839190611c2c565b50565b60008281526101af6020526040812054610cc7908690869085611dcc565b95945050505050565b610cd8611de4565b610ce0611e3e565b565b6fffffffffffffffffffffffffffffffff19811660009081526101ff602052604081205460609160ff90911690816002811115610d2157610d21615739565b03610d6157505060408051808201909152600881527f416c6c6f77416c6c0000000000000000000000000000000000000000000000006020820152919050565b6001816002811115610d7557610d75615739565b03610db557505060408051808201909152600b81527f446973616c6c6f77416c6c0000000000000000000000000000000000000000006020820152919050565b6002816002811115610dc957610dc9615739565b03610e0957505060408051808201909152600f81527f46726f6d43726561746f724f6e6c7900000000000000000000000000000000006020820152919050565b5050604080516020810190915260008152919050565b60608151835114610e985760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161080c565b6000835167ffffffffffffffff811115610eb457610eb4614e47565b604051908082528060200260200182016040528015610edd578160200160208202803683370190505b50905060005b8451811015610f5557610f28858281518110610f0157610f0161578a565b6020026020010151858381518110610f1b57610f1b61578a565b6020026020010151610792565b828281518110610f3a57610f3a61578a565b6020908102919091010152610f4e816157e8565b9050610ee3565b509392505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610ffb5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161080c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110567f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146110d25760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161080c565b6110db82611c24565b6110e782826001611c2c565b5050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461118b5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161080c565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b90565b6111b9611822565b6111c38383611e91565b505050565b6111d0611822565b6111dc8484848461211f565b50505050565b6111ea611de4565b610ce06000612667565b600054610100900460ff16158080156112145750600054600160ff909116105b8061122e5750303b15801561122e575060005460ff166001145b6112a05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161080c565b6000805460ff1916600117905580156112e057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6112e8611365565b6112f06126d1565b8015610ca657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b61135d611de4565b610ce0612744565b600054610100900460ff166113d05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b6113e860405180602001604052806000815250612782565b6113f06127f6565b6113f8612861565b6114006128d4565b610ce06127f6565b611410611822565b61141c84848484612947565b611427858383612ad0565b505050505050565b6000818152610194602052604081205461083a565b6110e7338383612ba8565b611457611822565b6000611464868685612c9c565b9050611471818587612d6d565b60008181526101ff60205260409020805483919060ff1916600183600281111561149d5761149d615739565b0217905550807f19789dde2d660b739733377add05f87576a360d2d4adea587c2592264f7f6d4e84876040516114d4929190615768565b60405180910390a2505050505050565b6114ec611822565b6111c383838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612e5392505050565b611531611822565b6110e78282611e91565b611543611822565b8260005b818110156115b5576115ad8888838181106115645761156461578a565b90506020028101906115769190615802565b8888858181106115885761158861578a565b905060200201358787868181106115a1576115a161578a565b90506020020135612947565b600101611547565b506115c38886868686613167565b505050505050505050565b6001600160a01b0385163314806115ea57506115ea8533610684565b61165c5760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f766564000000000000000000000000000000000000606482015260840161080c565b610b0585858585856133a2565b611671611de4565b6001600160a01b0381166116ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161080c565b610ca681612667565b6116fe611822565b6111c3838361358d565b611710611822565b6110e7828261358d565b611722611822565b336001600160a01b0385161461174b57604051631eb49d6d60e11b815260040160405180910390fd5b600061175885858561365c565b60008181526101ff602052604090208054919250839160ff1916600183600281111561178657611786615739565b0217905550807f19789dde2d660b739733377add05f87576a360d2d4adea587c2592264f7f6d4e84866040516117bd929190615768565b60405180910390a25050505050565b606061083a6fffffffffffffffffffffffffffffffff198316613741565b600081815261019260205260408120546001600160a01b0384811691160361083a575060009081526101946020526040902054919050565b6101cd5460ff1615610ce05760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161080c565b8051600090815b818110156118ee578381815181106118975761189761578a565b60200260200101516000036118bf57604051631eb49d6d60e11b815260040160405180910390fd5b8381815181106118d1576118d161578a565b6020026020010151836118e4919061586a565b925060010161187d565b5050919050565b600061193d8561193786868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061187692505050565b8461365c565b60008181526101956020526040902054909150611967908690611960908461586a565b868661211f565b949350505050565b81518351146119e65760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161080c565b6001600160a01b038416611a625760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161080c565b33611a71818787878787613820565b60005b8451811015611bb0576000858281518110611a9157611a9161578a565b602002602001015190506000858381518110611aaf57611aaf61578a565b60209081029190910181015160008481526065835260408082206001600160a01b038e168352909352919091205490915081811015611b565760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161080c565b60008381526065602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611b9590849061586a565b9250508190555050505080611ba9906157e8565b9050611a74565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611c0092919061587d565b60405180910390a4611c16818787878787613968565b6114278187878787876139d2565b610ca6611de4565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611c5f576111c383613bdf565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611cb9575060408051601f3d908101601f19168201909252611cb6918101906158a2565b60015b611d2b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f742055555053000000000000000000000000000000000000606482015260840161080c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611dc05760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c65555549440000000000000000000000000000000000000000000000606482015260840161080c565b506111c3838383613cb5565b600082611dda868685613cda565b1495945050505050565b60fb546001600160a01b03163314610ce05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080c565b611e46613d26565b6101cd805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382163314801590611eb15750611eaf8233610684565b155b15611ee8576040517fe433766c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160008167ffffffffffffffff811115611f0557611f05614e47565b604051908082528060200260200182016040528015611f2e578160200160208202803683370190505b50905060008267ffffffffffffffff811115611f4c57611f4c614e47565b604051908082528060200260200182016040528015611f75578160200160208202803683370190505b50905060008367ffffffffffffffff811115611f9357611f93614e47565b604051908082528060200260200182016040528015611fbc578160200160208202803683370190505b50905060008467ffffffffffffffff811115611fda57611fda614e47565b604051908082528060200260200182016040528015612003578160200160208202803683370190505b50905060005b858110156120cd5760008782815181106120255761202561578a565b602090810291909101810151600081815261019490925260408220805492905591506fffffffffffffffffffffffffffffffff19821687848151811061206d5761206d61578a565b6020026020010181815250508085848151811061208c5761208c61578a565b60200260200101818152505060018484815181106120ac576120ac61578a565b602002602001018181525050505080806120c5906157e8565b915050612009565b506120d9878783613d79565b7f088515a3c7b4e71520602d818f4dec002fadefde30c55e13f390c8d96046990a8487858560405161210e94939291906158bb565b60405180910390a150505050505050565b60fd81118061212e5750600281105b15612165576040517f3ada02e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a182828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061187692505050565b60008481526101946020526040902054146121cf57604051631eb49d6d60e11b815260040160405180910390fd5b600083815261019460205260408120546fffffffffffffffffffffffffffffffff198516916121ff600185615913565b905060008167ffffffffffffffff81111561221c5761221c614e47565b604051908082528060200260200182016040528015612245578160200160208202803683370190505b50905060008267ffffffffffffffff81111561226357612263614e47565b60405190808252806020026020018201604052801561228c578160200160208202803683370190505b50905060008367ffffffffffffffff8111156122aa576122aa614e47565b6040519080825280602002602001820160405280156122d3578160200160208202803683370190505b50905060008467ffffffffffffffff8111156122f1576122f1614e47565b60405190808252806020026020018201604052801561231a578160200160208202803683370190505b50905060008567ffffffffffffffff81111561233857612338614e47565b604051908082528060200260200182016040528015612361578160200160208202803683370190505b50905060008a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508451949550938593508b9250821090506123b1576123b161578a565b60200260200101519050816000815181106123ce576123ce61578a565b60200260200101518289815181106123e8576123e861578a565b60200260200101818152505080826000815181106124085761240861578a565b60200260200101818152505060005b888110156125235760008b8152610195602052604090205461243890614023565b8a88828151811061244b5761244b61578a565b6020026020010181815250508d87828151811061246a5761246a61578a565b60200260200101818152505061019560008c815260200190815260200160002060008154612497906157e8565b91829055506124a6908c61586a565b8682815181106124b8576124b861578a565b60200260200101818152505060018582815181106124d8576124d861578a565b6020026020010181815250508281815181106124f6576124f661578a565b60200260200101518482815181106125105761251061578a565b6020908102919091010152600101612417565b5050506125656125303390565b60008d8152610192602090815260408083205481519283019091529181526001600160a01b039091169087908790869061402d565b60005b868110156125ed578181815181106125825761258261578a565b6020026020010151886125959190615913565b97508181815181106125a9576125a961578a565b602002602001015161019460008684815181106125c8576125c861578a565b6020026020010151815260200190815260200160002081905550806001019050612568565b5060008b8152610194602090815260408083208a90558051918201905290815261261c908d908590859061415d565b7f088515a3c7b4e71520602d818f4dec002fadefde30c55e13f390c8d96046990a8585858460405161265194939291906158bb565b60405180910390a1505050505050505050505050565b60fb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1661273c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ce0614373565b61274c611822565b6101cd805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e743390565b600054610100900460ff166127ed5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ca6816143eb565b600054610100900460ff16610ce05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b600054610100900460ff166128cc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ce061445f565b600054610100900460ff1661293f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ce06144e6565b60008281526101af60209081526040805133818401528082018590528151808203830181526060820183528051908401206080808301919091528251808303909101815260a090910182528051908301208584526101b083528184208185529092529091205460ff16156129e7576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526101af6020526040902054612a05908690869084611dcc565b1580612a36575060008381526101b160209081526040808320546101b290925290912054612a3490849061586a565b115b15612a6d576040517f6dac6a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526101b060209081526040808320848452825291829020805460ff1916600117905581518581529081018390527f51483c8cc684284e9ba3215822230838b766f1698bcc7e922a31e02c3c203bd7910160405180910390a15050505050565b6000612adb8361455a565b612af857604051631eb49d6d60e11b815260040160405180910390fd5b60008381526101956020526040902054612b1190614023565b5060008281526101956020908152604080832080546001808201909255860181018085526101948452828520869055825193840190925292825291612b599186918491614590565b6040805184815260006020820152908101829052606081018390527f5e65fcde72b913ac2870f9df6ea5b6bca757862f44636cb368ed5e339fc524fb9060800160405180910390a19392505050565b816001600160a01b0316836001600160a01b031603612c2f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161080c565b6001600160a01b03838116600081815260666020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000612caa610191546146d7565b608061019160008154612cbc906157e8565b9182905550901b60008181526101936020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a1617905561019490915290208490559050612d1d81836146e5565b604080518281526000602082018190529182916001600160a01b038816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a49392505050565b811580612d78575080155b15612daf576040517f6dac6a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526101af602052604090205415612df6576040517f357d0cc400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526101af602090815260408083208590556101b182529182902083905581518581529081018490527f233c854c30aaaad173f2dd900c76d53c64e556d1d009d71466ec1afcb7b5844d91015b60405180910390a1505050565b60fd81511180612e64575060028151105b15612e9b576040517f3ada02e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018251612eab9190615913565b90506000828281518110612ec157612ec161578a565b602002602001015190506000808367ffffffffffffffff811115612ee757612ee7614e47565b604051908082528060200260200182016040528015612f10578160200160208202803683370190505b50905060008467ffffffffffffffff811115612f2e57612f2e614e47565b604051908082528060200260200182016040528015612f57578160200160208202803683370190505b50905060008567ffffffffffffffff811115612f7557612f75614e47565b604051908082528060200260200182016040528015612f9e578160200160208202803683370190505b50905060008667ffffffffffffffff811115612fbc57612fbc614e47565b604051908082528060200260200182016040528015612fe5578160200160208202803683370190505b50905060005b878110156130aa5760008982815181106130075761300761578a565b60200260200101519050808683815181106130245761302461578a565b602002602001018181525050878583815181106130435761304361578a565b60200260200101818152505060018383815181106130635761306361578a565b6020026020010181815250506101946000828152602001908152602001600020548483815181106130965761309661578a565b602090810291909101015250600101612feb565b506130c8338a8686866040518060200160405280600081525061402d565b60005b87811015613136578281815181106130e5576130e561578a565b6020026020010151866130f8919061586a565b955061019460008683815181106131115761311161578a565b60200260200101518152602001908152602001600020600090558060010190506130cb565b50600086815261019460205260408120805487929061315690849061586a565b909155506115c39050898583613d79565b6060838067ffffffffffffffff81111561318357613183614e47565b6040519080825280602002602001820160405280156131ac578160200160208202803683370190505b50915060008167ffffffffffffffff8111156131ca576131ca614e47565b6040519080825280602002602001820160405280156131f3578160200160208202803683370190505b50905060008267ffffffffffffffff81111561321157613211614e47565b60405190808252806020026020018201604052801561323a578160200160208202803683370190505b50905060005b8381101561333957600089898381811061325c5761325c61578a565b90506020020135905061326e8161455a565b61328b57604051631eb49d6d60e11b815260040160405180910390fd5b600081815261019560205260409020546132a490614023565b600081815261019560205260409020805460018082019092558201018888848181106132d2576132d261578a565b90506020020135610194600083815260200190815260200160002081905550808784815181106133045761330461578a565b60200260200101818152505060018584815181106133245761332461578a565b60209081029190910101525050600101613240565b506133558985846040518060200160405280600081525061415d565b7f088515a3c7b4e71520602d818f4dec002fadefde30c55e13f390c8d96046990a888883878a8a60405161338e96959493929190615971565b60405180910390a150505095945050505050565b6001600160a01b03841661341e5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161080c565b33600061342a85614742565b9050600061343785614742565b9050613447838989858589613820565b60008681526065602090815260408083206001600160a01b038c168452909152902054858110156134e05760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161080c565b60008781526065602090815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061351f90849061586a565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461357f848a8a86868a613968565b6115c3848a8a8a8a8a61478d565b6001600160a01b03821633148015906135ad57506135ab8233610684565b155b156135e4576040517fe433766c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152610194602052604081208054919055613604838360016148e8565b7f5e65fcde72b913ac2870f9df6ea5b6bca757862f44636cb368ed5e339fc524fb6fffffffffffffffffffffffffffffffff198316604080519182526020820185905260009082015260608101839052608001612e46565b60008260000361367f57604051631eb49d6d60e11b815260040160405180910390fd5b61368a848484612c9c565b6000818152610195602052604081208054929350909182906136ab906157e8565b91829055506136ba908361586a565b9050836101946000838152602001908152602001600020819055506136f18582600160405180602001604052806000815250614590565b6040805183815260006020820152908101829052606081018590527f5e65fcde72b913ac2870f9df6ea5b6bca757862f44636cb368ed5e339fc524fb9060800160405180910390a1509392505050565b600081815260ca602052604081208054606092919061375f906159cd565b80601f016020809104026020016040519081016040528092919081815260200182805461378b906159cd565b80156137d85780601f106137ad576101008083540402835291602001916137d8565b820191906000526020600020905b8154815290600101906020018083116137bb57829003601f168201915b5050505050905060008151116137f6576137f183614ab9565b61093a565b60c98160405160200161380a929190615a20565b6040516020818303038152906040529392505050565b6001600160a01b03851615611427576001600160a01b0384161561142757825160005b8181101561395e5760006138808683815181106138625761386261578a565b60200260200101516fffffffffffffffffffffffffffffffff191690565b60008181526101ff602052604090205490915060ff1660018160028111156138aa576138aa615739565b036138e1576040517fab064ad300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028160028111156138f5576138f5615739565b14801561391d5750600082815261019360205260409020546001600160a01b038a8116911614155b15613954576040517fab064ad300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600101613843565b5050505050505050565b825160005b8181101561395e5785610192600087848151811061398d5761398d61578a565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600101905061396d565b6001600160a01b0384163b15611427576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c8190613a2f9089908990889088908890600401615aa7565b6020604051808303816000875af1925050508015613a6a575060408051601f3d908101601f19168201909252613a6791810190615b05565b60015b613b1f57613a76615b22565b806308c379a003613aaf5750613a8a615b3d565b80613a955750613ab1565b8060405162461bcd60e51b815260040161080c9190614dcf565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161080c565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014613bd65760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161080c565b50505050505050565b6001600160a01b0381163b613c5c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161080c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b613cbe83614b4d565b600082511180613ccb5750805b156111c3576111dc8383614b8d565b600081815b84811015613d1d57613d0982878784818110613cfd57613cfd61578a565b90506020020135614c8f565b915080613d15816157e8565b915050613cdf565b50949350505050565b6101cd5460ff16610ce05760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161080c565b6001600160a01b038316613df55760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161080c565b8051825114613e6c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161080c565b6000339050613e8f81856000868660405180602001604052806000815250613820565b60005b8351811015613fac576000848281518110613eaf57613eaf61578a565b602002602001015190506000848381518110613ecd57613ecd61578a565b60209081029190910181015160008481526065835260408082206001600160a01b038c168352909352919091205490915081811015613f735760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e636500000000000000000000000000000000000000000000000000000000606482015260840161080c565b60009283526065602090815260408085206001600160a01b038b1686529091529092209103905580613fa4816157e8565b915050613e92565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051613ffd92919061587d565b60405180910390a46111dc81856000868660405180602001604052806000815250613968565b806111c381615be5565b835160005b8181101561395e57600086828151811061404e5761404e61578a565b60200260200101519050600086838151811061406c5761406c61578a565b6020026020010151905061407f8261455a565b1561409d57604051631eb49d6d60e11b815260040160405180910390fd5b6fffffffffffffffffffffffffffffffff1981166fffffffffffffffffffffffffffffffff198316146140fc576040517fb4902a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038916331480159061411c575061411a8933610684565b155b15614153576040517fe433766c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600101614032565b6001600160a01b0384166141d95760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161080c565b81518351146142505760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161080c565b3361426081600087878787613820565b60005b84518110156142fc5783818151811061427e5761427e61578a565b60200260200101516065600087848151811061429c5761429c61578a565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546142e4919061586a565b909155508190506142f4816157e8565b915050614263565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161434d92919061587d565b60405180910390a461436481600087878787613968565b610b05816000878787876139d2565b600054610100900460ff166143de5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b6101cd805460ff19169055565b600054610100900460ff166144565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ca681614cbe565b600054610100900460ff166144ca5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b60408051602081019091526000815260c990610ca69082615c5a565b600054610100900460ff166145515760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ce033612667565b60006fffffffffffffffffffffffffffffffff1982168214801561083a5750506fffffffffffffffffffffffffffffffff161590565b6001600160a01b03841661460c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161080c565b33600061461885614742565b9050600061462585614742565b905061463683600089858589613820565b60008681526065602090815260408083206001600160a01b038b1684529091528120805487929061466890849061586a565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46146c883600089858589613968565b613bd68360008989898961478d565b608081901c6111c381615be5565b600082815260ca602052604090206146fd8282615c5a565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b61472984610923565b6040516147369190614dcf565b60405180910390a25050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061477c5761477c61578a565b602090810291909101015292915050565b6001600160a01b0384163b15611427576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e61906147ea9089908990889088908890600401615d1a565b6020604051808303816000875af1925050508015614825575060408051601f3d908101601f1916820190925261482291810190615b05565b60015b61483157613a76615b22565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014613bd65760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161080c565b6001600160a01b0383166149645760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161080c565b33600061497084614742565b9050600061497d84614742565b905061499d83876000858560405180602001604052806000815250613820565b60008581526065602090815260408083206001600160a01b038a16845290915290205484811015614a355760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e636500000000000000000000000000000000000000000000000000000000606482015260840161080c565b60008681526065602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613bd684886000868660405180602001604052806000815250613968565b606060678054614ac8906159cd565b80601f0160208091040260200160405190810160405280929190818152602001828054614af4906159cd565b8015614b415780601f10614b1657610100808354040283529160200191614b41565b820191906000526020600020905b815481529060010190602001808311614b2457829003601f168201915b50505050509050919050565b614b5681613bdf565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b614c0c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e74726163740000000000000000000000000000000000000000000000000000606482015260840161080c565b600080846001600160a01b031684604051614c279190615d52565b600060405180830381855af49150503d8060008114614c62576040519150601f19603f3d011682016040523d82523d6000602084013e614c67565b606091505b5091509150610cc78282604051806060016040528060278152602001615d6f60279139614cca565b6000818310614cab57600082815260208490526040902061093a565b600083815260208390526040902061093a565b60676110e78282615c5a565b60608315614cd957508161093a565b61093a8383815115613a955781518083602001fd5b80356001600160a01b0381168114614d0557600080fd5b919050565b60008060408385031215614d1d57600080fd5b614d2683614cee565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610ca657600080fd5b600060208284031215614d7457600080fd5b813561093a81614d34565b60005b83811015614d9a578181015183820152602001614d82565b50506000910152565b60008151808452614dbb816020860160208601614d7f565b601f01601f19169290920160200192915050565b60208152600061093a6020830184614da3565b600060208284031215614df457600080fd5b5035919050565b60008083601f840112614e0d57600080fd5b50813567ffffffffffffffff811115614e2557600080fd5b6020830191508360208260051b8501011115614e4057600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715614e9c57614e9c614e47565b6040525050565b600082601f830112614eb457600080fd5b813567ffffffffffffffff811115614ece57614ece614e47565b604051614ee56020601f19601f8501160182614e76565b818152846020838601011115614efa57600080fd5b816020850160208301376000918101602001919091529392505050565b803560038110614d0557600080fd5b60008060008060008060a08789031215614f3f57600080fd5b614f4887614cee565b955060208701359450604087013567ffffffffffffffff80821115614f6c57600080fd5b614f788a838b01614dfb565b90965094506060890135915080821115614f9157600080fd5b50614f9e89828a01614ea3565b925050614fad60808801614f17565b90509295509295509295565b600067ffffffffffffffff821115614fd357614fd3614e47565b5060051b60200190565b600082601f830112614fee57600080fd5b81356020614ffb82614fb9565b6040516150088282614e76565b83815260059390931b850182019282810191508684111561502857600080fd5b8286015b84811015615043578035835291830191830161502c565b509695505050505050565b600080600080600060a0868803121561506657600080fd5b61506f86614cee565b945061507d60208701614cee565b9350604086013567ffffffffffffffff8082111561509a57600080fd5b6150a689838a01614fdd565b945060608801359150808211156150bc57600080fd5b6150c889838a01614fdd565b935060808801359150808211156150de57600080fd5b506150eb88828901614ea3565b9150509295509295909350565b60006020828403121561510a57600080fd5b61093a82614cee565b6000806000806060858703121561512957600080fd5b843567ffffffffffffffff81111561514057600080fd5b61514c87828801614dfb565b90989097506020870135966040013595509350505050565b6000806040838503121561517757600080fd5b823567ffffffffffffffff8082111561518f57600080fd5b818501915085601f8301126151a357600080fd5b813560206151b082614fb9565b6040516151bd8282614e76565b83815260059390931b85018201928281019150898411156151dd57600080fd5b948201945b83861015615202576151f386614cee565b825294820194908201906151e2565b9650508601359250508082111561521857600080fd5b5061522585828601614fdd565b9150509250929050565b600081518084526020808501945080840160005b8381101561525f57815187529582019590820190600101615243565b509495945050505050565b60208152600061093a602083018461522f565b6000806040838503121561529057600080fd5b61529983614cee565b9150602083013567ffffffffffffffff8111156152b557600080fd5b61522585828601614ea3565b6000806000606084860312156152d657600080fd5b6152df84614cee565b9250602084013567ffffffffffffffff808211156152fc57600080fd5b61530887838801614fdd565b9350604086013591508082111561531e57600080fd5b5061532b86828701614fdd565b9150509250925092565b6000806000806060858703121561534b57600080fd5b61535485614cee565b935060208501359250604085013567ffffffffffffffff81111561537757600080fd5b61538387828801614dfb565b95989497509550505050565b6000806000806000608086880312156153a757600080fd5b6153b086614cee565b9450602086013567ffffffffffffffff8111156153cc57600080fd5b6153d888828901614dfb565b9699909850959660408101359660609091013595509350505050565b6000806040838503121561540757600080fd5b50508035926020909101359150565b6000806040838503121561542957600080fd5b61543283614cee565b91506020830135801515811461544757600080fd5b809150509250929050565b600080600080600060a0868803121561546a57600080fd5b61547386614cee565b94506020860135935060408601359250606086013567ffffffffffffffff81111561549d57600080fd5b6154a988828901614ea3565b9250506154b860808701614f17565b90509295509295909350565b6000806000604084860312156154d957600080fd5b6154e284614cee565b9250602084013567ffffffffffffffff8111156154fe57600080fd5b61550a86828701614dfb565b9497909650939450505050565b6000806040838503121561552a57600080fd5b61553383614cee565b915061554160208401614cee565b90509250929050565b6000806040838503121561555d57600080fd5b61556683614cee565b9150602083013567ffffffffffffffff81111561558257600080fd5b61522585828601614fdd565b60008060008060008060006080888a0312156155a957600080fd5b6155b288614cee565b9650602088013567ffffffffffffffff808211156155cf57600080fd5b6155db8b838c01614dfb565b909850965060408a01359150808211156155f457600080fd5b6156008b838c01614dfb565b909650945060608a013591508082111561561957600080fd5b506156268a828b01614dfb565b989b979a50959850939692959293505050565b600080600080600060a0868803121561565157600080fd5b61565a86614cee565b945061566860208701614cee565b93506040860135925060608601359150608086013567ffffffffffffffff81111561569257600080fd5b6150eb88828901614ea3565b6000806000606084860312156156b357600080fd5b6156bc84614cee565b95602085013595506040909401359392505050565b600080600080608085870312156156e757600080fd5b6156f085614cee565b935060208501359250604085013567ffffffffffffffff81111561571357600080fd5b61571f87828801614ea3565b92505061572e60608601614f17565b905092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408152600061577b6040830185614da3565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060001982036157fb576157fb6157b9565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261583757600080fd5b83018035915067ffffffffffffffff82111561585257600080fd5b6020019150600581901b3603821315614e4057600080fd5b8082018082111561083a5761083a6157b9565b604081526000615890604083018561522f565b8281036020840152610cc7818561522f565b6000602082840312156158b457600080fd5b5051919050565b6080815260006158ce608083018761522f565b82810360208401526158e0818761522f565b905082810360408401526158f4818661522f565b90508281036060840152615908818561522f565b979650505050505050565b8181038181111561083a5761083a6157b9565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561595857600080fd5b8260051b80836020870137939093016020019392505050565b60808152600061598560808301888a615926565b8281036020840152615997818861522f565b905082810360408401526159ab818761522f565b905082810360608401526159c0818587615926565b9998505050505050505050565b600181811c908216806159e157607f821691505b602082108103615a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000808454615a2e816159cd565b60018281168015615a465760018114615a5b57615a8a565b60ff1984168752821515830287019450615a8a565b8860005260208060002060005b85811015615a815781548a820152908401908201615a68565b50505082870194505b505050508351615a9e818360208801614d7f565b01949350505050565b60006001600160a01b03808816835280871660208401525060a06040830152615ad360a083018661522f565b8281036060840152615ae5818661522f565b90508281036080840152615af98185614da3565b98975050505050505050565b600060208284031215615b1757600080fd5b815161093a81614d34565b600060033d11156111ae5760046000803e5060005160e01c90565b600060443d1015615b4b5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715615b9957505050505090565b8285019150815181811115615bb15750505050505090565b843d8701016020828501011115615bcb5750505050505090565b615bda60208286010187614e76565b509095945050505050565b60006fffffffffffffffffffffffffffffffff808316818103615c0a57615c0a6157b9565b6001019392505050565b601f8211156111c357600081815260208120601f850160051c81016020861015615c3b5750805b601f850160051c820191505b8181101561142757828155600101615c47565b815167ffffffffffffffff811115615c7457615c74614e47565b615c8881615c8284546159cd565b84615c14565b602080601f831160018114615cbd5760008415615ca55750858301515b600019600386901b1c1916600185901b178555611427565b600085815260208120601f198616915b82811015615cec57888601518255948401946001909101908401615ccd565b5085821015615d0a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261590860a0830184614da3565b60008251615d64818460208701614d7f565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204c37f0793ff8af27d30569e38fca163a67b4a79dd8f7dad4b36c16831acb84e764736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106102695760003560e01c8063715018a611610153578063b316962f116100cb578063f242432a1161007f578063f5298aca11610064578063f5298aca14610732578063f6b1229314610752578063fda4823c1461077257600080fd5b8063f242432a146106f2578063f2fde38b1461071257600080fd5b8063e985e9c5116100b0578063e985e9c514610669578063eb568a14146106b2578063f1169062146106d257600080fd5b8063b316962f14610629578063c7b26c541461064957600080fd5b80638fc202dd1161012257806399f771a71161010757806399f771a7146105ad578063a21ed980146105cd578063a22cb4651461060957600080fd5b80638fc202dd14610578578063993de1841461058d57600080fd5b8063715018a61461051b5780638129fc1c146105305780638456cb59146105455780638da5cb5b1461055a57600080fd5b80633f4ba83a116101e657806352d1902d116101b55780636352211e1161019a5780636352211e1461048c5780636b20c454146104db5780636ebd893f146104fb57600080fd5b806352d1902d1461045e5780635c975abb1461047357600080fd5b80633f4ba83a146103e95780633f71e944146103fe5780634e1273f41461041e5780634f1ef2861461044b57600080fd5b80631a2e98241161023d5780632eb2c2d6116102225780632eb2c2d6146103895780633659cfe6146103a95780633e11eefe146103c957600080fd5b80631a2e9824146103475780631e75a8b51461036757600080fd5b8062fdd58e1461026e57806301ffc9a7146102a157806306fdde03146102d15780630e89341c14610327575b600080fd5b34801561027a57600080fd5b5061028e610289366004614d0a565b610792565b6040519081526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc366004614d62565b610840565b6040519015158152602001610298565b3480156102dd57600080fd5b5061031a6040518060400160405280600f81526020017f4879706572636572744d696e746572000000000000000000000000000000000081525081565b6040516102989190614dcf565b34801561033357600080fd5b5061031a610342366004614de2565b610923565b34801561035357600080fd5b5061028e610362366004614d0a565b61092e565b34801561037357600080fd5b50610387610382366004614f26565b610941565b005b34801561039557600080fd5b506103876103a436600461504e565b610a6a565b3480156103b557600080fd5b506103876103c43660046150f8565b610b0c565b3480156103d557600080fd5b506102c16103e4366004615113565b610ca9565b3480156103f557600080fd5b50610387610cd0565b34801561040a57600080fd5b5061031a610419366004614de2565b610ce2565b34801561042a57600080fd5b5061043e610439366004615164565b610e1f565b604051610298919061526a565b61038761045936600461527d565b610f5d565b34801561046a57600080fd5b5061028e6110eb565b34801561047f57600080fd5b506101cd5460ff166102c1565b34801561049857600080fd5b506104c36104a7366004614de2565b600090815261019260205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610298565b3480156104e757600080fd5b506103876104f63660046152c1565b6111b1565b34801561050757600080fd5b50610387610516366004615335565b6111c8565b34801561052757600080fd5b506103876111e2565b34801561053c57600080fd5b506103876111f4565b34801561055157600080fd5b50610387611355565b34801561056657600080fd5b5060fb546001600160a01b03166104c3565b34801561058457600080fd5b50610387611365565b34801561059957600080fd5b506103876105a836600461538f565b611408565b3480156105b957600080fd5b5061028e6105c8366004614de2565b61142f565b3480156105d957600080fd5b506102c16105e83660046153f4565b6101b060209081526000928352604080842090915290825290205460ff1681565b34801561061557600080fd5b50610387610624366004615416565b611444565b34801561063557600080fd5b50610387610644366004615452565b61144f565b34801561065557600080fd5b506103876106643660046154c4565b6114e4565b34801561067557600080fd5b506102c1610684366004615517565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205460ff1690565b3480156106be57600080fd5b506103876106cd36600461554a565b611529565b3480156106de57600080fd5b506103876106ed36600461558e565b61153b565b3480156106fe57600080fd5b5061038761070d366004615639565b6115ce565b34801561071e57600080fd5b5061038761072d3660046150f8565b611669565b34801561073e57600080fd5b5061038761074d36600461569e565b6116f6565b34801561075e57600080fd5b5061038761076d366004614d0a565b611708565b34801561077e57600080fd5b5061038761078d3660046156d1565b61171a565b60006001600160a01b0383166108155760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060008181526065602090815260408083206001600160a01b03861684529091529020545b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014806108d357507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061083a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461083a565b606061083a826117cc565b600061093a83836117ea565b9392505050565b610949611822565b336001600160a01b0387161461097257604051631eb49d6d60e11b815260040160405180910390fd5b846109af85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061187692505050565b146109e6576040517f6dac6a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109f4878686866118f5565b60008181526101ff602052604090208054919250839160ff19166001836002811115610a2257610a22615739565b0217905550807f19789dde2d660b739733377add05f87576a360d2d4adea587c2592264f7f6d4e8488604051610a59929190615768565b60405180910390a250505050505050565b6001600160a01b038516331480610a865750610a868533610684565b610af85760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f766564000000000000000000000000000000000000606482015260840161080c565b610b05858585858561196f565b5050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610baa5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161080c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c057f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610c815760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161080c565b610c8a81611c24565b60408051600080825260208201909252610ca691839190611c2c565b50565b60008281526101af6020526040812054610cc7908690869085611dcc565b95945050505050565b610cd8611de4565b610ce0611e3e565b565b6fffffffffffffffffffffffffffffffff19811660009081526101ff602052604081205460609160ff90911690816002811115610d2157610d21615739565b03610d6157505060408051808201909152600881527f416c6c6f77416c6c0000000000000000000000000000000000000000000000006020820152919050565b6001816002811115610d7557610d75615739565b03610db557505060408051808201909152600b81527f446973616c6c6f77416c6c0000000000000000000000000000000000000000006020820152919050565b6002816002811115610dc957610dc9615739565b03610e0957505060408051808201909152600f81527f46726f6d43726561746f724f6e6c7900000000000000000000000000000000006020820152919050565b5050604080516020810190915260008152919050565b60608151835114610e985760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161080c565b6000835167ffffffffffffffff811115610eb457610eb4614e47565b604051908082528060200260200182016040528015610edd578160200160208202803683370190505b50905060005b8451811015610f5557610f28858281518110610f0157610f0161578a565b6020026020010151858381518110610f1b57610f1b61578a565b6020026020010151610792565b828281518110610f3a57610f3a61578a565b6020908102919091010152610f4e816157e8565b9050610ee3565b509392505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610ffb5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161080c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110567f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146110d25760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161080c565b6110db82611c24565b6110e782826001611c2c565b5050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461118b5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161080c565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b90565b6111b9611822565b6111c38383611e91565b505050565b6111d0611822565b6111dc8484848461211f565b50505050565b6111ea611de4565b610ce06000612667565b600054610100900460ff16158080156112145750600054600160ff909116105b8061122e5750303b15801561122e575060005460ff166001145b6112a05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161080c565b6000805460ff1916600117905580156112e057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6112e8611365565b6112f06126d1565b8015610ca657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b61135d611de4565b610ce0612744565b600054610100900460ff166113d05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b6113e860405180602001604052806000815250612782565b6113f06127f6565b6113f8612861565b6114006128d4565b610ce06127f6565b611410611822565b61141c84848484612947565b611427858383612ad0565b505050505050565b6000818152610194602052604081205461083a565b6110e7338383612ba8565b611457611822565b6000611464868685612c9c565b9050611471818587612d6d565b60008181526101ff60205260409020805483919060ff1916600183600281111561149d5761149d615739565b0217905550807f19789dde2d660b739733377add05f87576a360d2d4adea587c2592264f7f6d4e84876040516114d4929190615768565b60405180910390a2505050505050565b6114ec611822565b6111c383838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612e5392505050565b611531611822565b6110e78282611e91565b611543611822565b8260005b818110156115b5576115ad8888838181106115645761156461578a565b90506020028101906115769190615802565b8888858181106115885761158861578a565b905060200201358787868181106115a1576115a161578a565b90506020020135612947565b600101611547565b506115c38886868686613167565b505050505050505050565b6001600160a01b0385163314806115ea57506115ea8533610684565b61165c5760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f766564000000000000000000000000000000000000606482015260840161080c565b610b0585858585856133a2565b611671611de4565b6001600160a01b0381166116ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161080c565b610ca681612667565b6116fe611822565b6111c3838361358d565b611710611822565b6110e7828261358d565b611722611822565b336001600160a01b0385161461174b57604051631eb49d6d60e11b815260040160405180910390fd5b600061175885858561365c565b60008181526101ff602052604090208054919250839160ff1916600183600281111561178657611786615739565b0217905550807f19789dde2d660b739733377add05f87576a360d2d4adea587c2592264f7f6d4e84866040516117bd929190615768565b60405180910390a25050505050565b606061083a6fffffffffffffffffffffffffffffffff198316613741565b600081815261019260205260408120546001600160a01b0384811691160361083a575060009081526101946020526040902054919050565b6101cd5460ff1615610ce05760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161080c565b8051600090815b818110156118ee578381815181106118975761189761578a565b60200260200101516000036118bf57604051631eb49d6d60e11b815260040160405180910390fd5b8381815181106118d1576118d161578a565b6020026020010151836118e4919061586a565b925060010161187d565b5050919050565b600061193d8561193786868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061187692505050565b8461365c565b60008181526101956020526040902054909150611967908690611960908461586a565b868661211f565b949350505050565b81518351146119e65760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161080c565b6001600160a01b038416611a625760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161080c565b33611a71818787878787613820565b60005b8451811015611bb0576000858281518110611a9157611a9161578a565b602002602001015190506000858381518110611aaf57611aaf61578a565b60209081029190910181015160008481526065835260408082206001600160a01b038e168352909352919091205490915081811015611b565760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161080c565b60008381526065602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611b9590849061586a565b9250508190555050505080611ba9906157e8565b9050611a74565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611c0092919061587d565b60405180910390a4611c16818787878787613968565b6114278187878787876139d2565b610ca6611de4565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611c5f576111c383613bdf565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611cb9575060408051601f3d908101601f19168201909252611cb6918101906158a2565b60015b611d2b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f742055555053000000000000000000000000000000000000606482015260840161080c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611dc05760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c65555549440000000000000000000000000000000000000000000000606482015260840161080c565b506111c3838383613cb5565b600082611dda868685613cda565b1495945050505050565b60fb546001600160a01b03163314610ce05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080c565b611e46613d26565b6101cd805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382163314801590611eb15750611eaf8233610684565b155b15611ee8576040517fe433766c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160008167ffffffffffffffff811115611f0557611f05614e47565b604051908082528060200260200182016040528015611f2e578160200160208202803683370190505b50905060008267ffffffffffffffff811115611f4c57611f4c614e47565b604051908082528060200260200182016040528015611f75578160200160208202803683370190505b50905060008367ffffffffffffffff811115611f9357611f93614e47565b604051908082528060200260200182016040528015611fbc578160200160208202803683370190505b50905060008467ffffffffffffffff811115611fda57611fda614e47565b604051908082528060200260200182016040528015612003578160200160208202803683370190505b50905060005b858110156120cd5760008782815181106120255761202561578a565b602090810291909101810151600081815261019490925260408220805492905591506fffffffffffffffffffffffffffffffff19821687848151811061206d5761206d61578a565b6020026020010181815250508085848151811061208c5761208c61578a565b60200260200101818152505060018484815181106120ac576120ac61578a565b602002602001018181525050505080806120c5906157e8565b915050612009565b506120d9878783613d79565b7f088515a3c7b4e71520602d818f4dec002fadefde30c55e13f390c8d96046990a8487858560405161210e94939291906158bb565b60405180910390a150505050505050565b60fd81118061212e5750600281105b15612165576040517f3ada02e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a182828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061187692505050565b60008481526101946020526040902054146121cf57604051631eb49d6d60e11b815260040160405180910390fd5b600083815261019460205260408120546fffffffffffffffffffffffffffffffff198516916121ff600185615913565b905060008167ffffffffffffffff81111561221c5761221c614e47565b604051908082528060200260200182016040528015612245578160200160208202803683370190505b50905060008267ffffffffffffffff81111561226357612263614e47565b60405190808252806020026020018201604052801561228c578160200160208202803683370190505b50905060008367ffffffffffffffff8111156122aa576122aa614e47565b6040519080825280602002602001820160405280156122d3578160200160208202803683370190505b50905060008467ffffffffffffffff8111156122f1576122f1614e47565b60405190808252806020026020018201604052801561231a578160200160208202803683370190505b50905060008567ffffffffffffffff81111561233857612338614e47565b604051908082528060200260200182016040528015612361578160200160208202803683370190505b50905060008a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508451949550938593508b9250821090506123b1576123b161578a565b60200260200101519050816000815181106123ce576123ce61578a565b60200260200101518289815181106123e8576123e861578a565b60200260200101818152505080826000815181106124085761240861578a565b60200260200101818152505060005b888110156125235760008b8152610195602052604090205461243890614023565b8a88828151811061244b5761244b61578a565b6020026020010181815250508d87828151811061246a5761246a61578a565b60200260200101818152505061019560008c815260200190815260200160002060008154612497906157e8565b91829055506124a6908c61586a565b8682815181106124b8576124b861578a565b60200260200101818152505060018582815181106124d8576124d861578a565b6020026020010181815250508281815181106124f6576124f661578a565b60200260200101518482815181106125105761251061578a565b6020908102919091010152600101612417565b5050506125656125303390565b60008d8152610192602090815260408083205481519283019091529181526001600160a01b039091169087908790869061402d565b60005b868110156125ed578181815181106125825761258261578a565b6020026020010151886125959190615913565b97508181815181106125a9576125a961578a565b602002602001015161019460008684815181106125c8576125c861578a565b6020026020010151815260200190815260200160002081905550806001019050612568565b5060008b8152610194602090815260408083208a90558051918201905290815261261c908d908590859061415d565b7f088515a3c7b4e71520602d818f4dec002fadefde30c55e13f390c8d96046990a8585858460405161265194939291906158bb565b60405180910390a1505050505050505050505050565b60fb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1661273c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ce0614373565b61274c611822565b6101cd805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e743390565b600054610100900460ff166127ed5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ca6816143eb565b600054610100900460ff16610ce05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b600054610100900460ff166128cc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ce061445f565b600054610100900460ff1661293f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ce06144e6565b60008281526101af60209081526040805133818401528082018590528151808203830181526060820183528051908401206080808301919091528251808303909101815260a090910182528051908301208584526101b083528184208185529092529091205460ff16156129e7576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526101af6020526040902054612a05908690869084611dcc565b1580612a36575060008381526101b160209081526040808320546101b290925290912054612a3490849061586a565b115b15612a6d576040517f6dac6a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526101b060209081526040808320848452825291829020805460ff1916600117905581518581529081018390527f51483c8cc684284e9ba3215822230838b766f1698bcc7e922a31e02c3c203bd7910160405180910390a15050505050565b6000612adb8361455a565b612af857604051631eb49d6d60e11b815260040160405180910390fd5b60008381526101956020526040902054612b1190614023565b5060008281526101956020908152604080832080546001808201909255860181018085526101948452828520869055825193840190925292825291612b599186918491614590565b6040805184815260006020820152908101829052606081018390527f5e65fcde72b913ac2870f9df6ea5b6bca757862f44636cb368ed5e339fc524fb9060800160405180910390a19392505050565b816001600160a01b0316836001600160a01b031603612c2f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161080c565b6001600160a01b03838116600081815260666020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000612caa610191546146d7565b608061019160008154612cbc906157e8565b9182905550901b60008181526101936020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a1617905561019490915290208490559050612d1d81836146e5565b604080518281526000602082018190529182916001600160a01b038816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a49392505050565b811580612d78575080155b15612daf576040517f6dac6a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526101af602052604090205415612df6576040517f357d0cc400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526101af602090815260408083208590556101b182529182902083905581518581529081018490527f233c854c30aaaad173f2dd900c76d53c64e556d1d009d71466ec1afcb7b5844d91015b60405180910390a1505050565b60fd81511180612e64575060028151105b15612e9b576040517f3ada02e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018251612eab9190615913565b90506000828281518110612ec157612ec161578a565b602002602001015190506000808367ffffffffffffffff811115612ee757612ee7614e47565b604051908082528060200260200182016040528015612f10578160200160208202803683370190505b50905060008467ffffffffffffffff811115612f2e57612f2e614e47565b604051908082528060200260200182016040528015612f57578160200160208202803683370190505b50905060008567ffffffffffffffff811115612f7557612f75614e47565b604051908082528060200260200182016040528015612f9e578160200160208202803683370190505b50905060008667ffffffffffffffff811115612fbc57612fbc614e47565b604051908082528060200260200182016040528015612fe5578160200160208202803683370190505b50905060005b878110156130aa5760008982815181106130075761300761578a565b60200260200101519050808683815181106130245761302461578a565b602002602001018181525050878583815181106130435761304361578a565b60200260200101818152505060018383815181106130635761306361578a565b6020026020010181815250506101946000828152602001908152602001600020548483815181106130965761309661578a565b602090810291909101015250600101612feb565b506130c8338a8686866040518060200160405280600081525061402d565b60005b87811015613136578281815181106130e5576130e561578a565b6020026020010151866130f8919061586a565b955061019460008683815181106131115761311161578a565b60200260200101518152602001908152602001600020600090558060010190506130cb565b50600086815261019460205260408120805487929061315690849061586a565b909155506115c39050898583613d79565b6060838067ffffffffffffffff81111561318357613183614e47565b6040519080825280602002602001820160405280156131ac578160200160208202803683370190505b50915060008167ffffffffffffffff8111156131ca576131ca614e47565b6040519080825280602002602001820160405280156131f3578160200160208202803683370190505b50905060008267ffffffffffffffff81111561321157613211614e47565b60405190808252806020026020018201604052801561323a578160200160208202803683370190505b50905060005b8381101561333957600089898381811061325c5761325c61578a565b90506020020135905061326e8161455a565b61328b57604051631eb49d6d60e11b815260040160405180910390fd5b600081815261019560205260409020546132a490614023565b600081815261019560205260409020805460018082019092558201018888848181106132d2576132d261578a565b90506020020135610194600083815260200190815260200160002081905550808784815181106133045761330461578a565b60200260200101818152505060018584815181106133245761332461578a565b60209081029190910101525050600101613240565b506133558985846040518060200160405280600081525061415d565b7f088515a3c7b4e71520602d818f4dec002fadefde30c55e13f390c8d96046990a888883878a8a60405161338e96959493929190615971565b60405180910390a150505095945050505050565b6001600160a01b03841661341e5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161080c565b33600061342a85614742565b9050600061343785614742565b9050613447838989858589613820565b60008681526065602090815260408083206001600160a01b038c168452909152902054858110156134e05760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161080c565b60008781526065602090815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061351f90849061586a565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461357f848a8a86868a613968565b6115c3848a8a8a8a8a61478d565b6001600160a01b03821633148015906135ad57506135ab8233610684565b155b156135e4576040517fe433766c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152610194602052604081208054919055613604838360016148e8565b7f5e65fcde72b913ac2870f9df6ea5b6bca757862f44636cb368ed5e339fc524fb6fffffffffffffffffffffffffffffffff198316604080519182526020820185905260009082015260608101839052608001612e46565b60008260000361367f57604051631eb49d6d60e11b815260040160405180910390fd5b61368a848484612c9c565b6000818152610195602052604081208054929350909182906136ab906157e8565b91829055506136ba908361586a565b9050836101946000838152602001908152602001600020819055506136f18582600160405180602001604052806000815250614590565b6040805183815260006020820152908101829052606081018590527f5e65fcde72b913ac2870f9df6ea5b6bca757862f44636cb368ed5e339fc524fb9060800160405180910390a1509392505050565b600081815260ca602052604081208054606092919061375f906159cd565b80601f016020809104026020016040519081016040528092919081815260200182805461378b906159cd565b80156137d85780601f106137ad576101008083540402835291602001916137d8565b820191906000526020600020905b8154815290600101906020018083116137bb57829003601f168201915b5050505050905060008151116137f6576137f183614ab9565b61093a565b60c98160405160200161380a929190615a20565b6040516020818303038152906040529392505050565b6001600160a01b03851615611427576001600160a01b0384161561142757825160005b8181101561395e5760006138808683815181106138625761386261578a565b60200260200101516fffffffffffffffffffffffffffffffff191690565b60008181526101ff602052604090205490915060ff1660018160028111156138aa576138aa615739565b036138e1576040517fab064ad300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028160028111156138f5576138f5615739565b14801561391d5750600082815261019360205260409020546001600160a01b038a8116911614155b15613954576040517fab064ad300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600101613843565b5050505050505050565b825160005b8181101561395e5785610192600087848151811061398d5761398d61578a565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600101905061396d565b6001600160a01b0384163b15611427576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c8190613a2f9089908990889088908890600401615aa7565b6020604051808303816000875af1925050508015613a6a575060408051601f3d908101601f19168201909252613a6791810190615b05565b60015b613b1f57613a76615b22565b806308c379a003613aaf5750613a8a615b3d565b80613a955750613ab1565b8060405162461bcd60e51b815260040161080c9190614dcf565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161080c565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014613bd65760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161080c565b50505050505050565b6001600160a01b0381163b613c5c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161080c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b613cbe83614b4d565b600082511180613ccb5750805b156111c3576111dc8383614b8d565b600081815b84811015613d1d57613d0982878784818110613cfd57613cfd61578a565b90506020020135614c8f565b915080613d15816157e8565b915050613cdf565b50949350505050565b6101cd5460ff16610ce05760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161080c565b6001600160a01b038316613df55760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161080c565b8051825114613e6c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161080c565b6000339050613e8f81856000868660405180602001604052806000815250613820565b60005b8351811015613fac576000848281518110613eaf57613eaf61578a565b602002602001015190506000848381518110613ecd57613ecd61578a565b60209081029190910181015160008481526065835260408082206001600160a01b038c168352909352919091205490915081811015613f735760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e636500000000000000000000000000000000000000000000000000000000606482015260840161080c565b60009283526065602090815260408085206001600160a01b038b1686529091529092209103905580613fa4816157e8565b915050613e92565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051613ffd92919061587d565b60405180910390a46111dc81856000868660405180602001604052806000815250613968565b806111c381615be5565b835160005b8181101561395e57600086828151811061404e5761404e61578a565b60200260200101519050600086838151811061406c5761406c61578a565b6020026020010151905061407f8261455a565b1561409d57604051631eb49d6d60e11b815260040160405180910390fd5b6fffffffffffffffffffffffffffffffff1981166fffffffffffffffffffffffffffffffff198316146140fc576040517fb4902a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038916331480159061411c575061411a8933610684565b155b15614153576040517fe433766c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600101614032565b6001600160a01b0384166141d95760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161080c565b81518351146142505760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161080c565b3361426081600087878787613820565b60005b84518110156142fc5783818151811061427e5761427e61578a565b60200260200101516065600087848151811061429c5761429c61578a565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546142e4919061586a565b909155508190506142f4816157e8565b915050614263565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161434d92919061587d565b60405180910390a461436481600087878787613968565b610b05816000878787876139d2565b600054610100900460ff166143de5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b6101cd805460ff19169055565b600054610100900460ff166144565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ca681614cbe565b600054610100900460ff166144ca5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b60408051602081019091526000815260c990610ca69082615c5a565b600054610100900460ff166145515760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161080c565b610ce033612667565b60006fffffffffffffffffffffffffffffffff1982168214801561083a5750506fffffffffffffffffffffffffffffffff161590565b6001600160a01b03841661460c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161080c565b33600061461885614742565b9050600061462585614742565b905061463683600089858589613820565b60008681526065602090815260408083206001600160a01b038b1684529091528120805487929061466890849061586a565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46146c883600089858589613968565b613bd68360008989898961478d565b608081901c6111c381615be5565b600082815260ca602052604090206146fd8282615c5a565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b61472984610923565b6040516147369190614dcf565b60405180910390a25050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061477c5761477c61578a565b602090810291909101015292915050565b6001600160a01b0384163b15611427576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e61906147ea9089908990889088908890600401615d1a565b6020604051808303816000875af1925050508015614825575060408051601f3d908101601f1916820190925261482291810190615b05565b60015b61483157613a76615b22565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014613bd65760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161080c565b6001600160a01b0383166149645760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161080c565b33600061497084614742565b9050600061497d84614742565b905061499d83876000858560405180602001604052806000815250613820565b60008581526065602090815260408083206001600160a01b038a16845290915290205484811015614a355760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e636500000000000000000000000000000000000000000000000000000000606482015260840161080c565b60008681526065602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613bd684886000868660405180602001604052806000815250613968565b606060678054614ac8906159cd565b80601f0160208091040260200160405190810160405280929190818152602001828054614af4906159cd565b8015614b415780601f10614b1657610100808354040283529160200191614b41565b820191906000526020600020905b815481529060010190602001808311614b2457829003601f168201915b50505050509050919050565b614b5681613bdf565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b614c0c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e74726163740000000000000000000000000000000000000000000000000000606482015260840161080c565b600080846001600160a01b031684604051614c279190615d52565b600060405180830381855af49150503d8060008114614c62576040519150601f19603f3d011682016040523d82523d6000602084013e614c67565b606091505b5091509150610cc78282604051806060016040528060278152602001615d6f60279139614cca565b6000818310614cab57600082815260208490526040902061093a565b600083815260208390526040902061093a565b60676110e78282615c5a565b60608315614cd957508161093a565b61093a8383815115613a955781518083602001fd5b80356001600160a01b0381168114614d0557600080fd5b919050565b60008060408385031215614d1d57600080fd5b614d2683614cee565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610ca657600080fd5b600060208284031215614d7457600080fd5b813561093a81614d34565b60005b83811015614d9a578181015183820152602001614d82565b50506000910152565b60008151808452614dbb816020860160208601614d7f565b601f01601f19169290920160200192915050565b60208152600061093a6020830184614da3565b600060208284031215614df457600080fd5b5035919050565b60008083601f840112614e0d57600080fd5b50813567ffffffffffffffff811115614e2557600080fd5b6020830191508360208260051b8501011115614e4057600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715614e9c57614e9c614e47565b6040525050565b600082601f830112614eb457600080fd5b813567ffffffffffffffff811115614ece57614ece614e47565b604051614ee56020601f19601f8501160182614e76565b818152846020838601011115614efa57600080fd5b816020850160208301376000918101602001919091529392505050565b803560038110614d0557600080fd5b60008060008060008060a08789031215614f3f57600080fd5b614f4887614cee565b955060208701359450604087013567ffffffffffffffff80821115614f6c57600080fd5b614f788a838b01614dfb565b90965094506060890135915080821115614f9157600080fd5b50614f9e89828a01614ea3565b925050614fad60808801614f17565b90509295509295509295565b600067ffffffffffffffff821115614fd357614fd3614e47565b5060051b60200190565b600082601f830112614fee57600080fd5b81356020614ffb82614fb9565b6040516150088282614e76565b83815260059390931b850182019282810191508684111561502857600080fd5b8286015b84811015615043578035835291830191830161502c565b509695505050505050565b600080600080600060a0868803121561506657600080fd5b61506f86614cee565b945061507d60208701614cee565b9350604086013567ffffffffffffffff8082111561509a57600080fd5b6150a689838a01614fdd565b945060608801359150808211156150bc57600080fd5b6150c889838a01614fdd565b935060808801359150808211156150de57600080fd5b506150eb88828901614ea3565b9150509295509295909350565b60006020828403121561510a57600080fd5b61093a82614cee565b6000806000806060858703121561512957600080fd5b843567ffffffffffffffff81111561514057600080fd5b61514c87828801614dfb565b90989097506020870135966040013595509350505050565b6000806040838503121561517757600080fd5b823567ffffffffffffffff8082111561518f57600080fd5b818501915085601f8301126151a357600080fd5b813560206151b082614fb9565b6040516151bd8282614e76565b83815260059390931b85018201928281019150898411156151dd57600080fd5b948201945b83861015615202576151f386614cee565b825294820194908201906151e2565b9650508601359250508082111561521857600080fd5b5061522585828601614fdd565b9150509250929050565b600081518084526020808501945080840160005b8381101561525f57815187529582019590820190600101615243565b509495945050505050565b60208152600061093a602083018461522f565b6000806040838503121561529057600080fd5b61529983614cee565b9150602083013567ffffffffffffffff8111156152b557600080fd5b61522585828601614ea3565b6000806000606084860312156152d657600080fd5b6152df84614cee565b9250602084013567ffffffffffffffff808211156152fc57600080fd5b61530887838801614fdd565b9350604086013591508082111561531e57600080fd5b5061532b86828701614fdd565b9150509250925092565b6000806000806060858703121561534b57600080fd5b61535485614cee565b935060208501359250604085013567ffffffffffffffff81111561537757600080fd5b61538387828801614dfb565b95989497509550505050565b6000806000806000608086880312156153a757600080fd5b6153b086614cee565b9450602086013567ffffffffffffffff8111156153cc57600080fd5b6153d888828901614dfb565b9699909850959660408101359660609091013595509350505050565b6000806040838503121561540757600080fd5b50508035926020909101359150565b6000806040838503121561542957600080fd5b61543283614cee565b91506020830135801515811461544757600080fd5b809150509250929050565b600080600080600060a0868803121561546a57600080fd5b61547386614cee565b94506020860135935060408601359250606086013567ffffffffffffffff81111561549d57600080fd5b6154a988828901614ea3565b9250506154b860808701614f17565b90509295509295909350565b6000806000604084860312156154d957600080fd5b6154e284614cee565b9250602084013567ffffffffffffffff8111156154fe57600080fd5b61550a86828701614dfb565b9497909650939450505050565b6000806040838503121561552a57600080fd5b61553383614cee565b915061554160208401614cee565b90509250929050565b6000806040838503121561555d57600080fd5b61556683614cee565b9150602083013567ffffffffffffffff81111561558257600080fd5b61522585828601614fdd565b60008060008060008060006080888a0312156155a957600080fd5b6155b288614cee565b9650602088013567ffffffffffffffff808211156155cf57600080fd5b6155db8b838c01614dfb565b909850965060408a01359150808211156155f457600080fd5b6156008b838c01614dfb565b909650945060608a013591508082111561561957600080fd5b506156268a828b01614dfb565b989b979a50959850939692959293505050565b600080600080600060a0868803121561565157600080fd5b61565a86614cee565b945061566860208701614cee565b93506040860135925060608601359150608086013567ffffffffffffffff81111561569257600080fd5b6150eb88828901614ea3565b6000806000606084860312156156b357600080fd5b6156bc84614cee565b95602085013595506040909401359392505050565b600080600080608085870312156156e757600080fd5b6156f085614cee565b935060208501359250604085013567ffffffffffffffff81111561571357600080fd5b61571f87828801614ea3565b92505061572e60608601614f17565b905092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408152600061577b6040830185614da3565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060001982036157fb576157fb6157b9565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261583757600080fd5b83018035915067ffffffffffffffff82111561585257600080fd5b6020019150600581901b3603821315614e4057600080fd5b8082018082111561083a5761083a6157b9565b604081526000615890604083018561522f565b8281036020840152610cc7818561522f565b6000602082840312156158b457600080fd5b5051919050565b6080815260006158ce608083018761522f565b82810360208401526158e0818761522f565b905082810360408401526158f4818661522f565b90508281036060840152615908818561522f565b979650505050505050565b8181038181111561083a5761083a6157b9565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561595857600080fd5b8260051b80836020870137939093016020019392505050565b60808152600061598560808301888a615926565b8281036020840152615997818861522f565b905082810360408401526159ab818761522f565b905082810360608401526159c0818587615926565b9998505050505050505050565b600181811c908216806159e157607f821691505b602082108103615a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000808454615a2e816159cd565b60018281168015615a465760018114615a5b57615a8a565b60ff1984168752821515830287019450615a8a565b8860005260208060002060005b85811015615a815781548a820152908401908201615a68565b50505082870194505b505050508351615a9e818360208801614d7f565b01949350505050565b60006001600160a01b03808816835280871660208401525060a06040830152615ad360a083018661522f565b8281036060840152615ae5818661522f565b90508281036080840152615af98185614da3565b98975050505050505050565b600060208284031215615b1757600080fd5b815161093a81614d34565b600060033d11156111ae5760046000803e5060005160e01c90565b600060443d1015615b4b5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715615b9957505050505090565b8285019150815181811115615bb15750505050505090565b843d8701016020828501011115615bcb5750505050505090565b615bda60208286010187614e76565b509095945050505050565b60006fffffffffffffffffffffffffffffffff808316818103615c0a57615c0a6157b9565b6001019392505050565b601f8211156111c357600081815260208120601f850160051c81016020861015615c3b5750805b601f850160051c820191505b8181101561142757828155600101615c47565b815167ffffffffffffffff811115615c7457615c74614e47565b615c8881615c8284546159cd565b84615c14565b602080601f831160018114615cbd5760008415615ca55750858301515b600019600386901b1c1916600185901b178555611427565b600085815260208120601f198616915b82811015615cec57888601518255948401946001909101908401615ccd565b5085821015615d0a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261590860a0830184614da3565b60008251615d64818460208701614d7f565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204c37f0793ff8af27d30569e38fca163a67b4a79dd8f7dad4b36c16831acb84e764736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/sdk/test/setup-env.ts b/sdk/test/setup-env.ts index 5b983c4f..893c3429 100644 --- a/sdk/test/setup-env.ts +++ b/sdk/test/setup-env.ts @@ -1,4 +1,8 @@ import dotenv from "dotenv"; +import { startProxy } from "@viem/anvil"; +import fetchMock from "jest-fetch-mock"; + +fetchMock.enableMocks(); dotenv.config({ path: "./.env" }); @@ -6,4 +10,11 @@ const reloadEnv = () => { dotenv.config({ path: "./.env" }); }; +export default async function () { + return await startProxy({ + port: 8545, // By default, the proxy will listen on port 8545. + host: "::", // By default, the proxy will listen on all interfaces. + }); +} + export { reloadEnv }; diff --git a/sdk/test/storage.test.ts b/sdk/test/storage.test.ts index 004815bc..110da473 100644 --- a/sdk/test/storage.test.ts +++ b/sdk/test/storage.test.ts @@ -1,25 +1,12 @@ import { expect } from "chai"; -import { providers } from "ethers"; -import sinon from "sinon"; -import { HypercertMetadata } from "src/index.js"; +import { HypercertMetadata } from "../src"; -import HypercertsStorage from "../src/storage.js"; -import { StorageError } from "../src/types/errors.js"; -import { reloadEnv } from "./setup-env.js"; +import HypercertsStorage from "../src/storage"; +import { StorageError } from "../src/types/errors"; +import { reloadEnv } from "./setup-env"; describe("HypercertsStorage", () => { - let stub: sinon.SinonStub; - beforeAll(() => { - stub = sinon.stub(providers.BaseProvider.prototype, "on"); - - delete process.env.NFT_STORAGE_TOKEN; - delete process.env.WEB3_STORAGE_TOKEN; - delete process.env.NEXT_PUBLIC_NFT_STORAGE_TOKEN; - delete process.env.NEXT_PUBLIC_WEB3_STORAGE_TOKEN; - }); - afterAll(() => { - stub.restore(); reloadEnv(); }); @@ -47,11 +34,6 @@ describe("HypercertsStorage", () => { }); it("should throw an error when executing write method in readonly mode", async () => { - delete process.env.NFT_STORAGE_TOKEN; - delete process.env.WEB3_STORAGE_TOKEN; - delete process.env.NEXT_PUBLIC_NFT_STORAGE_TOKEN; - delete process.env.NEXT_PUBLIC_WEB3_STORAGE_TOKEN; - const client = new HypercertsStorage({}); // storeMetadata diff --git a/sdk/test/storage/nft.storage.test.ts b/sdk/test/storage/nft.storage.test.ts index 5ba4fc1a..d5244a4d 100644 --- a/sdk/test/storage/nft.storage.test.ts +++ b/sdk/test/storage/nft.storage.test.ts @@ -1,47 +1,37 @@ import { jest } from "@jest/globals"; -import { rest } from "msw"; -import { setupServer } from "msw/node"; +//eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import { NFTStorage } from "nft.storage"; import HypercertsStorage from "../../src/storage.js"; import { MalformedDataError } from "../../src/types/errors.js"; import { HypercertMetadata } from "../../src/types/metadata.js"; -import logger from "../../src/utils/logger.js"; -import { getFormattedMetadata } from "../helpers.js"; -import mockData from "../res/mockData.js"; -import mockMetadata from "../res/mockMetadata.js"; +import { getFormattedMetadata, mockDataSets } from "../helpers.js"; describe("NFT.Storage Client", () => { - const mockCorrectMetadataCid = "testCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u"; - const mockIncorrectMetadataCid = "errrCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u"; + const { hypercertData, hypercertMetadata } = mockDataSets; const storeBlobMock = jest.spyOn(NFTStorage.prototype, "storeBlob").mockImplementation((_: unknown, __?: unknown) => { - logger.debug("Hit mock storeBlob"); - - return Promise.resolve(mockCorrectMetadataCid); + return Promise.resolve(hypercertMetadata.cid); }); - const server = setupServer( - rest.get(`https://nftstorage.link/ipfs/${mockCorrectMetadataCid}`, (_, res, ctx) => { - return res(ctx.status(200), ctx.json(mockMetadata)); - }), - rest.get(`https://nftstorage.link/ipfs/${mockIncorrectMetadataCid}`, (_, res, ctx) => { - return res(ctx.status(200), ctx.json(mockData)); - }), - ); - - const storage = new HypercertsStorage({}); + const storage = new HypercertsStorage({ + nftStorageToken: process.env.NFT_STORAGE_TOKEN, + web3StorageToken: process.env.WEB3_STORAGE_TOKEN, + }); - beforeAll(() => server.listen()); + jest.spyOn(storage, "getFromIPFS").mockImplementation((cid: string) => { + if (cid === hypercertMetadata.cid) return Promise.resolve(hypercertMetadata.data); + if (cid === hypercertData.cid) return Promise.resolve(hypercertData.data); - afterEach(() => server.resetHandlers()); + return Promise.resolve("testData"); + }); afterEach(() => { jest.clearAllMocks(); }); afterAll(() => { - server.close(); jest.resetAllMocks(); }); @@ -54,15 +44,15 @@ describe("NFT.Storage Client", () => { }); it("Smoke test - get metadata", async () => { - const res = await storage.getMetadata(mockCorrectMetadataCid); + const res = await storage.getMetadata(hypercertMetadata.cid); - expect(res).toMatchObject(mockMetadata); + expect(res).toMatchObject(hypercertMetadata.data); }); it("Throws when trying to store incorrect metadata", async () => { // storeData try { - await storage.storeMetadata(mockData as HypercertMetadata); + await storage.storeMetadata({ data: "false" } as unknown as HypercertMetadata); } catch (e) { expect(e instanceof MalformedDataError).toBeTruthy(); @@ -74,14 +64,15 @@ describe("NFT.Storage Client", () => { }); it("Throws when trying to fetch incorrect metadata", async () => { + const incorrectCID = "incorrect-cid"; // storeData try { - await storage.getMetadata(mockIncorrectMetadataCid); + await storage.getMetadata(incorrectCID); } catch (e) { expect(e instanceof MalformedDataError).toBeTruthy(); const error = e as MalformedDataError; - expect(error.message).toBe(`Invalid metadata at ${mockIncorrectMetadataCid}`); + expect(error.message).toBe(`Invalid metadata at ${incorrectCID}`); } expect.assertions(2); diff --git a/sdk/test/storage/web3.storage.test.ts b/sdk/test/storage/web3.storage.test.ts index 8acf5020..e5845098 100644 --- a/sdk/test/storage/web3.storage.test.ts +++ b/sdk/test/storage/web3.storage.test.ts @@ -1,44 +1,35 @@ import { jest } from "@jest/globals"; -import { rest } from "msw"; -import { setupServer } from "msw/node"; //eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { Web3Storage } from "web3.storage"; -import HypercertsStorage from "../../src/storage.js"; -import logger from "../../src/utils/logger.js"; -import mockData from "../res/mockData.js"; -import mockMetadata from "../res/mockMetadata.js"; +import HypercertsStorage from "../../src/storage"; +import { mockDataSets } from "../helpers"; describe("Web3.Storage Client", () => { - const mockCorrectMetadataCid = "testCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u"; - const mockIncorrectMetadataCid = "errrCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u"; + const { hypercertData, hypercertMetadata } = mockDataSets; const storeBlobMock = jest.spyOn(Web3Storage.prototype, "put").mockImplementation((_: unknown, __?: unknown) => { - logger.debug("Hit mock storeBlob"); + return Promise.resolve(hypercertMetadata.cid); + }); - return Promise.resolve(mockCorrectMetadataCid); + const storage = new HypercertsStorage({ + nftStorageToken: process.env.NFT_STORAGE_TOKEN, + web3StorageToken: process.env.WEB3_STORAGE_TOKEN, }); - const server = setupServer( - rest.get(`https://nftstorage.link/ipfs/${mockCorrectMetadataCid}`, (_, res, ctx) => { - return res(ctx.status(200), ctx.json(mockMetadata)); - }), - rest.get(`https://nftstorage.link/ipfs/${mockIncorrectMetadataCid}`, (_, res, ctx) => { - return res(ctx.status(200), ctx.json(mockData)); - }), - ); - const storage = new HypercertsStorage({}); + jest.spyOn(storage, "getFromIPFS").mockImplementation((cid: string) => { + if (cid === hypercertMetadata.cid) return Promise.resolve(hypercertMetadata.data); + if (cid === hypercertData.cid) return Promise.resolve(hypercertData.data); - beforeAll(() => server.listen()); + return Promise.resolve("testData"); + }); afterEach(() => { - server.resetHandlers(); jest.clearAllMocks(); }); afterAll(() => { - server.close(); jest.resetAllMocks(); }); @@ -46,13 +37,13 @@ describe("Web3.Storage Client", () => { * Currently just testing against the production NFT.Storage service. */ it("Smoke test - add data", async () => { - await storage.storeData(mockData); + await storage.storeData(hypercertData.data); expect(storeBlobMock).toHaveBeenCalledTimes(1); }); it("Smoke test - get data", async () => { - const res = await storage.getData(mockCorrectMetadataCid); + const res = await storage.getData(hypercertData.cid); - expect(res).toMatchObject(mockMetadata); + expect(res).toMatchObject(hypercertData.data); }); }); diff --git a/sdk/test/types/errors.test.ts b/sdk/test/types/errors.test.ts index 012a88eb..de5e66c5 100644 --- a/sdk/test/types/errors.test.ts +++ b/sdk/test/types/errors.test.ts @@ -8,7 +8,7 @@ import { StorageError, UnknownSchemaError, UnsupportedChainError, -} from "../../src/types/errors.js"; +} from "../../src/types/errors"; describe.only("Error types", () => { it("has ClientError", () => { diff --git a/sdk/test/utils/config.test.ts b/sdk/test/utils/config.test.ts index 1290fa90..f27c44e5 100644 --- a/sdk/test/utils/config.test.ts +++ b/sdk/test/utils/config.test.ts @@ -1,33 +1,14 @@ import chai, { expect } from "chai"; import chaiSubset from "chai-subset"; -import { ethers } from "ethers"; import sinon from "sinon"; -import { DEFAULT_CHAIN_ID } from "../../src/constants.js"; -import { - ConfigurationError, - HypercertClientConfig, - InvalidOrMissingError, - UnsupportedChainError, -} from "../../src/types/index.js"; -import { getConfig } from "../../src/utils/config.js"; -import { reloadEnv } from "../../test/setup-env.js"; +import { ConfigurationError, HypercertClientConfig, InvalidOrMissingError } from "../../src/types"; +import { getConfig } from "../../src/utils/config"; +import { reloadEnv } from "../../test/setup-env"; +import { walletClient, publicClient } from "../helpers"; chai.use(chaiSubset); -describe("Config: chainId and chainName", () => { - it("should throw an error when the chainId is not supported", () => { - try { - getConfig({ chainId: 1337 }); - expect.fail("Should throw UnsupportedChainError"); - } catch (e) { - expect(e instanceof UnsupportedChainError).to.be.true; - const error = e as UnsupportedChainError; - expect(error.message).to.eq("chainId=1337 is not yet supported"); - } - }); -}); - describe("Config: contractAddress", () => { afterEach(() => { sinon.restore(); @@ -36,23 +17,23 @@ describe("Config: contractAddress", () => { }); it("should return the contract address specified by overrides", () => { - const overrides: Partial = { contractAddress: "0x1234567890123456789012345678901234567890" }; + const overrides: Partial = { + chain: { id: 5 }, + contractAddress: "0x1234567890123456789012345678901234567890", + }; const config = getConfig(overrides); expect(config.contractAddress).to.equal(overrides.contractAddress); }); - it("should return the contract address specified by the CONTRACT_ADDRESS environment variable", () => { - const CONTRACT_ADDRESS = "0x1234567890123456789012345678901234567890"; - sinon.stub(process, "env").value({ CONTRACT_ADDRESS }); - - const config = getConfig({}); - expect(config.contractAddress).to.equal(CONTRACT_ADDRESS); - delete process.env.CONTRACT_ADDRESS; - }); - it("should throw an error when the contract address specified by overrides is invalid", () => { - const overrides: Partial = { contractAddress: "invalid-address" }; - expect(() => getConfig(overrides)).to.throw(InvalidOrMissingError, "Invalid contract address"); + const overrides: Partial = { chain: { id: 5 }, contractAddress: "invalid-address" }; + try { + getConfig(overrides); + } catch (e) { + expect(e instanceof InvalidOrMissingError).to.be.true; + const error = e as InvalidOrMissingError; + expect(error.message).to.eq("Invalid contract address."); + } }); }); @@ -62,13 +43,13 @@ describe("Config: graphUrl", () => { }); it("should return the default graphUrl when no overrides are specified", () => { - const result = getConfig({}); + const result = getConfig({ chain: { id: 5 } }); expect(result.graphUrl).to.equal("https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet"); }); it("should return the config specified by overrides", () => { const overrides: Partial = { - chainName: "testnet", + chain: { id: 5 }, graphUrl: "https://api.example.com", contractAddress: "0x1234567890123456789012345678901234567890", unsafeForceOverrideConfig: true, @@ -79,115 +60,105 @@ describe("Config: graphUrl", () => { it("should throw an error when the graph URL specified by overrides is invalid", () => { const overrides: Partial = { - chainName: "testnet", + chain: { id: 5 }, graphUrl: "incorrect-url", contractAddress: "0x1234567890123456789012345678901234567890", unsafeForceOverrideConfig: true, }; - expect(() => getConfig(overrides)).to.throw(ConfigurationError, "Invalid graph URL"); + try { + getConfig(overrides); + } catch (e) { + expect(e instanceof ConfigurationError).to.be.true; + const error = e as ConfigurationError; + expect(error.message).to.eq("Invalid graph URL"); + } }); it("should throw an error when the graph URL specified by overrides is missing", () => { const overrides: Partial = { - chainName: "testnet", + chain: { id: 5 }, contractAddress: "0x1234567890123456789012345678901234567890", unsafeForceOverrideConfig: true, }; - expect(() => getConfig(overrides)).to.throw( - UnsupportedChainError, - "attempted to override with chainId=5, but requires chainName, graphUrl, and contractAddress to be set", - ); + + try { + getConfig(overrides); + } catch (e) { + expect(e instanceof InvalidOrMissingError).to.be.true; + const error = e as InvalidOrMissingError; + expect(error.message).to.eq( + "attempted to override with chainId=5, but requires chainName, graphUrl, and contractAddress to be set", + ); + } }); }); -describe("Config: nftStorageToken", () => { +describe("Config: nftStorageToken & web3storageToken", () => { afterEach(() => { sinon.restore(); reloadEnv(); }); it("should return an empty object when no overrides or environment variables are specified", () => { - sinon.stub(process, "env").value({ NFT_STORAGE_TOKEN: "NFTSTOR" }); - - const result = getConfig({}); - expect(result).to.deep.include({ - nftStorageToken: "NFTSTOR", - }); + const result = getConfig({ chain: { id: 5 } }); + expect(result.nftStorageToken).to.be.undefined; }); it("should return the nftStorageToken specified by overrides", () => { const overrides: Partial = { + chain: { id: 5 }, nftStorageToken: "NFTSTOR", + web3StorageToken: "WEB3STOR", }; const result = getConfig(overrides); expect(result).to.deep.include({ nftStorageToken: overrides.nftStorageToken, + web3StorageToken: overrides.web3StorageToken, }); }); it("should return the nftStorageToken specified by the NFT_STORAGE_TOKEN environment variable", () => { - sinon.stub(process, "env").value({ NFT_STORAGE_TOKEN: "NFTSTOR" }); - const result = getConfig({}); - expect(result).to.deep.include({ - nftStorageToken: "NFTSTOR", - }); - }); - - it("should return the nftStorageToken specified by the NEXT_PUBLIC_NFT_STORAGE_TOKEN environment variable", () => { - sinon.stub(process, "env").value({ NEXT_PUBLIC_NFT_STORAGE_TOKEN: "NFTSTOR" }); - - const result = getConfig({}); - expect(result).to.deep.include({ - nftStorageToken: "NFTSTOR", - }); + const result = getConfig({ chain: { id: 5 }, nftStorageToken: "NFTSTOR" }); + expect(result.nftStorageToken).to.be.eq("NFTSTOR"); }); - it("should not throw an error when the nftStorageToken specified by overrides is invalid", () => { - sinon.stub(process, "env").value({ NFT_STORAGE_TOKEN: null }); - - const overrides: Partial = {}; + const overrides: Partial = { chain: { id: 5 }, nftStorageToken: undefined }; expect(() => getConfig(overrides)).to.not.throw(); }); }); -describe("Config: getOperator", () => { +describe("Config: getPublicClient", () => { afterEach(() => { sinon.restore(); reloadEnv(); }); - it("should return a default provider when no overrides or environment variables are specified", () => { - const result = getConfig({}); - //TODO: hacky solution to compare providers - expect(JSON.stringify(result.operator)).to.equal(JSON.stringify(ethers.getDefaultProvider(DEFAULT_CHAIN_ID))); - }); it("should return the operator specified by overrides", () => { - const provider = ethers.getDefaultProvider(DEFAULT_CHAIN_ID); - const wallet = new ethers.Wallet("0x0123456789012345678901234567890123456789012345678901234567890123", provider); const overrides: Partial = { - operator: wallet, + chain: { id: 5 }, + publicClient, }; const result = getConfig(overrides); - expect(result.operator).to.equal(overrides.operator); + expect(result.publicClient).to.equal(overrides.publicClient); }); +}); - it("should return the operator specified by the PRIVATE_KEY environment variable", () => { - const PRIVATE_KEY = "0x0123456789012345678901234567890123456789012345678901234567890123"; - sinon.stub(process, "env").value({ PRIVATE_KEY }); +describe("Config: getWalletClient", () => { + afterEach(() => { + sinon.restore(); - const result = getConfig({}); - const provider = ethers.getDefaultProvider(DEFAULT_CHAIN_ID); - const wallet = new ethers.Wallet(PRIVATE_KEY, provider); - expect(JSON.stringify(result.operator)).to.equal(JSON.stringify(wallet)); + reloadEnv(); }); - it("should throw an error when the operator specified by overrides is invalid", () => { + it("should return the operator specified by overrides", () => { const overrides: Partial = { - operator: "invalid" as unknown as ethers.Signer, + chain: { id: 5 }, + walletClient, }; - expect(() => getConfig(overrides)).to.throw(InvalidOrMissingError, "Invalid operator."); + const result = getConfig(overrides); + expect(result.walletClient).to.equal(overrides.walletClient); }); }); @@ -199,46 +170,24 @@ describe("Config: web3StorageToken", () => { }); it("should return an empty object when no overrides or environment variables are specified", () => { - const WEB3_STORAGE_TOKEN = "WEB3"; - sinon.stub(process, "env").value({ WEB3_STORAGE_TOKEN }); - const result = getConfig({}); - expect(result).to.deep.include({ - web3StorageToken: WEB3_STORAGE_TOKEN, - }); + const result = getConfig({ chain: { id: 5 } }); + expect(result.web3StorageToken).to.be.undefined; }); it("should return the web3StorageToken specified by overrides", () => { const overrides: Partial = { + chain: { id: 5 }, web3StorageToken: "WEB3STOR", }; + const result = getConfig(overrides); expect(result).to.deep.include({ web3StorageToken: overrides.web3StorageToken, }); }); - it("should return the web3StorageToken specified by the WEB3_STORAGE_TOKEN environment variable", () => { - const WEB3_STORAGE_TOKEN = "WEB3"; - sinon.stub(process, "env").value({ WEB3_STORAGE_TOKEN }); - const result = getConfig({}); - expect(result).to.deep.include({ - web3StorageToken: WEB3_STORAGE_TOKEN, - }); - }); - - it("should return the web3StorageToken specified by the NEXT_PUBLIC_WEB3_STORAGE_TOKEN environment variable", () => { - const NEXT_PUBLIC_WEB3_STORAGE_TOKEN = "WEB3"; - sinon.stub(process, "env").value({ NEXT_PUBLIC_WEB3_STORAGE_TOKEN }); - - const result = getConfig({}); - expect(result).to.deep.include({ - web3StorageToken: NEXT_PUBLIC_WEB3_STORAGE_TOKEN, - }); - }); - it("should not throw an error when the web3StorageToken specified by overrides is invalid", () => { - sinon.stub(process, "env").value({ WEB3_STORAGE_TOKEN: null }); - const overrides: Partial = {}; + const overrides: Partial = { chain: { id: 5 }, web3StorageToken: undefined }; expect(() => getConfig(overrides)).to.not.throw(); }); }); diff --git a/sdk/test/utils/errors.test.ts b/sdk/test/utils/errors.test.ts index affc4362..46f07a1b 100644 --- a/sdk/test/utils/errors.test.ts +++ b/sdk/test/utils/errors.test.ts @@ -1,7 +1,7 @@ import { expect } from "chai"; -import { FetchError, MalformedDataError, UnsupportedChainError } from "../../src/types/errors.js"; -import { handleError } from "../../src/utils/errors.js"; +import { FetchError, MalformedDataError, UnsupportedChainError } from "../../src/types/errors"; +import { handleError } from "../../src/utils/errors"; describe("Error handler test", () => { it("checking error handler", () => { diff --git a/sdk/test/utils/formatter.test.ts b/sdk/test/utils/formatter.test.ts index 0875cde2..15cd6c5e 100644 --- a/sdk/test/utils/formatter.test.ts +++ b/sdk/test/utils/formatter.test.ts @@ -1,7 +1,7 @@ import { expect } from "chai"; -import { formatHypercertData } from "../../src/index.js"; -import { INDEFINITE_DATE_STRING, formatDate, formatUnixTime } from "../../src/utils/formatter.js"; +import { formatHypercertData } from "../../src"; +import { INDEFINITE_DATE_STRING, formatDate, formatUnixTime } from "../../src/utils/formatter"; type TestDataType = Parameters[0]; const testData: Partial = { diff --git a/sdk/test/validator.test.ts b/sdk/test/validator.test.ts index 6036f72d..210fdd1e 100644 --- a/sdk/test/validator.test.ts +++ b/sdk/test/validator.test.ts @@ -1,15 +1,16 @@ import { expect } from "chai"; -import { validateClaimData, validateMetaData } from "../src/index.js"; -import type { HypercertClaimdata, HypercertMetadata } from "../src/index.js"; -import testData from "./res/mockMetadata.js"; -import { validateDuplicateEvaluationData, validateSimpleTextEvaluationData } from "../src/validator/index.js"; -import { getDuplicateEvaluationData, getSimpleTextEvaluationData } from "./helpers.js"; -import { DuplicateEvaluation, SimpleTextEvaluation } from "../src/types/evaluation.js"; +import { validateClaimData, validateMetaData } from "../src"; +import type { HypercertClaimdata, HypercertMetadata } from "../src"; +import { validateDuplicateEvaluationData, validateSimpleTextEvaluationData } from "../src/validator"; +import { getDuplicateEvaluationData, getSimpleTextEvaluationData, mockDataSets } from "./helpers"; +import { DuplicateEvaluation, SimpleTextEvaluation } from "../src/types/evaluation"; describe("Validate claim test", () => { + const { hypercertData, hypercertMetadata } = mockDataSets; it("checking default metadata", () => { - expect(validateMetaData(testData).valid).to.be.true; + const result = validateMetaData(hypercertMetadata.data); + expect(result.valid).to.be.true; const invalidResult = validateMetaData({} as HypercertMetadata); @@ -18,7 +19,9 @@ describe("Validate claim test", () => { }); it("checking default claimdata", () => { - expect(validateClaimData(testData.hypercert).valid).to.be.true; + const result = validateClaimData(hypercertData.data); + console.log(result); + expect(result.valid).to.be.true; const invalidResult = validateClaimData({} as HypercertClaimdata); diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index 368097f4..2c208243 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -2,8 +2,8 @@ "compilerOptions": { "lib": ["ES6", "DOM", "ESNext"], "target": "ESNext", - "module": "ESNext", - "moduleResolution": "node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "baseUrl": ".", "outDir": "dist", "allowJs": true, @@ -22,5 +22,5 @@ "skipLibCheck": true }, "exclude": ["node_modules"], - "include": ["./src/*.ts", "./src/**/*", "./test", "global.d.ts"] + "include": ["./src/*.ts", "./src/**/*", "./test/*.ts", "./test/**/*.ts", "global.d.ts"] } From 462abfdca8859d9d6067690e4c18c67680ad794b Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 6 Nov 2023 19:55:55 +0100 Subject: [PATCH 007/118] Fix/gha graph (#1165) --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 19c7c402..1b3f07e3 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "private": true, "scripts": { "build": "turbo run build --concurrency=100%", + "build:graph": "turbo run build --filter=@hypercerts-org/graph --", "copy": "pnpm copy:frontend && pnpm copy:docs && pnpm copy:html", "copy:docs": "mkdir -p ./build/docs/ && cp -r ./docs/build/* ./build/docs/", "copy:frontend": "mkdir -p ./build/ && cp -r ./frontend/out/* ./build/ && cp ./frontend/_redirects ./build/", From 6d8a7d44dcf170a2a733bcc7cecc8ffcad0e2e46 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 6 Nov 2023 20:17:08 +0100 Subject: [PATCH 008/118] feat(event): add event to merge --- contracts/.openzeppelin/goerli.json | 366 ++++++++++++++- contracts/contracts/AllowlistMinter.sol | 70 --- contracts/contracts/HypercertMinter.sol | 229 --------- contracts/contracts/SemiFungible1155.sol | 433 ------------------ contracts/contracts/interfaces/IAllowlist.sol | 14 - .../contracts/interfaces/IHypercertToken.sol | 62 --- contracts/contracts/libs/Errors.sol | 15 - contracts/src/SemiFungible1155.sol | 4 + 8 files changed, 369 insertions(+), 824 deletions(-) delete mode 100644 contracts/contracts/AllowlistMinter.sol delete mode 100644 contracts/contracts/HypercertMinter.sol delete mode 100644 contracts/contracts/SemiFungible1155.sol delete mode 100644 contracts/contracts/interfaces/IAllowlist.sol delete mode 100644 contracts/contracts/interfaces/IHypercertToken.sol delete mode 100644 contracts/contracts/libs/Errors.sol diff --git a/contracts/.openzeppelin/goerli.json b/contracts/.openzeppelin/goerli.json index e9968158..db7a1026 100644 --- a/contracts/.openzeppelin/goerli.json +++ b/contracts/.openzeppelin/goerli.json @@ -28,7 +28,6 @@ }, { "address": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "txHash": "0xeeb032f25fb656971f835204d0bd825f766593afadfe420110903420bb4f7071", "kind": "uups" } ], @@ -4403,6 +4402,371 @@ } } } + }, + "ba3b8c36d1292bdec3593f0e2b8f6d2e38d080b76cb70de7876aba5db39b7d86": { + "address": "0x0A00a2f09cd37B24E7429c5238323bfebCfF3Ed9", + "layout": { + "solcVersion": "0.8.16", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_balances", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:25" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:28" + }, + { + "label": "_uri", + "offset": 0, + "slot": "103", + "type": "t_string_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "104", + "type": "t_array(t_uint256)47_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:528" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1155BurnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol:52" + }, + { + "label": "_baseURI", + "offset": 0, + "slot": "201", + "type": "t_string_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:27" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "202", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:30" + }, + { + "label": "__gap", + "offset": 0, + "slot": "203", + "type": "t_array(t_uint256)48_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:77" + }, + { + "label": "_owner", + "offset": 0, + "slot": "251", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "351", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "typeCounter", + "offset": 0, + "slot": "401", + "type": "t_uint256", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:27" + }, + { + "label": "owners", + "offset": 0, + "slot": "402", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:38" + }, + { + "label": "creators", + "offset": 0, + "slot": "403", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:41" + }, + { + "label": "tokenValues", + "offset": 0, + "slot": "404", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:44" + }, + { + "label": "maxIndex", + "offset": 0, + "slot": "405", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:47" + }, + { + "label": "__gap", + "offset": 0, + "slot": "406", + "type": "t_array(t_uint256)25_storage", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:436" + }, + { + "label": "merkleRoots", + "offset": 0, + "slot": "431", + "type": "t_mapping(t_uint256,t_bytes32)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:17" + }, + { + "label": "hasBeenClaimed", + "offset": 0, + "slot": "432", + "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:18" + }, + { + "label": "maxUnits", + "offset": 0, + "slot": "433", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:19" + }, + { + "label": "minted", + "offset": 0, + "slot": "434", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "435", + "type": "t_array(t_uint256)26_storage", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:69" + }, + { + "label": "_paused", + "offset": 0, + "slot": "461", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "462", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:116" + }, + { + "label": "typeRestrictions", + "offset": 0, + "slot": "511", + "type": "t_mapping(t_uint256,t_enum(TransferRestrictions)6793)", + "contract": "HypercertMinter", + "src": "src/HypercertMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "512", + "type": "t_array(t_uint256)29_storage", + "contract": "HypercertMinter", + "src": "src/HypercertMinter.sol:228" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)25_storage": { + "label": "uint256[25]", + "numberOfBytes": "800" + }, + "t_array(t_uint256)26_storage": { + "label": "uint256[26]", + "numberOfBytes": "832" + }, + "t_array(t_uint256)29_storage": { + "label": "uint256[29]", + "numberOfBytes": "928" + }, + "t_array(t_uint256)47_storage": { + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_enum(TransferRestrictions)6793": { + "label": "enum IHypercertToken.TransferRestrictions", + "members": [ + "AllowAll", + "DisallowAll", + "FromCreatorOnly" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bytes32)": { + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_enum(TransferRestrictions)6793)": { + "label": "mapping(uint256 => enum IHypercertToken.TransferRestrictions)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))": { + "label": "mapping(uint256 => mapping(bytes32 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/contracts/contracts/AllowlistMinter.sol b/contracts/contracts/AllowlistMinter.sol deleted file mode 100644 index 576b45ee..00000000 --- a/contracts/contracts/AllowlistMinter.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.16; - -import { MerkleProofUpgradeable } from "oz-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; -import { IAllowlist } from "./interfaces/IAllowlist.sol"; - -import { Errors } from "./libs/Errors.sol"; - -/// @title Interface for hypercert token interactions -/// @author bitbeckers -/// @notice This interface declares the required functionality for a hypercert token -/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) -contract AllowlistMinter is IAllowlist { - event AllowlistCreated(uint256 tokenID, bytes32 root); - event LeafClaimed(uint256 tokenID, bytes32 leaf); - - mapping(uint256 => bytes32) internal merkleRoots; - mapping(uint256 => mapping(bytes32 => bool)) public hasBeenClaimed; - mapping(uint256 => uint256) internal maxUnits; - mapping(uint256 => uint256) internal minted; - - function isAllowedToClaim( - bytes32[] calldata proof, - uint256 claimID, - bytes32 leaf - ) external view returns (bool isAllowed) { - if (merkleRoots[claimID].length == 0) revert Errors.DoesNotExist(); - isAllowed = MerkleProofUpgradeable.verifyCalldata(proof, merkleRoots[claimID], leaf); - } - - function _createAllowlist(uint256 claimID, bytes32 merkleRoot, uint256 units) internal { - if (merkleRoot == "" || units == 0) revert Errors.Invalid(); - if (merkleRoots[claimID] != "") revert Errors.DuplicateEntry(); - - merkleRoots[claimID] = merkleRoot; - maxUnits[claimID] = units; - emit AllowlistCreated(claimID, merkleRoot); - } - - function _processClaim(bytes32[] calldata proof, uint256 claimID, uint256 amount) internal { - if (merkleRoots[claimID].length == 0) revert Errors.DoesNotExist(); - - bytes32 leaf = _calculateLeaf(msg.sender, amount); - - if (hasBeenClaimed[claimID][leaf]) revert Errors.AlreadyClaimed(); - if ( - !MerkleProofUpgradeable.verifyCalldata(proof, merkleRoots[claimID], leaf) || - (minted[claimID] + amount) > maxUnits[claimID] - ) revert Errors.Invalid(); - hasBeenClaimed[claimID][leaf] = true; - - emit LeafClaimed(claimID, leaf); - } - - function _calculateLeaf(address account, uint256 amount) internal pure returns (bytes32 leaf) { - leaf = keccak256(bytes.concat(keccak256(abi.encode(account, amount)))); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - * Assuming 30 available slots (slots cost space, cost gas) - * 1. merkleRoots - * 2. hasBeenClaimed - * 3. maxUnits - * 4. minted - */ - uint256[26] private __gap; -} diff --git a/contracts/contracts/HypercertMinter.sol b/contracts/contracts/HypercertMinter.sol deleted file mode 100644 index 917c02c5..00000000 --- a/contracts/contracts/HypercertMinter.sol +++ /dev/null @@ -1,229 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.16; - -import { IHypercertToken } from "./interfaces/IHypercertToken.sol"; -import { SemiFungible1155 } from "./SemiFungible1155.sol"; -import { AllowlistMinter } from "./AllowlistMinter.sol"; -import { PausableUpgradeable } from "oz-upgradeable/security/PausableUpgradeable.sol"; - -import { Errors } from "./libs/Errors.sol"; - -/// @title Contract for managing hypercert claims and whitelists -/// @author bitbeckers -/// @notice Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token. -/// @notice This contract supports whitelisted minting via { AllowlistMinter }. -/// @dev Wrapper contract to expose and chain functions. -contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, PausableUpgradeable { - // solhint-disable-next-line const-name-snakecase - string public constant name = "HypercertMinter"; - /// @dev from typeID to a transfer policy - mapping(uint256 => TransferRestrictions) internal typeRestrictions; - - /// INIT - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } - /// @custom:oz-upgrades-unsafe-allow constructor - constructor() { - _disableInitializers(); - } - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } - function initialize() public virtual initializer { - __SemiFungible1155_init(); - __Pausable_init(); - } - - /// EXTERNAL - - /// @notice Mint a semi-fungible token for the impact claim referenced via `uri` - /// @dev see {IHypercertToken} - function mintClaim( - address account, - uint256 units, - string memory _uri, - TransferRestrictions restrictions - ) external override whenNotPaused { - // This enables us to release this restriction in the future - if (msg.sender != account) revert Errors.NotAllowed(); - uint256 claimID = _mintNewTypeWithToken(account, units, _uri); - typeRestrictions[claimID] = restrictions; - emit ClaimStored(claimID, _uri, units); - } - - /// @notice Mint semi-fungible tokens for the impact claim referenced via `uri` - /// @dev see {IHypercertToken} - function mintClaimWithFractions( - address account, - uint256 units, - uint256[] calldata fractions, - string memory _uri, - TransferRestrictions restrictions - ) external override whenNotPaused { - // This enables us to release this restriction in the future - if (msg.sender != account) revert Errors.NotAllowed(); - //Using sum to compare units and fractions (sanity check) - if (_getSum(fractions) != units) revert Errors.Invalid(); - - uint256 claimID = _mintNewTypeWithTokens(account, fractions, _uri); - typeRestrictions[claimID] = restrictions; - emit ClaimStored(claimID, _uri, units); - } - - /// @notice Mint a semi-fungible token representing a fraction of the claim - /// @dev Calls AllowlistMinter to verify `proof`. - /// @dev Mints the `amount` of units for the hypercert stored under `claimID` - function mintClaimFromAllowlist( - address account, - bytes32[] calldata proof, - uint256 claimID, - uint256 units - ) external whenNotPaused { - _processClaim(proof, claimID, units); - _mintToken(account, claimID, units); - } - - /// @notice Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - /// @dev Calls AllowlistMinter to verify `proofs`. - /// @dev Mints the `amount` of units for the hypercert stored under `claimIDs` - function batchMintClaimsFromAllowlists( - address account, - bytes32[][] calldata proofs, - uint256[] calldata claimIDs, - uint256[] calldata units - ) external whenNotPaused { - uint256 len = claimIDs.length; - for (uint256 i; i < len; ) { - _processClaim(proofs[i], claimIDs[i], units[i]); - unchecked { - ++i; - } - } - _batchMintTokens(account, claimIDs, units); - } - - /// @notice Register a claim and the whitelist for minting token(s) belonging to that claim - /// @dev Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units` - /// @dev Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims - function createAllowlist( - address account, - uint256 units, - bytes32 merkleRoot, - string memory _uri, - TransferRestrictions restrictions - ) external whenNotPaused { - uint256 claimID = _createTokenType(account, units, _uri); - _createAllowlist(claimID, merkleRoot, units); - typeRestrictions[claimID] = restrictions; - emit ClaimStored(claimID, _uri, units); - } - - /// @notice Split a claimtokens value into parts with summed value equal to the original - /// @dev see {IHypercertToken} - function splitFraction( - address _account, - uint256 _tokenID, - uint256[] calldata _newFractions - ) external whenNotPaused { - _splitTokenUnits(_account, _tokenID, _newFractions); - } - - /// @notice Merge the value of tokens belonging to the same claim - /// @dev see {IHypercertToken} - function mergeFractions(address _account, uint256[] calldata _fractionIDs) external whenNotPaused { - _mergeTokensUnits(_account, _fractionIDs); - } - - /// @notice Burn a claimtoken - /// @dev see {IHypercertToken} - function burnFraction(address _account, uint256 _tokenID) external whenNotPaused { - _burnToken(_account, _tokenID); - } - - /// @dev see {IHypercertToken} - function unitsOf(uint256 tokenID) external view override returns (uint256 units) { - units = _unitsOf(tokenID); - } - - /// @dev see {IHypercertToken} - function unitsOf(address account, uint256 tokenID) external view override returns (uint256 units) { - units = _unitsOf(account, tokenID); - } - - /// PAUSABLE - - function pause() external onlyOwner { - _pause(); - } - - function unpause() external onlyOwner { - _unpause(); - } - - /// METADATA - - /// @dev see { IHypercertMetadata} - function uri(uint256 tokenID) public view override(IHypercertToken, SemiFungible1155) returns (string memory _uri) { - _uri = SemiFungible1155.uri(tokenID); - } - - /// TRANSFER RESTRICTIONS - - function readTransferRestriction(uint256 tokenID) external view returns (string memory) { - TransferRestrictions temp = typeRestrictions[getBaseType(tokenID)]; - if (temp == TransferRestrictions.AllowAll) return "AllowAll"; - if (temp == TransferRestrictions.DisallowAll) return "DisallowAll"; - if (temp == TransferRestrictions.FromCreatorOnly) return "FromCreatorOnly"; - return ""; - } - - /// INTERNAL - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol } - function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { - // solhint-disable-previous-line no-empty-blocks - } - - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - - // By-pass transfer restrictions for minting and burning - if (from == address(0)) { - // Minting - return; - } else if (to == address(0)) { - // Burning - return; - } - - // Transfer case, where to and from are non-zero - uint256 len = ids.length; - for (uint256 i; i < len; ) { - uint256 typeID = getBaseType(ids[i]); - TransferRestrictions policy = typeRestrictions[typeID]; - if (policy == TransferRestrictions.DisallowAll) { - revert Errors.TransfersNotAllowed(); - } else if (policy == TransferRestrictions.FromCreatorOnly && from != creators[typeID]) { - revert Errors.TransfersNotAllowed(); - } - unchecked { - ++i; - } - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - * Assuming 30 available slots (slots cost space, cost gas) - * 1. typeRestrictions - */ - uint256[29] private __gap; -} diff --git a/contracts/contracts/SemiFungible1155.sol b/contracts/contracts/SemiFungible1155.sol deleted file mode 100644 index cd88714a..00000000 --- a/contracts/contracts/SemiFungible1155.sol +++ /dev/null @@ -1,433 +0,0 @@ -// SPDX-License-Identifier: MIT -// Used components of Enjin example implementation for mixed fungibility -// https://github.com/enjin/erc-1155/blob/master/contracts/ERC1155MixedFungibleMintable.sol -pragma solidity 0.8.16; - -import { ERC1155Upgradeable } from "oz-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; -import { ERC1155BurnableUpgradeable } from "oz-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol"; -import { ERC1155URIStorageUpgradeable } from "oz-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol"; -import { OwnableUpgradeable } from "oz-upgradeable/access/OwnableUpgradeable.sol"; -import { Initializable } from "oz-upgradeable/proxy/utils/Initializable.sol"; -import { UUPSUpgradeable } from "oz-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import { Errors } from "./libs/Errors.sol"; - -/// @title Contract for minting semi-fungible EIP1155 tokens -/// @author bitbeckers -/// @notice Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` -/// @dev Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens) -contract SemiFungible1155 is - Initializable, - ERC1155Upgradeable, - ERC1155BurnableUpgradeable, - ERC1155URIStorageUpgradeable, - OwnableUpgradeable, - UUPSUpgradeable -{ - /// @dev Counter used to generate next typeID. - uint256 internal typeCounter; - - /// @dev Bitmask used to expose only upper 128 bits of uint256 - uint256 internal constant TYPE_MASK = type(uint256).max << 128; - - /// @dev Bitmask used to expose only lower 128 bits of uint256 - uint256 internal constant NF_INDEX_MASK = type(uint256).max >> 128; - - uint256 internal constant FRACTION_LIMIT = 253; - - /// @dev Mapping of `tokenID` to address of `owner` - mapping(uint256 => address) internal owners; - - /// @dev Mapping of `tokenID` to address of `creator` - mapping(uint256 => address) internal creators; - - /// @dev Used to determine amount of `units` stored in token at `tokenID` - mapping(uint256 => uint256) internal tokenValues; - - /// @dev Used to find highest index of token belonging to token at `typeID` - mapping(uint256 => uint256) internal maxIndex; - - /// @dev Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID` - event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value); - - /// @dev Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs` - event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values); - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } - // solhint-disable-next-line func-name-mixedcase - function __SemiFungible1155_init() public virtual onlyInitializing { - __ERC1155_init(""); - __ERC1155Burnable_init(); - __ERC1155URIStorage_init(); - __Ownable_init(); - __UUPSUpgradeable_init(); - } - - /// @dev Get index of fractional token at `_id` by returning lower 128 bit values - /// @dev Returns 0 if `_id` is a baseType - function getItemIndex(uint256 tokenID) internal pure returns (uint256) { - return tokenID & NF_INDEX_MASK; - } - - /// @dev Get base type ID for token at `_id` by returning upper 128 bit values - function getBaseType(uint256 tokenID) internal pure returns (uint256) { - return tokenID & TYPE_MASK; - } - - /// @dev Identify that token at `_id` is base type. - /// @dev Upper 128 bits identify base type ID, lower bits should be 0 - function isBaseType(uint256 tokenID) internal pure returns (bool) { - return (tokenID & TYPE_MASK == tokenID) && (tokenID & NF_INDEX_MASK == 0); - } - - /// @dev Identify that token at `_id` is fraction of a claim. - /// @dev Upper 128 bits identify base type ID, lower bits should be > 0 - function isTypedItem(uint256 tokenID) internal pure returns (bool) { - return (tokenID & TYPE_MASK != 0) && (tokenID & NF_INDEX_MASK != 0); - } - - /// READ - function ownerOf(uint256 tokenID) public view returns (address _owner) { - _owner = owners[tokenID]; - } - - /// @dev see {IHypercertToken} - function _unitsOf(uint256 tokenID) internal view returns (uint256 units) { - units = tokenValues[tokenID]; - } - - /// @dev see {IHypercertToken} - function _unitsOf(address account, uint256 tokenID) internal view returns (uint256 units) { - // Check if fraction token and accounts owns it - if (ownerOf(tokenID) == account) { - units = tokenValues[tokenID]; - } - } - - /// MUTATE - - /// @dev create token type ID based of token counter - - function _createTokenType(address _account, uint256 units, string memory _uri) internal returns (uint256 typeID) { - _notMaxType(typeCounter); - typeID = ++typeCounter << 128; - - creators[typeID] = _account; - tokenValues[typeID] = units; - - _setURI(typeID, _uri); - - //Event emitted for indexing purposes - emit TransferSingle(_account, address(0), address(0), typeID, 0); - } - - /// @dev Mint a new token type and the initial units - function _mintNewTypeWithToken( - address _account, - uint256 _units, - string memory _uri - ) internal returns (uint256 typeID) { - if (_units == 0) { - revert Errors.NotAllowed(); - } - typeID = _createTokenType(_account, _units, _uri); - - uint256 tokenID = typeID + ++maxIndex[typeID]; //1 based indexing, 0 holds type data - - tokenValues[tokenID] = _units; - - _mint(_account, tokenID, 1, ""); - emit ValueTransfer(typeID, 0, tokenID, _units); - } - - /// @dev Mint a new token type and the initial fractions - function _mintNewTypeWithTokens( - address _account, - uint256[] calldata _fractions, - string memory _uri - ) internal returns (uint256 typeID) { - typeID = _mintNewTypeWithToken(_account, _getSum(_fractions), _uri); - _splitTokenUnits(_account, typeID + maxIndex[typeID], _fractions); - } - - /// @dev Mint a new token for an existing type - function _mintToken(address _account, uint256 _typeID, uint256 _units) internal returns (uint256 tokenID) { - if (!isBaseType(_typeID)) revert Errors.NotAllowed(); - - _notMaxItem(maxIndex[_typeID]); - - unchecked { - tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data - } - - tokenValues[tokenID] = _units; - - _mint(_account, tokenID, 1, ""); - emit ValueTransfer(_typeID, 0, tokenID, _units); - } - - /// @dev Mint new tokens for existing types - /// @notice Enables batch claiming from multiple allowlists - function _batchMintTokens( - address _account, - uint256[] calldata _typeIDs, - uint256[] calldata _units - ) internal returns (uint256[] memory tokenIDs) { - uint256 len = _typeIDs.length; - - tokenIDs = new uint256[](len); - uint256[] memory amounts = new uint256[](len); - uint256[] memory zeroes = new uint256[](len); - - for (uint256 i; i < len; ) { - uint256 _typeID = _typeIDs[i]; - if (!isBaseType(_typeID)) revert Errors.NotAllowed(); - _notMaxItem(maxIndex[_typeID]); - - unchecked { - uint256 tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data - tokenValues[tokenID] = _units[i]; - tokenIDs[i] = tokenID; - amounts[i] = 1; - ++i; - } - } - - _mintBatch(_account, tokenIDs, amounts, ""); - emit BatchValueTransfer(_typeIDs, zeroes, tokenIDs, _units); - } - - /// @dev Split the units of `_tokenID` owned by `account` across `_values` - /// @dev `_values` must sum to total `units` held at `_tokenID` - function _splitTokenUnits(address _account, uint256 _tokenID, uint256[] calldata _values) internal { - if (_values.length > FRACTION_LIMIT || _values.length < 2) revert Errors.ArraySize(); - if (tokenValues[_tokenID] != _getSum(_values)) revert Errors.NotAllowed(); - - // Current token - uint256 _typeID = getBaseType(_tokenID); - uint256 valueLeft = tokenValues[_tokenID]; - - // Prepare batch processing, we want to skip the first entry - uint256 len = _values.length - 1; - - uint256[] memory typeIDs = new uint256[](len); - uint256[] memory fromIDs = new uint256[](len); - uint256[] memory toIDs = new uint256[](len); - uint256[] memory amounts = new uint256[](len); - uint256[] memory values = new uint256[](len); - - { - uint256[] memory _valuesCache = _values; - uint256 swapValue = _valuesCache[len]; - _valuesCache[len] = _valuesCache[0]; - _valuesCache[0] = swapValue; - - for (uint256 i; i < len; ) { - _notMaxItem(maxIndex[_typeID]); - - typeIDs[i] = _typeID; - fromIDs[i] = _tokenID; - toIDs[i] = _typeID + ++maxIndex[_typeID]; - amounts[i] = 1; - values[i] = _valuesCache[i]; - - unchecked { - ++i; - } - } - } - - _beforeUnitTransfer(_msgSender(), _account, fromIDs, toIDs, values, ""); - - for (uint256 i; i < len; ) { - valueLeft -= values[i]; - - tokenValues[toIDs[i]] = values[i]; - - unchecked { - ++i; - } - } - - tokenValues[_tokenID] = valueLeft; - - _mintBatch(_account, toIDs, amounts, ""); - - emit BatchValueTransfer(typeIDs, fromIDs, toIDs, values); - } - - /// @dev Merge the units of `_fractionIDs`. - /// @dev Base type of `_fractionIDs` must be identical for all tokens. - function _mergeTokensUnits(address _account, uint256[] memory _fractionIDs) internal { - if (_fractionIDs.length > FRACTION_LIMIT || _fractionIDs.length < 2) { - revert Errors.ArraySize(); - } - uint256 len = _fractionIDs.length - 1; - - uint256 target = _fractionIDs[len]; - - uint256 _totalValue; - uint256[] memory fromIDs = new uint256[](len); - uint256[] memory toIDs = new uint256[](len); - uint256[] memory values = new uint256[](len); - uint256[] memory amounts = new uint256[](len); - - { - for (uint256 i; i < len; ) { - uint256 _fractionID = _fractionIDs[i]; - fromIDs[i] = _fractionID; - toIDs[i] = target; - amounts[i] = 1; - values[i] = tokenValues[_fractionID]; - - unchecked { - ++i; - } - } - } - - _beforeUnitTransfer(_msgSender(), _account, fromIDs, toIDs, values, ""); - - for (uint256 i; i < len; ) { - _totalValue += values[i]; - - delete tokenValues[fromIDs[i]]; - unchecked { - ++i; - } - } - - tokenValues[target] += _totalValue; - - _burnBatch(_account, fromIDs, amounts); - } - - /// @dev Burn the token at `_tokenID` owned by `_account` - /// @dev Not allowed to burn base type. - /// @dev `_tokenID` must hold all value declared at base type - function _burnToken(address _account, uint256 _tokenID) internal { - if (_account != _msgSender() && !isApprovedForAll(_account, _msgSender())) revert Errors.NotApprovedOrOwner(); - - uint256 value = tokenValues[_tokenID]; - - delete tokenValues[_tokenID]; - - _burn(_account, _tokenID, 1); - emit ValueTransfer(getBaseType(_tokenID), _tokenID, 0, value); - } - - /// TRANSFERS - - // The following functions are overrides required by Solidity. - function _afterTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override { - super._afterTokenTransfer(operator, from, to, ids, amounts, data); - - uint256 len = ids.length; - - for (uint256 i; i < len; ) { - owners[ids[i]] = to; - unchecked { - ++i; - } - } - } - - function _beforeUnitTransfer( - address operator, - address from, - uint256[] memory fromIDs, - uint256[] memory toIDs, - uint256[] memory values, - bytes memory data - ) internal virtual { - uint256 len = fromIDs.length; - - for (uint256 i; i < len; ) { - uint256 _from = fromIDs[i]; - uint256 _to = toIDs[i]; - - if (isBaseType(_from)) revert Errors.NotAllowed(); - if (getBaseType(_from) != getBaseType(_to)) revert Errors.TypeMismatch(); - if (from != _msgSender() && !isApprovedForAll(from, _msgSender())) revert Errors.NotApprovedOrOwner(); - unchecked { - ++i; - } - } - } - - /// METADATA - - /// @dev see { openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol } - /// @dev Always returns the URI for the basetype so that it's managed in one place. - function uri( - uint256 tokenID - ) public view virtual override(ERC1155Upgradeable, ERC1155URIStorageUpgradeable) returns (string memory _uri) { - // All tokens share the same metadata at the moment - _uri = ERC1155URIStorageUpgradeable.uri(getBaseType(tokenID)); - } - - /// UTILS - - /** - * @dev Check if value is below max item index - */ - function _notMaxItem(uint256 tokenID) private pure { - uint128 _count = uint128(tokenID); - ++_count; - } - - /** - * @dev Check if value is below max type index - */ - function _notMaxType(uint256 tokenID) private pure { - uint128 _count = uint128(tokenID >> 128); - ++_count; - } - - /** - * @dev calculate the sum of the elements of an array - */ - function _getSum(uint256[] memory array) internal pure returns (uint256 sum) { - uint256 len = array.length; - for (uint256 i; i < len; ) { - if (array[i] == 0) revert Errors.NotAllowed(); - sum += array[i]; - unchecked { - ++i; - } - } - } - - function _getSingletonArray(uint256 element) private pure returns (uint256[] memory) { - uint256[] memory array = new uint256[](1); - array[0] = element; - - return array; - } - - // UUPS PROXY - - /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol } - function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { - // solhint-disable-previous-line no-empty-blocks - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - * Assuming 30 available slots (slots cost space, cost gas) - * 1. typeCounter - * 2. owners - * 3. creators - * 4. tokenValues - * 5. maxIndex - */ - uint256[25] private __gap; -} diff --git a/contracts/contracts/interfaces/IAllowlist.sol b/contracts/contracts/interfaces/IAllowlist.sol deleted file mode 100644 index fe4a9ec4..00000000 --- a/contracts/contracts/interfaces/IAllowlist.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.16; - -/// @title Interface for allowlist -/// @author bitbeckers -/// @notice This interface declares the required functionality for a hypercert token -/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) -interface IAllowlist { - function isAllowedToClaim( - bytes32[] calldata proof, - uint256 tokenID, - bytes32 leaf - ) external view returns (bool isAllowed); -} diff --git a/contracts/contracts/interfaces/IHypercertToken.sol b/contracts/contracts/interfaces/IHypercertToken.sol deleted file mode 100644 index 1ed1e34e..00000000 --- a/contracts/contracts/interfaces/IHypercertToken.sol +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.16; - -/// @title Interface for hypercert token interactions -/// @author bitbeckers -/// @notice This interface declares the required functionality for a hypercert token -/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) -interface IHypercertToken { - /** - * AllowAll = Unrestricted - * DisallowAll = Transfers disabled after minting - * FromCreatorOnly = Only the original creator can transfer - */ - /// @dev Transfer restriction policies on hypercerts - enum TransferRestrictions { - AllowAll, - DisallowAll, - FromCreatorOnly - } - - /// @dev Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`. - event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits); - - /// @dev Function called to store a claim referenced via `uri` with a maximum number of fractions `units`. - function mintClaim(address account, uint256 units, string memory uri, TransferRestrictions restrictions) external; - - /// @dev Function called to store a claim referenced via `uri` with a set of `fractions`. - /// @dev Fractions are internally summed to total units. - function mintClaimWithFractions( - address account, - uint256 units, - uint256[] memory fractions, - string memory uri, - TransferRestrictions restrictions - ) external; - - /// @dev Function called to split `tokenID` owned by `account` into units declared in `values`. - /// @notice The sum of `values` must equal the current value of `_tokenID`. - function splitFraction(address account, uint256 tokenID, uint256[] memory _values) external; - - /// @dev Function called to merge tokens within `tokenIDs`. - /// @notice Tokens that have been merged are burned. - function mergeFractions(address account, uint256[] memory tokenIDs) external; - - /// @dev Function to burn the token at `tokenID` for `account` - /// @notice Operator must be allowed by `creator` and the token must represent the total amount of available units. - function burnFraction(address account, uint256 tokenID) external; - - /// @dev Returns the `units` held by a (fractional) token at `claimID` - /// @dev If `tokenID` is a base type, the total amount of `units` for the claim is returned. - /// @dev If `tokenID` is a fractional token, the `units` held by the token is returned - function unitsOf(uint256 tokenID) external view returns (uint256 units); - - /// @dev Returns the `units` held by `account` of a (fractional) token at `claimID` - /// @dev If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned. - /// @dev If `tokenID` is a fractional token, the `units` held by `account` the token is returned - function unitsOf(address account, uint256 tokenID) external view returns (uint256 units); - - /// @dev Returns the `uri` for metadata of the claim represented by `tokenID` - /// @dev Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata) - function uri(uint256 tokenID) external view returns (string memory metadata); -} diff --git a/contracts/contracts/libs/Errors.sol b/contracts/contracts/libs/Errors.sol deleted file mode 100644 index e19d6b5c..00000000 --- a/contracts/contracts/libs/Errors.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; - -/// @author bitbeckers -library Errors { - error AlreadyClaimed(); - error ArraySize(); - error DoesNotExist(); - error DuplicateEntry(); - error Invalid(); - error NotAllowed(); - error NotApprovedOrOwner(); - error TransfersNotAllowed(); - error TypeMismatch(); -} diff --git a/contracts/src/SemiFungible1155.sol b/contracts/src/SemiFungible1155.sol index cd88714a..0f39d329 100644 --- a/contracts/src/SemiFungible1155.sol +++ b/contracts/src/SemiFungible1155.sol @@ -263,9 +263,11 @@ contract SemiFungible1155 is } uint256 len = _fractionIDs.length - 1; + uint256 _typeID = getBaseType(_fractionIDs[0]); uint256 target = _fractionIDs[len]; uint256 _totalValue; + uint256[] memory typeIDs = new uint256[](len); uint256[] memory fromIDs = new uint256[](len); uint256[] memory toIDs = new uint256[](len); uint256[] memory values = new uint256[](len); @@ -274,6 +276,7 @@ contract SemiFungible1155 is { for (uint256 i; i < len; ) { uint256 _fractionID = _fractionIDs[i]; + typeIDs[i] = _typeID; fromIDs[i] = _fractionID; toIDs[i] = target; amounts[i] = 1; @@ -299,6 +302,7 @@ contract SemiFungible1155 is tokenValues[target] += _totalValue; _burnBatch(_account, fromIDs, amounts); + emit BatchValueTransfer(typeIDs, fromIDs, toIDs, values); } /// @dev Burn the token at `_tokenID` owned by `_account` From 5cf30b3e86da95c3e63594ac393c899a0565d53c Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 7 Nov 2023 11:38:42 +0100 Subject: [PATCH 009/118] chore(deploy): deployed to goerli and sepolia --- .../{unknown-11155111.json => sepolia.json} | 366 ++++++++++++++++++ contracts/tasks/deploy-implementation.ts | 48 +++ contracts/tasks/index.ts | 1 + 3 files changed, 415 insertions(+) rename contracts/.openzeppelin/{unknown-11155111.json => sepolia.json} (64%) create mode 100644 contracts/tasks/deploy-implementation.ts diff --git a/contracts/.openzeppelin/unknown-11155111.json b/contracts/.openzeppelin/sepolia.json similarity index 64% rename from contracts/.openzeppelin/unknown-11155111.json rename to contracts/.openzeppelin/sepolia.json index aa073377..d917311a 100644 --- a/contracts/.openzeppelin/unknown-11155111.json +++ b/contracts/.openzeppelin/sepolia.json @@ -661,6 +661,372 @@ } } } + }, + "ba3b8c36d1292bdec3593f0e2b8f6d2e38d080b76cb70de7876aba5db39b7d86": { + "address": "0xDb77A1fDC905685B4052a512522D502638DdA5E3", + "txHash": "0xeb77995d2103baee6ba64beff908b9ed6653f1b1c9c1373321b8e8770a89a651", + "layout": { + "solcVersion": "0.8.16", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_balances", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:25" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:28" + }, + { + "label": "_uri", + "offset": 0, + "slot": "103", + "type": "t_string_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "104", + "type": "t_array(t_uint256)47_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:528" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1155BurnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol:52" + }, + { + "label": "_baseURI", + "offset": 0, + "slot": "201", + "type": "t_string_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:27" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "202", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:30" + }, + { + "label": "__gap", + "offset": 0, + "slot": "203", + "type": "t_array(t_uint256)48_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:77" + }, + { + "label": "_owner", + "offset": 0, + "slot": "251", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "351", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "typeCounter", + "offset": 0, + "slot": "401", + "type": "t_uint256", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:27" + }, + { + "label": "owners", + "offset": 0, + "slot": "402", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:38" + }, + { + "label": "creators", + "offset": 0, + "slot": "403", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:41" + }, + { + "label": "tokenValues", + "offset": 0, + "slot": "404", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:44" + }, + { + "label": "maxIndex", + "offset": 0, + "slot": "405", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:47" + }, + { + "label": "__gap", + "offset": 0, + "slot": "406", + "type": "t_array(t_uint256)25_storage", + "contract": "SemiFungible1155", + "src": "src/SemiFungible1155.sol:436" + }, + { + "label": "merkleRoots", + "offset": 0, + "slot": "431", + "type": "t_mapping(t_uint256,t_bytes32)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:17" + }, + { + "label": "hasBeenClaimed", + "offset": 0, + "slot": "432", + "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:18" + }, + { + "label": "maxUnits", + "offset": 0, + "slot": "433", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:19" + }, + { + "label": "minted", + "offset": 0, + "slot": "434", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "435", + "type": "t_array(t_uint256)26_storage", + "contract": "AllowlistMinter", + "src": "src/AllowlistMinter.sol:69" + }, + { + "label": "_paused", + "offset": 0, + "slot": "461", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "462", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:116" + }, + { + "label": "typeRestrictions", + "offset": 0, + "slot": "511", + "type": "t_mapping(t_uint256,t_enum(TransferRestrictions)6793)", + "contract": "HypercertMinter", + "src": "src/HypercertMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "512", + "type": "t_array(t_uint256)29_storage", + "contract": "HypercertMinter", + "src": "src/HypercertMinter.sol:228" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)25_storage": { + "label": "uint256[25]", + "numberOfBytes": "800" + }, + "t_array(t_uint256)26_storage": { + "label": "uint256[26]", + "numberOfBytes": "832" + }, + "t_array(t_uint256)29_storage": { + "label": "uint256[29]", + "numberOfBytes": "928" + }, + "t_array(t_uint256)47_storage": { + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_enum(TransferRestrictions)6793": { + "label": "enum IHypercertToken.TransferRestrictions", + "members": [ + "AllowAll", + "DisallowAll", + "FromCreatorOnly" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bytes32)": { + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_enum(TransferRestrictions)6793)": { + "label": "mapping(uint256 => enum IHypercertToken.TransferRestrictions)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))": { + "label": "mapping(uint256 => mapping(bytes32 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/contracts/tasks/deploy-implementation.ts b/contracts/tasks/deploy-implementation.ts new file mode 100644 index 00000000..79d13aa4 --- /dev/null +++ b/contracts/tasks/deploy-implementation.ts @@ -0,0 +1,48 @@ +import { task } from "hardhat/config"; +import { writeFile } from "node:fs/promises"; + +task("deploy-implementation", "Deploy implementation contract and verify") + .addOptionalParam("output", "write the details of the deployment to this file if this is set") + .setAction(async ({ output }, { ethers, network, run }) => { + console.log("Using address: ", await ethers.getSigners().then((res) => res[0].address)); + const HypercertMinter = await ethers.getContractFactory("HypercertMinter"); + const hypercertMinter = await HypercertMinter.deploy(); + + const contract = await hypercertMinter.deployed(); + console.log(`HypercertMinter implementation is deployed to address: ${hypercertMinter.address}`); + + // If the `deploymentFile` option is set then write the deployed address to + // a json object on disk. This is intended to be deliberate with how we + // output the contract address and other contract information. + if (output) { + const txReceipt = await contract.provider.getTransactionReceipt(hypercertMinter.deployTransaction.hash); + await writeFile( + output, + JSON.stringify({ + address: hypercertMinter.address, + blockNumber: txReceipt.blockNumber, + }), + "utf-8", + ); + } + + if (network.name !== "hardhat" && network.name !== "localhost") { + try { + const code = await contract.provider.getCode(hypercertMinter.address); + if (code === "0x") { + console.log(`${hypercertMinter.name} contract deployment has not completed. waiting to verify...`); + await contract.deployed(); + } + await run("verify:verify", { + address: hypercertMinter.address, + }); + } catch (error) { + const errorMessage = (error as Error).message; + + if (errorMessage.includes("Reason: Already Verified")) { + console.log("Reason: Already Verified"); + } + console.error(errorMessage); + } + } + }); diff --git a/contracts/tasks/index.ts b/contracts/tasks/index.ts index a60a09ad..d1ece55f 100644 --- a/contracts/tasks/index.ts +++ b/contracts/tasks/index.ts @@ -1,4 +1,5 @@ export * from "./deploy"; +export * from "./deploy-implementation"; export * from "./force-import"; export * from "./generate-address"; export * from "./pause"; From ee250ee581fd9beec85149f701705203028d4352 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Wed, 8 Nov 2023 00:09:00 +0100 Subject: [PATCH 010/118] Feat/allowlist proof util (#1168) * feat(util): allowlist utils and updated docs * feat(test): updated test and docs * chore(bump): alpha-7 * feat(merkle): test merkleProof fetcher * chore(bump): 1.0.0-alpha.8 * fix(import): allowlist default export * chore(run): local validation run --- frontend/components/config.tsx | 3 - frontend/package.json | 2 +- graph/tests/.latest.json | 2 +- pnpm-lock.yaml | 133 ++++++++++---------- sdk/README.md | 92 ++++---------- sdk/package.json | 4 +- sdk/src/client.ts | 172 +++++++++++++++++--------- sdk/src/constants.ts | 2 +- sdk/src/index.ts | 4 +- sdk/src/indexer.ts | 10 +- sdk/src/storage.ts | 116 +++++++++-------- sdk/src/types/hypercerts.ts | 18 +-- sdk/src/utils/adapters.ts | 25 ++++ sdk/src/utils/allowlist.ts | 46 +++++++ sdk/src/utils/config.ts | 25 ++-- sdk/src/utils/fetchers.ts | 47 +++++++ sdk/src/utils/index.ts | 7 ++ sdk/src/validator/index.ts | 133 ++++++++++++-------- sdk/test/storage/nft.storage.test.ts | 25 ++-- sdk/test/storage/web3.storage.test.ts | 13 +- sdk/test/utils/allowlist.test.ts | 48 +++++++ sdk/test/utils/fetchers.test.ts | 37 ++++++ 22 files changed, 622 insertions(+), 342 deletions(-) create mode 100644 sdk/src/utils/allowlist.ts create mode 100644 sdk/src/utils/fetchers.ts create mode 100644 sdk/src/utils/index.ts create mode 100644 sdk/test/utils/allowlist.test.ts create mode 100644 sdk/test/utils/fetchers.test.ts diff --git a/frontend/components/config.tsx b/frontend/components/config.tsx index dc799b63..3d3a150b 100644 --- a/frontend/components/config.tsx +++ b/frontend/components/config.tsx @@ -24,9 +24,6 @@ export function Config(props: ConfigProps) { ? Number(hypercertClient.config.chain.id) : undefined; - console.log(chainId); - console.log("Config: ", hypercertClient.config); - const data: ConfigData = { domain: DOMAIN, chainId: chainId, diff --git a/frontend/package.json b/frontend/package.json index 7c9186ee..15dc1a26 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -25,7 +25,7 @@ "@graphprotocol/client-cli": "^2.2.16", "@hypercerts-org/contracts": "0.9.0", "@hypercerts-org/observabletreemap": "workspace: *", - "@hypercerts-org/sdk": "1.0.0-alpha.6", + "@hypercerts-org/sdk": "1.0.0-alpha.8", "@mui/icons-material": "^5.11.9", "@mui/material": "^5.11.2", "@mui/x-date-pickers": "^5.0.12", diff --git a/graph/tests/.latest.json b/graph/tests/.latest.json index 9bf8a349..67836539 100644 --- a/graph/tests/.latest.json +++ b/graph/tests/.latest.json @@ -1,4 +1,4 @@ { "version": "0.6.0", - "timestamp": 1699280746839 + "timestamp": 1699397492586 } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 203d74fe..b518a718 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -304,7 +304,7 @@ importers: version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) '@graphprotocol/client-cli': specifier: ^2.2.16 - version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': specifier: 0.9.0 version: 0.9.0(typescript@5.1.6) @@ -312,8 +312,8 @@ importers: specifier: 'workspace: *' version: link:../vendor/observabletreemap '@hypercerts-org/sdk': - specifier: 1.0.0-alpha.6 - version: 1.0.0-alpha.6(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4) + specifier: 1.0.0-alpha.8 + version: 1.0.0-alpha.8(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4) '@mui/icons-material': specifier: ^5.11.9 version: 5.14.15(@mui/material@5.14.15)(@types/react@18.2.33)(react@18.2.0) @@ -565,7 +565,7 @@ importers: specifier: 0.8.11 version: 0.8.11 '@openzeppelin/merkle-tree': - specifier: ^1.0.4 + specifier: ^1.0.5 version: 1.0.5 '@whatwg-node/fetch': specifier: ^0.9.13 @@ -5757,24 +5757,6 @@ packages: '@trufflesuite/bigint-buffer': 1.1.9 dev: true - /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): - resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} - peerDependencies: - '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 - '@graphql-tools/delegate': ^9.0.32 - '@graphql-tools/utils': ^9.2.1 - '@graphql-tools/wrap': ^9.4.2 - graphql: ^15.2.0 || ^16.0.0 - dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) - graphql: 16.8.1 - lodash: 4.17.21 - tslib: 2.6.2 - dev: false - /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} peerDependencies: @@ -5812,7 +5794,7 @@ packages: tslib: 2.6.2 dev: true - /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-p8eEyeBcqxCXLxC7CNgIhLSCd7bjiKToKnrwYPShVb26gIG2JdAmD3/mpjuR+QaMA4chN/EO5t+TGvq6KnFx9g==} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 @@ -5821,7 +5803,7 @@ packages: '@graphql-tools/wrap': ^9.4.2 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) @@ -5849,15 +5831,15 @@ packages: tslib: 2.6.2 dev: true - /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): + /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-kpiX2s804mpP3EVL0EdJfxeHWBTdg6SglIyEvSZ5T1OWyGDeMhr19D+gVIAlo22/PiBUkBDd0JfqppLsliPZ1A==} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 '@graphql-tools/delegate': ^9.0.32 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -5907,19 +5889,19 @@ packages: tslib: 2.6.2 dev: true - /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-PIi8rFibYZVup+0jb08399RmbGF1ZrqUe6RXzLtKZBT57OWIMWwsFvdJyUAdr8Y8f0rrMn6A+Oy4nP1lf3hc1g==} hasBin: true peerDependencies: graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) + '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-polling-live': 1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -6420,7 +6402,7 @@ packages: graphql: 16.8.1 path-browserify: 1.0.1 - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6432,10 +6414,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6663,7 +6645,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6679,8 +6661,8 @@ packages: '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -6739,6 +6721,26 @@ packages: graphql: 16.8.1 tslib: 2.6.2 + /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-inspector/core': 5.0.1(graphql@16.8.1) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} engines: {node: '>=16.0.0'} @@ -6783,22 +6785,6 @@ packages: lodash.get: 4.4.2 tslib: 2.6.2 - /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} - peerDependencies: - '@graphql-mesh/types': ^0.93.1 - '@graphql-mesh/utils': ^0.93.1 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) - '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} peerDependencies: @@ -6808,12 +6794,11 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 - dev: true /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} @@ -6870,6 +6855,30 @@ packages: tiny-lru: 8.0.2 tslib: 2.6.2 + /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/types': ^0.95.8 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@whatwg-node/fetch': 0.9.14 + dset: 3.1.3 + graphql: 16.8.1 + js-yaml: 4.1.0 + lodash.get: 4.4.2 + lodash.topath: 4.5.2 + tiny-lru: 11.2.3 + tslib: 2.6.2 + /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} engines: {node: '>=16.0.0'} @@ -7519,8 +7528,8 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/sdk@1.0.0-alpha.6(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4): - resolution: {integrity: sha512-WnZJfKGGqaQAPasvKjAuQ1eyWJT8kfY5Z445SjeFU8xWDelLRGuwaMT1w+B3e16YbZFQXBr/eB/dabMVb9ZPrQ==} + /@hypercerts-org/sdk@1.0.0-alpha.8(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4): + resolution: {integrity: sha512-T44kiplKi4qJQFlnn9Ac8KSOyWeGdglaGjMxhYZzqCEhqWPYYOscm6Q6qu2/X+HDhKpO68MbJPnCp88ajpVAOg==} dependencies: '@ethereum-attestation-service/eas-sdk': 1.2.2-beta.0(ts-node@10.9.1)(typescript@5.1.6) '@ethersproject/abstract-signer': 5.7.0 @@ -7531,10 +7540,10 @@ packages: '@graphql-mesh/graphql': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': 0.8.11 '@openzeppelin/merkle-tree': 1.0.5 diff --git a/sdk/README.md b/sdk/README.md index 55f4adb5..40bf074b 100644 --- a/sdk/README.md +++ b/sdk/README.md @@ -24,15 +24,13 @@ import { HypercertClient } from "@hypercerts-org/sdk"; ```js const client = new HypercertClient({ - chainId: 5, - provider, - signer, + chain: { id: 5 } // required nftStorageToken, web3StorageToken, }); ``` -> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in +> **Note** If there's no `walletClient`, `nftStorageToken` or `web3StorageToken` provided, the client will run in > [read-only mode](#read-only-mode) 4. Use the client object to interact with the Hypercert network. @@ -60,78 +58,36 @@ environment variables for your NFT.storage and web3.storage API keys in your .en ## Config -The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check -the environment variables. +HypercertClientConfig is a configuration object used when initializing a new instance of the HypercertClient. It allows +you to customize the client by setting your own providers or deployments. At it's simplest, you only need to provide +`chain.id` to initalize the client in `readonly` mode. + +| Field | Type | Description | +| --------------------------- | ------- | ---------------------------------------------------------------------------------------------- | +| `chain` | Object | Partial configuration for the blockchain network. | +| `contractAddress` | String | The address of the deployed contract. | +| `graphUrl` | String | The URL to the subgraph that indexes the contract events. Override for localized testing. | +| `graphName` | String | The name of the subgraph. | +| `nftStorageToken` | String | The API token for NFT.storage. | +| `web3StorageToken` | String | The API token for Web3.storage. | +| `easContractAddress` | String | The address of the EAS contract. | +| `publicClient` | Object | The PublicClient is inherently read-only and is used for reading data from the blockchain. | +| `walletClient` | Object | The WalletClient is used for signing and sending transactions. | +| `unsafeForceOverrideConfig` | Boolean | Boolean to force the use of overridden values. | +| `readOnly` | Boolean | Boolean to assert if the client is in read-only mode. | +| `readOnlyReason` | String | Reason for read-only mode. This is optional and can be used for logging or debugging purposes. | ### Read-only mode The SDK client will be in read-only mode if any of the following conditions are true: -- The client was initialized without a signer or provider. -- The client was initialized with a provider but not a signer. -- The client was initialized with a signer but not a provider. +- The client was initialized without a walletprovider. - The contract address is not set. - The storage layer is in read-only mode. If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. -### Defaults - -The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief -explanation of each constant: - -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - -`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object -contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. - -For example: - -```json -{ - "5": { - "chainId": 5, - "chainName": "goerli", - "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "graphName": "hypercerts-testnet" - } -} -``` - -### Client config properties - -| \| Property | Type | Description | -| ------------------ | -------------------- | -------------------------------------- | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | -| `graphName` | `string` | The name of the Gsubgraph to use. | -| `provider` | `providers.Provider` | A custom provider to use. | -| `signer` | `Signer` | A custom signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | - -### Environment variables - -To determine the missing configuration values the SDK defaults to the following environment variables: - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - ### Logging The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level @@ -147,7 +103,7 @@ HypercertIndexer, and HypercertMinter classes, respectively. ```js const { client: { storage }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and @@ -156,7 +112,7 @@ NFT.storage. It is used by the HypercertClient to store metadata when creating n ```js const { client: { indexer }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. @@ -165,7 +121,7 @@ It is used by the HypercertClient to retrieve event-based data via the subgraph ```js const { client: { contract }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used diff --git a/sdk/package.json b/sdk/package.json index 91b39d68..ac49caee 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.0.0-alpha.6", + "version": "1.0.0-alpha.8", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -38,7 +38,7 @@ "@graphql-mesh/utils": "^0.95.7", "@graphql-typed-document-node/core": "^3.2.0", "@hypercerts-org/contracts": "0.8.11", - "@openzeppelin/merkle-tree": "^1.0.4", + "@openzeppelin/merkle-tree": "^1.0.5", "@whatwg-node/fetch": "^0.9.13", "ajv": "^8.11.2", "axios": "^1.2.2", diff --git a/sdk/src/client.ts b/sdk/src/client.ts index 63b24c01..aeef85cc 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -25,18 +25,13 @@ import { validateAllowlist, validateMetaData, verifyMerkleProof, verifyMerklePro * It encapsulates the logic for storage, evaluation, indexing, and wallet interactions, abstracting the complexity and providing a simple API for users. * The client is read-only if the storage is read-only (no nft.storage/web3.storage keys) or if no walletClient was found. * - * Here's an example of how to create a new instance of `HypercertClient`: - * - * ```typescript + * @example * const config: Partial = { - * id: 5 + * chain: {id: 5}, * }; - * * const client = new HypercertClient(config); - * ``` * - * @param config - Hypercerts client configuration - * @dev Creates a Hypercerts client instance + * @param {Partial} config - The configuration options for the client. */ export default class HypercertClient implements HypercertClientInterface { readonly _config; @@ -50,7 +45,11 @@ export default class HypercertClient implements HypercertClientInterface { /** * Creates a new instance of the `HypercertClient` class. - * @param config The configuration options for the client. + * + * This constructor takes a `config` parameter that is used to configure the client. The `config` parameter should be a `HypercertClientConfig` object. If the public client cannot be connected, it throws a `ClientError`. + * + * @param {Partial} config - The configuration options for the client. + * @throws {ClientError} Will throw a `ClientError` if the public client cannot be connected. */ constructor(config: Partial) { this._config = getConfig(config); @@ -110,19 +109,26 @@ export default class HypercertClient implements HypercertClientInterface { } /** - * Mint a Hypercert claim - * @dev Mints a Hypercert claim with the given metadata, total units and transfer restrictions - * @param metaData - Hypercert metadata - * @param totalUnits - Total number of units for the Hypercert - * @param transferRestriction - Transfer restrictions for the Hypercert - * @returns Contract transaction + * Mints a new claim. + * + * This method first validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. + * It then stores the metadata on IPFS using the `storeMetadata` method of the storage client. + * After that, it simulates a contract call to the `mintClaim` function with the provided parameters and the stored metadata CID to validate the transaction. + * Finally, it submits the request using the `submitRequest` method. + * + * @param {HypercertMetadata} metaData - The metadata for the claim. + * @param {bigint} totalUnits - The total units for the claim. + * @param {TransferRestrictions} transferRestriction - The transfer restrictions for the claim. + * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. + * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @throws {MalformedDataError} Will throw a `MalformedDataError` if the provided metadata is invalid. */ mintClaim = async ( metaData: HypercertMetadata, totalUnits: bigint, transferRestriction: TransferRestrictions, overrides?: SupportedOverrides, - ) => { + ): Promise<`0x${string}`> => { const { account } = this.getWallet(); // validate metadata @@ -146,14 +152,20 @@ export default class HypercertClient implements HypercertClientInterface { }; /** - * Create a Hypercert claim with an allowlist - * @dev Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist - * @notice The total number of units in the allowlist must match the total number of units for the Hypercert - * @param allowList - Allowlist for the Hypercert - * @param metaData - Hypercert metadata - * @param totalUnits - Total number of units for the Hypercert - * @param transferRestriction - Transfer restrictions for the Hypercert - * @returns Contract transaction + * Creates an allowlist. + * + * This method first validates the provided allowlist and metadata using the `validateAllowlist` and `validateMetaData` functions respectively. If either is invalid, it throws a `MalformedDataError`. + * It then creates an allowlist from the provided entries and stores it on IPFS using the `storeData` method of the storage client. + * After that, it stores the metadata (including the CID of the allowlist) on IPFS using the `storeMetadata` method of the storage client. + * Finally, it simulates a contract call to the `createAllowlist` function with the provided parameters and the stored metadata CID, and submits the request using the `submitRequest` method. + * + * @param {AllowlistEntry[]} allowList - The entries for the allowlist. + * @param {HypercertMetadata} metaData - The metadata for the claim. + * @param {bigint} totalUnits - The total units for the claim. + * @param {TransferRestrictions} transferRestriction - The transfer restrictions for the claim. + * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. + * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @throws {MalformedDataError} Will throw a `MalformedDataError` if the provided allowlist or metadata is invalid. */ createAllowlist = async ( allowList: AllowlistEntry[], @@ -161,7 +173,7 @@ export default class HypercertClient implements HypercertClientInterface { totalUnits: bigint, transferRestriction: TransferRestrictions, overrides?: SupportedOverrides, - ) => { + ): Promise<`0x${string}`> => { const { account } = this.getWallet(); // validate allowlist @@ -196,14 +208,24 @@ export default class HypercertClient implements HypercertClientInterface { }; /** - * Split a Hypercert's unit into multiple claims with the given fractions - * @dev Submit the ID of the claim to split and new fraction values. - * @notice The sum of the fractions must be equal to the total units of the claim - * @param fractionId - Hypercert claim id - * @param newFractions - Fractions of the Hypercert claim to split - * @returns Contract transaction + * Splits a fraction into multiple fractions. + * + * This method first retrieves the wallet client and account using the `getWallet` method. It then retrieves the owner and total units of the fraction using the `ownerOf` and `unitsOf` methods of the read contract. + * If the fraction is not owned by the account, it throws a `ClientError`. + * It then checks if the sum of the provided fractions is equal to the total units of the fraction. If not, it throws a `ClientError`. + * Finally, it simulates a contract call to the `splitFraction` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + * + * @param {bigint} fractionId - The ID of the fraction to split. + * @param {bigint[]} fractions - The fractions to split the fraction into. + * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. + * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @throws {ClientError} Will throw a `ClientError` if the fraction is not owned by the account or if the sum of the fractions is not equal to the total units of the fraction. */ - splitFractionUnits = async (fractionId: bigint, fractions: bigint[], overrides?: SupportedOverrides) => { + splitFractionUnits = async ( + fractionId: bigint, + fractions: bigint[], + overrides?: SupportedOverrides, + ): Promise<`0x${string}`> => { const { account } = this.getWallet(); const readContract = getContract({ @@ -234,12 +256,18 @@ export default class HypercertClient implements HypercertClientInterface { }; /** - * Merge multiple Hypercert claims fractions into one - * @dev Merges multiple Hypercert claims into one - * @param fractionIds - Hypercert claim ids - * @returns Contract transaction + * Merges multiple fractions into a single fraction. + * + * This method first retrieves the wallet client and account using the `getWallet` method. It then retrieves the owner of each fraction using the `ownerOf` method of the read contract. + * If any of the fractions are not owned by the account, it throws a `ClientError`. + * It then simulates a contract call to the `mergeFractions` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + * + * @param {bigint[]} fractionIds - The IDs of the fractions to merge. + * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. + * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @throws {ClientError} Will throw a `ClientError` if any of the fractions are not owned by the account. */ - mergeFractionUnits = async (fractionIds: bigint[], overrides?: SupportedOverrides) => { + mergeFractionUnits = async (fractionIds: bigint[], overrides?: SupportedOverrides): Promise<`0x${string}`> => { const { account } = this.getWallet(); const readContract = getContract({ @@ -272,12 +300,18 @@ export default class HypercertClient implements HypercertClientInterface { }; /** - * Burn a Hypercert claim by providing the claim id - * @dev Burns a Hypercert claim - * @param fractionId - Hypercert claim id - * @returns Contract transaction + * Burns a claim fraction. + * + * This method first retrieves the wallet client and account using the `getWallet` method. It then retrieves the owner of the claim using the `ownerOf` method of the read contract. + * If the claim is not owned by the account, it throws a `ClientError`. + * It then simulates a contract call to the `burnFraction` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + * + * @param {bigint} claimId - The ID of the claim to burn. + * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. + * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @throws {ClientError} Will throw a `ClientError` if the claim is not owned by the account. */ - burnClaimFraction = async (claimId: bigint, overrides?: SupportedOverrides) => { + burnClaimFraction = async (claimId: bigint, overrides?: SupportedOverrides): Promise<`0x${string}`> => { const { account } = this.getWallet(); const readContract = getContract({ @@ -303,13 +337,18 @@ export default class HypercertClient implements HypercertClientInterface { }; /** - * Mint a Hypercert claim fraction from an allowlist. - * @dev Verifies the claim proof and mints the claim fraction - * @notice If known, provide the root for client side verification - * @param claimId - Hypercert claim id - * @param units - Number of units to mint - * @param proof - Merkle proof for the claim - * @returns Contract transaction + * Mints a claim fraction from an allowlist. + * + * This method first retrieves the wallet client and account using the `getWallet` method. It then verifies the provided proof using the `verifyMerkleProof` function. If the proof is invalid, it throws an `InvalidOrMissingError`. + * It then simulates a contract call to the `mintClaimFromAllowlist` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + * + * @param {bigint} claimId - The ID of the claim to mint. + * @param {bigint} units - The units of the claim to mint. + * @param {(Hex | ByteArray)[]} proof - The proof for the claim. + * @param {Hex | ByteArray} [root] - The root of the proof. If provided, it is used to verify the proof. + * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. + * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @throws {InvalidOrMissingError} Will throw an `InvalidOrMissingError` if the proof is invalid. */ mintClaimFractionFromAllowlist = async ( claimId: bigint, @@ -317,7 +356,7 @@ export default class HypercertClient implements HypercertClientInterface { proof: (Hex | ByteArray)[], root?: Hex | ByteArray, overrides?: SupportedOverrides, - ) => { + ): Promise<`0x${string}`> => { const { account } = this.getWallet(); //verify the proof using the OZ merkle tree library @@ -343,14 +382,18 @@ export default class HypercertClient implements HypercertClientInterface { }; /** - * Batch mints a claim fraction from an allowlist - * @param claimIds Array of the IDs of the claims to mint fractions for. - * @param units Array of the number of units for each fraction. - * @param proofs Array of Merkle proofs for the allowlists. - * @returns A Promise that resolves to the transaction receipt - * @note The length of the arrays must be equal. - * @note The order of the arrays must be equal. - * @returns A Promise that resolves to the transaction receipt + * Mints multiple claim fractions from allowlists in a batch. + * + * This method first retrieves the wallet client and account using the `getWallet` method. If the roots are provided, it verifies each proof using the `verifyMerkleProofs` function. If any of the proofs are invalid, it throws an `InvalidOrMissingError`. + * It then simulates a contract call to the `batchMintClaimsFromAllowlists` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + * + * @param {bigint[]} claimIds - The IDs of the claims to mint. + * @param {bigint[]} units - The units of each claim to mint. + * @param {(Hex | ByteArray)[][]} proofs - The proofs for each claim. + * @param {(Hex | ByteArray)[]} [roots] - The roots of each proof. If provided, they are used to verify the proofs. + * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. + * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @throws {InvalidOrMissingError} Will throw an `InvalidOrMissingError` if any of the proofs are invalid. */ batchMintClaimFractionsFromAllowlists = async ( claimIds: bigint[], @@ -358,7 +401,7 @@ export default class HypercertClient implements HypercertClientInterface { proofs: (Hex | ByteArray)[][], roots?: (Hex | ByteArray)[], overrides?: SupportedOverrides, - ) => { + ): Promise<`0x${string}`> => { const { account } = this.getWallet(); //verify the proof using the OZ merkle tree library @@ -412,8 +455,17 @@ export default class HypercertClient implements HypercertClientInterface { return { walletClient: this._walletClient, account: this._walletClient.account }; }; + /** + * Submits a contract request. + * + * This method submits a contract request using the `writeContract` method of the wallet client. If the request fails, it throws a `ClientError`. + * + * @param {any} request - The contract request to submit. + * @returns {Promise<`0x${string}`>} A promise that resolves to the hash of the submitted request. + * @throws {ClientError} Will throw a `ClientError` if the request fails. + */ // eslint-disable-next-line @typescript-eslint/no-explicit-any - private submitRequest = async (request: any) => { + private submitRequest = async (request: any): Promise<`0x${string}`> => { const hash = this._walletClient?.writeContract(request); if (!hash) { diff --git a/sdk/src/constants.ts b/sdk/src/constants.ts index 05307613..deebf21c 100644 --- a/sdk/src/constants.ts +++ b/sdk/src/constants.ts @@ -20,7 +20,7 @@ const DEPLOYMENTS: { [key in SupportedChainIds]: Partial } = { } as const, 42220: { contractAddress: "0x16ba53b74c234c870c61efc04cd418b8f2865959", - graphName: "hypercerts-arbitrum", + graphName: "hypercerts-celo", graphUrl: `${DEFAULT_GRAPH_BASE_URL}/hypercerts-celo`, }, 11155111: { diff --git a/sdk/src/index.ts b/sdk/src/index.ts index abe5436b..4de15b87 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -32,9 +32,9 @@ export * from "./types"; export * from "./validator"; /** - * Formatters + * Utils */ -export * from "./utils/formatter"; +export * from "./utils"; /** * Graph diff --git a/sdk/src/indexer.ts b/sdk/src/indexer.ts index c3438f45..337355e5 100644 --- a/sdk/src/indexer.ts +++ b/sdk/src/indexer.ts @@ -4,7 +4,15 @@ import { HypercertClientConfig, HypercertIndexerInterface, QueryParams } from ". /** * A class that provides indexing functionality for Hypercerts. - * @class HypercertIndexer + * + * This class implements the `HypercertIndexerInterface` and provides methods for retrieving claims by owner and by ID. It uses the Graph client for indexing. + * Because of the autogenerated Graph client packed with the SDK, this class is not recommended for custom Graph deployments. + * + * @property {GraphClient} _graphClient - The Graph client used by the indexer. + * + * @example + * const indexer = new HypercertIndexer({ graphUrl: 'your-graph-url', graphName: 'your-graph-name' }); + * const claims = await indexer.claimsByOwner('your-address'); */ export default class HypercertIndexer implements HypercertIndexerInterface { /** The Graph client used by the indexer. */ diff --git a/sdk/src/storage.ts b/sdk/src/storage.ts index 19bab0e8..fb2606e2 100644 --- a/sdk/src/storage.ts +++ b/sdk/src/storage.ts @@ -1,4 +1,3 @@ -import axios from "axios"; //eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { CIDString, NFTStorage } from "nft.storage"; @@ -16,11 +15,20 @@ import { } from "./types"; import logger from "./utils/logger"; import { getNftStorageToken, getWeb3StorageToken } from "./utils/config"; - -const getCid = (cidOrIpfsUri: string) => cidOrIpfsUri.replace("ipfs://", ""); +import fetchers from "./utils/fetchers"; /** * A class that provides storage functionality for Hypercerts. + * + * This class implements the `HypercertStorageInterface` and provides methods for storing and retrieving Hypercerts. It uses the NFT Storage and Web3 Storage APIs for storage, and can be configured to be read-only. + * + * @property {boolean} readonly - Whether the storage is read-only. If true, the storage methods will not perform any write operations. + * @property {NFTStorage} nftStorageClient - The NFT Storage client used for storing and retrieving Hypercerts. + * @property {Web3Storage} web3StorageClient - The Web3 Storage client used for storing and retrieving Hypercerts. + * + * @example + * const storage = new HypercertsStorage({ nftStorageToken: 'your-nft-storage-token', web3StorageToken: 'your-web3-storage-token' }); + * const metadata = await storage.getMetadata('your-hypercert-id'); */ export default class HypercertsStorage implements HypercertStorageInterface { /** Whether the storage is read-only. */ @@ -32,7 +40,10 @@ export default class HypercertsStorage implements HypercertStorageInterface { /** * Creates a new instance of the `HypercertsStorage` class. - * @param overrides The configuration overrides for the storage. + * + * This constructor takes an optional `overrides` parameter that can be used to override the default configuration. If the NFT Storage or Web3 Storage API keys are missing or invalid, the storage will be read-only. + * + * @param {Partial} overrides - The configuration overrides for the storage. */ constructor(overrides: Partial) { const nftStorageToken = getNftStorageToken(overrides); @@ -56,32 +67,17 @@ export default class HypercertsStorage implements HypercertStorageInterface { } } - getFromIPFS = async (cidOrIpfsUri: string, timeout = 10000) => { - const nftStorageGatewayLink = this.getNftStorageGatewayUri(cidOrIpfsUri); - const web3StorageGatewayLink = this.getWeb3StorageGatewayUri(cidOrIpfsUri); - logger.debug(`Getting metadata ${cidOrIpfsUri} at ${nftStorageGatewayLink}`); - - const res = await axios.get(nftStorageGatewayLink, { timeout }).catch(() => { - logger.debug(`${nftStorageGatewayLink} timed out.`); - logger.debug(`Getting metadata ${cidOrIpfsUri} at ${web3StorageGatewayLink}`); - return axios.get(web3StorageGatewayLink, { timeout }); - }); - - if (!res || !res.data) { - throw new StorageError(`Failed to get ${cidOrIpfsUri}`); - } - - return res.data; - }; - /** - * Stores metadata for a Hypercert. - * @param data The metadata to store. - * @returns A Promise that resolves to the CID of the stored metadata. - * @throws A `StorageError` if the storage client is not configured. - * @throws A `MalformedDataError` if the metadata is invalid. - * @notice Because we pay for storage quotas, this data is stored best effort. - * If you are using our default keys, we may delete older data if we hit our storage quota. + * Stores Hypercert metadata using the NFT Storage client. + * + * This method first checks if the storage is read-only or if the NFT Storage client is not configured. If either of these conditions is true, it throws a `StorageError`. + * It then validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. + * If the metadata is valid, it creates a new Blob from the metadata and stores it using the NFT Storage client. If the storage operation fails, it throws a `StorageError`. + * + * @param {HypercertMetadata} data - The Hypercert metadata to store. This should be an object that conforms to the HypercertMetadata type. + * @returns {Promise} A promise that resolves to the CID of the stored metadata. + * @throws {StorageError} Will throw a `StorageError` if the storage is read-only, if the NFT Storage client is not configured, or if the storage operation fails. + * @throws {MalformedDataError} Will throw a `MalformedDataError` if the provided metadata is invalid. */ public async storeMetadata(data: HypercertMetadata): Promise { if (this.readonly || !this.nftStorageClient) { @@ -107,29 +103,37 @@ export default class HypercertsStorage implements HypercertStorageInterface { } /** - * Gets metadata for a Hypercert. - * @param cidOrIpfsUri The CID or IPFS URI of the metadata to get. - * @returns A Promise that resolves to the metadata. - * @throws A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. - * @throws A `MalformedDataError` if the metadata is invalid. E.g. unknown schema + * Retrieves Hypercert metadata from IPFS using the provided CID or IPFS URI. + * + * This method first retrieves the data from IPFS using the `getFromIPFS` function. It then validates the retrieved data using the `validateMetaData` function. If the data is invalid, it throws a `MalformedDataError`. + * If the data is valid, it returns the data as a `HypercertMetadata` object. + * + * @param {string} cidOrIpfsUri - The CID or IPFS URI of the metadata to retrieve. + * @returns {Promise} A promise that resolves to the retrieved metadata. + * @throws {MalformedDataError} Will throw a `MalformedDataError` if the retrieved data is invalid. */ public async getMetadata(cidOrIpfsUri: string): Promise { - const res = await this.getFromIPFS(cidOrIpfsUri); + const res = await fetchers.getFromIPFS(cidOrIpfsUri); const validation = validateMetaData(res); if (!validation.valid) { throw new MalformedDataError(`Invalid metadata at ${cidOrIpfsUri}`, { errors: validation.errors }); } - return res; + return validation.data as HypercertMetadata; } /** - * Stores arbitrary data in Web3 storage. - * @param data The data to store. - * @returns A Promise that resolves to the CID of the stored data. - * @throws A `StorageError` if the storage client is not configured. - * @notice Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. + * Stores data using the Web3 Storage client. + * + * This method first checks if the storage is read-only or if the Web3 Storage client is not configured. If either of these conditions is true, it throws a `StorageError`. + * It then creates a new Blob from the provided data and stores it using the Web3 Storage client. If the storage operation fails, it throws a `StorageError`. + * + * @param {unknown} data - The data to store. This can be any type of data. + * @returns {Promise} A promise that resolves to the CID of the stored data. + * @throws {StorageError} Will throw a `StorageError` if the storage is read-only, if the Web3 Storage client is not configured, or if the storage operation fails. + * + * @remarks Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. * Because we pay for storage quotas, this data is stored best effort. * If you are using our default keys, we may delete older data if we hit our storage quota. */ @@ -150,12 +154,18 @@ export default class HypercertsStorage implements HypercertStorageInterface { } /** - * Gets arbitrary data from Web3 storage. - * @param cidOrIpfsUri The CID or IPFS URI of the data to get. - * @returns A Promise that resolves to the data. - * @throws A `StorageError` if the storage client is not configured or the data cannot be retrieved. + * Retrieves data from IPFS using the provided CID or IPFS URI. + * + * This method first retrieves the data from IPFS using the `getFromIPFS` function. It then parses the retrieved data as JSON and returns it. + * + * @param {string} cidOrIpfsUri - The CID or IPFS URI of the data to retrieve. + * @returns {Promise} A promise that resolves to the retrieved data. + * @throws {FetchError} Will throw a `FetchError` if the retrieval operation fails. + * @throws {MalformedDataError} Will throw a `MalformedDataError` if the retrieved data is not a single file. + * + * @remarkts Note: The original implementation using the Web3 Storage client is currently commented out due to issues with upstream repos. This will be replaced once those issues are resolved. */ - public async getData(cidOrIpfsUri: string) { + public async getData(cidOrIpfsUri: string): Promise { /** // Using the default web3.storage client is not working in upstream repos. Needs further testing. const cid = getCid(cidOrIpfsUri); @@ -183,18 +193,6 @@ export default class HypercertsStorage implements HypercertStorageInterface { */ // TODO: replace current temporary fix of just using NFT.Storage IPFS gateway - const res = await this.getFromIPFS(cidOrIpfsUri); - - return res; + return await fetchers.getFromIPFS(cidOrIpfsUri); } - - getNftStorageGatewayUri = (cidOrIpfsUri: string) => { - const NFT_STORAGE_IPFS_GATEWAY = "https://nftstorage.link/ipfs/{cid}"; - return NFT_STORAGE_IPFS_GATEWAY.replace("{cid}", getCid(cidOrIpfsUri)); - }; - - getWeb3StorageGatewayUri = (cidOrIpfsUri: string) => { - const WEB3_STORAGE_IPFS_GATEWAY = "https://w3s.link/ipfs/{cid}"; - return WEB3_STORAGE_IPFS_GATEWAY.replace("{cid}", getCid(cidOrIpfsUri)); - }; } diff --git a/sdk/src/types/hypercerts.ts b/sdk/src/types/hypercerts.ts index 9851d633..82f03c55 100644 --- a/sdk/src/types/hypercerts.ts +++ b/sdk/src/types/hypercerts.ts @@ -1,8 +1,10 @@ /** - * Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol - * @dev AllowAll: All transfers are allowed - * @dev DisallowAll: All transfers are disallowed - * @dev FromCreatorOnly: Only the creator can transfer the Hypercert + * Represents the possible transfer restrictions of a claim matching the hypercerts protocol. + * + * @typedef {Object} TransferRestrictions + * @property {number} AllowAll - Represents no restrictions on the transfer of the claim. + * @property {number} DisallowAll - Represents complete restriction on the transfer of the claim. + * @property {number} FromCreatorOnly - Represents that the claim can only be transferred by its creator. */ export const TransferRestrictions = { AllowAll: 0, @@ -13,9 +15,11 @@ export const TransferRestrictions = { export type TransferRestrictions = (typeof TransferRestrictions)[keyof typeof TransferRestrictions]; /** - * Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol - * @param address - Address of the recipient - * @param units - Number of units allocated to the recipient + * Represents an entry in an allowlist. + * + * @typedef {Object} AllowlistEntry + * @property {string} address - The address of the entry. + * @property {bigint} units - The units associated with the entry. */ export type AllowlistEntry = { address: string; diff --git a/sdk/src/utils/adapters.ts b/sdk/src/utils/adapters.ts index 9c33a336..6108b01a 100644 --- a/sdk/src/utils/adapters.ts +++ b/sdk/src/utils/adapters.ts @@ -3,6 +3,19 @@ import { PublicClient, HttpTransport, WalletClient } from "viem"; import logger from "./logger"; import { Signer, TypedDataSigner } from "@ethersproject/abstract-signer"; +/** + * This function converts a `PublicClient` instance to an ethers.js `Provider` to faciliate compatibility between ethers and viem. + * + * It extracts the chain and transport from the `PublicClient` and creates a network object. + * If no chain is found in the `PublicClient`, it logs a warning and stops the signature request. + * If the transport type is "fallback", it creates a `FallbackProvider` with multiple transports. + * Otherwise, it creates a `JsonRpcProvider` with a single transport. + * + * Ref: https://viem.sh/docs/ethers-migration.html + * + * @param publicClient - The `PublicClient` instance to convert. + * @returns An ethers.js `Provider` instance, or `undefined` if no chain is found in the `PublicClient`. + */ export function publicClientToProvider(publicClient: PublicClient) { const { chain, transport } = publicClient; if (!chain) { @@ -23,6 +36,18 @@ export function publicClientToProvider(publicClient: PublicClient) { return new providers.JsonRpcProvider(transport.url, network); } +/** + * This function converts a `WalletClient` instance to an ethers.js `Signer` to faciliate compatibility between ethers and viem. + * + * It extracts the account, chain, and transport from the `WalletClient` and creates a network object. + * If no chain is found in the `WalletClient`, it logs a warning and stops the signature request. + * It then creates a `Web3Provider` with the transport and network, and gets a `Signer` from the provider using the account's address. + * + * Ref: https://viem.sh/docs/ethers-migration.html + * + * @param walletClient - The `WalletClient` instance to convert. + * @returns An ethers.js `Signer` instance, or `undefined` if no chain is found in the `WalletClient`. + */ export function walletClientToSigner(walletClient: WalletClient) { const { account, chain, transport } = walletClient; if (!chain) { diff --git a/sdk/src/utils/allowlist.ts b/sdk/src/utils/allowlist.ts new file mode 100644 index 00000000..634c5eab --- /dev/null +++ b/sdk/src/utils/allowlist.ts @@ -0,0 +1,46 @@ +import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; +import fetchers from "./fetchers"; +import logger from "./logger"; + +const getMerkleTreeFromIPFS = async (cidOrIpfsUri: string) => { + const data = await fetchers.getFromIPFS(cidOrIpfsUri); + const allowlist = typeof data === "string" ? data : undefined; + + if (!allowlist) { + throw new Error(`Invalid allowlist at ${cidOrIpfsUri}`); + } + + const tree = StandardMerkleTree.load(JSON.parse(allowlist)); + + if (!tree) { + throw new Error(`Invalid allowlist at ${cidOrIpfsUri}`); + } + + return tree; +}; + +/** + * This function retrieves proofs from an allowlist. + * + * It fetches a Merkle tree from IPFS using a given CID or IPFS URI, then iterates over the tree to find an account. + * When the account is found, it generates a proof for that account and logs the account, index, and proof as debug. + * It returns the proof and the root of the Merkle tree. + * + * @param cidOrIpfsUri - The CID or IPFS URI to fetch the Merkle tree from. + * @param account - The account to find in the Merkle tree. + * @returns An object containing the proof for the account and the root of the Merkle tree. + * @throws Will throw an error if the Merkle tree cannot be fetched. + * @async + */ +const getProofsFromAllowlist = async (cidOrIpfsUri: string, account: `0x${string}`) => { + const tree = await getMerkleTreeFromIPFS(cidOrIpfsUri); + for (const [i, v] of tree.entries()) { + if (v[0] === account) { + const proof = tree.getProof(i); + logger.debug(`Found ${account} at index ${i} with proof ${proof}`); + return { proof, root: tree.root }; + } + } +}; + +export default { getProofsFromAllowlist }; diff --git a/sdk/src/utils/config.ts b/sdk/src/utils/config.ts index d8ad86d3..cbc9c70a 100644 --- a/sdk/src/utils/config.ts +++ b/sdk/src/utils/config.ts @@ -14,14 +14,25 @@ import { createPublicClient, http, isAddress } from "viem"; import { deployments } from "../../src"; /** - * Returns the configuration for the Hypercert client, based on the given overrides. - * @param config An object containing overrides for the default configuration. - * @returns The configuration for the Hypercert client. - * @throws An `ConfigurationError` if the `environment` in `config` is not a supported environment, or if the chain ID was not found. - * @dev 5, 10, 42220, 11155111 and "test", "production" are supported environments. - * Test and production merge the Graphs by environment, while the chain IDs are specific to the chain. + * Returns a configuration object for the Hypercert client. + * + * This function first retrieves the chain configuration, then checks if there are any overrides provided. If the `unsafeForceOverrideConfig` flag is set, + * it validates the overrides and uses them to create the base deployment configuration. If the flag is not set, it retrieves the deployment configuration + * for the provided chain ID or the default chain ID. It then merges the base deployment configuration with the overrides and the values retrieved from + * environment variables to create the final configuration object. If any required properties are missing, it logs a warning. + * + * Current supported chain IDs are: + * - 5: Goerli + * - 10: Optimism + * - 42220: Celo + * - 11155111: Sepolia + * + * @param {Partial} overrides - An object containing any configuration values to override. This should be a partial HypercertClientConfig object. + * @returns {Partial} The final configuration object for the Hypercert client. + * @throws {InvalidOrMissingError} Will throw an `InvalidOrMissingError` if the `unsafeForceOverrideConfig` flag is set but the required overrides are not provided. + * @throws {UnsupportedChainError} Will throw an `UnsupportedChainError` if the default configuration for the provided chain ID is missing. */ -export const getConfig = (overrides: Partial) => { +export const getConfig = (overrides: Partial): Partial => { // Get the chainId, first from overrides, then environment variables, then the constant const chain = getChainConfig(overrides); if (!chain) { diff --git a/sdk/src/utils/fetchers.ts b/sdk/src/utils/fetchers.ts new file mode 100644 index 00000000..41d9003a --- /dev/null +++ b/sdk/src/utils/fetchers.ts @@ -0,0 +1,47 @@ +import { StorageError } from "../types/errors"; +import logger from "./logger"; +import axios from "axios"; + +/** + * Fetches data from IPFS using either the NFT Storage gateway or the Web3 Storage gateway. + * + * This function attempts to fetch data from the NFT Storage gateway first. If the request times out, it then tries to fetch the data from the Web3 Storage gateway. + * If the data cannot be fetched from either gateway, it throws a `StorageError`. + * + * @param {string} cidOrIpfsUri - The CID or IPFS URI of the data to fetch. + * @param {number} [timeout=10000] - The timeout for the fetch request in milliseconds. Defaults to 10000ms. + * @returns {Promise} The data fetched from IPFS. + * @throws {StorageError} Will throw a `StoragjeError` if the data cannot be fetched from either gateway. + * @async + */ +const getFromIPFS = async (cidOrIpfsUri: string, timeout: number = 10000): Promise => { + const nftStorageGatewayLink = getNftStorageGatewayUri(cidOrIpfsUri); + const web3StorageGatewayLink = getWeb3StorageGatewayUri(cidOrIpfsUri); + logger.debug(`Getting metadata ${cidOrIpfsUri} at ${nftStorageGatewayLink}`); + + const res = await axios.get(nftStorageGatewayLink, { timeout }).catch(() => { + logger.debug(`${nftStorageGatewayLink} timed out.`); + logger.debug(`Getting metadata ${cidOrIpfsUri} at ${web3StorageGatewayLink}`); + return axios.get(web3StorageGatewayLink, { timeout }); + }); + + if (!res || !res.data) { + throw new StorageError(`Failed to get ${cidOrIpfsUri}`); + } + + return res.data; +}; + +const getCid = (cidOrIpfsUri: string) => cidOrIpfsUri.replace("ipfs://", ""); + +const getNftStorageGatewayUri = (cidOrIpfsUri: string) => { + const NFT_STORAGE_IPFS_GATEWAY = "https://nftstorage.link/ipfs/{cid}"; + return NFT_STORAGE_IPFS_GATEWAY.replace("{cid}", getCid(cidOrIpfsUri)); +}; + +const getWeb3StorageGatewayUri = (cidOrIpfsUri: string) => { + const WEB3_STORAGE_IPFS_GATEWAY = "https://w3s.link/ipfs/{cid}"; + return WEB3_STORAGE_IPFS_GATEWAY.replace("{cid}", getCid(cidOrIpfsUri)); +}; + +export default { getFromIPFS }; diff --git a/sdk/src/utils/index.ts b/sdk/src/utils/index.ts new file mode 100644 index 00000000..d4dccf7b --- /dev/null +++ b/sdk/src/utils/index.ts @@ -0,0 +1,7 @@ +import { walletClientToSigner, publicClientToProvider } from "./adapters"; + +import allowlist from "./allowlist"; +import fetchers from "./fetchers"; +import { formatHypercertData } from "./formatter"; + +export { walletClientToSigner, publicClientToProvider, allowlist, fetchers, formatHypercertData }; diff --git a/sdk/src/validator/index.ts b/sdk/src/validator/index.ts index e843fd84..dc592083 100644 --- a/sdk/src/validator/index.ts +++ b/sdk/src/validator/index.ts @@ -7,6 +7,7 @@ import metaDataSchema from "../resources/schema/metadata.json"; import { AllowlistEntry, DuplicateEvaluation, + EvaluationData, HypercertClaimdata, HypercertMetadata, MintingError, @@ -20,25 +21,33 @@ ajv.addSchema(claimDataSchema, "claimData"); ajv.addSchema(evaluationSchema, "evaluation.json"); /** - * The result of a validation. - * @property valid - Whether the data is valid. - * @property errors - A map of errors, where the key is the field that failed validation and the value is the error message. + * Represents the result of a validation operation. + * + * This type is used to return the result of validating data against a schema. It includes a `valid` flag that indicates + * whether the data is valid, and an `errors` object that contains any errors that occurred during validation. + * */ type ValidationResult = { + data: AllowlistEntry[] | EvaluationData | HypercertClaimdata | HypercertMetadata | unknown; valid: boolean; - errors: Record; + errors: Record; }; /** - * Validates the data for a simple text evaluation. - * @param data The data to validate. - * @returns A `ValidationResult` object indicating whether the data is valid and any errors that were found. + * Validates Hypercert metadata. + * + * This function uses the AJV library to validate the metadata. It first retrieves the schema for the metadata, + * then validates the data against the schema. If the schema is not found, it returns an error. If the data does not + * conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. + * + * @param {unknown} data - The metadata to validate. This should be an object that conforms to the HypercertMetadata type. + * @returns {ValidationResult} An object that includes a validity flag and any errors that occurred during validation. */ -const validateMetaData = (data: HypercertMetadata): ValidationResult => { +const validateMetaData = (data: unknown): ValidationResult => { const schemaName = "metaData"; const validate = ajv.getSchema(schemaName); if (!validate) { - return { valid: false, errors: { schema: "Schema not found" } }; + return { data, valid: false, errors: { schema: "Schema not found" } }; } if (!validate(data)) { @@ -49,22 +58,27 @@ const validateMetaData = (data: HypercertMetadata): ValidationResult => { errors[key] = e.message; } } - return { valid: false, errors }; + return { data, valid: false, errors }; } - return { valid: true, errors: {} }; + return { data: data as HypercertMetadata, valid: true, errors: {} }; }; /** - * Validates the data for a simple text evaluation. - * @param data The data to validate. - * @returns A `ValidationResult` object indicating whether the data is valid and any errors that were found. + * Validates Hypercert claim data. + * + * This function uses the AJV library to validate the claim data. It first retrieves the schema for the claim data, + * then validates the data against the schema. If the schema is not found, it returns an error. If the data does not + * conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. + * + * @param {unknown} data - The claim data to validate. This should be an object that conforms to the HypercertClaimdata type. + * @returns {ValidationResult} An object that includes a validity flag and any errors that occurred during validation. */ -const validateClaimData = (data: HypercertClaimdata): ValidationResult => { +const validateClaimData = (data: unknown): ValidationResult => { const schemaName = "claimData"; const validate = ajv.getSchema(schemaName); if (!validate) { - return { valid: false, errors: { schema: "Schema not found" } }; + return { data, valid: false, errors: { schema: "Schema not found" } }; } if (!validate(data)) { @@ -75,19 +89,23 @@ const validateClaimData = (data: HypercertClaimdata): ValidationResult => { errors[key] = e.message; } } - return { valid: false, errors }; + return { data, valid: false, errors }; } - return { valid: true, errors: {} }; + return { data: data as HypercertClaimdata, valid: true, errors: {} }; }; /** - * Validates the data for an allowlist. - * @param data The data to validate. - * @param units The total number of units in the allowlist. - * @returns A `ValidationResult` object indicating whether the data is valid and any errors that were found. + * Validates an array of allowlist entries. + * + * This function checks that the total units in the allowlist match the expected total units, that the total units are greater than 0, + * and that all addresses in the allowlist are valid Ethereum addresses. It returns an object that includes a validity flag and any errors that occurred during validation. + * + * @param {AllowlistEntry[]} data - The allowlist entries to validate. Each entry should be an object that includes an address and a number of units. + * @param {bigint} units - The expected total units in the allowlist. + * @returns {ValidationResult} An object that includes a validity flag and any errors that occurred during validation. The keys in the errors object are the names of the invalid properties, and the values are the error messages. */ -const validateAllowlist = (data: AllowlistEntry[], units: bigint) => { +const validateAllowlist = (data: AllowlistEntry[], units: bigint): ValidationResult => { const errors: Record = {}; const totalUnits = data.reduce((acc, curr) => acc + BigInt(curr.units.toString()), 0n); if (totalUnits != units) { @@ -105,18 +123,23 @@ const validateAllowlist = (data: AllowlistEntry[], units: bigint) => { errors["address"] = filteredAddresses.map((entry) => entry.address); } - return { valid: Object.keys(errors).length === 0, errors }; + return { data, valid: Object.keys(errors).length === 0, errors }; }; /** - * Validates the data for a duplicate evaluation. - * @param data The data to validate. - * @returns A `ValidationResult` object indicating whether the data is valid and any errors that were found. + * Validates duplicate evaluation data. + * + * This function uses the AJV library to validate the duplicate evaluation data. It first retrieves the schema for the duplicate evaluation data, + * then validates the data against the schema. If the schema is not found, it returns an error. If the data does not + * conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. + * + * @param {DuplicateEvaluation} data - The duplicate evaluation data to validate. This should be an object that conforms to the DuplicateEvaluation type. + * @returns {ValidationResult} An object that includes a validity flag and any errors that occurred during validation. */ const validateDuplicateEvaluationData = (data: DuplicateEvaluation): ValidationResult => { const validate = ajv.getSchema("evaluation.json#/definitions/DuplicateEvaluation"); if (!validate) { - return { valid: false, errors: { schema: "Schema not found" } }; + return { data, valid: false, errors: { schema: "Schema not found" } }; } if (!validate(data)) { @@ -127,21 +150,26 @@ const validateDuplicateEvaluationData = (data: DuplicateEvaluation): ValidationR errors[key] = e.message; } } - return { valid: false, errors }; + return { data, valid: false, errors }; } - return { valid: true, errors: {} }; + return { data, valid: true, errors: {} }; }; /** - * Validates the data for a simple text evaluation. - * @param data The data to validate. - * @returns A `ValidationResult` object indicating whether the data is valid and any errors that were found. + * Validates simple text evaluation data against a predefined schema. + * + * This function uses the AJV library to validate the simple text evaluation data. It first retrieves the schema for the simple text evaluation data, + * then validates the data against the schema. If the schema is not found, it returns an error. If the data does not + * conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. + * + * @param {SimpleTextEvaluation} data - The simple text evaluation data to validate. This should be an object that conforms to the SimpleTextEvaluation type. + * @returns {ValidationResult} An object that includes a validity flag and any errors that occurred during validation. */ const validateSimpleTextEvaluationData = (data: SimpleTextEvaluation): ValidationResult => { const validate = ajv.getSchema("evaluation.json#/definitions/SimpleTextEvaluation"); if (!validate) { - return { valid: false, errors: { schema: "Schema not found" } }; + return { data, valid: false, errors: { schema: "Schema not found" } }; } if (!validate(data)) { @@ -152,19 +180,23 @@ const validateSimpleTextEvaluationData = (data: SimpleTextEvaluation): Validatio errors[key] = e.message; } } - return { valid: false, errors }; + return { data, valid: false, errors }; } - return { valid: true, errors: {} }; + return { data, valid: true, errors: {} }; }; /** - * Verifies a Merkle proof for a given address and units. - * @param root The Merkle root hash to verify against. - * @param signerAddress The address to verify. - * @param units The units to verify. - * @param proof The Merkle proof to verify. - * @throws {MintingError} If the Merkle proof verification fails. + * Verifies a Merkle proof for a given root, signer address, units, and proof. + * + * This function first checks if the signer address is a valid Ethereum address. If it's not, it throws a `MintingError`. + * It then verifies the Merkle proof using the `StandardMerkleTree.verify` method. If the verification fails, it throws a `MintingError`. + * + * @param {string} root - The root of the Merkle tree. + * @param {string} signerAddress - The signer's Ethereum address. + * @param {bigint} units - The number of units. + * @param {string[]} proof - The Merkle proof to verify. + * @throws {MintingError} Will throw a `MintingError` if the signer address is invalid or if the Merkle proof verification fails. */ function verifyMerkleProof(root: string, signerAddress: string, units: bigint, proof: string[]): void { if (!isAddress(signerAddress)) { @@ -178,13 +210,16 @@ function verifyMerkleProof(root: string, signerAddress: string, units: bigint, p } /** - * Batch verifies Merkle proofs for multiple roots, units and proofs for a single address - * @param roots The Merkle root hashes to verify against. - * @param signerAddress The address to verify. - * @param units The units to verify. - * @param proofs The Merkle proofs to verify. - * @throws {MintingError} If the Merkle proof verification fails. - * @notice Wrapper around `verifyMerkleProof` to batch verify multiple proofs + * Verifies multiple Merkle proofs for given roots, a signer address, units, and proofs. + * + * This function first checks if the lengths of the roots, units, and proofs arrays are equal. If they're not, it throws a `MintingError`. + * It then iterates over the arrays and verifies each Merkle proof using the `verifyMerkleProof` function. If any verification fails, it throws a `MintingError`. + * + * @param {string[]} roots - The roots of the Merkle trees. + * @param {string} signerAddress - The signer's Ethereum address. + * @param {bigint[]} units - The numbers of units. + * @param {string[][]} proofs - The Merkle proofs to verify. + * @throws {MintingError} Will throw a `MintingError` if the lengths of the input arrays are not equal or if any Merkle proof verification fails. */ function verifyMerkleProofs(roots: string[], signerAddress: string, units: bigint[], proofs: string[][]) { if (roots.length !== units.length || units.length !== proofs.length) { diff --git a/sdk/test/storage/nft.storage.test.ts b/sdk/test/storage/nft.storage.test.ts index d5244a4d..c78d96a5 100644 --- a/sdk/test/storage/nft.storage.test.ts +++ b/sdk/test/storage/nft.storage.test.ts @@ -3,36 +3,34 @@ import { jest } from "@jest/globals"; // @ts-ignore import { NFTStorage } from "nft.storage"; -import HypercertsStorage from "../../src/storage.js"; -import { MalformedDataError } from "../../src/types/errors.js"; -import { HypercertMetadata } from "../../src/types/metadata.js"; -import { getFormattedMetadata, mockDataSets } from "../helpers.js"; +import HypercertsStorage from "../../src/storage"; +import { MalformedDataError } from "../../src/types/errors"; +import { HypercertMetadata } from "../../src/types/metadata"; +import { getFormattedMetadata, mockDataSets } from "../helpers"; +import fetchers from "../../src/utils/fetchers"; +import sinon from "sinon"; describe("NFT.Storage Client", () => { - const { hypercertData, hypercertMetadata } = mockDataSets; + const { hypercertMetadata } = mockDataSets; const storeBlobMock = jest.spyOn(NFTStorage.prototype, "storeBlob").mockImplementation((_: unknown, __?: unknown) => { return Promise.resolve(hypercertMetadata.cid); }); + const ipfsFetcherMock = sinon.stub(fetchers, "getFromIPFS"); + const storage = new HypercertsStorage({ nftStorageToken: process.env.NFT_STORAGE_TOKEN, web3StorageToken: process.env.WEB3_STORAGE_TOKEN, }); - jest.spyOn(storage, "getFromIPFS").mockImplementation((cid: string) => { - if (cid === hypercertMetadata.cid) return Promise.resolve(hypercertMetadata.data); - if (cid === hypercertData.cid) return Promise.resolve(hypercertData.data); - - return Promise.resolve("testData"); - }); - afterEach(() => { jest.clearAllMocks(); }); afterAll(() => { jest.resetAllMocks(); + sinon.resetBehavior(); }); /** @@ -44,6 +42,7 @@ describe("NFT.Storage Client", () => { }); it("Smoke test - get metadata", async () => { + ipfsFetcherMock.returns(Promise.resolve(hypercertMetadata.data)); const res = await storage.getMetadata(hypercertMetadata.cid); expect(res).toMatchObject(hypercertMetadata.data); @@ -65,6 +64,8 @@ describe("NFT.Storage Client", () => { it("Throws when trying to fetch incorrect metadata", async () => { const incorrectCID = "incorrect-cid"; + + ipfsFetcherMock.resolves({ data: "false" }); // storeData try { await storage.getMetadata(incorrectCID); diff --git a/sdk/test/storage/web3.storage.test.ts b/sdk/test/storage/web3.storage.test.ts index e5845098..a3d5af8e 100644 --- a/sdk/test/storage/web3.storage.test.ts +++ b/sdk/test/storage/web3.storage.test.ts @@ -5,6 +5,8 @@ import { Web3Storage } from "web3.storage"; import HypercertsStorage from "../../src/storage"; import { mockDataSets } from "../helpers"; +import fetchers from "../../src/utils/fetchers"; +import sinon from "sinon"; describe("Web3.Storage Client", () => { const { hypercertData, hypercertMetadata } = mockDataSets; @@ -13,24 +15,20 @@ describe("Web3.Storage Client", () => { return Promise.resolve(hypercertMetadata.cid); }); + const ipfsFetcherMock = sinon.stub(fetchers, "getFromIPFS"); + const storage = new HypercertsStorage({ nftStorageToken: process.env.NFT_STORAGE_TOKEN, web3StorageToken: process.env.WEB3_STORAGE_TOKEN, }); - jest.spyOn(storage, "getFromIPFS").mockImplementation((cid: string) => { - if (cid === hypercertMetadata.cid) return Promise.resolve(hypercertMetadata.data); - if (cid === hypercertData.cid) return Promise.resolve(hypercertData.data); - - return Promise.resolve("testData"); - }); - afterEach(() => { jest.clearAllMocks(); }); afterAll(() => { jest.resetAllMocks(); + sinon.resetBehavior(); }); /** @@ -42,6 +40,7 @@ describe("Web3.Storage Client", () => { }); it("Smoke test - get data", async () => { + ipfsFetcherMock.returns(Promise.resolve(hypercertData.data)); const res = await storage.getData(hypercertData.cid); expect(res).toMatchObject(hypercertData.data); diff --git a/sdk/test/utils/allowlist.test.ts b/sdk/test/utils/allowlist.test.ts new file mode 100644 index 00000000..61fa4f90 --- /dev/null +++ b/sdk/test/utils/allowlist.test.ts @@ -0,0 +1,48 @@ +import chai, { expect } from "chai"; +import chaiSubset from "chai-subset"; +import sinon from "sinon"; + +import { faker } from "@faker-js/faker"; +import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; +import fetchers from "../../src/utils/fetchers"; +import allowlistUtils from "../../src/utils/allowlist"; + +chai.use(chaiSubset); + +const createAllowlist = async () => { + const allowlist = new Array(10).fill(0).map((_x) => ({ + address: faker.finance.ethereumAddress() as `0x${string}`, + units: 1n, + })); + + // create allowlist + const tuples = allowlist.map((p) => [p.address, p.units.toString()]); + const tree = StandardMerkleTree.of(tuples, ["address", "uint256"]); + + return { allowlist, tree }; +}; + +describe("Fetchers", () => { + const ipfsFetcherMock = sinon.stub(fetchers, "getFromIPFS"); + + afterEach(() => { + sinon.restore(); + }); + + it("Proof: should return valid proof and root", async () => { + const { allowlist, tree } = await createAllowlist(); + + const stub = ipfsFetcherMock.resolves(Promise.resolve(JSON.stringify(tree.dump()))); + + const res = await allowlistUtils.getProofsFromAllowlist("test", allowlist[0].address); + + expect(res).to.containSubset({ + proof: tree.getProof(0), + root: tree.root, + }); + + expect(res?.proof).to.deep.equal(tree.getProof(0)); + expect(res?.root).to.deep.equal(tree.root); + expect(stub.calledOnce).to.be.true; + }); +}); diff --git a/sdk/test/utils/fetchers.test.ts b/sdk/test/utils/fetchers.test.ts new file mode 100644 index 00000000..cd868b6b --- /dev/null +++ b/sdk/test/utils/fetchers.test.ts @@ -0,0 +1,37 @@ +import chai, { expect } from "chai"; +import chaiSubset from "chai-subset"; +import sinon from "sinon"; + +import fetchers from "../../src/utils/fetchers"; +import axios from "axios"; + +chai.use(chaiSubset); + +describe("Fetchers", () => { + afterEach(() => { + sinon.restore(); + }); + + it("IPFS: should return data from IPFS", async () => { + const validResponse = { data: "TEST_PASSED" }; + const axiosStub = sinon.stub(axios, "get").resolves(Promise.resolve(validResponse)); + + const res = await fetchers.getFromIPFS("test"); + expect(res).to.equal(validResponse.data); + expect(axiosStub.calledOnce).to.be.true; + }); + + it("IPFS: should try another endpoint after the first fails", async () => { + const validResponse = { data: "TEST_PASSED" }; + const axiosStub = sinon + .stub(axios, "get") + .onFirstCall() + .rejects() + .onSecondCall() + .resolves(Promise.resolve(validResponse)); + + const res = await fetchers.getFromIPFS("test"); + expect(res).to.equal(validResponse.data); + expect(axiosStub.calledTwice).to.be.true; + }); +}); From 44baf472cd3a9cc10d9faf3db7c3b17a9c634ace Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Wed, 8 Nov 2023 14:06:13 +0100 Subject: [PATCH 011/118] Add hypercerts to marketplace functionality (#1170) * Feat/batch burn (#1051) * feat(batch_burn): add batch burn function * fix(docs): update SemiFungible1155 docs * chore(lint): cleanup lint ignores * chore(lint): defender lint errors * chore(deploy): reduce optimizer run for kb limit * chore(script): update upgrade script * feat(gha): split graph deploy develop-main * chore(lint): line length rule to warn from err * chore(gha): run CI on PR to develop * chore(gha): run e2e,ci on pr,push to develop * feat(graph): update graph for burn methods * chore(turbo): split graph deploys (#1055) * Fix/workspace label (#1060) chore(yarn): update workspace label * 1052 subgraph a claimed token should indicate whether it was claimed from an allowlist (#1058) * fix(graph): link claim with allowlist * chore(tweak): yada * fix(graph): update mapping to claim (#1061) * nitial trader implementation (#1063) * feat(iface): draft of trader interface * feat(trader): simple offer, buy, cancel flow * feat(db): update allowlist query (#1057) * feat(test): tweaks and initial tests for Trader * chore(gha): remove hardcoded foundry nightly * feat(test): add initial test for trader sales * feat(test): sales tests * feat(deploy): deployed to goerli * chore(ci): updated hh scripts for trader contract * feat(pause): pausable controls and tests * feat(trader): init trader graph * feat(tokens): surface accepted tokens (#1065) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * Feat/accepted tokens (#1066) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * chore(address): update trader address graph * fix(import): add bigint to import * Feat/accepted tokens (#1067) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * chore(address): update trader address graph * fix(import): add bigint to import * fix(log): add logging to trader mapping * chore(prep): protocol contracts to protocol dir * chore(prep): tests to protocol dir and remappings * chore(license): MIT license * Feat/init marketplace (#1139) * chore(prep): protocol contracts to protocol dir * chore(prep): tests to protocol dir and remappings * chore(license): MIT license * feat(marketplace): inject, build, refactor, test * chore(gha): run gha on push and develop-branches * fix(build): build and lint errors * chore(pnpm): refresh lock file * chore(build): reduce turbo concurrency * fix(build): whac a mole * chore(build): restore prettier in solhint * chore(build): env.template vars * chore(dist): clean and remap output contracts * chore(clean): last tests * fix(build): ignore cors-proxy type errors * chore(gha): add rpc env vars for fork testing --------- Co-authored-by: jipstavenuiter * chore(lint): cleanup config and affiliate flows (#1140) * chore(license): dual licensing contracts + repo (#1141) * [Test] Release marketplace contracts on testnet and add to contracts package (#1150) * feat(deploy): deploy to testnets * chore(build): hardhat build * feat(pack): release, test, bump updated contracts * chore(gha): updated env vars * chore(pnpm): updated lock file * fix(build): build error, replaced util with viem * fix(pnpm): root dir ethers resolution * chore(pnpm): updated lockfile * fix(pnpm): overrides * chore(build): resolving build issues sdk * chore(refactor): dep resolution bug - del eth v5 * fix(test): mock ipfs in minting, remove timeout * Direct Hypercert fraction sale (#1142) * feat(tranfer): transfer single hypercert fraction * feat(transfer): batch transfers and across collections * feat(transfer): reduce cyclomatic complexity * feat(offers): hypercert offer signatures * feat(transfer): standard txs tests hypercerts * chore(gha): only run on every push * fix(merge): merge artifacts --------- Co-authored-by: jipstavenuiter --- contracts/remappings.txt | 1 + .../src/marketplace/LooksRareProtocol.sol | 2 +- contracts/src/marketplace/TransferManager.sol | 75 +- .../src/marketplace/TransferSelectorNFT.sol | 2 +- .../interfaces/ITransferManager.sol | 2 +- .../protocol/interfaces/IHypercertToken.sol | 4 + .../foundry/marketplace/ProtocolBase.t.sol | 13 + .../SignaturesERC1271WalletForHypercert.t.sol | 454 + .../marketplace/StandardTransactions.t.sol | 2 +- .../StandardTransactionsHypercerts.t.sol | 523 + .../foundry/marketplace/StrategyManager.t.sol | 2 +- .../foundry/marketplace/TransferManager.t.sol | 280 +- .../marketplace/utils/MockOrderGenerator.sol | 48 +- contracts/test/mock/MockERC1155.sol | 4 +- .../mock/MockERC1155SupportsNoInterface.sol | 2 +- .../mock/MockERC1155WithoutAnyBalanceOf.sol | 2 +- .../mock/MockERC1155WithoutBalanceOfBatch.sol | 2 +- .../MockERC1155WithoutIsApprovedForAll.sol | 2 +- contracts/test/mock/MockERC20.sol | 2 +- contracts/test/mock/MockERC721.sol | 4 +- .../mock/MockERC721SupportsNoInterface.sol | 2 +- .../test/mock/MockERC721WithRoyalties.sol | 24 +- .../test/mock/MockHypercertMinterUUPS.sol | 21 + .../test/mock/MockRoyaltyFeeRegistry.sol | 22 +- contracts/test/mock/MockSmartWallet.sol | 2 +- .../marketplace/LooksRareProtocol.md | 2 +- .../protocol/interfaces/IHypercertToken.md | 17 + graph/src/hypercert-minter.ts | 3 +- pnpm-lock.yaml | 177 +- sdk/.graphclient/index.ts | 687 +- sdk/.graphclient/schema.graphql | 638 + .../sources/Hypercerts/introspectionSchema.ts | 12948 +++++++++++++--- .../sources/Hypercerts/schema.graphql | 638 + sdk/.graphclient/sources/Hypercerts/types.ts | 639 +- sdk/package.json | 1 + sdk/test/setup-env.ts | 1 + 36 files changed, 14687 insertions(+), 2561 deletions(-) create mode 100644 contracts/test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol create mode 100644 contracts/test/foundry/marketplace/StandardTransactionsHypercerts.t.sol create mode 100644 contracts/test/mock/MockHypercertMinterUUPS.sol diff --git a/contracts/remappings.txt b/contracts/remappings.txt index 6fdc5ec2..bd34895c 100644 --- a/contracts/remappings.txt +++ b/contracts/remappings.txt @@ -9,3 +9,4 @@ prb-test/=lib/prb-test/src/ @looksrare/=node_modules/@looksrare/ hardhat/=node_modules/hardhat/ solmate/=node_modules/solmate/ +@openzeppelin/=node_modules/@openzeppelin/ diff --git a/contracts/src/marketplace/LooksRareProtocol.sol b/contracts/src/marketplace/LooksRareProtocol.sol index b60e6e30..36302ff5 100644 --- a/contracts/src/marketplace/LooksRareProtocol.sol +++ b/contracts/src/marketplace/LooksRareProtocol.sol @@ -79,7 +79,7 @@ import {QuoteType} from "./enums/QuoteType.sol"; * ~~~ ~~~ * ~~~~ ~~~~ * ~~~~~~ - * @author LooksRare protocol team (👀,💎) + * @author LooksRare protocol team (👀,💎); bitbeckers */ contract LooksRareProtocol is ILooksRareProtocol, diff --git a/contracts/src/marketplace/TransferManager.sol b/contracts/src/marketplace/TransferManager.sol index cc1c9578..74bcf20f 100644 --- a/contracts/src/marketplace/TransferManager.sol +++ b/contracts/src/marketplace/TransferManager.sol @@ -239,26 +239,11 @@ contract TransferManager is ITransferManager, LowLevelERC721Transfer, LowLevelER CollectionType collectionType = items[i].collectionType; if (collectionType == CollectionType.ERC721) { - for (uint256 j; j < itemIdsLengthForSingleCollection;) { - if (amounts[j] != 1) { - revert AmountInvalid(); - } - _executeERC721TransferFrom(items[i].collection, from, to, itemIds[j]); - unchecked { - ++j; - } - } + _processBatch721Collection(items[i], from, to); } else if (collectionType == CollectionType.ERC1155) { - for (uint256 j; j < itemIdsLengthForSingleCollection;) { - if (amounts[j] == 0) { - revert AmountInvalid(); - } - - unchecked { - ++j; - } - } - _executeERC1155SafeBatchTransferFrom(items[i].collection, from, to, itemIds, amounts); + _processBatch1155Collection(items[i], from, to); + } else if (collectionType == CollectionType.Hypercert) { + _processBatchHypercertCollection(items[i], from, to); } unchecked { @@ -372,4 +357,56 @@ contract TransferManager is ITransferManager, LowLevelERC721Transfer, LowLevelER revert TransferCallerInvalid(); } + + function _processBatch721Collection(BatchTransferItem calldata batchItems, address from, address to) private { + uint256[] calldata itemIds = batchItems.itemIds; + uint256[] calldata amounts = batchItems.amounts; + uint256 length = itemIds.length; + + for (uint256 j; j < length;) { + if (amounts[j] != 1) { + revert AmountInvalid(); + } + _executeERC721TransferFrom(batchItems.collection, from, to, itemIds[j]); + unchecked { + ++j; + } + } + } + + function _processBatch1155Collection(BatchTransferItem calldata batchItems, address from, address to) private { + uint256[] calldata itemIds = batchItems.itemIds; + uint256[] calldata amounts = batchItems.amounts; + uint256 length = itemIds.length; + + for (uint256 j; j < length;) { + if (amounts[j] == 0) { + revert AmountInvalid(); + } + + unchecked { + ++j; + } + } + _executeERC1155SafeBatchTransferFrom(batchItems.collection, from, to, itemIds, amounts); + } + + function _processBatchHypercertCollection(BatchTransferItem calldata batchItems, address from, address to) + private + { + uint256[] calldata itemIds = batchItems.itemIds; + uint256[] calldata amounts = batchItems.amounts; + uint256 length = itemIds.length; + + for (uint256 j; j < length;) { + if (amounts[j] == 0) { + revert AmountInvalid(); + } + + unchecked { + ++j; + } + } + _executeERC1155SafeBatchTransferFrom(batchItems.collection, from, to, itemIds, amounts); + } } diff --git a/contracts/src/marketplace/TransferSelectorNFT.sol b/contracts/src/marketplace/TransferSelectorNFT.sol index 8b4d201c..45869668 100644 --- a/contracts/src/marketplace/TransferSelectorNFT.sol +++ b/contracts/src/marketplace/TransferSelectorNFT.sol @@ -59,7 +59,7 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { } else if (collectionType == CollectionType.ERC1155) { transferManager.transferItemsERC1155(collection, sender, recipient, itemIds, amounts); } else if (collectionType == CollectionType.Hypercert) { - transferManager.transferItemsERC1155(collection, sender, recipient, itemIds, amounts); + transferManager.transferItemsHypercert(collection, sender, recipient, itemIds, amounts); } else if (collectionType == CollectionType.Hyperboard) { revert UnsupportedCollectionType(); } diff --git a/contracts/src/marketplace/interfaces/ITransferManager.sol b/contracts/src/marketplace/interfaces/ITransferManager.sol index 8f19f9a4..77745be1 100644 --- a/contracts/src/marketplace/interfaces/ITransferManager.sol +++ b/contracts/src/marketplace/interfaces/ITransferManager.sol @@ -15,7 +15,7 @@ interface ITransferManager { /** * @notice This struct is only used for transferBatchItemsAcrossCollections. * @param collection Collection address - * @param collectionType 0 for ERC721, 1 for ERC1155 + * @param collectionType 0 for ERC721, 1 for ERC1155, 2 for Hypercert, 3 for Hyperboard * @param itemIds Array of item ids to transfer * @param amounts Array of amounts to transfer */ diff --git a/contracts/src/protocol/interfaces/IHypercertToken.sol b/contracts/src/protocol/interfaces/IHypercertToken.sol index ff280c2e..afd257bf 100644 --- a/contracts/src/protocol/interfaces/IHypercertToken.sol +++ b/contracts/src/protocol/interfaces/IHypercertToken.sol @@ -46,6 +46,10 @@ interface IHypercertToken { /// @notice Operator must be allowed by `creator` and the token must represent the total amount of available units. function burnFraction(address account, uint256 tokenID) external; + /// @dev Function to burn the tokens at `tokenIDs` for `account` + /// @notice Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + function batchBurnFraction(address account, uint256[] memory tokenIDs) external; + /// @dev Returns the `units` held by a (fractional) token at `claimID` /// @dev If `tokenID` is a base type, the total amount of `units` for the claim is returned. /// @dev If `tokenID` is a fractional token, the `units` held by the token is returned diff --git a/contracts/test/foundry/marketplace/ProtocolBase.t.sol b/contracts/test/foundry/marketplace/ProtocolBase.t.sol index 8c3cee4b..e0af4b8e 100644 --- a/contracts/test/foundry/marketplace/ProtocolBase.t.sol +++ b/contracts/test/foundry/marketplace/ProtocolBase.t.sol @@ -11,6 +11,8 @@ import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; import {LooksRareProtocol, ILooksRareProtocol} from "@hypercerts/marketplace/LooksRareProtocol.sol"; import {TransferManager} from "@hypercerts/marketplace/TransferManager.sol"; import {ProtocolFeeRecipient} from "@hypercerts/marketplace/ProtocolFeeRecipient.sol"; +import {HypercertMinter} from "@hypercerts/protocol/HypercertMinter.sol"; +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; // Other contracts import {OrderValidatorV2A} from "@hypercerts/marketplace/helpers/OrderValidatorV2A.sol"; @@ -21,6 +23,7 @@ import {MockERC721} from "../../mock/MockERC721.sol"; import {MockERC721WithRoyalties} from "../../mock/MockERC721WithRoyalties.sol"; import {MockERC1155} from "../../mock/MockERC1155.sol"; import {MockRoyaltyFeeRegistry} from "../../mock/MockRoyaltyFeeRegistry.sol"; +import {MockHypercertMinterUUPS} from "../../mock/MockHypercertMinterUUPS.sol"; // Utils import {MockOrderGenerator} from "./utils/MockOrderGenerator.sol"; @@ -32,6 +35,11 @@ contract ProtocolBase is MockOrderGenerator, ILooksRareProtocol { MockERC721WithRoyalties public mockERC721WithRoyalties; MockERC721 public mockERC721; MockERC1155 public mockERC1155; + MockHypercertMinterUUPS public mockHypercertMinterUUPS; + HypercertMinter public mockHypercertMinter; + + IHypercertToken.TransferRestrictions public constant FROM_CREATOR_ONLY = + IHypercertToken.TransferRestrictions.FromCreatorOnly; ProtocolFeeRecipient public protocolFeeRecipient; LooksRareProtocol public looksRareProtocol; @@ -125,6 +133,8 @@ contract ProtocolBase is MockOrderGenerator, ILooksRareProtocol { mockERC721.setApprovalForAll(address(transferManager), true); mockERC1155.setApprovalForAll(address(transferManager), true); mockERC721WithRoyalties.setApprovalForAll(address(transferManager), true); + mockHypercertMinter.setApprovalForAll(address(transferManager), true); + weth.approve(address(looksRareProtocol), type(uint256).max); // Grant approvals for transfer manager @@ -153,6 +163,9 @@ contract ProtocolBase is MockOrderGenerator, ILooksRareProtocol { looksRareToken = new MockERC20(); mockERC721 = new MockERC721(); mockERC1155 = new MockERC1155(); + mockHypercertMinterUUPS = new MockHypercertMinterUUPS(); + mockHypercertMinterUUPS.setUp(); + mockHypercertMinter = mockHypercertMinterUUPS.minter(); transferManager = new TransferManager(_owner); royaltyFeeRegistry = new MockRoyaltyFeeRegistry(_owner, 9500); diff --git a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol new file mode 100644 index 00000000..d2bac768 --- /dev/null +++ b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol @@ -0,0 +1,454 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries and interfaces +import {IReentrancyGuard} from "@looksrare/contracts-libs/contracts/interfaces/IReentrancyGuard.sol"; +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Mocks and other utils +import {ERC1271Wallet} from "./utils/ERC1271Wallet.sol"; +import {MaliciousERC1271Wallet} from "./utils/MaliciousERC1271Wallet.sol"; +import {MaliciousOnERC1155ReceivedERC1271Wallet} from "./utils/MaliciousOnERC1155ReceivedERC1271Wallet.sol"; +import {MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet} from + "./utils/MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet.sol"; +import {MaliciousIsValidSignatureERC1271Wallet} from "./utils/MaliciousIsValidSignatureERC1271Wallet.sol"; + +// Errors +import {SignatureERC1271Invalid} from "@looksrare/contracts-libs/contracts/errors/SignatureCheckerErrors.sol"; +import { + ERC1155SafeTransferFromFail, + ERC1155SafeBatchTransferFromFail +} from "@looksrare/contracts-libs/contracts/errors/LowLevelErrors.sol"; +import {SIGNATURE_INVALID_EIP1271} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +/** + * @dev ERC1271Wallet recovers a signature's signer using ECDSA. If it matches the mock wallet's + * owner, it returns the magic value. Otherwise it returns an empty bytes4 value. + */ +contract SignaturesERC1271WalletForHypercertTest is ProtocolBase { + uint256 private constant price = 1 ether; // Fixed price of sale + uint256 private constant fractionId = (1 << 128) + 1; + bytes private constant _EMPTY_SIGNATURE = new bytes(0); + + function setUp() public { + _setUp(); + _setUpUser(takerUser); + _setupRegistryRoyalties(address(mockHypercertMinter), _standardRoyaltyFee); + } + + function testTakerBid() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _takerBidSetup(address(wallet)); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + vm.startPrank(address(wallet)); + mockHypercertMinter.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + _assertValidMakerOrder(makerAsk, signature); + + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + assertEq(mockHypercertMinter.balanceOf(takerUser, fractionId), 1); + } + + function testTakerBidInvalidSignature() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _takerBidSetup(address(wallet)); + + // Signed by a different private key + bytes memory signature = _signMakerOrder(makerAsk, takerUserPK); + + vm.startPrank(address(wallet)); + mockHypercertMinter.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, SIGNATURE_INVALID_EIP1271); + + vm.expectRevert(SignatureERC1271Invalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerBidIsInvalidSignatureReentrancy() public { + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerBid); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _takerBidSetup(address(maliciousERC1271Wallet)); + + vm.expectRevert(IReentrancyGuard.ReentrancyFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, _EMPTY_SIGNATURE, _EMPTY_MERKLE_TREE); + } + + function testTakerAsk() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = _takerAskSetup(address(wallet)); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Wallet needs to hold WETH and have given WETH approval + deal(address(weth), address(wallet), price); + vm.prank(address(wallet)); + weth.approve(address(looksRareProtocol), price); + + _assertValidMakerOrder(makerBid, signature); + + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + assertEq(mockHypercertMinter.balanceOf(address(wallet), fractionId), 1); + } + + function testTakerAskInvalidSignature() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = _takerAskSetup(address(wallet)); + + // Signed by a different private key + bytes memory signature = _signMakerOrder(makerBid, takerUserPK); + + // Wallet needs to hold WETH and have given WETH approval + deal(address(weth), address(wallet), price); + vm.prank(address(wallet)); + weth.approve(address(looksRareProtocol), price); + + _assertMakerOrderReturnValidationCode(makerBid, signature, SIGNATURE_INVALID_EIP1271); + + vm.expectRevert(SignatureERC1271Invalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerAskIsValidSignatureReentrancy() public { + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerAsk); + + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = + _takerAskSetup(address(maliciousERC1271Wallet)); + + vm.expectRevert(IReentrancyGuard.ReentrancyFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, _EMPTY_SIGNATURE, _EMPTY_MERKLE_TREE); + } + + function testTakerAskOnERC1155ReceivedReentrancy() public { + MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = new MaliciousOnERC1155ReceivedERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = + _takerAskSetup(address(maliciousERC1271Wallet)); + + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerAsk); + + vm.expectRevert(ERC1155SafeTransferFromFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, _EMPTY_SIGNATURE, _EMPTY_MERKLE_TREE); + } + + function testBatchTakerAsk() public { + ERC1271Wallet wallet = new ERC1271Wallet(makerUser); + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = _batchTakerAskSetup(address(wallet)); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Wallet needs to hold WETH and have given WETH approval + deal(address(weth), address(wallet), price); + vm.prank(address(wallet)); + weth.approve(address(looksRareProtocol), price); + + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + for (uint256 i; i < 10; i++) { + assertEq(mockHypercertMinter.balanceOf(address(wallet), (((1 + i) << 128) + 1)), 1); + } + } + + function testBatchTakerAskOnERC1155BatchReceivedReentrancy() public { + MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = new MaliciousOnERC1155ReceivedERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + + (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = + _batchTakerAskSetup(address(maliciousERC1271Wallet)); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Wallet needs to hold WETH and have given WETH approval + deal(address(weth), address(maliciousERC1271Wallet), price); + vm.prank(address(maliciousERC1271Wallet)); + weth.approve(address(looksRareProtocol), price); + + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerAsk); + + vm.expectRevert(ERC1155SafeBatchTransferFromFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + uint256 private constant numberOfPurchases = 3; + + function testExecuteMultipleTakerBids() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + + ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) = _multipleTakerBidsSetup(address(wallet)); + + vm.startPrank(address(wallet)); + mockHypercertMinter.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberOfPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + for (uint256 i; i < numberOfPurchases; i++) { + assertEq(mockHypercertMinter.balanceOf(takerUser, (((1 + i) << 128) + 1)), 1); + } + } + + function testExecuteMultipleTakerBidsInvalidSignatures() public { + ERC1271Wallet wallet = new ERC1271Wallet(address(makerUser)); + + ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) = _multipleTakerBidsSetup(address(wallet)); + + // Signed by a different private key + for (uint256 i; i < signatures.length; i++) { + signatures[i] = _signMakerOrder(makerAsks[i], takerUserPK); + } + + vm.startPrank(address(wallet)); + mockHypercertMinter.setApprovalForAll(address(transferManager), true); + transferManager.grantApprovals(operators); + vm.stopPrank(); + + vm.expectRevert(SignatureERC1271Invalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberOfPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + } + + function testExecuteMultipleTakerBidsIsValidSignatureReentrancy() public { + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( + address(looksRareProtocol) + ); + _setUpUser(address(maliciousERC1271Wallet)); + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteMultipleTakerBids); + + ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) = _multipleTakerBidsSetup(address(maliciousERC1271Wallet)); + + vm.expectRevert(IReentrancyGuard.ReentrancyFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberOfPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + for (uint256 i; i < numberOfPurchases - 1; i++) { + assertEq(mockHypercertMinter.balanceOf(takerUser, i), 0); + } + } + + function testExecuteMultipleTakerBidsOnERC1155ReceivedReentrancyOnlyInTheLastCall() public { + MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet maliciousERC1271Wallet = + new MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet( + takerUser + ); + _setUpUser(makerUser); + maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteMultipleTakerBids); + + ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) = _multipleTakerBidsSetup(makerUser); + + // Set the NFT recipient as the ERC1271 wallet to trigger onERC1155Received + for (uint256 i; i < numberOfPurchases; i++) { + takerBids[i].recipient = address(maliciousERC1271Wallet); + } + + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberOfPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + // First 2 purchases should go through, but the last one fails silently + for (uint256 i; i < numberOfPurchases - 1; i++) { + assertEq(mockHypercertMinter.balanceOf(address(maliciousERC1271Wallet), (((1 + i) << 128) + 1)), 1); + } + assertEq(mockHypercertMinter.balanceOf(address(maliciousERC1271Wallet), numberOfPurchases - 1), 0); + } + + function _takerBidSetup(address signer) + private + returns (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) + { + // Mint asset + vm.prank(signer); + mockHypercertMinter.mintClaim(signer, 10_000, "http://example.com/takerBid", FROM_CREATOR_ONLY); + + makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: ETH, + signer: signer, + price: price, + itemId: fractionId + }); + + // Prepare the taker bid + takerBid = _genericTakerOrder(); + } + + function _takerAskSetup(address signer) + private + returns (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) + { + makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: signer, + price: price, + itemId: fractionId + }); + + // Mint asset + vm.prank(takerUser); + mockHypercertMinter.mintClaim(takerUser, 10_000, "http://example.com/takerBid", FROM_CREATOR_ONLY); + + // Prepare the taker ask + takerAsk = _genericTakerOrder(); + } + + function _batchTakerAskSetup(address signer) + private + returns (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) + { + uint256[] memory itemIds = new uint256[](10); + uint256[] memory amounts = new uint256[](10); + + vm.startPrank(takerUser); + for (uint256 i; i < 10; i++) { + uint256 claimID = (1 + i) << 128; + itemIds[i] = claimID + 1; + amounts[i] = 1; + + // Mint asset + mockHypercertMinter.mintClaim(takerUser, 10_000, "http://example.com/takerBid", FROM_CREATOR_ONLY); + } + vm.stopPrank(); + + // Prepare the first order + makerBid = _createMultiItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: signer, + price: price, + itemIds: itemIds, + amounts: amounts + }); + + // Prepare the taker ask + takerAsk = _genericTakerOrder(); + } + + function _multipleTakerBidsSetup(address signer) + private + returns ( + OrderStructs.Maker[] memory makerAsks, + OrderStructs.Taker[] memory takerBids, + OrderStructs.MerkleTree[] memory merkleTrees, + bytes[] memory signatures + ) + { + makerAsks = new OrderStructs.Maker[](numberOfPurchases); + takerBids = new OrderStructs.Taker[](numberOfPurchases); + signatures = new bytes[](numberOfPurchases); + + vm.startPrank(signer); + for (uint256 i; i < numberOfPurchases; i++) { + // Mint asset + mockHypercertMinter.mintClaim(signer, 10_000, "http://example.com/takerBid", FROM_CREATOR_ONLY); + + uint256 fractionID = ((1 + i) << 128) + 1; + + makerAsks[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.ERC1155, + orderNonce: i, + collection: address(mockHypercertMinter), + currency: ETH, + signer: signer, + price: price, + itemId: fractionID // 0, 1, etc. + }); + + signatures[i] = _signMakerOrder(makerAsks[i], makerUserPK); + + takerBids[i] = _genericTakerOrder(); + } + vm.stopPrank(); + + // Other execution parameters + merkleTrees = new OrderStructs.MerkleTree[](numberOfPurchases); + } +} diff --git a/contracts/test/foundry/marketplace/StandardTransactions.t.sol b/contracts/test/foundry/marketplace/StandardTransactions.t.sol index 6d5d8b38..75cd55d8 100644 --- a/contracts/test/foundry/marketplace/StandardTransactions.t.sol +++ b/contracts/test/foundry/marketplace/StandardTransactions.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Libraries, interfaces, errors import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; diff --git a/contracts/test/foundry/marketplace/StandardTransactionsHypercerts.t.sol b/contracts/test/foundry/marketplace/StandardTransactionsHypercerts.t.sol new file mode 100644 index 00000000..199d24c0 --- /dev/null +++ b/contracts/test/foundry/marketplace/StandardTransactionsHypercerts.t.sol @@ -0,0 +1,523 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// Libraries, interfaces, errors +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {LengthsInvalid} from "@hypercerts/marketplace/errors/SharedErrors.sol"; + +import {CreatorFeeManagerWithRoyalties} from "@hypercerts/marketplace/CreatorFeeManagerWithRoyalties.sol"; + +// Base test +import {ProtocolBase} from "./ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract StandardTransactionsHypercertsTest is ProtocolBase { + error ERC1155SafeTransferFromFail(); + + uint256 private constant fractionId = (1 << 128) + 1; + uint256[] private fractionUnits; + uint16 private constant NEW_ROYALTY_FEE = uint16(50); + + function setUp() public { + _setUp(); + CreatorFeeManagerWithRoyalties creatorFeeManager = new CreatorFeeManagerWithRoyalties( + address(royaltyFeeRegistry) + ); + vm.prank(_owner); + looksRareProtocol.updateCreatorFeeManager(address(creatorFeeManager)); + + fractionUnits = new uint256[](3); + fractionUnits[0] = 5000; + fractionUnits[1] = 3000; + fractionUnits[2] = 2000; + } + + /** + * One Hypercert fraction (where royalties come from the registry) is sold through a taker bid + */ + function testTakerBidHypercertWithRoyaltiesFromRegistry(uint256 price) public { + vm.assume(price <= 2 ether); + _setUpUsers(); + _setupRegistryRoyalties(address(mockHypercertMinter), NEW_ROYALTY_FEE); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockHypercertMinter), true); + makerAsk.price = price; + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Mint asset + vm.prank(makerUser); + mockHypercertMinter.mintClaim(makerUser, 10_000, "https://example.com/1", FROM_CREATOR_ONLY); + + // Verify validity of maker ask order + _assertValidMakerOrder(makerAsk, signature); + + // Arrays for events + uint256[3] memory expectedFees = _calculateExpectedFees({price: price, royaltyFeeBp: NEW_ROYALTY_FEE}); + address[2] memory expectedRecipients; + + expectedRecipients[0] = makerUser; + expectedRecipients[1] = _royaltyRecipient; + + // Execute taker bid transaction + vm.prank(takerUser); + vm.expectEmit(true, false, false, true); + + emit TakerBid( + NonceInvalidationParameters({ + orderHash: _computeOrderHash(makerAsk), + orderNonce: makerAsk.orderNonce, + isNonceInvalidated: true + }), + takerUser, + takerUser, + makerAsk.strategyId, + makerAsk.currency, + makerAsk.collection, + makerAsk.itemIds, + makerAsk.amounts, + expectedRecipients, + expectedFees + ); + + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulExecutionThroughETH(takerUser, makerUser, price, expectedFees); + + // No leftover in the balance of the contract + assertEq(address(looksRareProtocol).balance, 0); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + /** + * One Hypercert fraction is sold through taker bid. Address zero is specified as the recipient in the taker struct. + */ + function testTakerBidHypercertsWithAddressZeroSpecifiedAsRecipient(uint256 price) public { + vm.assume(price <= 2 ether); + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMockMakerAskAndTakerBid(address(mockHypercertMinter), true); + makerAsk.price = price; + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Mint asset + vm.prank(makerUser); + mockHypercertMinter.mintClaim(makerUser, 10_000, "https://example.com/1", FROM_CREATOR_ONLY); + + // Adjustment + takerBid.recipient = address(0); + + // Verify validity of maker ask order + _assertValidMakerOrder(makerAsk, signature); + + // Arrays for events + uint256[3] memory expectedFees = _calculateExpectedFees({price: price, royaltyFeeBp: 0}); + address[2] memory expectedRecipients; + + expectedRecipients[0] = makerUser; + expectedRecipients[1] = address(0); // No royalties + + // Execute taker bid transaction + vm.prank(takerUser); + vm.expectEmit(true, false, false, true); + + emit TakerBid( + NonceInvalidationParameters({ + orderHash: _computeOrderHash(makerAsk), + orderNonce: makerAsk.orderNonce, + isNonceInvalidated: true + }), + takerUser, + takerUser, + makerAsk.strategyId, + makerAsk.currency, + makerAsk.collection, + makerAsk.itemIds, + makerAsk.amounts, + expectedRecipients, + expectedFees + ); + + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulExecutionThroughETH(takerUser, makerUser, price, expectedFees); + } + + /** + * One Hypercert fraction (where royalties come from the registry) is sold through a taker ask using WETH + */ + function testTakerAskHypercertWithRoyaltiesFromRegistry(uint256 price) public { + vm.assume(price <= 2 ether); + + _setUpUsers(); + _setupRegistryRoyalties(address(mockHypercertMinter), NEW_ROYALTY_FEE); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockHypercertMinter), address(weth), true); + makerBid.price = price; + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Verify maker bid order + _assertValidMakerOrder(makerBid, signature); + + // Mint asset + vm.prank(takerUser); + mockHypercertMinter.mintClaim(takerUser, 10_000, "https://example.com/1", FROM_CREATOR_ONLY); + + // Arrays for events + uint256[3] memory expectedFees = _calculateExpectedFees({price: price, royaltyFeeBp: NEW_ROYALTY_FEE}); + address[2] memory expectedRecipients; + + expectedRecipients[0] = takerUser; + expectedRecipients[1] = _royaltyRecipient; + + // Execute taker ask transaction + vm.prank(takerUser); + + vm.expectEmit(true, false, false, true); + + emit TakerAsk( + NonceInvalidationParameters({ + orderHash: _computeOrderHash(makerBid), + orderNonce: makerBid.orderNonce, + isNonceInvalidated: true + }), + takerUser, + makerUser, + makerBid.strategyId, + makerBid.currency, + makerBid.collection, + makerBid.itemIds, + makerBid.amounts, + expectedRecipients, + expectedFees + ); + + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulExecutionThroughWETH(makerUser, takerUser, price, expectedFees); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + /** + * One Hypercert is sold through a taker ask using WETH. Address zero is specified as the recipient in the taker + * struct. + */ + function testTakerAskHypercertWithAddressZeroSpecifiedAsRecipient(uint256 price) public { + vm.assume(price <= 2 ether); + _setUpUsers(); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockHypercertMinter), address(weth), true); + makerBid.price = price; + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Verify maker bid order + _assertValidMakerOrder(makerBid, signature); + + // Adjustment + takerAsk.recipient = address(0); + + // Mint asset + vm.prank(takerUser); + mockHypercertMinter.mintClaim(takerUser, 10_000, "https://example.com/1", FROM_CREATOR_ONLY); + + // Arrays for events + uint256[3] memory expectedFees = _calculateExpectedFees({price: price, royaltyFeeBp: 0}); + address[2] memory expectedRecipients; + + expectedRecipients[0] = takerUser; + expectedRecipients[1] = address(0); // No royalties + + // Execute taker ask transaction + vm.prank(takerUser); + vm.expectEmit(true, false, false, true); + + emit TakerAsk( + NonceInvalidationParameters({ + orderHash: _computeOrderHash(makerBid), + orderNonce: makerBid.orderNonce, + isNonceInvalidated: true + }), + takerUser, + makerUser, + makerBid.strategyId, + makerBid.currency, + makerBid.collection, + makerBid.itemIds, + makerBid.amounts, + expectedRecipients, + expectedFees + ); + + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulExecutionThroughWETH(makerUser, takerUser, price, expectedFees); + } + + /** + * Three Hypercert fractions are sold through 3 taker bids in one transaction with non-atomicity. + */ + function testThreeTakerBidsHypercerts() public { + uint256 price = 0.015 ether; + _setUpUsers(); + + uint256 numberPurchases = 3; + + OrderStructs.Maker[] memory makerAsks = new OrderStructs.Maker[](numberPurchases); + OrderStructs.Taker[] memory takerBids = new OrderStructs.Taker[](numberPurchases); + bytes[] memory signatures = new bytes[](numberPurchases); + + for (uint256 i; i < numberPurchases; i++) { + // Mint asset + vm.prank(makerUser); + mockHypercertMinter.mintClaimWithFractions( + makerUser, 10_000, fractionUnits, "https://example.com/1", FROM_CREATOR_ONLY + ); + + makerAsks[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.Hypercert, + orderNonce: i, + collection: address(mockHypercertMinter), + currency: ETH, + signer: makerUser, + price: price, // Fixed + itemId: (1 << 128) + 1 + i + }); + + // Sign order + signatures[i] = _signMakerOrder(makerAsks[i], makerUserPK); + + takerBids[i] = _genericTakerOrder(); + } + + // Other execution parameters + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](numberPurchases); + + // Execute taker bid transaction + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + for (uint256 i; i < numberPurchases; i++) { + // Taker user has received the asset + assertEq(mockHypercertMinter.ownerOf((1 << 128) + 1 + i), takerUser); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, i), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + // Taker bid user pays the whole price + assertEq(address(takerUser).balance, _initialETHBalanceUser - (numberPurchases * price)); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + address(makerUser).balance, + _initialETHBalanceUser + + ((price * _sellerProceedBpWithStandardProtocolFeeBp) * numberPurchases) / ONE_HUNDRED_PERCENT_IN_BP + ); + // No leftover in the balance of the contract + assertEq(address(looksRareProtocol).balance, 0); + } + + /** + * Transaction cannot go through if atomic, goes through if non-atomic (fund returns to buyer). + */ + function testThreeTakerBidsHypercertsOneFails() public { + _setUpUsers(); + + uint256 numberPurchases = 3; + uint256 faultyPurchase = numberPurchases - 1; + uint256 faultyTokenId = (numberPurchases << 128) + 1; + + OrderStructs.Maker[] memory makerAsks = new OrderStructs.Maker[](numberPurchases); + OrderStructs.Taker[] memory takerBids = new OrderStructs.Taker[](numberPurchases); + bytes[] memory signatures = new bytes[](numberPurchases); + + for (uint256 i; i < numberPurchases; i++) { + // Mint asset + vm.prank(makerUser); + mockHypercertMinter.mintClaim(makerUser, 10_000, "https://example.com/1", FROM_CREATOR_ONLY); + + makerAsks[i] = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: STANDARD_SALE_FOR_FIXED_PRICE_STRATEGY, + collectionType: CollectionType.Hypercert, + orderNonce: i, + collection: address(mockHypercertMinter), + currency: ETH, + signer: makerUser, + price: 1.4 ether, // Fixed + itemId: ((i + 1) << 128) + 1 // First fraction of the i-th minted asset + }); + + // Sign order + signatures[i] = _signMakerOrder(makerAsks[i], makerUserPK); + + takerBids[i] = _genericTakerOrder(); + } + + // Transfer tokenId = 2 to random user + address randomUser = address(55); + vm.prank(makerUser); + mockHypercertMinter.safeTransferFrom(makerUser, randomUser, faultyTokenId, 1, ""); + + /** + * 1. The whole purchase fails if execution is atomic + */ + { + // Other execution parameters + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](numberPurchases); + + vm.expectRevert(ERC1155SafeTransferFromFail.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: 1.4 ether * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, true + ); + } + + /** + * 2. The whole purchase doesn't fail if execution is not-atomic + */ + { + // Other execution parameters + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](numberPurchases); + + vm.prank(takerUser); + // Execute taker bid transaction + looksRareProtocol.executeMultipleTakerBids{value: 1.4 ether * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + } + + for (uint256 i; i < faultyPurchase; i++) { + // Taker user has received the first two assets + assertEq(mockHypercertMinter.ownerOf(((i + 1) << 128) + 1), takerUser); + // Verify the first two nonces are marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, i), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + // Taker user has not received the asset + assertEq(mockHypercertMinter.ownerOf(faultyTokenId), randomUser); + // Verify the nonce is NOT marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, faultyTokenId), bytes32(0)); + // Taker bid user pays the whole price + assertEq(address(takerUser).balance, _initialETHBalanceUser - 1 - ((numberPurchases - 1) * 1.4 ether)); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + address(makerUser).balance, + _initialETHBalanceUser + + ((1.4 ether * _sellerProceedBpWithStandardProtocolFeeBp) * (numberPurchases - 1)) + / ONE_HUNDRED_PERCENT_IN_BP + ); + // 1 wei left in the balance of the contract + assertEq(address(looksRareProtocol).balance, 1); + } + + function testThreeTakerBidsHypercertsLengthsInvalid() public { + _setUpUsers(); + + uint256 price = 1.12121111111 ether; + uint256 numberPurchases = 3; + + OrderStructs.Taker[] memory takerBids = new OrderStructs.Taker[](numberPurchases); + bytes[] memory signatures = new bytes[](numberPurchases); + OrderStructs.MerkleTree[] memory merkleTrees = new OrderStructs.MerkleTree[](numberPurchases); + + // 1. Invalid maker asks length + OrderStructs.Maker[] memory makerAsks = new OrderStructs.Maker[](numberPurchases - 1); + + vm.expectRevert(LengthsInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + // 2. Invalid signatures length + makerAsks = new OrderStructs.Maker[](numberPurchases); + signatures = new bytes[](numberPurchases - 1); + + vm.expectRevert(LengthsInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + + // 3. Invalid merkle trees length + signatures = new bytes[](numberPurchases); + merkleTrees = new OrderStructs.MerkleTree[](numberPurchases - 1); + + vm.expectRevert(LengthsInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeMultipleTakerBids{value: price * numberPurchases}( + takerBids, makerAsks, signatures, merkleTrees, false + ); + } + + function _calculateExpectedFees(uint256 price, uint256 royaltyFeeBp) + private + pure + returns (uint256[3] memory expectedFees) + { + expectedFees[2] = (price * _standardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + expectedFees[1] = (price * royaltyFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + if (expectedFees[2] + expectedFees[1] < ((price * _minTotalFeeBp) / ONE_HUNDRED_PERCENT_IN_BP)) { + expectedFees[2] = ((price * _minTotalFeeBp) / ONE_HUNDRED_PERCENT_IN_BP) - expectedFees[1]; + } + expectedFees[0] = price - (expectedFees[1] + expectedFees[2]); + } + + function _assertSuccessfulExecutionThroughWETH( + address buyer, + address seller, + uint256 price, + uint256[3] memory expectedFees + ) private { + // Buyer has received the asset + assertEq(mockHypercertMinter.ownerOf(fractionId), buyer); + // Buyer pays the whole price + assertEq(weth.balanceOf(buyer), _initialWETHBalanceUser - price); + // Seller receives 99.5% of the whole price + assertEq(weth.balanceOf(seller), _initialWETHBalanceUser + expectedFees[0]); + assertEq( + weth.balanceOf(address(protocolFeeRecipient)), + expectedFees[2], + "ProtocolFeeRecipient should receive 1.5% of the whole price" + ); + // Royalty recipient receives 0.5% of the whole price + assertEq(weth.balanceOf(_royaltyRecipient), _initialWETHBalanceRoyaltyRecipient + expectedFees[1]); + } + + function _assertSuccessfulExecutionThroughETH( + address buyer, + address seller, + uint256 price, + uint256[3] memory expectedFees + ) private { + assertEq(mockHypercertMinter.ownerOf(fractionId), buyer); + // Buyer pays the whole price + assertEq(address(buyer).balance, _initialETHBalanceUser - price); + // Seller receives 99.5% of the whole price + assertEq(address(seller).balance, _initialETHBalanceUser + expectedFees[0]); + // Royalty recipient receives 0.5% of the whole price + assertEq(address(_royaltyRecipient).balance, _initialETHBalanceRoyaltyRecipient + expectedFees[1]); + } +} diff --git a/contracts/test/foundry/marketplace/StrategyManager.t.sol b/contracts/test/foundry/marketplace/StrategyManager.t.sol index e59128f2..2962afb1 100644 --- a/contracts/test/foundry/marketplace/StrategyManager.t.sol +++ b/contracts/test/foundry/marketplace/StrategyManager.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // LooksRare unopinionated libraries import {IOwnableTwoSteps} from "@looksrare/contracts-libs/contracts/interfaces/IOwnableTwoSteps.sol"; diff --git a/contracts/test/foundry/marketplace/TransferManager.t.sol b/contracts/test/foundry/marketplace/TransferManager.t.sol index d223cc59..e9e56855 100644 --- a/contracts/test/foundry/marketplace/TransferManager.t.sol +++ b/contracts/test/foundry/marketplace/TransferManager.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // LooksRare unopinionated libraries import {IOwnableTwoSteps} from "@looksrare/contracts-libs/contracts/interfaces/IOwnableTwoSteps.sol"; @@ -11,10 +11,13 @@ import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; import {LooksRareProtocol} from "@hypercerts/marketplace/LooksRareProtocol.sol"; import {ITransferManager, TransferManager} from "@hypercerts/marketplace/TransferManager.sol"; import {AmountInvalid, LengthsInvalid} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import {HypercertMinter} from "@hypercerts/protocol/HypercertMinter.sol"; +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; // Mocks and other utils import {MockERC721} from "../../mock/MockERC721.sol"; import {MockERC1155} from "../../mock/MockERC1155.sol"; +import {MockHypercertMinterUUPS} from "../../mock/MockHypercertMinterUUPS.sol"; import {TestHelpers} from "./utils/TestHelpers.sol"; import {TestParameters} from "./utils/TestParameters.sol"; @@ -25,7 +28,10 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { address[] public operators; MockERC721 public mockERC721; MockERC1155 public mockERC1155; + MockHypercertMinterUUPS public mockHypercertMinterUUPS; + TransferManager public transferManager; + HypercertMinter public mockHypercertMinter; uint256 private constant tokenIdERC721 = 55; uint256 private constant tokenId1ERC1155 = 1; @@ -33,6 +39,20 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { uint256 private constant tokenId2ERC1155 = 2; uint256 private constant amount2ERC1155 = 5; + // Set the hypercert claim and first fraction id + uint256 private constant claimId1Hypercert = 1 << 128; + uint256 private constant amount1Hypercert = 1; + uint256 private constant units1Hypercert = 10_000; + uint256 private constant fractionId1Hypercert = claimId1Hypercert + 1; + + uint256 private constant claimId2Hypercert = 2 << 128; + uint256 private constant amount2Hypercert = 1; + uint256 private constant units2Hypercert = 10_000; + uint256 private constant fractionId2Hypercert = claimId2Hypercert + 1; + + IHypercertToken.TransferRestrictions private constant FROM_CREATOR_ONLY = + IHypercertToken.TransferRestrictions.FromCreatorOnly; + /** * 0. Internal helper functions */ @@ -40,6 +60,8 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { function _grantApprovals(address user) private asPrankedUser(user) { mockERC721.setApprovalForAll(address(transferManager), true); mockERC1155.setApprovalForAll(address(transferManager), true); + mockHypercertMinter.setApprovalForAll(address(transferManager), true); + address[] memory approvedOperators = new address[](1); approvedOperators[0] = _transferrer; @@ -59,6 +81,9 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { transferManager = new TransferManager(_owner); mockERC721 = new MockERC721(); mockERC1155 = new MockERC1155(); + mockHypercertMinterUUPS = new MockHypercertMinterUUPS(); + mockHypercertMinterUUPS.setUp(); + mockHypercertMinter = mockHypercertMinterUUPS.minter(); operators.push(_transferrer); vm.deal(_transferrer, 100 ether); @@ -109,6 +134,27 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { assertEq(mockERC1155.balanceOf(_recipient, itemId), amount); } + function testTransferSingleItemHypercert() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + uint256 itemId = fractionId1Hypercert; + uint256 amount = amount1Hypercert; + + vm.prank(_sender); + mockHypercertMinter.mintClaim(_sender, units1Hypercert, "https://example.com/1", FROM_CREATOR_ONLY); + + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = itemId; + uint256[] memory amounts = new uint256[](1); + amounts[0] = amount; + + vm.prank(_transferrer); + transferManager.transferItemsHypercert(address(mockHypercertMinter), _sender, _recipient, itemIds, amounts); + + assertEq(mockHypercertMinter.balanceOf(_recipient, itemId), amount); + } + function testTransferBatchItemsERC721() public { _allowOperator(_transferrer); _grantApprovals(_sender); @@ -160,11 +206,40 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { assertEq(mockERC1155.balanceOf(_recipient, tokenId2), amount2); } - function testTransferBatchItemsAcrossCollectionERC721AndERC1155() public { + function testTransferBatchItemsHypercerts() public { _allowOperator(_transferrer); _grantApprovals(_sender); - ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); + uint256 tokenId1 = fractionId1Hypercert; + uint256 amount1 = amount1Hypercert; + uint256 tokenId2 = fractionId2Hypercert; + uint256 amount2 = amount2Hypercert; + + vm.startPrank(_sender); + mockHypercertMinter.mintClaim(_sender, units1Hypercert, "https://example.com/1", FROM_CREATOR_ONLY); + mockHypercertMinter.mintClaim(_sender, units2Hypercert, "https://example.com/2", FROM_CREATOR_ONLY); + vm.stopPrank(); + + uint256[] memory itemIds = new uint256[](2); + itemIds[0] = tokenId1; + itemIds[1] = tokenId2; + + uint256[] memory amounts = new uint256[](2); + amounts[0] = amount1; + amounts[1] = amount2; + + vm.prank(_transferrer); + transferManager.transferItemsHypercert(address(mockHypercertMinter), _sender, _recipient, itemIds, amounts); + + assertEq(mockHypercertMinter.balanceOf(_recipient, tokenId1), amount1); + assertEq(mockHypercertMinter.balanceOf(_recipient, tokenId2), amount2); + } + + function testTransferBatchItemsAcrossCollectionERC721AndERC1155AndHypercert() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItemsPranked(_sender); vm.prank(_transferrer); transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); @@ -172,11 +247,17 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { assertEq(mockERC721.ownerOf(tokenIdERC721), _recipient); assertEq(mockERC1155.balanceOf(_recipient, tokenId1ERC1155), amount1ERC1155); assertEq(mockERC1155.balanceOf(_recipient, tokenId2ERC1155), amount2ERC1155); + assertEq(mockHypercertMinter.balanceOf(_recipient, fractionId1Hypercert), amount1Hypercert); + assertEq(mockHypercertMinter.balanceOf(_recipient, fractionId2Hypercert), amount2Hypercert); } - function testTransferBatchItemsAcrossCollectionERC721AndERC1155ByOwner() public asPrankedUser(_sender) { + function testTransferBatchItemsAcrossCollectionERC721AndERC1155AndHypercertByOwner() + public + asPrankedUser(_sender) + { mockERC721.setApprovalForAll(address(transferManager), true); mockERC1155.setApprovalForAll(address(transferManager), true); + mockHypercertMinter.setApprovalForAll(address(transferManager), true); ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); @@ -185,6 +266,8 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { assertEq(mockERC721.ownerOf(tokenIdERC721), _recipient); assertEq(mockERC1155.balanceOf(_recipient, tokenId1ERC1155), amount1ERC1155); assertEq(mockERC1155.balanceOf(_recipient, tokenId2ERC1155), amount2ERC1155); + assertEq(mockHypercertMinter.balanceOf(_recipient, fractionId1Hypercert), amount1Hypercert); + assertEq(mockHypercertMinter.balanceOf(_recipient, fractionId2Hypercert), amount2Hypercert); } /** @@ -228,6 +311,25 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { transferManager.transferItemsERC1155(address(mockERC1155), _sender, _recipient, itemIds, amounts); } + function testTransferSingleItemHypercertAmountIsZero() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + uint256 itemId = fractionId1Hypercert; + + vm.prank(_sender); + mockHypercertMinter.mintClaim(_sender, 1, "https://example.com/1", FROM_CREATOR_ONLY); + + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = itemId; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 0; + + vm.expectRevert(AmountInvalid.selector); + vm.prank(_transferrer); + transferManager.transferItemsHypercert(address(mockHypercertMinter), _sender, _recipient, itemIds, amounts); + } + function testTransferMultipleItemsERC1155AmountIsZero() public { _allowOperator(_transferrer); _grantApprovals(_sender); @@ -250,6 +352,30 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { transferManager.transferItemsERC1155(address(mockERC1155), _sender, _recipient, itemIds, amounts); } + function testTransferMultipleItemsHypercertAmountIsZero() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + uint256 itemIdOne = fractionId1Hypercert; + uint256 itemIdTwo = fractionId2Hypercert; + + vm.prank(_sender); + mockHypercertMinter.mintClaim(_sender, 1, "https://example.com/1", FROM_CREATOR_ONLY); + vm.prank(_sender); + mockHypercertMinter.mintClaim(_sender, 1, "https://example.com/2", FROM_CREATOR_ONLY); + + uint256[] memory itemIds = new uint256[](2); + itemIds[0] = itemIdOne; + itemIds[1] = itemIdTwo; + uint256[] memory amounts = new uint256[](2); + amounts[0] = 0; + amounts[1] = 0; + + vm.expectRevert(AmountInvalid.selector); + vm.prank(_transferrer); + transferManager.transferItemsHypercert(address(mockHypercertMinter), _sender, _recipient, itemIds, amounts); + } + function testTransferBatchItemsAcrossCollectionZeroLength() public { _allowOperator(_transferrer); _grantApprovals(_sender); @@ -267,7 +393,7 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { _allowOperator(_transferrer); _grantApprovals(_sender); - ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItemsPranked(_sender); items[1].amounts[0] = amount; vm.expectRevert(AmountInvalid.selector); @@ -279,7 +405,7 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { _allowOperator(_transferrer); _grantApprovals(_sender); - ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItemsPranked(_sender); items[0].amounts[0] = 0; vm.expectRevert(AmountInvalid.selector); @@ -287,11 +413,23 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); } + function testCannotBatchTransferIfHypercertAmountIsZero() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItemsPranked(_sender); + items[2].amounts[0] = 0; + + vm.expectRevert(AmountInvalid.selector); + vm.prank(_sender); + transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); + } + function testTransferBatchItemsAcrossCollectionPerCollectionItemIdsLengthZero() public { _allowOperator(_transferrer); _grantApprovals(_sender); - ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItemsPranked(_sender); items[0].itemIds = new uint256[](0); items[0].amounts = new uint256[](0); @@ -364,6 +502,38 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { transferManager.transferItemsERC1155(address(mockERC1155), _sender, _recipient, itemIds, amounts); } + function testCannotTransferHypercertIfOperatorApprovalsRevokedByUserOrOperatorRemovedByOwner() public { + _allowOperator(_transferrer); + _grantApprovals(_sender); + + // 1. User revokes the operator + vm.prank(_sender); + vm.expectEmit(false, false, false, true); + emit ApprovalsRemoved(_sender, operators); + transferManager.revokeApprovals(operators); + + uint256 itemId = fractionId1Hypercert; + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = itemId; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 5; + + vm.prank(_transferrer); + vm.expectRevert(ITransferManager.TransferCallerInvalid.selector); + transferManager.transferItemsHypercert(address(mockHypercertMinter), _sender, _recipient, itemIds, amounts); + + // 2. Sender grants again approvals but owner removes the operators + _grantApprovals(_sender); + vm.prank(_owner); + vm.expectEmit(false, false, false, true); + emit OperatorRemoved(_transferrer); + transferManager.removeOperator(_transferrer); + + vm.prank(_transferrer); + vm.expectRevert(ITransferManager.TransferCallerInvalid.selector); + transferManager.transferItemsHypercert(address(mockHypercertMinter), _sender, _recipient, itemIds, amounts); + } + function testCannotBatchTransferIfOperatorApprovalsRevoked() public { _allowOperator(_transferrer); _grantApprovals(_sender); @@ -374,7 +544,7 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { emit ApprovalsRemoved(_sender, operators); transferManager.revokeApprovals(operators); - ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItems(); + ITransferManager.BatchTransferItem[] memory items = _generateValidBatchTransferItemsPranked(_sender); vm.prank(_transferrer); vm.expectRevert(ITransferManager.TransferCallerInvalid.selector); @@ -392,7 +562,7 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { transferManager.transferBatchItemsAcrossCollections(items, _sender, _recipient); } - function testCannotTransferERC721OrERC1155IfArrayLengthIs0() public { + function testCannotTransferERC721OrERC1155orHypercertIfArrayLengthIs0() public { uint256[] memory emptyArrayUint256 = new uint256[](0); // 1. ERC721 @@ -406,6 +576,12 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { transferManager.transferItemsERC1155( address(mockERC1155), _sender, _recipient, emptyArrayUint256, emptyArrayUint256 ); + + // 3. Hypercert length is 0 + vm.expectRevert(LengthsInvalid.selector); + transferManager.transferItemsHypercert( + address(mockHypercertMinter), _sender, _recipient, emptyArrayUint256, emptyArrayUint256 + ); } function testCannotTransferERC1155IfArrayLengthDiffers() public { @@ -416,6 +592,14 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { transferManager.transferItemsERC1155(address(mockERC1155), _sender, _recipient, itemIds, amounts); } + function testCannotTransferHypercertsIfArrayLengthDiffers() public { + uint256[] memory itemIds = new uint256[](2); + uint256[] memory amounts = new uint256[](3); + + vm.expectRevert(LengthsInvalid.selector); + transferManager.transferItemsHypercert(address(mockHypercertMinter), _sender, _recipient, itemIds, amounts); + } + function testUserCannotGrantOrRevokeApprovalsIfArrayLengthIs0() public { address[] memory emptyArrayAddresses = new address[](0); @@ -489,13 +673,83 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { } function _generateValidBatchTransferItems() private returns (BatchTransferItem[] memory items) { - items = new ITransferManager.BatchTransferItem[](2); + items = new ITransferManager.BatchTransferItem[](3); + + { + mockERC721.mint(_sender, tokenIdERC721); + mockERC1155.mint(_sender, tokenId1ERC1155, amount1ERC1155); + mockERC1155.mint(_sender, tokenId2ERC1155, amount2ERC1155); + + mockHypercertMinter.mintClaim(_sender, units1Hypercert, "https://example.com/1", FROM_CREATOR_ONLY); + mockHypercertMinter.mintClaim(_sender, units2Hypercert, "https://example.com/2", FROM_CREATOR_ONLY); + + uint256[] memory fractionIdsHypercerts = new uint256[](2); + fractionIdsHypercerts[0] = fractionId1Hypercert; + fractionIdsHypercerts[1] = fractionId2Hypercert; + + uint256[] memory amountsHypercerts = new uint256[](2); + amountsHypercerts[0] = amount1Hypercert; + amountsHypercerts[1] = amount2Hypercert; + + uint256[] memory tokenIdsERC1155 = new uint256[](2); + tokenIdsERC1155[0] = tokenId1ERC1155; + tokenIdsERC1155[1] = tokenId2ERC1155; + + uint256[] memory amountsERC1155 = new uint256[](2); + amountsERC1155[0] = amount1ERC1155; + amountsERC1155[1] = amount2ERC1155; + + uint256[] memory tokenIdsERC721 = new uint256[](1); + tokenIdsERC721[0] = tokenIdERC721; + + uint256[] memory amountsERC721 = new uint256[](1); + amountsERC721[0] = 1; + + items[0] = ITransferManager.BatchTransferItem({ + collection: address(mockERC1155), + collectionType: CollectionType.ERC1155, + itemIds: tokenIdsERC1155, + amounts: amountsERC1155 + }); + items[1] = ITransferManager.BatchTransferItem({ + collection: address(mockERC721), + collectionType: CollectionType.ERC721, + itemIds: tokenIdsERC721, + amounts: amountsERC721 + }); + items[2] = ITransferManager.BatchTransferItem({ + collection: address(mockHypercertMinter), + collectionType: CollectionType.Hypercert, + itemIds: fractionIdsHypercerts, + amounts: amountsHypercerts + }); + } + } + + function _generateValidBatchTransferItemsPranked(address pranker) + private + returns (BatchTransferItem[] memory items) + { + items = new ITransferManager.BatchTransferItem[](3); { mockERC721.mint(_sender, tokenIdERC721); mockERC1155.mint(_sender, tokenId1ERC1155, amount1ERC1155); mockERC1155.mint(_sender, tokenId2ERC1155, amount2ERC1155); + vm.startPrank(pranker); + mockHypercertMinter.mintClaim(pranker, units1Hypercert, "https://example.com/1", FROM_CREATOR_ONLY); + mockHypercertMinter.mintClaim(pranker, units2Hypercert, "https://example.com/2", FROM_CREATOR_ONLY); + vm.stopPrank(); + + uint256[] memory fractionIdsHypercerts = new uint256[](2); + fractionIdsHypercerts[0] = fractionId1Hypercert; + fractionIdsHypercerts[1] = fractionId2Hypercert; + + uint256[] memory amountsHypercerts = new uint256[](2); + amountsHypercerts[0] = amount1Hypercert; + amountsHypercerts[1] = amount2Hypercert; + uint256[] memory tokenIdsERC1155 = new uint256[](2); tokenIdsERC1155[0] = tokenId1ERC1155; tokenIdsERC1155[1] = tokenId2ERC1155; @@ -522,6 +776,12 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { itemIds: tokenIdsERC721, amounts: amountsERC721 }); + items[2] = ITransferManager.BatchTransferItem({ + collection: address(mockHypercertMinter), + collectionType: CollectionType.Hypercert, + itemIds: fractionIdsHypercerts, + amounts: amountsHypercerts + }); } } } diff --git a/contracts/test/foundry/marketplace/utils/MockOrderGenerator.sol b/contracts/test/foundry/marketplace/utils/MockOrderGenerator.sol index d6e695f5..f0cc0b9e 100644 --- a/contracts/test/foundry/marketplace/utils/MockOrderGenerator.sol +++ b/contracts/test/foundry/marketplace/utils/MockOrderGenerator.sol @@ -20,8 +20,16 @@ contract MockOrderGenerator is ProtocolHelpers { view returns (OrderStructs.Maker memory newMakerAsk, OrderStructs.Taker memory newTakerBid) { - CollectionType collectionType = _getCollectionType(collection); + return _createMockMakerAskAndTakerBid(collection, false); + } + function _createMockMakerAskAndTakerBid(address collection, bool hypercerts) + internal + view + returns (OrderStructs.Maker memory newMakerAsk, OrderStructs.Taker memory newTakerBid) + { + CollectionType collectionType = hypercerts ? CollectionType.Hypercert : _getCollectionType(collection); + uint256 itemId = hypercerts ? ((1 << 128) + 1) : 420; newMakerAsk = _createSingleItemMakerOrder({ quoteType: QuoteType.Ask, globalNonce: 0, @@ -33,7 +41,7 @@ contract MockOrderGenerator is ProtocolHelpers { currency: ETH, signer: makerUser, price: 1 ether, - itemId: 420 + itemId: itemId }); newTakerBid = OrderStructs.Taker(takerUser, abi.encode()); @@ -44,7 +52,15 @@ contract MockOrderGenerator is ProtocolHelpers { view returns (OrderStructs.Maker memory newMakerBid, OrderStructs.Taker memory newTakerAsk) { - CollectionType collectionType = _getCollectionType(collection); + return _createMockMakerBidAndTakerAsk(collection, currency, false); + } + + function _createMockMakerBidAndTakerAsk(address collection, address currency, bool hypercerts) + internal + view + returns (OrderStructs.Maker memory newMakerBid, OrderStructs.Taker memory newTakerAsk) + { + CollectionType collectionType = hypercerts ? CollectionType.Hypercert : _getCollectionType(collection); newMakerBid = _createSingleItemMakerOrder({ quoteType: QuoteType.Bid, @@ -57,7 +73,7 @@ contract MockOrderGenerator is ProtocolHelpers { currency: currency, signer: makerUser, price: 1 ether, - itemId: 420 + itemId: hypercerts ? (1 << 128) + 1 : 420 }); newTakerAsk = OrderStructs.Taker(takerUser, abi.encode()); @@ -68,7 +84,15 @@ contract MockOrderGenerator is ProtocolHelpers { view returns (OrderStructs.Maker memory newMakerAsk, OrderStructs.Taker memory newTakerBid) { - CollectionType collectionType = _getCollectionType(collection); + return _createMockMakerAskAndTakerBidWithBundle(collection, numberTokens, false); + } + + function _createMockMakerAskAndTakerBidWithBundle(address collection, uint256 numberTokens, bool hypercerts) + internal + view + returns (OrderStructs.Maker memory newMakerAsk, OrderStructs.Taker memory newTakerBid) + { + CollectionType collectionType = hypercerts ? CollectionType.Hypercert : _getCollectionType(collection); (uint256[] memory itemIds, uint256[] memory amounts) = _setBundleItemIdsAndAmounts(collectionType, numberTokens); @@ -95,7 +119,16 @@ contract MockOrderGenerator is ProtocolHelpers { view returns (OrderStructs.Maker memory newMakerBid, OrderStructs.Taker memory newTakerAsk) { - CollectionType collectionType = _getCollectionType(collection); + return _createMockMakerBidAndTakerAskWithBundle(collection, currency, numberTokens, false); + } + + function _createMockMakerBidAndTakerAskWithBundle( + address collection, + address currency, + uint256 numberTokens, + bool hypercerts + ) internal view returns (OrderStructs.Maker memory newMakerBid, OrderStructs.Taker memory newTakerAsk) { + CollectionType collectionType = hypercerts ? CollectionType.Hypercert : _getCollectionType(collection); (uint256[] memory itemIds, uint256[] memory amounts) = _setBundleItemIdsAndAmounts(collectionType, numberTokens); @@ -138,6 +171,9 @@ contract MockOrderGenerator is ProtocolHelpers { itemIds[i] = i; if (collectionType != CollectionType.ERC1155) { amounts[i] = 1; + } else if (collectionType == CollectionType.Hypercert) { + itemIds[i] = (1 << 128) + 1 + i; + amounts[i] = 1; } else { amounts[i] = 1 + i; } diff --git a/contracts/test/mock/MockERC1155.sol b/contracts/test/mock/MockERC1155.sol index 4bbfdccd..d234cf30 100644 --- a/contracts/test/mock/MockERC1155.sol +++ b/contracts/test/mock/MockERC1155.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import {ERC1155} from "solmate/src/tokens/ERC1155.sol"; +import { ERC1155 } from "solmate/src/tokens/ERC1155.sol"; // LooksRare unopinionated libraries -import {IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; +import { IERC2981 } from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; contract MockERC1155 is ERC1155 { function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts) public { diff --git a/contracts/test/mock/MockERC1155SupportsNoInterface.sol b/contracts/test/mock/MockERC1155SupportsNoInterface.sol index 34b9da89..3a233d63 100644 --- a/contracts/test/mock/MockERC1155SupportsNoInterface.sol +++ b/contracts/test/mock/MockERC1155SupportsNoInterface.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import {MockERC1155} from "./MockERC1155.sol"; +import { MockERC1155 } from "./MockERC1155.sol"; contract MockERC1155SupportsNoInterface is MockERC1155 { function supportsInterface(bytes4) public view virtual override returns (bool) { diff --git a/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol b/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol index 4474f875..ed4b6286 100644 --- a/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol +++ b/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; +import { ERC1155 } from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; /** * @dev This contract has to inherit from OZ instead of Solmate because diff --git a/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol b/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol index 1c010cae..c8fbccb2 100644 --- a/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol +++ b/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import {MockERC1155} from "./MockERC1155.sol"; +import { MockERC1155 } from "./MockERC1155.sol"; contract MockERC1155WithoutBalanceOfBatch is MockERC1155 { function balanceOfBatch(address[] calldata, uint256[] calldata) public pure override returns (uint256[] memory) { diff --git a/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol b/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol index c02c4192..7f7630dc 100644 --- a/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol +++ b/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; +import { ERC1155 } from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; /** * @dev This contract has to inherit from OZ instead of Solmate because diff --git a/contracts/test/mock/MockERC20.sol b/contracts/test/mock/MockERC20.sol index 019bed0e..8ec94827 100644 --- a/contracts/test/mock/MockERC20.sol +++ b/contracts/test/mock/MockERC20.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import {ERC20} from "solmate/src/tokens/ERC20.sol"; +import { ERC20 } from "solmate/src/tokens/ERC20.sol"; contract MockERC20 is ERC20("MockERC20", "MockERC20", 18) { function mint(address to, uint256 amount) public { diff --git a/contracts/test/mock/MockERC721.sol b/contracts/test/mock/MockERC721.sol index 4db2eed7..24c1bdc9 100644 --- a/contracts/test/mock/MockERC721.sol +++ b/contracts/test/mock/MockERC721.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import {ERC721} from "solmate/src/tokens/ERC721.sol"; -import {IERC165} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC165.sol"; +import { ERC721 } from "solmate/src/tokens/ERC721.sol"; +import { IERC165 } from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC165.sol"; contract MockERC721 is ERC721("MockERC721", "MockERC721") { function mint(address to, uint256 tokenId) public { diff --git a/contracts/test/mock/MockERC721SupportsNoInterface.sol b/contracts/test/mock/MockERC721SupportsNoInterface.sol index e5a6c5e3..8cd86d36 100644 --- a/contracts/test/mock/MockERC721SupportsNoInterface.sol +++ b/contracts/test/mock/MockERC721SupportsNoInterface.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import {MockERC721} from "./MockERC721.sol"; +import { MockERC721 } from "./MockERC721.sol"; contract MockERC721SupportsNoInterface is MockERC721 { function supportsInterface(bytes4) public view virtual override returns (bool) { diff --git a/contracts/test/mock/MockERC721WithRoyalties.sol b/contracts/test/mock/MockERC721WithRoyalties.sol index 071e2432..0083280b 100644 --- a/contracts/test/mock/MockERC721WithRoyalties.sol +++ b/contracts/test/mock/MockERC721WithRoyalties.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.17; -import {IERC165, IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; -import {MockERC721} from "./MockERC721.sol"; +import { IERC165, IERC2981 } from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; +import { MockERC721 } from "./MockERC721.sol"; // Constants -import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; +import { ONE_HUNDRED_PERCENT_IN_BP } from "@hypercerts/marketplace/constants/NumericConstants.sol"; /** * @dev This contract allows adding a royalty basis points higher than 10,000, which @@ -25,19 +25,19 @@ contract MockERC721WithRoyalties is MockERC721, IERC2981 { DEFAULT_ROYALTY_FEE = _royaltyFee; } - function addCustomRoyaltyInformationForTokenId(uint256 tokenId, address royaltyRecipient, uint256 royaltyFee) - external - { + function addCustomRoyaltyInformationForTokenId( + uint256 tokenId, + address royaltyRecipient, + uint256 royaltyFee + ) external { _royaltyRecipientForTokenId[tokenId] = royaltyRecipient; _royaltyFeeForTokenId[tokenId] = royaltyFee; } - function royaltyInfo(uint256 tokenId, uint256 salePrice) - external - view - override - returns (address royaltyRecipient, uint256 royaltyAmount) - { + function royaltyInfo( + uint256 tokenId, + uint256 salePrice + ) external view override returns (address royaltyRecipient, uint256 royaltyAmount) { royaltyRecipient = _royaltyRecipientForTokenId[tokenId] == address(0) ? DEFAULT_ROYALTY_RECIPIENT : _royaltyRecipientForTokenId[tokenId]; diff --git a/contracts/test/mock/MockHypercertMinterUUPS.sol b/contracts/test/mock/MockHypercertMinterUUPS.sol new file mode 100644 index 00000000..e883600e --- /dev/null +++ b/contracts/test/mock/MockHypercertMinterUUPS.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.16; + +import {HypercertMinter} from "@hypercerts/protocol/HypercertMinter.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +contract UUPSProxy is ERC1967Proxy { + constructor(address implementation, bytes memory data) ERC1967Proxy(implementation, data) {} +} + +contract MockHypercertMinterUUPS { + HypercertMinter public instance; + UUPSProxy public proxy; + HypercertMinter public minter; + + function setUp() public { + instance = new HypercertMinter(); + proxy = new UUPSProxy(address(instance), ""); + minter = HypercertMinter(address(proxy)); + } +} diff --git a/contracts/test/mock/MockRoyaltyFeeRegistry.sol b/contracts/test/mock/MockRoyaltyFeeRegistry.sol index d9700825..e4ec7a1f 100644 --- a/contracts/test/mock/MockRoyaltyFeeRegistry.sol +++ b/contracts/test/mock/MockRoyaltyFeeRegistry.sol @@ -2,13 +2,13 @@ pragma solidity 0.8.17; // LooksRare unopinionated libraries -import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; +import { OwnableTwoSteps } from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; // Royalty Fee Registry interface -import {IRoyaltyFeeRegistry} from "@hypercerts/marketplace/interfaces/IRoyaltyFeeRegistry.sol"; +import { IRoyaltyFeeRegistry } from "@hypercerts/marketplace/interfaces/IRoyaltyFeeRegistry.sol"; // Constants -import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; +import { ONE_HUNDRED_PERCENT_IN_BP } from "@hypercerts/marketplace/constants/NumericConstants.sol"; /** * @title MockRoyaltyFeeRegistry @@ -36,7 +36,7 @@ contract MockRoyaltyFeeRegistry is IRoyaltyFeeRegistry, OwnableTwoSteps { * @param _royaltyFeeLimit new royalty fee limit (500 = 5%, 1,000 = 10%) */ constructor(address _owner, uint256 _royaltyFeeLimit) OwnableTwoSteps(_owner) { - require(_royaltyFeeLimit <= 9500, "Owner: Royalty fee limit too high"); + require(_royaltyFeeLimit <= 9_500, "Owner: Royalty fee limit too high"); royaltyFeeLimit = _royaltyFeeLimit; } @@ -45,7 +45,7 @@ contract MockRoyaltyFeeRegistry is IRoyaltyFeeRegistry, OwnableTwoSteps { * @param _royaltyFeeLimit new royalty fee limit (500 = 5%, 1,000 = 10%) */ function updateRoyaltyFeeLimit(uint256 _royaltyFeeLimit) external onlyOwner { - require(_royaltyFeeLimit <= 9500, "Owner: Royalty fee limit too high"); + require(_royaltyFeeLimit <= 9_500, "Owner: Royalty fee limit too high"); royaltyFeeLimit = _royaltyFeeLimit; emit NewRoyaltyFeeLimit(_royaltyFeeLimit); @@ -58,12 +58,14 @@ contract MockRoyaltyFeeRegistry is IRoyaltyFeeRegistry, OwnableTwoSteps { * @param receiver receiver for the royalty fee * @param fee fee (500 = 5%, 1,000 = 10%) */ - function updateRoyaltyInfoForCollection(address collection, address setter, address receiver, uint256 fee) - external - onlyOwner - { + function updateRoyaltyInfoForCollection( + address collection, + address setter, + address receiver, + uint256 fee + ) external onlyOwner { require(fee <= royaltyFeeLimit, "Registry: Royalty fee too high"); - _royaltyFeeInfoCollection[collection] = FeeInfo({setter: setter, receiver: receiver, fee: fee}); + _royaltyFeeInfoCollection[collection] = FeeInfo({ setter: setter, receiver: receiver, fee: fee }); emit RoyaltyFeeUpdate(collection, setter, receiver, fee); } diff --git a/contracts/test/mock/MockSmartWallet.sol b/contracts/test/mock/MockSmartWallet.sol index 77d02b61..6e30673b 100644 --- a/contracts/test/mock/MockSmartWallet.sol +++ b/contracts/test/mock/MockSmartWallet.sol @@ -54,7 +54,7 @@ contract MockSmartWallet { } function execute(address dest, uint256 value, bytes calldata calldata_) public onlyOwner { - (bool success, bytes memory result) = dest.call{value: value}(calldata_); + (bool success, bytes memory result) = dest.call{ value: value }(calldata_); if (!success) { assembly { diff --git a/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md index fca005d6..b185d072 100644 --- a/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md +++ b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -1,6 +1,6 @@ # LooksRareProtocol -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers_ > LooksRareProtocol diff --git a/docs/docs/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/docs/developer/api/contracts/protocol/interfaces/IHypercertToken.md index 6bd5a931..30ed6f95 100644 --- a/docs/docs/developer/api/contracts/protocol/interfaces/IHypercertToken.md +++ b/docs/docs/developer/api/contracts/protocol/interfaces/IHypercertToken.md @@ -8,6 +8,23 @@ This interface declares the required functionality for a hypercert tokenThis int ## Methods +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + ### burnFraction ```solidity diff --git a/graph/src/hypercert-minter.ts b/graph/src/hypercert-minter.ts index fbee62a8..3116aa01 100644 --- a/graph/src/hypercert-minter.ts +++ b/graph/src/hypercert-minter.ts @@ -11,6 +11,7 @@ import { URI as URIEvent, ValueTransfer as ValueTransferEvent, } from "../generated/HypercertMinter/HypercertMinter"; +import { ClaimToken } from "../generated/schema"; import { ZERO_ADDRESS, getID, @@ -19,7 +20,6 @@ import { getOrCreateClaimToken, } from "./utils"; import { log } from "@graphprotocol/graph-ts"; -import { ClaimToken } from "../generated/schema"; export function handleAllowlistCreated(event: AllowlistCreatedEvent): void { const allowlist = getOrCreateAllowlist( @@ -74,7 +74,6 @@ export function handleTransferBatch(event: TransferBatchEvent): void { } token.owner = event.params.to; - token.save(); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b518a718..850c6324 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -304,7 +304,7 @@ importers: version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) '@graphprotocol/client-cli': specifier: ^2.2.16 - version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': specifier: 0.9.0 version: 0.9.0(typescript@5.1.6) @@ -673,6 +673,9 @@ importers: ethereum-waffle: specifier: ^4.0.10 version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.1.6) + fetch-mock: + specifier: ^9.11.0 + version: 9.11.0(node-fetch@3.3.2) it-all: specifier: ^2.0.0 version: 2.0.1 @@ -5757,6 +5760,24 @@ packages: '@trufflesuite/bigint-buffer': 1.1.9 dev: true + /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} + peerDependencies: + '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 + '@graphql-tools/delegate': ^9.0.32 + '@graphql-tools/utils': ^9.2.1 + '@graphql-tools/wrap': ^9.4.2 + graphql: ^15.2.0 || ^16.0.0 + dependencies: + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) + graphql: 16.8.1 + lodash: 4.17.21 + tslib: 2.6.2 + dev: false + /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} peerDependencies: @@ -5794,7 +5815,7 @@ packages: tslib: 2.6.2 dev: true - /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-p8eEyeBcqxCXLxC7CNgIhLSCd7bjiKToKnrwYPShVb26gIG2JdAmD3/mpjuR+QaMA4chN/EO5t+TGvq6KnFx9g==} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 @@ -5803,7 +5824,7 @@ packages: '@graphql-tools/wrap': ^9.4.2 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) @@ -5831,15 +5852,15 @@ packages: tslib: 2.6.2 dev: true - /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): + /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-kpiX2s804mpP3EVL0EdJfxeHWBTdg6SglIyEvSZ5T1OWyGDeMhr19D+gVIAlo22/PiBUkBDd0JfqppLsliPZ1A==} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 '@graphql-tools/delegate': ^9.0.32 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -5889,19 +5910,19 @@ packages: tslib: 2.6.2 dev: true - /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-PIi8rFibYZVup+0jb08399RmbGF1ZrqUe6RXzLtKZBT57OWIMWwsFvdJyUAdr8Y8f0rrMn6A+Oy4nP1lf3hc1g==} hasBin: true peerDependencies: graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) + '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-polling-live': 1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -6402,7 +6423,7 @@ packages: graphql: 16.8.1 path-browserify: 1.0.1 - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6414,10 +6435,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6645,7 +6666,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6661,8 +6682,8 @@ packages: '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -6721,26 +6742,6 @@ packages: graphql: 16.8.1 tslib: 2.6.2 - /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-inspector/core': 5.0.1(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} engines: {node: '>=16.0.0'} @@ -6785,6 +6786,22 @@ packages: lodash.get: 4.4.2 tslib: 2.6.2 + /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} + peerDependencies: + '@graphql-mesh/types': ^0.93.1 + '@graphql-mesh/utils': ^0.93.1 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} peerDependencies: @@ -6794,11 +6811,12 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: true /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} @@ -6855,30 +6873,6 @@ packages: tiny-lru: 8.0.2 tslib: 2.6.2 - /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.8 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@whatwg-node/fetch': 0.9.14 - dset: 3.1.3 - graphql: 16.8.1 - js-yaml: 4.1.0 - lodash.get: 4.4.2 - lodash.topath: 4.5.2 - tiny-lru: 11.2.3 - tslib: 2.6.2 - /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} engines: {node: '>=16.0.0'} @@ -7540,10 +7534,10 @@ packages: '@graphql-mesh/graphql': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': 0.8.11 '@openzeppelin/merkle-tree': 1.0.5 @@ -19798,6 +19792,30 @@ packages: node-domexception: 1.0.0 web-streams-polyfill: 3.2.1 + /fetch-mock@9.11.0(node-fetch@3.3.2): + resolution: {integrity: sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==} + engines: {node: '>=4.0.0'} + peerDependencies: + node-fetch: '*' + peerDependenciesMeta: + node-fetch: + optional: true + dependencies: + '@babel/core': 7.23.2 + '@babel/runtime': 7.23.2 + core-js: 3.33.1 + debug: 4.3.4(supports-color@8.1.1) + glob-to-regexp: 0.4.1 + is-subset: 0.1.1 + lodash.isequal: 4.5.0 + node-fetch: 3.3.2 + path-to-regexp: 2.2.1 + querystring: 0.2.1 + whatwg-url: 6.5.0 + transitivePeerDependencies: + - supports-color + dev: true + /fets@0.1.5: resolution: {integrity: sha512-mL/ya591WOgCP1yBBPbp8E37nynj8QQF6iQCUVl0aHDL80BZ9SOL4BcKBy0dnKdC+clnnAkMm05KB9hsj4m4jQ==} dependencies: @@ -23123,6 +23141,10 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-subset@0.1.1: + resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} + dev: true + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} @@ -25255,6 +25277,10 @@ packages: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true @@ -27745,7 +27771,6 @@ packages: /path-to-regexp@2.2.1: resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} - dev: false /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} @@ -31930,6 +31955,12 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.0 + dev: true + /tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} @@ -33608,6 +33639,10 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -33855,6 +33890,14 @@ packages: tr46: 0.0.3 webidl-conversions: 3.0.1 + /whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + /wherearewe@2.0.1: resolution: {integrity: sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} diff --git a/sdk/.graphclient/index.ts b/sdk/.graphclient/index.ts index 95f59d60..14907f2d 100644 --- a/sdk/.graphclient/index.ts +++ b/sdk/.graphclient/index.ts @@ -53,6 +53,14 @@ export type Query = { claims: Array; claimToken?: Maybe; claimTokens: Array; + token?: Maybe; + tokens: Array; + acceptedToken?: Maybe; + acceptedTokens: Array; + offer?: Maybe; + offers: Array; + trade?: Maybe; + trades: Array; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; }; @@ -112,6 +120,78 @@ export type QueryclaimTokensArgs = { }; +export type QuerytokenArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerytokensArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryacceptedTokenArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryacceptedTokensArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryofferArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryoffersArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerytradeArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerytradesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + export type Query_metaArgs = { block?: InputMaybe; }; @@ -123,6 +203,14 @@ export type Subscription = { claims: Array; claimToken?: Maybe; claimTokens: Array; + token?: Maybe; + tokens: Array; + acceptedToken?: Maybe; + acceptedTokens: Array; + offer?: Maybe; + offers: Array; + trade?: Maybe; + trades: Array; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; }; @@ -182,10 +270,159 @@ export type SubscriptionclaimTokensArgs = { }; +export type SubscriptiontokenArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiontokensArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionacceptedTokenArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionacceptedTokensArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionofferArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionoffersArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiontradeArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiontradesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + export type Subscription_metaArgs = { block?: InputMaybe; }; +export type AcceptedToken = { + id: Scalars['String']; + token: Token; + minimumAmountPerUnit: Scalars['BigInt']; + accepted: Scalars['Boolean']; +}; + +export type AcceptedToken_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + token?: InputMaybe; + token_not?: InputMaybe; + token_gt?: InputMaybe; + token_lt?: InputMaybe; + token_gte?: InputMaybe; + token_lte?: InputMaybe; + token_in?: InputMaybe>; + token_not_in?: InputMaybe>; + token_contains?: InputMaybe; + token_contains_nocase?: InputMaybe; + token_not_contains?: InputMaybe; + token_not_contains_nocase?: InputMaybe; + token_starts_with?: InputMaybe; + token_starts_with_nocase?: InputMaybe; + token_not_starts_with?: InputMaybe; + token_not_starts_with_nocase?: InputMaybe; + token_ends_with?: InputMaybe; + token_ends_with_nocase?: InputMaybe; + token_not_ends_with?: InputMaybe; + token_not_ends_with_nocase?: InputMaybe; + token_?: InputMaybe; + minimumAmountPerUnit?: InputMaybe; + minimumAmountPerUnit_not?: InputMaybe; + minimumAmountPerUnit_gt?: InputMaybe; + minimumAmountPerUnit_lt?: InputMaybe; + minimumAmountPerUnit_gte?: InputMaybe; + minimumAmountPerUnit_lte?: InputMaybe; + minimumAmountPerUnit_in?: InputMaybe>; + minimumAmountPerUnit_not_in?: InputMaybe>; + accepted?: InputMaybe; + accepted_not?: InputMaybe; + accepted_in?: InputMaybe>; + accepted_not_in?: InputMaybe>; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type AcceptedToken_orderBy = + | 'id' + | 'token' + | 'token__id' + | 'token__name' + | 'token__symbol' + | 'token__decimals' + | 'minimumAmountPerUnit' + | 'accepted'; + export type Allowlist = { id: Scalars['String']; root: Scalars['Bytes']; @@ -282,6 +519,7 @@ export type Claim = { creator?: Maybe; owner?: Maybe; totalUnits?: Maybe; + allowlist?: Maybe; graphName: Scalars['String']; }; @@ -291,9 +529,19 @@ export type ClaimToken = { claim: Claim; owner: Scalars['Bytes']; units: Scalars['BigInt']; + offers?: Maybe>; graphName: Scalars['String']; }; + +export type ClaimTokenoffersArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; +}; + export type ClaimToken_filter = { id?: InputMaybe; id_not?: InputMaybe; @@ -362,6 +610,7 @@ export type ClaimToken_filter = { units_lte?: InputMaybe; units_in?: InputMaybe>; units_not_in?: InputMaybe>; + offers_?: InputMaybe; /** Filter for the block changed event. */ _change_block?: InputMaybe; and?: InputMaybe>>; @@ -381,7 +630,8 @@ export type ClaimToken_orderBy = | 'claim__owner' | 'claim__totalUnits' | 'owner' - | 'units'; + | 'units' + | 'offers'; export type Claim_filter = { id?: InputMaybe; @@ -488,6 +738,27 @@ export type Claim_filter = { totalUnits_lte?: InputMaybe; totalUnits_in?: InputMaybe>; totalUnits_not_in?: InputMaybe>; + allowlist?: InputMaybe; + allowlist_not?: InputMaybe; + allowlist_gt?: InputMaybe; + allowlist_lt?: InputMaybe; + allowlist_gte?: InputMaybe; + allowlist_lte?: InputMaybe; + allowlist_in?: InputMaybe>; + allowlist_not_in?: InputMaybe>; + allowlist_contains?: InputMaybe; + allowlist_contains_nocase?: InputMaybe; + allowlist_not_contains?: InputMaybe; + allowlist_not_contains_nocase?: InputMaybe; + allowlist_starts_with?: InputMaybe; + allowlist_starts_with_nocase?: InputMaybe; + allowlist_not_starts_with?: InputMaybe; + allowlist_not_starts_with_nocase?: InputMaybe; + allowlist_ends_with?: InputMaybe; + allowlist_ends_with_nocase?: InputMaybe; + allowlist_not_ends_with?: InputMaybe; + allowlist_not_ends_with_nocase?: InputMaybe; + allowlist_?: InputMaybe; /** Filter for the block changed event. */ _change_block?: InputMaybe; and?: InputMaybe>>; @@ -502,13 +773,345 @@ export type Claim_orderBy = | 'uri' | 'creator' | 'owner' - | 'totalUnits'; + | 'totalUnits' + | 'allowlist' + | 'allowlist__id' + | 'allowlist__root'; + +export type Offer = { + id: Scalars['String']; + fractionID: ClaimToken; + unitsAvailable: Scalars['BigInt']; + minUnitsPerTrade: Scalars['BigInt']; + maxUnitsPerTrade: Scalars['BigInt']; + status: OfferStatus; + acceptedTokens: Array; +}; + + +export type OfferacceptedTokensArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; +}; + +export type OfferStatus = + | 'Open' + | 'Fulfilled' + | 'Cancelled'; + +export type Offer_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + fractionID?: InputMaybe; + fractionID_not?: InputMaybe; + fractionID_gt?: InputMaybe; + fractionID_lt?: InputMaybe; + fractionID_gte?: InputMaybe; + fractionID_lte?: InputMaybe; + fractionID_in?: InputMaybe>; + fractionID_not_in?: InputMaybe>; + fractionID_contains?: InputMaybe; + fractionID_contains_nocase?: InputMaybe; + fractionID_not_contains?: InputMaybe; + fractionID_not_contains_nocase?: InputMaybe; + fractionID_starts_with?: InputMaybe; + fractionID_starts_with_nocase?: InputMaybe; + fractionID_not_starts_with?: InputMaybe; + fractionID_not_starts_with_nocase?: InputMaybe; + fractionID_ends_with?: InputMaybe; + fractionID_ends_with_nocase?: InputMaybe; + fractionID_not_ends_with?: InputMaybe; + fractionID_not_ends_with_nocase?: InputMaybe; + fractionID_?: InputMaybe; + unitsAvailable?: InputMaybe; + unitsAvailable_not?: InputMaybe; + unitsAvailable_gt?: InputMaybe; + unitsAvailable_lt?: InputMaybe; + unitsAvailable_gte?: InputMaybe; + unitsAvailable_lte?: InputMaybe; + unitsAvailable_in?: InputMaybe>; + unitsAvailable_not_in?: InputMaybe>; + minUnitsPerTrade?: InputMaybe; + minUnitsPerTrade_not?: InputMaybe; + minUnitsPerTrade_gt?: InputMaybe; + minUnitsPerTrade_lt?: InputMaybe; + minUnitsPerTrade_gte?: InputMaybe; + minUnitsPerTrade_lte?: InputMaybe; + minUnitsPerTrade_in?: InputMaybe>; + minUnitsPerTrade_not_in?: InputMaybe>; + maxUnitsPerTrade?: InputMaybe; + maxUnitsPerTrade_not?: InputMaybe; + maxUnitsPerTrade_gt?: InputMaybe; + maxUnitsPerTrade_lt?: InputMaybe; + maxUnitsPerTrade_gte?: InputMaybe; + maxUnitsPerTrade_lte?: InputMaybe; + maxUnitsPerTrade_in?: InputMaybe>; + maxUnitsPerTrade_not_in?: InputMaybe>; + status?: InputMaybe; + status_not?: InputMaybe; + status_in?: InputMaybe>; + status_not_in?: InputMaybe>; + acceptedTokens?: InputMaybe>; + acceptedTokens_not?: InputMaybe>; + acceptedTokens_contains?: InputMaybe>; + acceptedTokens_contains_nocase?: InputMaybe>; + acceptedTokens_not_contains?: InputMaybe>; + acceptedTokens_not_contains_nocase?: InputMaybe>; + acceptedTokens_?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type Offer_orderBy = + | 'id' + | 'fractionID' + | 'fractionID__id' + | 'fractionID__tokenID' + | 'fractionID__owner' + | 'fractionID__units' + | 'unitsAvailable' + | 'minUnitsPerTrade' + | 'maxUnitsPerTrade' + | 'status' + | 'acceptedTokens'; /** Defines the order direction, either ascending or descending */ export type OrderDirection = | 'asc' | 'desc'; +export type Token = { + id: Scalars['String']; + name: Scalars['String']; + symbol?: Maybe; + decimals?: Maybe; +}; + +export type Token_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + name?: InputMaybe; + name_not?: InputMaybe; + name_gt?: InputMaybe; + name_lt?: InputMaybe; + name_gte?: InputMaybe; + name_lte?: InputMaybe; + name_in?: InputMaybe>; + name_not_in?: InputMaybe>; + name_contains?: InputMaybe; + name_contains_nocase?: InputMaybe; + name_not_contains?: InputMaybe; + name_not_contains_nocase?: InputMaybe; + name_starts_with?: InputMaybe; + name_starts_with_nocase?: InputMaybe; + name_not_starts_with?: InputMaybe; + name_not_starts_with_nocase?: InputMaybe; + name_ends_with?: InputMaybe; + name_ends_with_nocase?: InputMaybe; + name_not_ends_with?: InputMaybe; + name_not_ends_with_nocase?: InputMaybe; + symbol?: InputMaybe; + symbol_not?: InputMaybe; + symbol_gt?: InputMaybe; + symbol_lt?: InputMaybe; + symbol_gte?: InputMaybe; + symbol_lte?: InputMaybe; + symbol_in?: InputMaybe>; + symbol_not_in?: InputMaybe>; + symbol_contains?: InputMaybe; + symbol_contains_nocase?: InputMaybe; + symbol_not_contains?: InputMaybe; + symbol_not_contains_nocase?: InputMaybe; + symbol_starts_with?: InputMaybe; + symbol_starts_with_nocase?: InputMaybe; + symbol_not_starts_with?: InputMaybe; + symbol_not_starts_with_nocase?: InputMaybe; + symbol_ends_with?: InputMaybe; + symbol_ends_with_nocase?: InputMaybe; + symbol_not_ends_with?: InputMaybe; + symbol_not_ends_with_nocase?: InputMaybe; + decimals?: InputMaybe; + decimals_not?: InputMaybe; + decimals_gt?: InputMaybe; + decimals_lt?: InputMaybe; + decimals_gte?: InputMaybe; + decimals_lte?: InputMaybe; + decimals_in?: InputMaybe>; + decimals_not_in?: InputMaybe>; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type Token_orderBy = + | 'id' + | 'name' + | 'symbol' + | 'decimals'; + +export type Trade = { + id: Scalars['String']; + buyer: Scalars['Bytes']; + offerID: Offer; + unitsSold: Scalars['BigInt']; + token: Token; + amountPerUnit: Scalars['BigInt']; +}; + +export type Trade_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + buyer?: InputMaybe; + buyer_not?: InputMaybe; + buyer_gt?: InputMaybe; + buyer_lt?: InputMaybe; + buyer_gte?: InputMaybe; + buyer_lte?: InputMaybe; + buyer_in?: InputMaybe>; + buyer_not_in?: InputMaybe>; + buyer_contains?: InputMaybe; + buyer_not_contains?: InputMaybe; + offerID?: InputMaybe; + offerID_not?: InputMaybe; + offerID_gt?: InputMaybe; + offerID_lt?: InputMaybe; + offerID_gte?: InputMaybe; + offerID_lte?: InputMaybe; + offerID_in?: InputMaybe>; + offerID_not_in?: InputMaybe>; + offerID_contains?: InputMaybe; + offerID_contains_nocase?: InputMaybe; + offerID_not_contains?: InputMaybe; + offerID_not_contains_nocase?: InputMaybe; + offerID_starts_with?: InputMaybe; + offerID_starts_with_nocase?: InputMaybe; + offerID_not_starts_with?: InputMaybe; + offerID_not_starts_with_nocase?: InputMaybe; + offerID_ends_with?: InputMaybe; + offerID_ends_with_nocase?: InputMaybe; + offerID_not_ends_with?: InputMaybe; + offerID_not_ends_with_nocase?: InputMaybe; + offerID_?: InputMaybe; + unitsSold?: InputMaybe; + unitsSold_not?: InputMaybe; + unitsSold_gt?: InputMaybe; + unitsSold_lt?: InputMaybe; + unitsSold_gte?: InputMaybe; + unitsSold_lte?: InputMaybe; + unitsSold_in?: InputMaybe>; + unitsSold_not_in?: InputMaybe>; + token?: InputMaybe; + token_not?: InputMaybe; + token_gt?: InputMaybe; + token_lt?: InputMaybe; + token_gte?: InputMaybe; + token_lte?: InputMaybe; + token_in?: InputMaybe>; + token_not_in?: InputMaybe>; + token_contains?: InputMaybe; + token_contains_nocase?: InputMaybe; + token_not_contains?: InputMaybe; + token_not_contains_nocase?: InputMaybe; + token_starts_with?: InputMaybe; + token_starts_with_nocase?: InputMaybe; + token_not_starts_with?: InputMaybe; + token_not_starts_with_nocase?: InputMaybe; + token_ends_with?: InputMaybe; + token_ends_with_nocase?: InputMaybe; + token_not_ends_with?: InputMaybe; + token_not_ends_with_nocase?: InputMaybe; + token_?: InputMaybe; + amountPerUnit?: InputMaybe; + amountPerUnit_not?: InputMaybe; + amountPerUnit_gt?: InputMaybe; + amountPerUnit_lt?: InputMaybe; + amountPerUnit_gte?: InputMaybe; + amountPerUnit_lte?: InputMaybe; + amountPerUnit_in?: InputMaybe>; + amountPerUnit_not_in?: InputMaybe>; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type Trade_orderBy = + | 'id' + | 'buyer' + | 'offerID' + | 'offerID__id' + | 'offerID__unitsAvailable' + | 'offerID__minUnitsPerTrade' + | 'offerID__maxUnitsPerTrade' + | 'offerID__status' + | 'unitsSold' + | 'token' + | 'token__id' + | 'token__name' + | 'token__symbol' + | 'token__decimals' + | 'amountPerUnit'; + export type _Block_ = { /** The hash of the block */ hash?: Maybe; @@ -628,6 +1231,9 @@ export type DirectiveResolverFn; Subscription: ResolverTypeWrapper<{}>; + AcceptedToken: ResolverTypeWrapper; + AcceptedToken_filter: AcceptedToken_filter; + AcceptedToken_orderBy: AcceptedToken_orderBy; Allowlist: ResolverTypeWrapper; Allowlist_filter: Allowlist_filter; Allowlist_orderBy: Allowlist_orderBy; @@ -647,8 +1253,18 @@ export type ResolversTypes = ResolversObject<{ ID: ResolverTypeWrapper; Int: ResolverTypeWrapper; Int8: ResolverTypeWrapper; + Offer: ResolverTypeWrapper; + OfferStatus: OfferStatus; + Offer_filter: Offer_filter; + Offer_orderBy: Offer_orderBy; OrderDirection: OrderDirection; String: ResolverTypeWrapper; + Token: ResolverTypeWrapper; + Token_filter: Token_filter; + Token_orderBy: Token_orderBy; + Trade: ResolverTypeWrapper; + Trade_filter: Trade_filter; + Trade_orderBy: Trade_orderBy; _Block_: ResolverTypeWrapper<_Block_>; _Meta_: ResolverTypeWrapper<_Meta_>; _SubgraphErrorPolicy_: _SubgraphErrorPolicy_; @@ -658,6 +1274,8 @@ export type ResolversTypes = ResolversObject<{ export type ResolversParentTypes = ResolversObject<{ Query: {}; Subscription: {}; + AcceptedToken: AcceptedToken; + AcceptedToken_filter: AcceptedToken_filter; Allowlist: Allowlist; Allowlist_filter: Allowlist_filter; BigDecimal: Scalars['BigDecimal']; @@ -674,7 +1292,13 @@ export type ResolversParentTypes = ResolversObject<{ ID: Scalars['ID']; Int: Scalars['Int']; Int8: Scalars['Int8']; + Offer: Offer; + Offer_filter: Offer_filter; String: Scalars['String']; + Token: Token; + Token_filter: Token_filter; + Trade: Trade; + Trade_filter: Trade_filter; _Block_: _Block_; _Meta_: _Meta_; }>; @@ -702,6 +1326,14 @@ export type QueryResolvers, ParentType, ContextType, RequireFields>; claimToken?: Resolver, ParentType, ContextType, RequireFields>; claimTokens?: Resolver, ParentType, ContextType, RequireFields>; + token?: Resolver, ParentType, ContextType, RequireFields>; + tokens?: Resolver, ParentType, ContextType, RequireFields>; + acceptedToken?: Resolver, ParentType, ContextType, RequireFields>; + acceptedTokens?: Resolver, ParentType, ContextType, RequireFields>; + offer?: Resolver, ParentType, ContextType, RequireFields>; + offers?: Resolver, ParentType, ContextType, RequireFields>; + trade?: Resolver, ParentType, ContextType, RequireFields>; + trades?: Resolver, ParentType, ContextType, RequireFields>; _meta?: Resolver, ParentType, ContextType, Partial>; }>; @@ -712,9 +1344,25 @@ export type SubscriptionResolvers, "claims", ParentType, ContextType, RequireFields>; claimToken?: SubscriptionResolver, "claimToken", ParentType, ContextType, RequireFields>; claimTokens?: SubscriptionResolver, "claimTokens", ParentType, ContextType, RequireFields>; + token?: SubscriptionResolver, "token", ParentType, ContextType, RequireFields>; + tokens?: SubscriptionResolver, "tokens", ParentType, ContextType, RequireFields>; + acceptedToken?: SubscriptionResolver, "acceptedToken", ParentType, ContextType, RequireFields>; + acceptedTokens?: SubscriptionResolver, "acceptedTokens", ParentType, ContextType, RequireFields>; + offer?: SubscriptionResolver, "offer", ParentType, ContextType, RequireFields>; + offers?: SubscriptionResolver, "offers", ParentType, ContextType, RequireFields>; + trade?: SubscriptionResolver, "trade", ParentType, ContextType, RequireFields>; + trades?: SubscriptionResolver, "trades", ParentType, ContextType, RequireFields>; _meta?: SubscriptionResolver, "_meta", ParentType, ContextType, Partial>; }>; +export type AcceptedTokenResolvers = ResolversObject<{ + id?: Resolver; + token?: Resolver; + minimumAmountPerUnit?: Resolver; + accepted?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + export type AllowlistResolvers = ResolversObject<{ id?: Resolver; root?: Resolver; @@ -743,6 +1391,7 @@ export type ClaimResolvers, ParentType, ContextType>; owner?: Resolver, ParentType, ContextType>; totalUnits?: Resolver, ParentType, ContextType>; + allowlist?: Resolver, ParentType, ContextType>; graphName?: Resolver; __isTypeOf?: IsTypeOfResolverFn; }>; @@ -753,6 +1402,7 @@ export type ClaimTokenResolvers; owner?: Resolver; units?: Resolver; + offers?: Resolver>, ParentType, ContextType, RequireFields>; graphName?: Resolver; __isTypeOf?: IsTypeOfResolverFn; }>; @@ -761,6 +1411,35 @@ export interface Int8ScalarConfig extends GraphQLScalarTypeConfig = ResolversObject<{ + id?: Resolver; + fractionID?: Resolver; + unitsAvailable?: Resolver; + minUnitsPerTrade?: Resolver; + maxUnitsPerTrade?: Resolver; + status?: Resolver; + acceptedTokens?: Resolver, ParentType, ContextType, RequireFields>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type TokenResolvers = ResolversObject<{ + id?: Resolver; + name?: Resolver; + symbol?: Resolver, ParentType, ContextType>; + decimals?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type TradeResolvers = ResolversObject<{ + id?: Resolver; + buyer?: Resolver; + offerID?: Resolver; + unitsSold?: Resolver; + token?: Resolver; + amountPerUnit?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + export type _Block_Resolvers = ResolversObject<{ hash?: Resolver, ParentType, ContextType>; number?: Resolver; @@ -778,6 +1457,7 @@ export type _Meta_Resolvers = ResolversObject<{ Query?: QueryResolvers; Subscription?: SubscriptionResolvers; + AcceptedToken?: AcceptedTokenResolvers; Allowlist?: AllowlistResolvers; BigDecimal?: GraphQLScalarType; BigInt?: GraphQLScalarType; @@ -785,6 +1465,9 @@ export type Resolvers; ClaimToken?: ClaimTokenResolvers; Int8?: GraphQLScalarType; + Offer?: OfferResolvers; + Token?: TokenResolvers; + Trade?: TradeResolvers; _Block_?: _Block_Resolvers; _Meta_?: _Meta_Resolvers; }>; diff --git a/sdk/.graphclient/schema.graphql b/sdk/.graphclient/schema.graphql index 56dc3bc8..8eb86ef5 100644 --- a/sdk/.graphclient/schema.graphql +++ b/sdk/.graphclient/schema.graphql @@ -91,6 +91,110 @@ type Query { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [ClaimToken!]! + token( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Token + tokens( + skip: Int = 0 + first: Int = 100 + orderBy: Token_orderBy + orderDirection: OrderDirection + where: Token_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Token!]! + acceptedToken( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): AcceptedToken + acceptedTokens( + skip: Int = 0 + first: Int = 100 + orderBy: AcceptedToken_orderBy + orderDirection: OrderDirection + where: AcceptedToken_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [AcceptedToken!]! + offer( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Offer + offers( + skip: Int = 0 + first: Int = 100 + orderBy: Offer_orderBy + orderDirection: OrderDirection + where: Offer_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Offer!]! + trade( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Trade + trades( + skip: Int = 0 + first: Int = 100 + orderBy: Trade_orderBy + orderDirection: OrderDirection + where: Trade_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Trade!]! """Access to subgraph metadata""" _meta(block: Block_height): _Meta_ } @@ -174,10 +278,192 @@ type Subscription { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [ClaimToken!]! + token( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Token + tokens( + skip: Int = 0 + first: Int = 100 + orderBy: Token_orderBy + orderDirection: OrderDirection + where: Token_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Token!]! + acceptedToken( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): AcceptedToken + acceptedTokens( + skip: Int = 0 + first: Int = 100 + orderBy: AcceptedToken_orderBy + orderDirection: OrderDirection + where: AcceptedToken_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [AcceptedToken!]! + offer( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Offer + offers( + skip: Int = 0 + first: Int = 100 + orderBy: Offer_orderBy + orderDirection: OrderDirection + where: Offer_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Offer!]! + trade( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Trade + trades( + skip: Int = 0 + first: Int = 100 + orderBy: Trade_orderBy + orderDirection: OrderDirection + where: Trade_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Trade!]! """Access to subgraph metadata""" _meta(block: Block_height): _Meta_ } +type AcceptedToken { + id: String! + token: Token! + minimumAmountPerUnit: BigInt! + accepted: Boolean! +} + +input AcceptedToken_filter { + id: String + id_not: String + id_gt: String + id_lt: String + id_gte: String + id_lte: String + id_in: [String!] + id_not_in: [String!] + id_contains: String + id_contains_nocase: String + id_not_contains: String + id_not_contains_nocase: String + id_starts_with: String + id_starts_with_nocase: String + id_not_starts_with: String + id_not_starts_with_nocase: String + id_ends_with: String + id_ends_with_nocase: String + id_not_ends_with: String + id_not_ends_with_nocase: String + token: String + token_not: String + token_gt: String + token_lt: String + token_gte: String + token_lte: String + token_in: [String!] + token_not_in: [String!] + token_contains: String + token_contains_nocase: String + token_not_contains: String + token_not_contains_nocase: String + token_starts_with: String + token_starts_with_nocase: String + token_not_starts_with: String + token_not_starts_with_nocase: String + token_ends_with: String + token_ends_with_nocase: String + token_not_ends_with: String + token_not_ends_with_nocase: String + token_: Token_filter + minimumAmountPerUnit: BigInt + minimumAmountPerUnit_not: BigInt + minimumAmountPerUnit_gt: BigInt + minimumAmountPerUnit_lt: BigInt + minimumAmountPerUnit_gte: BigInt + minimumAmountPerUnit_lte: BigInt + minimumAmountPerUnit_in: [BigInt!] + minimumAmountPerUnit_not_in: [BigInt!] + accepted: Boolean + accepted_not: Boolean + accepted_in: [Boolean!] + accepted_not_in: [Boolean!] + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [AcceptedToken_filter] + or: [AcceptedToken_filter] +} + +enum AcceptedToken_orderBy { + id + token + token__id + token__name + token__symbol + token__decimals + minimumAmountPerUnit + accepted +} + type Allowlist { id: String! root: Bytes! @@ -281,6 +567,7 @@ type Claim { creator: Bytes owner: Bytes totalUnits: BigInt + allowlist: Allowlist graphName: String! } @@ -290,6 +577,7 @@ type ClaimToken { claim: Claim! owner: Bytes! units: BigInt! + offers(skip: Int = 0, first: Int = 100, orderBy: Offer_orderBy, orderDirection: OrderDirection, where: Offer_filter): [Offer!] graphName: String! } @@ -361,6 +649,7 @@ input ClaimToken_filter { units_lte: BigInt units_in: [BigInt!] units_not_in: [BigInt!] + offers_: Offer_filter """Filter for the block changed event.""" _change_block: BlockChangedFilter and: [ClaimToken_filter] @@ -381,6 +670,7 @@ enum ClaimToken_orderBy { claim__totalUnits owner units + offers } input Claim_filter { @@ -488,6 +778,27 @@ input Claim_filter { totalUnits_lte: BigInt totalUnits_in: [BigInt!] totalUnits_not_in: [BigInt!] + allowlist: String + allowlist_not: String + allowlist_gt: String + allowlist_lt: String + allowlist_gte: String + allowlist_lte: String + allowlist_in: [String!] + allowlist_not_in: [String!] + allowlist_contains: String + allowlist_contains_nocase: String + allowlist_not_contains: String + allowlist_not_contains_nocase: String + allowlist_starts_with: String + allowlist_starts_with_nocase: String + allowlist_not_starts_with: String + allowlist_not_starts_with_nocase: String + allowlist_ends_with: String + allowlist_ends_with_nocase: String + allowlist_not_ends_with: String + allowlist_not_ends_with_nocase: String + allowlist_: Allowlist_filter """Filter for the block changed event.""" _change_block: BlockChangedFilter and: [Claim_filter] @@ -503,6 +814,9 @@ enum Claim_orderBy { creator owner totalUnits + allowlist + allowlist__id + allowlist__root } """ @@ -511,12 +825,336 @@ enum Claim_orderBy { """ scalar Int8 +type Offer { + id: String! + fractionID: ClaimToken! + unitsAvailable: BigInt! + minUnitsPerTrade: BigInt! + maxUnitsPerTrade: BigInt! + status: OfferStatus! + acceptedTokens(skip: Int = 0, first: Int = 100, orderBy: AcceptedToken_orderBy, orderDirection: OrderDirection, where: AcceptedToken_filter): [AcceptedToken!]! +} + +enum OfferStatus { + Open + Fulfilled + Cancelled +} + +input Offer_filter { + id: String + id_not: String + id_gt: String + id_lt: String + id_gte: String + id_lte: String + id_in: [String!] + id_not_in: [String!] + id_contains: String + id_contains_nocase: String + id_not_contains: String + id_not_contains_nocase: String + id_starts_with: String + id_starts_with_nocase: String + id_not_starts_with: String + id_not_starts_with_nocase: String + id_ends_with: String + id_ends_with_nocase: String + id_not_ends_with: String + id_not_ends_with_nocase: String + fractionID: String + fractionID_not: String + fractionID_gt: String + fractionID_lt: String + fractionID_gte: String + fractionID_lte: String + fractionID_in: [String!] + fractionID_not_in: [String!] + fractionID_contains: String + fractionID_contains_nocase: String + fractionID_not_contains: String + fractionID_not_contains_nocase: String + fractionID_starts_with: String + fractionID_starts_with_nocase: String + fractionID_not_starts_with: String + fractionID_not_starts_with_nocase: String + fractionID_ends_with: String + fractionID_ends_with_nocase: String + fractionID_not_ends_with: String + fractionID_not_ends_with_nocase: String + fractionID_: ClaimToken_filter + unitsAvailable: BigInt + unitsAvailable_not: BigInt + unitsAvailable_gt: BigInt + unitsAvailable_lt: BigInt + unitsAvailable_gte: BigInt + unitsAvailable_lte: BigInt + unitsAvailable_in: [BigInt!] + unitsAvailable_not_in: [BigInt!] + minUnitsPerTrade: BigInt + minUnitsPerTrade_not: BigInt + minUnitsPerTrade_gt: BigInt + minUnitsPerTrade_lt: BigInt + minUnitsPerTrade_gte: BigInt + minUnitsPerTrade_lte: BigInt + minUnitsPerTrade_in: [BigInt!] + minUnitsPerTrade_not_in: [BigInt!] + maxUnitsPerTrade: BigInt + maxUnitsPerTrade_not: BigInt + maxUnitsPerTrade_gt: BigInt + maxUnitsPerTrade_lt: BigInt + maxUnitsPerTrade_gte: BigInt + maxUnitsPerTrade_lte: BigInt + maxUnitsPerTrade_in: [BigInt!] + maxUnitsPerTrade_not_in: [BigInt!] + status: OfferStatus + status_not: OfferStatus + status_in: [OfferStatus!] + status_not_in: [OfferStatus!] + acceptedTokens: [String!] + acceptedTokens_not: [String!] + acceptedTokens_contains: [String!] + acceptedTokens_contains_nocase: [String!] + acceptedTokens_not_contains: [String!] + acceptedTokens_not_contains_nocase: [String!] + acceptedTokens_: AcceptedToken_filter + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [Offer_filter] + or: [Offer_filter] +} + +enum Offer_orderBy { + id + fractionID + fractionID__id + fractionID__tokenID + fractionID__owner + fractionID__units + unitsAvailable + minUnitsPerTrade + maxUnitsPerTrade + status + acceptedTokens +} + """Defines the order direction, either ascending or descending""" enum OrderDirection { asc desc } +type Token { + id: String! + name: String! + symbol: String + decimals: BigInt +} + +input Token_filter { + id: String + id_not: String + id_gt: String + id_lt: String + id_gte: String + id_lte: String + id_in: [String!] + id_not_in: [String!] + id_contains: String + id_contains_nocase: String + id_not_contains: String + id_not_contains_nocase: String + id_starts_with: String + id_starts_with_nocase: String + id_not_starts_with: String + id_not_starts_with_nocase: String + id_ends_with: String + id_ends_with_nocase: String + id_not_ends_with: String + id_not_ends_with_nocase: String + name: String + name_not: String + name_gt: String + name_lt: String + name_gte: String + name_lte: String + name_in: [String!] + name_not_in: [String!] + name_contains: String + name_contains_nocase: String + name_not_contains: String + name_not_contains_nocase: String + name_starts_with: String + name_starts_with_nocase: String + name_not_starts_with: String + name_not_starts_with_nocase: String + name_ends_with: String + name_ends_with_nocase: String + name_not_ends_with: String + name_not_ends_with_nocase: String + symbol: String + symbol_not: String + symbol_gt: String + symbol_lt: String + symbol_gte: String + symbol_lte: String + symbol_in: [String!] + symbol_not_in: [String!] + symbol_contains: String + symbol_contains_nocase: String + symbol_not_contains: String + symbol_not_contains_nocase: String + symbol_starts_with: String + symbol_starts_with_nocase: String + symbol_not_starts_with: String + symbol_not_starts_with_nocase: String + symbol_ends_with: String + symbol_ends_with_nocase: String + symbol_not_ends_with: String + symbol_not_ends_with_nocase: String + decimals: BigInt + decimals_not: BigInt + decimals_gt: BigInt + decimals_lt: BigInt + decimals_gte: BigInt + decimals_lte: BigInt + decimals_in: [BigInt!] + decimals_not_in: [BigInt!] + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [Token_filter] + or: [Token_filter] +} + +enum Token_orderBy { + id + name + symbol + decimals +} + +type Trade { + id: String! + buyer: Bytes! + offerID: Offer! + unitsSold: BigInt! + token: Token! + amountPerUnit: BigInt! +} + +input Trade_filter { + id: String + id_not: String + id_gt: String + id_lt: String + id_gte: String + id_lte: String + id_in: [String!] + id_not_in: [String!] + id_contains: String + id_contains_nocase: String + id_not_contains: String + id_not_contains_nocase: String + id_starts_with: String + id_starts_with_nocase: String + id_not_starts_with: String + id_not_starts_with_nocase: String + id_ends_with: String + id_ends_with_nocase: String + id_not_ends_with: String + id_not_ends_with_nocase: String + buyer: Bytes + buyer_not: Bytes + buyer_gt: Bytes + buyer_lt: Bytes + buyer_gte: Bytes + buyer_lte: Bytes + buyer_in: [Bytes!] + buyer_not_in: [Bytes!] + buyer_contains: Bytes + buyer_not_contains: Bytes + offerID: String + offerID_not: String + offerID_gt: String + offerID_lt: String + offerID_gte: String + offerID_lte: String + offerID_in: [String!] + offerID_not_in: [String!] + offerID_contains: String + offerID_contains_nocase: String + offerID_not_contains: String + offerID_not_contains_nocase: String + offerID_starts_with: String + offerID_starts_with_nocase: String + offerID_not_starts_with: String + offerID_not_starts_with_nocase: String + offerID_ends_with: String + offerID_ends_with_nocase: String + offerID_not_ends_with: String + offerID_not_ends_with_nocase: String + offerID_: Offer_filter + unitsSold: BigInt + unitsSold_not: BigInt + unitsSold_gt: BigInt + unitsSold_lt: BigInt + unitsSold_gte: BigInt + unitsSold_lte: BigInt + unitsSold_in: [BigInt!] + unitsSold_not_in: [BigInt!] + token: String + token_not: String + token_gt: String + token_lt: String + token_gte: String + token_lte: String + token_in: [String!] + token_not_in: [String!] + token_contains: String + token_contains_nocase: String + token_not_contains: String + token_not_contains_nocase: String + token_starts_with: String + token_starts_with_nocase: String + token_not_starts_with: String + token_not_starts_with_nocase: String + token_ends_with: String + token_ends_with_nocase: String + token_not_ends_with: String + token_not_ends_with_nocase: String + token_: Token_filter + amountPerUnit: BigInt + amountPerUnit_not: BigInt + amountPerUnit_gt: BigInt + amountPerUnit_lt: BigInt + amountPerUnit_gte: BigInt + amountPerUnit_lte: BigInt + amountPerUnit_in: [BigInt!] + amountPerUnit_not_in: [BigInt!] + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [Trade_filter] + or: [Trade_filter] +} + +enum Trade_orderBy { + id + buyer + offerID + offerID__id + offerID__unitsAvailable + offerID__minUnitsPerTrade + offerID__maxUnitsPerTrade + offerID__status + unitsSold + token + token__id + token__name + token__symbol + token__decimals + amountPerUnit +} + type _Block_ { """The hash of the block""" hash: Bytes diff --git a/sdk/.graphclient/sources/Hypercerts/introspectionSchema.ts b/sdk/.graphclient/sources/Hypercerts/introspectionSchema.ts index 68838c80..0078e3f1 100644 --- a/sdk/.graphclient/sources/Hypercerts/introspectionSchema.ts +++ b/sdk/.graphclient/sources/Hypercerts/introspectionSchema.ts @@ -131,7 +131,7 @@ const schemaAST = { "kind": "ObjectTypeDefinition", "name": { "kind": "Name", - "value": "Allowlist" + "value": "AcceptedToken" }, "fields": [ { @@ -157,7 +157,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "root" + "value": "token" }, "arguments": [], "type": { @@ -166,7 +166,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "Token" } } }, @@ -176,7 +176,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "claim" + "value": "minimumAmountPerUnit" }, "arguments": [], "type": { @@ -185,7 +185,26 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Claim" + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "accepted" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" } } }, @@ -199,7 +218,7 @@ const schemaAST = { "kind": "InputObjectTypeDefinition", "name": { "kind": "Name", - "value": "Allowlist_filter" + "value": "AcceptedToken_filter" }, "fields": [ { @@ -518,13 +537,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "root" + "value": "token" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -533,13 +552,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "root_not" + "value": "token_not" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -548,13 +567,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "root_gt" + "value": "token_gt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -563,13 +582,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "root_lt" + "value": "token_lt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -578,13 +597,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "root_gte" + "value": "token_gte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -593,13 +612,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "root_lte" + "value": "token_lte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -608,7 +627,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "root_in" + "value": "token_in" }, "type": { "kind": "ListType", @@ -618,7 +637,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } } } @@ -629,7 +648,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "root_not_in" + "value": "token_not_in" }, "type": { "kind": "ListType", @@ -639,7 +658,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } } } @@ -650,13 +669,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "root_contains" + "value": "token_contains" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -665,13 +684,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "root_not_contains" + "value": "token_contains_nocase" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -680,7 +699,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim" + "value": "token_not_contains" }, "type": { "kind": "NamedType", @@ -695,7 +714,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_not" + "value": "token_not_contains_nocase" }, "type": { "kind": "NamedType", @@ -710,7 +729,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_gt" + "value": "token_starts_with" }, "type": { "kind": "NamedType", @@ -725,7 +744,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_lt" + "value": "token_starts_with_nocase" }, "type": { "kind": "NamedType", @@ -740,7 +759,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_gte" + "value": "token_not_starts_with" }, "type": { "kind": "NamedType", @@ -755,7 +774,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_lte" + "value": "token_not_starts_with_nocase" }, "type": { "kind": "NamedType", @@ -770,19 +789,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_in" + "value": "token_ends_with" }, "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] @@ -791,19 +804,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_not_in" + "value": "token_ends_with_nocase" }, "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] @@ -812,7 +819,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_contains" + "value": "token_not_ends_with" }, "type": { "kind": "NamedType", @@ -827,7 +834,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_contains_nocase" + "value": "token_not_ends_with_nocase" }, "type": { "kind": "NamedType", @@ -842,13 +849,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_not_contains" + "value": "token_" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Token_filter" } }, "directives": [] @@ -857,13 +864,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_not_contains_nocase" + "value": "minimumAmountPerUnit" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } }, "directives": [] @@ -872,13 +879,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_starts_with" + "value": "minimumAmountPerUnit_not" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } }, "directives": [] @@ -887,13 +894,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_starts_with_nocase" + "value": "minimumAmountPerUnit_gt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } }, "directives": [] @@ -902,13 +909,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_not_starts_with" + "value": "minimumAmountPerUnit_lt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } }, "directives": [] @@ -917,13 +924,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_not_starts_with_nocase" + "value": "minimumAmountPerUnit_gte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } }, "directives": [] @@ -932,13 +939,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_ends_with" + "value": "minimumAmountPerUnit_lte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } }, "directives": [] @@ -947,13 +954,19 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_ends_with_nocase" + "value": "minimumAmountPerUnit_in" }, "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } } }, "directives": [] @@ -962,13 +975,19 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_not_ends_with" + "value": "minimumAmountPerUnit_not_in" }, "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } } }, "directives": [] @@ -977,13 +996,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_not_ends_with_nocase" + "value": "accepted" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Boolean" } }, "directives": [] @@ -992,13 +1011,55 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_" + "value": "accepted_not" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Claim_filter" + "value": "Boolean" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "accepted_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "accepted_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } } }, "directives": [] @@ -1035,7 +1096,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Allowlist_filter" + "value": "AcceptedToken_filter" } } }, @@ -1053,7 +1114,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Allowlist_filter" + "value": "AcceptedToken_filter" } } }, @@ -1066,7 +1127,7 @@ const schemaAST = { "kind": "EnumTypeDefinition", "name": { "kind": "Name", - "value": "Allowlist_orderBy" + "value": "AcceptedToken_orderBy" }, "values": [ { @@ -1081,7 +1142,7 @@ const schemaAST = { "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "root" + "value": "token" }, "directives": [] }, @@ -1089,7 +1150,7 @@ const schemaAST = { "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim" + "value": "token__id" }, "directives": [] }, @@ -1097,7 +1158,7 @@ const schemaAST = { "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim__id" + "value": "token__name" }, "directives": [] }, @@ -1105,7 +1166,7 @@ const schemaAST = { "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim__creation" + "value": "token__symbol" }, "directives": [] }, @@ -1113,7 +1174,7 @@ const schemaAST = { "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim__tokenID" + "value": "token__decimals" }, "directives": [] }, @@ -1121,7 +1182,7 @@ const schemaAST = { "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim__contract" + "value": "minimumAmountPerUnit" }, "directives": [] }, @@ -1129,99 +1190,114 @@ const schemaAST = { "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim__uri" + "value": "accepted" }, "directives": [] - }, + } + ], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Allowlist" + }, + "fields": [ { - "kind": "EnumValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "claim__creator" + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } }, "directives": [] }, { - "kind": "EnumValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "claim__owner" + "value": "root" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } }, "directives": [] }, { - "kind": "EnumValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "claim__totalUnits" + "value": "claim" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim" + } + } }, "directives": [] } ], + "interfaces": [], "directives": [] }, { - "kind": "ScalarTypeDefinition", + "kind": "InputObjectTypeDefinition", "name": { "kind": "Name", - "value": "BigDecimal" - }, - "directives": [] - }, - { - "kind": "ScalarTypeDefinition", - "name": { - "kind": "Name", - "value": "BigInt" - }, - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "BlockChangedFilter" + "value": "Allowlist_filter" }, "fields": [ { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "number_gte" + "value": "id" }, "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] - } - ], - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Block_height" - }, - "fields": [ + }, { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "hash" + "value": "id_not" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -1230,13 +1306,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "number" + "value": "id_gt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Int" + "value": "String" } }, "directives": [] @@ -1245,118 +1321,95 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "number_gte" + "value": "id_lt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Int" + "value": "String" } }, "directives": [] - } - ], - "directives": [] - }, - { - "kind": "ScalarTypeDefinition", - "name": { - "kind": "Name", - "value": "Bytes" - }, - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Claim" - }, - "fields": [ + }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id" + "value": "id_gte" }, - "arguments": [], "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creation" + "value": "id_lte" }, - "arguments": [], "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID" + "value": "id_in" }, - "arguments": [], "type": { - "kind": "NonNullType", + "kind": "ListType", "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } } } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract" + "value": "id_not_in" }, - "arguments": [], "type": { - "kind": "NonNullType", + "kind": "ListType", "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } } } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri" + "value": "id_contains" }, - "arguments": [], "type": { "kind": "NamedType", "name": { @@ -1367,175 +1420,130 @@ const schemaAST = { "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator" + "value": "id_contains_nocase" }, - "arguments": [], "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner" + "value": "id_not_contains" }, - "arguments": [], "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "totalUnits" + "value": "id_not_contains_nocase" }, - "arguments": [], "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "ClaimToken" - }, - "fields": [ + }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id" + "value": "id_starts_with" }, - "arguments": [], "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID" + "value": "id_starts_with_nocase" }, - "arguments": [], "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim" + "value": "id_not_starts_with" }, - "arguments": [], "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner" + "value": "id_not_starts_with_nocase" }, - "arguments": [], "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "units" + "value": "id_ends_with" }, - "arguments": [], "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "ClaimToken_filter" - }, - "fields": [ + }, { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id" + "value": "id_ends_with_nocase" }, "type": { "kind": "NamedType", @@ -1550,7 +1558,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_not" + "value": "id_not_ends_with" }, "type": { "kind": "NamedType", @@ -1565,7 +1573,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_gt" + "value": "id_not_ends_with_nocase" }, "type": { "kind": "NamedType", @@ -1580,13 +1588,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_lt" + "value": "root" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -1595,13 +1603,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_gte" + "value": "root_not" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -1610,13 +1618,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_lte" + "value": "root_gt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -1625,19 +1633,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_in" + "value": "root_lt" }, "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" } }, "directives": [] @@ -1646,19 +1648,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_not_in" + "value": "root_gte" }, "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" } }, "directives": [] @@ -1667,13 +1663,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_contains" + "value": "root_lte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -1682,13 +1678,19 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_contains_nocase" + "value": "root_in" }, "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } } }, "directives": [] @@ -1697,13 +1699,19 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_not_contains" + "value": "root_not_in" }, "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } } }, "directives": [] @@ -1712,13 +1720,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_not_contains_nocase" + "value": "root_contains" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -1727,13 +1735,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_starts_with" + "value": "root_not_contains" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -1742,7 +1750,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_starts_with_nocase" + "value": "claim" }, "type": { "kind": "NamedType", @@ -1757,7 +1765,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_not_starts_with" + "value": "claim_not" }, "type": { "kind": "NamedType", @@ -1772,7 +1780,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_not_starts_with_nocase" + "value": "claim_gt" }, "type": { "kind": "NamedType", @@ -1787,7 +1795,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_ends_with" + "value": "claim_lt" }, "type": { "kind": "NamedType", @@ -1802,7 +1810,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_ends_with_nocase" + "value": "claim_gte" }, "type": { "kind": "NamedType", @@ -1817,7 +1825,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_not_ends_with" + "value": "claim_lte" }, "type": { "kind": "NamedType", @@ -1832,13 +1840,19 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "id_not_ends_with_nocase" + "value": "claim_in" }, "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } } }, "directives": [] @@ -1847,13 +1861,19 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID" + "value": "claim_not_in" }, "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } } }, "directives": [] @@ -1862,13 +1882,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_not" + "value": "claim_contains" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] @@ -1877,13 +1897,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_gt" + "value": "claim_contains_nocase" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] @@ -1892,13 +1912,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_lt" + "value": "claim_not_contains" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] @@ -1907,13 +1927,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_gte" + "value": "claim_not_contains_nocase" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] @@ -1922,13 +1942,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_lte" + "value": "claim_starts_with" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] @@ -1937,19 +1957,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_in" + "value": "claim_starts_with_nocase" }, "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] @@ -1958,19 +1972,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_not_in" + "value": "claim_not_starts_with" }, "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] @@ -1979,7 +1987,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim" + "value": "claim_not_starts_with_nocase" }, "type": { "kind": "NamedType", @@ -1994,7 +2002,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_not" + "value": "claim_ends_with" }, "type": { "kind": "NamedType", @@ -2009,7 +2017,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_gt" + "value": "claim_ends_with_nocase" }, "type": { "kind": "NamedType", @@ -2024,7 +2032,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_lt" + "value": "claim_not_ends_with" }, "type": { "kind": "NamedType", @@ -2039,7 +2047,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_gte" + "value": "claim_not_ends_with_nocase" }, "type": { "kind": "NamedType", @@ -2054,34 +2062,33 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_lte" + "value": "claim_" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Claim_filter" } }, "directives": [] }, { "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, "name": { "kind": "Name", - "value": "claim_in" + "value": "_change_block" }, "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" } }, "directives": [] @@ -2090,18 +2097,15 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_not_in" + "value": "and" }, "type": { "kind": "ListType", "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Allowlist_filter" } } }, @@ -2111,202 +2115,177 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_contains" + "value": "or" }, "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Allowlist_filter" + } } }, "directives": [] - }, + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "Allowlist_orderBy" + }, + "values": [ { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "id" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "root" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim__id" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim__creation" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim__tokenID" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim__contract" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim__uri" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim__creator" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim__owner" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "claim_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim__totalUnits" }, "directives": [] - }, + } + ], + "directives": [] + }, + { + "kind": "ScalarTypeDefinition", + "name": { + "kind": "Name", + "value": "BigDecimal" + }, + "directives": [] + }, + { + "kind": "ScalarTypeDefinition", + "name": { + "kind": "Name", + "value": "BigInt" + }, + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + }, + "fields": [ { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim_" + "value": "number_gte" }, "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_filter" + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } } }, "directives": [] - }, + } + ], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Block_height" + }, + "fields": [ { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner" + "value": "hash" }, "type": { "kind": "NamedType", @@ -2321,13 +2300,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner_not" + "value": "number" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "Int" } }, "directives": [] @@ -2336,125 +2315,134 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner_gt" + "value": "number_gte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "Int" } }, "directives": [] - }, + } + ], + "directives": [] + }, + { + "kind": "ScalarTypeDefinition", + "name": { + "kind": "Name", + "value": "Bytes" + }, + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Claim" + }, + "fields": [ { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "owner_lt" + "value": "id" }, + "arguments": [], "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } } }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "owner_gte" + "value": "creation" }, + "arguments": [], "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } } }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "owner_in" + "value": "tokenID" }, + "arguments": [], "type": { - "kind": "ListType", + "kind": "NonNullType", "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" } } }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "owner_not_in" + "value": "contract" }, + "arguments": [], "type": { - "kind": "ListType", + "kind": "NonNullType", "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } } }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "owner_contains" + "value": "uri" }, + "arguments": [], "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "owner_not_contains" + "value": "creator" }, + "arguments": [], "type": { "kind": "NamedType", "name": { @@ -2465,71 +2453,28 @@ const schemaAST = { "directives": [] }, { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "units" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "units_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "units_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "units_lt" + "value": "owner" }, + "arguments": [], "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "Bytes" } }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "units_gte" + "value": "totalUnits" }, + "arguments": [], "type": { "kind": "NamedType", "name": { @@ -2540,240 +2485,242 @@ const schemaAST = { "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "units_lte" + "value": "allowlist" }, + "arguments": [], "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "Allowlist" } }, "directives": [] - }, + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "ClaimToken" + }, + "fields": [ { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "units_in" + "value": "id" }, + "arguments": [], "type": { - "kind": "ListType", + "kind": "NonNullType", "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } } }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "units_not_in" + "value": "tokenID" }, + "arguments": [], "type": { - "kind": "ListType", + "kind": "NonNullType", "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" } } }, "directives": [] }, { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Filter for the block changed event.", - "block": true - }, + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "_change_block" + "value": "claim" }, + "arguments": [], "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BlockChangedFilter" + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim" + } } }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "and" + "value": "owner" }, + "arguments": [], "type": { - "kind": "ListType", + "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimToken_filter" + "value": "Bytes" } } }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "or" + "value": "units" }, + "arguments": [], "type": { - "kind": "ListType", + "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimToken_filter" + "value": "BigInt" } } }, "directives": [] - } - ], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "ClaimToken_orderBy" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID" - }, - "directives": [] }, { - "kind": "EnumValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "claim" + "value": "offers" }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__creation" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__tokenID" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__contract" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__uri" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__creator" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__owner" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__totalUnits" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "owner" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "units" + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer_filter" + } + }, + "directives": [] + } + ], + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer" + } + } + } }, "directives": [] } ], + "interfaces": [], "directives": [] }, { "kind": "InputObjectTypeDefinition", "name": { "kind": "Name", - "value": "Claim_filter" + "value": "ClaimToken_filter" }, "fields": [ { @@ -3092,7 +3039,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creation" + "value": "tokenID" }, "type": { "kind": "NamedType", @@ -3107,7 +3054,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creation_not" + "value": "tokenID_not" }, "type": { "kind": "NamedType", @@ -3122,7 +3069,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creation_gt" + "value": "tokenID_gt" }, "type": { "kind": "NamedType", @@ -3137,7 +3084,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creation_lt" + "value": "tokenID_lt" }, "type": { "kind": "NamedType", @@ -3152,7 +3099,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creation_gte" + "value": "tokenID_gte" }, "type": { "kind": "NamedType", @@ -3167,7 +3114,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creation_lte" + "value": "tokenID_lte" }, "type": { "kind": "NamedType", @@ -3182,7 +3129,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creation_in" + "value": "tokenID_in" }, "type": { "kind": "ListType", @@ -3203,7 +3150,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creation_not_in" + "value": "tokenID_not_in" }, "type": { "kind": "ListType", @@ -3224,13 +3171,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID" + "value": "claim" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] @@ -3239,13 +3186,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_not" + "value": "claim_not" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] @@ -3254,13 +3201,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_gt" + "value": "claim_gt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] @@ -3269,13 +3216,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_lt" + "value": "claim_lt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] @@ -3284,13 +3231,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_gte" + "value": "claim_gte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] @@ -3299,13 +3246,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_lte" + "value": "claim_lte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } }, "directives": [] @@ -3314,7 +3261,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_in" + "value": "claim_in" }, "type": { "kind": "ListType", @@ -3324,7 +3271,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } } } @@ -3335,7 +3282,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID_not_in" + "value": "claim_not_in" }, "type": { "kind": "ListType", @@ -3345,7 +3292,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BigInt" + "value": "String" } } } @@ -3356,7 +3303,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract" + "value": "claim_contains" }, "type": { "kind": "NamedType", @@ -3371,7 +3318,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_not" + "value": "claim_contains_nocase" }, "type": { "kind": "NamedType", @@ -3386,7 +3333,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_gt" + "value": "claim_not_contains" }, "type": { "kind": "NamedType", @@ -3401,7 +3348,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_lt" + "value": "claim_not_contains_nocase" }, "type": { "kind": "NamedType", @@ -3416,7 +3363,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_gte" + "value": "claim_starts_with" }, "type": { "kind": "NamedType", @@ -3431,7 +3378,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_lte" + "value": "claim_starts_with_nocase" }, "type": { "kind": "NamedType", @@ -3446,19 +3393,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_in" + "value": "claim_not_starts_with" }, "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] @@ -3467,19 +3408,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_not_in" + "value": "claim_not_starts_with_nocase" }, "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] @@ -3488,7 +3423,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_contains" + "value": "claim_ends_with" }, "type": { "kind": "NamedType", @@ -3503,7 +3438,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_contains_nocase" + "value": "claim_ends_with_nocase" }, "type": { "kind": "NamedType", @@ -3518,7 +3453,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_not_contains" + "value": "claim_not_ends_with" }, "type": { "kind": "NamedType", @@ -3533,7 +3468,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_not_contains_nocase" + "value": "claim_not_ends_with_nocase" }, "type": { "kind": "NamedType", @@ -3548,13 +3483,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_starts_with" + "value": "claim_" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Claim_filter" } }, "directives": [] @@ -3563,13 +3498,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_starts_with_nocase" + "value": "owner" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -3578,13 +3513,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_not_starts_with" + "value": "owner_not" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -3593,13 +3528,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_not_starts_with_nocase" + "value": "owner_gt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -3608,13 +3543,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_ends_with" + "value": "owner_lt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -3623,13 +3558,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_ends_with_nocase" + "value": "owner_gte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -3638,13 +3573,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_not_ends_with" + "value": "owner_lte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -3653,13 +3588,55 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract_not_ends_with_nocase" + "value": "owner_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_contains" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -3668,13 +3645,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri" + "value": "owner_not_contains" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Bytes" } }, "directives": [] @@ -3683,13 +3660,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri_not" + "value": "units" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } }, "directives": [] @@ -3698,13 +3675,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri_gt" + "value": "units_not" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } }, "directives": [] @@ -3713,13 +3690,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri_lt" + "value": "units_gt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } }, "directives": [] @@ -3728,13 +3705,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri_gte" + "value": "units_lt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } }, "directives": [] @@ -3743,13 +3720,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri_lte" + "value": "units_gte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } }, "directives": [] @@ -3758,7 +3735,22 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri_in" + "value": "units_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "units_in" }, "type": { "kind": "ListType", @@ -3768,7 +3760,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } } } @@ -3779,7 +3771,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri_not_in" + "value": "units_not_in" }, "type": { "kind": "ListType", @@ -3789,7 +3781,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BigInt" } } } @@ -3800,28 +3792,33 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri_contains" + "value": "offers_" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "Offer_filter" } }, "directives": [] }, { "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, "name": { "kind": "Name", - "value": "uri_contains_nocase" + "value": "_change_block" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "String" + "value": "BlockChangedFilter" } }, "directives": [] @@ -3830,13 +3827,16 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri_not_contains" + "value": "and" }, "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken_filter" + } } }, "directives": [] @@ -3845,148 +3845,163 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri_not_contains_nocase" + "value": "or" }, "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken_filter" + } } }, "directives": [] - }, + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "ClaimToken_orderBy" + }, + "values": [ { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "uri_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "id" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "uri_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "tokenID" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "uri_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "uri_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim__id" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "uri_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim__creation" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "uri_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "value": "claim__tokenID" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "uri_not_ends_with" + "value": "claim__contract" }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "claim__uri" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "uri_not_ends_with_nocase" + "value": "claim__creator" }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "claim__owner" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "claim__totalUnits" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "units" }, "directives": [] }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "offers" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Claim_filter" + }, + "fields": [ { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator" + "value": "id" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -3995,13 +4010,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator_not" + "value": "id_not" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4010,13 +4025,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator_gt" + "value": "id_gt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4025,13 +4040,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator_lt" + "value": "id_lt" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4040,13 +4055,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator_gte" + "value": "id_gte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4055,13 +4070,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator_lte" + "value": "id_lte" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4070,7 +4085,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator_in" + "value": "id_in" }, "type": { "kind": "ListType", @@ -4080,7 +4095,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } } } @@ -4091,7 +4106,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator_not_in" + "value": "id_not_in" }, "type": { "kind": "ListType", @@ -4101,7 +4116,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } } } @@ -4112,13 +4127,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator_contains" + "value": "id_contains" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4127,13 +4142,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator_not_contains" + "value": "id_contains_nocase" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4142,13 +4157,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner" + "value": "id_not_contains" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4157,13 +4172,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner_not" + "value": "id_not_contains_nocase" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4172,13 +4187,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner_gt" + "value": "id_starts_with" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4187,13 +4202,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner_lt" + "value": "id_starts_with_nocase" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4202,13 +4217,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner_gte" + "value": "id_not_starts_with" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4217,13 +4232,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner_lte" + "value": "id_not_starts_with_nocase" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4232,19 +4247,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner_in" + "value": "id_ends_with" }, "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] @@ -4253,19 +4262,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner_not_in" + "value": "id_ends_with_nocase" }, "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] @@ -4274,13 +4277,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner_contains" + "value": "id_not_ends_with" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4289,13 +4292,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner_not_contains" + "value": "id_not_ends_with_nocase" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "String" } }, "directives": [] @@ -4304,7 +4307,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "totalUnits" + "value": "creation" }, "type": { "kind": "NamedType", @@ -4319,7 +4322,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "totalUnits_not" + "value": "creation_not" }, "type": { "kind": "NamedType", @@ -4334,7 +4337,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "totalUnits_gt" + "value": "creation_gt" }, "type": { "kind": "NamedType", @@ -4349,7 +4352,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "totalUnits_lt" + "value": "creation_lt" }, "type": { "kind": "NamedType", @@ -4364,7 +4367,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "totalUnits_gte" + "value": "creation_gte" }, "type": { "kind": "NamedType", @@ -4379,7 +4382,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "totalUnits_lte" + "value": "creation_lte" }, "type": { "kind": "NamedType", @@ -4394,7 +4397,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "totalUnits_in" + "value": "creation_in" }, "type": { "kind": "ListType", @@ -4415,7 +4418,7 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "totalUnits_not_in" + "value": "creation_not_in" }, "type": { "kind": "ListType", @@ -4434,20 +4437,15 @@ const schemaAST = { }, { "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Filter for the block changed event.", - "block": true - }, "name": { "kind": "Name", - "value": "_change_block" + "value": "tokenID" }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BlockChangedFilter" + "value": "BigInt" } }, "directives": [] @@ -4456,16 +4454,13 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "and" + "value": "tokenID_not" }, "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_filter" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" } }, "directives": [] @@ -4474,618 +4469,9247 @@ const schemaAST = { "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "or" + "value": "tokenID_gt" }, "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_filter" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" } }, "directives": [] - } - ], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "Claim_orderBy" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "directives": [] }, { - "kind": "EnumValueDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creation" + "value": "tokenID_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } }, "directives": [] }, { - "kind": "EnumValueDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "tokenID" + "value": "tokenID_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } }, "directives": [] }, { - "kind": "EnumValueDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "contract" + "value": "tokenID_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } }, "directives": [] }, { - "kind": "EnumValueDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "uri" + "value": "tokenID_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } }, "directives": [] }, { - "kind": "EnumValueDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "creator" + "value": "tokenID_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } }, "directives": [] }, { - "kind": "EnumValueDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "owner" + "value": "contract" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } }, "directives": [] }, { - "kind": "EnumValueDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "totalUnits" + "value": "contract_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } }, "directives": [] - } - ], - "directives": [] - }, - { - "kind": "ScalarTypeDefinition", - "description": { - "kind": "StringValue", - "value": "8 bytes signed integer\n", - "block": true - }, - "name": { - "kind": "Name", - "value": "Int8" - }, - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "description": { - "kind": "StringValue", - "value": "Defines the order direction, either ascending or descending", - "block": true - }, - "name": { - "kind": "Name", - "value": "OrderDirection" - }, - "values": [ + }, { - "kind": "EnumValueDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "asc" + "value": "contract_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } }, "directives": [] }, { - "kind": "EnumValueDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "desc" + "value": "contract_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } }, "directives": [] - } - ], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Query" - }, - "fields": [ + }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "allowlist" + "value": "contract_gte" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } - ], + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_lte" + }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Allowlist" + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "allowlists" + "value": "contract_in" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Int" + "value": "String" } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } + "value": "String" } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] + } } - ], + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_contains" + }, "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist" - } - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim" + "value": "contract_contains_nocase" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } - ], + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_not_contains" + }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Claim" + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claims" + "value": "contract_not_contains_nocase" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "contract_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "creator" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "creator_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "creator_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "creator_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "creator_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "creator_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "creator_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "creator_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "creator_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "creator_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "totalUnits" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "totalUnits_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "totalUnits_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "totalUnits_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "totalUnits_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "totalUnits_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "totalUnits_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "totalUnits_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Allowlist_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "Claim_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "creation" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "tokenID" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "contract" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "uri" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "creator" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "totalUnits" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist__id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "allowlist__root" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ScalarTypeDefinition", + "description": { + "kind": "StringValue", + "value": "8 bytes signed integer\n", + "block": true + }, + "name": { + "kind": "Name", + "value": "Int8" + }, + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Offer" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "fractionID" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "unitsAvailable" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "minUnitsPerTrade" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "maxUnitsPerTrade" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "status" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OfferStatus" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "acceptedTokens" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken_filter" + } + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken" + } + } + } + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "OfferStatus" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "Open" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "Fulfilled" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "Cancelled" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Offer_filter" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsAvailable" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsAvailable_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsAvailable_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsAvailable_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsAvailable_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsAvailable_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsAvailable_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsAvailable_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minUnitsPerTrade" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minUnitsPerTrade_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minUnitsPerTrade_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minUnitsPerTrade_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minUnitsPerTrade_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minUnitsPerTrade_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minUnitsPerTrade_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minUnitsPerTrade_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "maxUnitsPerTrade" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "maxUnitsPerTrade_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "maxUnitsPerTrade_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "maxUnitsPerTrade_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "maxUnitsPerTrade_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "maxUnitsPerTrade_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "maxUnitsPerTrade_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "maxUnitsPerTrade_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "status" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OfferStatus" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "status_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OfferStatus" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "status_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OfferStatus" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "status_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OfferStatus" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "acceptedTokens" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "acceptedTokens_not" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "acceptedTokens_contains" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "acceptedTokens_contains_nocase" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "acceptedTokens_not_contains" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "acceptedTokens_not_contains_nocase" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "acceptedTokens_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "Offer_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID__id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID__tokenID" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID__owner" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "fractionID__units" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "unitsAvailable" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "minUnitsPerTrade" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "maxUnitsPerTrade" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "status" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "acceptedTokens" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "description": { + "kind": "StringValue", + "value": "Defines the order direction, either ascending or descending", + "block": true + }, + "name": { + "kind": "Name", + "value": "OrderDirection" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "asc" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "desc" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Query" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "allowlist" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Allowlist" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "allowlists" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Allowlist_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Allowlist_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Allowlist" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "claim" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "claims" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "claimToken" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "claimTokens" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "token" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "tokens" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "acceptedToken" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "acceptedTokens" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "offer" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "offers" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "trade" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Trade" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "trades" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Trade_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Trade_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Trade" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "description": { + "kind": "StringValue", + "value": "Access to subgraph metadata", + "block": true + }, + "name": { + "kind": "Name", + "value": "_meta" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_Meta_" + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Subscription" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "allowlist" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Allowlist" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "allowlists" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Allowlist_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Allowlist_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Allowlist" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "claim" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "claims" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Claim" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "claimToken" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "claimTokens" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ClaimToken" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "token" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "tokens" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "acceptedToken" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "acceptedTokens" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "AcceptedToken" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "offer" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "offers" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "trade" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Trade" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "trades" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Trade_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Trade_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Trade" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "description": { + "kind": "StringValue", + "value": "Access to subgraph metadata", + "block": true + }, + "name": { + "kind": "Name", + "value": "_meta" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_Meta_" + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Token" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "name" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "symbol" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "decimals" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Token_filter" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "symbol_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "decimals" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "decimals_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "decimals_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "decimals_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "decimals_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "decimals_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "decimals_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "decimals_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "Token_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "name" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "symbol" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "decimals" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Trade" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "buyer" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "offerID" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "unitsSold" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "token" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "amountPerUnit" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Trade_filter" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "buyer" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "buyer_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "buyer_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "buyer_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "buyer_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "buyer_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "buyer_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Int" + "value": "Bytes" } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "buyer_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "buyer_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "buyer_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Claim_orderBy" + "value": "String" } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "OrderDirection" + "value": "String" } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "offerID_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Offer_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsSold" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsSold_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsSold_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsSold_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsSold_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsSold_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsSold_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Claim_filter" + "value": "BigInt" } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "unitsSold_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } + "value": "BigInt" } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] + } } - ], + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token" + }, "type": { - "kind": "NonNullType", + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_in" + }, + "type": { + "kind": "ListType", "type": { - "kind": "ListType", + "kind": "NonNullType", "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } } } @@ -5093,999 +13717,347 @@ const schemaAST = { "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claimToken" + "value": "token_not_in" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } + "value": "String" } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] + } } - ], + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_contains" + }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimToken" + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claimTokens" + "value": "token_contains_nocase" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } - ], + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_not_contains" + }, "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken" - } - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", - "description": { - "kind": "StringValue", - "value": "Access to subgraph metadata", - "block": true - }, + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "_meta" + "value": "token_not_contains_nocase" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - } - ], "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "_Meta_" + "value": "String" } }, "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Subscription" - }, - "fields": [ + }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "allowlist" + "value": "token_starts_with" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Allowlist" + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "allowlists" + "value": "token_starts_with_nocase" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } - ], + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_not_starts_with_nocase" + }, "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist" - } - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claim" + "value": "token_ends_with" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } - ], + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_ends_with_nocase" + }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Claim" + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claims" + "value": "token_not_ends_with" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } - ], + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "token_not_ends_with_nocase" + }, "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim" - } - } - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claimToken" + "value": "token_" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token_filter" } - ], + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amountPerUnit" + }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimToken" + "value": "BigInt" } }, "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "claimTokens" + "value": "amountPerUnit_not" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amountPerUnit_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amountPerUnit_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amountPerUnit_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amountPerUnit_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amountPerUnit_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } + "value": "BigInt" } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] + } } - ], + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amountPerUnit_not_in" + }, "type": { - "kind": "NonNullType", + "kind": "ListType", "type": { - "kind": "ListType", + "kind": "NonNullType", "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken" - } + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" } } } @@ -6093,44 +14065,192 @@ const schemaAST = { "directives": [] }, { - "kind": "FieldDefinition", + "kind": "InputValueDefinition", "description": { "kind": "StringValue", - "value": "Access to subgraph metadata", + "value": "Filter for the block changed event.", "block": true }, "name": { "kind": "Name", - "value": "_meta" + "value": "_change_block" }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - } - ], "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "_Meta_" + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Trade_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Trade_filter" + } } }, "directives": [] } ], - "interfaces": [], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "Trade_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "buyer" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "offerID" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "offerID__id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "offerID__unitsAvailable" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "offerID__minUnitsPerTrade" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "offerID__maxUnitsPerTrade" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "offerID__status" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "unitsSold" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "token" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "token__id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "token__name" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "token__symbol" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "token__decimals" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "amountPerUnit" + }, + "directives": [] + } + ], "directives": [] }, { diff --git a/sdk/.graphclient/sources/Hypercerts/schema.graphql b/sdk/.graphclient/sources/Hypercerts/schema.graphql index efc1bd8f..b44cef4d 100644 --- a/sdk/.graphclient/sources/Hypercerts/schema.graphql +++ b/sdk/.graphclient/sources/Hypercerts/schema.graphql @@ -12,6 +12,84 @@ directive @subgraphId(id: String!) on OBJECT "creates a virtual field on the entity that may be queried but cannot be set manually through the mappings API." directive @derivedFrom(field: String!) on FIELD_DEFINITION +type AcceptedToken { + id: String! + token: Token! + minimumAmountPerUnit: BigInt! + accepted: Boolean! +} + +input AcceptedToken_filter { + id: String + id_not: String + id_gt: String + id_lt: String + id_gte: String + id_lte: String + id_in: [String!] + id_not_in: [String!] + id_contains: String + id_contains_nocase: String + id_not_contains: String + id_not_contains_nocase: String + id_starts_with: String + id_starts_with_nocase: String + id_not_starts_with: String + id_not_starts_with_nocase: String + id_ends_with: String + id_ends_with_nocase: String + id_not_ends_with: String + id_not_ends_with_nocase: String + token: String + token_not: String + token_gt: String + token_lt: String + token_gte: String + token_lte: String + token_in: [String!] + token_not_in: [String!] + token_contains: String + token_contains_nocase: String + token_not_contains: String + token_not_contains_nocase: String + token_starts_with: String + token_starts_with_nocase: String + token_not_starts_with: String + token_not_starts_with_nocase: String + token_ends_with: String + token_ends_with_nocase: String + token_not_ends_with: String + token_not_ends_with_nocase: String + token_: Token_filter + minimumAmountPerUnit: BigInt + minimumAmountPerUnit_not: BigInt + minimumAmountPerUnit_gt: BigInt + minimumAmountPerUnit_lt: BigInt + minimumAmountPerUnit_gte: BigInt + minimumAmountPerUnit_lte: BigInt + minimumAmountPerUnit_in: [BigInt!] + minimumAmountPerUnit_not_in: [BigInt!] + accepted: Boolean + accepted_not: Boolean + accepted_in: [Boolean!] + accepted_not_in: [Boolean!] + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [AcceptedToken_filter] + or: [AcceptedToken_filter] +} + +enum AcceptedToken_orderBy { + id + token + token__id + token__name + token__symbol + token__decimals + minimumAmountPerUnit + accepted +} + type Allowlist { id: String! root: Bytes! @@ -115,6 +193,7 @@ type Claim { creator: Bytes owner: Bytes totalUnits: BigInt + allowlist: Allowlist } type ClaimToken { @@ -123,6 +202,7 @@ type ClaimToken { claim: Claim! owner: Bytes! units: BigInt! + offers(skip: Int = 0, first: Int = 100, orderBy: Offer_orderBy, orderDirection: OrderDirection, where: Offer_filter): [Offer!] } input ClaimToken_filter { @@ -193,6 +273,7 @@ input ClaimToken_filter { units_lte: BigInt units_in: [BigInt!] units_not_in: [BigInt!] + offers_: Offer_filter """Filter for the block changed event.""" _change_block: BlockChangedFilter and: [ClaimToken_filter] @@ -213,6 +294,7 @@ enum ClaimToken_orderBy { claim__totalUnits owner units + offers } input Claim_filter { @@ -320,6 +402,27 @@ input Claim_filter { totalUnits_lte: BigInt totalUnits_in: [BigInt!] totalUnits_not_in: [BigInt!] + allowlist: String + allowlist_not: String + allowlist_gt: String + allowlist_lt: String + allowlist_gte: String + allowlist_lte: String + allowlist_in: [String!] + allowlist_not_in: [String!] + allowlist_contains: String + allowlist_contains_nocase: String + allowlist_not_contains: String + allowlist_not_contains_nocase: String + allowlist_starts_with: String + allowlist_starts_with_nocase: String + allowlist_not_starts_with: String + allowlist_not_starts_with_nocase: String + allowlist_ends_with: String + allowlist_ends_with_nocase: String + allowlist_not_ends_with: String + allowlist_not_ends_with_nocase: String + allowlist_: Allowlist_filter """Filter for the block changed event.""" _change_block: BlockChangedFilter and: [Claim_filter] @@ -335,6 +438,9 @@ enum Claim_orderBy { creator owner totalUnits + allowlist + allowlist__id + allowlist__root } """ @@ -343,6 +449,119 @@ enum Claim_orderBy { """ scalar Int8 +type Offer { + id: String! + fractionID: ClaimToken! + unitsAvailable: BigInt! + minUnitsPerTrade: BigInt! + maxUnitsPerTrade: BigInt! + status: OfferStatus! + acceptedTokens(skip: Int = 0, first: Int = 100, orderBy: AcceptedToken_orderBy, orderDirection: OrderDirection, where: AcceptedToken_filter): [AcceptedToken!]! +} + +enum OfferStatus { + Open + Fulfilled + Cancelled +} + +input Offer_filter { + id: String + id_not: String + id_gt: String + id_lt: String + id_gte: String + id_lte: String + id_in: [String!] + id_not_in: [String!] + id_contains: String + id_contains_nocase: String + id_not_contains: String + id_not_contains_nocase: String + id_starts_with: String + id_starts_with_nocase: String + id_not_starts_with: String + id_not_starts_with_nocase: String + id_ends_with: String + id_ends_with_nocase: String + id_not_ends_with: String + id_not_ends_with_nocase: String + fractionID: String + fractionID_not: String + fractionID_gt: String + fractionID_lt: String + fractionID_gte: String + fractionID_lte: String + fractionID_in: [String!] + fractionID_not_in: [String!] + fractionID_contains: String + fractionID_contains_nocase: String + fractionID_not_contains: String + fractionID_not_contains_nocase: String + fractionID_starts_with: String + fractionID_starts_with_nocase: String + fractionID_not_starts_with: String + fractionID_not_starts_with_nocase: String + fractionID_ends_with: String + fractionID_ends_with_nocase: String + fractionID_not_ends_with: String + fractionID_not_ends_with_nocase: String + fractionID_: ClaimToken_filter + unitsAvailable: BigInt + unitsAvailable_not: BigInt + unitsAvailable_gt: BigInt + unitsAvailable_lt: BigInt + unitsAvailable_gte: BigInt + unitsAvailable_lte: BigInt + unitsAvailable_in: [BigInt!] + unitsAvailable_not_in: [BigInt!] + minUnitsPerTrade: BigInt + minUnitsPerTrade_not: BigInt + minUnitsPerTrade_gt: BigInt + minUnitsPerTrade_lt: BigInt + minUnitsPerTrade_gte: BigInt + minUnitsPerTrade_lte: BigInt + minUnitsPerTrade_in: [BigInt!] + minUnitsPerTrade_not_in: [BigInt!] + maxUnitsPerTrade: BigInt + maxUnitsPerTrade_not: BigInt + maxUnitsPerTrade_gt: BigInt + maxUnitsPerTrade_lt: BigInt + maxUnitsPerTrade_gte: BigInt + maxUnitsPerTrade_lte: BigInt + maxUnitsPerTrade_in: [BigInt!] + maxUnitsPerTrade_not_in: [BigInt!] + status: OfferStatus + status_not: OfferStatus + status_in: [OfferStatus!] + status_not_in: [OfferStatus!] + acceptedTokens: [String!] + acceptedTokens_not: [String!] + acceptedTokens_contains: [String!] + acceptedTokens_contains_nocase: [String!] + acceptedTokens_not_contains: [String!] + acceptedTokens_not_contains_nocase: [String!] + acceptedTokens_: AcceptedToken_filter + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [Offer_filter] + or: [Offer_filter] +} + +enum Offer_orderBy { + id + fractionID + fractionID__id + fractionID__tokenID + fractionID__owner + fractionID__units + unitsAvailable + minUnitsPerTrade + maxUnitsPerTrade + status + acceptedTokens +} + """Defines the order direction, either ascending or descending""" enum OrderDirection { asc @@ -428,6 +647,110 @@ type Query { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [ClaimToken!]! + token( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Token + tokens( + skip: Int = 0 + first: Int = 100 + orderBy: Token_orderBy + orderDirection: OrderDirection + where: Token_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Token!]! + acceptedToken( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): AcceptedToken + acceptedTokens( + skip: Int = 0 + first: Int = 100 + orderBy: AcceptedToken_orderBy + orderDirection: OrderDirection + where: AcceptedToken_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [AcceptedToken!]! + offer( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Offer + offers( + skip: Int = 0 + first: Int = 100 + orderBy: Offer_orderBy + orderDirection: OrderDirection + where: Offer_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Offer!]! + trade( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Trade + trades( + skip: Int = 0 + first: Int = 100 + orderBy: Trade_orderBy + orderDirection: OrderDirection + where: Trade_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Trade!]! """Access to subgraph metadata""" _meta(block: Block_height): _Meta_ } @@ -511,10 +834,325 @@ type Subscription { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [ClaimToken!]! + token( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Token + tokens( + skip: Int = 0 + first: Int = 100 + orderBy: Token_orderBy + orderDirection: OrderDirection + where: Token_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Token!]! + acceptedToken( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): AcceptedToken + acceptedTokens( + skip: Int = 0 + first: Int = 100 + orderBy: AcceptedToken_orderBy + orderDirection: OrderDirection + where: AcceptedToken_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [AcceptedToken!]! + offer( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Offer + offers( + skip: Int = 0 + first: Int = 100 + orderBy: Offer_orderBy + orderDirection: OrderDirection + where: Offer_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Offer!]! + trade( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Trade + trades( + skip: Int = 0 + first: Int = 100 + orderBy: Trade_orderBy + orderDirection: OrderDirection + where: Trade_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Trade!]! """Access to subgraph metadata""" _meta(block: Block_height): _Meta_ } +type Token { + id: String! + name: String! + symbol: String + decimals: BigInt +} + +input Token_filter { + id: String + id_not: String + id_gt: String + id_lt: String + id_gte: String + id_lte: String + id_in: [String!] + id_not_in: [String!] + id_contains: String + id_contains_nocase: String + id_not_contains: String + id_not_contains_nocase: String + id_starts_with: String + id_starts_with_nocase: String + id_not_starts_with: String + id_not_starts_with_nocase: String + id_ends_with: String + id_ends_with_nocase: String + id_not_ends_with: String + id_not_ends_with_nocase: String + name: String + name_not: String + name_gt: String + name_lt: String + name_gte: String + name_lte: String + name_in: [String!] + name_not_in: [String!] + name_contains: String + name_contains_nocase: String + name_not_contains: String + name_not_contains_nocase: String + name_starts_with: String + name_starts_with_nocase: String + name_not_starts_with: String + name_not_starts_with_nocase: String + name_ends_with: String + name_ends_with_nocase: String + name_not_ends_with: String + name_not_ends_with_nocase: String + symbol: String + symbol_not: String + symbol_gt: String + symbol_lt: String + symbol_gte: String + symbol_lte: String + symbol_in: [String!] + symbol_not_in: [String!] + symbol_contains: String + symbol_contains_nocase: String + symbol_not_contains: String + symbol_not_contains_nocase: String + symbol_starts_with: String + symbol_starts_with_nocase: String + symbol_not_starts_with: String + symbol_not_starts_with_nocase: String + symbol_ends_with: String + symbol_ends_with_nocase: String + symbol_not_ends_with: String + symbol_not_ends_with_nocase: String + decimals: BigInt + decimals_not: BigInt + decimals_gt: BigInt + decimals_lt: BigInt + decimals_gte: BigInt + decimals_lte: BigInt + decimals_in: [BigInt!] + decimals_not_in: [BigInt!] + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [Token_filter] + or: [Token_filter] +} + +enum Token_orderBy { + id + name + symbol + decimals +} + +type Trade { + id: String! + buyer: Bytes! + offerID: Offer! + unitsSold: BigInt! + token: Token! + amountPerUnit: BigInt! +} + +input Trade_filter { + id: String + id_not: String + id_gt: String + id_lt: String + id_gte: String + id_lte: String + id_in: [String!] + id_not_in: [String!] + id_contains: String + id_contains_nocase: String + id_not_contains: String + id_not_contains_nocase: String + id_starts_with: String + id_starts_with_nocase: String + id_not_starts_with: String + id_not_starts_with_nocase: String + id_ends_with: String + id_ends_with_nocase: String + id_not_ends_with: String + id_not_ends_with_nocase: String + buyer: Bytes + buyer_not: Bytes + buyer_gt: Bytes + buyer_lt: Bytes + buyer_gte: Bytes + buyer_lte: Bytes + buyer_in: [Bytes!] + buyer_not_in: [Bytes!] + buyer_contains: Bytes + buyer_not_contains: Bytes + offerID: String + offerID_not: String + offerID_gt: String + offerID_lt: String + offerID_gte: String + offerID_lte: String + offerID_in: [String!] + offerID_not_in: [String!] + offerID_contains: String + offerID_contains_nocase: String + offerID_not_contains: String + offerID_not_contains_nocase: String + offerID_starts_with: String + offerID_starts_with_nocase: String + offerID_not_starts_with: String + offerID_not_starts_with_nocase: String + offerID_ends_with: String + offerID_ends_with_nocase: String + offerID_not_ends_with: String + offerID_not_ends_with_nocase: String + offerID_: Offer_filter + unitsSold: BigInt + unitsSold_not: BigInt + unitsSold_gt: BigInt + unitsSold_lt: BigInt + unitsSold_gte: BigInt + unitsSold_lte: BigInt + unitsSold_in: [BigInt!] + unitsSold_not_in: [BigInt!] + token: String + token_not: String + token_gt: String + token_lt: String + token_gte: String + token_lte: String + token_in: [String!] + token_not_in: [String!] + token_contains: String + token_contains_nocase: String + token_not_contains: String + token_not_contains_nocase: String + token_starts_with: String + token_starts_with_nocase: String + token_not_starts_with: String + token_not_starts_with_nocase: String + token_ends_with: String + token_ends_with_nocase: String + token_not_ends_with: String + token_not_ends_with_nocase: String + token_: Token_filter + amountPerUnit: BigInt + amountPerUnit_not: BigInt + amountPerUnit_gt: BigInt + amountPerUnit_lt: BigInt + amountPerUnit_gte: BigInt + amountPerUnit_lte: BigInt + amountPerUnit_in: [BigInt!] + amountPerUnit_not_in: [BigInt!] + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [Trade_filter] + or: [Trade_filter] +} + +enum Trade_orderBy { + id + buyer + offerID + offerID__id + offerID__unitsAvailable + offerID__minUnitsPerTrade + offerID__maxUnitsPerTrade + offerID__status + unitsSold + token + token__id + token__name + token__symbol + token__decimals + amountPerUnit +} + type _Block_ { """The hash of the block""" hash: Bytes diff --git a/sdk/.graphclient/sources/Hypercerts/types.ts b/sdk/.graphclient/sources/Hypercerts/types.ts index 7481600c..f4d8e092 100644 --- a/sdk/.graphclient/sources/Hypercerts/types.ts +++ b/sdk/.graphclient/sources/Hypercerts/types.ts @@ -22,6 +22,83 @@ export type Scalars = { Int8: any; }; +export type AcceptedToken = { + id: Scalars['String']; + token: Token; + minimumAmountPerUnit: Scalars['BigInt']; + accepted: Scalars['Boolean']; +}; + +export type AcceptedToken_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + token?: InputMaybe; + token_not?: InputMaybe; + token_gt?: InputMaybe; + token_lt?: InputMaybe; + token_gte?: InputMaybe; + token_lte?: InputMaybe; + token_in?: InputMaybe>; + token_not_in?: InputMaybe>; + token_contains?: InputMaybe; + token_contains_nocase?: InputMaybe; + token_not_contains?: InputMaybe; + token_not_contains_nocase?: InputMaybe; + token_starts_with?: InputMaybe; + token_starts_with_nocase?: InputMaybe; + token_not_starts_with?: InputMaybe; + token_not_starts_with_nocase?: InputMaybe; + token_ends_with?: InputMaybe; + token_ends_with_nocase?: InputMaybe; + token_not_ends_with?: InputMaybe; + token_not_ends_with_nocase?: InputMaybe; + token_?: InputMaybe; + minimumAmountPerUnit?: InputMaybe; + minimumAmountPerUnit_not?: InputMaybe; + minimumAmountPerUnit_gt?: InputMaybe; + minimumAmountPerUnit_lt?: InputMaybe; + minimumAmountPerUnit_gte?: InputMaybe; + minimumAmountPerUnit_lte?: InputMaybe; + minimumAmountPerUnit_in?: InputMaybe>; + minimumAmountPerUnit_not_in?: InputMaybe>; + accepted?: InputMaybe; + accepted_not?: InputMaybe; + accepted_in?: InputMaybe>; + accepted_not_in?: InputMaybe>; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type AcceptedToken_orderBy = + | 'id' + | 'token' + | 'token__id' + | 'token__name' + | 'token__symbol' + | 'token__decimals' + | 'minimumAmountPerUnit' + | 'accepted'; + export type Allowlist = { id: Scalars['String']; root: Scalars['Bytes']; @@ -118,6 +195,7 @@ export type Claim = { creator?: Maybe; owner?: Maybe; totalUnits?: Maybe; + allowlist?: Maybe; }; export type ClaimToken = { @@ -126,6 +204,16 @@ export type ClaimToken = { claim: Claim; owner: Scalars['Bytes']; units: Scalars['BigInt']; + offers?: Maybe>; +}; + + +export type ClaimTokenoffersArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; }; export type ClaimToken_filter = { @@ -196,6 +284,7 @@ export type ClaimToken_filter = { units_lte?: InputMaybe; units_in?: InputMaybe>; units_not_in?: InputMaybe>; + offers_?: InputMaybe; /** Filter for the block changed event. */ _change_block?: InputMaybe; and?: InputMaybe>>; @@ -215,7 +304,8 @@ export type ClaimToken_orderBy = | 'claim__owner' | 'claim__totalUnits' | 'owner' - | 'units'; + | 'units' + | 'offers'; export type Claim_filter = { id?: InputMaybe; @@ -322,6 +412,27 @@ export type Claim_filter = { totalUnits_lte?: InputMaybe; totalUnits_in?: InputMaybe>; totalUnits_not_in?: InputMaybe>; + allowlist?: InputMaybe; + allowlist_not?: InputMaybe; + allowlist_gt?: InputMaybe; + allowlist_lt?: InputMaybe; + allowlist_gte?: InputMaybe; + allowlist_lte?: InputMaybe; + allowlist_in?: InputMaybe>; + allowlist_not_in?: InputMaybe>; + allowlist_contains?: InputMaybe; + allowlist_contains_nocase?: InputMaybe; + allowlist_not_contains?: InputMaybe; + allowlist_not_contains_nocase?: InputMaybe; + allowlist_starts_with?: InputMaybe; + allowlist_starts_with_nocase?: InputMaybe; + allowlist_not_starts_with?: InputMaybe; + allowlist_not_starts_with_nocase?: InputMaybe; + allowlist_ends_with?: InputMaybe; + allowlist_ends_with_nocase?: InputMaybe; + allowlist_not_ends_with?: InputMaybe; + allowlist_not_ends_with_nocase?: InputMaybe; + allowlist_?: InputMaybe; /** Filter for the block changed event. */ _change_block?: InputMaybe; and?: InputMaybe>>; @@ -336,7 +447,130 @@ export type Claim_orderBy = | 'uri' | 'creator' | 'owner' - | 'totalUnits'; + | 'totalUnits' + | 'allowlist' + | 'allowlist__id' + | 'allowlist__root'; + +export type Offer = { + id: Scalars['String']; + fractionID: ClaimToken; + unitsAvailable: Scalars['BigInt']; + minUnitsPerTrade: Scalars['BigInt']; + maxUnitsPerTrade: Scalars['BigInt']; + status: OfferStatus; + acceptedTokens: Array; +}; + + +export type OfferacceptedTokensArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; +}; + +export type OfferStatus = + | 'Open' + | 'Fulfilled' + | 'Cancelled'; + +export type Offer_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + fractionID?: InputMaybe; + fractionID_not?: InputMaybe; + fractionID_gt?: InputMaybe; + fractionID_lt?: InputMaybe; + fractionID_gte?: InputMaybe; + fractionID_lte?: InputMaybe; + fractionID_in?: InputMaybe>; + fractionID_not_in?: InputMaybe>; + fractionID_contains?: InputMaybe; + fractionID_contains_nocase?: InputMaybe; + fractionID_not_contains?: InputMaybe; + fractionID_not_contains_nocase?: InputMaybe; + fractionID_starts_with?: InputMaybe; + fractionID_starts_with_nocase?: InputMaybe; + fractionID_not_starts_with?: InputMaybe; + fractionID_not_starts_with_nocase?: InputMaybe; + fractionID_ends_with?: InputMaybe; + fractionID_ends_with_nocase?: InputMaybe; + fractionID_not_ends_with?: InputMaybe; + fractionID_not_ends_with_nocase?: InputMaybe; + fractionID_?: InputMaybe; + unitsAvailable?: InputMaybe; + unitsAvailable_not?: InputMaybe; + unitsAvailable_gt?: InputMaybe; + unitsAvailable_lt?: InputMaybe; + unitsAvailable_gte?: InputMaybe; + unitsAvailable_lte?: InputMaybe; + unitsAvailable_in?: InputMaybe>; + unitsAvailable_not_in?: InputMaybe>; + minUnitsPerTrade?: InputMaybe; + minUnitsPerTrade_not?: InputMaybe; + minUnitsPerTrade_gt?: InputMaybe; + minUnitsPerTrade_lt?: InputMaybe; + minUnitsPerTrade_gte?: InputMaybe; + minUnitsPerTrade_lte?: InputMaybe; + minUnitsPerTrade_in?: InputMaybe>; + minUnitsPerTrade_not_in?: InputMaybe>; + maxUnitsPerTrade?: InputMaybe; + maxUnitsPerTrade_not?: InputMaybe; + maxUnitsPerTrade_gt?: InputMaybe; + maxUnitsPerTrade_lt?: InputMaybe; + maxUnitsPerTrade_gte?: InputMaybe; + maxUnitsPerTrade_lte?: InputMaybe; + maxUnitsPerTrade_in?: InputMaybe>; + maxUnitsPerTrade_not_in?: InputMaybe>; + status?: InputMaybe; + status_not?: InputMaybe; + status_in?: InputMaybe>; + status_not_in?: InputMaybe>; + acceptedTokens?: InputMaybe>; + acceptedTokens_not?: InputMaybe>; + acceptedTokens_contains?: InputMaybe>; + acceptedTokens_contains_nocase?: InputMaybe>; + acceptedTokens_not_contains?: InputMaybe>; + acceptedTokens_not_contains_nocase?: InputMaybe>; + acceptedTokens_?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type Offer_orderBy = + | 'id' + | 'fractionID' + | 'fractionID__id' + | 'fractionID__tokenID' + | 'fractionID__owner' + | 'fractionID__units' + | 'unitsAvailable' + | 'minUnitsPerTrade' + | 'maxUnitsPerTrade' + | 'status' + | 'acceptedTokens'; /** Defines the order direction, either ascending or descending */ export type OrderDirection = @@ -350,6 +584,14 @@ export type Query = { claims: Array; claimToken?: Maybe; claimTokens: Array; + token?: Maybe; + tokens: Array; + acceptedToken?: Maybe; + acceptedTokens: Array; + offer?: Maybe; + offers: Array; + trade?: Maybe; + trades: Array; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; }; @@ -409,6 +651,78 @@ export type QueryclaimTokensArgs = { }; +export type QuerytokenArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerytokensArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryacceptedTokenArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryacceptedTokensArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryofferArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryoffersArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerytradeArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerytradesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + export type Query_metaArgs = { block?: InputMaybe; }; @@ -420,6 +734,14 @@ export type Subscription = { claims: Array; claimToken?: Maybe; claimTokens: Array; + token?: Maybe; + tokens: Array; + acceptedToken?: Maybe; + acceptedTokens: Array; + offer?: Maybe; + offers: Array; + trade?: Maybe; + trades: Array; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; }; @@ -479,10 +801,291 @@ export type SubscriptionclaimTokensArgs = { }; +export type SubscriptiontokenArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiontokensArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionacceptedTokenArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionacceptedTokensArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionofferArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionoffersArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiontradeArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiontradesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + export type Subscription_metaArgs = { block?: InputMaybe; }; +export type Token = { + id: Scalars['String']; + name: Scalars['String']; + symbol?: Maybe; + decimals?: Maybe; +}; + +export type Token_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + name?: InputMaybe; + name_not?: InputMaybe; + name_gt?: InputMaybe; + name_lt?: InputMaybe; + name_gte?: InputMaybe; + name_lte?: InputMaybe; + name_in?: InputMaybe>; + name_not_in?: InputMaybe>; + name_contains?: InputMaybe; + name_contains_nocase?: InputMaybe; + name_not_contains?: InputMaybe; + name_not_contains_nocase?: InputMaybe; + name_starts_with?: InputMaybe; + name_starts_with_nocase?: InputMaybe; + name_not_starts_with?: InputMaybe; + name_not_starts_with_nocase?: InputMaybe; + name_ends_with?: InputMaybe; + name_ends_with_nocase?: InputMaybe; + name_not_ends_with?: InputMaybe; + name_not_ends_with_nocase?: InputMaybe; + symbol?: InputMaybe; + symbol_not?: InputMaybe; + symbol_gt?: InputMaybe; + symbol_lt?: InputMaybe; + symbol_gte?: InputMaybe; + symbol_lte?: InputMaybe; + symbol_in?: InputMaybe>; + symbol_not_in?: InputMaybe>; + symbol_contains?: InputMaybe; + symbol_contains_nocase?: InputMaybe; + symbol_not_contains?: InputMaybe; + symbol_not_contains_nocase?: InputMaybe; + symbol_starts_with?: InputMaybe; + symbol_starts_with_nocase?: InputMaybe; + symbol_not_starts_with?: InputMaybe; + symbol_not_starts_with_nocase?: InputMaybe; + symbol_ends_with?: InputMaybe; + symbol_ends_with_nocase?: InputMaybe; + symbol_not_ends_with?: InputMaybe; + symbol_not_ends_with_nocase?: InputMaybe; + decimals?: InputMaybe; + decimals_not?: InputMaybe; + decimals_gt?: InputMaybe; + decimals_lt?: InputMaybe; + decimals_gte?: InputMaybe; + decimals_lte?: InputMaybe; + decimals_in?: InputMaybe>; + decimals_not_in?: InputMaybe>; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type Token_orderBy = + | 'id' + | 'name' + | 'symbol' + | 'decimals'; + +export type Trade = { + id: Scalars['String']; + buyer: Scalars['Bytes']; + offerID: Offer; + unitsSold: Scalars['BigInt']; + token: Token; + amountPerUnit: Scalars['BigInt']; +}; + +export type Trade_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + buyer?: InputMaybe; + buyer_not?: InputMaybe; + buyer_gt?: InputMaybe; + buyer_lt?: InputMaybe; + buyer_gte?: InputMaybe; + buyer_lte?: InputMaybe; + buyer_in?: InputMaybe>; + buyer_not_in?: InputMaybe>; + buyer_contains?: InputMaybe; + buyer_not_contains?: InputMaybe; + offerID?: InputMaybe; + offerID_not?: InputMaybe; + offerID_gt?: InputMaybe; + offerID_lt?: InputMaybe; + offerID_gte?: InputMaybe; + offerID_lte?: InputMaybe; + offerID_in?: InputMaybe>; + offerID_not_in?: InputMaybe>; + offerID_contains?: InputMaybe; + offerID_contains_nocase?: InputMaybe; + offerID_not_contains?: InputMaybe; + offerID_not_contains_nocase?: InputMaybe; + offerID_starts_with?: InputMaybe; + offerID_starts_with_nocase?: InputMaybe; + offerID_not_starts_with?: InputMaybe; + offerID_not_starts_with_nocase?: InputMaybe; + offerID_ends_with?: InputMaybe; + offerID_ends_with_nocase?: InputMaybe; + offerID_not_ends_with?: InputMaybe; + offerID_not_ends_with_nocase?: InputMaybe; + offerID_?: InputMaybe; + unitsSold?: InputMaybe; + unitsSold_not?: InputMaybe; + unitsSold_gt?: InputMaybe; + unitsSold_lt?: InputMaybe; + unitsSold_gte?: InputMaybe; + unitsSold_lte?: InputMaybe; + unitsSold_in?: InputMaybe>; + unitsSold_not_in?: InputMaybe>; + token?: InputMaybe; + token_not?: InputMaybe; + token_gt?: InputMaybe; + token_lt?: InputMaybe; + token_gte?: InputMaybe; + token_lte?: InputMaybe; + token_in?: InputMaybe>; + token_not_in?: InputMaybe>; + token_contains?: InputMaybe; + token_contains_nocase?: InputMaybe; + token_not_contains?: InputMaybe; + token_not_contains_nocase?: InputMaybe; + token_starts_with?: InputMaybe; + token_starts_with_nocase?: InputMaybe; + token_not_starts_with?: InputMaybe; + token_not_starts_with_nocase?: InputMaybe; + token_ends_with?: InputMaybe; + token_ends_with_nocase?: InputMaybe; + token_not_ends_with?: InputMaybe; + token_not_ends_with_nocase?: InputMaybe; + token_?: InputMaybe; + amountPerUnit?: InputMaybe; + amountPerUnit_not?: InputMaybe; + amountPerUnit_gt?: InputMaybe; + amountPerUnit_lt?: InputMaybe; + amountPerUnit_gte?: InputMaybe; + amountPerUnit_lte?: InputMaybe; + amountPerUnit_in?: InputMaybe>; + amountPerUnit_not_in?: InputMaybe>; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type Trade_orderBy = + | 'id' + | 'buyer' + | 'offerID' + | 'offerID__id' + | 'offerID__unitsAvailable' + | 'offerID__minUnitsPerTrade' + | 'offerID__maxUnitsPerTrade' + | 'offerID__status' + | 'unitsSold' + | 'token' + | 'token__id' + | 'token__name' + | 'token__symbol' + | 'token__decimals' + | 'amountPerUnit'; + export type _Block_ = { /** The hash of the block */ hash?: Maybe; @@ -527,6 +1130,22 @@ export type _SubgraphErrorPolicy_ = claimToken: InContextSdkMethod, /** null **/ claimTokens: InContextSdkMethod, + /** null **/ + token: InContextSdkMethod, + /** null **/ + tokens: InContextSdkMethod, + /** null **/ + acceptedToken: InContextSdkMethod, + /** null **/ + acceptedTokens: InContextSdkMethod, + /** null **/ + offer: InContextSdkMethod, + /** null **/ + offers: InContextSdkMethod, + /** null **/ + trade: InContextSdkMethod, + /** null **/ + trades: InContextSdkMethod, /** Access to subgraph metadata **/ _meta: InContextSdkMethod }; @@ -548,6 +1167,22 @@ export type _SubgraphErrorPolicy_ = claimToken: InContextSdkMethod, /** null **/ claimTokens: InContextSdkMethod, + /** null **/ + token: InContextSdkMethod, + /** null **/ + tokens: InContextSdkMethod, + /** null **/ + acceptedToken: InContextSdkMethod, + /** null **/ + acceptedTokens: InContextSdkMethod, + /** null **/ + offer: InContextSdkMethod, + /** null **/ + offers: InContextSdkMethod, + /** null **/ + trade: InContextSdkMethod, + /** null **/ + trades: InContextSdkMethod, /** Access to subgraph metadata **/ _meta: InContextSdkMethod }; diff --git a/sdk/package.json b/sdk/package.json index ac49caee..9be32db9 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -76,6 +76,7 @@ "chai-subset": "^1.6.0", "esbuild": "^0.17.10", "ethereum-waffle": "^4.0.10", + "fetch-mock": "^9.11.0", "it-all": "^2.0.0", "jest": "^29.3.1", "jest-extended": "^4.0.0", diff --git a/sdk/test/setup-env.ts b/sdk/test/setup-env.ts index 893c3429..49d24ea3 100644 --- a/sdk/test/setup-env.ts +++ b/sdk/test/setup-env.ts @@ -4,6 +4,7 @@ import fetchMock from "jest-fetch-mock"; fetchMock.enableMocks(); +fetchMock.enableMocks(); dotenv.config({ path: "./.env" }); const reloadEnv = () => { From a827b5ea40cde05afcf1e8e1767935844505fb3e Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Wed, 8 Nov 2023 16:40:52 +0100 Subject: [PATCH 012/118] feat(restriction): add transfer restriction to fe (#1173) --- frontend/components/hypercert-create.tsx | 11 +++++++++-- frontend/hooks/mintClaim.ts | 11 ++++++++--- frontend/hooks/mintClaimAllowlist.ts | 6 +++++- frontend/plasmic-init.ts | 10 ++++++++++ 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/frontend/components/hypercert-create.tsx b/frontend/components/hypercert-create.tsx index 99600560..ff6b65a8 100644 --- a/frontend/components/hypercert-create.tsx +++ b/frontend/components/hypercert-create.tsx @@ -3,7 +3,7 @@ import { parseListFromString } from "../lib/parsing"; import { useConfetti } from "./confetti"; import { useContractModal } from "./contract-interaction-dialog-context"; import { DATE_INDEFINITE, DateIndefinite, FormContext } from "./forms"; -import { formatHypercertData } from "@hypercerts-org/sdk"; +import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk"; import { DataProvider } from "@plasmicapp/loader-nextjs"; import dayjs from "dayjs"; import { Formik, FormikProps } from "formik"; @@ -62,6 +62,7 @@ const DEFAULT_FORM_DATA: HypercertCreateFormData = { backgroundColor: "", backgroundVectorArt: "", metadataProperties: "", + transferRestrictions: TransferRestrictions.FromCreatorOnly, }; interface HypercertCreateFormData { @@ -89,6 +90,7 @@ interface HypercertCreateFormData { backgroundColor: string; backgroundVectorArt: string; metadataProperties: string; + transferRestrictions: TransferRestrictions; } /** @@ -385,9 +387,14 @@ export function HypercertCreateForm(props: HypercertCreateFormProps) { allowlistUrl: values.allowlistUrl, allowlistPercentage: values.allowlistPercentage, deduplicate: values.deduplicateAllowlist, + transferRestrictions: values.transferRestrictions, }); } else { - await mintClaim(metaData.data, DEFAULT_NUM_FRACTIONS); + await mintClaim( + metaData.data, + DEFAULT_NUM_FRACTIONS, + values.transferRestrictions, + ); } } else { toast("Error creating hypercert. Please contact the team.", { diff --git a/frontend/hooks/mintClaim.ts b/frontend/hooks/mintClaim.ts index 55abc6a1..66ef74aa 100644 --- a/frontend/hooks/mintClaim.ts +++ b/frontend/hooks/mintClaim.ts @@ -25,6 +25,7 @@ export const useMintClaim = ({ onComplete }: { onComplete?: () => void }) => { const initializeWrite = async ( metaData: HypercertMetadata, units: number, + transferRestrictions: TransferRestrictions, ) => { setStep("minting"); try { @@ -33,7 +34,7 @@ export const useMintClaim = ({ onComplete }: { onComplete?: () => void }) => { const hash = await client.mintClaim( metaData, BigInt(units), - TransferRestrictions.FromCreatorOnly, + transferRestrictions, ); const receipt = await publicClient?.waitForTransactionReceipt({ @@ -67,10 +68,14 @@ export const useMintClaim = ({ onComplete }: { onComplete?: () => void }) => { }; return { - write: async (metaData: HypercertMetadata, units: number) => { + write: async ( + metaData: HypercertMetadata, + units: number, + transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly, + ) => { showModal({ stepDescriptions }); setStep("preparing"); - await initializeWrite(metaData, units); + await initializeWrite(metaData, units, transferRestrictions); }, txPending, readOnly: isLoading || !client || client.readonly, diff --git a/frontend/hooks/mintClaimAllowlist.ts b/frontend/hooks/mintClaimAllowlist.ts index 18273244..a78a0429 100644 --- a/frontend/hooks/mintClaimAllowlist.ts +++ b/frontend/hooks/mintClaimAllowlist.ts @@ -85,6 +85,7 @@ export const useMintClaimAllowlist = ({ allowlistUrl: string, allowlistPercentage: number, deduplicate: boolean, + transferRestrictions: TransferRestrictions, ) => { setStep("validateAllowlist"); @@ -126,7 +127,7 @@ export const useMintClaimAllowlist = ({ _allowlist, metaData, _totalSupply, - TransferRestrictions.FromCreatorOnly, + transferRestrictions, ); const receipt = await publicClient?.waitForTransactionReceipt({ @@ -165,11 +166,13 @@ export const useMintClaimAllowlist = ({ allowlistUrl, allowlistPercentage, deduplicate, + transferRestrictions = TransferRestrictions.FromCreatorOnly, }: { metaData: HypercertMetadata; allowlistUrl: string; allowlistPercentage: number; deduplicate: boolean; + transferRestrictions?: TransferRestrictions; }) => { showModal({ stepDescriptions }); await initializeWrite( @@ -177,6 +180,7 @@ export const useMintClaimAllowlist = ({ allowlistUrl, allowlistPercentage, deduplicate, + transferRestrictions, ); }, txPending, diff --git a/frontend/plasmic-init.ts b/frontend/plasmic-init.ts index 42c167c4..79a54679 100644 --- a/frontend/plasmic-init.ts +++ b/frontend/plasmic-init.ts @@ -222,6 +222,11 @@ PLASMIC.registerComponent(HypercertFetcher, { importPath: "./components/hypercert-metadata-fetcher", }); +/** + * AllowAll: 0, + * DisallowAll: 1, + * FromCreatorOnly: 2, + */ PLASMIC.registerComponent(HypercertCreateForm, { name: "HypercertCreateForm", description: "Create a hypercert", @@ -233,6 +238,11 @@ PLASMIC.registerComponent(HypercertCreateForm, { value: "Placeholder", }, }, + transferRestrictions: { + type: "choice", + options: ["AllowAll", "DisallowAll", "FromCreatorOnly"], + defaultValueHint: "FromCreatorOnly", + }, }, providesData: true, importPath: "./components/hypercert-create", From 34436b929d4e589cf927b617bd422d20c864f3b7 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 9 Nov 2023 11:54:55 +0100 Subject: [PATCH 013/118] feat(metadata): add application name (#1174) --- frontend/components/hypercert-create.tsx | 12 ++++++++++-- frontend/plasmic-init.ts | 4 ++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/frontend/components/hypercert-create.tsx b/frontend/components/hypercert-create.tsx index ff6b65a8..1db8a43d 100644 --- a/frontend/components/hypercert-create.tsx +++ b/frontend/components/hypercert-create.tsx @@ -63,6 +63,7 @@ const DEFAULT_FORM_DATA: HypercertCreateFormData = { backgroundVectorArt: "", metadataProperties: "", transferRestrictions: TransferRestrictions.FromCreatorOnly, + applicationName: "hypercerts.org", }; interface HypercertCreateFormData { @@ -91,6 +92,7 @@ interface HypercertCreateFormData { backgroundVectorArt: string; metadataProperties: string; transferRestrictions: TransferRestrictions; + applicationName: string; } /** @@ -475,10 +477,16 @@ const formatValuesToMetaData = ( ? new Date(val.workTimeEnd).getTime() / 1000 : 0; - let properties = []; + let properties = [ + { + trait_type: "Minted by", + value: "true", + application: val.applicationName, + }, + ]; if (val.metadataProperties) { try { - properties = JSON.parse(val.metadataProperties); + properties = [...properties, ...JSON.parse(val.metadataProperties)]; } catch (e) { console.warn( `Unable to parse metadataProperties: ${val.metadataProperties}`, diff --git a/frontend/plasmic-init.ts b/frontend/plasmic-init.ts index 79a54679..07f0ceb2 100644 --- a/frontend/plasmic-init.ts +++ b/frontend/plasmic-init.ts @@ -243,6 +243,10 @@ PLASMIC.registerComponent(HypercertCreateForm, { options: ["AllowAll", "DisallowAll", "FromCreatorOnly"], defaultValueHint: "FromCreatorOnly", }, + applicationName: { + type: "string", + defaultValueHint: "hypercerts.org/create", + }, }, providesData: true, importPath: "./components/hypercert-create", From fc0161d6d50aab9a031626c69f585240f1bd1cb5 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 9 Nov 2023 12:36:48 +0100 Subject: [PATCH 014/118] feat(deployments): typed deployment contracts --- contracts/package.json | 2 +- contracts/src/index.ts | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/contracts/package.json b/contracts/package.json index 78530c9c..02c1a8d6 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@hypercerts-org/contracts", "description": "EVM compatible protocol for managing impact claims", - "version": "0.9.0", + "version": "0.10.0", "author": { "name": "Hypercerts Foundation", "url": "https://github.com/hypercerts-org/hypercerts" diff --git a/contracts/src/index.ts b/contracts/src/index.ts index 3019f4fc..08e9a196 100644 --- a/contracts/src/index.ts +++ b/contracts/src/index.ts @@ -21,7 +21,7 @@ import type { IAllowlist } from "../types/src/protocol/interfaces/IAllowlist"; import type { IHypercertToken } from "../types/src/protocol/interfaces/IHypercertToken"; import type { Errors } from "../types/src/protocol/libs/Errors"; -import deployments from "./deployments.json"; +import deploymentsJSON from "./deployments.json"; /* in order to adjust the build folder: @@ -31,8 +31,24 @@ import deployments from "./deployments.json"; 4) bump package.json version to publish a new package to npm. */ +export type Deployment = { + HypercertMinterUUPS: `0x${string}`; + HypercertMinterImplementation: `0x${string}`; + TransferManager?: `0x${string}`; + HypercertExchange?: `0x${string}`; +}; + +export type DeployedChains = keyof typeof deploymentsJSON; + // Deployments -export { deployments }; +const deployments = deploymentsJSON as Record; + +const asDeployedChain = (chainId: string | number) => { + if (chainId in deployments) return chainId as DeployedChains; + throw new Error(`Chain ${chainId} not deployed`); +}; + +export { deployments, asDeployedChain }; // Interfaces export { IAllowlist, IHypercertToken }; From 55c1f5748a75a1e608eb4c4850cf5c95c976234c Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 9 Nov 2023 17:08:26 +0100 Subject: [PATCH 015/118] fix(props): props from plas to form (#1176) --- frontend/components/hypercert-create.tsx | 16 ++++++++-------- frontend/plasmic-init.ts | 5 ++--- graph/tests/.latest.json | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/frontend/components/hypercert-create.tsx b/frontend/components/hypercert-create.tsx index 1db8a43d..98b37b6a 100644 --- a/frontend/components/hypercert-create.tsx +++ b/frontend/components/hypercert-create.tsx @@ -62,8 +62,6 @@ const DEFAULT_FORM_DATA: HypercertCreateFormData = { backgroundColor: "", backgroundVectorArt: "", metadataProperties: "", - transferRestrictions: TransferRestrictions.FromCreatorOnly, - applicationName: "hypercerts.org", }; interface HypercertCreateFormData { @@ -91,8 +89,6 @@ interface HypercertCreateFormData { backgroundColor: string; backgroundVectorArt: string; metadataProperties: string; - transferRestrictions: TransferRestrictions; - applicationName: string; } /** @@ -294,10 +290,12 @@ const ValidationSchema = Yup.object().shape({ export interface HypercertCreateFormProps { className?: string; // Plasmic CSS class children?: ReactNode; // Form elements + transferRestrictions: TransferRestrictions; + applicationName: string; } export function HypercertCreateForm(props: HypercertCreateFormProps) { - const { className, children } = props; + const { className, children, transferRestrictions, applicationName } = props; const { address } = useAccountLowerCase(); const { push } = useRouter(); const { hideModal } = useContractModal(); @@ -378,6 +376,7 @@ export function HypercertCreateForm(props: HypercertCreateFormProps) { values, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion address!, + applicationName, image, ); console.log(`Metadata(valid=${metaData.valid}): `, metaData.data); @@ -389,13 +388,13 @@ export function HypercertCreateForm(props: HypercertCreateFormProps) { allowlistUrl: values.allowlistUrl, allowlistPercentage: values.allowlistPercentage, deduplicate: values.deduplicateAllowlist, - transferRestrictions: values.transferRestrictions, + transferRestrictions, }); } else { await mintClaim( metaData.data, DEFAULT_NUM_FRACTIONS, - values.transferRestrictions, + transferRestrictions, ); } } else { @@ -444,6 +443,7 @@ export function HypercertCreateForm(props: HypercertCreateFormProps) { const formatValuesToMetaData = ( val: HypercertCreateFormData, address: string, + applicationName: string, image?: string, ) => { // Split contributor names and addresses. @@ -481,7 +481,7 @@ const formatValuesToMetaData = ( { trait_type: "Minted by", value: "true", - application: val.applicationName, + application: applicationName, }, ]; if (val.metadataProperties) { diff --git a/frontend/plasmic-init.ts b/frontend/plasmic-init.ts index 07f0ceb2..b9ffaeb1 100644 --- a/frontend/plasmic-init.ts +++ b/frontend/plasmic-init.ts @@ -239,9 +239,8 @@ PLASMIC.registerComponent(HypercertCreateForm, { }, }, transferRestrictions: { - type: "choice", - options: ["AllowAll", "DisallowAll", "FromCreatorOnly"], - defaultValueHint: "FromCreatorOnly", + type: "number", + description: "0: AllowAll, 1: DisallowAll, 2: FromCreatorOnly", }, applicationName: { type: "string", diff --git a/graph/tests/.latest.json b/graph/tests/.latest.json index 67836539..39dc3ab6 100644 --- a/graph/tests/.latest.json +++ b/graph/tests/.latest.json @@ -1,4 +1,4 @@ { "version": "0.6.0", - "timestamp": 1699397492586 + "timestamp": 1699545675983 } From c93f391c725f8f25541da3da369e0161a2f12acb Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Mon, 13 Nov 2023 15:50:10 +0100 Subject: [PATCH 016/118] format external url in case it is a direct ipfs link (#1182) --- frontend/lib/formatting.ts | 17 +++++++++++++++++ frontend/lib/hypercert.ts | 28 ++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/frontend/lib/formatting.ts b/frontend/lib/formatting.ts index 346d712b..ddf4215d 100644 --- a/frontend/lib/formatting.ts +++ b/frontend/lib/formatting.ts @@ -1,4 +1,5 @@ import _ from "lodash"; +import { HypercertClient } from "@hypercerts-org/sdk"; export const formatScope = (scopeLabel: string) => scopeLabel.toLowerCase().replaceAll(/\s+/g, "-").trim(); @@ -72,3 +73,19 @@ export const formatAddress = (address: string) => */ export const cidToIpfsUri = (cid: string) => cid.startsWith("ipfs://") ? cid : `ipfs://${cid}`; + +export const formatExternalUrl = ( + client: HypercertClient, + externalUrl?: string, +) => { + if (!externalUrl) { + return ""; + } + if (!externalUrl.startsWith("ipfs://")) { + return externalUrl; + } + + return client.storage.getNftStorageGatewayUri( + externalUrl.replace("ipfs://", ""), + ); +}; diff --git a/frontend/lib/hypercert.ts b/frontend/lib/hypercert.ts index f37204b3..fd4eb87e 100644 --- a/frontend/lib/hypercert.ts +++ b/frontend/lib/hypercert.ts @@ -5,10 +5,11 @@ import { HypercertClient, } from "@hypercerts-org/sdk"; import BN from "bn.js"; +import { formatExternalUrl } from "./formatting"; export interface Hypercert { getTokensFor(owner: string): HypercertTokens; - metadata?: HypercertMetadata; + metadata?: HypercertMetadata & { external_uri_formatted?: string }; claim?: ClaimByIdQuery["claim"]; claimTokens?: ClaimTokensByClaimQuery["claimTokens"]; name: string; @@ -39,13 +40,25 @@ export async function loadHypercert( : claimQueryResp.claim?.uri; if (metadataUri) { const metadata = await client.storage.getMetadata(metadataUri); - hypercert.metadata = metadata; + hypercert.metadata = { + ...metadata, + external_url_formatted: formatExternalUrl( + client, + metadata.external_url, + ), + }; } return hypercert; } else { if (options.metadataUri) { const metadata = await client.storage.getMetadata(options.metadataUri); - return new MetadataOnlyHypercert(options.metadataUri, metadata); + return new MetadataOnlyHypercert(options.metadataUri, { + ...metadata, + external_url_formatted: formatExternalUrl( + client, + metadata.external_url, + ), + }); } throw new Error( "A metadataUri or claimId are required to load a hypercert", @@ -102,10 +115,13 @@ export class HypercertTokens { export class MetadataOnlyHypercert implements Hypercert { claim?: ClaimByIdQuery["claim"]; claimTokens?: ClaimTokensByClaimQuery["claimTokens"]; - metadata: HypercertMetadata; + metadata: HypercertMetadata & { external_url_formatted?: string }; metadataUri: string; - constructor(metadataUri: string, metadata: HypercertMetadata) { + constructor( + metadataUri: string, + metadata: HypercertMetadata & { external_url_formatted?: string }, + ) { this.metadata = metadata; this.metadataUri = metadataUri; } @@ -139,7 +155,7 @@ export class FullHypercert implements Hypercert { // previous HypercertData type claim: ClaimByIdQuery["claim"]; claimTokens: ClaimTokensByClaimQuery["claimTokens"]; - metadata?: HypercertMetadata; + metadata?: HypercertMetadata & { external_url_formatted?: string }; constructor( claimQueryResp: ClaimByIdQuery, From dbdb083dd6d2f6ce35eb90394ba5752be7364822 Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Wed, 15 Nov 2023 14:32:45 +0100 Subject: [PATCH 017/118] fix(fix formatting of ipfs urls on hypercert page) (#1183) --- frontend/lib/formatting.ts | 16 ++++++++-------- frontend/lib/hypercert.ts | 10 ++-------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/frontend/lib/formatting.ts b/frontend/lib/formatting.ts index ddf4215d..260f7c39 100644 --- a/frontend/lib/formatting.ts +++ b/frontend/lib/formatting.ts @@ -1,5 +1,4 @@ import _ from "lodash"; -import { HypercertClient } from "@hypercerts-org/sdk"; export const formatScope = (scopeLabel: string) => scopeLabel.toLowerCase().replaceAll(/\s+/g, "-").trim(); @@ -74,10 +73,13 @@ export const formatAddress = (address: string) => export const cidToIpfsUri = (cid: string) => cid.startsWith("ipfs://") ? cid : `ipfs://${cid}`; -export const formatExternalUrl = ( - client: HypercertClient, - externalUrl?: string, -) => { +const getIpfsGatewayUri = (cidOrIpfsUri: string) => { + const NFT_STORAGE_IPFS_GATEWAY = "https://nftstorage.link/ipfs/{cid}"; + const cid = cidOrIpfsUri.replace("ipfs://", ""); + return NFT_STORAGE_IPFS_GATEWAY.replace("{cid}", cid); +}; + +export const formatExternalUrl = (externalUrl?: string) => { if (!externalUrl) { return ""; } @@ -85,7 +87,5 @@ export const formatExternalUrl = ( return externalUrl; } - return client.storage.getNftStorageGatewayUri( - externalUrl.replace("ipfs://", ""), - ); + return getIpfsGatewayUri(externalUrl); }; diff --git a/frontend/lib/hypercert.ts b/frontend/lib/hypercert.ts index fd4eb87e..0f2be7da 100644 --- a/frontend/lib/hypercert.ts +++ b/frontend/lib/hypercert.ts @@ -42,10 +42,7 @@ export async function loadHypercert( const metadata = await client.storage.getMetadata(metadataUri); hypercert.metadata = { ...metadata, - external_url_formatted: formatExternalUrl( - client, - metadata.external_url, - ), + external_url_formatted: formatExternalUrl(metadata.external_url), }; } return hypercert; @@ -54,10 +51,7 @@ export async function loadHypercert( const metadata = await client.storage.getMetadata(options.metadataUri); return new MetadataOnlyHypercert(options.metadataUri, { ...metadata, - external_url_formatted: formatExternalUrl( - client, - metadata.external_url, - ), + external_url_formatted: formatExternalUrl(metadata.external_url), }); } throw new Error( From a6c3b8f40c4189e450015896d965e755ccf60250 Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Tue, 21 Nov 2023 19:07:28 +0100 Subject: [PATCH 018/118] Feat/split and merge (#1185) * Add split and merge functionality to plasmic and add component logic. --- contracts/test/mock/MockERC1155.sol | 4 +- .../mock/MockERC1155SupportsNoInterface.sol | 2 +- .../mock/MockERC1155WithoutAnyBalanceOf.sol | 2 +- .../mock/MockERC1155WithoutBalanceOfBatch.sol | 2 +- .../MockERC1155WithoutIsApprovedForAll.sol | 2 +- contracts/test/mock/MockERC20.sol | 2 +- contracts/test/mock/MockERC721.sol | 4 +- .../mock/MockERC721SupportsNoInterface.sol | 2 +- .../test/mock/MockERC721WithRoyalties.sol | 24 +-- .../test/mock/MockRoyaltyFeeRegistry.sol | 22 +-- contracts/test/mock/MockSmartWallet.sol | 2 +- .../merge-all-claim-fractions-button.tsx | 90 ++++++++- frontend/components/split-fraction-button.tsx | 178 +++++++++++++++++- frontend/hooks/fractions.ts | 11 +- frontend/hooks/mergeFractionUnits.ts | 3 +- frontend/hooks/splitClaimUnits.ts | 14 +- frontend/package.json | 2 +- frontend/plasmic-init.ts | 2 +- pnpm-lock.yaml | 133 +++++++------ 19 files changed, 376 insertions(+), 125 deletions(-) diff --git a/contracts/test/mock/MockERC1155.sol b/contracts/test/mock/MockERC1155.sol index d234cf30..4bbfdccd 100644 --- a/contracts/test/mock/MockERC1155.sol +++ b/contracts/test/mock/MockERC1155.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import { ERC1155 } from "solmate/src/tokens/ERC1155.sol"; +import {ERC1155} from "solmate/src/tokens/ERC1155.sol"; // LooksRare unopinionated libraries -import { IERC2981 } from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; +import {IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; contract MockERC1155 is ERC1155 { function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts) public { diff --git a/contracts/test/mock/MockERC1155SupportsNoInterface.sol b/contracts/test/mock/MockERC1155SupportsNoInterface.sol index 3a233d63..34b9da89 100644 --- a/contracts/test/mock/MockERC1155SupportsNoInterface.sol +++ b/contracts/test/mock/MockERC1155SupportsNoInterface.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import { MockERC1155 } from "./MockERC1155.sol"; +import {MockERC1155} from "./MockERC1155.sol"; contract MockERC1155SupportsNoInterface is MockERC1155 { function supportsInterface(bytes4) public view virtual override returns (bool) { diff --git a/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol b/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol index ed4b6286..4474f875 100644 --- a/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol +++ b/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import { ERC1155 } from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; +import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; /** * @dev This contract has to inherit from OZ instead of Solmate because diff --git a/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol b/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol index c8fbccb2..1c010cae 100644 --- a/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol +++ b/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import { MockERC1155 } from "./MockERC1155.sol"; +import {MockERC1155} from "./MockERC1155.sol"; contract MockERC1155WithoutBalanceOfBatch is MockERC1155 { function balanceOfBatch(address[] calldata, uint256[] calldata) public pure override returns (uint256[] memory) { diff --git a/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol b/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol index 7f7630dc..c02c4192 100644 --- a/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol +++ b/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import { ERC1155 } from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; +import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; /** * @dev This contract has to inherit from OZ instead of Solmate because diff --git a/contracts/test/mock/MockERC20.sol b/contracts/test/mock/MockERC20.sol index 8ec94827..019bed0e 100644 --- a/contracts/test/mock/MockERC20.sol +++ b/contracts/test/mock/MockERC20.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import { ERC20 } from "solmate/src/tokens/ERC20.sol"; +import {ERC20} from "solmate/src/tokens/ERC20.sol"; contract MockERC20 is ERC20("MockERC20", "MockERC20", 18) { function mint(address to, uint256 amount) public { diff --git a/contracts/test/mock/MockERC721.sol b/contracts/test/mock/MockERC721.sol index 24c1bdc9..4db2eed7 100644 --- a/contracts/test/mock/MockERC721.sol +++ b/contracts/test/mock/MockERC721.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import { ERC721 } from "solmate/src/tokens/ERC721.sol"; -import { IERC165 } from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC165.sol"; +import {ERC721} from "solmate/src/tokens/ERC721.sol"; +import {IERC165} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC165.sol"; contract MockERC721 is ERC721("MockERC721", "MockERC721") { function mint(address to, uint256 tokenId) public { diff --git a/contracts/test/mock/MockERC721SupportsNoInterface.sol b/contracts/test/mock/MockERC721SupportsNoInterface.sol index 8cd86d36..e5a6c5e3 100644 --- a/contracts/test/mock/MockERC721SupportsNoInterface.sol +++ b/contracts/test/mock/MockERC721SupportsNoInterface.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7; -import { MockERC721 } from "./MockERC721.sol"; +import {MockERC721} from "./MockERC721.sol"; contract MockERC721SupportsNoInterface is MockERC721 { function supportsInterface(bytes4) public view virtual override returns (bool) { diff --git a/contracts/test/mock/MockERC721WithRoyalties.sol b/contracts/test/mock/MockERC721WithRoyalties.sol index 0083280b..071e2432 100644 --- a/contracts/test/mock/MockERC721WithRoyalties.sol +++ b/contracts/test/mock/MockERC721WithRoyalties.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.17; -import { IERC165, IERC2981 } from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; -import { MockERC721 } from "./MockERC721.sol"; +import {IERC165, IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; +import {MockERC721} from "./MockERC721.sol"; // Constants -import { ONE_HUNDRED_PERCENT_IN_BP } from "@hypercerts/marketplace/constants/NumericConstants.sol"; +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; /** * @dev This contract allows adding a royalty basis points higher than 10,000, which @@ -25,19 +25,19 @@ contract MockERC721WithRoyalties is MockERC721, IERC2981 { DEFAULT_ROYALTY_FEE = _royaltyFee; } - function addCustomRoyaltyInformationForTokenId( - uint256 tokenId, - address royaltyRecipient, - uint256 royaltyFee - ) external { + function addCustomRoyaltyInformationForTokenId(uint256 tokenId, address royaltyRecipient, uint256 royaltyFee) + external + { _royaltyRecipientForTokenId[tokenId] = royaltyRecipient; _royaltyFeeForTokenId[tokenId] = royaltyFee; } - function royaltyInfo( - uint256 tokenId, - uint256 salePrice - ) external view override returns (address royaltyRecipient, uint256 royaltyAmount) { + function royaltyInfo(uint256 tokenId, uint256 salePrice) + external + view + override + returns (address royaltyRecipient, uint256 royaltyAmount) + { royaltyRecipient = _royaltyRecipientForTokenId[tokenId] == address(0) ? DEFAULT_ROYALTY_RECIPIENT : _royaltyRecipientForTokenId[tokenId]; diff --git a/contracts/test/mock/MockRoyaltyFeeRegistry.sol b/contracts/test/mock/MockRoyaltyFeeRegistry.sol index e4ec7a1f..d9700825 100644 --- a/contracts/test/mock/MockRoyaltyFeeRegistry.sol +++ b/contracts/test/mock/MockRoyaltyFeeRegistry.sol @@ -2,13 +2,13 @@ pragma solidity 0.8.17; // LooksRare unopinionated libraries -import { OwnableTwoSteps } from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; +import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; // Royalty Fee Registry interface -import { IRoyaltyFeeRegistry } from "@hypercerts/marketplace/interfaces/IRoyaltyFeeRegistry.sol"; +import {IRoyaltyFeeRegistry} from "@hypercerts/marketplace/interfaces/IRoyaltyFeeRegistry.sol"; // Constants -import { ONE_HUNDRED_PERCENT_IN_BP } from "@hypercerts/marketplace/constants/NumericConstants.sol"; +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; /** * @title MockRoyaltyFeeRegistry @@ -36,7 +36,7 @@ contract MockRoyaltyFeeRegistry is IRoyaltyFeeRegistry, OwnableTwoSteps { * @param _royaltyFeeLimit new royalty fee limit (500 = 5%, 1,000 = 10%) */ constructor(address _owner, uint256 _royaltyFeeLimit) OwnableTwoSteps(_owner) { - require(_royaltyFeeLimit <= 9_500, "Owner: Royalty fee limit too high"); + require(_royaltyFeeLimit <= 9500, "Owner: Royalty fee limit too high"); royaltyFeeLimit = _royaltyFeeLimit; } @@ -45,7 +45,7 @@ contract MockRoyaltyFeeRegistry is IRoyaltyFeeRegistry, OwnableTwoSteps { * @param _royaltyFeeLimit new royalty fee limit (500 = 5%, 1,000 = 10%) */ function updateRoyaltyFeeLimit(uint256 _royaltyFeeLimit) external onlyOwner { - require(_royaltyFeeLimit <= 9_500, "Owner: Royalty fee limit too high"); + require(_royaltyFeeLimit <= 9500, "Owner: Royalty fee limit too high"); royaltyFeeLimit = _royaltyFeeLimit; emit NewRoyaltyFeeLimit(_royaltyFeeLimit); @@ -58,14 +58,12 @@ contract MockRoyaltyFeeRegistry is IRoyaltyFeeRegistry, OwnableTwoSteps { * @param receiver receiver for the royalty fee * @param fee fee (500 = 5%, 1,000 = 10%) */ - function updateRoyaltyInfoForCollection( - address collection, - address setter, - address receiver, - uint256 fee - ) external onlyOwner { + function updateRoyaltyInfoForCollection(address collection, address setter, address receiver, uint256 fee) + external + onlyOwner + { require(fee <= royaltyFeeLimit, "Registry: Royalty fee too high"); - _royaltyFeeInfoCollection[collection] = FeeInfo({ setter: setter, receiver: receiver, fee: fee }); + _royaltyFeeInfoCollection[collection] = FeeInfo({setter: setter, receiver: receiver, fee: fee}); emit RoyaltyFeeUpdate(collection, setter, receiver, fee); } diff --git a/contracts/test/mock/MockSmartWallet.sol b/contracts/test/mock/MockSmartWallet.sol index 6e30673b..77d02b61 100644 --- a/contracts/test/mock/MockSmartWallet.sol +++ b/contracts/test/mock/MockSmartWallet.sol @@ -54,7 +54,7 @@ contract MockSmartWallet { } function execute(address dest, uint256 value, bytes calldata calldata_) public onlyOwner { - (bool success, bytes memory result) = dest.call{ value: value }(calldata_); + (bool success, bytes memory result) = dest.call{value: value}(calldata_); if (!success) { assembly { diff --git a/frontend/components/merge-all-claim-fractions-button.tsx b/frontend/components/merge-all-claim-fractions-button.tsx index f0c5d1b3..55dd5a12 100644 --- a/frontend/components/merge-all-claim-fractions-button.tsx +++ b/frontend/components/merge-all-claim-fractions-button.tsx @@ -1,5 +1,16 @@ import React from "react"; -import { Button } from "@mui/material"; +import { + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, +} from "@mui/material"; +import { useMergeFractionUnits } from "../hooks/mergeFractionUnits"; +import { toast } from "react-toastify"; +import { useHypercertClient } from "../hooks/hypercerts-client"; +import { useAccountLowerCase } from "../hooks/account"; interface Props { claimId: string; @@ -14,13 +25,84 @@ export function MergeAllClaimFractionsButton({ className, disabled, }: Props) { + const [open, setOpen] = React.useState(false); + const { write, readOnly, txPending } = useMergeFractionUnits({}); + const { client, isLoading } = useHypercertClient(); + const { address } = useAccountLowerCase(); + const onClick = async () => { console.log("Merging all claim fractions", claimId); + setOpen(false); + if (readOnly) { + toast("Please connect your wallet to merge all claim fractions"); + return; + } + + if (isLoading) { + toast("Please wait for the client to be ready"); + return; + } + + if (!client) { + toast("Please connect your wallet to merge all claim fractions"); + return; + } + + if (!address) { + toast("Please connect your wallet to merge all claim fractions"); + return; + } + + const fractionUnits = await client.indexer.fractionsByClaim(claimId); + console.log("Fraction units", fractionUnits); + + const myFractions = fractionUnits.claimTokens.filter( + (fraction) => fraction.owner === address, + ); + + console.log("address", address); + console.log("My fractions", myFractions); + + if (!myFractions.length) { + toast("No fractions to merge"); + return; + } + + await write(myFractions.map((fraction) => fraction.tokenID)); }; + const isDisabled = disabled || txPending || readOnly || isLoading; + return ( - + <> + + setOpen(false)} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + > + + {"Merge all your fractions for this hypercert?"} + + + + This action cannot be reversed + + + + + + + + ); } diff --git a/frontend/components/split-fraction-button.tsx b/frontend/components/split-fraction-button.tsx index 09202758..c6321870 100644 --- a/frontend/components/split-fraction-button.tsx +++ b/frontend/components/split-fraction-button.tsx @@ -1,4 +1,24 @@ -import { Button } from "@mui/material"; +import { Box, Button, Input, Modal, Typography } from "@mui/material"; +import React, { useState } from "react"; +import { FieldArray, Form, Formik } from "formik"; +import { useFractionById } from "../hooks/fractions"; +import { PlusIcon } from "primereact/icons/plus"; +import { Delete } from "@mui/icons-material"; +import { useSplitFractionUnits } from "../hooks/splitClaimUnits"; +import { toast } from "react-toastify"; + +const style = { + position: "absolute", + top: "50%", + left: "50%", + transform: "translate(-50%, -50%)", + width: 400, + bgcolor: "background.paper", + boxShadow: 24, + pt: 2, + px: 4, + pb: 3, +}; interface Props { fractionId: string; @@ -12,13 +32,157 @@ export function SplitFractionButton({ className, disabled, }: Props) { - const onClick = async () => { - console.log("Splitting fraction", fractionId); - }; + const [open, setOpen] = useState(false); + const handleOpen = () => setOpen(true); + const handleClose = () => setOpen(false); + + const { write, readOnly, txPending } = useSplitFractionUnits({ + onComplete: () => { + toast("Splitting fraction completed"); + handleClose(); + }, + }); + + const { data, isLoading } = useFractionById(fractionId); + + console.log(data, isLoading); + + if (isLoading || !data?.claimToken) { + return null; + } + + const totalValue = parseInt(data.claimToken.units, 10); + + const _disabled = txPending || readOnly || isLoading || disabled; return ( - + <> + + + + + Split up your fraction + + + Make sure the total value of the fractions is equal to the original + + { + if (!values.units.length) { + return { units: "Required" }; + } + const totalValueInForm = values.units.reduce( + (sum, value) => sum + value, + 0, + ); + + if (totalValueInForm !== totalValue) { + return { + units: "Total value must be equal to the original value", + }; + } + }} + onSubmit={async (values) => { + const tokenId = data.claimToken?.tokenID; + if (!tokenId) { + return; + } + await write( + BigInt(tokenId), + values.units.map((x) => BigInt(x)), + ); + }} + > + {({ values, errors, setFieldValue, isValid, isSubmitting }) => { + const isDisabled = _disabled || isSubmitting; + return ( +
+ ( +
+ {values.units && values.units.length > 0 ? ( + values.units.map((unit, index) => ( +
+ {/**/} + + setFieldValue( + `units.${index}`, + isNaN(parseInt(e.target.value)) + ? 0 + : parseInt(e.target.value), + ) + } + /> + + + + +
+ )) + ) : ( + + )} + {errors.units && ( +
{errors.units as string}
+ )} + +
+ +
+
+ )} + /> + + ); + }} +
+
+
+ ); } diff --git a/frontend/hooks/fractions.ts b/frontend/hooks/fractions.ts index b7482831..896bc8ca 100644 --- a/frontend/hooks/fractions.ts +++ b/frontend/hooks/fractions.ts @@ -18,11 +18,10 @@ export const useFractionsByClaim = (claimId: string) => { client: { indexer }, } = useHypercertClient(); - return ( - useQuery(["graph", "fractions", "claim", claimId], () => - indexer.fractionsByClaim(claimId), - ), - { enabled: !!claimId, refetchInterval: 5000 } + return useQuery( + ["graph", "fractions", "claim", claimId], + () => indexer.fractionsByClaim(claimId), + { enabled: !!claimId, refetchInterval: 5000 }, ); }; @@ -34,6 +33,6 @@ export const useFractionById = (fractionId: string) => { return useQuery( ["graph", "fractions", fractionId], () => indexer.fractionById(fractionId), - { enabled: !!fractionId, refetchInterval: 5000 }, + { enabled: !!fractionId }, ); }; diff --git a/frontend/hooks/mergeFractionUnits.ts b/frontend/hooks/mergeFractionUnits.ts index e984961f..1422845d 100644 --- a/frontend/hooks/mergeFractionUnits.ts +++ b/frontend/hooks/mergeFractionUnits.ts @@ -45,7 +45,7 @@ export const useMergeFractionUnits = ({ console.error(receipt); } if (receipt?.status === "success") { - toast(mintInteractionLabels.toastSuccess, { type: "success" }); + toast("Fractions successfully merged", { type: "success" }); setStep("complete"); onComplete?.(); @@ -66,6 +66,7 @@ export const useMergeFractionUnits = ({ showModal({ stepDescriptions }); setStep("preparing"); await initializeWrite(ids); + window.location.reload(); }, txPending, readOnly: isLoading || !client || client.readonly, diff --git a/frontend/hooks/splitClaimUnits.ts b/frontend/hooks/splitClaimUnits.ts index 640ad196..2d4dd11d 100644 --- a/frontend/hooks/splitClaimUnits.ts +++ b/frontend/hooks/splitClaimUnits.ts @@ -15,8 +15,7 @@ export const useSplitFractionUnits = ({ const { client, isLoading } = useHypercertClient(); const stepDescriptions = { - preparing: "Preparing to merge fraction values", - merging: "Splitting fraction units on-chain", + splitting: "Splitting fraction units on-chain", waiting: "Awaiting confirmation", complete: "Done splitting", }; @@ -26,20 +25,20 @@ export const useSplitFractionUnits = ({ const publicClient = client.config.publicClient; - const initializeWrite = async (id: bigint, fractions: bigint[]) => { + const initializeWrite = async (fractionId: bigint, fractions: bigint[]) => { + showModal({ stepDescriptions }); setStep("splitting"); try { setTxPending(true); - const hash = await client.splitFractionUnits(id, fractions); + const hash = await client.splitFractionUnits(fractionId, fractions); + setStep("waiting"); const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, hash: hash, }); - setStep("waiting"); - if (receipt?.status === "reverted") { toast("Splitting failed", { type: "error", @@ -65,9 +64,8 @@ export const useSplitFractionUnits = ({ return { write: async (id: bigint, fractions: bigint[]) => { - showModal({ stepDescriptions }); - setStep("preparing"); await initializeWrite(id, fractions); + window.location.reload(); }, txPending, readOnly: isLoading || !client || client.readonly, diff --git a/frontend/package.json b/frontend/package.json index 15dc1a26..6a4d0d9e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -25,7 +25,7 @@ "@graphprotocol/client-cli": "^2.2.16", "@hypercerts-org/contracts": "0.9.0", "@hypercerts-org/observabletreemap": "workspace: *", - "@hypercerts-org/sdk": "1.0.0-alpha.8", + "@hypercerts-org/sdk": "1.0.0-alpha.9", "@mui/icons-material": "^5.11.9", "@mui/material": "^5.11.2", "@mui/x-date-pickers": "^5.0.12", diff --git a/frontend/plasmic-init.ts b/frontend/plasmic-init.ts index b9ffaeb1..bcd4bac1 100644 --- a/frontend/plasmic-init.ts +++ b/frontend/plasmic-init.ts @@ -683,7 +683,7 @@ PLASMIC.registerComponent(MergeAllClaimFractionsButton, { disabled: "boolean", text: { type: "string", - defaultValue: "Split", + defaultValue: "Merge", helpText: "Text to display on button", }, }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 850c6324..0e1fb229 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -304,7 +304,7 @@ importers: version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) '@graphprotocol/client-cli': specifier: ^2.2.16 - version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': specifier: 0.9.0 version: 0.9.0(typescript@5.1.6) @@ -312,8 +312,8 @@ importers: specifier: 'workspace: *' version: link:../vendor/observabletreemap '@hypercerts-org/sdk': - specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4) + specifier: 1.0.0-alpha.9 + version: 1.0.0-alpha.9(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4) '@mui/icons-material': specifier: ^5.11.9 version: 5.14.15(@mui/material@5.14.15)(@types/react@18.2.33)(react@18.2.0) @@ -5760,24 +5760,6 @@ packages: '@trufflesuite/bigint-buffer': 1.1.9 dev: true - /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): - resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} - peerDependencies: - '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 - '@graphql-tools/delegate': ^9.0.32 - '@graphql-tools/utils': ^9.2.1 - '@graphql-tools/wrap': ^9.4.2 - graphql: ^15.2.0 || ^16.0.0 - dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) - graphql: 16.8.1 - lodash: 4.17.21 - tslib: 2.6.2 - dev: false - /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} peerDependencies: @@ -5815,7 +5797,7 @@ packages: tslib: 2.6.2 dev: true - /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-p8eEyeBcqxCXLxC7CNgIhLSCd7bjiKToKnrwYPShVb26gIG2JdAmD3/mpjuR+QaMA4chN/EO5t+TGvq6KnFx9g==} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 @@ -5824,7 +5806,7 @@ packages: '@graphql-tools/wrap': ^9.4.2 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) @@ -5852,15 +5834,15 @@ packages: tslib: 2.6.2 dev: true - /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): + /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-kpiX2s804mpP3EVL0EdJfxeHWBTdg6SglIyEvSZ5T1OWyGDeMhr19D+gVIAlo22/PiBUkBDd0JfqppLsliPZ1A==} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 '@graphql-tools/delegate': ^9.0.32 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -5910,19 +5892,19 @@ packages: tslib: 2.6.2 dev: true - /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-PIi8rFibYZVup+0jb08399RmbGF1ZrqUe6RXzLtKZBT57OWIMWwsFvdJyUAdr8Y8f0rrMn6A+Oy4nP1lf3hc1g==} hasBin: true peerDependencies: graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) + '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-polling-live': 1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -6423,7 +6405,7 @@ packages: graphql: 16.8.1 path-browserify: 1.0.1 - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6435,10 +6417,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6666,7 +6648,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6682,8 +6664,8 @@ packages: '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -6742,6 +6724,26 @@ packages: graphql: 16.8.1 tslib: 2.6.2 + /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-inspector/core': 5.0.1(graphql@16.8.1) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} engines: {node: '>=16.0.0'} @@ -6786,22 +6788,6 @@ packages: lodash.get: 4.4.2 tslib: 2.6.2 - /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} - peerDependencies: - '@graphql-mesh/types': ^0.93.1 - '@graphql-mesh/utils': ^0.93.1 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) - '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} peerDependencies: @@ -6811,12 +6797,11 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 - dev: true /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} @@ -6873,6 +6858,30 @@ packages: tiny-lru: 8.0.2 tslib: 2.6.2 + /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/types': ^0.95.8 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@whatwg-node/fetch': 0.9.14 + dset: 3.1.3 + graphql: 16.8.1 + js-yaml: 4.1.0 + lodash.get: 4.4.2 + lodash.topath: 4.5.2 + tiny-lru: 11.2.3 + tslib: 2.6.2 + /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} engines: {node: '>=16.0.0'} @@ -7522,8 +7531,8 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/sdk@1.0.0-alpha.8(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4): - resolution: {integrity: sha512-T44kiplKi4qJQFlnn9Ac8KSOyWeGdglaGjMxhYZzqCEhqWPYYOscm6Q6qu2/X+HDhKpO68MbJPnCp88ajpVAOg==} + /@hypercerts-org/sdk@1.0.0-alpha.9(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4): + resolution: {integrity: sha512-tPvtRK8dZgBQIdmBP+oqnuaU/BASZiFkdCegGXiep/lEAzTzzj9GRcXocd8/f7SzIH7KMytwzLTGdhPHmu02oA==} dependencies: '@ethereum-attestation-service/eas-sdk': 1.2.2-beta.0(ts-node@10.9.1)(typescript@5.1.6) '@ethersproject/abstract-signer': 5.7.0 @@ -7534,12 +7543,12 @@ packages: '@graphql-mesh/graphql': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@hypercerts-org/contracts': 0.8.11 + '@hypercerts-org/contracts': 0.9.0(typescript@5.1.6) '@openzeppelin/merkle-tree': 1.0.5 '@whatwg-node/fetch': 0.9.14 ajv: 8.12.0 From 84a623ca796d89d8171245676656d8446cb3b79a Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Wed, 22 Nov 2023 14:30:06 +0100 Subject: [PATCH 019/118] Feat/hardhat deploy script (#1177) * feat(init): first pass hh script marketplace * feat(deploy): marketplace deploy and verify script * chore(deploy): add feerecipient to deploy * chore(scripts): remove scripts * feat(pack): deployment data and fresh pack * 1.0.0-alpha.0 * chore(npm): release 1.0.0-alpha.0 contracts * chore(npm): update contracts and sdk releases * fix(build): viem update fe * fix(default): remove default_chain_id * remove usage of NEXT_PUBLIC_DEFAULT_CHAIN_ID * fix build error --------- Co-authored-by: jipstavenuiter --- contracts/hardhat.config.ts | 30 +- contracts/package.json | 14 +- contracts/scripts/deployment/Deployment.s.sol | 117 -- .../ProtocolFeeRecipientDeployment.s.sol | 43 - .../deployment-marketplace-goerli.json | 1296 +++++++++++++++++ .../deployment-marketplace-sepolia.json | 1296 +++++++++++++++++ .../deployments-protocol.json} | 10 +- contracts/src/deployments/index.ts | 10 + contracts/src/index.ts | 98 +- .../src/marketplace/LooksRareProtocol.sol | 3 +- contracts/src/marketplace/NonceManager.sol | 2 +- contracts/src/marketplace/StrategyManager.sol | 2 +- contracts/src/marketplace/TransferManager.sol | 2 +- .../src/marketplace/TransferSelectorNFT.sol | 2 +- .../marketplace/helpers/OrderValidatorV2A.sol | 2 +- .../interfaces/ICreatorFeeManager.sol | 2 +- .../interfaces/ICurrencyManager.sol | 2 +- .../interfaces/IExecutionManager.sol | 2 +- .../interfaces/IImmutableCreate2Factory.sol | 7 +- .../interfaces/ILooksRareProtocol.sol | 2 +- .../marketplace/interfaces/INonceManager.sol | 2 +- .../interfaces/IRoyaltyFeeRegistry.sol | 2 +- .../src/marketplace/interfaces/IStrategy.sol | 2 +- .../interfaces/IStrategyManager.sol | 2 +- .../interfaces/ITransferManager.sol | 2 +- .../libraries/CurrencyValidator.sol | 2 +- .../MerkleProofCalldataWithNodes.sol | 2 +- .../OpenZeppelin/MerkleProofMemory.sol | 2 +- contracts/tasks/deploy-marketplace.ts | 457 ++++++ contracts/tasks/index.ts | 1 + .../api/contracts/forge-std/src/console.md | 1 + .../interfaces/IImmutableCreate2Factory.md | 19 + frontend/.env.local.example | 2 - frontend/components/config.tsx | 2 +- frontend/components/hypercert-fetcher.tsx | 7 +- frontend/hooks/burnFraction.ts | 9 +- frontend/hooks/claims.ts | 23 - frontend/hooks/fractions.ts | 27 +- frontend/hooks/hypercerts-client.ts | 27 +- frontend/hooks/mergeFractionUnits.ts | 9 +- frontend/hooks/mintClaim.ts | 17 +- frontend/hooks/mintClaimAllowlist.ts | 9 +- frontend/hooks/mintFractionAllowlist.ts | 9 +- frontend/hooks/mintFractionAllowlistBatch.ts | 6 +- frontend/hooks/splitClaimUnits.ts | 9 +- frontend/hooks/verifyFractionClaim.ts | 13 +- frontend/lib/config.ts | 5 - frontend/lib/hypercert.ts | 1 + frontend/package.json | 6 +- package.json | 2 +- pnpm-lock.yaml | 1190 ++++++++++++++- sdk/.graphclient/index.ts | 34 +- sdk/.graphclient/sources/Hypercerts/types.ts | 2 +- sdk/.graphclientrc.yml | 4 +- sdk/package.json | 10 +- sdk/src/index.ts | 4 +- sdk/src/indexer.ts | 3 +- sdk/src/utils/resolvers.ts | 4 +- sdk/test/client/allowlist.minting.test.ts | 2 +- sdk/test/evaluations/evaluator.test.ts | 8 +- 60 files changed, 4438 insertions(+), 442 deletions(-) delete mode 100644 contracts/scripts/deployment/Deployment.s.sol delete mode 100644 contracts/scripts/deployment/ProtocolFeeRecipientDeployment.s.sol create mode 100644 contracts/src/deployments/deployment-marketplace-goerli.json create mode 100644 contracts/src/deployments/deployment-marketplace-sepolia.json rename contracts/src/{deployments.json => deployments/deployments-protocol.json} (62%) create mode 100644 contracts/src/deployments/index.ts create mode 100644 contracts/tasks/deploy-marketplace.ts create mode 100644 docs/docs/developer/api/contracts/forge-std/src/console.md delete mode 100644 frontend/hooks/claims.ts diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index dce7d9ca..05295953 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -1,6 +1,8 @@ import { HardhatUserConfig } from "hardhat/config"; import "@nomicfoundation/hardhat-toolbox"; import "@nomicfoundation/hardhat-chai-matchers"; +import "@nomicfoundation/hardhat-ethers"; +import "@nomicfoundation/hardhat-viem"; import "@openzeppelin/hardhat-upgrades"; import "@primitivefi/hardhat-dodoc"; @@ -10,6 +12,8 @@ import "hardhat-abi-exporter"; import "hardhat-preprocessor"; import { resolve } from "path"; +import "xdeployer"; + import "./tasks"; function getRemappings() { @@ -103,14 +107,20 @@ const config: HardhatUserConfig = { path: "./abi", runOnCompile: true, clear: true, - flat: true, - format: "minimal", + pretty: true, + only: [ + "CurrencyManager", + "HypercertMinter", + "LooksRareProtocol", + "OrderValidatorV2A", + "StrategyManager", + "TransferManager", + ], except: ["@openzeppelin"], }, defender: { apiKey: OPENZEPPELIN_API_KEY!, apiSecret: OPENZEPPELIN_SECRET_KEY!, - useDefenderDeploy: true, }, dodoc: { runOnCompile: true, @@ -142,12 +152,21 @@ const config: HardhatUserConfig = { // metamask can't transfer when connected to hardhat's network. initialBaseFeePerGas: 0, accounts: { + count: 10, mnemonic: MNEMONIC, + path: "m/44'/60'/0'/0", }, chainId: chainIds.hardhat, + forking: { + url: `https://eth-goerli.g.alchemy.com/v2/${ALCHEMY_API_KEY}`, + }, }, localhost: { - url: process.env.LOCALHOST_NETWORK_URL || "http://127.0.0.1:8545", + accounts: { + count: 10, + mnemonic: MNEMONIC, + path: "m/44'/60'/0'/0", + }, }, "celo-mainnet": getChainConfig("celo-mainnet"), goerli: getChainConfig("goerli"), @@ -179,6 +198,9 @@ const config: HardhatUserConfig = { solidity: { version: "0.8.17", settings: { + metadata: { + bytecodeHash: "none", + }, optimizer: { enabled: true, runs: 5_000, diff --git a/contracts/package.json b/contracts/package.json index 02c1a8d6..5323621d 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@hypercerts-org/contracts", "description": "EVM compatible protocol for managing impact claims", - "version": "0.10.0", + "version": "1.0.0-alpha.2", "author": { "name": "Hypercerts Foundation", "url": "https://github.com/hypercerts-org/hypercerts" @@ -34,8 +34,12 @@ "@commitlint/config-conventional": "^17.1.0", "@dlsl/hardhat-markup": "^1.0.0-rc.7", "@looksrare/contracts-libs": "^3.4.0", + "@nomicfoundation/hardhat-chai-matchers": "^2.0.2", + "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/hardhat-toolbox": "^3.0.0", - "@openzeppelin/contracts": "<5.0.0", + "@nomicfoundation/hardhat-viem": "^1.0.0", + "@openzeppelin/contracts": "^4.9.3", + "@openzeppelin/defender-sdk": "^1.4.0", "@openzeppelin/hardhat-upgrades": "2.3.3", "@primitivefi/hardhat-dodoc": "^0.2.3", "@rollup/plugin-commonjs": "^24.0.1", @@ -70,7 +74,9 @@ "solmate": "^6.2.0", "ts-node": "^10.9.1", "typechain": "^8.3.1", - "typescript": "^4.9.4" + "typescript": "^4.9.4", + "viem": "^1.18.9", + "xdeployer": "^2.1.13" }, "keywords": [ "blockchain", @@ -83,7 +89,7 @@ "template" ], "scripts": { - "build": "pnpm clean && hardhat compile && pnpm tsc -p tsconfig.build.json && rollup -c", + "build": "pnpm clean && forge compile && hardhat compile && pnpm tsc -p tsconfig.build.json && rollup -c", "build:forge": "pnpm clean && forge build", "clean": "rimraf abi artifacts build cache cache_hardhat dist out types", "deploy:marketplace:goerli": "forge script scripts/deployment/Deployment.s.sol:Deployment --broadcast --verify --fork-url goerli", diff --git a/contracts/scripts/deployment/Deployment.s.sol b/contracts/scripts/deployment/Deployment.s.sol deleted file mode 100644 index 244652e5..00000000 --- a/contracts/scripts/deployment/Deployment.s.sol +++ /dev/null @@ -1,117 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; - -// Scripting tool -import {Script} from "forge-std/Script.sol"; - -// Core contracts -import {LooksRareProtocol} from "@hypercerts/marketplace/LooksRareProtocol.sol"; -import {TransferManager} from "@hypercerts/marketplace/TransferManager.sol"; -import {StrategyCollectionOffer} from "@hypercerts/marketplace/executionStrategies/StrategyCollectionOffer.sol"; - -// Create2 factory interface -import {IImmutableCreate2Factory} from "@hypercerts/marketplace/interfaces/IImmutableCreate2Factory.sol"; - -// Other contracts -import {OrderValidatorV2A} from "@hypercerts/marketplace/helpers/OrderValidatorV2A.sol"; - -contract Deployment is Script { - address internal deployer; - IImmutableCreate2Factory private constant IMMUTABLE_CREATE2_FACTORY = - IImmutableCreate2Factory(0x0000000000FFe8B47B3e2130213B802212439497); - - error ChainIdInvalid(uint256 chainId); - error MnemonicInvalid(); - - address public weth; - - // address public royaltyFeeRegistry; - - uint16 internal constant _standardProtocolFeeBp = uint16(50); - uint16 internal constant _minTotalFeeBp = uint16(50); - uint16 internal constant _maxProtocolFeeBp = uint16(200); - - function setUp() public virtual { - string memory mnemonic = vm.envString("MNEMONIC"); - if (bytes(mnemonic).length > 0) { - (deployer,) = deriveRememberKey(mnemonic, 0); - } else { - revert MnemonicInvalid(); - } - } - - function run() external { - uint256 chainId = block.chainid; - - if (chainId == 5) { - weth = 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6; - } else if (chainId == 11_155_111) { - weth = 0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14; - } else { - revert ChainIdInvalid(chainId); - } - - vm.startBroadcast(deployer); - - // 1. Deploy TransferManager - address transferManagerAddress = IMMUTABLE_CREATE2_FACTORY.safeCreate2({ - salt: vm.envBytes32("TRANSFER_MANAGER_SALT"), - initializationCode: abi.encodePacked( - type(TransferManager).creationCode, abi.encode(vm.envAddress("OWNER_ADDRESS")) - ) - }); - - // 2. Transfer 1 wei to LooksRareProtocol before it is deployed. - // It cannot receive ETH after it is deployed. - payable(0x0000000000E655fAe4d56241588680F86E3b2377).transfer(1 wei); - - // 3. Deploy LooksRareProtocol - address looksRareProtocolAddress = IMMUTABLE_CREATE2_FACTORY.safeCreate2({ - salt: vm.envBytes32("LOOKSRARE_PROTOCOL_SALT"), - initializationCode: abi.encodePacked( - type(LooksRareProtocol).creationCode, - abi.encode( - vm.envAddress("OWNER_ADDRESS"), - vm.envAddress("PROTOCOL_FEE_RECIPIENT_ADDRESS"), - transferManagerAddress, - weth - ) - ) - }); - - // 4. Other operations - TransferManager(transferManagerAddress).allowOperator(looksRareProtocolAddress); - LooksRareProtocol(looksRareProtocolAddress).updateCurrencyStatus(address(0), true); - LooksRareProtocol(looksRareProtocolAddress).updateCurrencyStatus(weth, true); - - // 5. Deploy OrderValidatorV2A, this needs to happen after updateCreatorFeeManager - // as the order validator calls creator fee manager to retrieve the royalty fee registry - new OrderValidatorV2A(looksRareProtocolAddress); - - // 6. Deploy StrategyCollectionOffer - address strategyCollectionOfferAddress = IMMUTABLE_CREATE2_FACTORY.safeCreate2({ - salt: vm.envBytes32("STRATEGY_COLLECTION_OFFER_SALT"), - initializationCode: type(StrategyCollectionOffer).creationCode - }); - - LooksRareProtocol(looksRareProtocolAddress).addStrategy( - _standardProtocolFeeBp, - _minTotalFeeBp, - _maxProtocolFeeBp, - StrategyCollectionOffer.executeCollectionStrategyWithTakerAsk.selector, - true, - strategyCollectionOfferAddress - ); - - LooksRareProtocol(looksRareProtocolAddress).addStrategy( - _standardProtocolFeeBp, - _minTotalFeeBp, - _maxProtocolFeeBp, - StrategyCollectionOffer.executeCollectionStrategyWithTakerAskWithProof.selector, - true, - strategyCollectionOfferAddress - ); - - vm.stopBroadcast(); - } -} diff --git a/contracts/scripts/deployment/ProtocolFeeRecipientDeployment.s.sol b/contracts/scripts/deployment/ProtocolFeeRecipientDeployment.s.sol deleted file mode 100644 index dc08c0b7..00000000 --- a/contracts/scripts/deployment/ProtocolFeeRecipientDeployment.s.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; - -// Scripting tool -import {Script} from "forge-std/Script.sol"; - -// Core contracts -import {ProtocolFeeRecipient} from "@hypercerts/marketplace/ProtocolFeeRecipient.sol"; - -contract ProtocolFeeRecipientDeployment is Script { - error ChainIdInvalid(uint256 chainId); - - // WETH - address public weth; - address private feeSharingSetter; - - function run() external { - uint256 chainId = block.chainid; - uint256 deployerPrivateKey; - - if (chainId == 1) { - weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; - feeSharingSetter = 0x5924A28caAF1cc016617874a2f0C3710d881f3c1; - deployerPrivateKey = vm.envUint("MAINNET_KEY"); - } else if (chainId == 5) { - weth = 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6; - feeSharingSetter = 0x3d1E1521b659b0C942836DeF24dd254aBdEb873b; - deployerPrivateKey = vm.envUint("TESTNET_KEY"); - } else if (chainId == 11_155_111) { - weth = 0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9; - feeSharingSetter = 0x8a7c709648160a5A1191D07dfAB316224E4C6b07; - deployerPrivateKey = vm.envUint("TESTNET_KEY"); - } else { - revert ChainIdInvalid(chainId); - } - - vm.startBroadcast(deployerPrivateKey); - - new ProtocolFeeRecipient(feeSharingSetter, weth); - - vm.stopBroadcast(); - } -} diff --git a/contracts/src/deployments/deployment-marketplace-goerli.json b/contracts/src/deployments/deployment-marketplace-goerli.json new file mode 100644 index 00000000..895cada6 --- /dev/null +++ b/contracts/src/deployments/deployment-marketplace-goerli.json @@ -0,0 +1,1296 @@ +{ + "hypercerts-exchange": { + "address": "0x483e634b79A933CDf369c46f6138a781B7495233", + "abi": [ + { + "inputs": [ + { "internalType": "address", "name": "_owner", "type": "address" }, + { "internalType": "address", "name": "_protocolFeeRecipient", "type": "address" }, + { "internalType": "address", "name": "_transferManager", "type": "address" }, + { "internalType": "address", "name": "_weth", "type": "address" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "inputs": [], "name": "CallerInvalid", "type": "error" }, + { "inputs": [], "name": "ChainIdInvalid", "type": "error" }, + { "inputs": [], "name": "CreatorFeeBpTooHigh", "type": "error" }, + { "inputs": [], "name": "CurrencyInvalid", "type": "error" }, + { "inputs": [], "name": "ERC20TransferFromFail", "type": "error" }, + { "inputs": [], "name": "LengthsInvalid", "type": "error" }, + { "inputs": [], "name": "MerkleProofInvalid", "type": "error" }, + { + "inputs": [{ "internalType": "uint256", "name": "length", "type": "uint256" }], + "name": "MerkleProofTooLarge", + "type": "error" + }, + { "inputs": [], "name": "NewGasLimitETHTransferTooLow", "type": "error" }, + { "inputs": [], "name": "NewProtocolFeeRecipientCannotBeNullAddress", "type": "error" }, + { "inputs": [], "name": "NoOngoingTransferInProgress", "type": "error" }, + { "inputs": [], "name": "NoSelectorForStrategy", "type": "error" }, + { "inputs": [], "name": "NoncesInvalid", "type": "error" }, + { "inputs": [], "name": "NotAContract", "type": "error" }, + { "inputs": [], "name": "NotOwner", "type": "error" }, + { "inputs": [], "name": "NotV2Strategy", "type": "error" }, + { "inputs": [], "name": "NullSignerAddress", "type": "error" }, + { "inputs": [], "name": "OutsideOfTimeRange", "type": "error" }, + { "inputs": [], "name": "QuoteTypeInvalid", "type": "error" }, + { "inputs": [], "name": "ReentrancyFail", "type": "error" }, + { "inputs": [], "name": "RenouncementNotInProgress", "type": "error" }, + { "inputs": [], "name": "SameDomainSeparator", "type": "error" }, + { "inputs": [], "name": "SignatureEOAInvalid", "type": "error" }, + { "inputs": [], "name": "SignatureERC1271Invalid", "type": "error" }, + { + "inputs": [{ "internalType": "uint256", "name": "length", "type": "uint256" }], + "name": "SignatureLengthInvalid", + "type": "error" + }, + { "inputs": [], "name": "SignatureParameterSInvalid", "type": "error" }, + { + "inputs": [{ "internalType": "uint8", "name": "v", "type": "uint8" }], + "name": "SignatureParameterVInvalid", + "type": "error" + }, + { "inputs": [], "name": "StrategyHasNoSelector", "type": "error" }, + { + "inputs": [{ "internalType": "uint256", "name": "strategyId", "type": "uint256" }], + "name": "StrategyNotAvailable", + "type": "error" + }, + { "inputs": [], "name": "StrategyNotUsed", "type": "error" }, + { "inputs": [], "name": "StrategyProtocolFeeTooHigh", "type": "error" }, + { "inputs": [], "name": "TransferAlreadyInProgress", "type": "error" }, + { "inputs": [], "name": "TransferNotInProgress", "type": "error" }, + { "inputs": [], "name": "UnsupportedCollectionType", "type": "error" }, + { "inputs": [], "name": "WrongPotentialOwner", "type": "error" }, + { "anonymous": false, "inputs": [], "name": "CancelOwnershipTransfer", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, + { "indexed": false, "internalType": "bool", "name": "isAllowed", "type": "bool" } + ], + "name": "CurrencyStatusUpdated", + "type": "event" + }, + { "anonymous": false, "inputs": [], "name": "InitiateOwnershipRenouncement", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "previousOwner", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "potentialOwner", "type": "address" } + ], + "name": "InitiateOwnershipTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "bidNonce", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "askNonce", "type": "uint256" } + ], + "name": "NewBidAskNonces", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "creatorFeeManager", "type": "address" }], + "name": "NewCreatorFeeManager", + "type": "event" + }, + { "anonymous": false, "inputs": [], "name": "NewDomainSeparator", "type": "event" }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "uint256", "name": "gasLimitETHTransfer", "type": "uint256" }], + "name": "NewGasLimitETHTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "uint256", "name": "maxCreatorFeeBp", "type": "uint256" }], + "name": "NewMaxCreatorFeeBp", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "NewOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "protocolFeeRecipient", "type": "address" }], + "name": "NewProtocolFeeRecipient", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "indexed": false, "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, + { "indexed": false, "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, + { "indexed": false, "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, + { "indexed": false, "internalType": "bytes4", "name": "selector", "type": "bytes4" }, + { "indexed": false, "internalType": "bool", "name": "isMakerBid", "type": "bool" }, + { "indexed": false, "internalType": "address", "name": "implementation", "type": "address" } + ], + "name": "NewStrategy", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "uint256[]", "name": "orderNonces", "type": "uint256[]" } + ], + "name": "OrderNoncesCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "indexed": false, "internalType": "bool", "name": "isActive", "type": "bool" }, + { "indexed": false, "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, + { "indexed": false, "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" } + ], + "name": "StrategyUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "uint256[]", "name": "subsetNonces", "type": "uint256[]" } + ], + "name": "SubsetNoncesCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } + ], + "indexed": false, + "internalType": "struct ILooksRareProtocol.NonceInvalidationParameters", + "name": "nonceInvalidationParameters", + "type": "tuple" + }, + { "indexed": false, "internalType": "address", "name": "askUser", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "bidUser", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "collection", "type": "address" }, + { "indexed": false, "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "indexed": false, "internalType": "address[2]", "name": "feeRecipients", "type": "address[2]" }, + { "indexed": false, "internalType": "uint256[3]", "name": "feeAmounts", "type": "uint256[3]" } + ], + "name": "TakerAsk", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } + ], + "indexed": false, + "internalType": "struct ILooksRareProtocol.NonceInvalidationParameters", + "name": "nonceInvalidationParameters", + "type": "tuple" + }, + { "indexed": false, "internalType": "address", "name": "bidUser", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "bidRecipient", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "collection", "type": "address" }, + { "indexed": false, "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "indexed": false, "internalType": "address[2]", "name": "feeRecipients", "type": "address[2]" }, + { "indexed": false, "internalType": "uint256[3]", "name": "feeAmounts", "type": "uint256[3]" } + ], + "name": "TakerBid", + "type": "event" + }, + { + "inputs": [], + "name": "MAGIC_VALUE_ORDER_NONCE_EXECUTED", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, + { "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, + { "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, + { "internalType": "bytes4", "name": "selector", "type": "bytes4" }, + { "internalType": "bool", "name": "isMakerBid", "type": "bool" }, + { "internalType": "address", "name": "implementation", "type": "address" } + ], + "name": "addStrategy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256[]", "name": "orderNonces", "type": "uint256[]" }], + "name": "cancelOrderNonces", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cancelOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256[]", "name": "subsetNonces", "type": "uint256[]" }], + "name": "cancelSubsetNonces", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "chainId", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "confirmOwnershipRenouncement", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "confirmOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "creatorFeeManager", + "outputs": [{ "internalType": "contract ICreatorFeeManager", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "domainSeparator", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker[]", + "name": "takerBids", + "type": "tuple[]" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker[]", + "name": "makerAsks", + "type": "tuple[]" + }, + { "internalType": "bytes[]", "name": "makerSignatures", "type": "bytes[]" }, + { + "components": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { + "components": [ + { "internalType": "bytes32", "name": "value", "type": "bytes32" }, + { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } + ], + "internalType": "struct OrderStructs.MerkleTreeNode[]", + "name": "proof", + "type": "tuple[]" + } + ], + "internalType": "struct OrderStructs.MerkleTree[]", + "name": "merkleTrees", + "type": "tuple[]" + }, + { "internalType": "bool", "name": "isAtomic", "type": "bool" } + ], + "name": "executeMultipleTakerBids", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker", + "name": "takerAsk", + "type": "tuple" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerBid", + "type": "tuple" + }, + { "internalType": "bytes", "name": "makerSignature", "type": "bytes" }, + { + "components": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { + "components": [ + { "internalType": "bytes32", "name": "value", "type": "bytes32" }, + { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } + ], + "internalType": "struct OrderStructs.MerkleTreeNode[]", + "name": "proof", + "type": "tuple[]" + } + ], + "internalType": "struct OrderStructs.MerkleTree", + "name": "merkleTree", + "type": "tuple" + } + ], + "name": "executeTakerAsk", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker", + "name": "takerBid", + "type": "tuple" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerAsk", + "type": "tuple" + }, + { "internalType": "bytes", "name": "makerSignature", "type": "bytes" }, + { + "components": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { + "components": [ + { "internalType": "bytes32", "name": "value", "type": "bytes32" }, + { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } + ], + "internalType": "struct OrderStructs.MerkleTreeNode[]", + "name": "proof", + "type": "tuple[]" + } + ], + "internalType": "struct OrderStructs.MerkleTree", + "name": "merkleTree", + "type": "tuple" + } + ], + "name": "executeTakerBid", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { "internalType": "uint256", "name": "proofLength", "type": "uint256" } + ], + "name": "hashBatchOrder", + "outputs": [{ "internalType": "bytes32", "name": "batchOrderHash", "type": "bytes32" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bool", "name": "bid", "type": "bool" }, + { "internalType": "bool", "name": "ask", "type": "bool" } + ], + "name": "incrementBidAskNonces", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initiateOwnershipRenouncement", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newPotentialOwner", "type": "address" }], + "name": "initiateOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "isCurrencyAllowed", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxCreatorFeeBp", + "outputs": [{ "internalType": "uint16", "name": "", "type": "uint16" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ownershipStatus", + "outputs": [{ "internalType": "enum IOwnableTwoSteps.Status", "name": "", "type": "uint8" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "potentialOwner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFeeRecipient", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker", + "name": "takerBid", + "type": "tuple" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerAsk", + "type": "tuple" + }, + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" } + ], + "name": "restrictedExecuteTakerBid", + "outputs": [{ "internalType": "uint256", "name": "protocolFeeAmount", "type": "uint256" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "strategyInfo", + "outputs": [ + { "internalType": "bool", "name": "isActive", "type": "bool" }, + { "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, + { "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, + { "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, + { "internalType": "bytes4", "name": "selector", "type": "bytes4" }, + { "internalType": "bool", "name": "isMakerBid", "type": "bool" }, + { "internalType": "address", "name": "implementation", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "transferManager", + "outputs": [{ "internalType": "contract TransferManager", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newCreatorFeeManager", "type": "address" }], + "name": "updateCreatorFeeManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "bool", "name": "isAllowed", "type": "bool" } + ], + "name": "updateCurrencyStatus", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "updateDomainSeparator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "newGasLimitETHTransfer", "type": "uint256" }], + "name": "updateETHGasLimitForTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint16", "name": "newMaxCreatorFeeBp", "type": "uint16" }], + "name": "updateMaxCreatorFeeBp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newProtocolFeeRecipient", "type": "address" }], + "name": "updateProtocolFeeRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "bool", "name": "isActive", "type": "bool" }, + { "internalType": "uint16", "name": "newStandardProtocolFee", "type": "uint16" }, + { "internalType": "uint16", "name": "newMinTotalFee", "type": "uint16" } + ], + "name": "updateStrategy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "userBidAskNonces", + "outputs": [ + { "internalType": "uint256", "name": "bidNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "askNonce", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "name": "userOrderNonce", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "name": "userSubsetNonce", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + } + ], + "fullNamespace": "LooksRareProtocol", + "args": [ + "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", + "0x67B32834610E5cE95Cf8a4d5Bc90e43E09121409", + "0x7AAC4C1407f5F83256581eCc913dC8b20F7bdab1", + "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6" + ], + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a67b32834610e5ce95cf8a4d5bc90e43e091214097aac4c1407f5f83256581ecc913dc8b20f7bdab1b4fbf271143f4fbf7b91a5ded31805e42b2208d6", + "tx": "0xc52cf3d6507a29dc6ddcfe36eea4baa8425d199c3315cb1f5b971780c7c56537" + }, + "transfer-manager": { + "address": "0x7AAC4C1407f5F83256581eCc913dC8b20F7bdab1", + "abi": [ + { + "inputs": [{ "internalType": "address", "name": "_owner", "type": "address" }], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "inputs": [], "name": "AmountInvalid", "type": "error" }, + { "inputs": [], "name": "ERC1155SafeBatchTransferFromFail", "type": "error" }, + { "inputs": [], "name": "ERC1155SafeTransferFromFail", "type": "error" }, + { "inputs": [], "name": "ERC721TransferFromFail", "type": "error" }, + { "inputs": [], "name": "LengthsInvalid", "type": "error" }, + { "inputs": [], "name": "NoOngoingTransferInProgress", "type": "error" }, + { "inputs": [], "name": "NotAContract", "type": "error" }, + { "inputs": [], "name": "NotOwner", "type": "error" }, + { "inputs": [], "name": "OperatorAlreadyAllowed", "type": "error" }, + { "inputs": [], "name": "OperatorAlreadyApprovedByUser", "type": "error" }, + { "inputs": [], "name": "OperatorNotAllowed", "type": "error" }, + { "inputs": [], "name": "OperatorNotApprovedByUser", "type": "error" }, + { "inputs": [], "name": "RenouncementNotInProgress", "type": "error" }, + { "inputs": [], "name": "TransferAlreadyInProgress", "type": "error" }, + { "inputs": [], "name": "TransferCallerInvalid", "type": "error" }, + { "inputs": [], "name": "TransferNotInProgress", "type": "error" }, + { "inputs": [], "name": "WrongPotentialOwner", "type": "error" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "address[]", "name": "operators", "type": "address[]" } + ], + "name": "ApprovalsGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "address[]", "name": "operators", "type": "address[]" } + ], + "name": "ApprovalsRemoved", + "type": "event" + }, + { "anonymous": false, "inputs": [], "name": "CancelOwnershipTransfer", "type": "event" }, + { "anonymous": false, "inputs": [], "name": "InitiateOwnershipRenouncement", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "previousOwner", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "potentialOwner", "type": "address" } + ], + "name": "InitiateOwnershipTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "NewOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "operator", "type": "address" }], + "name": "OperatorAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "operator", "type": "address" }], + "name": "OperatorRemoved", + "type": "event" + }, + { + "inputs": [{ "internalType": "address", "name": "operator", "type": "address" }], + "name": "allowOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cancelOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "confirmOwnershipRenouncement", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "confirmOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address[]", "name": "operators", "type": "address[]" }], + "name": "grantApprovals", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "address", "name": "", "type": "address" } + ], + "name": "hasUserApprovedOperator", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initiateOwnershipRenouncement", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newPotentialOwner", "type": "address" }], + "name": "initiateOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "isOperatorAllowed", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ownershipStatus", + "outputs": [{ "internalType": "enum IOwnableTwoSteps.Status", "name": "", "type": "uint8" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "potentialOwner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "operator", "type": "address" }], + "name": "removeOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address[]", "name": "operators", "type": "address[]" }], + "name": "revokeApprovals", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "internalType": "struct ITransferManager.BatchTransferItem[]", + "name": "items", + "type": "tuple[]" + }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" } + ], + "name": "transferBatchItemsAcrossCollections", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "name": "transferItemsERC1155", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "name": "transferItemsERC721", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "name": "transferItemsHyperboard", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "name": "transferItemsHypercert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "fullNamespace": "TransferManager", + "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a"], + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", + "tx": "0xd16227c67ac0445f22865cfedbebb3599ae80bb3d21146b63a09e657b2ae7f66" + }, + "order-validator": { + "address": "0xbad0897927a2333c1c4c440c679c634ffbfd9c71", + "abi": [ + { + "inputs": [{ "internalType": "address", "name": "_looksRareProtocol", "type": "address" }], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "CRITERIA_GROUPS", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ERC1155_INTERFACE_ID", + "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ERC721_INTERFACE_ID_1", + "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ERC721_INTERFACE_ID_2", + "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAGIC_VALUE_ORDER_NONCE_EXECUTED", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerOrder", + "type": "tuple" + }, + { "internalType": "bytes", "name": "signature", "type": "bytes" }, + { + "components": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { + "components": [ + { "internalType": "bytes32", "name": "value", "type": "bytes32" }, + { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } + ], + "internalType": "struct OrderStructs.MerkleTreeNode[]", + "name": "proof", + "type": "tuple[]" + } + ], + "internalType": "struct OrderStructs.MerkleTree", + "name": "merkleTree", + "type": "tuple" + } + ], + "name": "checkMakerOrderValidity", + "outputs": [{ "internalType": "uint256[9]", "name": "validationCodes", "type": "uint256[9]" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker[]", + "name": "makerOrders", + "type": "tuple[]" + }, + { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }, + { + "components": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { + "components": [ + { "internalType": "bytes32", "name": "value", "type": "bytes32" }, + { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } + ], + "internalType": "struct OrderStructs.MerkleTreeNode[]", + "name": "proof", + "type": "tuple[]" + } + ], + "internalType": "struct OrderStructs.MerkleTree[]", + "name": "merkleTrees", + "type": "tuple[]" + } + ], + "name": "checkMultipleMakerOrderValidities", + "outputs": [{ "internalType": "uint256[9][]", "name": "validationCodes", "type": "uint256[9][]" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "creatorFeeManager", + "outputs": [{ "internalType": "contract ICreatorFeeManager", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deriveProtocolParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "domainSeparator", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "looksRareProtocol", + "outputs": [{ "internalType": "contract LooksRareProtocol", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxCreatorFeeBp", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "transferManager", + "outputs": [{ "internalType": "contract TransferManager", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + } + ], + "fullNamespace": "OrderValidatorV2A", + "args": ["0x483e634b79A933CDf369c46f6138a781B7495233"], + "encodedArgs": "0x483e634b79a933cdf369c46f6138a781b7495233", + "tx": "0xc417e2d30504a983d1898f357edec96e8d41af6ec63072ed732c6b4f469ab370" + }, + "strategy-collection-offer": { + "address": "0x9874463e1821d8f8de3eb84fc91e7c10e14bfa83", + "abi": [ + { "inputs": [], "name": "MerkleProofInvalid", "type": "error" }, + { "inputs": [], "name": "OrderInvalid", "type": "error" }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker", + "name": "takerAsk", + "type": "tuple" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerBid", + "type": "tuple" + } + ], + "name": "executeCollectionStrategyWithTakerAsk", + "outputs": [ + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker", + "name": "takerAsk", + "type": "tuple" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerBid", + "type": "tuple" + } + ], + "name": "executeCollectionStrategyWithTakerAskWithProof", + "outputs": [ + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "isLooksRareV2Strategy", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerBid", + "type": "tuple" + }, + { "internalType": "bytes4", "name": "functionSelector", "type": "bytes4" } + ], + "name": "isMakerOrderValid", + "outputs": [ + { "internalType": "bool", "name": "isValid", "type": "bool" }, + { "internalType": "bytes4", "name": "errorSelector", "type": "bytes4" } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "fullNamespace": "StrategyCollectionOffer", + "args": [], + "encodedArgs": "0x", + "tx": "0x2e1065ba99ff70094cd9782d72166f2d0e579052fa0b70749e068cbba008f66c" + } +} diff --git a/contracts/src/deployments/deployment-marketplace-sepolia.json b/contracts/src/deployments/deployment-marketplace-sepolia.json new file mode 100644 index 00000000..904ace20 --- /dev/null +++ b/contracts/src/deployments/deployment-marketplace-sepolia.json @@ -0,0 +1,1296 @@ +{ + "hypercerts-exchange": { + "address": "0x4072ABD45a95c56372eAA00059B101C95191ea2A", + "abi": [ + { + "inputs": [ + { "internalType": "address", "name": "_owner", "type": "address" }, + { "internalType": "address", "name": "_protocolFeeRecipient", "type": "address" }, + { "internalType": "address", "name": "_transferManager", "type": "address" }, + { "internalType": "address", "name": "_weth", "type": "address" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "inputs": [], "name": "CallerInvalid", "type": "error" }, + { "inputs": [], "name": "ChainIdInvalid", "type": "error" }, + { "inputs": [], "name": "CreatorFeeBpTooHigh", "type": "error" }, + { "inputs": [], "name": "CurrencyInvalid", "type": "error" }, + { "inputs": [], "name": "ERC20TransferFromFail", "type": "error" }, + { "inputs": [], "name": "LengthsInvalid", "type": "error" }, + { "inputs": [], "name": "MerkleProofInvalid", "type": "error" }, + { + "inputs": [{ "internalType": "uint256", "name": "length", "type": "uint256" }], + "name": "MerkleProofTooLarge", + "type": "error" + }, + { "inputs": [], "name": "NewGasLimitETHTransferTooLow", "type": "error" }, + { "inputs": [], "name": "NewProtocolFeeRecipientCannotBeNullAddress", "type": "error" }, + { "inputs": [], "name": "NoOngoingTransferInProgress", "type": "error" }, + { "inputs": [], "name": "NoSelectorForStrategy", "type": "error" }, + { "inputs": [], "name": "NoncesInvalid", "type": "error" }, + { "inputs": [], "name": "NotAContract", "type": "error" }, + { "inputs": [], "name": "NotOwner", "type": "error" }, + { "inputs": [], "name": "NotV2Strategy", "type": "error" }, + { "inputs": [], "name": "NullSignerAddress", "type": "error" }, + { "inputs": [], "name": "OutsideOfTimeRange", "type": "error" }, + { "inputs": [], "name": "QuoteTypeInvalid", "type": "error" }, + { "inputs": [], "name": "ReentrancyFail", "type": "error" }, + { "inputs": [], "name": "RenouncementNotInProgress", "type": "error" }, + { "inputs": [], "name": "SameDomainSeparator", "type": "error" }, + { "inputs": [], "name": "SignatureEOAInvalid", "type": "error" }, + { "inputs": [], "name": "SignatureERC1271Invalid", "type": "error" }, + { + "inputs": [{ "internalType": "uint256", "name": "length", "type": "uint256" }], + "name": "SignatureLengthInvalid", + "type": "error" + }, + { "inputs": [], "name": "SignatureParameterSInvalid", "type": "error" }, + { + "inputs": [{ "internalType": "uint8", "name": "v", "type": "uint8" }], + "name": "SignatureParameterVInvalid", + "type": "error" + }, + { "inputs": [], "name": "StrategyHasNoSelector", "type": "error" }, + { + "inputs": [{ "internalType": "uint256", "name": "strategyId", "type": "uint256" }], + "name": "StrategyNotAvailable", + "type": "error" + }, + { "inputs": [], "name": "StrategyNotUsed", "type": "error" }, + { "inputs": [], "name": "StrategyProtocolFeeTooHigh", "type": "error" }, + { "inputs": [], "name": "TransferAlreadyInProgress", "type": "error" }, + { "inputs": [], "name": "TransferNotInProgress", "type": "error" }, + { "inputs": [], "name": "UnsupportedCollectionType", "type": "error" }, + { "inputs": [], "name": "WrongPotentialOwner", "type": "error" }, + { "anonymous": false, "inputs": [], "name": "CancelOwnershipTransfer", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, + { "indexed": false, "internalType": "bool", "name": "isAllowed", "type": "bool" } + ], + "name": "CurrencyStatusUpdated", + "type": "event" + }, + { "anonymous": false, "inputs": [], "name": "InitiateOwnershipRenouncement", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "previousOwner", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "potentialOwner", "type": "address" } + ], + "name": "InitiateOwnershipTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "bidNonce", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "askNonce", "type": "uint256" } + ], + "name": "NewBidAskNonces", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "creatorFeeManager", "type": "address" }], + "name": "NewCreatorFeeManager", + "type": "event" + }, + { "anonymous": false, "inputs": [], "name": "NewDomainSeparator", "type": "event" }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "uint256", "name": "gasLimitETHTransfer", "type": "uint256" }], + "name": "NewGasLimitETHTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "uint256", "name": "maxCreatorFeeBp", "type": "uint256" }], + "name": "NewMaxCreatorFeeBp", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "NewOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "protocolFeeRecipient", "type": "address" }], + "name": "NewProtocolFeeRecipient", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "indexed": false, "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, + { "indexed": false, "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, + { "indexed": false, "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, + { "indexed": false, "internalType": "bytes4", "name": "selector", "type": "bytes4" }, + { "indexed": false, "internalType": "bool", "name": "isMakerBid", "type": "bool" }, + { "indexed": false, "internalType": "address", "name": "implementation", "type": "address" } + ], + "name": "NewStrategy", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "uint256[]", "name": "orderNonces", "type": "uint256[]" } + ], + "name": "OrderNoncesCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "indexed": false, "internalType": "bool", "name": "isActive", "type": "bool" }, + { "indexed": false, "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, + { "indexed": false, "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" } + ], + "name": "StrategyUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "uint256[]", "name": "subsetNonces", "type": "uint256[]" } + ], + "name": "SubsetNoncesCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } + ], + "indexed": false, + "internalType": "struct ILooksRareProtocol.NonceInvalidationParameters", + "name": "nonceInvalidationParameters", + "type": "tuple" + }, + { "indexed": false, "internalType": "address", "name": "askUser", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "bidUser", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "collection", "type": "address" }, + { "indexed": false, "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "indexed": false, "internalType": "address[2]", "name": "feeRecipients", "type": "address[2]" }, + { "indexed": false, "internalType": "uint256[3]", "name": "feeAmounts", "type": "uint256[3]" } + ], + "name": "TakerAsk", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } + ], + "indexed": false, + "internalType": "struct ILooksRareProtocol.NonceInvalidationParameters", + "name": "nonceInvalidationParameters", + "type": "tuple" + }, + { "indexed": false, "internalType": "address", "name": "bidUser", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "bidRecipient", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "collection", "type": "address" }, + { "indexed": false, "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "indexed": false, "internalType": "address[2]", "name": "feeRecipients", "type": "address[2]" }, + { "indexed": false, "internalType": "uint256[3]", "name": "feeAmounts", "type": "uint256[3]" } + ], + "name": "TakerBid", + "type": "event" + }, + { + "inputs": [], + "name": "MAGIC_VALUE_ORDER_NONCE_EXECUTED", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, + { "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, + { "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, + { "internalType": "bytes4", "name": "selector", "type": "bytes4" }, + { "internalType": "bool", "name": "isMakerBid", "type": "bool" }, + { "internalType": "address", "name": "implementation", "type": "address" } + ], + "name": "addStrategy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256[]", "name": "orderNonces", "type": "uint256[]" }], + "name": "cancelOrderNonces", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cancelOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256[]", "name": "subsetNonces", "type": "uint256[]" }], + "name": "cancelSubsetNonces", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "chainId", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "confirmOwnershipRenouncement", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "confirmOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "creatorFeeManager", + "outputs": [{ "internalType": "contract ICreatorFeeManager", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "domainSeparator", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker[]", + "name": "takerBids", + "type": "tuple[]" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker[]", + "name": "makerAsks", + "type": "tuple[]" + }, + { "internalType": "bytes[]", "name": "makerSignatures", "type": "bytes[]" }, + { + "components": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { + "components": [ + { "internalType": "bytes32", "name": "value", "type": "bytes32" }, + { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } + ], + "internalType": "struct OrderStructs.MerkleTreeNode[]", + "name": "proof", + "type": "tuple[]" + } + ], + "internalType": "struct OrderStructs.MerkleTree[]", + "name": "merkleTrees", + "type": "tuple[]" + }, + { "internalType": "bool", "name": "isAtomic", "type": "bool" } + ], + "name": "executeMultipleTakerBids", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker", + "name": "takerAsk", + "type": "tuple" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerBid", + "type": "tuple" + }, + { "internalType": "bytes", "name": "makerSignature", "type": "bytes" }, + { + "components": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { + "components": [ + { "internalType": "bytes32", "name": "value", "type": "bytes32" }, + { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } + ], + "internalType": "struct OrderStructs.MerkleTreeNode[]", + "name": "proof", + "type": "tuple[]" + } + ], + "internalType": "struct OrderStructs.MerkleTree", + "name": "merkleTree", + "type": "tuple" + } + ], + "name": "executeTakerAsk", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker", + "name": "takerBid", + "type": "tuple" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerAsk", + "type": "tuple" + }, + { "internalType": "bytes", "name": "makerSignature", "type": "bytes" }, + { + "components": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { + "components": [ + { "internalType": "bytes32", "name": "value", "type": "bytes32" }, + { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } + ], + "internalType": "struct OrderStructs.MerkleTreeNode[]", + "name": "proof", + "type": "tuple[]" + } + ], + "internalType": "struct OrderStructs.MerkleTree", + "name": "merkleTree", + "type": "tuple" + } + ], + "name": "executeTakerBid", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { "internalType": "uint256", "name": "proofLength", "type": "uint256" } + ], + "name": "hashBatchOrder", + "outputs": [{ "internalType": "bytes32", "name": "batchOrderHash", "type": "bytes32" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bool", "name": "bid", "type": "bool" }, + { "internalType": "bool", "name": "ask", "type": "bool" } + ], + "name": "incrementBidAskNonces", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initiateOwnershipRenouncement", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newPotentialOwner", "type": "address" }], + "name": "initiateOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "isCurrencyAllowed", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxCreatorFeeBp", + "outputs": [{ "internalType": "uint16", "name": "", "type": "uint16" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ownershipStatus", + "outputs": [{ "internalType": "enum IOwnableTwoSteps.Status", "name": "", "type": "uint8" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "potentialOwner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFeeRecipient", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker", + "name": "takerBid", + "type": "tuple" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerAsk", + "type": "tuple" + }, + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" } + ], + "name": "restrictedExecuteTakerBid", + "outputs": [{ "internalType": "uint256", "name": "protocolFeeAmount", "type": "uint256" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "strategyInfo", + "outputs": [ + { "internalType": "bool", "name": "isActive", "type": "bool" }, + { "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, + { "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, + { "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, + { "internalType": "bytes4", "name": "selector", "type": "bytes4" }, + { "internalType": "bool", "name": "isMakerBid", "type": "bool" }, + { "internalType": "address", "name": "implementation", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "transferManager", + "outputs": [{ "internalType": "contract TransferManager", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newCreatorFeeManager", "type": "address" }], + "name": "updateCreatorFeeManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "bool", "name": "isAllowed", "type": "bool" } + ], + "name": "updateCurrencyStatus", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "updateDomainSeparator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "newGasLimitETHTransfer", "type": "uint256" }], + "name": "updateETHGasLimitForTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint16", "name": "newMaxCreatorFeeBp", "type": "uint16" }], + "name": "updateMaxCreatorFeeBp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newProtocolFeeRecipient", "type": "address" }], + "name": "updateProtocolFeeRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "bool", "name": "isActive", "type": "bool" }, + { "internalType": "uint16", "name": "newStandardProtocolFee", "type": "uint16" }, + { "internalType": "uint16", "name": "newMinTotalFee", "type": "uint16" } + ], + "name": "updateStrategy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "userBidAskNonces", + "outputs": [ + { "internalType": "uint256", "name": "bidNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "askNonce", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "name": "userOrderNonce", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "name": "userSubsetNonce", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + } + ], + "fullNamespace": "LooksRareProtocol", + "args": [ + "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", + "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", + "0x7AAC4C1407f5F83256581eCc913dC8b20F7bdab1", + "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6" + ], + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199adf2c3dace6f31e650fd03b8ff72bee82cb1c199a7aac4c1407f5f83256581ecc913dc8b20f7bdab1b4fbf271143f4fbf7b91a5ded31805e42b2208d6", + "tx": "0xaf695468ed6ad7ce6cdf04fb553e658dc268f45dea036119e636b272bf2db9ce" + }, + "transfer-manager": { + "address": "0x7AAC4C1407f5F83256581eCc913dC8b20F7bdab1", + "abi": [ + { + "inputs": [{ "internalType": "address", "name": "_owner", "type": "address" }], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "inputs": [], "name": "AmountInvalid", "type": "error" }, + { "inputs": [], "name": "ERC1155SafeBatchTransferFromFail", "type": "error" }, + { "inputs": [], "name": "ERC1155SafeTransferFromFail", "type": "error" }, + { "inputs": [], "name": "ERC721TransferFromFail", "type": "error" }, + { "inputs": [], "name": "LengthsInvalid", "type": "error" }, + { "inputs": [], "name": "NoOngoingTransferInProgress", "type": "error" }, + { "inputs": [], "name": "NotAContract", "type": "error" }, + { "inputs": [], "name": "NotOwner", "type": "error" }, + { "inputs": [], "name": "OperatorAlreadyAllowed", "type": "error" }, + { "inputs": [], "name": "OperatorAlreadyApprovedByUser", "type": "error" }, + { "inputs": [], "name": "OperatorNotAllowed", "type": "error" }, + { "inputs": [], "name": "OperatorNotApprovedByUser", "type": "error" }, + { "inputs": [], "name": "RenouncementNotInProgress", "type": "error" }, + { "inputs": [], "name": "TransferAlreadyInProgress", "type": "error" }, + { "inputs": [], "name": "TransferCallerInvalid", "type": "error" }, + { "inputs": [], "name": "TransferNotInProgress", "type": "error" }, + { "inputs": [], "name": "WrongPotentialOwner", "type": "error" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "address[]", "name": "operators", "type": "address[]" } + ], + "name": "ApprovalsGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "address[]", "name": "operators", "type": "address[]" } + ], + "name": "ApprovalsRemoved", + "type": "event" + }, + { "anonymous": false, "inputs": [], "name": "CancelOwnershipTransfer", "type": "event" }, + { "anonymous": false, "inputs": [], "name": "InitiateOwnershipRenouncement", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "previousOwner", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "potentialOwner", "type": "address" } + ], + "name": "InitiateOwnershipTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "NewOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "operator", "type": "address" }], + "name": "OperatorAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "operator", "type": "address" }], + "name": "OperatorRemoved", + "type": "event" + }, + { + "inputs": [{ "internalType": "address", "name": "operator", "type": "address" }], + "name": "allowOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cancelOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "confirmOwnershipRenouncement", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "confirmOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address[]", "name": "operators", "type": "address[]" }], + "name": "grantApprovals", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "address", "name": "", "type": "address" } + ], + "name": "hasUserApprovedOperator", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initiateOwnershipRenouncement", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newPotentialOwner", "type": "address" }], + "name": "initiateOwnershipTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "isOperatorAllowed", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ownershipStatus", + "outputs": [{ "internalType": "enum IOwnableTwoSteps.Status", "name": "", "type": "uint8" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "potentialOwner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "operator", "type": "address" }], + "name": "removeOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address[]", "name": "operators", "type": "address[]" }], + "name": "revokeApprovals", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "internalType": "struct ITransferManager.BatchTransferItem[]", + "name": "items", + "type": "tuple[]" + }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" } + ], + "name": "transferBatchItemsAcrossCollections", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "name": "transferItemsERC1155", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "name": "transferItemsERC721", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "name": "transferItemsHyperboard", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "name": "transferItemsHypercert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "fullNamespace": "TransferManager", + "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a"], + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", + "tx": "0xdd3e6cf435bd446c9d53d74968396e82560443ca9629c4c2cfd521e389a85f1e" + }, + "order-validator": { + "address": "0x11cf91a633b292e90afc1dd063db9ce0b94a89ae", + "abi": [ + { + "inputs": [{ "internalType": "address", "name": "_looksRareProtocol", "type": "address" }], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "CRITERIA_GROUPS", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ERC1155_INTERFACE_ID", + "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ERC721_INTERFACE_ID_1", + "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ERC721_INTERFACE_ID_2", + "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAGIC_VALUE_ORDER_NONCE_EXECUTED", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerOrder", + "type": "tuple" + }, + { "internalType": "bytes", "name": "signature", "type": "bytes" }, + { + "components": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { + "components": [ + { "internalType": "bytes32", "name": "value", "type": "bytes32" }, + { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } + ], + "internalType": "struct OrderStructs.MerkleTreeNode[]", + "name": "proof", + "type": "tuple[]" + } + ], + "internalType": "struct OrderStructs.MerkleTree", + "name": "merkleTree", + "type": "tuple" + } + ], + "name": "checkMakerOrderValidity", + "outputs": [{ "internalType": "uint256[9]", "name": "validationCodes", "type": "uint256[9]" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker[]", + "name": "makerOrders", + "type": "tuple[]" + }, + { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }, + { + "components": [ + { "internalType": "bytes32", "name": "root", "type": "bytes32" }, + { + "components": [ + { "internalType": "bytes32", "name": "value", "type": "bytes32" }, + { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } + ], + "internalType": "struct OrderStructs.MerkleTreeNode[]", + "name": "proof", + "type": "tuple[]" + } + ], + "internalType": "struct OrderStructs.MerkleTree[]", + "name": "merkleTrees", + "type": "tuple[]" + } + ], + "name": "checkMultipleMakerOrderValidities", + "outputs": [{ "internalType": "uint256[9][]", "name": "validationCodes", "type": "uint256[9][]" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "creatorFeeManager", + "outputs": [{ "internalType": "contract ICreatorFeeManager", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deriveProtocolParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "domainSeparator", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "looksRareProtocol", + "outputs": [{ "internalType": "contract LooksRareProtocol", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxCreatorFeeBp", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "transferManager", + "outputs": [{ "internalType": "contract TransferManager", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + } + ], + "fullNamespace": "OrderValidatorV2A", + "args": ["0x4072ABD45a95c56372eAA00059B101C95191ea2A"], + "encodedArgs": "0x4072abd45a95c56372eaa00059b101c95191ea2a", + "tx": "0xebbaed0b616b5e4acce94c7de515f99722fec238e7cb3d2a6b6e6c102e9606b3" + }, + "strategy-collection-offer": { + "address": "0x478b6d99efa2689649762a4b4e2590872184078f", + "abi": [ + { "inputs": [], "name": "MerkleProofInvalid", "type": "error" }, + { "inputs": [], "name": "OrderInvalid", "type": "error" }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker", + "name": "takerAsk", + "type": "tuple" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerBid", + "type": "tuple" + } + ], + "name": "executeCollectionStrategyWithTakerAsk", + "outputs": [ + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Taker", + "name": "takerAsk", + "type": "tuple" + }, + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerBid", + "type": "tuple" + } + ], + "name": "executeCollectionStrategyWithTakerAskWithProof", + "outputs": [ + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "isLooksRareV2Strategy", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, + { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, + { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, + { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, + { "internalType": "address", "name": "collection", "type": "address" }, + { "internalType": "address", "name": "currency", "type": "address" }, + { "internalType": "address", "name": "signer", "type": "address" }, + { "internalType": "uint256", "name": "startTime", "type": "uint256" }, + { "internalType": "uint256", "name": "endTime", "type": "uint256" }, + { "internalType": "uint256", "name": "price", "type": "uint256" }, + { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } + ], + "internalType": "struct OrderStructs.Maker", + "name": "makerBid", + "type": "tuple" + }, + { "internalType": "bytes4", "name": "functionSelector", "type": "bytes4" } + ], + "name": "isMakerOrderValid", + "outputs": [ + { "internalType": "bool", "name": "isValid", "type": "bool" }, + { "internalType": "bytes4", "name": "errorSelector", "type": "bytes4" } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "fullNamespace": "StrategyCollectionOffer", + "args": [], + "encodedArgs": "0x", + "tx": "0xbd5e6bbb524df8747ef58974f6dd68f5ad41db59183d1849e6b9b588d777eefa" + } +} diff --git a/contracts/src/deployments.json b/contracts/src/deployments/deployments-protocol.json similarity index 62% rename from contracts/src/deployments.json rename to contracts/src/deployments/deployments-protocol.json index 4156e8e6..1ed7832c 100644 --- a/contracts/src/deployments.json +++ b/contracts/src/deployments/deployments-protocol.json @@ -2,14 +2,16 @@ "5": { "HypercertMinterUUPS": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", "HypercertMinterImplementation": "0x0a00a2f09cd37b24e7429c5238323bfebcff3ed9", - "TransferManager": "0x91CC106977934becc64e56987a89547077E95186", - "HypercertExchange": "0xE6563d73D19794d50526eB1B02441530ED190dc5" + "TransferManager": "0xeec4DFb4A230e92c854a643130BA7F89617CD8e6", + "HypercertExchange": "0x54E196903c7E71182025aBa9DBE5Dd136755D05a", + "OrderValidatorV2A": "0x9626265537c50528a6579e23d44f4d877d27af0b" }, "11155111": { "HypercertMinterUUPS": "0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941", "HypercertMinterImplementation": "0x0a0df97bddb36eef95fef089a4aeb7aceabf2101", - "TransferManager": "0x91CC106977934becc64e56987a89547077E95186", - "HypercertExchange": "0x7AFc7938130bd03b792C0B05C796f42E9beBB2D6" + "TransferManager": "0x7AAC4C1407f5F83256581eCc913dC8b20F7bdab1", + "HypercertExchange": "0x4072ABD45a95c56372eAA00059B101C95191ea2A", + "OrderValidatorV2A": "0x11cf91a633b292e90afc1dd063db9ce0b94a89ae" }, "10": { "HypercertMinterUUPS": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", diff --git a/contracts/src/deployments/index.ts b/contracts/src/deployments/index.ts new file mode 100644 index 00000000..8adbeb2c --- /dev/null +++ b/contracts/src/deployments/index.ts @@ -0,0 +1,10 @@ +import deployments_marketplace_goerli from "./deployment-marketplace-goerli.json"; +import deployments_marketplace_sepolia from "./deployment-marketplace-sepolia.json"; +import deployments_protocol from "./deployments-protocol.json"; + +const deployments_marketplace = { + "5": deployments_marketplace_goerli, + "11155111": deployments_marketplace_sepolia, +}; + +export default { marketplace: deployments_marketplace, protocol: deployments_protocol }; diff --git a/contracts/src/index.ts b/contracts/src/index.ts index 08e9a196..60bb0fcf 100644 --- a/contracts/src/index.ts +++ b/contracts/src/index.ts @@ -1,27 +1,17 @@ -import HypercertMinterAbi from "../abi/HypercertMinter.json"; -import AllowlistMinterAbi from "../abi/AllowlistMinter.json"; -import CurrencyManagerAbi from "../abi/CurrencyManager.json"; -import ExecutionManagerAbi from "../abi/ExecutionManager.json"; -import LooksRareProtocolAbi from "../abi/LooksRareProtocol.json"; -import NonceManagerAbi from "../abi/NonceManager.json"; -import OrderValidatorV2AAbi from "../abi/OrderValidatorV2A.json"; -import StrategyManagerAbi from "../abi/StrategyManager.json"; -import TransferManagerAbi from "../abi/TransferManager.json"; +import DEPLOYMENTS from "./deployments"; -import type { CurrencyManager } from "../types/src/marketplace/CurrencyManager"; -import type { ExecutionManager } from "../types/src/marketplace/ExecutionManager"; -import type { LooksRareProtocol } from "../types/src/marketplace/LooksRareProtocol"; -import type { NonceManager } from "../types/src/marketplace/NonceManager"; -import type { OrderValidatorV2A } from "../types/src/marketplace/helpers/OrderValidatorV2A"; -import type { StrategyManager } from "../types/src/marketplace/StrategyManager"; -import type { TransferManager } from "../types/src/marketplace/TransferManager"; -import type { AllowlistMinter } from "../types/src/protocol/AllowlistMinter"; -import type { HypercertMinter } from "../types/src/protocol/HypercertMinter"; -import type { IAllowlist } from "../types/src/protocol/interfaces/IAllowlist"; -import type { IHypercertToken } from "../types/src/protocol/interfaces/IHypercertToken"; -import type { Errors } from "../types/src/protocol/libs/Errors"; +import HypercertMinterAbi from "../abi/src/protocol/HypercertMinter.sol/HypercertMinter.json"; +import HypercertExchangeAbi from "../abi/src/marketplace/LooksRareProtocol.sol/LooksRareProtocol.json"; +import OrderValidatorV2AAbi from "../abi/src/marketplace/helpers/OrderValidatorV2A.sol/OrderValidatorV2A.json"; +import StrategyManagerAbi from "../abi/src/marketplace/StrategyManager.sol/StrategyManager.json"; +import TransferManagerAbi from "../abi/src/marketplace/TransferManager.sol/TransferManager.json"; -import deploymentsJSON from "./deployments.json"; +import { + HypercertMinter, + IHypercertToken, + LooksRareProtocol as HypercertExchange, + ILooksRareProtocol as IHypercertExchange, +} from "types"; /* in order to adjust the build folder: @@ -31,17 +21,43 @@ import deploymentsJSON from "./deployments.json"; 4) bump package.json version to publish a new package to npm. */ -export type Deployment = { +export type DeploymentProtocol = { HypercertMinterUUPS: `0x${string}`; HypercertMinterImplementation: `0x${string}`; TransferManager?: `0x${string}`; HypercertExchange?: `0x${string}`; }; -export type DeployedChains = keyof typeof deploymentsJSON; +export type DeploymentMarketplace = { + HypercertsExchange: `0x${string}`; + TransferManager: `0x${string}`; + OrderValidatorV2A: `0x${string}`; +}; + +export type Deployment = DeploymentProtocol & Partial; +export type DeployedChains = keyof typeof DEPLOYMENTS.protocol; // Deployments -const deployments = deploymentsJSON as Record; +const deployments = { + 5: { + ...DEPLOYMENTS.protocol["5"], + HypercertsExchange: DEPLOYMENTS.marketplace[5]["hypercerts-exchange"].address, + TransferManager: DEPLOYMENTS.marketplace[5]["transfer-manager"].address, + OrderValidatorV2A: DEPLOYMENTS.marketplace[5]["order-validator"].address, + }, + 10: { + ...DEPLOYMENTS.protocol["10"], + }, + 42220: { + ...DEPLOYMENTS.protocol[42220], + }, + 11155111: { + ...DEPLOYMENTS.protocol["11155111"], + HypercertsExchange: DEPLOYMENTS.marketplace[11155111]["hypercerts-exchange"].address, + TransferManager: DEPLOYMENTS.marketplace[11155111]["transfer-manager"].address, + OrderValidatorV2A: DEPLOYMENTS.marketplace[11155111]["order-validator"].address, + }, +} as Record; const asDeployedChain = (chainId: string | number) => { if (chainId in deployments) return chainId as DeployedChains; @@ -50,32 +66,8 @@ const asDeployedChain = (chainId: string | number) => { export { deployments, asDeployedChain }; -// Interfaces -export { IAllowlist, IHypercertToken }; -export { - HypercertMinterAbi, - AllowlistMinterAbi, - CurrencyManagerAbi, - ExecutionManagerAbi, - LooksRareProtocolAbi as HypercertExchangeAbi, - NonceManagerAbi, - OrderValidatorV2AAbi, - StrategyManagerAbi, - TransferManagerAbi, -}; +// Abis +export { HypercertMinterAbi, HypercertExchangeAbi, OrderValidatorV2AAbi, StrategyManagerAbi, TransferManagerAbi }; -// Contracts -export { - HypercertMinter, - AllowlistMinter, - CurrencyManager, - ExecutionManager, - LooksRareProtocol as HypercertExchange, - NonceManager, - OrderValidatorV2A, - StrategyManager, - TransferManager, -}; - -// Libs -export { Errors }; +// Interfaces +export type { IHypercertExchange, IHypercertToken, HypercertExchange, HypercertMinter }; diff --git a/contracts/src/marketplace/LooksRareProtocol.sol b/contracts/src/marketplace/LooksRareProtocol.sol index 36302ff5..59382581 100644 --- a/contracts/src/marketplace/LooksRareProtocol.sol +++ b/contracts/src/marketplace/LooksRareProtocol.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // LooksRare unopinionated libraries import {SignatureCheckerCalldata} from "@looksrare/contracts-libs/contracts/SignatureCheckerCalldata.sol"; @@ -81,6 +81,7 @@ import {QuoteType} from "./enums/QuoteType.sol"; * ~~~~~~ * @author LooksRare protocol team (👀,💎); bitbeckers */ + contract LooksRareProtocol is ILooksRareProtocol, TransferSelectorNFT, diff --git a/contracts/src/marketplace/NonceManager.sol b/contracts/src/marketplace/NonceManager.sol index d9a94cfc..c8c5657b 100644 --- a/contracts/src/marketplace/NonceManager.sol +++ b/contracts/src/marketplace/NonceManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Interfaces and errors import {INonceManager} from "./interfaces/INonceManager.sol"; diff --git a/contracts/src/marketplace/StrategyManager.sol b/contracts/src/marketplace/StrategyManager.sol index 4edb9d66..d537563b 100644 --- a/contracts/src/marketplace/StrategyManager.sol +++ b/contracts/src/marketplace/StrategyManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // LooksRare unopinionated libraries import {CurrencyManager} from "./CurrencyManager.sol"; diff --git a/contracts/src/marketplace/TransferManager.sol b/contracts/src/marketplace/TransferManager.sol index 74bcf20f..876a084c 100644 --- a/contracts/src/marketplace/TransferManager.sol +++ b/contracts/src/marketplace/TransferManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // LooksRare unopinionated libraries import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; diff --git a/contracts/src/marketplace/TransferSelectorNFT.sol b/contracts/src/marketplace/TransferSelectorNFT.sol index 45869668..d0a40b9c 100644 --- a/contracts/src/marketplace/TransferSelectorNFT.sol +++ b/contracts/src/marketplace/TransferSelectorNFT.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Direct dependencies import {PackableReentrancyGuard} from "@looksrare/contracts-libs/contracts/PackableReentrancyGuard.sol"; diff --git a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol index 808a8386..e8ecf572 100644 --- a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol +++ b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // LooksRare unopinionated libraries import {IERC165} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC165.sol"; diff --git a/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol b/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol index 6b6728e7..d0091c1a 100644 --- a/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol +++ b/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Interfaces import {IRoyaltyFeeRegistry} from "./IRoyaltyFeeRegistry.sol"; diff --git a/contracts/src/marketplace/interfaces/ICurrencyManager.sol b/contracts/src/marketplace/interfaces/ICurrencyManager.sol index 72d50d2e..b4f2a1b4 100644 --- a/contracts/src/marketplace/interfaces/ICurrencyManager.sol +++ b/contracts/src/marketplace/interfaces/ICurrencyManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; /** * @title ICurrencyManager diff --git a/contracts/src/marketplace/interfaces/IExecutionManager.sol b/contracts/src/marketplace/interfaces/IExecutionManager.sol index 945637b5..9f768dca 100644 --- a/contracts/src/marketplace/interfaces/IExecutionManager.sol +++ b/contracts/src/marketplace/interfaces/IExecutionManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; /** * @title IExecutionManager diff --git a/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol b/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol index efbecb66..e220c162 100644 --- a/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol +++ b/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol @@ -1,9 +1,14 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; interface IImmutableCreate2Factory { function safeCreate2(bytes32 salt, bytes calldata initializationCode) external payable returns (address deploymentAddress); + + function findCreate2Address(bytes32 salt, bytes calldata initializationCode) + external + view + returns (address deploymentAddress); } diff --git a/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol b/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol index e2a52119..68e222f6 100644 --- a/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol +++ b/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/interfaces/INonceManager.sol b/contracts/src/marketplace/interfaces/INonceManager.sol index 6011291d..1cbfcbe6 100644 --- a/contracts/src/marketplace/interfaces/INonceManager.sol +++ b/contracts/src/marketplace/interfaces/INonceManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; /** * @title INonceManager diff --git a/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol b/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol index 766d4603..6f5146da 100644 --- a/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol +++ b/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; /** * @title IRoyaltyFeeRegistry diff --git a/contracts/src/marketplace/interfaces/IStrategy.sol b/contracts/src/marketplace/interfaces/IStrategy.sol index a9b7e450..fd725f21 100644 --- a/contracts/src/marketplace/interfaces/IStrategy.sol +++ b/contracts/src/marketplace/interfaces/IStrategy.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/interfaces/IStrategyManager.sol b/contracts/src/marketplace/interfaces/IStrategyManager.sol index 283431a2..77251172 100644 --- a/contracts/src/marketplace/interfaces/IStrategyManager.sol +++ b/contracts/src/marketplace/interfaces/IStrategyManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; /** * @title IStrategyManager diff --git a/contracts/src/marketplace/interfaces/ITransferManager.sol b/contracts/src/marketplace/interfaces/ITransferManager.sol index 77745be1..af0f3d0a 100644 --- a/contracts/src/marketplace/interfaces/ITransferManager.sol +++ b/contracts/src/marketplace/interfaces/ITransferManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/libraries/CurrencyValidator.sol b/contracts/src/marketplace/libraries/CurrencyValidator.sol index 61208646..add2e364 100644 --- a/contracts/src/marketplace/libraries/CurrencyValidator.sol +++ b/contracts/src/marketplace/libraries/CurrencyValidator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Assembly import { diff --git a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol index f3af4e8b..b23c7a8f 100644 --- a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol +++ b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Libraries import {OrderStructs} from "../../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol index 02ab8737..0e6abd61 100644 --- a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol +++ b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; /** * @title MerkleProofMemory diff --git a/contracts/tasks/deploy-marketplace.ts b/contracts/tasks/deploy-marketplace.ts new file mode 100644 index 00000000..a1118508 --- /dev/null +++ b/contracts/tasks/deploy-marketplace.ts @@ -0,0 +1,457 @@ +import { task } from "hardhat/config"; +import { solidityPacked } from "ethers"; +import { getContractAddress, slice, encodeDeployData, getContract, WalletClient, encodePacked } from "viem"; +import { writeFile } from "node:fs/promises"; +import creatorFeeManagerContract from "../out/CreatorFeeManagerWithRoyalties.sol/CreatorFeeManagerWithRoyalties.json"; +import exchangeContract from "../out/LooksRareProtocol.sol/LooksRareProtocol.json"; +import transferManagerContract from "../out/TransferManager.sol/TransferManager.json"; +import orderValidatorContract from "../out/OrderValidatorV2A.sol/OrderValidatorV2A.json"; +import strategyCollectionOfferContract from "../out/StrategyCollectionOffer.sol/StrategyCollectionOffer.json"; +import protocolFeeRecipientContract from "../out/ProtocolFeeRecipient.sol/ProtocolFeeRecipient.json"; + +const getCreate2Address = async ( + deployer: WalletClient, + factory: `0x${string}`, + bytecode: `0x${string}`, + salt: `0x${string}`, +) => { + if (!deployer.account?.address) { + throw new Error("Deployer account is undefined"); + } + + const address = getContractAddress({ + from: factory, + salt, + opcode: "CREATE2", + bytecode, + }); + return { address, salt, deployData: bytecode }; +}; + +task("deploy-marketplace", "Deploy marketplace contracts and verify") + .addOptionalParam("output", "write the details of the deployment to this file if this is set") + .setAction(async ({ output }, hre) => { + //TODO multichain support + const { ethers, network, run, viem } = hre; + const owner = "0xdf2C3dacE6F31e650FD03B8Ff72beE82Cb1C199A"; + const create2Address = "0x0000000000ffe8b47b3e2130213b802212439497"; + const wethAddress = "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6"; + + const publicClient = await viem.getPublicClient(); + const [deployer] = await viem.getWalletClients(); + const create2Instance = await viem.getContractAt("IImmutableCreate2Factory", create2Address, { + walletClient: deployer, + }); + + console.log("Deployer: ", deployer.account.address); + + const _standardProtocolFeeBP = 50; + const _minTotalFeeBp = 50; + const _maxProtocolFeeBp = 200; + + const releaseCounter = "g"; + + const salt = slice( + encodePacked(["address", "string", "address"], [deployer.account?.address, releaseCounter, create2Address]), + 0, + 32, + ); + console.log("Calculated salt: ", salt); + + // Create2 Transfermanager + const transferManagerArgs = [deployer.account.address]; + const transferManagerCreate2 = await getCreate2Address( + deployer, + create2Address, + encodeDeployData({ + abi: transferManagerContract.abi, + bytecode: transferManagerContract.bytecode.object as `0x${string}`, + args: transferManagerArgs, + }), + salt, + ); + + // read findCreate2Address from IImmutableCreate2Factory + const findCreate2Address = await create2Instance.read.findCreate2Address([ + salt, + encodeDeployData({ + abi: transferManagerContract.abi, + bytecode: transferManagerContract.bytecode.object as `0x${string}`, + args: transferManagerArgs, + }), + ]); + + console.log(`Comparing calculated address: ${transferManagerCreate2.address} with ${findCreate2Address}`); + + // Create2 ProtocolFeeRecipient + const protocolFeeRecipientArgs = [deployer.account.address, wethAddress]; + const protocolFeeRecipientCreate2 = await getCreate2Address( + deployer, + create2Address, + encodeDeployData({ + abi: protocolFeeRecipientContract.abi, + bytecode: protocolFeeRecipientContract.bytecode.object as `0x${string}`, + args: protocolFeeRecipientArgs, + }), + salt, + ); + + // Create2 HypercertsExchange + const hypercertsExchangeArgs = [ + deployer.account.address, + protocolFeeRecipientCreate2.address, + transferManagerCreate2.address, + wethAddress, + ]; + + const hypercertsExchangeCreate2 = await getCreate2Address( + deployer, + create2Address, + encodeDeployData({ + abi: exchangeContract.abi, + bytecode: exchangeContract.bytecode.object as `0x${string}`, + args: hypercertsExchangeArgs, + }), + salt, + ); + + const orderValidatorArgs = [hypercertsExchangeCreate2.address]; + + const strategyCollectionOfferCreate2 = await getCreate2Address( + deployer, + create2Address, + encodeDeployData({ + abi: strategyCollectionOfferContract.abi, + bytecode: strategyCollectionOfferContract.bytecode.object as `0x${string}`, + args: [], + }), + salt, + ); + + console.log("Calculated exchange address using CREATE2: ", hypercertsExchangeCreate2.address); + console.log("Calculated transferManager address using CREATE2: ", transferManagerCreate2.address); + console.log("Calculated protocolFeeRecipient address using CREATE2: ", protocolFeeRecipientCreate2.address); + console.log("Calculated strategyCollectionOffer address using CREATE2: ", strategyCollectionOfferCreate2.address); + + // Deploy transferManager + console.log("Deploying TransferManager..."); + const transferManagerCreation = await create2Instance.write.safeCreate2([salt, transferManagerCreate2.deployData]); + const transferManagerTx = await publicClient.waitForTransactionReceipt({ + hash: transferManagerCreation, + }); + + console.log( + transferManagerTx.status === "success" + ? "Deployed TransferManager successfully" + : "Failed to deploy TransferManager", + ); + + // // Transfer 1 wei to hypercertsExchange + await deployer.sendTransaction({ + to: hypercertsExchangeCreate2.address, + value: 1n, + }); + + // Deploy ProtocolFeeRecipient + console.log("Deploying ProtocolFeeRecipient..."); + const protocolFeeRecipientCreation = await create2Instance.write.safeCreate2([ + salt, + protocolFeeRecipientCreate2.deployData, + ]); + + const protocolFeeRecipientTx = await publicClient.waitForTransactionReceipt({ + hash: protocolFeeRecipientCreation, + }); + + console.log( + protocolFeeRecipientTx.status === "success" + ? "Deployed ProtocolFeeRecipient successfully" + : "Failed to deploy ProtocolFeeRecipient", + ); + + // Deploy HypercertsExchange + console.log("Deploying HypercertsExchange..."); + const hypercertsExchange = await create2Instance.write.safeCreate2([salt, hypercertsExchangeCreate2.deployData]); + const hypercertsExchangeTx = await publicClient.waitForTransactionReceipt({ + hash: hypercertsExchange, + }); + + console.log( + hypercertsExchangeTx.status === "success" + ? "Deployed HypercertsExchange successfully" + : "Failed to deploy HypercertsExchange", + ); + + // Parse logs to get the address of the deployed HypercertsExchange + console.log("Deploying HypercertsExchange... done!"); + + // Allow Exchange as operator on transferManager + const transferManagerInstance = getContract({ + address: transferManagerCreate2.address, + abi: transferManagerContract.abi, + publicClient, + walletClient: deployer, + }); + + // Deploy CreatorFeeManager + const deployCreatorFeeManager = await deployer.deployContract({ + abi: creatorFeeManagerContract.abi, + account: deployer.account, + args: ["0x12405dB79325D06a973aD913D6e9BdA1343cD526"], + bytecode: creatorFeeManagerContract.bytecode.object as `0x${string}`, + }); + + const creatorFeeManagerTx = await publicClient.waitForTransactionReceipt({ + hash: deployCreatorFeeManager, + }); + + console.log( + creatorFeeManagerTx.status === "success" + ? "Deployed CreatorFeeManager successfully" + : "Failed to deploy CreatorFeeManager", + ); + + await transferManagerInstance.write.allowOperator([hypercertsExchangeCreate2.address]); + + const hypercertsExchangeInstance = getContract({ + address: hypercertsExchangeCreate2.address, + abi: exchangeContract.abi, + publicClient, + walletClient: deployer, + }); + + // read transferManager from HypercertsExchange + const transferManager = await hypercertsExchangeInstance.read.transferManager(); + console.log("TransferManager address: ", transferManager); + + // read deriveProtocolParams from HypercertsExchange + // + // domainSeparator = looksRareProtocol.domainSeparator(); + // creatorFeeManager = looksRareProtocol.creatorFeeManager(); + // maxCreatorFeeBp = looksRareProtocol.maxCreatorFeeBp(); + + const domainSeparator = await hypercertsExchangeInstance.read.domainSeparator(); + console.log("domainSeparator: ", domainSeparator); + + const creatorFeeManager = await hypercertsExchangeInstance.read.creatorFeeManager(); + console.log("creatorFeeManager: ", creatorFeeManager); + + const maxCreatorFeeBp = await hypercertsExchangeInstance.read.maxCreatorFeeBp(); + console.log("maxCreatorFeeBp: ", maxCreatorFeeBp); + + // Update currencyStatus address(0) to true + const updateCurrencyStatusEth = await hypercertsExchangeInstance.write.updateCurrencyStatus([ + "0x0000000000000000000000000000000000000000", + true, + ]); + const updateCurrencyStatusEthTx = await publicClient.waitForTransactionReceipt({ + hash: updateCurrencyStatusEth, + }); + + // Update currencyStatus address(weth) to true + const updateCurrencyStatusTxWeth = await hypercertsExchangeInstance.write.updateCurrencyStatus([wethAddress, true]); + const updateCurrencyStatusTxWethTx = await publicClient.waitForTransactionReceipt({ + hash: updateCurrencyStatusTxWeth, + }); + + // Update creatorFeeManager address + const updateCreatorFeeManager = await hypercertsExchangeInstance.write.updateCreatorFeeManager([ + creatorFeeManagerTx.contractAddress, + ]); + + const updateCreatorFeeManagerTx = await publicClient.waitForTransactionReceipt({ + hash: updateCreatorFeeManager, + }); + + console.log( + updateCreatorFeeManagerTx.status === "success" + ? "Updated creatorFeeManager successfully" + : "Failed to update creatorFeeManager", + ); + + console.log( + updateCurrencyStatusEthTx.status === "success" + ? "Updated currency status for ETH successfully" + : "Failed to update currency status for ETH", + ); + + console.log( + updateCurrencyStatusTxWethTx.status === "success" + ? "Updated currency status for WETH successfully" + : "Failed to update currency status for WETH", + ); + + // Deploy OrderValidator + + const deployOrderValidator = await deployer.deployContract({ + abi: orderValidatorContract.abi, + account: deployer.account, + args: orderValidatorArgs, + bytecode: orderValidatorContract.bytecode.object as `0x${string}`, + }); + + const orderValidatorTx = await publicClient.waitForTransactionReceipt({ + hash: deployOrderValidator, + }); + + console.log( + orderValidatorTx.status === "success" + ? "Deployed OrderValidator successfully" + : "Failed to deploy OrderValidator", + ); + + // Deploy strategyCollectionOffer + + const deployStrategyCollectionOffer = await deployer.deployContract({ + abi: strategyCollectionOfferContract.abi, + account: deployer.account, + args: [], + bytecode: strategyCollectionOfferContract.bytecode.object as `0x${string}`, + }); + + const strategyCollectionOfferTx = await publicClient.waitForTransactionReceipt({ + hash: deployStrategyCollectionOffer, + }); + + console.log( + strategyCollectionOfferTx.status === "success" + ? "Deployed StrategyCollectionOffer successfully" + : "Failed to deploy StrategyCollectionOffer", + ); + + // Add executeCollectionStrategyWithTakerAsk strategy to HypercertsExchange + + const strategyCollectionOfferFactory = await ethers.getContractFactory("StrategyCollectionOffer"); + + const addStratTakerAsk = await hypercertsExchangeInstance.write.addStrategy([ + _standardProtocolFeeBP, + _minTotalFeeBp, + _maxProtocolFeeBp, + strategyCollectionOfferFactory.interface.getFunction("executeCollectionStrategyWithTakerAsk")?.selector, + true, + strategyCollectionOfferTx.contractAddress, + ]); + + console.log("Adding strategy CollectionWithTakerAsk to exchange..."); + const addStratTakerAskTx = await publicClient.waitForTransactionReceipt({ + hash: addStratTakerAsk, + }); + + console.log( + addStratTakerAskTx.status === "success" + ? "Added strategy executeCollectionStrategyWithTakerAsk to exchange successfully" + : "Failed to add strategy executeCollectionStrategyWithTakerAsk to exchange", + ); + + const addStratTakerAskProof = await hypercertsExchangeInstance.write.addStrategy([ + _standardProtocolFeeBP, + _minTotalFeeBp, + _maxProtocolFeeBp, + strategyCollectionOfferFactory.interface.getFunction("executeCollectionStrategyWithTakerAskWithProof")?.selector, + true, + strategyCollectionOfferTx.contractAddress, + ]); + + console.log("Adding strategy CollectionWithTakerAskWithProof to exchange..."); + const addStratTakerAskProofTx = await publicClient.waitForTransactionReceipt({ + hash: addStratTakerAskProof, + }); + + console.log( + addStratTakerAskProofTx.status === "success" + ? "Added strategy executeCollectionStrategyWithTakerAskWithProof to exchange successfully" + : "Failed to add strategy executeCollectionStrategyWithTakerAskWithProof to exchange", + ); + + console.log("🚀 Done!"); + + interface ContractDeployment { + address: string; + abi: any; + fullNamespace: string; + args: string[]; + encodedArgs: string; + tx: `0x${string}`; + } + + type ContractDeployments = { + [name: string]: ContractDeployment; + }; + + const contracts: ContractDeployments = { + HypercertsExchange: { + address: hypercertsExchangeCreate2.address, + abi: exchangeContract.abi, + fullNamespace: "LooksRareProtocol", + args: hypercertsExchangeArgs, + encodedArgs: solidityPacked(["address", "address", "address", "address"], hypercertsExchangeArgs), + tx: hypercertsExchangeTx.transactionHash, + }, + ProtocolFeeRecipient: { + address: protocolFeeRecipientCreate2.address, + abi: protocolFeeRecipientContract.abi, + fullNamespace: "ProtocolFeeRecipient", + args: [deployer.account.address, wethAddress], + encodedArgs: solidityPacked(["address", "address"], [deployer.account.address, wethAddress]), + tx: protocolFeeRecipientTx.transactionHash, + }, + TransferManager: { + address: transferManagerCreate2.address, + abi: transferManagerContract.abi, + fullNamespace: "TransferManager", + args: transferManagerArgs, + encodedArgs: solidityPacked(["address"], transferManagerArgs), + tx: transferManagerTx.transactionHash, + }, + OrderValidator: { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + address: orderValidatorTx.contractAddress!, + abi: orderValidatorContract.abi, + fullNamespace: "OrderValidatorV2A", + args: orderValidatorArgs, + encodedArgs: solidityPacked(["address"], orderValidatorArgs), + tx: orderValidatorTx.transactionHash, + }, + StrategyCollectionOffer: { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + address: strategyCollectionOfferTx.contractAddress!, + abi: strategyCollectionOfferContract.abi, + fullNamespace: "StrategyCollectionOffer", + args: [], + encodedArgs: solidityPacked([], []), + tx: strategyCollectionOfferTx.transactionHash, + }, + }; + + if (network.name !== "hardhat" && network.name !== "localhost") { + await writeFile( + `src/deployments/deployment-marketplace-${network.name}.json`, + JSON.stringify(contracts), + "utf-8", + ); + + // Verify contracts + for (const [name, { address, tx }] of Object.entries(contracts)) { + try { + const code = await publicClient.getBytecode({ address: address as `0x${string}` }); + if (code === "0x") { + console.log(`${name} contract deployment has not completed. waiting to verify...`); + await publicClient.waitForTransactionReceipt({ + hash: tx, + }); + } + await run("verify:verify", { + address, + constructorArguments: contracts[name].args, + }); + } catch (error) { + const errorMessage = (error as Error).message; + + if (errorMessage.includes("Reason: Already Verified")) { + console.log("Reason: Already Verified"); + } + console.error(errorMessage); + } + } + } + }); diff --git a/contracts/tasks/index.ts b/contracts/tasks/index.ts index a60a09ad..71c1f98d 100644 --- a/contracts/tasks/index.ts +++ b/contracts/tasks/index.ts @@ -8,3 +8,4 @@ export * from "./test-tx-client"; export * from "./upgrade"; export * from "./unpause"; export * from "./validate-upgrade"; +export * from "./deploy-marketplace"; diff --git a/docs/docs/developer/api/contracts/forge-std/src/console.md b/docs/docs/developer/api/contracts/forge-std/src/console.md new file mode 100644 index 00000000..8d14ad8c --- /dev/null +++ b/docs/docs/developer/api/contracts/forge-std/src/console.md @@ -0,0 +1 @@ +# console diff --git a/docs/docs/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/docs/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md index 86e79020..393cb24b 100644 --- a/docs/docs/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md +++ b/docs/docs/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md @@ -2,6 +2,25 @@ ## Methods +### findCreate2Address + +```solidity +function findCreate2Address(bytes32 salt, bytes initializationCode) external view returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | + ### safeCreate2 ```solidity diff --git a/frontend/.env.local.example b/frontend/.env.local.example index 5156ec11..d6275350 100644 --- a/frontend/.env.local.example +++ b/frontend/.env.local.example @@ -7,8 +7,6 @@ NEXT_PUBLIC_DOMAIN=testnet.hypercerts.org ####### ## Web3 ####### -### 5=Goerli, 10=Optimism -NEXT_PUBLIC_DEFAULT_CHAIN_ID=5 ### UUPS proxy contract address NEXT_PUBLIC_CONTRACT_ADDRESS=0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07 ### Subgraph URL - currently using hosted service diff --git a/frontend/components/config.tsx b/frontend/components/config.tsx index 3d3a150b..d2cdf24b 100644 --- a/frontend/components/config.tsx +++ b/frontend/components/config.tsx @@ -20,7 +20,7 @@ export interface ConfigProps { export function Config(props: ConfigProps) { const { className, children } = props; const { client: hypercertClient } = useHypercertClient(); - const chainId = hypercertClient.config.chain?.id + const chainId = hypercertClient?.config.chain?.id ? Number(hypercertClient.config.chain.id) : undefined; diff --git a/frontend/components/hypercert-fetcher.tsx b/frontend/components/hypercert-fetcher.tsx index db0c5f3f..e826df7f 100644 --- a/frontend/components/hypercert-fetcher.tsx +++ b/frontend/components/hypercert-fetcher.tsx @@ -45,6 +45,9 @@ export function HypercertFetcher(props: HypercertFetcherProps) { const { client } = useHypercertClient(); React.useEffect(() => { + if (!client) { + return; + } spawn( (async () => { const hashQueryString = window.location.hash.slice( @@ -70,13 +73,13 @@ export function HypercertFetcher(props: HypercertFetcherProps) { overrideMetadataUri: useQueryString && byMetadataUri !== undefined, }); console.log( - `Hypercert name='${hypercert.name}' claimId=${claimId}, metadataUri=${hypercert.metadataUri}: `, + `Hypercert name='${hypercert.name}' claimId=${claimId}, qClaimId=${qClaimId} byClaimId=${byClaimId} metadataUri=${hypercert.metadataUri}: `, hypercert, ); setData(hypercert); })(), ); - }, [useQueryString, byClaimId, byMetadataUri]); + }, [useQueryString, byClaimId, byMetadataUri, client]); // Show when loading if (!client && !ignoreLoading && !!loading && !data) { diff --git a/frontend/hooks/burnFraction.ts b/frontend/hooks/burnFraction.ts index 3bff9e33..277d0632 100644 --- a/frontend/hooks/burnFraction.ts +++ b/frontend/hooks/burnFraction.ts @@ -13,7 +13,6 @@ export const useBurnFraction = ({ const [txPending, setTxPending] = useState(false); const { client, isLoading } = useHypercertClient(); - const publicClient = client.config.publicClient; const stepDescriptions = { preparing: "Preparing to burn fraction", @@ -32,8 +31,16 @@ export const useBurnFraction = ({ setStep("burning"); + if (!client) { + toast("No client found", { + type: "error", + }); + return; + } + const hash = await client.burnClaimFraction(claimId); + const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, hash: hash, diff --git a/frontend/hooks/claims.ts b/frontend/hooks/claims.ts deleted file mode 100644 index fd57ad34..00000000 --- a/frontend/hooks/claims.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { QueryParams } from "@hypercerts-org/sdk"; -import { useQuery } from "@tanstack/react-query"; -import { useHypercertClient } from "./hypercerts-client"; - -export const useClaimMetadata = (cid?: string | null) => { - const { - client: { storage }, - } = useHypercertClient(); - return useQuery( - ["ipfs", "claim", "metadata", cid], - () => (cid ? storage.getMetadata(cid) : null), - { enabled: !!cid, refetchInterval: 10000 }, - ); -}; - -export const useListFirstClaims = (params?: QueryParams) => { - const { - client: { indexer }, - } = useHypercertClient(); - return useQuery(["firstClaims"], () => indexer.firstClaims(params), { - refetchInterval: 10000, - }); -}; diff --git a/frontend/hooks/fractions.ts b/frontend/hooks/fractions.ts index 896bc8ca..66b20dde 100644 --- a/frontend/hooks/fractions.ts +++ b/frontend/hooks/fractions.ts @@ -2,37 +2,40 @@ import { useHypercertClient } from "./hypercerts-client"; import { useQuery } from "@tanstack/react-query"; export const useFractionsByOwner = (owner: string) => { - const { - client: { indexer }, - } = useHypercertClient(); + const { client } = useHypercertClient(); return useQuery( ["graph", "fractions", "owner", owner], - () => indexer.fractionsByOwner(owner), + () => { + if (!client) return null; + return client.indexer.fractionsByOwner(owner); + }, { enabled: !!owner, refetchInterval: 5000 }, ); }; export const useFractionsByClaim = (claimId: string) => { - const { - client: { indexer }, - } = useHypercertClient(); + const { client } = useHypercertClient(); return useQuery( ["graph", "fractions", "claim", claimId], - () => indexer.fractionsByClaim(claimId), + () => { + if (!client) return null; + return client.indexer.fractionsByClaim(claimId); + }, { enabled: !!claimId, refetchInterval: 5000 }, ); }; export const useFractionById = (fractionId: string) => { - const { - client: { indexer }, - } = useHypercertClient(); + const { client } = useHypercertClient(); return useQuery( ["graph", "fractions", fractionId], - () => indexer.fractionById(fractionId), + () => { + if (!client) return null; + return client.indexer.fractionById(fractionId); + }, { enabled: !!fractionId }, ); }; diff --git a/frontend/hooks/hypercerts-client.ts b/frontend/hooks/hypercerts-client.ts index e26c39ae..727b6747 100644 --- a/frontend/hooks/hypercerts-client.ts +++ b/frontend/hooks/hypercerts-client.ts @@ -1,25 +1,22 @@ import React, { useEffect } from "react"; -import { - NFT_STORAGE_TOKEN, - WEB3_STORAGE_TOKEN, - NEXT_PUBLIC_DEFAULT_CHAIN_ID, -} from "../lib/config"; +import { NFT_STORAGE_TOKEN, WEB3_STORAGE_TOKEN } from "../lib/config"; import { HypercertClient, HypercertClientConfig } from "@hypercerts-org/sdk"; import { useWalletClient, useNetwork } from "wagmi"; -const clientConfig: Partial = { - chain: { id: Number(NEXT_PUBLIC_DEFAULT_CHAIN_ID) }, - nftStorageToken: NFT_STORAGE_TOKEN, - web3StorageToken: WEB3_STORAGE_TOKEN, -}; - -const defaultClient = new HypercertClient(clientConfig); - export const useHypercertClient = () => { const { chain } = useNetwork(); - - const [client, setClient] = React.useState(defaultClient); + const clientConfig = { + chain, + nftStorageToken: NFT_STORAGE_TOKEN, + web3StorageToken: WEB3_STORAGE_TOKEN, + }; + const [client, setClient] = React.useState(() => { + if (clientConfig.chain?.id) { + return new HypercertClient(clientConfig); + } + return null; + }); const [isLoading, setIsLoading] = React.useState(false); const { diff --git a/frontend/hooks/mergeFractionUnits.ts b/frontend/hooks/mergeFractionUnits.ts index 1422845d..2a1e131b 100644 --- a/frontend/hooks/mergeFractionUnits.ts +++ b/frontend/hooks/mergeFractionUnits.ts @@ -13,7 +13,6 @@ export const useMergeFractionUnits = ({ const [txPending, setTxPending] = useState(false); const { client, isLoading } = useHypercertClient(); - const publicClient = client.config.publicClient; const stepDescriptions = { preparing: "Preparing to merge fraction values", @@ -30,8 +29,16 @@ export const useMergeFractionUnits = ({ try { setTxPending(true); + if (!client) { + toast("No client found", { + type: "error", + }); + return; + } + const hash = await client.mergeFractionUnits(ids); + const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, hash: hash, diff --git a/frontend/hooks/mintClaim.ts b/frontend/hooks/mintClaim.ts index 66ef74aa..75cbbf8c 100644 --- a/frontend/hooks/mintClaim.ts +++ b/frontend/hooks/mintClaim.ts @@ -10,7 +10,6 @@ export const useMintClaim = ({ onComplete }: { onComplete?: () => void }) => { const [txPending, setTxPending] = useState(false); const { client, isLoading } = useHypercertClient(); - const publicClient = client.config.publicClient; const stepDescriptions = { preparing: "Preparing to mint hypercert", @@ -31,16 +30,24 @@ export const useMintClaim = ({ onComplete }: { onComplete?: () => void }) => { try { setTxPending(true); + if (!client) { + toast("No client found", { + type: "error", + }); + return; + } + const hash = await client.mintClaim( metaData, BigInt(units), transferRestrictions, ); - const receipt = await publicClient?.waitForTransactionReceipt({ - confirmations: 3, - hash: hash, - }); + const receipt = + await client.config.publicClient?.waitForTransactionReceipt({ + confirmations: 3, + hash: hash, + }); setStep("waiting"); diff --git a/frontend/hooks/mintClaimAllowlist.ts b/frontend/hooks/mintClaimAllowlist.ts index a78a0429..6d8343e7 100644 --- a/frontend/hooks/mintClaimAllowlist.ts +++ b/frontend/hooks/mintClaimAllowlist.ts @@ -23,7 +23,6 @@ export const useMintClaimAllowlist = ({ const [txPending, setTxPending] = useState(false); const { client, isLoading } = useHypercertClient(); - const publicClient = client.config.publicClient; const stepDescriptions = { validateAllowlist: "Validating allowlist", @@ -89,6 +88,13 @@ export const useMintClaimAllowlist = ({ ) => { setStep("validateAllowlist"); + if (!client) { + toast("No client found", { + type: "error", + }); + return; + } + let _totalSupply; let _allowlist: AllowlistEntry[]; @@ -130,6 +136,7 @@ export const useMintClaimAllowlist = ({ transferRestrictions, ); + const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, hash: hash, diff --git a/frontend/hooks/mintFractionAllowlist.ts b/frontend/hooks/mintFractionAllowlist.ts index 822cba42..f02a6980 100644 --- a/frontend/hooks/mintFractionAllowlist.ts +++ b/frontend/hooks/mintFractionAllowlist.ts @@ -15,7 +15,6 @@ export const useMintFractionAllowlist = ({ const [txPending, setTxPending] = useState(false); const { client, isLoading } = useHypercertClient(); - const publicClient = client.config.publicClient; const { setStep, showModal, hideModal } = useContractModal(); @@ -37,12 +36,20 @@ export const useMintFractionAllowlist = ({ try { setTxPending(true); + if (!client) { + toast("No client found", { + type: "error", + }); + return; + } + const hash = await client.mintClaimFractionFromAllowlist( claimID, units, proof, ); + const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, hash: hash, diff --git a/frontend/hooks/mintFractionAllowlistBatch.ts b/frontend/hooks/mintFractionAllowlistBatch.ts index 97c5b6f3..0b31564b 100644 --- a/frontend/hooks/mintFractionAllowlistBatch.ts +++ b/frontend/hooks/mintFractionAllowlistBatch.ts @@ -27,8 +27,6 @@ export const useMintFractionAllowlistBatch = ({ const { data: claimIds } = useGetAllEligibility(address ?? "", chain?.id); const parseError = useParseBlockchainError(); - const publicClient = client.config.publicClient; - const stepDescriptions = { initial: "Initializing interaction", proofs: "Getting and verifying proofs", @@ -38,6 +36,9 @@ export const useMintFractionAllowlistBatch = ({ }; const initializeWrite = async () => { + if (!client) { + throw new Error("No client found"); + } if (!address) { throw new Error("No address found for current user"); } @@ -79,6 +80,7 @@ export const useMintFractionAllowlistBatch = ({ proofs, ); + const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, hash: hash, diff --git a/frontend/hooks/splitClaimUnits.ts b/frontend/hooks/splitClaimUnits.ts index 2d4dd11d..e1688969 100644 --- a/frontend/hooks/splitClaimUnits.ts +++ b/frontend/hooks/splitClaimUnits.ts @@ -23,9 +23,13 @@ export const useSplitFractionUnits = ({ const { setStep, showModal, hideModal } = useContractModal(); const parseError = useParseBlockchainError(); - const publicClient = client.config.publicClient; - const initializeWrite = async (fractionId: bigint, fractions: bigint[]) => { + if (!client) { + toast("No client found", { + type: "error", + }); + return; + } showModal({ stepDescriptions }); setStep("splitting"); try { @@ -34,6 +38,7 @@ export const useSplitFractionUnits = ({ const hash = await client.splitFractionUnits(fractionId, fractions); setStep("waiting"); + const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, hash: hash, diff --git a/frontend/hooks/verifyFractionClaim.ts b/frontend/hooks/verifyFractionClaim.ts index 14fbb5c1..bf366e9f 100644 --- a/frontend/hooks/verifyFractionClaim.ts +++ b/frontend/hooks/verifyFractionClaim.ts @@ -8,18 +8,19 @@ export type ClaimProof = { }; export const useVerifyFractionClaim = () => { - const { - client: { indexer, storage }, - } = useHypercertClient(); + const { client } = useHypercertClient(); const verifyFractionClaim = async (claimId: string, address: string) => { - const claimByIdRes = await indexer.claimById(claimId); + if (!client) { + throw new Error("No client found"); + } + const claimByIdRes = await client.indexer.claimById(claimId); if (!claimByIdRes?.claim) { throw new Error("No claim found for ${claimID}"); } const { uri, tokenID: _id } = claimByIdRes.claim; - const metadata = await storage.getMetadata(uri || ""); + const metadata = await client.storage.getMetadata(uri || ""); if (!metadata?.allowList) { throw new Error(`No allowlist found for ${claimId}`); @@ -27,7 +28,7 @@ export const useVerifyFractionClaim = () => { // TODO: this should be retrieved with `getData`, but it fails on res.files() // Need to investigate further - const treeResponse = await storage.getData(metadata.allowList); + const treeResponse = await client.storage.getData(metadata.allowList); if (!treeResponse) { throw new Error("Could not fetch json tree dump for allowlist"); diff --git a/frontend/lib/config.ts b/frontend/lib/config.ts index 6ebe8eed..f412dd0f 100644 --- a/frontend/lib/config.ts +++ b/frontend/lib/config.ts @@ -12,11 +12,6 @@ export const DOMAIN = requireEnv( export const isProduction = DOMAIN === "hypercerts.org"; -export const NEXT_PUBLIC_DEFAULT_CHAIN_ID = requireEnv( - process.env.NEXT_PUBLIC_DEFAULT_CHAIN_ID, - "NEXT_PUBLIC_DEFAULT_CHAIN_ID", -); - export const NFT_STORAGE_TOKEN = requireEnv( process.env.NEXT_PUBLIC_NFT_STORAGE_TOKEN, "NEXT_PUBLIC_NFT_STORAGE_TOKEN", diff --git a/frontend/lib/hypercert.ts b/frontend/lib/hypercert.ts index 0f2be7da..379d7837 100644 --- a/frontend/lib/hypercert.ts +++ b/frontend/lib/hypercert.ts @@ -27,6 +27,7 @@ export async function loadHypercert( client: HypercertClient, options: LoadOptions, ): Promise { + console.log("Options: ", options); if (options.claimId) { const claimQueryResp = await client.indexer.claimById(options.claimId); const claimTokensQueryResp = await client.indexer.fractionsByClaim( diff --git a/frontend/package.json b/frontend/package.json index 6a4d0d9e..93ceffe5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,9 +23,9 @@ "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@graphprotocol/client-cli": "^2.2.16", - "@hypercerts-org/contracts": "0.9.0", + "@hypercerts-org/contracts": "1.0.0-alpha.2", "@hypercerts-org/observabletreemap": "workspace: *", - "@hypercerts-org/sdk": "1.0.0-alpha.9", + "@hypercerts-org/sdk": "1.0.0-alpha.10", "@mui/icons-material": "^5.11.9", "@mui/material": "^5.11.2", "@mui/x-date-pickers": "^5.0.12", @@ -66,7 +66,7 @@ "react-toastify": "^9.1.1", "react-use": "^17.4.0", "serve": "^14.0.1", - "viem": "1.18.4", + "viem": "1.18.9", "wagmi": "1.4.5", "yup": "^0.32.11" }, diff --git a/package.json b/package.json index 1b3f07e3..f6e15919 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "hypercerts", "description": "Scalable retrospective reward systems for impact", - "version": "0.0.0", + "version": "1.0.0-alpha.0", "author": "Hypercerts Foundation", "license": "Apache-2.0", "private": true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e1fb229..c5797c44 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,12 +48,24 @@ importers: '@looksrare/contracts-libs': specifier: ^3.4.0 version: 3.4.0 + '@nomicfoundation/hardhat-chai-matchers': + specifier: ^2.0.2 + version: 2.0.2(@nomicfoundation/hardhat-ethers@3.0.4)(chai@4.3.10)(ethers@6.8.0)(hardhat@2.18.3) + '@nomicfoundation/hardhat-ethers': + specifier: ^3.0.4 + version: 3.0.4(ethers@6.8.0)(hardhat@2.18.3) '@nomicfoundation/hardhat-toolbox': specifier: ^3.0.0 version: 3.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.2)(@nomicfoundation/hardhat-ethers@3.0.4)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomicfoundation/hardhat-verify@1.1.1)(@typechain/ethers-v6@0.4.3)(@typechain/hardhat@8.0.3)(@types/chai@4.3.9)(@types/mocha@9.1.0)(@types/node@18.18.7)(chai@4.3.10)(ethers@6.8.0)(hardhat-gas-reporter@1.0.9)(hardhat@2.18.3)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.2)(typescript@4.9.5) + '@nomicfoundation/hardhat-viem': + specifier: ^1.0.0 + version: 1.0.0(hardhat@2.18.3)(typescript@4.9.5)(viem@1.18.9) '@openzeppelin/contracts': - specifier: <5.0.0 + specifier: ^4.9.3 version: 4.9.3 + '@openzeppelin/defender-sdk': + specifier: ^1.4.0 + version: 1.4.0(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@ethersproject/hash@5.7.0)(@ethersproject/providers@5.7.2)(@ethersproject/transactions@5.7.0)(web3-core-helpers@1.10.3)(web3-core@1.10.3)(web3-utils@1.10.3)(web3@1.10.3) '@openzeppelin/hardhat-upgrades': specifier: 2.3.3 version: 2.3.3(@nomicfoundation/hardhat-ethers@3.0.4)(@nomicfoundation/hardhat-verify@1.1.1)(ethers@6.8.0)(hardhat@2.18.3) @@ -159,6 +171,12 @@ importers: typescript: specifier: ^4.9.4 version: 4.9.5 + viem: + specifier: ^1.18.9 + version: 1.18.9(typescript@4.9.5) + xdeployer: + specifier: ^2.1.13 + version: 2.1.13(@nomicfoundation/hardhat-ethers@3.0.4)(ethers@6.8.0)(hardhat@2.18.3) cors-proxy: devDependencies: @@ -295,7 +313,7 @@ importers: version: 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@celo/rainbowkit-celo': specifier: ^1.1.0 - version: 1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(wagmi@1.4.5)(zod@3.22.4) + version: 1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(wagmi@1.4.5)(zod@3.22.4) '@emotion/react': specifier: ^11.10.5 version: 11.11.1(@types/react@18.2.33)(react@18.2.0) @@ -306,14 +324,14 @@ importers: specifier: ^2.2.16 version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': - specifier: 0.9.0 - version: 0.9.0(typescript@5.1.6) + specifier: 1.0.0-alpha.2 + version: 1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6) '@hypercerts-org/observabletreemap': specifier: 'workspace: *' version: link:../vendor/observabletreemap '@hypercerts-org/sdk': - specifier: 1.0.0-alpha.9 - version: 1.0.0-alpha.9(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4) + specifier: 1.0.0-alpha.10 + version: 1.0.0-alpha.10(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4) '@mui/icons-material': specifier: ^5.11.9 version: 5.14.15(@mui/material@5.14.15)(@types/react@18.2.33)(react@18.2.0) @@ -340,7 +358,7 @@ importers: version: 1.0.333(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) '@rainbow-me/rainbowkit': specifier: 1.2.0 - version: 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.4)(wagmi@1.4.5) + version: 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.9)(wagmi@1.4.5) '@sentry/nextjs': specifier: ^7.73.0 version: 7.75.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0) @@ -435,11 +453,11 @@ importers: specifier: ^14.0.1 version: 14.2.1 viem: - specifier: 1.18.4 - version: 1.18.4(typescript@5.1.6)(zod@3.22.4) + specifier: 1.18.9 + version: 1.18.9(typescript@5.1.6)(zod@3.22.4) wagmi: specifier: 1.4.5 - version: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) + version: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) yup: specifier: ^0.32.11 version: 0.32.11 @@ -526,20 +544,20 @@ importers: specifier: ^5.7.0 version: 5.7.0 '@graphprotocol/client-add-source-name': - specifier: ^1.0.16 - version: 1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + specifier: ^2.0.0 + version: 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) '@graphprotocol/client-polling-live': specifier: ^2.0.0 version: 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) '@graphql-mesh/cache-localforage': - specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + specifier: ^0.96.0 + version: 0.96.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/cross-helpers': specifier: ^0.4.1 version: 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/graphql': - specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) + specifier: ^0.96.0 + version: 0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': specifier: ^0.96.13 version: 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) @@ -562,8 +580,8 @@ importers: specifier: ^3.2.0 version: 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': - specifier: 0.8.11 - version: 0.8.11 + specifier: 1.0.0-alpha.2 + version: 1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6) '@openzeppelin/merkle-tree': specifier: ^1.0.5 version: 1.0.5 @@ -618,7 +636,7 @@ importers: version: 8.2.0 '@graphprotocol/client-cli': specifier: ^3.0.0 - version: 3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + version: 3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@jest/globals': specifier: ^29.7.0 version: 29.7.0 @@ -803,7 +821,6 @@ packages: /@adraffy/ens-normalize@1.9.4: resolution: {integrity: sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw==} - dev: false /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} @@ -2598,7 +2615,7 @@ packages: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} dev: false - /@celo/rainbowkit-celo@1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(wagmi@1.4.5)(zod@3.22.4): + /@celo/rainbowkit-celo@1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(wagmi@1.4.5)(zod@3.22.4): resolution: {integrity: sha512-/G4HFhJNwUk6uU1yqGfQ/LIoNg9UAA4BUcEvFdd0M3DImnKlhodNLUdCmzqv96sjc/I7tMJqBeTnmbhwXdlsjQ==} peerDependencies: '@rainbow-me/rainbowkit': '>=1.0.2 && <=2.0.0' @@ -2606,10 +2623,10 @@ packages: wagmi: '>=1.0.0 && <=2.0.0' dependencies: '@metamask/providers': 11.1.2 - '@rainbow-me/rainbowkit': 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.4)(wagmi@1.4.5) - '@wagmi/connectors': 2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) - viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) + '@rainbow-me/rainbowkit': 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.9)(wagmi@1.4.5) + '@wagmi/connectors': 2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) + viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@wagmi/chains' @@ -5778,7 +5795,7 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-add-source-name@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + /@graphprotocol/client-add-source-name@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): resolution: {integrity: sha512-3vX8mVPIEJFwAoRhjTPd9IjQrBuE+Gv+JB7IEf8/9222qiU9EzHVFUekKxVtcxQXD40CfageS41CxOreWQ1enA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5789,13 +5806,12 @@ packages: graphql: ^15.2.0 || ^16.0.0 dependencies: '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) + '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) graphql: 16.8.1 lodash: 4.17.21 tslib: 2.6.2 - dev: true /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-p8eEyeBcqxCXLxC7CNgIhLSCd7bjiKToKnrwYPShVb26gIG2JdAmD3/mpjuR+QaMA4chN/EO5t+TGvq6KnFx9g==} @@ -5815,7 +5831,7 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-auto-pagination@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + /@graphprotocol/client-auto-pagination@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): resolution: {integrity: sha512-TouHgs6rQLpZSgnMoPdes8/ZTtMMEoxWeUUCkfho/xfSi49prb5DcsI83pykln0OEAUnNPnaX0MhP+xA5LtFSg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5826,9 +5842,9 @@ packages: graphql: ^15.2.0 || ^16.0.0 dependencies: '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) + '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) graphql: 16.8.1 lodash: 4.17.21 tslib: 2.6.2 @@ -5850,7 +5866,7 @@ packages: - '@graphql-mesh/utils' dev: false - /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): + /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): resolution: {integrity: sha512-mxqXKHK2lO+k4r02Q44n3qhd5dufo+SSDduD8zGUDBsYcRQAtQD9PwmXRHyUoB9nw4A+NC+CtVh+76fueXCG1w==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5860,7 +5876,7 @@ packages: dependencies: '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -5879,14 +5895,14 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-block-tracking@2.0.0(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): + /@graphprotocol/client-block-tracking@2.0.0(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): resolution: {integrity: sha512-mpr0JAlefFGhxeb25ndeRKZ+t9cDHcUKGfRKIsoDzCclUEh5tBVTiQCDVGt6Eu+pxnrHPF2v/NQWktaB3+6twQ==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 10.0.7(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -5930,17 +5946,17 @@ packages: - utf-8-validate dev: false - /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-hTISbOzKavlDifBNsR6JqQMfdYwY7++hflPy+c3WHRrZ4OMoxFmW7ZuvaP6LvgKdJV77O8w9dnT/uxeHs6a90g==} engines: {node: '>=16.0.0'} hasBin: true peerDependencies: graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) - '@graphprotocol/client-block-tracking': 2.0.0(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) + '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) + '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) + '@graphprotocol/client-block-tracking': 2.0.0(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) @@ -6291,6 +6307,22 @@ packages: tslib: 2.6.2 dev: false + /@graphql-mesh/cache-localforage@0.96.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-/6t3pQD9on2coxbUU5cIcW0EKzgB18SaHy24jADngLg5epF6aFAsu65riH8xa7WghmifBqN5EPC+SpTaeojBrw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/types': ^0.96.0 + '@graphql-mesh/utils': ^0.96.0 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + graphql: 16.8.1 + localforage: 1.10.0 + tslib: 2.6.2 + dev: false + /@graphql-mesh/cli@0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-5IuXpk+Zpg05u6qNPX19VzC5/HCiLdDRF6EPZ3ze57FIRgGA3YsB1CUGga6Ky3inalURYwx0kWqmdjbdKZYx1w==} hasBin: true @@ -6500,6 +6532,41 @@ packages: - utf-8-validate dev: false + /@graphql-mesh/graphql@0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): + resolution: {integrity: sha512-jdPIFV/FXkGyKm8Buv+vpHt1Af0lt6+gpumwIlGb+h5JUwLZRkysHiXiUIFbFHVUn/cuoUGleKeewE9cBLwqVQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/store': ^0.96.0 + '@graphql-mesh/types': ^0.96.0 + '@graphql-mesh/utils': ^0.96.0 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/federation': 1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + lodash.get: 4.4.2 + tslib: 2.6.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - graphql-ws + - react + - react-dom + - subscriptions-transport-ws + - utf-8-validate + dev: false + /@graphql-mesh/http@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-tdGEvijb3w2YJsncoh59ZobWLWpYPDmTd07XOYroJTg3m95zloFRJr/IzklKOsAa57zVIuRLCOfDju5m1m47CQ==} peerDependencies: @@ -7410,7 +7477,6 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false /@graphql-tools/wrap@9.4.2(graphql@16.8.1): resolution: {integrity: sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA==} @@ -7519,10 +7585,10 @@ packages: resolution: {integrity: sha512-n6fwMsaoR50VITM2upR4OOi4EZJmZvU6vvXrHWCSakP9e1OeDuAOk+kHiK+egqDRYj6uKtg9VTUFKZBYvu3jRg==} dev: false - /@hypercerts-org/contracts@0.9.0(typescript@5.1.6): - resolution: {integrity: sha512-enXkIzZxYMDaOchL9peq6ddIfo0uJeJb1o+nj3LMy5AzK5B+3ijNkJFDUx0N8RZPO2jVgqO3/4czAavndLfNww==} + /@hypercerts-org/contracts@1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6): + resolution: {integrity: sha512-I9TMEyN4cKW3Gfv3Wysk9xoZzwpUjI+dgCECJVjBlInRiCxnaUdahBSqhVvKg1gViWaPMDvDGe5v9jVknZIN/A==} dependencies: - hardhat: 2.18.3(typescript@5.1.6) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@5.1.6) transitivePeerDependencies: - bufferutil - supports-color @@ -7531,8 +7597,8 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/sdk@1.0.0-alpha.9(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4): - resolution: {integrity: sha512-tPvtRK8dZgBQIdmBP+oqnuaU/BASZiFkdCegGXiep/lEAzTzzj9GRcXocd8/f7SzIH7KMytwzLTGdhPHmu02oA==} + /@hypercerts-org/sdk@1.0.0-alpha.10(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4): + resolution: {integrity: sha512-PEGKxzxhGZuz0cjYCCj90+bBmbfU4n1mP+q911Kx6jZ0g5sQyj+m685x0cq8OIL4JnYNPShZ2OWDjcX93KzbBA==} dependencies: '@ethereum-attestation-service/eas-sdk': 1.2.2-beta.0(ts-node@10.9.1)(typescript@5.1.6) '@ethersproject/abstract-signer': 5.7.0 @@ -7548,7 +7614,7 @@ packages: '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@hypercerts-org/contracts': 0.9.0(typescript@5.1.6) + '@hypercerts-org/contracts': 1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6) '@openzeppelin/merkle-tree': 1.0.5 '@whatwg-node/fetch': 0.9.14 ajv: 8.12.0 @@ -7560,7 +7626,7 @@ packages: loglevel: 1.8.1 mime: 3.0.0 nft.storage: 7.1.1(node-fetch@3.3.2) - viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) + viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) web3.storage: 4.5.5(node-fetch@3.3.2) transitivePeerDependencies: - '@envelop/core' @@ -9880,6 +9946,22 @@ packages: - supports-color dev: true + /@nomicfoundation/hardhat-viem@1.0.0(hardhat@2.18.3)(typescript@4.9.5)(viem@1.18.9): + resolution: {integrity: sha512-BWIrjlw3AOGVOPLZ/aGcAYC4EiFUF2QVrFV5StVtMUhQ9Wl6rlUCW98vNd1n0DFW1dPw93NYrMy5w0pEJPyKeg==} + peerDependencies: + hardhat: ^2.17.0 + typescript: ~5.0.0 + viem: ^1.15.1 + dependencies: + abitype: 0.9.8(typescript@4.9.5) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) + lodash.memoize: 4.1.2 + typescript: 4.9.5 + viem: 1.18.9(typescript@4.9.5) + transitivePeerDependencies: + - zod + dev: true + /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1: resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} engines: {node: '>= 10'} @@ -10180,6 +10262,30 @@ packages: - debug - encoding + /@openzeppelin/defender-sdk-account-client@1.4.0: + resolution: {integrity: sha512-R3jJOh/Wirp+UtD/YYHzC1LYqdXsIPl77z7ZlJLdQDdWHZbIHpHCUlTrj1zZ/0+XovJ23ItiZqivnkVLqV62LQ==} + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.4.0 + axios: 1.5.1(debug@4.3.4) + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + dev: true + + /@openzeppelin/defender-sdk-action-client@1.4.0: + resolution: {integrity: sha512-kLwO5sVC2KUt+jyHe5GZr7+BEeKgkX4ZcZCqyg+ykRtqVjQOmufwjdVRpwaqKsetEJdqobwmDu0D5gZnjC9ZwQ==} + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.4.0 + axios: 1.5.1(debug@4.3.4) + glob: 7.2.3 + jszip: 3.10.1 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + dev: true + /@openzeppelin/defender-sdk-base-client@1.3.0: resolution: {integrity: sha512-OMMt7NaAL8C95ralF9nMeKZpg96COLZT9FPpGpPsI7aB8fVZfCM8+6k99gTF44hMS6IsRdN2WthS3m7VzQeeoA==} dependencies: @@ -10189,6 +10295,15 @@ packages: - encoding dev: true + /@openzeppelin/defender-sdk-base-client@1.4.0: + resolution: {integrity: sha512-aBDQpA4+ayFyx/2hQFRrBJqo6pKcF3eVbztjq49cHdg+cAQgM56Dy333Bp2z4bHzx1IbzmYcvhlhBH2LBnsdzg==} + dependencies: + amazon-cognito-identity-js: 6.3.6 + async-retry: 1.3.3 + transitivePeerDependencies: + - encoding + dev: true + /@openzeppelin/defender-sdk-deploy-client@1.3.0(debug@4.3.4): resolution: {integrity: sha512-RTYM3HnVvD2d5NoYfTug8UwT41e0Jjwb13lk9v0Jl8z7mcclUVvAnKD4DHJ4b8RhKpg4B15oLQK/Igzjg1HHRA==} dependencies: @@ -10201,6 +10316,147 @@ packages: - encoding dev: true + /@openzeppelin/defender-sdk-deploy-client@1.4.0: + resolution: {integrity: sha512-uXsGKXhH0P4xRBD0WvR8eo830sFd2jbES2Uf7nQnd8jGK5wxUgCLGgfrRXFznEzAbXA3xs+a5IGcmHwbL9MxyQ==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@openzeppelin/defender-sdk-base-client': 1.4.0 + axios: 1.5.1(debug@4.3.4) + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + dev: true + + /@openzeppelin/defender-sdk-monitor-client@1.4.0: + resolution: {integrity: sha512-I3LHhp4/BQjcCwhCfmzfrPNnnyRuMoJM0AtJYsyG7PTgfZe9UXnta5z4mJNJyBGBvOpg8v6Rt5k30uHDXReHhQ==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@openzeppelin/defender-sdk-base-client': 1.4.0 + axios: 1.5.1(debug@4.3.4) + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + dev: true + + /@openzeppelin/defender-sdk-network-client@1.4.0: + resolution: {integrity: sha512-jbclbqBjyBUNi/5C84EXaXOLTcLF83gMIk9Vx2uTPrb7GvfkmEG1ZWO0btBq312cmXgtUmCRj1QTyWxTArBT4g==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@openzeppelin/defender-sdk-base-client': 1.4.0 + axios: 1.5.1(debug@4.3.4) + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + dev: true + + /@openzeppelin/defender-sdk-notification-channel-client@1.4.0: + resolution: {integrity: sha512-cXsatNPUodwfwUAJJ/0P0PEtx2RhPbAa/W4x/pmBltmIB1YDjmbxqtjzWmxn7yZMcu4XcdxDIBH8GXINsWtexw==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@openzeppelin/defender-sdk-base-client': 1.4.0 + axios: 1.5.1(debug@4.3.4) + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + dev: true + + /@openzeppelin/defender-sdk-proposal-client@1.4.0: + resolution: {integrity: sha512-jhvVZOt9AlvsOzJZiU0nO61ew+AT25d6kVPMT3GeyoFo8v3P62U19w3RtTrozxvxppMadUsIm53mu8Y4JWL/Zg==} + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.4.0 + axios: 1.5.1(debug@4.3.4) + ethers: 5.7.2 + lodash: 4.17.21 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + dev: true + + /@openzeppelin/defender-sdk-relay-client@1.4.0: + resolution: {integrity: sha512-j6XmTTkfShN2VbR82aw/NiSD8ee6vMEmQDFtnNG3NIsl/FYygpIksGVef3gFsYPBCspQPQ0SdeKlwM0pU/+Sag==} + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.4.0 + axios: 1.5.1(debug@4.3.4) + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + dev: true + + /@openzeppelin/defender-sdk-relay-signer-client@1.4.0(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@ethersproject/hash@5.7.0)(@ethersproject/providers@5.7.2)(@ethersproject/transactions@5.7.0)(web3-core-helpers@1.10.3)(web3-core@1.10.3)(web3-utils@1.10.3)(web3@1.10.3): + resolution: {integrity: sha512-BP2c3uEHTCxwdbSA7uhbeSpiBW7ti839bIJbojdd29HsEYNxX3Ng913QZtnn/MpfXVV8xKmnoTlplurozwEHTg==} + peerDependencies: + '@ethersproject/abstract-provider': ^5.6.1 + '@ethersproject/abstract-signer': ^5.6.2 + '@ethersproject/hash': ^5.6.1 + '@ethersproject/providers': ^5.6.8 + '@ethersproject/transactions': ^5.6.2 + web3: ^1.8.2 + web3-core: ^1.10.3 + web3-core-helpers: ^1.8.2 + web3-utils: ^1.8.2 + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@openzeppelin/defender-sdk-base-client': 1.4.0 + amazon-cognito-identity-js: 6.3.6 + axios: 1.5.1(debug@4.3.4) + lodash: 4.17.21 + web3: 1.10.3 + web3-core: 1.10.3 + web3-core-helpers: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - debug + - encoding + dev: true + + /@openzeppelin/defender-sdk@1.4.0(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@ethersproject/hash@5.7.0)(@ethersproject/providers@5.7.2)(@ethersproject/transactions@5.7.0)(web3-core-helpers@1.10.3)(web3-core@1.10.3)(web3-utils@1.10.3)(web3@1.10.3): + resolution: {integrity: sha512-1WCECykTXE8UzMuRTLx0rSDWAQAyCWZ0cNxMeDxghhNwDGdClv3AJzi7Ns/GulaB/x2ubpbqh+fXUIEPq5JAdA==} + dependencies: + '@openzeppelin/defender-sdk-account-client': 1.4.0 + '@openzeppelin/defender-sdk-action-client': 1.4.0 + '@openzeppelin/defender-sdk-base-client': 1.4.0 + '@openzeppelin/defender-sdk-deploy-client': 1.4.0 + '@openzeppelin/defender-sdk-monitor-client': 1.4.0 + '@openzeppelin/defender-sdk-network-client': 1.4.0 + '@openzeppelin/defender-sdk-notification-channel-client': 1.4.0 + '@openzeppelin/defender-sdk-proposal-client': 1.4.0 + '@openzeppelin/defender-sdk-relay-client': 1.4.0 + '@openzeppelin/defender-sdk-relay-signer-client': 1.4.0(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@ethersproject/hash@5.7.0)(@ethersproject/providers@5.7.2)(@ethersproject/transactions@5.7.0)(web3-core-helpers@1.10.3)(web3-core@1.10.3)(web3-utils@1.10.3)(web3@1.10.3) + transitivePeerDependencies: + - '@ethersproject/abstract-provider' + - '@ethersproject/abstract-signer' + - '@ethersproject/hash' + - '@ethersproject/providers' + - '@ethersproject/transactions' + - bufferutil + - debug + - encoding + - utf-8-validate + - web3 + - web3-core + - web3-core-helpers + - web3-utils + dev: true + /@openzeppelin/defender-sentinel-client@1.49.0: resolution: {integrity: sha512-fr39U1GRWvJP1fWgwqjTYCz7uhfVfXJReWcivwxMeaoyMl+jYFxj8NkMhqkkbmI6O4TUyNMsmAQ34qFf0IS0/A==} dependencies: @@ -10498,7 +10754,7 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - /@rainbow-me/rainbowkit@1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.4)(wagmi@1.4.5): + /@rainbow-me/rainbowkit@1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.9)(wagmi@1.4.5): resolution: {integrity: sha512-XjdeX31GwFdRR/1rCRqPXiO94nbq2qOlnaox5P4K/KMRIUwyelKzak27uWw8Krmor/Hcrd5FisfepGDS0tUfEA==} engines: {node: '>=12.4'} peerDependencies: @@ -10517,8 +10773,8 @@ packages: react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.4(@types/react@18.2.33)(react@18.2.0) ua-parser-js: 1.0.36 - viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) + viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) transitivePeerDependencies: - '@types/react' dev: false @@ -11057,7 +11313,7 @@ packages: resolution: {integrity: sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.12.0 - viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) + viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -11069,7 +11325,7 @@ packages: resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.12.0 - viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) + viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -11114,7 +11370,6 @@ packages: '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 - dev: false /@scure/bip39@1.1.1: resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} @@ -11393,6 +11648,11 @@ packages: engines: {node: '>=4'} dev: true + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + dev: true + /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: @@ -11873,6 +12133,20 @@ packages: defer-to-connect: 1.1.3 dev: false + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + /@tanstack/match-sorter-utils@8.8.4: resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==} engines: {node: '>=12'} @@ -12206,6 +12480,15 @@ packages: dependencies: '@types/node': 18.18.7 + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 18.18.7 + '@types/responselike': 1.0.2 + dev: true + /@types/chai-as-promised@7.1.7: resolution: {integrity: sha512-APucaP5rlmTRYKtRA6FE5QPP87x76ejw5t5guRJ4y5OgMnwtsvigw7HHhKZlx2MGXLeZd6R/GNZR/IqDHcbtQw==} dependencies: @@ -12330,6 +12613,10 @@ packages: /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + dev: true + /@types/http-errors@2.0.3: resolution: {integrity: sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==} @@ -13155,7 +13442,7 @@ packages: typescript: 5.1.6 dev: true - /@wagmi/connectors@2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4): + /@wagmi/connectors@2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): resolution: {integrity: sha512-1KOL0HTJl5kzSC/YdKwFwiokr6poUQn1V/tcT0TpG3iH2x0lSM7FTkvCjVVY/6lKzTXrLlo9y2aE7AsOPnkvqg==} peerDependencies: '@wagmi/chains': '>=1.7.0' @@ -13178,7 +13465,7 @@ packages: abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) + viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - bufferutil @@ -13190,7 +13477,7 @@ packages: - zod dev: false - /@wagmi/connectors@3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4): + /@wagmi/connectors@3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): resolution: {integrity: sha512-UgwsQKQDFObJVJMf9pDfFoXTv710o4zrTHyhIWKBTMMkLpCMsMxN5+ZaDhBYt/BgoRinfRYQo8uwuwLhxE6Log==} peerDependencies: typescript: '>=5.0.4' @@ -13210,7 +13497,7 @@ packages: abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) + viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@types/react' @@ -13223,7 +13510,7 @@ packages: - zod dev: false - /@wagmi/core@1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4): + /@wagmi/core@1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): resolution: {integrity: sha512-N9luRb1Uk4tBN9kaYcQSWKE9AsRt/rvZaFt5IZech4JPzNN2sQlfhKd9GEjOXYRDqEPHdDvos7qyBKiDNTz4GA==} peerDependencies: typescript: '>=5.0.4' @@ -13232,11 +13519,11 @@ packages: typescript: optional: true dependencies: - '@wagmi/connectors': 3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) + '@wagmi/connectors': 3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) + viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: - '@react-native-async-storage/async-storage' @@ -14119,6 +14406,20 @@ packages: typescript: 5.1.6 zod: 3.22.4 + /abitype@0.9.8(typescript@4.9.5): + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 4.9.5 + dev: true + /abitype@0.9.8(typescript@5.1.6)(zod@3.22.4): resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: @@ -14155,6 +14456,10 @@ packages: it-stream-types: 2.0.1 dev: false + /abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + dev: true + /abstract-level@1.0.3: resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} engines: {node: '>=12'} @@ -14172,7 +14477,7 @@ packages: engines: {node: '>=6'} dependencies: buffer: 5.7.1 - immediate: 3.2.3 + immediate: 3.3.0 level-concat-iterator: 2.0.1 level-supports: 1.0.1 xtend: 4.0.2 @@ -15600,6 +15905,10 @@ packages: /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + /buffer-to-arraybuffer@0.0.5: + resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} + dev: true + /buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} @@ -15697,6 +16006,16 @@ packages: engines: {node: '>=8'} dev: true + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + dev: true + + /cacheable-lookup@6.1.0: + resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: '>=10.6.0'} + dev: true + /cacheable-request@2.1.4: resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==} dependencies: @@ -15722,6 +16041,19 @@ packages: responselike: 1.0.2 dev: false + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + dev: true + /cachedir@2.3.0: resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} engines: {node: '>=6'} @@ -16105,6 +16437,18 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + /cids@0.7.5: + resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} + engines: {node: '>=4.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by the multiformats module + dependencies: + buffer: 5.7.1 + class-is: 1.1.0 + multibase: 0.6.1 + multicodec: 1.0.4 + multihashes: 0.4.21 + dev: true + /cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} dependencies: @@ -16117,7 +16461,6 @@ packages: /class-is@1.1.0: resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} - dev: false /classic-level@1.3.0: resolution: {integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==} @@ -16309,7 +16652,6 @@ packages: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} dependencies: mimic-response: 1.0.1 - dev: false /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} @@ -16594,6 +16936,14 @@ packages: dependencies: safe-buffer: 5.2.1 + /content-hash@2.5.2: + resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} + dependencies: + cids: 0.7.5 + multicodec: 0.5.7 + multihashes: 0.4.21 + dev: true + /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -16703,6 +17053,14 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + /cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} dependencies: @@ -16883,6 +17241,14 @@ packages: transitivePeerDependencies: - encoding + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -17671,6 +18037,13 @@ packages: dependencies: mimic-response: 1.0.1 + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + /decompress-tar@4.1.1: resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} engines: {node: '>=4'} @@ -17816,6 +18189,11 @@ packages: resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} dev: false + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: true + /deferred-leveldown@5.3.0: resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==} engines: {node: '>=6'} @@ -18138,6 +18516,10 @@ packages: entities: 4.5.0 dev: false + /dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dev: true + /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -19202,6 +19584,29 @@ packages: pify: 5.0.0 dev: false + /eth-lib@0.1.29: + resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + nano-json-stream-parser: 0.1.2 + servify: 0.1.12 + ws: 3.3.3 + xhr-request-promise: 0.1.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /eth-lib@0.2.8: + resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + xhr-request-promise: 0.1.3 + dev: true + /eth-query@2.1.2: resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} dependencies: @@ -19431,6 +19836,10 @@ packages: resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} dev: true + /eventemitter3@4.0.4: + resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + dev: true + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -20197,6 +20606,10 @@ packages: webpack: 5.89.0(webpack-cli@5.1.4) dev: false + /form-data-encoder@1.7.1: + resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} + dev: true + /form-data@2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} @@ -20347,6 +20760,14 @@ packages: universalify: 2.0.0 dev: true + /fs-extra@4.0.3: + resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + /fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -20379,6 +20800,12 @@ packages: rimraf: 2.7.1 dev: true + /fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 + dev: true + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -20759,6 +21186,13 @@ packages: kind-of: 6.0.3 which: 1.3.1 + /global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + dev: true + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -20878,6 +21312,42 @@ packages: dependencies: get-intrinsic: 1.2.2 + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.2 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + dev: true + + /got@12.1.0: + resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 5.0.1 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.2 + cacheable-lookup: 6.1.0 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + form-data-encoder: 1.7.1 + get-stream: 6.0.1 + http2-wrapper: 2.2.0 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 2.0.1 + dev: true + /got@8.3.2: resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==} engines: {node: '>=4'} @@ -21261,7 +21731,7 @@ packages: - supports-color - utf-8-validate - /hardhat@2.18.3(typescript@5.1.6): + /hardhat@2.18.3(ts-node@10.9.1)(typescript@5.1.6): resolution: {integrity: sha512-JuYaTG+4ZHVjEHCW5Hn6jCHH3LpO75dtgznZpM/dLv12RcSlw/xHbeQh3FAsGahQr1epKryZcZEMHvztVZHe0g==} hasBin: true peerDependencies: @@ -21317,6 +21787,7 @@ packages: solc: 0.7.3(debug@4.3.4) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 + ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.1.6) tsort: 0.0.1 typescript: 5.1.6 undici: 5.26.5 @@ -21717,6 +22188,10 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 + /http-https@1.0.0: + resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} + dev: true + /http-parser-js@0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} @@ -21783,6 +22258,22 @@ packages: sshpk: 1.18.0 dev: true + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /http2-wrapper@2.2.0: + resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -22911,6 +23402,10 @@ packages: engines: {node: '>=12'} dev: true + /is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + dev: true + /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} @@ -23330,7 +23825,6 @@ packages: ws: '*' dependencies: ws: 8.13.0 - dev: false /isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} @@ -24610,7 +25104,6 @@ packages: pako: 1.0.11 readable-stream: 2.3.8 setimmediate: 1.0.5 - dev: false /just-debounce-it@3.2.0: resolution: {integrity: sha512-WXzwLL0745uNuedrCsCs3rpmfD6DBaf7uuVwaq98/8dafURfgQaBsSpjiPp5+CW6Vjltwy9cOGI6qE71b3T8iQ==} @@ -24977,7 +25470,6 @@ packages: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} dependencies: immediate: 3.0.6 - dev: false /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -25435,7 +25927,11 @@ packages: /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - dev: false + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true /lru-cache@10.0.1: resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} @@ -26364,6 +26860,17 @@ packages: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + dependencies: + dom-walk: 0.1.2 + dev: true + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -26478,6 +26985,13 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -26499,6 +27013,12 @@ packages: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} + /minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + dev: true + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -26507,6 +27027,14 @@ packages: yallist: 4.0.0 dev: true + /mkdirp-promise@5.0.1: + resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} + engines: {node: '>=4'} + deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. + dependencies: + mkdirp: 3.0.1 + dev: true + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -26564,6 +27092,10 @@ packages: yargs-parser: 20.2.4 yargs-unparser: 2.0.0 + /mock-fs@4.14.0: + resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} + dev: true + /module-error@1.0.2: resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} engines: {node: '>=10'} @@ -26638,6 +27170,22 @@ packages: - node-fetch - supports-color + /multibase@0.6.1: + resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} + deprecated: This module has been superseded by the multiformats module + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + dev: true + + /multibase@0.7.0: + resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} + deprecated: This module has been superseded by the multiformats module + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + dev: true + /multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true @@ -26645,6 +27193,21 @@ packages: dns-packet: 5.6.1 thunky: 1.1.0 + /multicodec@0.5.7: + resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} + deprecated: This module has been superseded by the multiformats module + dependencies: + varint: 5.0.2 + dev: true + + /multicodec@1.0.4: + resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} + deprecated: This module has been superseded by the multiformats module + dependencies: + buffer: 5.7.1 + varint: 5.0.2 + dev: true + /multiformats@10.0.3: resolution: {integrity: sha512-K2yGSmstS/oEmYiEIieHb53jJCaqp4ERPDQAYrm5sV3UUrVDZeshJQCK6GHAKyIGufU1vAcbS0PdAAZmC7Tzcw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -26663,6 +27226,14 @@ packages: /multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + /multihashes@0.4.21: + resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + dependencies: + buffer: 5.7.1 + multibase: 0.7.0 + varint: 5.0.2 + dev: true + /murmur-128@0.2.1: resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} dependencies: @@ -26716,6 +27287,10 @@ packages: stylis: 4.3.0 dev: false + /nano-json-stream-parser@0.1.2: + resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + dev: true + /nanoclone@0.2.1: resolution: {integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==} dev: false @@ -27021,7 +27596,6 @@ packages: /normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - dev: false /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} @@ -27213,6 +27787,12 @@ packages: /obliterator@2.0.4: resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + /oboe@2.1.5: + resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} + dependencies: + http-https: 1.0.0 + dev: true + /observable-webworkers@2.0.1: resolution: {integrity: sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -27384,6 +27964,16 @@ packages: engines: {node: '>=6'} dev: false + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + dev: true + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: true + /p-defer@3.0.0: resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} engines: {node: '>=8'} @@ -27574,7 +28164,6 @@ packages: /pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: false /pako@2.1.0: resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} @@ -27622,6 +28211,10 @@ packages: map-cache: 0.2.2 path-root: 0.1.1 + /parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + dev: true + /parse-json@2.2.0: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} engines: {node: '>=0.10.0'} @@ -28845,6 +29438,11 @@ packages: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + /quick-lru@6.1.2: resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} engines: {node: '>=12'} @@ -29804,6 +30402,10 @@ packages: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} dev: false + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: true + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -29887,6 +30489,12 @@ packages: dependencies: lowercase-keys: 1.0.1 + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + dev: true + /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -30520,6 +31128,19 @@ packages: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} dev: false + /servify@0.1.12: + resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} + engines: {node: '>=6'} + dependencies: + body-parser: 1.20.1 + cors: 2.8.5 + express: 4.18.2 + request: 2.88.2 + xhr: 2.6.0 + transitivePeerDependencies: + - supports-color + dev: true + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -30647,6 +31268,18 @@ packages: /signedsource@1.0.0: resolution: {integrity: sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==} + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@2.8.2: + resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} + dependencies: + decompress-response: 3.3.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + /sinon@15.2.0: resolution: {integrity: sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==} deprecated: 16.1.1 @@ -31559,6 +32192,26 @@ packages: dependencies: tslib: 2.6.2 + /swarm-js@0.1.42: + resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + dependencies: + bluebird: 3.7.2 + buffer: 5.7.1 + eth-lib: 0.1.29 + fs-extra: 4.0.3 + got: 11.8.6 + mime-types: 2.1.35 + mkdirp-promise: 5.0.1 + mock-fs: 4.14.0 + setimmediate: 1.0.5 + tar: 4.4.19 + xhr-request: 1.1.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /swr@1.3.0(react@18.2.0): resolution: {integrity: sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==} peerDependencies: @@ -31643,6 +32296,19 @@ packages: xtend: 4.0.2 dev: true + /tar@4.4.19: + resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + /tar@6.2.0: resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} engines: {node: '>=10'} @@ -32650,6 +33316,10 @@ packages: multiformats: 12.1.3 dev: false + /ultron@1.1.1: + resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} + dev: true + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -32956,6 +33626,10 @@ packages: requires-port: 1.0.0 dev: true + /url-set-query@1.0.0: + resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} + dev: true + /url-to-options@1.0.1: resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==} engines: {node: '>= 4'} @@ -33097,7 +33771,6 @@ packages: is-generator-function: 1.0.10 is-typed-array: 1.1.12 which-typed-array: 1.1.13 - dev: false /utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} @@ -33129,7 +33802,6 @@ packages: /uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true - dev: false /uvu@0.5.6: resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} @@ -33220,7 +33892,6 @@ packages: /varint@5.0.2: resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} - dev: false /varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} @@ -33316,6 +33987,52 @@ packages: - zod dev: false + /viem@1.18.9(typescript@4.9.5): + resolution: {integrity: sha512-eAXtoTwAFA3YEgjTYMb5ZTQrDC0UPx5qyZ4sv90TirVKepcM9mBPksTkC1SSWya0UdxhBmhEBL/CiYMjmGCTWg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.9.4 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 0.9.8(typescript@4.9.5) + isows: 1.0.3(ws@8.13.0) + typescript: 4.9.5 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: true + + /viem@1.18.9(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-eAXtoTwAFA3YEgjTYMb5ZTQrDC0UPx5qyZ4sv90TirVKepcM9mBPksTkC1SSWya0UdxhBmhEBL/CiYMjmGCTWg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.9.4 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 0.9.8(typescript@5.1.6)(zod@3.22.4) + isows: 1.0.3(ws@8.13.0) + typescript: 5.1.6 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + /vite-node@0.28.5(@types/node@18.18.7): resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} engines: {node: '>=v14.16.0'} @@ -33469,7 +34186,7 @@ packages: hasBin: true dev: true - /wagmi@1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4): + /wagmi@1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): resolution: {integrity: sha512-Ph62E6cO5n2Z8Z5LTyZrkaNprxTsbC4w0qZJT4OJdXrEELziI8z/b4FO6amVFXdu2rDp/wpvF56e4mhKC8/Kdw==} peerDependencies: react: '>=17.0.0' @@ -33482,12 +34199,12 @@ packages: '@tanstack/query-sync-storage-persister': 4.36.1 '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0) '@tanstack/react-query-persist-client': 4.36.1(@tanstack/react-query@4.36.1) - '@wagmi/core': 1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.4)(zod@3.22.4) + '@wagmi/core': 1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) react: 18.2.0 typescript: 5.1.6 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 1.18.4(typescript@5.1.6)(zod@3.22.4) + viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@types/react' @@ -33572,6 +34289,92 @@ packages: resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} dev: false + /web3-bzz@1.10.3: + resolution: {integrity: sha512-XDIRsTwekdBXtFytMpHBuun4cK4x0ZMIDXSoo1UVYp+oMyZj07c7gf7tNQY5qZ/sN+CJIas4ilhN25VJcjSijQ==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + '@types/node': 12.20.55 + got: 12.1.0 + swarm-js: 0.1.42 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /web3-core-helpers@1.10.3: + resolution: {integrity: sha512-Yv7dQC3B9ipOc5sWm3VAz1ys70Izfzb8n9rSiQYIPjpqtJM+3V4EeK6ghzNR6CO2es0+Yu9CtCkw0h8gQhrTxA==} + engines: {node: '>=8.0.0'} + dependencies: + web3-eth-iban: 1.10.3 + web3-utils: 1.10.3 + dev: true + + /web3-core-method@1.10.3: + resolution: {integrity: sha512-VZ/Dmml4NBmb0ep5PTSg9oqKoBtG0/YoMPei/bq/tUdlhB2dMB79sbeJPwx592uaV0Vpk7VltrrrBv5hTM1y4Q==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/transactions': 5.7.0 + web3-core-helpers: 1.10.3 + web3-core-promievent: 1.10.3 + web3-core-subscriptions: 1.10.3 + web3-utils: 1.10.3 + dev: true + + /web3-core-promievent@1.10.3: + resolution: {integrity: sha512-HgjY+TkuLm5uTwUtaAfkTgRx/NzMxvVradCi02gy17NxDVdg/p6svBHcp037vcNpkuGeFznFJgULP+s2hdVgUQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + dev: true + + /web3-core-requestmanager@1.10.3: + resolution: {integrity: sha512-VT9sKJfgM2yBOIxOXeXiDuFMP4pxzF6FT+y8KTLqhDFHkbG3XRe42Vm97mB/IvLQCJOmokEjl3ps8yP1kbggyw==} + engines: {node: '>=8.0.0'} + dependencies: + util: 0.12.5 + web3-core-helpers: 1.10.3 + web3-providers-http: 1.10.3 + web3-providers-ipc: 1.10.3 + web3-providers-ws: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-core-subscriptions@1.10.3: + resolution: {integrity: sha512-KW0Mc8sgn70WadZu7RjQ4H5sNDJ5Lx8JMI3BWos+f2rW0foegOCyWhRu33W1s6ntXnqeBUw5rRCXZRlA3z+HNA==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.3 + dev: true + + /web3-core@1.10.3: + resolution: {integrity: sha512-Vbk0/vUNZxJlz3RFjAhNNt7qTpX8yE3dn3uFxfX5OHbuon5u65YEOd3civ/aQNW745N0vGUlHFNxxmn+sG9DIw==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 5.1.3 + '@types/node': 12.20.55 + bignumber.js: 9.1.2 + web3-core-helpers: 1.10.3 + web3-core-method: 1.10.3 + web3-core-requestmanager: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-abi@1.10.3: + resolution: {integrity: sha512-O8EvV67uhq0OiCMekqYsDtb6FzfYzMXT7VMHowF8HV6qLZXCGTdB/NH4nJrEh2mFtEwVdS6AmLFJAQd2kVyoMQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/abi': 5.7.0 + web3-utils: 1.10.3 + dev: true + /web3-eth-abi@1.7.0: resolution: {integrity: sha512-heqR0bWxgCJwjWIhq2sGyNj9bwun5+Xox/LdZKe+WMyTSy0cXDXEAgv3XKNkXC4JqdDt/ZlbTEx4TWak4TRMSg==} engines: {node: '>=8.0.0'} @@ -33580,6 +34383,160 @@ packages: web3-utils: 1.7.0 dev: true + /web3-eth-accounts@1.10.3: + resolution: {integrity: sha512-8MipGgwusDVgn7NwKOmpeo3gxzzd+SmwcWeBdpXknuyDiZSQy9tXe+E9LeFGrmys/8mLLYP79n3jSbiTyv+6pQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + '@ethereumjs/util': 8.1.0 + eth-lib: 0.2.8 + scrypt-js: 3.0.1 + uuid: 9.0.1 + web3-core: 1.10.3 + web3-core-helpers: 1.10.3 + web3-core-method: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-contract@1.10.3: + resolution: {integrity: sha512-Y2CW61dCCyY4IoUMD4JsEQWrILX4FJWDWC/Txx/pr3K/+fGsBGvS9kWQN5EsVXOp4g7HoFOfVh9Lf7BmVVSRmg==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 5.1.3 + web3-core: 1.10.3 + web3-core-helpers: 1.10.3 + web3-core-method: 1.10.3 + web3-core-promievent: 1.10.3 + web3-core-subscriptions: 1.10.3 + web3-eth-abi: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-ens@1.10.3: + resolution: {integrity: sha512-hR+odRDXGqKemw1GFniKBEXpjYwLgttTES+bc7BfTeoUyUZXbyDHe5ifC+h+vpzxh4oS0TnfcIoarK0Z9tFSiQ==} + engines: {node: '>=8.0.0'} + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + web3-core: 1.10.3 + web3-core-helpers: 1.10.3 + web3-core-promievent: 1.10.3 + web3-eth-abi: 1.10.3 + web3-eth-contract: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-iban@1.10.3: + resolution: {integrity: sha512-ZCfOjYKAjaX2TGI8uif5ah+J3BYFuo+47JOIV1RIz2l7kD9VfnxvRH5UiQDRyMALQC7KFd2hUqIEtHklapNyKA==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 5.2.1 + web3-utils: 1.10.3 + dev: true + + /web3-eth-personal@1.10.3: + resolution: {integrity: sha512-avrQ6yWdADIvuNQcFZXmGLCEzulQa76hUOuVywN7O3cklB4nFc/Gp3yTvD3bOAaE7DhjLQfhUTCzXL7WMxVTsw==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/node': 12.20.55 + web3-core: 1.10.3 + web3-core-helpers: 1.10.3 + web3-core-method: 1.10.3 + web3-net: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth@1.10.3: + resolution: {integrity: sha512-Uk1U2qGiif2mIG8iKu23/EQJ2ksB1BQXy3wF3RvFuyxt8Ft9OEpmGlO7wOtAyJdoKzD5vcul19bJpPcWSAYZhA==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core: 1.10.3 + web3-core-helpers: 1.10.3 + web3-core-method: 1.10.3 + web3-core-subscriptions: 1.10.3 + web3-eth-abi: 1.10.3 + web3-eth-accounts: 1.10.3 + web3-eth-contract: 1.10.3 + web3-eth-ens: 1.10.3 + web3-eth-iban: 1.10.3 + web3-eth-personal: 1.10.3 + web3-net: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-net@1.10.3: + resolution: {integrity: sha512-IoSr33235qVoI1vtKssPUigJU9Fc/Ph0T9CgRi15sx+itysmvtlmXMNoyd6Xrgm9LuM4CIhxz7yDzH93B79IFg==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core: 1.10.3 + web3-core-method: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-providers-http@1.10.3: + resolution: {integrity: sha512-6dAgsHR3MxJ0Qyu3QLFlQEelTapVfWNTu5F45FYh8t7Y03T1/o+YAkVxsbY5AdmD+y5bXG/XPJ4q8tjL6MgZHw==} + engines: {node: '>=8.0.0'} + dependencies: + abortcontroller-polyfill: 1.7.5 + cross-fetch: 4.0.0 + es6-promise: 4.2.8 + web3-core-helpers: 1.10.3 + transitivePeerDependencies: + - encoding + dev: true + + /web3-providers-ipc@1.10.3: + resolution: {integrity: sha512-vP5WIGT8FLnGRfswTxNs9rMfS1vCbMezj/zHbBe/zB9GauBRTYVrUo2H/hVrhLg8Ut7AbsKZ+tCJ4mAwpKi2hA==} + engines: {node: '>=8.0.0'} + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.10.3 + dev: true + + /web3-providers-ws@1.10.3: + resolution: {integrity: sha512-/filBXRl48INxsh6AuCcsy4v5ndnTZ/p6bl67kmO9aK1wffv7CT++DrtclDtVMeDGCgB3van+hEf9xTAVXur7Q==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.3 + websocket: 1.0.34 + transitivePeerDependencies: + - supports-color + dev: true + + /web3-shh@1.10.3: + resolution: {integrity: sha512-cAZ60CPvs9azdwMSQ/PSUdyV4PEtaW5edAZhu3rCXf6XxQRliBboic+AvwUvB6j3eswY50VGa5FygfVmJ1JVng==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-core: 1.10.3 + web3-core-method: 1.10.3 + web3-core-subscriptions: 1.10.3 + web3-net: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /web3-utils@1.10.3: resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} engines: {node: '>=8.0.0'} @@ -33632,6 +34589,25 @@ packages: - supports-color dev: false + /web3@1.10.3: + resolution: {integrity: sha512-DgUdOOqC/gTqW+VQl1EdPxrVRPB66xVNtuZ5KD4adVBtko87hkgM8BTZ0lZ8IbUfnQk6DyjcDujMiH3oszllAw==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-bzz: 1.10.3 + web3-core: 1.10.3 + web3-eth: 1.10.3 + web3-eth-personal: 1.10.3 + web3-net: 1.10.3 + web3-shh: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + /webcrypto-core@1.7.7: resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==} dependencies: @@ -33868,7 +34844,6 @@ packages: yaeti: 0.0.6 transitivePeerDependencies: - supports-color - dev: false /whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} @@ -34124,6 +35099,22 @@ packages: signal-exit: 3.0.7 dev: true + /ws@3.3.3: + resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + ultron: 1.1.1 + dev: true + /ws@6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} peerDependencies: @@ -34226,11 +35217,51 @@ packages: utf-8-validate: optional: true + /xdeployer@2.1.13(@nomicfoundation/hardhat-ethers@3.0.4)(ethers@6.8.0)(hardhat@2.18.3): + resolution: {integrity: sha512-QxVsQ+zz+cnhzCIs7/e5F06nKjOD2Lb47nW52Jw3IzFQVeYv6NfvokhZiez+y8jkzwvHDwVru+fCVlml0GQGkw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.4 + ethers: ^6.8.1 + hardhat: ^2.19.0 + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.4(ethers@6.8.0)(hardhat@2.18.3) + ethers: 6.8.0 + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) + dev: true + /xdg-basedir@4.0.0: resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} engines: {node: '>=8'} dev: false + /xhr-request-promise@0.1.3: + resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} + dependencies: + xhr-request: 1.1.0 + dev: true + + /xhr-request@1.1.0: + resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} + dependencies: + buffer-to-arraybuffer: 0.0.5 + object-assign: 4.1.1 + query-string: 5.1.1 + simple-get: 2.8.2 + timed-out: 4.0.1 + url-set-query: 1.0.0 + xhr: 2.6.0 + dev: true + + /xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + dev: true + /xml-js@1.6.11: resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} hasBin: true @@ -34291,7 +35322,6 @@ packages: /yaeti@0.0.6: resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} engines: {node: '>=0.10.32'} - dev: false /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} diff --git a/sdk/.graphclient/index.ts b/sdk/.graphclient/index.ts index 14907f2d..7c3feb4a 100644 --- a/sdk/.graphclient/index.ts +++ b/sdk/.graphclient/index.ts @@ -1305,21 +1305,21 @@ export type ResolversParentTypes = ResolversObject<{ export type entityDirectiveArgs = { }; -export type entityDirectiveResolver = DirectiveResolverFn; +export type entityDirectiveResolver = DirectiveResolverFn; export type subgraphIdDirectiveArgs = { id: Scalars['String']; }; -export type subgraphIdDirectiveResolver = DirectiveResolverFn; +export type subgraphIdDirectiveResolver = DirectiveResolverFn; export type derivedFromDirectiveArgs = { field: Scalars['String']; }; -export type derivedFromDirectiveResolver = DirectiveResolverFn; +export type derivedFromDirectiveResolver = DirectiveResolverFn; -export type QueryResolvers = ResolversObject<{ +export type QueryResolvers = ResolversObject<{ allowlist?: Resolver, ParentType, ContextType, RequireFields>; allowlists?: Resolver, ParentType, ContextType, RequireFields>; claim?: Resolver, ParentType, ContextType, RequireFields>; @@ -1337,7 +1337,7 @@ export type QueryResolvers, ParentType, ContextType, Partial>; }>; -export type SubscriptionResolvers = ResolversObject<{ +export type SubscriptionResolvers = ResolversObject<{ allowlist?: SubscriptionResolver, "allowlist", ParentType, ContextType, RequireFields>; allowlists?: SubscriptionResolver, "allowlists", ParentType, ContextType, RequireFields>; claim?: SubscriptionResolver, "claim", ParentType, ContextType, RequireFields>; @@ -1355,7 +1355,7 @@ export type SubscriptionResolvers, "_meta", ParentType, ContextType, Partial>; }>; -export type AcceptedTokenResolvers = ResolversObject<{ +export type AcceptedTokenResolvers = ResolversObject<{ id?: Resolver; token?: Resolver; minimumAmountPerUnit?: Resolver; @@ -1363,7 +1363,7 @@ export type AcceptedTokenResolvers; }>; -export type AllowlistResolvers = ResolversObject<{ +export type AllowlistResolvers = ResolversObject<{ id?: Resolver; root?: Resolver; claim?: Resolver; @@ -1382,7 +1382,7 @@ export interface BytesScalarConfig extends GraphQLScalarTypeConfig = ResolversObject<{ +export type ClaimResolvers = ResolversObject<{ id?: Resolver; creation?: Resolver; tokenID?: Resolver; @@ -1396,7 +1396,7 @@ export type ClaimResolvers; }>; -export type ClaimTokenResolvers = ResolversObject<{ +export type ClaimTokenResolvers = ResolversObject<{ id?: Resolver; tokenID?: Resolver; claim?: Resolver; @@ -1411,7 +1411,7 @@ export interface Int8ScalarConfig extends GraphQLScalarTypeConfig = ResolversObject<{ +export type OfferResolvers = ResolversObject<{ id?: Resolver; fractionID?: Resolver; unitsAvailable?: Resolver; @@ -1422,7 +1422,7 @@ export type OfferResolvers; }>; -export type TokenResolvers = ResolversObject<{ +export type TokenResolvers = ResolversObject<{ id?: Resolver; name?: Resolver; symbol?: Resolver, ParentType, ContextType>; @@ -1430,7 +1430,7 @@ export type TokenResolvers; }>; -export type TradeResolvers = ResolversObject<{ +export type TradeResolvers = ResolversObject<{ id?: Resolver; buyer?: Resolver; offerID?: Resolver; @@ -1440,21 +1440,21 @@ export type TradeResolvers; }>; -export type _Block_Resolvers = ResolversObject<{ +export type _Block_Resolvers = ResolversObject<{ hash?: Resolver, ParentType, ContextType>; number?: Resolver; timestamp?: Resolver, ParentType, ContextType>; __isTypeOf?: IsTypeOfResolverFn; }>; -export type _Meta_Resolvers = ResolversObject<{ +export type _Meta_Resolvers = ResolversObject<{ block?: Resolver; deployment?: Resolver; hasIndexingErrors?: Resolver; __isTypeOf?: IsTypeOfResolverFn; }>; -export type Resolvers = ResolversObject<{ +export type Resolvers = ResolversObject<{ Query?: QueryResolvers; Subscription?: SubscriptionResolvers; AcceptedToken?: AcceptedTokenResolvers; @@ -1472,7 +1472,7 @@ export type Resolvers; }>; -export type DirectiveResolvers = ResolversObject<{ +export type DirectiveResolvers = ResolversObject<{ entity?: entityDirectiveResolver; subgraphId?: subgraphIdDirectiveResolver; derivedFrom?: derivedFromDirectiveResolver; @@ -1522,7 +1522,7 @@ const additionalEnvelopPlugins: MeshPlugin[] = []; const hypercertsTransforms = []; const hypercertsHandler = new GraphqlHandler({ name: "Hypercerts", - config: {"endpoint":"{context.graphUrl:https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet}"}, + config: {"endpoint":"https://api.thegraph.com/subgraphs/name/hypercerts-admin/{context.graphName:hypercerts-testnet}"}, baseDir, cache, pubsub, diff --git a/sdk/.graphclient/sources/Hypercerts/types.ts b/sdk/.graphclient/sources/Hypercerts/types.ts index f4d8e092..70815082 100644 --- a/sdk/.graphclient/sources/Hypercerts/types.ts +++ b/sdk/.graphclient/sources/Hypercerts/types.ts @@ -1189,6 +1189,6 @@ export type _SubgraphErrorPolicy_ = export type Context = { ["Hypercerts"]: { Query: QuerySdk, Mutation: MutationSdk, Subscription: SubscriptionSdk }, - ["graphUrl"]: Scalars['ID'] + ["graphName"]: Scalars['ID'] }; } diff --git a/sdk/.graphclientrc.yml b/sdk/.graphclientrc.yml index 9087a374..2d6deecf 100644 --- a/sdk/.graphclientrc.yml +++ b/sdk/.graphclientrc.yml @@ -4,7 +4,7 @@ sources: graphql: # Default value is hypercerts-testnet # This is needed for the initial introspection on buildtime - endpoint: "{context.graphUrl:https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet}" + endpoint: https://api.thegraph.com/subgraphs/name/hypercerts-admin/{context.graphName:hypercerts-testnet} additionalTypeDefs: | extend type Claim { @@ -21,7 +21,7 @@ documents: - ./src/indexer/queries/*.graphql codegen: - contextType: "MeshContext & { graphUrl: string, graphName: string }" + contextType: "MeshContext & { graphName: string }" plugins: - pollingLive: diff --git a/sdk/package.json b/sdk/package.json index 9be32db9..fef2c88d 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.0.0-alpha.8", + "version": "1.0.0-alpha.10", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -25,11 +25,11 @@ "dependencies": { "@ethereum-attestation-service/eas-sdk": "1.2.2-beta.0", "@ethersproject/abstract-signer": "^5.7.0", - "@graphprotocol/client-add-source-name": "^1.0.16", + "@graphprotocol/client-add-source-name": "^2.0.0", "@graphprotocol/client-polling-live": "^2.0.0", - "@graphql-mesh/cache-localforage": "^0.95.7", + "@graphql-mesh/cache-localforage": "^0.96.0", "@graphql-mesh/cross-helpers": "^0.4.1", - "@graphql-mesh/graphql": "^0.95.7", + "@graphql-mesh/graphql": "^0.96.0", "@graphql-mesh/http": "^0.96.13", "@graphql-mesh/merger-bare": "^0.95.7", "@graphql-mesh/runtime": "^0.96.12", @@ -37,7 +37,7 @@ "@graphql-mesh/types": "^0.95.7", "@graphql-mesh/utils": "^0.95.7", "@graphql-typed-document-node/core": "^3.2.0", - "@hypercerts-org/contracts": "0.8.11", + "@hypercerts-org/contracts": "1.0.0-alpha.2", "@openzeppelin/merkle-tree": "^1.0.5", "@whatwg-node/fetch": "^0.9.13", "ajv": "^8.11.2", diff --git a/sdk/src/index.ts b/sdk/src/index.ts index 4de15b87..6836893a 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -1,4 +1,4 @@ -import type { HypercertMinter, IHypercertToken } from "@hypercerts-org/contracts"; +import { HypercertMinterAbi, HypercertExchangeAbi } from "@hypercerts-org/contracts"; import { execute } from "../.graphclient"; import HypercertClient from "./client"; @@ -8,7 +8,7 @@ import { DEPLOYMENTS } from "./constants"; /** * Protocol */ -export type { HypercertMinter, IHypercertToken }; +export { HypercertMinterAbi, HypercertExchangeAbi }; export { DEPLOYMENTS as deployments }; /** diff --git a/sdk/src/indexer.ts b/sdk/src/indexer.ts index 337355e5..9ffe5eff 100644 --- a/sdk/src/indexer.ts +++ b/sdk/src/indexer.ts @@ -1,3 +1,4 @@ +import { logger } from "ethers"; import { getBuiltGraphSDK, Sdk as GraphClient } from "../.graphclient"; import { defaultQueryParams } from "./indexer/utils"; import { HypercertClientConfig, HypercertIndexerInterface, QueryParams } from "./types"; @@ -23,8 +24,8 @@ export default class HypercertIndexer implements HypercertIndexerInterface { * @param options The configuration options for the indexer. */ constructor(options: Partial) { + logger.info("Creating HypercertIndexer", "constructor", options); this._graphClient = getBuiltGraphSDK({ - graphUrl: options.graphUrl, graphName: options.graphName, }); } diff --git a/sdk/src/utils/resolvers.ts b/sdk/src/utils/resolvers.ts index 3c52ea6d..c00838ee 100644 --- a/sdk/src/utils/resolvers.ts +++ b/sdk/src/utils/resolvers.ts @@ -2,9 +2,9 @@ import { Resolvers } from "../../.graphclient"; export const resolvers: Resolvers = { Claim: { - graphName: (root, args, context) => context.graphName, // The value we provide in the config + graphName: (root, args, context) => root.graphName || context.graphName || "hypercerts-testnet", // The value we provide in the config }, ClaimToken: { - graphName: (root, args, context) => context.graphName, // The value we provide in the config + graphName: (root, args, context) => root.graphName || context.graphName || "hypercerts-testnet", // The value we provide in the config }, }; diff --git a/sdk/test/client/allowlist.minting.test.ts b/sdk/test/client/allowlist.minting.test.ts index efc6ac2f..fdd398ec 100644 --- a/sdk/test/client/allowlist.minting.test.ts +++ b/sdk/test/client/allowlist.minting.test.ts @@ -2,7 +2,7 @@ import sinon from "sinon"; import { expect } from "@jest/globals"; import { HypercertClient } from "../../src"; -import HypercertsStorage from "../../src/storage.js"; +import HypercertsStorage from "../../src/storage"; import { MalformedDataError, MintingError, TransferRestrictions } from "../../src/types"; import { getAllowlist, getFormattedMetadata, publicClient, walletClient, mockDataSets } from "../helpers"; import { HypercertMinterAbi } from "@hypercerts-org/contracts"; diff --git a/sdk/test/evaluations/evaluator.test.ts b/sdk/test/evaluations/evaluator.test.ts index 542abd21..d79d531f 100644 --- a/sdk/test/evaluations/evaluator.test.ts +++ b/sdk/test/evaluations/evaluator.test.ts @@ -1,10 +1,10 @@ import { expect } from "@jest/globals"; import sinon from "sinon"; -import HypercertEvaluator from "../../src/evaluations/index.js"; -import { MalformedDataError, StorageError } from "../../src/types/errors.js"; -import { HypercertEvaluationSchema } from "../../src/types/evaluation.js"; -import { getEvaluationData, publicClient, walletClient } from "../helpers.js"; +import HypercertEvaluator from "../../src/evaluations"; +import { MalformedDataError, StorageError } from "../../src/types/errors"; +import { HypercertEvaluationSchema } from "../../src/types/evaluation"; +import { getEvaluationData, publicClient, walletClient } from "../helpers"; describe("HypercertEvaluator", () => { const signer = walletClient.account; From 9657f179cdacb609c658006a7cc650c1473aaa6a Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Wed, 22 Nov 2023 19:43:07 +0100 Subject: [PATCH 020/118] feat(merkle): account allowlist strategy (#1186) --- .../StrategyCollectionOffer.sol | 43 ++++++- .../CollectionOffers.t.sol | 119 +++++++++++++++++- .../marketplace/utils/ProtocolHelpers.sol | 2 +- 3 files changed, 161 insertions(+), 3 deletions(-) diff --git a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol index 9f0d04bf..19a61aee 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; @@ -98,6 +98,46 @@ contract StrategyCollectionOffer is BaseStrategy { } } + /** + * @notice This function validates the order under the context of the chosen strategy + * and returns the fulfillable items/amounts/price/nonce invalidation status. + * This strategy executes a collection offer against a taker ask order with the need of a merkle proof + * that the address is allowed to fullfil the ask. + * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) + * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) + * @dev The transaction reverts if the maker does not include a merkle root in the additionalParameters. + */ + function executeCollectionStrategyWithTakerAskWithAllowlist( + OrderStructs.Taker calldata takerAsk, + OrderStructs.Maker calldata makerBid + ) + external + pure + returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) + { + price = makerBid.price; + amounts = makerBid.amounts; + + // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary + if (amounts.length != 1) { + revert OrderInvalid(); + } + + (uint256 offeredItemId, bytes32[] memory proof) = + abi.decode(takerAsk.additionalParameters, (uint256, bytes32[])); + itemIds = new uint256[](1); + itemIds[0] = offeredItemId; + isNonceInvalidated = true; + + bytes32 root = abi.decode(makerBid.additionalParameters, (bytes32)); + bytes32 node = keccak256(abi.encodePacked(takerAsk.recipient)); + + // Verify the merkle root for the given merkle proof + if (!MerkleProofMemory.verify(proof, root, node)) { + revert MerkleProofInvalid(); + } + } + /** * @inheritdoc IStrategy */ @@ -110,6 +150,7 @@ contract StrategyCollectionOffer is BaseStrategy { if ( functionSelector != StrategyCollectionOffer.executeCollectionStrategyWithTakerAskWithProof.selector && functionSelector != StrategyCollectionOffer.executeCollectionStrategyWithTakerAsk.selector + && functionSelector != StrategyCollectionOffer.executeCollectionStrategyWithTakerAskWithAllowlist.selector ) { return (isValid, FunctionSelectorInvalid.selector); } diff --git a/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol index 9f9efa3f..a147ede7 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Murky (third-party) library is used to compute Merkle trees in Solidity import {Merkle} from "murky/Merkle.sol"; @@ -35,6 +35,8 @@ contract CollectionOrdersTest is ProtocolBase { StrategyCollectionOffer public strategyCollectionOffer; bytes4 public selectorNoProof = strategyCollectionOffer.executeCollectionStrategyWithTakerAsk.selector; bytes4 public selectorWithProof = strategyCollectionOffer.executeCollectionStrategyWithTakerAskWithProof.selector; + bytes4 public selectorWithProofAllowlist = + strategyCollectionOffer.executeCollectionStrategyWithTakerAskWithAllowlist.selector; uint256 private constant price = 1 ether; // Fixed price of sale bytes32 private constant mockMerkleRoot = bytes32(keccak256("Mock")); // Mock merkle root @@ -48,6 +50,7 @@ contract CollectionOrdersTest is ProtocolBase { strategyCollectionOffer = new StrategyCollectionOffer(); _addStrategy(address(strategyCollectionOffer), selectorNoProof, true); _addStrategy(address(strategyCollectionOffer), selectorWithProof, true); + _addStrategy(address(strategyCollectionOffer), selectorWithProofAllowlist, true); } function testNewStrategies() public { @@ -169,6 +172,8 @@ contract CollectionOrdersTest is ProtocolBase { /** * A collection offer with merkle tree criteria + * + * COLLECTION TOKEN IDs */ function testTakerAskCollectionOrderWithMerkleTreeERC721() public { _setUpUsers(); @@ -255,6 +260,97 @@ contract CollectionOrdersTest is ProtocolBase { looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); } + /** + * TAKER ALLOWLIST + */ + function testTakerAskCollectionOrderWithMerkleTreeERC721AccountAllowlist() public { + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 3, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 // Not used + }); + + address accountInMerkleTree = takerUser; + uint256 tokenIdInMerkleTree = 2; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ + owner: takerUser, + numberOfAccountsInMerkleTree: 5, + accountInMerkleTree: accountInMerkleTree + }); + + makerBid.additionalParameters = abi.encode(merkleRoot); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(tokenIdInMerkleTree, proof)); + + // Verify validity of maker bid order + _assertOrderIsValid(makerBid, true); + _assertValidMakerOrder(makerBid, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerAsk(makerBid, tokenIdInMerkleTree); + } + + function testTakerAskCannotExecuteWithInvalidProofAccountAllowlist(uint256 itemIdSold) public { + vm.assume(itemIdSold > 5); + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 3, + collectionType: CollectionType.ERC721, + orderNonce: 0, + collection: address(mockERC721), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 // Not used + }); + + address accountInMerkleTree = takerUser; + uint256 tokenIdInMerkleTree = 2; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ + owner: takerUser, + numberOfAccountsInMerkleTree: 5, + // Doesn't matter what itemIdInMerkleTree is as we are are going to tamper with the proof + accountInMerkleTree: accountInMerkleTree + }); + makerBid.additionalParameters = abi.encode(merkleRoot); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Prepare the taker ask + proof[0] = bytes32(0); // Tamper with the proof + OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(tokenIdInMerkleTree, proof)); + + // Verify validity of maker bid order + _assertOrderIsValid(makerBid, true); + _assertValidMakerOrder(makerBid, signature); + + vm.prank(takerUser); + vm.expectRevert(MerkleProofInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + function testInvalidAmounts() public { _setUpUsers(); @@ -433,6 +529,27 @@ contract CollectionOrdersTest is ProtocolBase { assertTrue(m.verifyProof(merkleRoot, proof, merkleTreeIds[itemIdInMerkleTree])); } + function _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist( + address owner, + uint256 numberOfAccountsInMerkleTree, + address accountInMerkleTree + ) private returns (bytes32 merkleRoot, bytes32[] memory proof) { + // Initialize Merkle Tree + Merkle m = new Merkle(); + + bytes32[] memory merkleTreeAccounts = new bytes32[](numberOfAccountsInMerkleTree); + for (uint256 i; i < numberOfAccountsInMerkleTree; i++) { + mockERC721.mint(owner, i); + merkleTreeAccounts[i] = keccak256(abi.encodePacked(accountInMerkleTree)); + } + + // Compute merkle root + merkleRoot = m.getRoot(merkleTreeAccounts); + proof = m.getProof(merkleTreeAccounts, 2); + + assertTrue(m.verifyProof(merkleRoot, proof, merkleTreeAccounts[0])); + } + function _assertSuccessfulTakerAsk(OrderStructs.Maker memory makerBid, uint256 tokenId) private { // Taker user has received the asset assertEq(mockERC721.ownerOf(tokenId), makerUser); diff --git a/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol b/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol index a8c092b6..51c55d94 100644 --- a/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol +++ b/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol @@ -1,5 +1,5 @@ /// SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Dependencies import {BatchOrderTypehashRegistry} from "@hypercerts/marketplace/BatchOrderTypehashRegistry.sol"; From 5623583551897d1317b4584d08fe988e7336c951 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Fri, 24 Nov 2023 19:54:57 +0100 Subject: [PATCH 021/118] Added strategy and tests for hypercert functionality (#1188) * feat(fractions): added strategy and tests * feat(tests): update tests and tweak strat * feat(test): fix all the test and clean comms * fix(dist): moar contracts * fix(tweak): little cleanups * chore(lint): fix lint errors * fix(lint): updated foundry lint --- contracts/hardhat.config.ts | 3 + contracts/package.json | 4 +- .../deployment-marketplace-goerli.json | 1309 +---------------- contracts/src/index.ts | 40 +- .../src/marketplace/ExecutionManager.sol | 7 +- .../src/marketplace/LooksRareProtocol.sol | 36 +- contracts/src/marketplace/TransferManager.sol | 43 +- .../src/marketplace/TransferSelectorNFT.sol | 27 +- .../src/marketplace/enums/CollectionType.sol | 3 +- .../executionStrategies/BaseStrategy.sol | 2 +- .../StrategyCollectionOffer.sol | 9 +- .../StrategyDutchAuction.sol | 2 +- .../StrategyHypercertFractionOffer.sol | 199 +++ .../StrategyItemIdsRange.sol | 3 +- .../marketplace/helpers/OrderValidatorV2A.sol | 1 - .../libraries/LowLevelHypercertCaller.sol | 42 + .../OpenZeppelin/MerkleProofMemory.sol | 1 - .../marketplace/libraries/OrderStructs.sol | 4 +- contracts/tasks/deploy-marketplace.ts | 102 +- .../DelegationRecipientsTaker.t.sol | 5 +- .../marketplace/ExecutionManager.t.sol | 73 +- .../marketplace/NonceInvalidation.t.sol | 4 +- .../marketplace/OrderValidatorV2A.t.sol | 7 +- .../foundry/marketplace/ProtocolBase.t.sol | 10 +- .../SignaturesERC1271WalletForERC1155.t.sol | 29 +- .../SignaturesERC1271WalletForERC721.t.sol | 15 +- .../SignaturesERC1271WalletForHypercert.t.sol | 29 +- .../marketplace/StandardTransactions.t.sol | 5 +- .../StandardTransactionsHypercerts.t.sol | 5 +- .../HypercertFractionOffers.t.sol | 470 ++++++ .../MultiFillCollectionOrders.t.sol | 2 +- .../marketplace/utils/EIP712MerkleTree.sol | 43 +- .../api/contracts/forge-std/src/console2.md | 3 + .../contracts/marketplace/ExecutionManager.md | 2 +- .../contracts/marketplace/TransferManager.md | 46 +- .../marketplace/TransferSelectorNFT.md | 2 +- .../StrategyCollectionOffer.md | 28 +- .../StrategyHypercertFractionOffer.md | 107 ++ .../libraries/LowLevelHypercertCaller.md | 21 + 39 files changed, 1196 insertions(+), 1547 deletions(-) create mode 100644 contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol create mode 100644 contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol create mode 100644 contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol create mode 100644 docs/docs/developer/api/contracts/forge-std/src/console2.md create mode 100644 docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md create mode 100644 docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 05295953..656e359b 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -115,6 +115,9 @@ const config: HardhatUserConfig = { "OrderValidatorV2A", "StrategyManager", "TransferManager", + "StrategyCollectionOffer", + "StrategyHypercertFractionOffer", + "CreatorFeeManagerWithRoyalties", ], except: ["@openzeppelin"], }, diff --git a/contracts/package.json b/contracts/package.json index 5323621d..0d16c149 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@hypercerts-org/contracts", "description": "EVM compatible protocol for managing impact claims", - "version": "1.0.0-alpha.2", + "version": "1.0.0-alpha.4", "author": { "name": "Hypercerts Foundation", "url": "https://github.com/hypercerts-org/hypercerts" @@ -98,7 +98,7 @@ "deploy:marketplace:dryrun": "forge script scripts/deployment/Deployment.s.sol:Deployment --fork-url", "docs": "hardhat dodoc", "lint": "pnpm lint:sol && pnpm prettier:check", - "lint:sol": "forge fmt --check && solhint \"./{src,test/protocol,test/marketplace}/**/*.sol\"", + "lint:sol": "forge fmt --check && solhint \"./{src,test/foundry/protocol,test/foundry/marketplace}/**/*.sol\"", "prepublish": "pnpm build", "prettier": "prettier --config \"./.prettierrc.yml\" --write \"**/*.{json,md,ts,yml}\"", "prettier:check": "prettier --config \"./.prettierrc.yml\" --check \"**/*.{json,md,ts,yml}\"", diff --git a/contracts/src/deployments/deployment-marketplace-goerli.json b/contracts/src/deployments/deployment-marketplace-goerli.json index 895cada6..58ac0626 100644 --- a/contracts/src/deployments/deployment-marketplace-goerli.json +++ b/contracts/src/deployments/deployment-marketplace-goerli.json @@ -1,1296 +1,49 @@ { - "hypercerts-exchange": { - "address": "0x483e634b79A933CDf369c46f6138a781B7495233", - "abi": [ - { - "inputs": [ - { "internalType": "address", "name": "_owner", "type": "address" }, - { "internalType": "address", "name": "_protocolFeeRecipient", "type": "address" }, - { "internalType": "address", "name": "_transferManager", "type": "address" }, - { "internalType": "address", "name": "_weth", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { "inputs": [], "name": "CallerInvalid", "type": "error" }, - { "inputs": [], "name": "ChainIdInvalid", "type": "error" }, - { "inputs": [], "name": "CreatorFeeBpTooHigh", "type": "error" }, - { "inputs": [], "name": "CurrencyInvalid", "type": "error" }, - { "inputs": [], "name": "ERC20TransferFromFail", "type": "error" }, - { "inputs": [], "name": "LengthsInvalid", "type": "error" }, - { "inputs": [], "name": "MerkleProofInvalid", "type": "error" }, - { - "inputs": [{ "internalType": "uint256", "name": "length", "type": "uint256" }], - "name": "MerkleProofTooLarge", - "type": "error" - }, - { "inputs": [], "name": "NewGasLimitETHTransferTooLow", "type": "error" }, - { "inputs": [], "name": "NewProtocolFeeRecipientCannotBeNullAddress", "type": "error" }, - { "inputs": [], "name": "NoOngoingTransferInProgress", "type": "error" }, - { "inputs": [], "name": "NoSelectorForStrategy", "type": "error" }, - { "inputs": [], "name": "NoncesInvalid", "type": "error" }, - { "inputs": [], "name": "NotAContract", "type": "error" }, - { "inputs": [], "name": "NotOwner", "type": "error" }, - { "inputs": [], "name": "NotV2Strategy", "type": "error" }, - { "inputs": [], "name": "NullSignerAddress", "type": "error" }, - { "inputs": [], "name": "OutsideOfTimeRange", "type": "error" }, - { "inputs": [], "name": "QuoteTypeInvalid", "type": "error" }, - { "inputs": [], "name": "ReentrancyFail", "type": "error" }, - { "inputs": [], "name": "RenouncementNotInProgress", "type": "error" }, - { "inputs": [], "name": "SameDomainSeparator", "type": "error" }, - { "inputs": [], "name": "SignatureEOAInvalid", "type": "error" }, - { "inputs": [], "name": "SignatureERC1271Invalid", "type": "error" }, - { - "inputs": [{ "internalType": "uint256", "name": "length", "type": "uint256" }], - "name": "SignatureLengthInvalid", - "type": "error" - }, - { "inputs": [], "name": "SignatureParameterSInvalid", "type": "error" }, - { - "inputs": [{ "internalType": "uint8", "name": "v", "type": "uint8" }], - "name": "SignatureParameterVInvalid", - "type": "error" - }, - { "inputs": [], "name": "StrategyHasNoSelector", "type": "error" }, - { - "inputs": [{ "internalType": "uint256", "name": "strategyId", "type": "uint256" }], - "name": "StrategyNotAvailable", - "type": "error" - }, - { "inputs": [], "name": "StrategyNotUsed", "type": "error" }, - { "inputs": [], "name": "StrategyProtocolFeeTooHigh", "type": "error" }, - { "inputs": [], "name": "TransferAlreadyInProgress", "type": "error" }, - { "inputs": [], "name": "TransferNotInProgress", "type": "error" }, - { "inputs": [], "name": "UnsupportedCollectionType", "type": "error" }, - { "inputs": [], "name": "WrongPotentialOwner", "type": "error" }, - { "anonymous": false, "inputs": [], "name": "CancelOwnershipTransfer", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, - { "indexed": false, "internalType": "bool", "name": "isAllowed", "type": "bool" } - ], - "name": "CurrencyStatusUpdated", - "type": "event" - }, - { "anonymous": false, "inputs": [], "name": "InitiateOwnershipRenouncement", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "potentialOwner", "type": "address" } - ], - "name": "InitiateOwnershipTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "bidNonce", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "askNonce", "type": "uint256" } - ], - "name": "NewBidAskNonces", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "creatorFeeManager", "type": "address" }], - "name": "NewCreatorFeeManager", - "type": "event" - }, - { "anonymous": false, "inputs": [], "name": "NewDomainSeparator", "type": "event" }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "gasLimitETHTransfer", "type": "uint256" }], - "name": "NewGasLimitETHTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "maxCreatorFeeBp", "type": "uint256" }], - "name": "NewMaxCreatorFeeBp", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "NewOwner", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "protocolFeeRecipient", "type": "address" }], - "name": "NewProtocolFeeRecipient", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "indexed": false, "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, - { "indexed": false, "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, - { "indexed": false, "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, - { "indexed": false, "internalType": "bytes4", "name": "selector", "type": "bytes4" }, - { "indexed": false, "internalType": "bool", "name": "isMakerBid", "type": "bool" }, - { "indexed": false, "internalType": "address", "name": "implementation", "type": "address" } - ], - "name": "NewStrategy", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "uint256[]", "name": "orderNonces", "type": "uint256[]" } - ], - "name": "OrderNoncesCancelled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "indexed": false, "internalType": "bool", "name": "isActive", "type": "bool" }, - { "indexed": false, "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, - { "indexed": false, "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" } - ], - "name": "StrategyUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "uint256[]", "name": "subsetNonces", "type": "uint256[]" } - ], - "name": "SubsetNoncesCancelled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "components": [ - { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } - ], - "indexed": false, - "internalType": "struct ILooksRareProtocol.NonceInvalidationParameters", - "name": "nonceInvalidationParameters", - "type": "tuple" - }, - { "indexed": false, "internalType": "address", "name": "askUser", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "bidUser", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "collection", "type": "address" }, - { "indexed": false, "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "indexed": false, "internalType": "address[2]", "name": "feeRecipients", "type": "address[2]" }, - { "indexed": false, "internalType": "uint256[3]", "name": "feeAmounts", "type": "uint256[3]" } - ], - "name": "TakerAsk", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "components": [ - { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } - ], - "indexed": false, - "internalType": "struct ILooksRareProtocol.NonceInvalidationParameters", - "name": "nonceInvalidationParameters", - "type": "tuple" - }, - { "indexed": false, "internalType": "address", "name": "bidUser", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "bidRecipient", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "collection", "type": "address" }, - { "indexed": false, "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "indexed": false, "internalType": "address[2]", "name": "feeRecipients", "type": "address[2]" }, - { "indexed": false, "internalType": "uint256[3]", "name": "feeAmounts", "type": "uint256[3]" } - ], - "name": "TakerBid", - "type": "event" - }, - { - "inputs": [], - "name": "MAGIC_VALUE_ORDER_NONCE_EXECUTED", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "WETH", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, - { "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, - { "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, - { "internalType": "bytes4", "name": "selector", "type": "bytes4" }, - { "internalType": "bool", "name": "isMakerBid", "type": "bool" }, - { "internalType": "address", "name": "implementation", "type": "address" } - ], - "name": "addStrategy", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256[]", "name": "orderNonces", "type": "uint256[]" }], - "name": "cancelOrderNonces", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "cancelOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256[]", "name": "subsetNonces", "type": "uint256[]" }], - "name": "cancelSubsetNonces", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "chainId", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "confirmOwnershipRenouncement", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "confirmOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "creatorFeeManager", - "outputs": [{ "internalType": "contract ICreatorFeeManager", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "domainSeparator", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker[]", - "name": "takerBids", - "type": "tuple[]" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker[]", - "name": "makerAsks", - "type": "tuple[]" - }, - { "internalType": "bytes[]", "name": "makerSignatures", "type": "bytes[]" }, - { - "components": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { - "components": [ - { "internalType": "bytes32", "name": "value", "type": "bytes32" }, - { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } - ], - "internalType": "struct OrderStructs.MerkleTreeNode[]", - "name": "proof", - "type": "tuple[]" - } - ], - "internalType": "struct OrderStructs.MerkleTree[]", - "name": "merkleTrees", - "type": "tuple[]" - }, - { "internalType": "bool", "name": "isAtomic", "type": "bool" } - ], - "name": "executeMultipleTakerBids", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker", - "name": "takerAsk", - "type": "tuple" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerBid", - "type": "tuple" - }, - { "internalType": "bytes", "name": "makerSignature", "type": "bytes" }, - { - "components": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { - "components": [ - { "internalType": "bytes32", "name": "value", "type": "bytes32" }, - { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } - ], - "internalType": "struct OrderStructs.MerkleTreeNode[]", - "name": "proof", - "type": "tuple[]" - } - ], - "internalType": "struct OrderStructs.MerkleTree", - "name": "merkleTree", - "type": "tuple" - } - ], - "name": "executeTakerAsk", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker", - "name": "takerBid", - "type": "tuple" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerAsk", - "type": "tuple" - }, - { "internalType": "bytes", "name": "makerSignature", "type": "bytes" }, - { - "components": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { - "components": [ - { "internalType": "bytes32", "name": "value", "type": "bytes32" }, - { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } - ], - "internalType": "struct OrderStructs.MerkleTreeNode[]", - "name": "proof", - "type": "tuple[]" - } - ], - "internalType": "struct OrderStructs.MerkleTree", - "name": "merkleTree", - "type": "tuple" - } - ], - "name": "executeTakerBid", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { "internalType": "uint256", "name": "proofLength", "type": "uint256" } - ], - "name": "hashBatchOrder", - "outputs": [{ "internalType": "bytes32", "name": "batchOrderHash", "type": "bytes32" }], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bool", "name": "bid", "type": "bool" }, - { "internalType": "bool", "name": "ask", "type": "bool" } - ], - "name": "incrementBidAskNonces", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "initiateOwnershipRenouncement", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newPotentialOwner", "type": "address" }], - "name": "initiateOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "isCurrencyAllowed", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxCreatorFeeBp", - "outputs": [{ "internalType": "uint16", "name": "", "type": "uint16" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ownershipStatus", - "outputs": [{ "internalType": "enum IOwnableTwoSteps.Status", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "potentialOwner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "protocolFeeRecipient", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker", - "name": "takerBid", - "type": "tuple" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerAsk", - "type": "tuple" - }, - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" } - ], - "name": "restrictedExecuteTakerBid", - "outputs": [{ "internalType": "uint256", "name": "protocolFeeAmount", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "strategyInfo", - "outputs": [ - { "internalType": "bool", "name": "isActive", "type": "bool" }, - { "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, - { "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, - { "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, - { "internalType": "bytes4", "name": "selector", "type": "bytes4" }, - { "internalType": "bool", "name": "isMakerBid", "type": "bool" }, - { "internalType": "address", "name": "implementation", "type": "address" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "transferManager", - "outputs": [{ "internalType": "contract TransferManager", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newCreatorFeeManager", "type": "address" }], - "name": "updateCreatorFeeManager", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "bool", "name": "isAllowed", "type": "bool" } - ], - "name": "updateCurrencyStatus", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "updateDomainSeparator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "newGasLimitETHTransfer", "type": "uint256" }], - "name": "updateETHGasLimitForTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint16", "name": "newMaxCreatorFeeBp", "type": "uint16" }], - "name": "updateMaxCreatorFeeBp", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newProtocolFeeRecipient", "type": "address" }], - "name": "updateProtocolFeeRecipient", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "bool", "name": "isActive", "type": "bool" }, - { "internalType": "uint16", "name": "newStandardProtocolFee", "type": "uint16" }, - { "internalType": "uint16", "name": "newMinTotalFee", "type": "uint16" } - ], - "name": "updateStrategy", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "userBidAskNonces", - "outputs": [ - { "internalType": "uint256", "name": "bidNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "askNonce", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "name": "userOrderNonce", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "name": "userSubsetNonce", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - } - ], + "HypercertsExchange": { + "address": "0x89524d8a0B1D7742579A7d8AE46D7679a4de1198", "fullNamespace": "LooksRareProtocol", "args": [ "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", - "0x67B32834610E5cE95Cf8a4d5Bc90e43E09121409", - "0x7AAC4C1407f5F83256581eCc913dC8b20F7bdab1", + "0xfB4A7359d3767781dB5dF63789c478E2F007bD6A", + "0x61eDE0F0CaD4D51Df761DccDaB08B57e6Cb8f712", "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6" ], - "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a67b32834610e5ce95cf8a4d5bc90e43e091214097aac4c1407f5f83256581ecc913dc8b20f7bdab1b4fbf271143f4fbf7b91a5ded31805e42b2208d6", - "tx": "0xc52cf3d6507a29dc6ddcfe36eea4baa8425d199c3315cb1f5b971780c7c56537" + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199afb4a7359d3767781db5df63789c478e2f007bd6a61ede0f0cad4d51df761dccdab08b57e6cb8f712b4fbf271143f4fbf7b91a5ded31805e42b2208d6", + "tx": "0x97facbd3ee5637e05b2b49d6535d2cc8e5a6607d16e728922bc5890cf76d0a86" }, - "transfer-manager": { - "address": "0x7AAC4C1407f5F83256581eCc913dC8b20F7bdab1", - "abi": [ - { - "inputs": [{ "internalType": "address", "name": "_owner", "type": "address" }], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { "inputs": [], "name": "AmountInvalid", "type": "error" }, - { "inputs": [], "name": "ERC1155SafeBatchTransferFromFail", "type": "error" }, - { "inputs": [], "name": "ERC1155SafeTransferFromFail", "type": "error" }, - { "inputs": [], "name": "ERC721TransferFromFail", "type": "error" }, - { "inputs": [], "name": "LengthsInvalid", "type": "error" }, - { "inputs": [], "name": "NoOngoingTransferInProgress", "type": "error" }, - { "inputs": [], "name": "NotAContract", "type": "error" }, - { "inputs": [], "name": "NotOwner", "type": "error" }, - { "inputs": [], "name": "OperatorAlreadyAllowed", "type": "error" }, - { "inputs": [], "name": "OperatorAlreadyApprovedByUser", "type": "error" }, - { "inputs": [], "name": "OperatorNotAllowed", "type": "error" }, - { "inputs": [], "name": "OperatorNotApprovedByUser", "type": "error" }, - { "inputs": [], "name": "RenouncementNotInProgress", "type": "error" }, - { "inputs": [], "name": "TransferAlreadyInProgress", "type": "error" }, - { "inputs": [], "name": "TransferCallerInvalid", "type": "error" }, - { "inputs": [], "name": "TransferNotInProgress", "type": "error" }, - { "inputs": [], "name": "WrongPotentialOwner", "type": "error" }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "address[]", "name": "operators", "type": "address[]" } - ], - "name": "ApprovalsGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "address[]", "name": "operators", "type": "address[]" } - ], - "name": "ApprovalsRemoved", - "type": "event" - }, - { "anonymous": false, "inputs": [], "name": "CancelOwnershipTransfer", "type": "event" }, - { "anonymous": false, "inputs": [], "name": "InitiateOwnershipRenouncement", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "potentialOwner", "type": "address" } - ], - "name": "InitiateOwnershipTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "NewOwner", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "operator", "type": "address" }], - "name": "OperatorAllowed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "operator", "type": "address" }], - "name": "OperatorRemoved", - "type": "event" - }, - { - "inputs": [{ "internalType": "address", "name": "operator", "type": "address" }], - "name": "allowOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "cancelOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "confirmOwnershipRenouncement", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "confirmOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address[]", "name": "operators", "type": "address[]" }], - "name": "grantApprovals", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "address", "name": "", "type": "address" } - ], - "name": "hasUserApprovedOperator", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "initiateOwnershipRenouncement", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newPotentialOwner", "type": "address" }], - "name": "initiateOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "isOperatorAllowed", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ownershipStatus", - "outputs": [{ "internalType": "enum IOwnableTwoSteps.Status", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "potentialOwner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "operator", "type": "address" }], - "name": "removeOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address[]", "name": "operators", "type": "address[]" }], - "name": "revokeApprovals", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } - ], - "internalType": "struct ITransferManager.BatchTransferItem[]", - "name": "items", - "type": "tuple[]" - }, - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" } - ], - "name": "transferBatchItemsAcrossCollections", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } - ], - "name": "transferItemsERC1155", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } - ], - "name": "transferItemsERC721", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } - ], - "name": "transferItemsHyperboard", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } - ], - "name": "transferItemsHypercert", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], + "ProtocolFeeRecipient": { + "address": "0xfB4A7359d3767781dB5dF63789c478E2F007bD6A", + "fullNamespace": "ProtocolFeeRecipient", + "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6"], + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199ab4fbf271143f4fbf7b91a5ded31805e42b2208d6", + "tx": "0xbdfdcec3db949405f2531ed0d1ef1c3fcf43d127be8ff7bbb51c27a466349c50" + }, + "TransferManager": { + "address": "0x61eDE0F0CaD4D51Df761DccDaB08B57e6Cb8f712", "fullNamespace": "TransferManager", "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a"], "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", - "tx": "0xd16227c67ac0445f22865cfedbebb3599ae80bb3d21146b63a09e657b2ae7f66" + "tx": "0xa16188ed346db49d99d5d2005214084fc15a09843a20a20f6b8532ae65b50530" }, - "order-validator": { - "address": "0xbad0897927a2333c1c4c440c679c634ffbfd9c71", - "abi": [ - { - "inputs": [{ "internalType": "address", "name": "_looksRareProtocol", "type": "address" }], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "CRITERIA_GROUPS", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ERC1155_INTERFACE_ID", - "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ERC721_INTERFACE_ID_1", - "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ERC721_INTERFACE_ID_2", - "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAGIC_VALUE_ORDER_NONCE_EXECUTED", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerOrder", - "type": "tuple" - }, - { "internalType": "bytes", "name": "signature", "type": "bytes" }, - { - "components": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { - "components": [ - { "internalType": "bytes32", "name": "value", "type": "bytes32" }, - { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } - ], - "internalType": "struct OrderStructs.MerkleTreeNode[]", - "name": "proof", - "type": "tuple[]" - } - ], - "internalType": "struct OrderStructs.MerkleTree", - "name": "merkleTree", - "type": "tuple" - } - ], - "name": "checkMakerOrderValidity", - "outputs": [{ "internalType": "uint256[9]", "name": "validationCodes", "type": "uint256[9]" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker[]", - "name": "makerOrders", - "type": "tuple[]" - }, - { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }, - { - "components": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { - "components": [ - { "internalType": "bytes32", "name": "value", "type": "bytes32" }, - { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } - ], - "internalType": "struct OrderStructs.MerkleTreeNode[]", - "name": "proof", - "type": "tuple[]" - } - ], - "internalType": "struct OrderStructs.MerkleTree[]", - "name": "merkleTrees", - "type": "tuple[]" - } - ], - "name": "checkMultipleMakerOrderValidities", - "outputs": [{ "internalType": "uint256[9][]", "name": "validationCodes", "type": "uint256[9][]" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "creatorFeeManager", - "outputs": [{ "internalType": "contract ICreatorFeeManager", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "deriveProtocolParameters", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "domainSeparator", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "looksRareProtocol", - "outputs": [{ "internalType": "contract LooksRareProtocol", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxCreatorFeeBp", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "transferManager", - "outputs": [{ "internalType": "contract TransferManager", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - } - ], + "OrderValidator": { + "address": "0x51c9277d2b3e7ae460eb710053367bfe3872027b", "fullNamespace": "OrderValidatorV2A", - "args": ["0x483e634b79A933CDf369c46f6138a781B7495233"], - "encodedArgs": "0x483e634b79a933cdf369c46f6138a781b7495233", - "tx": "0xc417e2d30504a983d1898f357edec96e8d41af6ec63072ed732c6b4f469ab370" + "args": ["0x89524d8a0B1D7742579A7d8AE46D7679a4de1198"], + "encodedArgs": "0x89524d8a0b1d7742579a7d8ae46d7679a4de1198", + "tx": "0xa245695a4f6be256e68b83f1cd1f2503106126894053812ad6297f412a74359d" }, - "strategy-collection-offer": { - "address": "0x9874463e1821d8f8de3eb84fc91e7c10e14bfa83", - "abi": [ - { "inputs": [], "name": "MerkleProofInvalid", "type": "error" }, - { "inputs": [], "name": "OrderInvalid", "type": "error" }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker", - "name": "takerAsk", - "type": "tuple" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerBid", - "type": "tuple" - } - ], - "name": "executeCollectionStrategyWithTakerAsk", - "outputs": [ - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker", - "name": "takerAsk", - "type": "tuple" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerBid", - "type": "tuple" - } - ], - "name": "executeCollectionStrategyWithTakerAskWithProof", - "outputs": [ - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "isLooksRareV2Strategy", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerBid", - "type": "tuple" - }, - { "internalType": "bytes4", "name": "functionSelector", "type": "bytes4" } - ], - "name": "isMakerOrderValid", - "outputs": [ - { "internalType": "bool", "name": "isValid", "type": "bool" }, - { "internalType": "bytes4", "name": "errorSelector", "type": "bytes4" } - ], - "stateMutability": "pure", - "type": "function" - } - ], + "StrategyCollectionOffer": { + "address": "0x947bbd2e69e8d777171139c3fd242638e4e78bf0", + "fullNamespace": "StrategyCollectionOffer", + "args": [], + "encodedArgs": "0x", + "tx": "0x94aaa40fc99eb28853a34160143d5e856f57e323b029dfddd919e46534b8fb17" + }, + "StrategyHypercertFractionOffer": { + "address": "0x9f233a07bd4ce69c0d7ed6553e796dba41892cf6", "fullNamespace": "StrategyCollectionOffer", "args": [], "encodedArgs": "0x", - "tx": "0x2e1065ba99ff70094cd9782d72166f2d0e579052fa0b70749e068cbba008f66c" + "tx": "0xf87db995c8c325a2d2663b51fadbfdc8ac8bb733ae5a0aae58566309a2aff674" } } diff --git a/contracts/src/index.ts b/contracts/src/index.ts index 60bb0fcf..533aab40 100644 --- a/contracts/src/index.ts +++ b/contracts/src/index.ts @@ -5,12 +5,20 @@ import HypercertExchangeAbi from "../abi/src/marketplace/LooksRareProtocol.sol/L import OrderValidatorV2AAbi from "../abi/src/marketplace/helpers/OrderValidatorV2A.sol/OrderValidatorV2A.json"; import StrategyManagerAbi from "../abi/src/marketplace/StrategyManager.sol/StrategyManager.json"; import TransferManagerAbi from "../abi/src/marketplace/TransferManager.sol/TransferManager.json"; +import StrategyCollectionOfferAbi from "../abi/src/marketplace/executionStrategies/StrategyCollectionOffer.sol/StrategyCollectionOffer.json"; +import StrategyHypercertFractionOfferAbi from "../abi/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol/StrategyHypercertFractionOffer.json"; +import CreatorFeeManagerWithRoyaltiesAbi from "../abi/src/marketplace/CreatorFeeManagerWithRoyalties.sol/CreatorFeeManagerWithRoyalties.json"; import { HypercertMinter, IHypercertToken, LooksRareProtocol as HypercertExchange, ILooksRareProtocol as IHypercertExchange, + TransferManager, + StrategyCollectionOffer, + StrategyHypercertFractionOffer, + CreatorFeeManagerWithRoyalties, + OrderValidatorV2A, } from "types"; /* @@ -41,9 +49,9 @@ export type DeployedChains = keyof typeof DEPLOYMENTS.protocol; const deployments = { 5: { ...DEPLOYMENTS.protocol["5"], - HypercertsExchange: DEPLOYMENTS.marketplace[5]["hypercerts-exchange"].address, - TransferManager: DEPLOYMENTS.marketplace[5]["transfer-manager"].address, - OrderValidatorV2A: DEPLOYMENTS.marketplace[5]["order-validator"].address, + HypercertsExchange: DEPLOYMENTS.marketplace[5].HypercertsExchange.address, + TransferManager: DEPLOYMENTS.marketplace[5].TransferManager.address, + OrderValidatorV2A: DEPLOYMENTS.marketplace[5].OrderValidator.address, }, 10: { ...DEPLOYMENTS.protocol["10"], @@ -53,9 +61,6 @@ const deployments = { }, 11155111: { ...DEPLOYMENTS.protocol["11155111"], - HypercertsExchange: DEPLOYMENTS.marketplace[11155111]["hypercerts-exchange"].address, - TransferManager: DEPLOYMENTS.marketplace[11155111]["transfer-manager"].address, - OrderValidatorV2A: DEPLOYMENTS.marketplace[11155111]["order-validator"].address, }, } as Record; @@ -67,7 +72,26 @@ const asDeployedChain = (chainId: string | number) => { export { deployments, asDeployedChain }; // Abis -export { HypercertMinterAbi, HypercertExchangeAbi, OrderValidatorV2AAbi, StrategyManagerAbi, TransferManagerAbi }; +export { + CreatorFeeManagerWithRoyaltiesAbi, + HypercertMinterAbi, + HypercertExchangeAbi, + OrderValidatorV2AAbi, + StrategyManagerAbi, + StrategyCollectionOfferAbi, + StrategyHypercertFractionOfferAbi, + TransferManagerAbi, +}; // Interfaces -export type { IHypercertExchange, IHypercertToken, HypercertExchange, HypercertMinter }; +export type { + CreatorFeeManagerWithRoyalties, + IHypercertExchange, + IHypercertToken, + HypercertExchange, + HypercertMinter, + OrderValidatorV2A, + TransferManager, + StrategyCollectionOffer, + StrategyHypercertFractionOffer, +}; diff --git a/contracts/src/marketplace/ExecutionManager.sol b/contracts/src/marketplace/ExecutionManager.sol index e3e132df..d0b7ace2 100644 --- a/contracts/src/marketplace/ExecutionManager.sol +++ b/contracts/src/marketplace/ExecutionManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Libraries import {OrderStructs} from "./libraries/OrderStructs.sol"; @@ -7,6 +7,7 @@ import {OrderStructs} from "./libraries/OrderStructs.sol"; // Interfaces import {IExecutionManager} from "./interfaces/IExecutionManager.sol"; import {ICreatorFeeManager} from "./interfaces/ICreatorFeeManager.sol"; +import {IHypercertToken} from "../protocol/interfaces/IHypercertToken.sol"; // Direct dependencies import {InheritedStrategy} from "./InheritedStrategy.sol"; @@ -27,13 +28,14 @@ import {ONE_HUNDRED_PERCENT_IN_BP} from "./constants/NumericConstants.sol"; // Enums import {QuoteType} from "./enums/QuoteType.sol"; +import {CollectionType} from "./enums/CollectionType.sol"; /** * @title ExecutionManager * @notice This contract handles the execution and resolution of transactions. A transaction is executed on-chain * when an off-chain maker order is matched by on-chain taker order of a different kind. * For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). - * @author LooksRare protocol team (👀,💎) + * @author LooksRare protocol team (👀,💎); bitbeckers; */ contract ExecutionManager is InheritedStrategy, NonceManager, StrategyManager, IExecutionManager { /** @@ -44,7 +46,6 @@ contract ExecutionManager is InheritedStrategy, NonceManager, StrategyManager, I /** * @notice Maximum creator fee (in basis point). */ - // TODO do we need a max? Is 1% max fair? uint16 public maxCreatorFeeBp = 1000; /** diff --git a/contracts/src/marketplace/LooksRareProtocol.sol b/contracts/src/marketplace/LooksRareProtocol.sol index 59382581..3e1ce7ed 100644 --- a/contracts/src/marketplace/LooksRareProtocol.sol +++ b/contracts/src/marketplace/LooksRareProtocol.sol @@ -16,6 +16,7 @@ import {OrderStructs} from "./libraries/OrderStructs.sol"; // Interfaces import {ILooksRareProtocol} from "./interfaces/ILooksRareProtocol.sol"; +import {IHypercertToken} from "../protocol/interfaces/IHypercertToken.sol"; // Shared errors import { @@ -30,6 +31,7 @@ import { // Direct dependencies import {TransferSelectorNFT} from "./TransferSelectorNFT.sol"; import {BatchOrderTypehashRegistry} from "./BatchOrderTypehashRegistry.sol"; +import {StrategyHypercertFractionOffer} from "./executionStrategies/StrategyHypercertFractionOffer.sol"; // Constants import {MAX_CALLDATA_PROOF_LENGTH, ONE_HUNDRED_PERCENT_IN_BP} from "./constants/NumericConstants.sol"; @@ -442,14 +444,32 @@ contract LooksRareProtocol is _transferToAskRecipientAndCreatorIfAny(recipients, feeAmounts, makerAsk.currency, sender); // Maker action goes second - _transferNFT( - makerAsk.collection, - makerAsk.collectionType, - signer, - takerBid.recipient == address(0) ? sender : takerBid.recipient, - itemIds, - amounts - ); + if ( + ( + strategyInfo[makerAsk.strategyId].selector + == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector + || strategyInfo[makerAsk.strategyId].selector + == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector + ) && (IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[0]) > amounts[0]) + ) { + _splitNFT( + makerAsk.collection, + makerAsk.collectionType, + signer, + takerBid.recipient == address(0) ? sender : takerBid.recipient, + itemIds, + amounts + ); + } else { + _transferNFT( + makerAsk.collection, + makerAsk.collectionType, + signer, + takerBid.recipient == address(0) ? sender : takerBid.recipient, + itemIds, + amounts + ); + } emit TakerBid( NonceInvalidationParameters({ diff --git a/contracts/src/marketplace/TransferManager.sol b/contracts/src/marketplace/TransferManager.sol index 876a084c..697e0f2e 100644 --- a/contracts/src/marketplace/TransferManager.sol +++ b/contracts/src/marketplace/TransferManager.sol @@ -6,9 +6,13 @@ import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSte import {LowLevelERC721Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC721Transfer.sol"; import {LowLevelERC1155Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC1155Transfer.sol"; +// Hypercert low-level callers +import {LowLevelHypercertCaller} from "./libraries/LowLevelHypercertCaller.sol"; + // Interfaces and errors import {ITransferManager} from "./interfaces/ITransferManager.sol"; import {AmountInvalid, LengthsInvalid} from "./errors/SharedErrors.sol"; +import {IHypercertToken} from "../protocol/interfaces/IHypercertToken.sol"; // Libraries import {OrderStructs} from "./libraries/OrderStructs.sol"; @@ -28,8 +32,13 @@ import {CollectionType} from "./enums/CollectionType.sol"; * to verify if the recipient is a contract as it requires verifying the receiver interface is valid. * @author LooksRare protocol team (👀,💎) */ -// TODO Needs to be updated to split a fraction and transfer the new fraction to the bidder -contract TransferManager is ITransferManager, LowLevelERC721Transfer, LowLevelERC1155Transfer, OwnableTwoSteps { +contract TransferManager is + ITransferManager, + LowLevelERC721Transfer, + LowLevelERC1155Transfer, + LowLevelHypercertCaller, + OwnableTwoSteps +{ /** * @notice This returns whether the user has approved the operator address. * The first address is the user and the second address is the operator (e.g. LooksRareProtocol). @@ -167,7 +176,7 @@ contract TransferManager is ITransferManager, LowLevelERC721Transfer, LowLevelER } /** - * @notice This function transfers items for a single Hyperboard. + * @notice This function transfers items for a single Hypercert. * @param collection Collection address * @param from Sender address * @param to Recipient address @@ -175,38 +184,28 @@ contract TransferManager is ITransferManager, LowLevelERC721Transfer, LowLevelER * @param amounts Array of amounts * @dev It does not allow batch transferring if from = msg.sender since native function should be used. */ - function transferItemsHyperboard( + function splitItemsHypercert( address collection, address from, address to, uint256[] calldata itemIds, uint256[] calldata amounts ) external { - uint256 length = itemIds.length; + IHypercertToken hypercert = IHypercertToken(collection); - if (length == 0 || amounts.length != length) { + if (itemIds.length != 1 || amounts.length != 1) { revert LengthsInvalid(); } _isOperatorValidForTransfer(from, msg.sender); - if (length == 1) { - if (amounts[0] == 0) { - revert AmountInvalid(); - } - _executeERC1155SafeTransferFrom(collection, from, to, itemIds[0], amounts[0]); - } else { - for (uint256 i; i < length;) { - if (amounts[i] == 0) { - revert AmountInvalid(); - } - - unchecked { - ++i; - } - } - _executeERC1155SafeBatchTransferFrom(collection, from, to, itemIds, amounts); + if (amounts[0] == 0) { + revert AmountInvalid(); } + uint256[] memory newAmounts = new uint256[](2); + newAmounts[0] = hypercert.unitsOf(itemIds[0]) - amounts[0]; + newAmounts[1] = amounts[0]; + _executeHypercertSplitFraction(collection, from, to, itemIds[0], newAmounts); } /** diff --git a/contracts/src/marketplace/TransferSelectorNFT.sol b/contracts/src/marketplace/TransferSelectorNFT.sol index d0a40b9c..55e0956a 100644 --- a/contracts/src/marketplace/TransferSelectorNFT.sol +++ b/contracts/src/marketplace/TransferSelectorNFT.sol @@ -15,7 +15,7 @@ import {CollectionType} from "./enums/CollectionType.sol"; /** * @title TransferSelectorNFT * @notice This contract handles the logic for transferring non-fungible items. - * @author LooksRare protocol team (👀,💎) + * @author LooksRare protocol team (👀,💎); bitbeckers; */ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { error UnsupportedCollectionType(); @@ -60,8 +60,31 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { transferManager.transferItemsERC1155(collection, sender, recipient, itemIds, amounts); } else if (collectionType == CollectionType.Hypercert) { transferManager.transferItemsHypercert(collection, sender, recipient, itemIds, amounts); - } else if (collectionType == CollectionType.Hyperboard) { + } else { revert UnsupportedCollectionType(); } } + + /** + * @notice This function is internal and used to transfer non-fungible tokens. + * @param collection Collection address + * @param collectionType Collection type (e.g. 0 = ERC721, 1 = ERC1155, 2 = Hypercert) + * @param sender Sender address + * @param recipient Recipient address + * @param itemIds Array of itemIds + * @param amounts Array of amounts + */ + function _splitNFT( + address collection, + CollectionType collectionType, + address sender, + address recipient, + uint256[] memory itemIds, + uint256[] memory amounts + ) internal { + if (collectionType != CollectionType.Hypercert) { + revert UnsupportedCollectionType(); + } + transferManager.splitItemsHypercert(collection, sender, recipient, itemIds, amounts); + } } diff --git a/contracts/src/marketplace/enums/CollectionType.sol b/contracts/src/marketplace/enums/CollectionType.sol index d95a2dc7..8eded297 100644 --- a/contracts/src/marketplace/enums/CollectionType.sol +++ b/contracts/src/marketplace/enums/CollectionType.sol @@ -1,10 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; /** * @notice CollectionType is used in OrderStructs.Maker's collectionType to determine the collection type being traded. */ -//TODO remove 721??? enum CollectionType { ERC721, ERC1155, diff --git a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol index 9d0bec3c..67e40f79 100644 --- a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol +++ b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Interfaces import {IStrategy} from "../interfaces/IStrategy.sol"; diff --git a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol index 19a61aee..1f80d52c 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol @@ -21,14 +21,15 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; * @notice This contract offers execution strategies for users to create maker bid offers for items in a collection. * There are two available functions: * 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection - * 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria. + * 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. + * 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for + * accounts. * @notice The bidder can only bid on 1 item id at a time. * 1. If ERC721, the amount must be 1. * 2. If ERC1155, the amount can be greater than 1. - * @dev Use cases can include trait-based offers or rarity score offers. - * @author LooksRare protocol team (👀,💎) + * 3. If Hypercert, the amount must be 1 (fractions are NFTs) + * @author LooksRare protocol team (👀,💎); bitbeckers */ -// TODO This allows for a buyer to declare a set of items they're willing to buy in a merkle tree contract StrategyCollectionOffer is BaseStrategy { /** * @notice This function validates the order under the context of the chosen strategy and diff --git a/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol b/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol index 3c4fcf27..6dfbfd1f 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol new file mode 100644 index 00000000..dfef144f --- /dev/null +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// Interface +import {IHypercertToken} from "../../protocol/interfaces/IHypercertToken.sol"; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; + +// OpenZeppelin's library for verifying Merkle proofs +import {MerkleProofMemory} from "../libraries/OpenZeppelin/MerkleProofMemory.sol"; + +// Enums +import {QuoteType} from "../enums/QuoteType.sol"; + +// Shared errors +import {OrderInvalid, FunctionSelectorInvalid, MerkleProofInvalid, QuoteTypeInvalid} from "../errors/SharedErrors.sol"; + +// Base strategy contracts +import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; + +/** + * @title StrategyHypercertFractionOffer + * @notice This contract offers a single execution strategy for users to bid on + * a specific amount of units in an hypercerts that's for sale. + * Example: + * Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. + * Bob wants to buy 10 units. + * Bob can create a taker bid order with the following parameters: + * - unitAmount: 10 + * - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) + * - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 + * - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] + * This strategy will validate the available units and the price. + * @notice This contract offers execution strategies for users to create maker bid offers for items in a collection. + * There are three available functions: + * 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection + * 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for + * accounts. + * @notice The bidder can only bid on 1 item id at a time. + * 1. If ERC721, the amount must be 1. + * 2. If ERC1155, the amount can be greater than 1. + * 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. + * @dev Use cases can include trait-based offers or rarity score offers. + * @author LooksRare protocol team (👀,💎); bitbeckers; + */ +contract StrategyHypercertFractionOffer is BaseStrategy { + /** + * @notice This function validates the order under the context of the chosen strategy and + * returns the fulfillable items/amounts/price/nonce invalidation status. + * This strategy executes a collection offer against a taker ask order without the need of merkle proofs. + * @param takerBid Taker ask struct (taker ask-specific parameters for the execution) + * @param makerAsk Maker bid struct (maker bid-specific parameters for the execution) + */ + function executeHypercertFractionStrategyWithTakerBid( + OrderStructs.Taker calldata takerBid, + OrderStructs.Maker calldata makerAsk + ) + external + view + returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) + { + amounts = makerAsk.amounts; + itemIds = makerAsk.itemIds; + + // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary + if (amounts.length != 1 || itemIds.length != 1) { + revert OrderInvalid(); + } + + uint256 tokenBalance = IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]); + + //units, amount, proof[] + (uint256 unitAmount, uint256 acceptedTokenAmount) = + abi.decode(takerBid.additionalParameters, (uint256, uint256)); + + //minUnitAmount, maxUnitAmount, root + (uint256 minUnitAmount, uint256 maxUnitAmount) = abi.decode(makerAsk.additionalParameters, (uint256, uint256)); + + // A collection order can only be executable for 1 itemId but quantity to fill can vary + if ( + makerAsk.amounts.length != 1 || makerAsk.itemIds.length != 1 || minUnitAmount > maxUnitAmount + || unitAmount < minUnitAmount || makerAsk.price > acceptedTokenAmount || makerAsk.price == 0 + || tokenBalance < amounts[0] + ) { + revert OrderInvalid(); + } + + price = acceptedTokenAmount * unitAmount; + + isNonceInvalidated = true; + } + + /** + * @notice This function validates the order under the context of the chosen strategy + * and returns the fulfillable items/amounts/price/nonce invalidation status. + * This strategy executes a fraction offer against a taker bid order with the need of a merkle proof + * that the address is allowed to fullfil the ask. + * @param takerBid Taker bid struct (taker bid-specific parameters for the execution) + * @param makerAsk Maker ask struct (maker ask-specific parameters for the execution) + * @dev The transaction reverts if the maker does not include a merkle root in the additionalParameters. + */ + function executeHypercertFractionStrategyWithTakerBidWithAllowlist( + OrderStructs.Taker calldata takerBid, + OrderStructs.Maker calldata makerAsk + ) + external + pure + returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) + { + itemIds = makerAsk.itemIds; + + // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary + if (makerAsk.amounts.length != 1 || itemIds.length != 1) { + revert OrderInvalid(); + } + + //units, amount, proof[] + (uint256 unitAmount, uint256 pricePerUnit, bytes32[] memory proof) = + abi.decode(takerBid.additionalParameters, (uint256, uint256, bytes32[])); + + // A bid needs to at least match the minimum price per unit + if (pricePerUnit < makerAsk.price) { + revert OrderInvalid(); + } + + price = unitAmount * pricePerUnit; + amounts = new uint256[](1); + amounts[0] = unitAmount; + + // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary + if (amounts.length != 1 || itemIds.length != 1) { + revert OrderInvalid(); + } + + //minUnitAmount, maxUnitAmount, root + (uint256 minUnitAmount, uint256 maxUnitAmount, bytes32 root) = + abi.decode(makerAsk.additionalParameters, (uint256, uint256, bytes32)); + + // Nonce is not invalidated because it can be a partial fill + // @dev This strategy represents a partial fill. The protocol will call transfer if the bid would clear the + // offered fraction. + isNonceInvalidated = false; + + bytes32 node = keccak256(abi.encodePacked(takerBid.recipient)); + + // Verify the merkle root for the given merkle proof + if (!MerkleProofMemory.verify(proof, root, node)) { + revert MerkleProofInvalid(); + } + } + + /** + * @inheritdoc IStrategy + */ + function isMakerOrderValid(OrderStructs.Maker calldata makerAsk, bytes4 functionSelector) + external + view + override + returns (bool isValid, bytes4 errorSelector) + { + if ( + functionSelector != StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector + && functionSelector + != StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector + ) { + return (isValid, FunctionSelectorInvalid.selector); + } + + if (makerAsk.quoteType != QuoteType.Ask) { + return (isValid, QuoteTypeInvalid.selector); + } + + (uint256 minUnitAmount, uint256 maxUnitAmount) = abi.decode(makerAsk.additionalParameters, (uint256, uint256)); + + if ( + makerAsk.amounts.length != 1 || makerAsk.amounts[0] == 0 + || IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[0]) < makerAsk.amounts[0] + || makerAsk.itemIds.length != 1 || minUnitAmount > maxUnitAmount || makerAsk.price == 0 + || maxUnitAmount == 0 + ) { + return (isValid, OrderInvalid.selector); + } + + // If no root is provided or invalid length, it should be invalid. + // @dev It does not mean the merkle root is valid against a specific itemId that exists in the collection. + // @dev 96 is the length of the bytes32 array when the merkle root is provided together with two uint256 params + // declared in the additionalParameters. + if ( + functionSelector + == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector + && makerAsk.additionalParameters.length != 96 + ) { + return (isValid, OrderInvalid.selector); + } + + isValid = true; + } +} diff --git a/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol b/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol index 96470011..636c2cb4 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; @@ -19,7 +19,6 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; * a specific amount of items in a range bounded by 2 item ids. * @author LooksRare protocol team (👀,💎) */ -// TODO this enables bidding on all fractions belonging to a claimID contract StrategyItemIdsRange is BaseStrategy { /** * @notice This function validates the order under the context of the chosen strategy diff --git a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol index e8ecf572..ceb4ef38 100644 --- a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol +++ b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol @@ -48,7 +48,6 @@ import {QuoteType} from "../enums/QuoteType.sol"; * @dev This version does not handle strategies with partial fills. * @author LooksRare protocol team (👀,💎) */ -//TODO this might need hypercerts specific changes like checking on amount of units in a fraction contract OrderValidatorV2A { using OrderStructs for OrderStructs.Maker; diff --git a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol new file mode 100644 index 00000000..a48df879 --- /dev/null +++ b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// Interfaces +import {IHypercertToken} from "../../protocol/interfaces/IHypercertToken.sol"; + +/** + * @title LowLevelHypercertCaller + * @notice This contract contains low-level calls to transfer ERC1155 tokens. + * @author bitbeckers + */ +contract LowLevelHypercertCaller { + error NotAContract(); + error HypercertSplitFractionError(); + + /** + * @notice Execute Hypercert splitFraction + * @param collection Address of the collection + * @param from Address of the sender + * @param to Address of the recipient + * @param tokenId tokenId to transfer + * @param amounts split distribution + */ + + function _executeHypercertSplitFraction( + address collection, + address from, + address to, + uint256 tokenId, + uint256[] memory amounts + ) internal { + if (collection.code.length == 0) { + revert NotAContract(); + } + + (bool status,) = collection.call(abi.encodeCall(IHypercertToken.splitFraction, (to, tokenId, amounts))); + + if (!status) { + revert HypercertSplitFractionError(); + } + } +} diff --git a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol index 0e6abd61..4bf168ef 100644 --- a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol +++ b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol @@ -7,7 +7,6 @@ pragma solidity ^0.8.17; * It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). * @author OpenZeppelin (adjusted by LooksRare) */ -// TODO compare changes with OpenZeppelin library MerkleProofMemory { /** * @notice This returns true if a `leaf` can be proved to be a part of a Merkle tree defined by `root`. diff --git a/contracts/src/marketplace/libraries/OrderStructs.sol b/contracts/src/marketplace/libraries/OrderStructs.sol index 19b3a88d..09eb49f9 100644 --- a/contracts/src/marketplace/libraries/OrderStructs.sol +++ b/contracts/src/marketplace/libraries/OrderStructs.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // Enums import {CollectionType} from "../enums/CollectionType.sol"; @@ -8,7 +8,7 @@ import {QuoteType} from "../enums/QuoteType.sol"; /** * @title OrderStructs * @notice This library contains all order struct types for the LooksRare protocol (v2). - * @author LooksRare protocol team (👀,💎) + * @author LooksRare protocol team (👀,💎); bitbeckers */ library OrderStructs { /** diff --git a/contracts/tasks/deploy-marketplace.ts b/contracts/tasks/deploy-marketplace.ts index a1118508..d7667c2e 100644 --- a/contracts/tasks/deploy-marketplace.ts +++ b/contracts/tasks/deploy-marketplace.ts @@ -7,6 +7,7 @@ import exchangeContract from "../out/LooksRareProtocol.sol/LooksRareProtocol.jso import transferManagerContract from "../out/TransferManager.sol/TransferManager.json"; import orderValidatorContract from "../out/OrderValidatorV2A.sol/OrderValidatorV2A.json"; import strategyCollectionOfferContract from "../out/StrategyCollectionOffer.sol/StrategyCollectionOffer.json"; +import strategyHypercertFractionOfferContract from "../out/StrategyHypercertFractionOffer.sol/StrategyHypercertFractionOffer.json"; import protocolFeeRecipientContract from "../out/ProtocolFeeRecipient.sol/ProtocolFeeRecipient.json"; const getCreate2Address = async ( @@ -49,7 +50,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") const _minTotalFeeBp = 50; const _maxProtocolFeeBp = 200; - const releaseCounter = "g"; + const releaseCounter = "h"; const salt = slice( encodePacked(["address", "string", "address"], [deployer.account?.address, releaseCounter, create2Address]), @@ -300,6 +301,10 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") : "Failed to deploy OrderValidator", ); + // DEPLOYING STRATEGIES + + console.log("Deploying and adding strategies...."); + // Deploy strategyCollectionOffer const deployStrategyCollectionOffer = await deployer.deployContract({ @@ -332,7 +337,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") strategyCollectionOfferTx.contractAddress, ]); - console.log("Adding strategy CollectionWithTakerAsk to exchange..."); + console.log("Adding strategy CollectionWithTakerAsk [strategyId 1] to exchange..."); const addStratTakerAskTx = await publicClient.waitForTransactionReceipt({ hash: addStratTakerAsk, }); @@ -343,6 +348,8 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") : "Failed to add strategy executeCollectionStrategyWithTakerAsk to exchange", ); + // Add executeCollectionStrategyWithTakerAskWithProof strategy to HypercertsExchange + const addStratTakerAskProof = await hypercertsExchangeInstance.write.addStrategy([ _standardProtocolFeeBP, _minTotalFeeBp, @@ -352,7 +359,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") strategyCollectionOfferTx.contractAddress, ]); - console.log("Adding strategy CollectionWithTakerAskWithProof to exchange..."); + console.log("Adding strategy CollectionWithTakerAskWithProof [strategyId 2] to exchange..."); const addStratTakerAskProofTx = await publicClient.waitForTransactionReceipt({ hash: addStratTakerAskProof, }); @@ -363,11 +370,78 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") : "Failed to add strategy executeCollectionStrategyWithTakerAskWithProof to exchange", ); + // Deploy strategyHypercertFractionOffer + + const deployStrategyHypercertFractionOffer = await deployer.deployContract({ + abi: strategyHypercertFractionOfferContract.abi, + account: deployer.account, + args: [], + bytecode: strategyHypercertFractionOfferContract.bytecode.object as `0x${string}`, + }); + + const strategyHypercertFractionOfferTx = await publicClient.waitForTransactionReceipt({ + hash: deployStrategyHypercertFractionOffer, + }); + + console.log( + strategyHypercertFractionOfferTx.status === "success" + ? "Deployed StrategyHypercertOffer successfully" + : "Failed to deploy StrategyHypercertOffer", + ); + + // Add executeHypercertFractionStrategyWithTakerBid strategy to HypercertsExchange + + const strategyHypercertFractionOfferFactory = await ethers.getContractFactory("StrategyHypercertFractionOffer"); + + const addHypercertFractionStrategyWithTakerBid = await hypercertsExchangeInstance.write.addStrategy([ + _standardProtocolFeeBP, + _minTotalFeeBp, + _maxProtocolFeeBp, + strategyHypercertFractionOfferFactory.interface.getFunction("executeHypercertFractionStrategyWithTakerBid") + ?.selector, + true, + strategyHypercertFractionOfferTx.contractAddress, + ]); + + console.log("Adding strategy HypercertFraction to exchange..."); + const addHypercertFractionStrategyWithTakerBidTx = await publicClient.waitForTransactionReceipt({ + hash: addHypercertFractionStrategyWithTakerBid, + }); + + console.log( + addHypercertFractionStrategyWithTakerBidTx.status === "success" + ? "Added strategy executeHypercertFractionStrategyWithTakerBid to exchange successfully" + : "Failed to add strategy executeHypercertFractionStrategyWithTakerBid to exchange", + ); + + // Add executeHypercertFractionStrategyWithTakerBidWithAllowlist strategy to HypercertsExchange + + const addHypercertFractionStrategyWithTakerBidWithAllowlist = await hypercertsExchangeInstance.write.addStrategy([ + _standardProtocolFeeBP, + _minTotalFeeBp, + _maxProtocolFeeBp, + strategyHypercertFractionOfferFactory.interface.getFunction( + "executeHypercertFractionStrategyWithTakerBidWithAllowlist", + )?.selector, + true, + strategyHypercertFractionOfferTx.contractAddress, + ]); + + console.log("Adding strategy HypercertFraction WithAllowlist to exchange..."); + const addHypercertFractionStrategyWithTakerBidWithAllowlistTx = await publicClient.waitForTransactionReceipt({ + hash: addHypercertFractionStrategyWithTakerBidWithAllowlist, + }); + + console.log( + addHypercertFractionStrategyWithTakerBidWithAllowlistTx.status === "success" + ? "Added strategy executeHypercertFractionStrategyWithTakerBidWithAllowlist to exchange successfully" + : "Failed to add strategy executeHypercertFractionStrategyWithTakerBidWithAllowlist to exchange", + ); + console.log("🚀 Done!"); interface ContractDeployment { address: string; - abi: any; fullNamespace: string; args: string[]; encodedArgs: string; @@ -381,7 +455,6 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") const contracts: ContractDeployments = { HypercertsExchange: { address: hypercertsExchangeCreate2.address, - abi: exchangeContract.abi, fullNamespace: "LooksRareProtocol", args: hypercertsExchangeArgs, encodedArgs: solidityPacked(["address", "address", "address", "address"], hypercertsExchangeArgs), @@ -389,7 +462,6 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") }, ProtocolFeeRecipient: { address: protocolFeeRecipientCreate2.address, - abi: protocolFeeRecipientContract.abi, fullNamespace: "ProtocolFeeRecipient", args: [deployer.account.address, wethAddress], encodedArgs: solidityPacked(["address", "address"], [deployer.account.address, wethAddress]), @@ -397,7 +469,6 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") }, TransferManager: { address: transferManagerCreate2.address, - abi: transferManagerContract.abi, fullNamespace: "TransferManager", args: transferManagerArgs, encodedArgs: solidityPacked(["address"], transferManagerArgs), @@ -406,7 +477,6 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") OrderValidator: { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion address: orderValidatorTx.contractAddress!, - abi: orderValidatorContract.abi, fullNamespace: "OrderValidatorV2A", args: orderValidatorArgs, encodedArgs: solidityPacked(["address"], orderValidatorArgs), @@ -415,21 +485,23 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") StrategyCollectionOffer: { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion address: strategyCollectionOfferTx.contractAddress!, - abi: strategyCollectionOfferContract.abi, fullNamespace: "StrategyCollectionOffer", args: [], encodedArgs: solidityPacked([], []), tx: strategyCollectionOfferTx.transactionHash, }, + StrategyHypercertFractionOffer: { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + address: strategyHypercertFractionOfferTx.contractAddress!, + fullNamespace: "StrategyCollectionOffer", + args: [], + encodedArgs: solidityPacked([], []), + tx: strategyHypercertFractionOfferTx.transactionHash, + }, }; + await writeFile(`src/deployments/deployment-marketplace-${network.name}.json`, JSON.stringify(contracts), "utf-8"); if (network.name !== "hardhat" && network.name !== "localhost") { - await writeFile( - `src/deployments/deployment-marketplace-${network.name}.json`, - JSON.stringify(contracts), - "utf-8", - ); - // Verify contracts for (const [name, { address, tx }] of Object.entries(contracts)) { try { diff --git a/contracts/test/foundry/marketplace/DelegationRecipientsTaker.t.sol b/contracts/test/foundry/marketplace/DelegationRecipientsTaker.t.sol index ea5e6445..acc35305 100644 --- a/contracts/test/foundry/marketplace/DelegationRecipientsTaker.t.sol +++ b/contracts/test/foundry/marketplace/DelegationRecipientsTaker.t.sol @@ -14,9 +14,8 @@ import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/Numer contract DelegationRecipientsTakerTest is ProtocolBase { function setUp() public { _setUp(); - CreatorFeeManagerWithRoyalties creatorFeeManager = new CreatorFeeManagerWithRoyalties( - address(royaltyFeeRegistry) - ); + CreatorFeeManagerWithRoyalties creatorFeeManager = + new CreatorFeeManagerWithRoyalties(address(royaltyFeeRegistry)); vm.prank(_owner); looksRareProtocol.updateCreatorFeeManager(address(creatorFeeManager)); } diff --git a/contracts/test/foundry/marketplace/ExecutionManager.t.sol b/contracts/test/foundry/marketplace/ExecutionManager.t.sol index b330d91a..317f1f84 100644 --- a/contracts/test/foundry/marketplace/ExecutionManager.t.sol +++ b/contracts/test/foundry/marketplace/ExecutionManager.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.17; // LooksRare unopinionated libraries import {IOwnableTwoSteps} from "@looksrare/contracts-libs/contracts/interfaces/IOwnableTwoSteps.sol"; @@ -208,75 +208,4 @@ contract ExecutionManagerTest is ProtocolBase, IExecutionManager, IStrategyManag vm.expectRevert(OrderInvalid.selector); looksRareProtocol.executeTakerBid{value: makerAsk.price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } - - // TODO check is we need this test and replace the chainlink floor strategy - // function testCannotExecuteTransactionIfMakerBidWithStrategyForMakerAsk() public { - // _setUpUsers(); - - // vm.prank(_owner); - // StrategyChainlinkFloor strategy = new StrategyChainlinkFloor(_owner, address(weth)); - - // bool isMakerBid = true; - // vm.prank(_owner); - // looksRareProtocol.addStrategy( - // 250, - // 250, - // 300, - // StrategyChainlinkFloor.executeBasisPointsDiscountCollectionOfferStrategyWithTakerAsk.selector, - // isMakerBid, - // address(strategy) - // ); - - // (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = - // _createMockMakerAskAndTakerBid(address(mockERC721)); - // makerAsk.strategyId = 1; // Fake strategy - - // bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); - - // // Mint asset - // mockERC721.mint(makerUser, makerAsk.itemIds[0]); - - // _assertMakerOrderReturnValidationCode(makerAsk, signature, STRATEGY_INVALID_QUOTE_TYPE); - - // vm.prank(takerUser); - // vm.expectRevert(IExecutionManager.NoSelectorForStrategy.selector); - // looksRareProtocol.executeTakerBid{value: makerAsk.price}( - // takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE - // ); - // } - - // TODO check is we need this test and replace the chainlink floor strategy - // function testCannotExecuteTransactionIfMakerAskWithStrategyForMakerBid() public { - // _setUpUsers(); - - // vm.prank(_owner); - // StrategyChainlinkFloor strategy = new StrategyChainlinkFloor(_owner, address(weth)); - - // bool isMakerBid = false; - // vm.prank(_owner); - // // All parameters are random, including the selector and the implementation - // looksRareProtocol.addStrategy( - // 250, - // 250, - // 300, - // StrategyChainlinkFloor.executeFixedPremiumStrategyWithTakerBid.selector, - // isMakerBid, - // address(strategy) - // ); - - // (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = - // _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); - // makerBid.strategyId = 1; // Fake strategy - - // bytes memory signature = _signMakerOrder(makerBid, makerUserPK); - - // // Mint asset to ask user - // mockERC721.mint(takerUser, makerBid.itemIds[0]); - - // _assertMakerOrderReturnValidationCode(makerBid, signature, STRATEGY_INVALID_QUOTE_TYPE); - - // vm.prank(takerUser); - // vm.expectRevert(IExecutionManager.NoSelectorForStrategy.selector); - // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); - // } } diff --git a/contracts/test/foundry/marketplace/NonceInvalidation.t.sol b/contracts/test/foundry/marketplace/NonceInvalidation.t.sol index ae497f79..c2268c6c 100644 --- a/contracts/test/foundry/marketplace/NonceInvalidation.t.sol +++ b/contracts/test/foundry/marketplace/NonceInvalidation.t.sol @@ -190,9 +190,7 @@ contract NonceInvalidationTest is INonceManager, ProtocolBase { bytes4 selector = StrategyTestMultiFillCollectionOrder.executeStrategyWithTakerAsk.selector; StrategyTestMultiFillCollectionOrder strategyMultiFillCollectionOrder = - new StrategyTestMultiFillCollectionOrder( - address(looksRareProtocol) - ); + new StrategyTestMultiFillCollectionOrder(address(looksRareProtocol)); vm.prank(_owner); _addStrategy(address(strategyMultiFillCollectionOrder), selector, true); diff --git a/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol b/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol index ca9a5c9c..89ecd238 100644 --- a/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol +++ b/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol @@ -59,12 +59,9 @@ contract OrderValidatorV2ATest is TestParameters { function setUp() public { transferManager = new TransferManager(address(this)); looksRareProtocol = new LooksRareProtocol( - address(this), - address(this), - address(transferManager), - 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + address(this), address(this), address(transferManager), 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 ); - royaltyFeeRegistry = new MockRoyaltyFeeRegistry(address(this), 9_500); + royaltyFeeRegistry = new MockRoyaltyFeeRegistry(address(this), 9500); creatorFeeManager = new CreatorFeeManagerWithRoyalties(address(royaltyFeeRegistry)); looksRareProtocol.updateCreatorFeeManager(address(creatorFeeManager)); looksRareProtocol.updateCurrencyStatus(ETH, true); diff --git a/contracts/test/foundry/marketplace/ProtocolBase.t.sol b/contracts/test/foundry/marketplace/ProtocolBase.t.sol index e0af4b8e..e1928945 100644 --- a/contracts/test/foundry/marketplace/ProtocolBase.t.sol +++ b/contracts/test/foundry/marketplace/ProtocolBase.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity >=0.8.7; +pragma solidity >=0.8.17; // WETH import {WETH} from "solmate/src/tokens/WETH.sol"; @@ -170,12 +170,8 @@ contract ProtocolBase is MockOrderGenerator, ILooksRareProtocol { transferManager = new TransferManager(_owner); royaltyFeeRegistry = new MockRoyaltyFeeRegistry(_owner, 9500); protocolFeeRecipient = new ProtocolFeeRecipient(0x5924A28caAF1cc016617874a2f0C3710d881f3c1, address(weth)); - looksRareProtocol = new LooksRareProtocol( - _owner, - address(protocolFeeRecipient), - address(transferManager), - address(weth) - ); + looksRareProtocol = + new LooksRareProtocol(_owner, address(protocolFeeRecipient), address(transferManager), address(weth)); mockERC721WithRoyalties = new MockERC721WithRoyalties(_royaltyRecipient, _standardRoyaltyFee); // Operations diff --git a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol index 2a96743c..739b131a 100644 --- a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol +++ b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol @@ -82,9 +82,8 @@ contract SignaturesERC1271WalletForERC1155Test is ProtocolBase { } function testTakerBidIsInvalidSignatureReentrancy() public { - MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = + new MaliciousIsValidSignatureERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerBid); @@ -135,9 +134,8 @@ contract SignaturesERC1271WalletForERC1155Test is ProtocolBase { } function testTakerAskIsValidSignatureReentrancy() public { - MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = + new MaliciousIsValidSignatureERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerAsk); @@ -150,9 +148,8 @@ contract SignaturesERC1271WalletForERC1155Test is ProtocolBase { } function testTakerAskOnERC1155ReceivedReentrancy() public { - MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = new MaliciousOnERC1155ReceivedERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = + new MaliciousOnERC1155ReceivedERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = @@ -185,9 +182,8 @@ contract SignaturesERC1271WalletForERC1155Test is ProtocolBase { } function testBatchTakerAskOnERC1155BatchReceivedReentrancy() public { - MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = new MaliciousOnERC1155ReceivedERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = + new MaliciousOnERC1155ReceivedERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = @@ -262,9 +258,8 @@ contract SignaturesERC1271WalletForERC1155Test is ProtocolBase { } function testExecuteMultipleTakerBidsIsValidSignatureReentrancy() public { - MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = + new MaliciousIsValidSignatureERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteMultipleTakerBids); @@ -288,9 +283,7 @@ contract SignaturesERC1271WalletForERC1155Test is ProtocolBase { function testExecuteMultipleTakerBidsOnERC1155ReceivedReentrancyOnlyInTheLastCall() public { MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet maliciousERC1271Wallet = - new MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet( - takerUser - ); + new MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet(takerUser); _setUpUser(makerUser); maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteMultipleTakerBids); diff --git a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol index 638c416e..28a09020 100644 --- a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol +++ b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol @@ -74,9 +74,8 @@ contract SignaturesERC1271WalletForERC721Test is ProtocolBase { } function testTakerBidReentrancy() public { - MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = + new MaliciousIsValidSignatureERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerBid); @@ -127,9 +126,8 @@ contract SignaturesERC1271WalletForERC721Test is ProtocolBase { } function testTakerAskReentrancy() public { - MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = + new MaliciousIsValidSignatureERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerAsk); @@ -196,9 +194,8 @@ contract SignaturesERC1271WalletForERC721Test is ProtocolBase { } function testExecuteMultipleTakerBidsReentrancy() public { - MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = + new MaliciousIsValidSignatureERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteMultipleTakerBids); diff --git a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol index d2bac768..77f15033 100644 --- a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol +++ b/contracts/test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol @@ -82,9 +82,8 @@ contract SignaturesERC1271WalletForHypercertTest is ProtocolBase { } function testTakerBidIsInvalidSignatureReentrancy() public { - MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = + new MaliciousIsValidSignatureERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerBid); @@ -135,9 +134,8 @@ contract SignaturesERC1271WalletForHypercertTest is ProtocolBase { } function testTakerAskIsValidSignatureReentrancy() public { - MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = + new MaliciousIsValidSignatureERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteTakerAsk); @@ -150,9 +148,8 @@ contract SignaturesERC1271WalletForHypercertTest is ProtocolBase { } function testTakerAskOnERC1155ReceivedReentrancy() public { - MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = new MaliciousOnERC1155ReceivedERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = + new MaliciousOnERC1155ReceivedERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = @@ -185,9 +182,8 @@ contract SignaturesERC1271WalletForHypercertTest is ProtocolBase { } function testBatchTakerAskOnERC1155BatchReceivedReentrancy() public { - MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = new MaliciousOnERC1155ReceivedERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousOnERC1155ReceivedERC1271Wallet maliciousERC1271Wallet = + new MaliciousOnERC1155ReceivedERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); (OrderStructs.Taker memory takerAsk, OrderStructs.Maker memory makerBid) = @@ -262,9 +258,8 @@ contract SignaturesERC1271WalletForHypercertTest is ProtocolBase { } function testExecuteMultipleTakerBidsIsValidSignatureReentrancy() public { - MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = new MaliciousIsValidSignatureERC1271Wallet( - address(looksRareProtocol) - ); + MaliciousIsValidSignatureERC1271Wallet maliciousERC1271Wallet = + new MaliciousIsValidSignatureERC1271Wallet(address(looksRareProtocol)); _setUpUser(address(maliciousERC1271Wallet)); maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteMultipleTakerBids); @@ -288,9 +283,7 @@ contract SignaturesERC1271WalletForHypercertTest is ProtocolBase { function testExecuteMultipleTakerBidsOnERC1155ReceivedReentrancyOnlyInTheLastCall() public { MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet maliciousERC1271Wallet = - new MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet( - takerUser - ); + new MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet(takerUser); _setUpUser(makerUser); maliciousERC1271Wallet.setFunctionToReenter(MaliciousERC1271Wallet.FunctionToReenter.ExecuteMultipleTakerBids); diff --git a/contracts/test/foundry/marketplace/StandardTransactions.t.sol b/contracts/test/foundry/marketplace/StandardTransactions.t.sol index 75cd55d8..927818b0 100644 --- a/contracts/test/foundry/marketplace/StandardTransactions.t.sol +++ b/contracts/test/foundry/marketplace/StandardTransactions.t.sol @@ -25,9 +25,8 @@ contract StandardTransactionsTest is ProtocolBase { function setUp() public { _setUp(); - CreatorFeeManagerWithRoyalties creatorFeeManager = new CreatorFeeManagerWithRoyalties( - address(royaltyFeeRegistry) - ); + CreatorFeeManagerWithRoyalties creatorFeeManager = + new CreatorFeeManagerWithRoyalties(address(royaltyFeeRegistry)); vm.prank(_owner); looksRareProtocol.updateCreatorFeeManager(address(creatorFeeManager)); } diff --git a/contracts/test/foundry/marketplace/StandardTransactionsHypercerts.t.sol b/contracts/test/foundry/marketplace/StandardTransactionsHypercerts.t.sol index 199d24c0..372317fa 100644 --- a/contracts/test/foundry/marketplace/StandardTransactionsHypercerts.t.sol +++ b/contracts/test/foundry/marketplace/StandardTransactionsHypercerts.t.sol @@ -26,9 +26,8 @@ contract StandardTransactionsHypercertsTest is ProtocolBase { function setUp() public { _setUp(); - CreatorFeeManagerWithRoyalties creatorFeeManager = new CreatorFeeManagerWithRoyalties( - address(royaltyFeeRegistry) - ); + CreatorFeeManagerWithRoyalties creatorFeeManager = + new CreatorFeeManagerWithRoyalties(address(royaltyFeeRegistry)); vm.prank(_owner); looksRareProtocol.updateCreatorFeeManager(address(creatorFeeManager)); diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol new file mode 100644 index 00000000..c3dab596 --- /dev/null +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol @@ -0,0 +1,470 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// Murky (third-party) library is used to compute Merkle trees in Solidity +import {Merkle} from "murky/Merkle.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Shared errors +import { + AmountInvalid, + OrderInvalid, + FunctionSelectorInvalid, + MerkleProofInvalid, + QuoteTypeInvalid +} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import {MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE} from + "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Strategies +import {StrategyHypercertFractionOffer} from + "@hypercerts/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol"; + +// Base test +import {ProtocolBase} from "../ProtocolBase.t.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +import "forge-std/console2.sol"; + +contract HypercertFractionOffersTest is ProtocolBase { + using OrderStructs for OrderStructs.Maker; + + StrategyHypercertFractionOffer public strategyHypercertFractionOffer; + bytes4 public selectorNoProof = StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector; + bytes4 public selectorWithProofAllowlist = + StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector; + + uint256 private constant price = 0.001 ether; // Fixed price of sale + bytes32 private constant mockMerkleRoot = bytes32(keccak256("Mock")); // Mock merkle root + + uint256 private constant minUnitAmount = 1; + uint256 private constant maxUnitAmount = 100; + + function _createMakerAskAndTakerBidHypercert(bool mint) + private + returns (OrderStructs.Maker memory newMakerAsk, OrderStructs.Taker memory newTakerBid) + { + vm.prank(makerUser); + // Mint asset + if (mint == true) mockHypercertMinter.mintClaim(makerUser, 10_000, "https://examle.com", FROM_CREATOR_ONLY); + + uint256[] memory itemIds = new uint256[](1); + itemIds[0] = (1 << 128) + 1; + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 5000; + + newMakerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + newMakerAsk.itemIds = itemIds; + newMakerAsk.amounts = amounts; + newMakerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, mockMerkleRoot); + + // Using startPrice as the maxPrice + bytes32[] memory proofs = new bytes32[](0); + + newTakerBid = OrderStructs.Taker(takerUser, abi.encode(minUnitAmount, price, proofs)); + } + + function setUp() public { + _setUp(); + _setUpNewStrategies(); + } + + function _setUpNewStrategies() private asPrankedUser(_owner) { + strategyHypercertFractionOffer = new StrategyHypercertFractionOffer(); + _addStrategy(address(strategyHypercertFractionOffer), selectorNoProof, false); + _addStrategy(address(strategyHypercertFractionOffer), selectorWithProofAllowlist, false); + } + + function testNewStrategies() public { + _assertStrategyAttributes(address(strategyHypercertFractionOffer), selectorNoProof, false); + + ( + bool strategyIsActive, + uint16 strategyStandardProtocolFee, + uint16 strategyMinTotalFee, + uint16 strategyMaxProtocolFee, + bytes4 strategySelector, + bool strategyIsMakerBid, + address strategyImplementation + ) = looksRareProtocol.strategyInfo(2); + + assertTrue(strategyIsActive); + assertEq(strategyStandardProtocolFee, _standardProtocolFeeBp); + assertEq(strategyMinTotalFee, _minTotalFeeBp); + assertEq(strategyMaxProtocolFee, _maxProtocolFeeBp); + assertEq(strategySelector, selectorWithProofAllowlist); + assertFalse(strategyIsMakerBid); + assertEq(strategyImplementation, address(strategyHypercertFractionOffer)); + } + + function testmakerAskAmountsLengthNotOne() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + // Adjust strategy for collection order and sign order + // Change array to make it bigger than expected + uint256[] memory amounts = new uint256[](2); + amounts[0] = 1; + makerAsk.amounts = amounts; + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertOrderIsInvalid(makerAsk, false); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // // With proof + makerAsk.strategyId = 2; + signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertOrderIsInvalid(makerAsk, true); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testZeroAmount() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 0; + makerAsk.amounts = amounts; + makerAsk.strategyId = 1; + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertOrderIsInvalid(makerAsk, false); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + /** + * A collection offer with merkle tree criteria + */ + /** + * TAKER ALLOWLIST + */ + function testTakerBidCollectionOrderWithMerkleTreeHypercertAccountAllowlist() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(false); + + address accountInMerkleTree = takerUser; + uint256 tokenIdInMerkleTree = 2; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ + owner: makerUser, + numberOfAccountsInMerkleTree: 5, + accountInMerkleTree: accountInMerkleTree + }); + + makerAsk.strategyId = 2; + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, merkleRoot); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Prepare the taker ask + takerBid.additionalParameters = abi.encode(100, price, proof); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, true); + _assertValidMakerOrder(makerAsk, signature); + + // // Execute taker ask transaction + vm.prank(takerUser); + console2.log("length amounts: ", makerAsk.amounts.length); + console2.log("length itemIds: ", makerAsk.itemIds.length); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // _assertSuccessfulTakerBid(makerAsk, takerBid, (1 << 128) + 1); + } + + // function testTakerAskCannotExecuteWithInvalidProofAccountAllowlist(uint256 itemIdSold) public { + // vm.assume(itemIdSold > 5); + // _setUpUsers(); + + // OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + // quoteType: QuoteType.Bid, + // globalNonce: 0, + // subsetNonce: 0, + // strategyId: 3, + // collectionType: CollectionType.ERC721, + // orderNonce: 0, + // collection: address(mockERC721), + // currency: address(weth), + // signer: makerUser, + // price: price, + // itemId: 0 // Not used + // }); + + // address accountInMerkleTree = takerUser; + // uint256 tokenIdInMerkleTree = 2; + // (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ + // owner: takerUser, + // numberOfAccountsInMerkleTree: 5, + // // Doesn't matter what itemIdInMerkleTree is as we are are going to tamper with the proof + // accountInMerkleTree: accountInMerkleTree + // }); + // makerBid.additionalParameters = abi.encode(merkleRoot); + + // // Sign order + // bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // // Prepare the taker ask + // proof[0] = bytes32(0); // Tamper with the proof + // OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(tokenIdInMerkleTree, proof)); + + // // Verify validity of maker bid order + // _assertOrderIsValid(makerBid, true); + // _assertValidMakerOrder(makerBid, signature); + + // vm.prank(takerUser); + // vm.expectRevert(MerkleProofInvalid.selector); + // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + // } + + // function testInvalidAmounts() public { + // _setUpUsers(); + + // OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + // quoteType: QuoteType.Bid, + // globalNonce: 0, + // subsetNonce: 0, + // strategyId: 1, + // collectionType: CollectionType.ERC721, + // orderNonce: 0, + // collection: address(mockERC721), + // currency: address(weth), + // signer: makerUser, + // price: price, + // itemId: 0 + // }); + + // // Prepare the taker ask + // OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(5)); + + // // 1. Amount is 0 (without merkle proof) + // makerBid.amounts[0] = 0; + // bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + // _assertOrderIsInvalid(makerBid, false); + // _assertMakerOrderReturnValidationCode(makerBid, signature, + // MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + // vm.prank(takerUser); + // vm.expectRevert(AmountInvalid.selector); + // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // // 2. Amount is too high for ERC721 (without merkle proof) + // makerBid.amounts[0] = 2; + // signature = _signMakerOrder(makerBid, makerUserPK); + // _assertOrderIsInvalid(makerBid, false); + // _assertMakerOrderReturnValidationCode(makerBid, signature, + // MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + // vm.prank(takerUser); + // vm.expectRevert(AmountInvalid.selector); + // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // // 3. Amount is 0 (with merkle proof) + // makerBid.strategyId = 2; + // uint256 itemIdInMerkleTree = 5; + // (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProof({ + // owner: takerUser, + // numberOfItemsInMerkleTree: 6, + // itemIdInMerkleTree: itemIdInMerkleTree + // }); + + // makerBid.additionalParameters = abi.encode(merkleRoot); + // makerBid.amounts[0] = 0; + // signature = _signMakerOrder(makerBid, makerUserPK); + + // takerAsk.additionalParameters = abi.encode(itemIdInMerkleTree, proof); + + // _assertOrderIsInvalid(makerBid, true); + // _assertMakerOrderReturnValidationCode(makerBid, signature, + // MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + // vm.prank(takerUser); + // vm.expectRevert(AmountInvalid.selector); + // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // // 4. Amount is too high for ERC721 (with merkle proof) + // makerBid.amounts[0] = 2; + // signature = _signMakerOrder(makerBid, makerUserPK); + // _assertOrderIsInvalid(makerBid, true); + // _assertMakerOrderReturnValidationCode(makerBid, signature, + // MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + // vm.prank(takerUser); + // vm.expectRevert(AmountInvalid.selector); + // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + // } + + function testMerkleRootLengthIsNot200() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + // Set to use allowlist + makerAsk.strategyId = 2; + // Only encode min-max units + makerAsk.additionalParameters = abi.encode(1, 1); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertOrderIsInvalid(makerAsk, true); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(); // It should revert without data (since the root cannot be extracted since the + // additionalParameters length is 0) + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testInvalidSelector() public { + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: 3, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + (bool orderIsValid, bytes4 errorSelector) = + strategyHypercertFractionOffer.isMakerOrderValid(makerAsk, bytes4(0)); + assertFalse(orderIsValid); + assertEq(errorSelector, FunctionSelectorInvalid.selector); + } + + function testWrongQuoteType() public { + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + (bool orderIsValid, bytes4 errorSelector) = + strategyHypercertFractionOffer.isMakerOrderValid(makerBid, selectorNoProof); + + assertFalse(orderIsValid); + assertEq(errorSelector, QuoteTypeInvalid.selector); + } + + function _assertOrderIsValid(OrderStructs.Maker memory makerBid, bool withProof) private { + (bool orderIsValid, bytes4 errorSelector) = strategyHypercertFractionOffer.isMakerOrderValid( + makerBid, withProof ? selectorWithProofAllowlist : selectorNoProof + ); + + console2.logBytes4(errorSelector); + assertTrue(orderIsValid); + assertEq(errorSelector, _EMPTY_BYTES4); + } + + function _assertOrderIsInvalid(OrderStructs.Maker memory makerBid, bool withProof) private { + (bool orderIsValid, bytes4 errorSelector) = strategyHypercertFractionOffer.isMakerOrderValid( + makerBid, withProof ? selectorWithProofAllowlist : selectorNoProof + ); + + assertFalse(orderIsValid); + assertEq(errorSelector, OrderInvalid.selector); + } + + function _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist( + address owner, + uint256 numberOfAccountsInMerkleTree, + address accountInMerkleTree + ) private returns (bytes32 merkleRoot, bytes32[] memory proof) { + // Initialize Merkle Tree + Merkle m = new Merkle(); + + bytes32[] memory merkleTreeAccounts = new bytes32[](numberOfAccountsInMerkleTree); + vm.startPrank(owner); + for (uint256 i; i < numberOfAccountsInMerkleTree; i++) { + mockHypercertMinter.mintClaim(owner, 10_000, "https://examle.com", FROM_CREATOR_ONLY); + merkleTreeAccounts[i] = keccak256(abi.encodePacked(accountInMerkleTree)); + } + vm.stopPrank(); + + // Compute merkle root + merkleRoot = m.getRoot(merkleTreeAccounts); + proof = m.getProof(merkleTreeAccounts, 2); + + assertTrue(m.verifyProof(merkleRoot, proof, merkleTreeAccounts[0])); + } + + function _assertSuccessfulTakerBid( + OrderStructs.Maker memory makerAsk, + OrderStructs.Taker memory takerBid, + uint256 fractionId + ) private { + //units, amount, currency, proof[] + (uint256 unitAmount, uint256 price) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); + + // Taker user has received the asset + assertEq(mockHypercertMinter.ownerOf(fractionId), makerUser); + assertEq(mockHypercertMinter.ownerOf(fractionId + 1), takerUser); + + // Units have been transfered + assertEq(mockHypercertMinter.unitsOf(fractionId), 10_000 - unitAmount); + assertEq(mockHypercertMinter.unitsOf(fractionId + 1), unitAmount); + + // Maker bid user pays the whole price + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser - (unitAmount * price)); + // Taker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + weth.balanceOf(makerUser), + _initialWETHBalanceUser + + (unitAmount * price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), _computeOrderHash(makerAsk)); + } +} diff --git a/contracts/test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol b/contracts/test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol index 5fd15bda..c5a3c8f0 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol @@ -1,5 +1,5 @@ /// SPDX-License-Identifier: MIT -pragma solidity >=0.8.7; +pragma solidity >=0.8.17; // Libraries import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; diff --git a/contracts/test/foundry/marketplace/utils/EIP712MerkleTree.sol b/contracts/test/foundry/marketplace/utils/EIP712MerkleTree.sol index 00e89a30..dd8dba2f 100644 --- a/contracts/test/foundry/marketplace/utils/EIP712MerkleTree.sol +++ b/contracts/test/foundry/marketplace/utils/EIP712MerkleTree.sol @@ -83,32 +83,21 @@ contract EIP712MerkleTree is Test { } function _getBatchOrderTypehash(uint256 treeHeight) private pure returns (bytes32 batchOrderTypehash) { - if (treeHeight == 1) { - batchOrderTypehash = hex"9661287f7a4aa4867db46a2453ee15bebac4e8fc25667a58718da658f15de643"; - } else if (treeHeight == 2) { - batchOrderTypehash = hex"a54ab330ea9e1dfccee2b86f3666989e7fbd479704416c757c8de8e820142a08"; - } else if (treeHeight == 3) { - batchOrderTypehash = hex"93390f5d45ede9dea305f16aec86b2472af4f823851637f1b7019ad0775cea49"; - } else if (treeHeight == 4) { - batchOrderTypehash = hex"9dda2c8358da895e43d574bb15954ce5727b22e923a2d8f28261f297bce42f0b"; - } else if (treeHeight == 5) { - batchOrderTypehash = hex"92dc717124e161262f9d10c7079e7d54dc51271893fba54aa4a0f270fecdcc98"; - } else if (treeHeight == 6) { - batchOrderTypehash = hex"ce02aee5a7a35d40d974463c4c6e5534954fb07a7e7bc966fee268a15337bfd8"; - } else if (treeHeight == 7) { - batchOrderTypehash = hex"f7a65efd167a18f7091b2bb929d687dd94503cf0a43620487055ed7d6b727559"; - } else if (treeHeight == 8) { - batchOrderTypehash = hex"def24acacad1318b664520f7c10e8bc6d1e7f6f6f7c8b031e70624ceb42266a6"; - } else if (treeHeight == 9) { - batchOrderTypehash = hex"4cb4080dc4e7bae88b4dc4307ad5117fa4f26195998a1b5f40368809d7f4c7f2"; - } else if (treeHeight == 10) { - batchOrderTypehash = hex"f8b1f864164d8d6e0b45f1399bd711223117a4ab0b057a9c2d7779e86a7c88db"; - } else if (treeHeight == 11) { - batchOrderTypehash = hex"4787f505db237e03a7193c312d5159add8a5705278e1c7dcf92ab87126cbe490"; - } else if (treeHeight == 12) { - batchOrderTypehash = hex"7a6517e5a16c56b29947b57b748aa91736987376e1a366d948e7a802a9df3431"; - } else if (treeHeight == 13) { - batchOrderTypehash = hex"35806d347e9929042ce209d143da48f100f0ff0cbdb1fde68cf13af8059d79df"; - } + bytes32[] memory batchOrderTypehashes = new bytes32[](14); + batchOrderTypehashes[1] = hex"9661287f7a4aa4867db46a2453ee15bebac4e8fc25667a58718da658f15de643"; + batchOrderTypehashes[2] = hex"a54ab330ea9e1dfccee2b86f3666989e7fbd479704416c757c8de8e820142a08"; + batchOrderTypehashes[3] = hex"93390f5d45ede9dea305f16aec86b2472af4f823851637f1b7019ad0775cea49"; + batchOrderTypehashes[4] = hex"9dda2c8358da895e43d574bb15954ce5727b22e923a2d8f28261f297bce42f0b"; + batchOrderTypehashes[5] = hex"92dc717124e161262f9d10c7079e7d54dc51271893fba54aa4a0f270fecdcc98"; + batchOrderTypehashes[6] = hex"ce02aee5a7a35d40d974463c4c6e5534954fb07a7e7bc966fee268a15337bfd8"; + batchOrderTypehashes[7] = hex"f7a65efd167a18f7091b2bb929d687dd94503cf0a43620487055ed7d6b727559"; + batchOrderTypehashes[8] = hex"def24acacad1318b664520f7c10e8bc6d1e7f6f6f7c8b031e70624ceb42266a6"; + batchOrderTypehashes[9] = hex"4cb4080dc4e7bae88b4dc4307ad5117fa4f26195998a1b5f40368809d7f4c7f2"; + batchOrderTypehashes[10] = hex"f8b1f864164d8d6e0b45f1399bd711223117a4ab0b057a9c2d7779e86a7c88db"; + batchOrderTypehashes[11] = hex"4787f505db237e03a7193c312d5159add8a5705278e1c7dcf92ab87126cbe490"; + batchOrderTypehashes[12] = hex"7a6517e5a16c56b29947b57b748aa91736987376e1a366d948e7a802a9df3431"; + batchOrderTypehashes[13] = hex"35806d347e9929042ce209d143da48f100f0ff0cbdb1fde68cf13af8059d79df"; + + batchOrderTypehash = batchOrderTypehashes[treeHeight]; } } diff --git a/docs/docs/developer/api/contracts/forge-std/src/console2.md b/docs/docs/developer/api/contracts/forge-std/src/console2.md new file mode 100644 index 00000000..cb666cd3 --- /dev/null +++ b/docs/docs/developer/api/contracts/forge-std/src/console2.md @@ -0,0 +1,3 @@ +# console2 + +_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/docs/developer/api/contracts/marketplace/ExecutionManager.md b/docs/docs/developer/api/contracts/marketplace/ExecutionManager.md index 981cb3a7..83eefc37 100644 --- a/docs/docs/developer/api/contracts/marketplace/ExecutionManager.md +++ b/docs/docs/developer/api/contracts/marketplace/ExecutionManager.md @@ -1,6 +1,6 @@ # ExecutionManager -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers;_ > ExecutionManager diff --git a/docs/docs/developer/api/contracts/marketplace/TransferManager.md b/docs/docs/developer/api/contracts/marketplace/TransferManager.md index 6091a918..c2aecdaf 100644 --- a/docs/docs/developer/api/contracts/marketplace/TransferManager.md +++ b/docs/docs/developer/api/contracts/marketplace/TransferManager.md @@ -207,6 +207,26 @@ _Each operator address must be approved at the user level to be revoked._ | --------- | --------- | --------------------------- | | operators | address[] | Array of operator addresses | +### splitItemsHypercert + +```solidity +function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single Hypercert. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + ### transferBatchItemsAcrossCollections ```solidity @@ -259,26 +279,6 @@ This function transfers items for a single ERC721 collection. | itemIds | uint256[] | Array of itemIds | | amounts | uint256[] | Array of amounts | -### transferItemsHyperboard - -```solidity -function transferItemsHyperboard(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function transfers items for a single Hyperboard. - -_It does not allow batch transferring if from = msg.sender since native function should be used._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - ### transferItemsHypercert ```solidity @@ -438,6 +438,12 @@ error ERC721TransferFromFail() It is emitted if the ERC721 transferFrom fails. +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + ### LengthsInvalid ```solidity diff --git a/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md index 2e428566..592bd4af 100644 --- a/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md +++ b/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md @@ -1,6 +1,6 @@ # TransferSelectorNFT -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers;_ > TransferSelectorNFT diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md index 600967db..ddec4495 100644 --- a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md @@ -1,12 +1,10 @@ # StrategyCollectionOffer -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers_ > StrategyCollectionOffer -This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. - -_Use cases can include trait-based offers or rarity score offers._ +This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount must be 1 (fractions are NFTs) ## Methods @@ -32,6 +30,28 @@ function executeCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, Orde | amounts | uint256[] | undefined | | isNonceInvalidated | bool | undefined | +### executeCollectionStrategyWithTakerAskWithAllowlist + +```solidity +function executeCollectionStrategyWithTakerAskWithAllowlist(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + ### executeCollectionStrategyWithTakerAskWithProof ```solidity diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md new file mode 100644 index 00000000..a55946ce --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -0,0 +1,107 @@ +# StrategyHypercertFractionOffer + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> StrategyHypercertFractionOffer + +This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. + +_Use cases can include trait-based offers or rarity score offers._ + +## Methods + +### executeHypercertFractionStrategyWithTakerBid + +```solidity +function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeHypercertFractionStrategyWithTakerBidWithAllowlist + +```solidity +function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md new file mode 100644 index 00000000..5ed383b6 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md @@ -0,0 +1,21 @@ +# LowLevelHypercertCaller + +_LooksRare protocol team (👀,💎)_ + +> LowLevelHypercertCaller + +This contract contains low-level calls to transfer ERC1155 tokens. + +## Errors + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### NotAContract + +```solidity +error NotAContract() +``` From 582af93871951b731756323b1776a4af3f28e711 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Fri, 24 Nov 2023 21:36:00 +0100 Subject: [PATCH 022/118] Feat/partial fraction sale (#1190) * feat(fractions): added strategy and tests * feat(tests): update tests and tweak strat * feat(test): fix all the test and clean comms * fix(dist): moar contracts * fix(tweak): little cleanups * chore(lint): fix lint errors * fix(lint): updated foundry lint * feat(test): uncomment unused tests --- contracts/foundry.toml | 10 +- .../HypercertFractionOffers.t.sol | 215 +++++++----------- 2 files changed, 91 insertions(+), 134 deletions(-) diff --git a/contracts/foundry.toml b/contracts/foundry.toml index efe3aa83..b85161c5 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -3,18 +3,24 @@ [profile.default] auto_detect_solc = true allow_paths = ["../node_modules", "node_modules", "lib"] +block_base_fee_per_gas = 0 +block_coinbase = '0x0000000000000000000000000000000000000000' +block_difficulty = 0 +block_number = 0 +block_timestamp = 0 bytecode_hash = "none" force = false fuzz = { runs = 1025 } -gas_reports = ["*"] +gas_reports = ["LookRareProtocol", "HypercertMinter"] libraries = [] libs = ["node_modules", "lib"] optimizer = true -optimizer_runs = 5_000 +optimizer_runs = 10000 out = "out" src = "src" script = "scripts/deployment" test = "test/foundry" +via_ir = false no_match_test = "testCannotExecuteOrderIfInvalidUserGlobal" [profile.ci] diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol index c3dab596..f8bbf0ee 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol @@ -35,8 +35,6 @@ import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/Numer import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; -import "forge-std/console2.sol"; - contract HypercertFractionOffersTest is ProtocolBase { using OrderStructs for OrderStructs.Maker; @@ -207,133 +205,87 @@ contract HypercertFractionOffersTest is ProtocolBase { // // Execute taker ask transaction vm.prank(takerUser); - console2.log("length amounts: ", makerAsk.amounts.length); - console2.log("length itemIds: ", makerAsk.itemIds.length); looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); - // _assertSuccessfulTakerBid(makerAsk, takerBid, (1 << 128) + 1); + _assertSuccessfulTakerBid(makerAsk, takerBid, (1 << 128) + 1); + } + + function testTakerAskCannotExecuteWithInvalidProofAccountAllowlist(uint256 itemIdSold) public { + vm.assume(itemIdSold > 5); + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(false); + + address accountInMerkleTree = takerUser; + uint256 tokenIdInMerkleTree = 2; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ + owner: makerUser, + numberOfAccountsInMerkleTree: 5, + accountInMerkleTree: accountInMerkleTree + }); + + makerAsk.strategyId = 2; + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, merkleRoot); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Prepare the taker ask + proof[0] = bytes32(0); // Tamper with the proof + takerBid.additionalParameters = abi.encode(100, price, proof); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, true); + _assertValidMakerOrder(makerAsk, signature); + + vm.prank(takerUser); + vm.expectRevert(MerkleProofInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } - // function testTakerAskCannotExecuteWithInvalidProofAccountAllowlist(uint256 itemIdSold) public { - // vm.assume(itemIdSold > 5); - // _setUpUsers(); - - // OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ - // quoteType: QuoteType.Bid, - // globalNonce: 0, - // subsetNonce: 0, - // strategyId: 3, - // collectionType: CollectionType.ERC721, - // orderNonce: 0, - // collection: address(mockERC721), - // currency: address(weth), - // signer: makerUser, - // price: price, - // itemId: 0 // Not used - // }); - - // address accountInMerkleTree = takerUser; - // uint256 tokenIdInMerkleTree = 2; - // (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ - // owner: takerUser, - // numberOfAccountsInMerkleTree: 5, - // // Doesn't matter what itemIdInMerkleTree is as we are are going to tamper with the proof - // accountInMerkleTree: accountInMerkleTree - // }); - // makerBid.additionalParameters = abi.encode(merkleRoot); - - // // Sign order - // bytes memory signature = _signMakerOrder(makerBid, makerUserPK); - - // // Prepare the taker ask - // proof[0] = bytes32(0); // Tamper with the proof - // OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(tokenIdInMerkleTree, proof)); - - // // Verify validity of maker bid order - // _assertOrderIsValid(makerBid, true); - // _assertValidMakerOrder(makerBid, signature); - - // vm.prank(takerUser); - // vm.expectRevert(MerkleProofInvalid.selector); - // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); - // } - - // function testInvalidAmounts() public { - // _setUpUsers(); - - // OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ - // quoteType: QuoteType.Bid, - // globalNonce: 0, - // subsetNonce: 0, - // strategyId: 1, - // collectionType: CollectionType.ERC721, - // orderNonce: 0, - // collection: address(mockERC721), - // currency: address(weth), - // signer: makerUser, - // price: price, - // itemId: 0 - // }); - - // // Prepare the taker ask - // OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(5)); - - // // 1. Amount is 0 (without merkle proof) - // makerBid.amounts[0] = 0; - // bytes memory signature = _signMakerOrder(makerBid, makerUserPK); - // _assertOrderIsInvalid(makerBid, false); - // _assertMakerOrderReturnValidationCode(makerBid, signature, - // MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); - - // vm.prank(takerUser); - // vm.expectRevert(AmountInvalid.selector); - // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); - - // // 2. Amount is too high for ERC721 (without merkle proof) - // makerBid.amounts[0] = 2; - // signature = _signMakerOrder(makerBid, makerUserPK); - // _assertOrderIsInvalid(makerBid, false); - // _assertMakerOrderReturnValidationCode(makerBid, signature, - // MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); - - // vm.prank(takerUser); - // vm.expectRevert(AmountInvalid.selector); - // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); - - // // 3. Amount is 0 (with merkle proof) - // makerBid.strategyId = 2; - // uint256 itemIdInMerkleTree = 5; - // (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProof({ - // owner: takerUser, - // numberOfItemsInMerkleTree: 6, - // itemIdInMerkleTree: itemIdInMerkleTree - // }); - - // makerBid.additionalParameters = abi.encode(merkleRoot); - // makerBid.amounts[0] = 0; - // signature = _signMakerOrder(makerBid, makerUserPK); - - // takerAsk.additionalParameters = abi.encode(itemIdInMerkleTree, proof); - - // _assertOrderIsInvalid(makerBid, true); - // _assertMakerOrderReturnValidationCode(makerBid, signature, - // MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); - - // vm.prank(takerUser); - // vm.expectRevert(AmountInvalid.selector); - // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); - - // // 4. Amount is too high for ERC721 (with merkle proof) - // makerBid.amounts[0] = 2; - // signature = _signMakerOrder(makerBid, makerUserPK); - // _assertOrderIsInvalid(makerBid, true); - // _assertMakerOrderReturnValidationCode(makerBid, signature, - // MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); - - // vm.prank(takerUser); - // vm.expectRevert(AmountInvalid.selector); - // looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); - // } + function testInvalidAmounts() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + // Prepare the taker ask + takerBid.additionalParameters = abi.encode(1, price); + + // 1. Amount is 0 (without merkle proof) + makerAsk.amounts[0] = 0; + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + _assertOrderIsInvalid(makerAsk, false); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // 2. Amount is 0 (with merkle proof) + makerAsk.strategyId = 2; + address accountInMerkleTree = takerUser; + uint256 tokenIdInMerkleTree = 2; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ + owner: makerUser, + numberOfAccountsInMerkleTree: 5, + accountInMerkleTree: accountInMerkleTree + }); + + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, merkleRoot); + makerAsk.amounts[0] = 0; + signature = _signMakerOrder(makerAsk, makerUserPK); + + takerBid.additionalParameters = abi.encode(0, price, proof); + + _assertOrderIsInvalid(makerAsk, true); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } function testMerkleRootLengthIsNot200() public { (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = @@ -377,7 +329,7 @@ contract HypercertFractionOffersTest is ProtocolBase { } function testWrongQuoteType() public { - OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ quoteType: QuoteType.Bid, globalNonce: 0, subsetNonce: 0, @@ -392,25 +344,24 @@ contract HypercertFractionOffersTest is ProtocolBase { }); (bool orderIsValid, bytes4 errorSelector) = - strategyHypercertFractionOffer.isMakerOrderValid(makerBid, selectorNoProof); + strategyHypercertFractionOffer.isMakerOrderValid(makerAsk, selectorNoProof); assertFalse(orderIsValid); assertEq(errorSelector, QuoteTypeInvalid.selector); } - function _assertOrderIsValid(OrderStructs.Maker memory makerBid, bool withProof) private { + function _assertOrderIsValid(OrderStructs.Maker memory makerAsk, bool withProof) private { (bool orderIsValid, bytes4 errorSelector) = strategyHypercertFractionOffer.isMakerOrderValid( - makerBid, withProof ? selectorWithProofAllowlist : selectorNoProof + makerAsk, withProof ? selectorWithProofAllowlist : selectorNoProof ); - console2.logBytes4(errorSelector); assertTrue(orderIsValid); assertEq(errorSelector, _EMPTY_BYTES4); } - function _assertOrderIsInvalid(OrderStructs.Maker memory makerBid, bool withProof) private { + function _assertOrderIsInvalid(OrderStructs.Maker memory makerAsk, bool withProof) private { (bool orderIsValid, bytes4 errorSelector) = strategyHypercertFractionOffer.isMakerOrderValid( - makerBid, withProof ? selectorWithProofAllowlist : selectorNoProof + makerAsk, withProof ? selectorWithProofAllowlist : selectorNoProof ); assertFalse(orderIsValid); From 3bc340af11cb5838a0364b4fdb63aee1e440715d Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Sun, 26 Nov 2023 01:03:36 +0100 Subject: [PATCH 023/118] Feat/sdk common js (#1191) * feat(fractions): added strategy and tests * feat(tests): update tests and tweak strat * feat(test): fix all the test and clean comms * fix(dist): moar contracts * fix(tweak): little cleanups * chore(lint): fix lint errors * fix(lint): updated foundry lint * feat(test): uncomment unused tests * feat(bugs): cjs build and import alpha.13 * fix(only): unexpected only in sdk test --- package.json | 2 +- pnpm-lock.yaml | 911 ++++++++++++++-------- sdk/.eslintrc.yml | 2 +- sdk/.graphclientrc.yml | 4 +- sdk/global.d.ts | 1 - sdk/jest.config.ts | 20 - sdk/package.json | 29 +- sdk/src/client.ts | 10 +- sdk/src/evaluations/index.ts | 4 +- sdk/src/index.ts | 4 +- sdk/src/indexer.ts | 96 ++- sdk/src/storage.ts | 9 +- sdk/src/types/client.ts | 2 +- sdk/src/utils/adapters.ts | 2 +- sdk/src/utils/allowlist.ts | 8 +- sdk/src/utils/config.ts | 2 +- sdk/src/utils/fetchers.ts | 4 +- sdk/src/utils/index.ts | 14 +- sdk/src/utils/logger.ts | 2 +- sdk/src/utils/resolvers.ts | 4 +- sdk/test/client.test.ts | 2 + sdk/test/client/allowlist.minting.test.ts | 142 ++-- sdk/test/client/burn.test.ts | 48 +- sdk/test/client/minting.test.ts | 18 +- sdk/test/client/split.merge.test.ts | 31 +- sdk/test/evaluations/evaluator.test.ts | 31 +- sdk/test/indexer.test.ts | 15 +- sdk/test/indexer/queries.test.ts | 49 +- sdk/test/setup-env.ts | 5 +- sdk/test/storage.test.ts | 4 +- sdk/test/storage/nft.storage.test.ts | 45 +- sdk/test/storage/web3.storage.test.ts | 22 +- sdk/test/types/errors.test.ts | 4 +- sdk/test/utils/allowlist.test.ts | 16 +- sdk/test/utils/config.test.ts | 2 + sdk/test/utils/errors.test.ts | 2 + sdk/test/utils/fetchers.test.ts | 8 +- sdk/test/utils/formatter.test.ts | 1 + sdk/test/utils/logger.test.ts | 3 +- sdk/test/validator.test.ts | 3 +- sdk/tsconfig.json | 2 +- sdk/vitest.config.ts | 7 + 42 files changed, 944 insertions(+), 646 deletions(-) delete mode 100644 sdk/global.d.ts delete mode 100644 sdk/jest.config.ts create mode 100644 sdk/vitest.config.ts diff --git a/package.json b/package.json index f6e15919..90eb0ffd 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "url": "git+https://github.com/hypercerts-org/hypercerts.git" }, "overrides": { - "graphql": "^16.6.0", + "graphql": "^16.8.1", "@hypercerts/contracts": { "ethers": "6.8.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c5797c44..af2dc3a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -322,7 +322,7 @@ importers: version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) '@graphprotocol/client-cli': specifier: ^2.2.16 - version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': specifier: 1.0.0-alpha.2 version: 1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6) @@ -355,13 +355,13 @@ importers: version: 1.0.177(react-dom@18.2.0)(react@18.2.0) '@plasmicapp/loader-nextjs': specifier: ^1.0.284 - version: 1.0.333(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.333(next@14.0.3)(react-dom@18.2.0)(react@18.2.0) '@rainbow-me/rainbowkit': specifier: 1.2.0 version: 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.9)(wagmi@1.4.5) '@sentry/nextjs': specifier: ^7.73.0 - version: 7.75.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0) + version: 7.75.1(next@14.0.3)(react@18.2.0)(webpack@5.89.0) '@sentry/utils': specifier: ^7.73.0 version: 7.75.1 @@ -418,7 +418,7 @@ importers: version: 4.17.21 next: specifier: latest - version: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + version: 14.0.3(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) papaparse: specifier: ^5.4.1 version: 5.4.1 @@ -512,7 +512,7 @@ importers: version: 1.1.7 jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + version: 29.7.0(@types/node@18.18.7) jest-environment-jsdom: specifier: ^29.5.0 version: 29.7.0 @@ -545,37 +545,37 @@ importers: version: 5.7.0 '@graphprotocol/client-add-source-name': specifier: ^2.0.0 - version: 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) + version: 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) + '@graphprotocol/client-cli': + specifier: ^3.0.0 + version: 3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@graphprotocol/client-polling-live': specifier: ^2.0.0 version: 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) '@graphql-mesh/cache-localforage': specifier: ^0.96.0 - version: 0.96.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/cross-helpers': specifier: ^0.4.1 version: 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/graphql': specifier: ^0.96.0 - version: 0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) + version: 0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': specifier: ^0.96.13 - version: 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/runtime': specifier: ^0.96.12 - version: 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/store': specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': - specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': specifier: ^3.2.0 version: 3.2.0(graphql@16.8.1) @@ -617,7 +617,7 @@ importers: version: 7.1.1(node-fetch@3.3.2) viem: specifier: ^1.18.4 - version: 1.18.4(typescript@5.1.6)(zod@3.22.4) + version: 1.18.9(typescript@5.1.6)(zod@3.22.4) web3.storage: specifier: ^4.5.5 version: 4.5.5(node-fetch@3.3.2) @@ -634,12 +634,6 @@ importers: '@faker-js/faker': specifier: ^8.0.2 version: 8.2.0 - '@graphprotocol/client-cli': - specifier: ^3.0.0 - version: 3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 '@rollup/plugin-commonjs': specifier: ^24.0.1 version: 24.1.0(rollup@3.29.4) @@ -673,9 +667,6 @@ importers: abitype: specifier: ^0.10.2 version: 0.10.2(typescript@5.1.6)(zod@3.22.4) - babel-jest: - specifier: ^29.7.0 - version: 29.7.0(@babel/core@7.23.2) chai: specifier: ^4.3.7 version: 4.3.10 @@ -691,21 +682,9 @@ importers: ethereum-waffle: specifier: ^4.0.10 version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.1.6) - fetch-mock: - specifier: ^9.11.0 - version: 9.11.0(node-fetch@3.3.2) it-all: specifier: ^2.0.0 version: 2.0.1 - jest: - specifier: ^29.3.1 - version: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) - jest-extended: - specifier: ^4.0.0 - version: 4.0.2(jest@29.7.0) - jest-fetch-mock: - specifier: ^3.0.3 - version: 3.0.3 json-schema-to-typescript: specifier: ^12.0.0 version: 12.0.0 @@ -733,12 +712,6 @@ importers: sinon: specifier: ^15.2.0 version: 15.2.0 - ts-jest: - specifier: ^29.0.3 - version: 29.1.1(@babel/core@7.23.2)(babel-jest@29.7.0)(esbuild@0.17.19)(jest@29.7.0)(typescript@5.1.6) - ts-jest-resolver: - specifier: ^2.0.0 - version: 2.0.1 ts-mocha: specifier: ^10.0.0 version: 10.0.0(mocha@10.2.0) @@ -763,6 +736,9 @@ importers: typescript: specifier: 5.1.6 version: 5.1.6 + vitest: + specifier: ^0.28.4 + version: 0.28.5 vendor/observabletreemap: dependencies: @@ -1014,6 +990,7 @@ packages: ajv-formats: 2.1.1(ajv@8.12.0) fast-deep-equal: 3.1.3 rfdc: 1.3.0 + dev: false /@ardatan/relay-compiler@12.0.0(graphql@16.8.1): resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} @@ -1042,6 +1019,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@ardatan/sync-fetch@0.0.1: resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==} @@ -1050,6 +1028,7 @@ packages: node-fetch: 2.7.0 transitivePeerDependencies: - encoding + dev: false /@assemblyscript/loader@0.9.4: resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} @@ -1122,14 +1101,14 @@ packages: dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 - '@babel/generator': 7.17.7 + '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.17.8) '@babel/helpers': 7.23.2 - '@babel/parser': 7.18.9 + '@babel/parser': 7.23.0 '@babel/template': 7.22.15 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -1165,7 +1144,7 @@ packages: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.23.0 jsesc: 2.5.2 source-map: 0.5.7 dev: true @@ -1410,7 +1389,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.23.0 dev: true /@babel/parser@7.23.0: @@ -1452,6 +1431,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} @@ -1463,6 +1443,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-proposal-export-default-from@7.22.17(@babel/core@7.23.2): resolution: {integrity: sha512-cop/3quQBVvdz6X5SJC6AhUv3C9DrVTM06LUEXimEdWAhCSyOJIr9NiZDU9leHZ0/aiG0Sh7Zmvaku5TWYNgbA==} @@ -1473,6 +1454,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} @@ -1484,6 +1466,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} @@ -1495,6 +1478,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9): resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} @@ -1521,6 +1505,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} @@ -1532,6 +1517,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.2): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} @@ -1544,6 +1530,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} @@ -1603,6 +1590,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -1620,6 +1608,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} @@ -1932,6 +1921,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) + dev: false /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} @@ -2185,6 +2175,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} @@ -2204,6 +2195,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} @@ -2213,6 +2205,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} @@ -2226,6 +2219,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) '@babel/types': 7.23.0 + dev: false /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} @@ -2272,6 +2266,7 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} @@ -2470,6 +2465,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) + dev: false /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} @@ -2521,6 +2517,7 @@ packages: make-dir: 2.1.0 pirates: 4.0.6 source-map-support: 0.5.21 + dev: false /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} @@ -2551,13 +2548,13 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/generator': 7.17.7 + '@babel/generator': 7.23.0 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.18.9 - '@babel/types': 7.17.0 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: @@ -4175,6 +4172,7 @@ packages: dependencies: '@envelop/types': 3.0.2 tslib: 2.6.2 + dev: false /@envelop/core@5.0.0: resolution: {integrity: sha512-aJdnH/ptv+cvwfvciCBe7TSvccBwo9g0S5f6u35TBVzRVqIGkK03lFlIL+x1cnfZgN9EfR2b1PH2galrT1CdCQ==} @@ -4194,6 +4192,7 @@ packages: '@graphql-tools/utils': 8.13.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@envelop/extended-validation@4.0.0(@envelop/core@5.0.0)(graphql@16.8.1): resolution: {integrity: sha512-pvJ/OL+C+lpNiiCXezHT+vP3PTq37MQicoOB1l5MdgOOZZWRAp0NDOgvEKcXUY7AWNpvNHgSE0QFSRfGwsfwFQ==} @@ -4226,6 +4225,7 @@ packages: resolution: {integrity: sha512-pOFea9ha0EkURWxJ/35axoH9fDGP5S2cUu/5Mmo9pb8zUf+TaEot8vB670XXihFEn/92759BMjLJNWBKmNhyng==} dependencies: tslib: 2.6.2 + dev: false /@envelop/types@5.0.0: resolution: {integrity: sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA==} @@ -4245,6 +4245,7 @@ packages: hash-it: 6.0.0 lru-cache: 6.0.0 tslib: 2.6.2 + dev: false /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): resolution: {integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==} @@ -5322,7 +5323,7 @@ packages: /@ethereumjs/tx@3.4.0: resolution: {integrity: sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==} dependencies: - '@ethereumjs/common': 2.6.0 + '@ethereumjs/common': 2.6.5 ethereumjs-util: 7.1.5 dev: true @@ -5347,8 +5348,8 @@ packages: dependencies: '@ethereumjs/block': 3.6.3 '@ethereumjs/blockchain': 5.5.3 - '@ethereumjs/common': 2.6.0 - '@ethereumjs/tx': 3.4.0 + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 async-eventemitter: 0.2.4 core-js-pure: 3.33.1 debug: 2.6.9 @@ -5671,6 +5672,7 @@ packages: /@fastify/deepmerge@1.3.0: resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + dev: false /@float-capital/float-subgraph-uncrashable@0.0.0-internal-testing.5: resolution: {integrity: sha512-yZ0H5e3EpAYKokX/AbtplzlvSxEJY7ZfpvQyDzyODkks0hakAAlDG6fQu1SlDJMWorY7bbq1j7fCiFeTWci6TA==} @@ -5777,6 +5779,24 @@ packages: '@trufflesuite/bigint-buffer': 1.1.9 dev: true + /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} + peerDependencies: + '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 + '@graphql-tools/delegate': ^9.0.32 + '@graphql-tools/utils': ^9.2.1 + '@graphql-tools/wrap': ^9.4.2 + graphql: ^15.2.0 || ^16.0.0 + dependencies: + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) + graphql: 16.8.1 + lodash: 4.17.21 + tslib: 2.6.2 + dev: false + /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} peerDependencies: @@ -5795,7 +5815,7 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-add-source-name@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): + /@graphprotocol/client-add-source-name@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): resolution: {integrity: sha512-3vX8mVPIEJFwAoRhjTPd9IjQrBuE+Gv+JB7IEf8/9222qiU9EzHVFUekKxVtcxQXD40CfageS41CxOreWQ1enA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5805,15 +5825,16 @@ packages: '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) graphql: 16.8.1 lodash: 4.17.21 tslib: 2.6.2 + dev: false - /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-p8eEyeBcqxCXLxC7CNgIhLSCd7bjiKToKnrwYPShVb26gIG2JdAmD3/mpjuR+QaMA4chN/EO5t+TGvq6KnFx9g==} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 @@ -5822,7 +5843,7 @@ packages: '@graphql-tools/wrap': ^9.4.2 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) @@ -5831,7 +5852,7 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-auto-pagination@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): + /@graphprotocol/client-auto-pagination@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): resolution: {integrity: sha512-TouHgs6rQLpZSgnMoPdes8/ZTtMMEoxWeUUCkfho/xfSi49prb5DcsI83pykln0OEAUnNPnaX0MhP+xA5LtFSg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5841,24 +5862,24 @@ packages: '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) graphql: 16.8.1 lodash: 4.17.21 tslib: 2.6.2 - dev: true + dev: false - /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): + /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-kpiX2s804mpP3EVL0EdJfxeHWBTdg6SglIyEvSZ5T1OWyGDeMhr19D+gVIAlo22/PiBUkBDd0JfqppLsliPZ1A==} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 '@graphql-tools/delegate': ^9.0.32 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -5866,7 +5887,7 @@ packages: - '@graphql-mesh/utils' dev: false - /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): + /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): resolution: {integrity: sha512-mxqXKHK2lO+k4r02Q44n3qhd5dufo+SSDduD8zGUDBsYcRQAtQD9PwmXRHyUoB9nw4A+NC+CtVh+76fueXCG1w==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5874,14 +5895,14 @@ packages: '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: - '@graphql-mesh/utils' - dev: true + dev: false /@graphprotocol/client-block-tracking@1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-Eim0fZ0AgukHt5770j/UYDxfrqJroOhDe8FfNKKN7mDVRoMBoCsNknH47i03fh4A/kE8R+J6Job/zEJZPTtKnQ==} @@ -5906,21 +5927,21 @@ packages: '@graphql-tools/utils': 10.0.7(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 - dev: true + dev: false - /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-PIi8rFibYZVup+0jb08399RmbGF1ZrqUe6RXzLtKZBT57OWIMWwsFvdJyUAdr8Y8f0rrMn6A+Oy4nP1lf3hc1g==} hasBin: true peerDependencies: graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) + '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-polling-live': 1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -5946,20 +5967,20 @@ packages: - utf-8-validate dev: false - /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-hTISbOzKavlDifBNsR6JqQMfdYwY7++hflPy+c3WHRrZ4OMoxFmW7ZuvaP6LvgKdJV77O8w9dnT/uxeHs6a90g==} engines: {node: '>=16.0.0'} hasBin: true peerDependencies: graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) - '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) + '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) + '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 2.0.0(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -5983,7 +6004,7 @@ packages: - react-native-windows - supports-color - utf-8-validate - dev: true + dev: false /@graphprotocol/client-polling-live@1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1): resolution: {integrity: sha512-/XKnXNTts1VCUqwN2TCuPzQBfMGusL8vtamACKUeX65WxVy/H/Wjpcxq+w/XbyqNsQdG5QOoxY+AS/vKMhUcDQ==} @@ -6027,6 +6048,7 @@ packages: '@repeaterjs/repeater': 3.0.4 graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphprotocol/graph-cli@0.60.0(@types/node@18.18.7)(node-fetch@3.3.2)(typescript@4.9.5): resolution: {integrity: sha512-8tGaQJ0EzAPtkDXCAijFGoVdJXM+pKFlGxjiU31TdG5bS4cIUoSB6yWojVsFFod0yETAwf+giel/0/8sudYsDw==} @@ -6089,6 +6111,7 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.5.3 + dev: false /@graphql-codegen/plugin-helpers@2.7.2(graphql@16.8.1): resolution: {integrity: sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==} @@ -6102,6 +6125,7 @@ packages: import-from: 4.0.0 lodash: 4.17.21 tslib: 2.4.1 + dev: false /@graphql-codegen/plugin-helpers@3.1.2(graphql@16.8.1): resolution: {integrity: sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==} @@ -6115,6 +6139,7 @@ packages: import-from: 4.0.0 lodash: 4.17.21 tslib: 2.4.1 + dev: false /@graphql-codegen/plugin-helpers@4.2.0(graphql@16.8.1): resolution: {integrity: sha512-THFTCfg+46PXlXobYJ/OoCX6pzjI+9woQqCjdyKtgoI0tn3Xq2HUUCiidndxUpEYVrXb5pRiRXb7b/ZbMQqD0A==} @@ -6128,6 +6153,7 @@ packages: import-from: 4.0.0 lodash: 4.17.21 tslib: 2.5.3 + dev: false /@graphql-codegen/schema-ast@3.0.1(graphql@16.8.1): resolution: {integrity: sha512-rTKTi4XiW4QFZnrEqetpiYEWVsOFNoiR/v3rY9mFSttXFbIwNXPme32EspTiGWmEEdHY8UuTDtZN3vEcs/31zw==} @@ -6138,6 +6164,7 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.5.3 + dev: false /@graphql-codegen/typed-document-node@4.0.1(graphql@16.8.1): resolution: {integrity: sha512-mQNYCd12JsFSaK6xLry4olY9TdYG7GxQPexU6qU4Om++eKhseGwk2eGmQDRG4Qp8jEDFLMXuHMVUKqMQ1M+F/A==} @@ -6153,6 +6180,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/typescript-generic-sdk@3.1.0(graphql-tag@2.12.6)(graphql@16.8.1): resolution: {integrity: sha512-nQZi/YGRI1+qCZZsh0V5nz6+hCHSN4OU9tKyOTDsEPyDFnGEukDuRdCH2IZasGn22a3Iu5TUDkgp5w9wEQwGmg==} @@ -6169,6 +6197,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/typescript-operations@3.0.4(graphql@16.8.1): resolution: {integrity: sha512-6yE2OL2+WJ1vd5MwFEGXpaxsFGzjAGUytPVHDML3Bi3TwP1F3lnQlIko4untwvHW0JhZEGQ7Ck30H9HjcxpdKA==} @@ -6184,6 +6213,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/typescript-resolvers@3.2.1(graphql@16.8.1): resolution: {integrity: sha512-2ZIHk5J6HTuylse5ZIxw+aega54prHxvj7vM8hiKJ6vejZ94kvVPAq4aWmSFOkZ5lqU3YnM/ZyWfnhT5CUDj1g==} @@ -6200,6 +6230,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/typescript@3.0.4(graphql@16.8.1): resolution: {integrity: sha512-x4O47447DZrWNtE/l5CU9QzzW4m1RbmCEdijlA3s2flG/y1Ckqdemob4CWfilSm5/tZ3w1junVDY616RDTSvZw==} @@ -6215,6 +6246,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/visitor-plugin-common@2.13.1(graphql@16.8.1): resolution: {integrity: sha512-mD9ufZhDGhyrSaWQGrU1Q1c5f01TeWtSWy/cDwXYjJcHIj1Y/DG2x0tOflEfCvh5WcnmHNIw4lzDsg1W7iFJEg==} @@ -6235,6 +6267,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/visitor-plugin-common@3.1.1(graphql@16.8.1): resolution: {integrity: sha512-uAfp+zu/009R3HUAuTK2AamR1bxIltM6rrYYI6EXSmkM3rFtFsLTuJhjUDj98HcUCszJZrADppz8KKLGRUVlNg==} @@ -6255,6 +6288,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-inspector/core@3.3.0(graphql@16.8.1): resolution: {integrity: sha512-LRtk9sHgj9qqVPIkkThAVq3iZ7QxgHCx6elEwd0eesZBCmaIYQxD/BFu+VT8jr10YfOURBZuAnVdyGu64vYpBg==} @@ -6265,6 +6299,7 @@ packages: graphql: 16.8.1 object-inspect: 1.10.3 tslib: 2.6.2 + dev: false /@graphql-inspector/core@5.0.1(graphql@16.8.1): resolution: {integrity: sha512-1CWfFYucnRdULGiN1NDSinlNlpucBT+0x4i4AIthKe5n5jD9RIVyJtkA8zBbujUFrP++YE3l+TQifwbN1yTQsw==} @@ -6276,6 +6311,7 @@ packages: graphql: 16.8.1 object-inspect: 1.12.3 tslib: 2.6.0 + dev: false /@graphql-mesh/cache-localforage@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-cY/LJ+XC8kiyPoLxqPAMlOAvaeB81CZafdadLNyNDFuu66qDiZqWTYPw/lnhp2nyeukC8o/P69oP7d2OqVaCZA==} @@ -6290,6 +6326,7 @@ packages: graphql: 16.8.1 localforage: 1.10.0 tslib: 2.6.2 + dev: false /@graphql-mesh/cache-localforage@0.95.8(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-PgCTHh1dLwjmusWEWAMQkglL7gR8VyyT9pzTcYBVFhGYNXysepCrl85QtaqtEMnR/YijgpCWaKGIYK+bosQZsg==} @@ -6307,7 +6344,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/cache-localforage@0.96.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/cache-localforage@0.96.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-/6t3pQD9on2coxbUU5cIcW0EKzgB18SaHy24jADngLg5epF6aFAsu65riH8xa7WghmifBqN5EPC+SpTaeojBrw==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6316,8 +6353,8 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 localforage: 1.10.0 tslib: 2.6.2 @@ -6375,6 +6412,7 @@ packages: - react-native-windows - supports-color - utf-8-validate + dev: false /@graphql-mesh/config@0.93.1(@babel/core@7.23.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-g4omjuBBVPtyhEDeEa6uwfSSvUehV3zcwZVNbk+UJuFJEYPO4yBLsxfEZBpoeO6EriiPX2WnQyn5kiHbC3YTRA==} @@ -6410,6 +6448,7 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color + dev: false /@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-jseNppSNEwNWjcjDDwsxmRBK+ub8tz2qc/ca2ZfCTebuCk/+D3dI3LJ95ceNFOIhInK0g2HVq8BO8lMMX1pQtg==} @@ -6425,6 +6464,7 @@ packages: transitivePeerDependencies: - react-native - react-native-windows + dev: false /@graphql-mesh/cross-helpers@0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1): resolution: {integrity: sha512-NkLzFuY72tmmKO7gKWoDzoYcRVf3lLoCdlw30fSNKFKEWDAV3Tyh4v0fPvU3SEmoTJio7v0TIYZqtVt3dBBDFw==} @@ -6436,8 +6476,9 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 path-browserify: 1.0.1 + dev: false - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6449,10 +6490,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6467,7 +6508,7 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6479,10 +6520,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6495,7 +6536,7 @@ packages: - bufferutil - encoding - utf-8-validate - dev: true + dev: false /@graphql-mesh/graphql@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): resolution: {integrity: sha512-mEbz2XYSgRTdNidUBWB7FT3QzLliJwxJIoqipSbZNputJqSbUZZ6QD/oI1IrdPXqVl/ELE2CuLiogkOSO24C1Q==} @@ -6532,7 +6573,7 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): + /@graphql-mesh/graphql@0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): resolution: {integrity: sha512-jdPIFV/FXkGyKm8Buv+vpHt1Af0lt6+gpumwIlGb+h5JUwLZRkysHiXiUIFbFHVUn/cuoUGleKeewE9cBLwqVQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6545,10 +6586,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/federation': 1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) @@ -6585,6 +6626,28 @@ packages: graphql: 16.8.1 graphql-yoga: 3.9.1(graphql@16.8.1) tslib: 2.6.2 + dev: false + + /@graphql-mesh/http@0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-38Mxw2K2RABBBO0IiXKZDu2o+jlM4vcUSEg+9h2Dz67oOJZHpKeId6z1PFb7uYMzAs29yoMcqXIEnews+HVhrQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/runtime': ^0.96.13 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@whatwg-node/server': 0.9.16 + graphql: 16.8.1 + graphql-yoga: 5.0.0(graphql@16.8.1) + tslib: 2.6.2 + dev: false /@graphql-mesh/http@0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-38Mxw2K2RABBBO0IiXKZDu2o+jlM4vcUSEg+9h2Dz67oOJZHpKeId6z1PFb7uYMzAs29yoMcqXIEnews+HVhrQ==} @@ -6598,7 +6661,7 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@whatwg-node/server': 0.9.16 @@ -6625,6 +6688,28 @@ packages: tslib: 2.6.2 transitivePeerDependencies: - '@graphql-mesh/store' + dev: false + + /@graphql-mesh/merger-bare@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-E5R8Sv5Dkp+eswYKEDHgu8puwSeolPX1j9IHwBVe1npRRCXc3CjMsQJ9+kcTln453vbSBcM1a3fQspIaKA1Tcg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/merger-stitching': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@graphql-mesh/store' + dev: false /@graphql-mesh/merger-bare@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-E5R8Sv5Dkp+eswYKEDHgu8puwSeolPX1j9IHwBVe1npRRCXc3CjMsQJ9+kcTln453vbSBcM1a3fQspIaKA1Tcg==} @@ -6667,6 +6752,29 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false + + /@graphql-mesh/merger-stitching@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-eAukU8AsjK8jIT3vFhalGoERh98xZgzKkTCQL7w2wPpFXveSDMn+9fVvCJ1EBKTsLa7SkNXqzAFkfYp21hW0ng==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/store': ^0.95.8 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false /@graphql-mesh/merger-stitching@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eAukU8AsjK8jIT3vFhalGoERh98xZgzKkTCQL7w2wPpFXveSDMn+9fVvCJ1EBKTsLa7SkNXqzAFkfYp21hW0ng==} @@ -6714,8 +6822,9 @@ packages: '@whatwg-node/fetch': 0.8.8 graphql: 16.8.1 tslib: 2.6.2 + dev: false - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6731,8 +6840,8 @@ packages: '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -6744,7 +6853,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6760,8 +6869,8 @@ packages: '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -6790,8 +6899,9 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false - /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6803,9 +6913,9 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-inspector/core': 5.0.1(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -6829,6 +6939,7 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-mesh/string-interpolation@0.4.4(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-IotswBYZRaPswOebcr2wuOFuzD3dHIJxVEkPiiQubqjUIR8HhQI22XHJv0WNiQZ65z8NR9+GYWwEDIc2JRCNfQ==} @@ -6841,6 +6952,7 @@ packages: json-pointer: 0.6.2 lodash.get: 4.4.2 tslib: 2.6.2 + dev: false /@graphql-mesh/string-interpolation@0.5.3(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-/R4kj3M1uqUie/7RZ58zgRrT8RBrDsCCR6ii00s62DbLsl+jZYOZFyTqHGsFbP7L7aHnl0fo1dwhEJIs+rjCLg==} @@ -6854,8 +6966,9 @@ packages: json-pointer: 0.6.2 lodash.get: 4.4.2 tslib: 2.6.2 + dev: false - /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} peerDependencies: '@graphql-mesh/types': ^0.93.1 @@ -6863,12 +6976,29 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + + /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} + peerDependencies: + '@graphql-mesh/types': ^0.93.1 + '@graphql-mesh/utils': ^0.93.1 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} @@ -6885,6 +7015,24 @@ packages: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false + + /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} + peerDependencies: + '@graphql-mesh/store': ^0.93.1 + '@graphql-tools/utils': ^9.2.1 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/batch-delegate': 8.4.27(graphql@16.8.1) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false /@graphql-mesh/types@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-H2xh5KGc3+Ly3VdAPnRdKTibZpW9zEFgUzsozL9MQhCs6WLX+/kOADb0uIDqYFKX5c/2axmcy87BFNOausXYig==} @@ -6902,6 +7050,7 @@ packages: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-mesh/utils@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-U+VytfSoqPofH/pmYZHFY10SkIFtHKrvE7Isxv1d0DiweVjdH3Qtojw13DWFpu/EKtgJY5bqoVnlcsZJYlKQoA==} @@ -6924,8 +7073,9 @@ packages: lodash.topath: 4.5.2 tiny-lru: 8.0.2 tslib: 2.6.2 + dev: false - /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6935,9 +7085,9 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@whatwg-node/fetch': 0.9.14 @@ -6948,6 +7098,7 @@ packages: lodash.topath: 4.5.2 tiny-lru: 11.2.3 tslib: 2.6.2 + dev: false /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} @@ -6972,6 +7123,7 @@ packages: lodash.topath: 4.5.2 tiny-lru: 11.2.3 tslib: 2.6.2 + dev: false /@graphql-tools/batch-delegate@8.4.27(graphql@16.8.1): resolution: {integrity: sha512-efgDDJhljma9d3Ky/LswIu1xm/if2oS27XA1sOcxcShW+Ze+Qxi0hZZ6iyI4eQxVDX5Lyy/n+NvQEZAK1riqnQ==} @@ -6984,6 +7136,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/batch-delegate@9.0.0(graphql@16.8.1): resolution: {integrity: sha512-23NmxcHQeKcfhMQyrRPTZfW4/+bSpAyR/qAhRjx+/hikDIa1Uv2XVgV9jIitSgM0OEk/KGPB4VQv+LCOWvAYiw==} @@ -6997,6 +7150,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/batch-execute@8.5.22(graphql@16.8.1): resolution: {integrity: sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A==} @@ -7008,6 +7162,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/batch-execute@9.0.2(graphql@16.8.1): resolution: {integrity: sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ==} @@ -7020,6 +7175,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/code-file-loader@7.3.23(@babel/core@7.23.2)(graphql@16.8.1): resolution: {integrity: sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==} @@ -7035,6 +7191,7 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color + dev: false /@graphql-tools/delegate@10.0.3(graphql@16.8.1): resolution: {integrity: sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw==} @@ -7049,6 +7206,7 @@ packages: dataloader: 2.2.2 graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/delegate@9.0.35(graphql@16.8.1): resolution: {integrity: sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA==} @@ -7063,6 +7221,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/executor-graphql-ws@0.0.14(graphql@16.8.1): resolution: {integrity: sha512-P2nlkAsPZKLIXImFhj0YTtny5NQVGSsKnhi7PzXiaHSXc6KkzqbWZHKvikD4PObanqg+7IO58rKFpGXP7eeO+w==} @@ -7080,6 +7239,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /@graphql-tools/executor-graphql-ws@1.1.0(graphql@16.8.1): resolution: {integrity: sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg==} @@ -7115,6 +7275,7 @@ packages: value-or-promise: 1.0.12 transitivePeerDependencies: - '@types/node' + dev: false /@graphql-tools/executor-http@1.0.3(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-5WZIMBevRaxMabZ8U2Ty0dTUPy/PpeYSlMNEmC/YJjKKykgSfc/AwSejx2sE4FFKZ0I2kxRKRenyoWMHRAV49Q==} @@ -7148,6 +7309,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /@graphql-tools/executor-legacy-ws@1.0.4(graphql@16.8.1): resolution: {integrity: sha512-b7aGuRekZDS+m3af3BIvMKxu15bmVPMt5eGQVuP2v5pxmbaPTh+iv5mx9b3Plt32z5Ke5tycBnNm5urSFtW8ng==} @@ -7177,6 +7339,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/executor@0.0.20(graphql@16.8.1): resolution: {integrity: sha512-GdvNc4vszmfeGvUqlcaH1FjBoguvMYzxAfT6tDd4/LgwymepHhinqLNA5otqwVLW+JETcDaK7xGENzFomuE6TA==} @@ -7189,6 +7352,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/executor@1.2.0(graphql@16.8.1): resolution: {integrity: sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==} @@ -7202,6 +7366,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/federation@1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-H51qTYwbtfIYBO1uHXlImRWzo9tknSoIGBgJckDh+hdxJx43sZaMjJiLHc2DjRc/A8d2Bf0bi0HbH++HqOos/w==} @@ -7240,6 +7405,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 unixify: 1.0.0 + dev: false /@graphql-tools/graphql-tag-pluck@7.5.2(@babel/core@7.23.2)(graphql@16.8.1): resolution: {integrity: sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==} @@ -7256,6 +7422,7 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color + dev: false /@graphql-tools/import@6.7.18(graphql@16.8.1): resolution: {integrity: sha512-XQDdyZTp+FYmT7as3xRWH/x8dx0QZA2WZqfMF5EWb36a0PiH7WwlRQYIdyYXj8YCLpiWkeBXgBRHmMnwEYR8iQ==} @@ -7266,6 +7433,7 @@ packages: graphql: 16.8.1 resolve-from: 5.0.0 tslib: 2.6.2 + dev: false /@graphql-tools/load@7.8.14(graphql@16.8.1): resolution: {integrity: sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==} @@ -7277,6 +7445,7 @@ packages: graphql: 16.8.1 p-limit: 3.1.0 tslib: 2.6.2 + dev: false /@graphql-tools/merge@8.4.2(graphql@16.8.1): resolution: {integrity: sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==} @@ -7286,6 +7455,7 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/merge@9.0.0(graphql@16.8.1): resolution: {integrity: sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==} @@ -7296,6 +7466,7 @@ packages: '@graphql-tools/utils': 10.0.7(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/optimize@1.4.0(graphql@16.8.1): resolution: {integrity: sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==} @@ -7304,6 +7475,7 @@ packages: dependencies: graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/relay-operation-optimizer@6.5.18(graphql@16.8.1): resolution: {integrity: sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==} @@ -7317,6 +7489,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-tools/schema@10.0.0(graphql@16.8.1): resolution: {integrity: sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg==} @@ -7329,6 +7502,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/schema@9.0.19(graphql@16.8.1): resolution: {integrity: sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==} @@ -7340,6 +7514,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/stitch@8.7.50(graphql@16.8.1): resolution: {integrity: sha512-VB1/uZyXjj1P5Wj0c4EKX3q8Q1Maj4dy6uNwodEPaO3EHMpaJU/DqyN0Bvnhxu0ol7RzdY3kgsvsdUjU2QMImw==} @@ -7356,6 +7531,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/stitch@9.0.3(graphql@16.8.1): resolution: {integrity: sha512-G03XahiHDu1pnaS8z2GNfsV/5BribMEUATT5dCHBAqj13Te5y1amZNQePrmw8DLtbf5qDbU6CO7kGHPxv0XO9A==} @@ -7384,6 +7560,7 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/url-loader@7.17.18(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-ear0CiyTj04jCVAxi7TvgbnGDIN2HgqzXzwsfcqiVg9cvjT40NcMlZ2P1lZDgqMkZ9oyLTV8Bw6j+SyG6A+xPw==} @@ -7409,6 +7586,7 @@ packages: - bufferutil - encoding - utf-8-validate + dev: false /@graphql-tools/url-loader@8.0.0(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA==} @@ -7447,6 +7625,7 @@ packages: dset: 3.1.3 graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/utils@8.13.1(graphql@16.8.1): resolution: {integrity: sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==} @@ -7455,6 +7634,7 @@ packages: dependencies: graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/utils@9.2.1(graphql@16.8.1): resolution: {integrity: sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==} @@ -7464,6 +7644,7 @@ packages: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/wrap@10.0.1(graphql@16.8.1): resolution: {integrity: sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg==} @@ -7477,6 +7658,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/wrap@9.4.2(graphql@16.8.1): resolution: {integrity: sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA==} @@ -7489,6 +7671,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-typed-document-node/core@3.2.0(graphql@16.8.1): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} @@ -7496,11 +7679,13 @@ packages: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: graphql: 16.8.1 + dev: false /@graphql-yoga/logger@0.0.1: resolution: {integrity: sha512-6npFz7eZz33mXgSm1waBLMjUNG0D5hTc/p5Hcs1mojkT3KsLpCOFokzTEKboNsBhKevYcaVa/xeA7WBj4UYMLg==} dependencies: tslib: 2.6.2 + dev: false /@graphql-yoga/logger@2.0.0: resolution: {integrity: sha512-Mg8psdkAp+YTG1OGmvU+xa6xpsAmSir0hhr3yFYPyLNwzUj95DdIwsMpKadDj9xDpYgJcH3Hp/4JMal9DhQimA==} @@ -7516,6 +7701,7 @@ packages: '@repeaterjs/repeater': 3.0.4 '@whatwg-node/events': 0.0.2 tslib: 2.6.2 + dev: false /@graphql-yoga/subscription@5.0.0: resolution: {integrity: sha512-Ri7sK8hmxd/kwaEa0YT8uqQUb2wOLsmBMxI90QDyf96lzOMJRgBuNYoEkU1pSgsgmW2glceZ96sRYfaXqwVxUw==} @@ -7532,6 +7718,7 @@ packages: dependencies: '@repeaterjs/repeater': 3.0.4 tslib: 2.6.2 + dev: false /@graphql-yoga/typed-event-target@3.0.0: resolution: {integrity: sha512-w+liuBySifrstuHbFrHoHAEyVnDFVib+073q8AeAJ/qqJfvFvAwUPLLtNohR/WDVRgSasfXtl3dcNuVJWN+rjg==} @@ -7609,10 +7796,10 @@ packages: '@graphql-mesh/graphql': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': 1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6) '@openzeppelin/merkle-tree': 1.0.5 @@ -7769,7 +7956,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core@29.7.0(ts-node@10.9.1): + /@jest/core@29.7.0: resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7790,7 +7977,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.7) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -7817,6 +8004,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 + dev: false /@jest/environment@29.7.0: resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} @@ -7981,6 +8169,7 @@ packages: '@types/node': 18.18.7 '@types/yargs': 16.0.7 chalk: 4.1.2 + dev: false /@jest/types@29.6.3: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} @@ -9544,8 +9733,8 @@ packages: murmurhash3js-revisited: 3.0.0 dev: false - /@next/env@13.5.6: - resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} + /@next/env@14.0.3: + resolution: {integrity: sha512-7xRqh9nMvP5xrW4/+L0jgRRX+HoNRGnfJpD+5Wq6/13j3dsdzxO3BCXn7D3hMqsDb+vjZnJq+vI7+EtgrYZTeA==} dev: false /@next/eslint-plugin-next@12.2.0: @@ -9560,8 +9749,8 @@ packages: glob: 7.1.7 dev: false - /@next/swc-darwin-arm64@13.5.6: - resolution: {integrity: sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==} + /@next/swc-darwin-arm64@14.0.3: + resolution: {integrity: sha512-64JbSvi3nbbcEtyitNn2LEDS/hcleAFpHdykpcnrstITFlzFgB/bW0ER5/SJJwUPj+ZPY+z3e+1jAfcczRLVGw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -9569,8 +9758,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.5.6: - resolution: {integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==} + /@next/swc-darwin-x64@14.0.3: + resolution: {integrity: sha512-RkTf+KbAD0SgYdVn1XzqE/+sIxYGB7NLMZRn9I4Z24afrhUpVJx6L8hsRnIwxz3ERE2NFURNliPjJ2QNfnWicQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -9578,8 +9767,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.5.6: - resolution: {integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==} + /@next/swc-linux-arm64-gnu@14.0.3: + resolution: {integrity: sha512-3tBWGgz7M9RKLO6sPWC6c4pAw4geujSwQ7q7Si4d6bo0l6cLs4tmO+lnSwFp1Tm3lxwfMk0SgkJT7EdwYSJvcg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -9587,8 +9776,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.5.6: - resolution: {integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==} + /@next/swc-linux-arm64-musl@14.0.3: + resolution: {integrity: sha512-v0v8Kb8j8T23jvVUWZeA2D8+izWspeyeDGNaT2/mTHWp7+37fiNfL8bmBWiOmeumXkacM/AB0XOUQvEbncSnHA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -9596,8 +9785,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.5.6: - resolution: {integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==} + /@next/swc-linux-x64-gnu@14.0.3: + resolution: {integrity: sha512-VM1aE1tJKLBwMGtyBR21yy+STfl0MapMQnNrXkxeyLs0GFv/kZqXS5Jw/TQ3TSUnbv0QPDf/X8sDXuMtSgG6eg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -9605,8 +9794,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.5.6: - resolution: {integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==} + /@next/swc-linux-x64-musl@14.0.3: + resolution: {integrity: sha512-64EnmKy18MYFL5CzLaSuUn561hbO1Gk16jM/KHznYP3iCIfF9e3yULtHaMy0D8zbHfxset9LTOv6cuYKJgcOxg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -9614,8 +9803,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.5.6: - resolution: {integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==} + /@next/swc-win32-arm64-msvc@14.0.3: + resolution: {integrity: sha512-WRDp8QrmsL1bbGtsh5GqQ/KWulmrnMBgbnb+59qNTW1kVi1nG/2ndZLkcbs2GX7NpFLlToLRMWSQXmPzQm4tog==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -9623,8 +9812,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.5.6: - resolution: {integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==} + /@next/swc-win32-ia32-msvc@14.0.3: + resolution: {integrity: sha512-EKffQeqCrj+t6qFFhIFTRoqb2QwX1mU7iTOvMyLbYw3QtqTw9sMwjykyiMlZlrfm2a4fA84+/aeW+PMg1MjuTg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -9632,8 +9821,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.5.6: - resolution: {integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==} + /@next/swc-win32-x64-msvc@14.0.3: + resolution: {integrity: sha512-ERhKPSJ1vQrPiwrs15Pjz/rvDHZmkmvbf/BjPN/UCOI++ODftT0GtasDPi0j+y6PPJi5HsXw+dpRaXUaw4vjuQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -10286,15 +10475,6 @@ packages: - encoding dev: true - /@openzeppelin/defender-sdk-base-client@1.3.0: - resolution: {integrity: sha512-OMMt7NaAL8C95ralF9nMeKZpg96COLZT9FPpGpPsI7aB8fVZfCM8+6k99gTF44hMS6IsRdN2WthS3m7VzQeeoA==} - dependencies: - amazon-cognito-identity-js: 6.3.6 - async-retry: 1.3.3 - transitivePeerDependencies: - - encoding - dev: true - /@openzeppelin/defender-sdk-base-client@1.4.0: resolution: {integrity: sha512-aBDQpA4+ayFyx/2hQFRrBJqo6pKcF3eVbztjq49cHdg+cAQgM56Dy333Bp2z4bHzx1IbzmYcvhlhBH2LBnsdzg==} dependencies: @@ -10304,19 +10484,7 @@ packages: - encoding dev: true - /@openzeppelin/defender-sdk-deploy-client@1.3.0(debug@4.3.4): - resolution: {integrity: sha512-RTYM3HnVvD2d5NoYfTug8UwT41e0Jjwb13lk9v0Jl8z7mcclUVvAnKD4DHJ4b8RhKpg4B15oLQK/Igzjg1HHRA==} - dependencies: - '@ethersproject/abi': 5.7.0 - '@openzeppelin/defender-sdk-base-client': 1.3.0 - axios: 1.5.1(debug@4.3.4) - lodash: 4.17.21 - transitivePeerDependencies: - - debug - - encoding - dev: true - - /@openzeppelin/defender-sdk-deploy-client@1.4.0: + /@openzeppelin/defender-sdk-deploy-client@1.4.0(debug@4.3.4): resolution: {integrity: sha512-uXsGKXhH0P4xRBD0WvR8eo830sFd2jbES2Uf7nQnd8jGK5wxUgCLGgfrRXFznEzAbXA3xs+a5IGcmHwbL9MxyQ==} dependencies: '@ethersproject/abi': 5.7.0 @@ -10434,7 +10602,7 @@ packages: '@openzeppelin/defender-sdk-account-client': 1.4.0 '@openzeppelin/defender-sdk-action-client': 1.4.0 '@openzeppelin/defender-sdk-base-client': 1.4.0 - '@openzeppelin/defender-sdk-deploy-client': 1.4.0 + '@openzeppelin/defender-sdk-deploy-client': 1.4.0(debug@4.3.4) '@openzeppelin/defender-sdk-monitor-client': 1.4.0 '@openzeppelin/defender-sdk-network-client': 1.4.0 '@openzeppelin/defender-sdk-notification-channel-client': 1.4.0 @@ -10486,8 +10654,8 @@ packages: '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.18.3) '@openzeppelin/defender-admin-client': 1.50.0(debug@4.3.4) '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4) - '@openzeppelin/defender-sdk-base-client': 1.3.0 - '@openzeppelin/defender-sdk-deploy-client': 1.3.0(debug@4.3.4) + '@openzeppelin/defender-sdk-base-client': 1.4.0 + '@openzeppelin/defender-sdk-deploy-client': 1.4.0(debug@4.3.4) '@openzeppelin/upgrades-core': 1.31.0 chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) @@ -10605,7 +10773,7 @@ packages: '@plasmicapp/isomorphic-unfetch': 1.0.3 dev: false - /@plasmicapp/loader-nextjs@1.0.333(next@13.5.6)(react-dom@18.2.0)(react@18.2.0): + /@plasmicapp/loader-nextjs@1.0.333(next@14.0.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Uhkeeig9UhZQqLgH5QPuV3bd1jE4Z5ZsJgvoxmsL96XrGEuxEO2wUPLq02HQ+EgJtXuNTgbb5bSPZsVCJ/nCKQ==} engines: {node: '>=10'} peerDependencies: @@ -10617,7 +10785,7 @@ packages: '@plasmicapp/loader-edge': 1.0.46 '@plasmicapp/loader-react': 1.0.312(react-dom@18.2.0)(react@18.2.0) '@plasmicapp/watcher': 1.0.78 - next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + next: 14.0.3(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) server-only: 0.0.1 @@ -10788,6 +10956,7 @@ packages: prompts: 2.4.2 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-config@11.3.7: resolution: {integrity: sha512-FDBLku9xskS+bx0YFJFLCmUJhEZ4/MMSC9qPYOGBollWYdgE7k/TWI0IeYFmMALAnbCdKQAYP5N29N55Tad8lg==} @@ -10800,6 +10969,7 @@ packages: joi: 17.11.0 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-debugger-ui@11.3.7: resolution: {integrity: sha512-aVmKuPKHZENR8SrflkMurZqeyLwbKieHdOvaZCh1Nn/0UC5CxWcyST2DB2XQboZwsvr3/WXKJkSUO+SZ1J9qTQ==} @@ -10807,6 +10977,7 @@ packages: serve-static: 1.15.0 transitivePeerDependencies: - supports-color + dev: false /@react-native-community/cli-doctor@11.3.7: resolution: {integrity: sha512-YEHUqWISOHnsl5+NM14KHelKh68Sr5/HeEZvvNdIcvcKtZic3FU7Xd1WcbNdo3gCq5JvzGFfufx02Tabh5zmrg==} @@ -10831,6 +11002,7 @@ packages: yaml: 2.3.3 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-hermes@11.3.7: resolution: {integrity: sha512-chkKd8n/xeZkinRvtH6QcYA8rjNOKU3S3Lw/3Psxgx+hAYV0Gyk95qJHTalx7iu+PwjOOqqvCkJo5jCkYLkoqw==} @@ -10842,6 +11014,7 @@ packages: ip: 1.1.8 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-platform-android@11.3.7: resolution: {integrity: sha512-WGtXI/Rm178UQb8bu1TAeFC/RJvYGnbHpULXvE20GkmeJ1HIrMjkagyk6kkY3Ej25JAP2R878gv+TJ/XiRhaEg==} @@ -10853,6 +11026,7 @@ packages: logkitty: 0.7.1 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-platform-ios@11.3.7: resolution: {integrity: sha512-Z/8rseBput49EldX7MogvN6zJlWzZ/4M97s2P+zjS09ZoBU7I0eOKLi0N9wx+95FNBvGQQ/0P62bB9UaFQH2jw==} @@ -10865,6 +11039,7 @@ packages: ora: 5.4.1 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-plugin-metro@11.3.7(@babel/core@7.23.2): resolution: {integrity: sha512-0WhgoBVGF1f9jXcuagQmtxpwpfP+2LbLZH4qMyo6OtYLWLG13n2uRep+8tdGzfNzl1bIuUTeE9yZSAdnf9LfYQ==} @@ -10886,6 +11061,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /@react-native-community/cli-server-api@11.3.7: resolution: {integrity: sha512-yoFyGdvR3HxCnU6i9vFqKmmSqFzCbnFSnJ29a+5dppgPRetN+d//O8ard/YHqHzToFnXutAFf2neONn23qcJAg==} @@ -10904,6 +11080,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /@react-native-community/cli-tools@11.3.7: resolution: {integrity: sha512-peyhP4TV6Ps1hk+MBHTFaIR1eI3u+OfGBvr5r0wPwo3FAJvldRinMgcB/TcCcOBXVORu7ba1XYjkubPeYcqAyA==} @@ -10919,11 +11096,13 @@ packages: shell-quote: 1.8.1 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-types@11.3.7: resolution: {integrity: sha512-OhSr/TiDQkXjL5YOs8+hvGSB+HltLn5ZI0+A3DCiMsjUgTTsYh+Z63OtyMpNjrdCEFcg0MpfdU2uxstCS6Dc5g==} dependencies: joi: 17.11.0 + dev: false /@react-native-community/cli@11.3.7(@babel/core@7.23.2): resolution: {integrity: sha512-Ou8eDlF+yh2rzXeCTpMPYJ2fuqsusNOhmpYPYNQJQ2h6PvaF30kPomflgRILems+EBBuggRtcT+I+1YH4o/q6w==} @@ -10953,9 +11132,11 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /@react-native/assets-registry@0.72.0: resolution: {integrity: sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==} + dev: false /@react-native/codegen@0.72.7(@babel/preset-env@7.23.2): resolution: {integrity: sha512-O7xNcGeXGbY+VoqBGNlZ3O05gxfATlwE1Q1qQf5E38dK+tXn5BY4u0jaQ9DPjfE8pBba8g/BYI1N44lynidMtg==} @@ -10969,15 +11150,19 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color + dev: false /@react-native/gradle-plugin@0.72.11: resolution: {integrity: sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw==} + dev: false /@react-native/js-polyfills@0.72.1: resolution: {integrity: sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA==} + dev: false /@react-native/normalize-colors@0.72.0: resolution: {integrity: sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw==} + dev: false /@react-native/virtualized-lists@0.72.8(react-native@0.72.6): resolution: {integrity: sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==} @@ -10987,9 +11172,11 @@ packages: invariant: 2.2.4 nullthrows: 1.1.1 react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) + dev: false /@repeaterjs/repeater@3.0.4: resolution: {integrity: sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==} + dev: false /@rescript/std@9.0.0: resolution: {integrity: sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ==} @@ -11487,7 +11674,7 @@ packages: '@sentry/types': 5.30.0 tslib: 1.14.1 - /@sentry/nextjs@7.75.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0): + /@sentry/nextjs@7.75.1(next@14.0.3)(react@18.2.0)(webpack@5.89.0): resolution: {integrity: sha512-5DEW6Ksjuox8idf3O0NclF/rHSS0Z1VCIoFHW6d28FHFKU+/RkFwJTB13KfpQMBj1fiA9qSNJdy/2QlGUWVRmA==} engines: {node: '>=8'} peerDependencies: @@ -11508,7 +11695,7 @@ packages: '@sentry/vercel-edge': 7.75.1 '@sentry/webpack-plugin': 1.20.0 chalk: 3.0.0 - next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + next: 14.0.3(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 resolve: 1.22.8 rollup: 2.78.0 @@ -13027,6 +13214,7 @@ packages: resolution: {integrity: sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==} dependencies: '@types/yargs-parser': 21.0.2 + dev: false /@types/yargs@17.0.29: resolution: {integrity: sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==} @@ -14252,9 +14440,11 @@ packages: dependencies: '@whatwg-node/events': 0.0.3 tslib: 2.6.2 + dev: false /@whatwg-node/events@0.0.2: resolution: {integrity: sha512-WKj/lI4QjnLuPrim0cfO7i+HsDSXHxNv1y0CrJhdntuO3hxWZmnXCwNDnwOvry11OjRin6cgWNF+j/9Pn8TN4w==} + dev: false /@whatwg-node/events@0.0.3: resolution: {integrity: sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==} @@ -14262,6 +14452,7 @@ packages: /@whatwg-node/events@0.1.1: resolution: {integrity: sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==} engines: {node: '>=16.0.0'} + dev: false /@whatwg-node/fetch@0.8.8: resolution: {integrity: sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==} @@ -14278,6 +14469,7 @@ packages: dependencies: '@whatwg-node/node-fetch': 0.5.0 urlpattern-polyfill: 9.0.0 + dev: false /@whatwg-node/node-fetch@0.3.6: resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==} @@ -14297,12 +14489,14 @@ packages: fast-querystring: 1.1.2 fast-url-parser: 1.1.3 tslib: 2.6.2 + dev: false /@whatwg-node/server@0.7.7: resolution: {integrity: sha512-aHURgNDFm/48WVV3vhTMfnEKCYwYgdaRdRhZsQZx4UVFjGGkGay7Ys0+AYu9QT/jpoImv2oONkstoTMUprDofg==} dependencies: '@whatwg-node/fetch': 0.8.8 tslib: 2.6.2 + dev: false /@whatwg-node/server@0.9.16: resolution: {integrity: sha512-gktQkRyONEw2EGpx7UZaC6zNlUm21CGlqAHQXU3QC6W0zlLM5ZQNDCeD66q/nsPHDV08X2NTHlABsuAEk5rh/w==} @@ -14685,6 +14879,7 @@ packages: /anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + dev: false /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -14719,6 +14914,7 @@ packages: colorette: 1.4.0 slice-ansi: 2.1.0 strip-ansi: 5.2.0 + dev: false /ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} @@ -14828,6 +15024,7 @@ packages: /appdirsjs@1.2.7: resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} + dev: false /append-transform@2.0.0: resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} @@ -15080,10 +15277,12 @@ packages: engines: {node: '>=4'} dependencies: tslib: 2.6.2 + dev: false /astral-regex@1.0.0: resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} engines: {node: '>=4'} + dev: false /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} @@ -15149,6 +15348,7 @@ packages: /auto-bind@4.0.0: resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} engines: {node: '>=8'} + dev: false /autoprefixer@10.4.16(postcss@8.4.31): resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} @@ -15247,6 +15447,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 + dev: false /babel-jest@29.7.0(@babel/core@7.23.2): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} @@ -15391,6 +15592,7 @@ packages: /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} + dev: false /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.2): resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} @@ -15398,6 +15600,7 @@ packages: '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) transitivePeerDependencies: - '@babel/core' + dev: false /babel-plugin-transform-react-qa-classes@1.6.0: resolution: {integrity: sha512-r7G9s+j6CiatnTMP+32fbPrfrSSPWJ3LBoESNlCdXWb8oAO2Ubcrgk0TSbpHVMoDpBiyn+zfm2rxdxwdTt3FpQ==} @@ -15473,6 +15676,7 @@ packages: '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 + dev: false /babel-preset-jest@29.6.3(@babel/core@7.23.2): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} @@ -15514,6 +15718,7 @@ packages: /base-64@0.1.0: resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} + dev: false /base-x@3.0.9: resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} @@ -15793,7 +15998,7 @@ packages: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 - chalk: 5.0.1 + chalk: 5.3.0 cli-boxes: 3.0.0 string-width: 5.1.2 type-fest: 2.19.0 @@ -15859,13 +16064,6 @@ packages: node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - /bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} dependencies: @@ -16090,16 +16288,19 @@ packages: engines: {node: '>=4'} dependencies: callsites: 2.0.0 + dev: false /caller-path@2.0.0: resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} engines: {node: '>=4'} dependencies: caller-callsite: 2.0.0 + dev: false /callsites@2.0.0: resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} engines: {node: '>=4'} + dev: false /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -16160,6 +16361,7 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 + dev: false /carbites@1.0.6: resolution: {integrity: sha512-dS9IQvnrb5VIRvSTNz5Ff+mB9d2MFfi5mojtJi7Rlss79VeF190jr0sZdA7eW0CGHotvHkZaWuM6wgfD9PEFRg==} @@ -16289,7 +16491,6 @@ packages: /chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true /chance@1.1.11: resolution: {integrity: sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA==} @@ -16308,6 +16509,7 @@ packages: title-case: 3.0.3 upper-case: 2.0.2 upper-case-first: 2.0.2 + dev: false /change-case-all@1.0.15: resolution: {integrity: sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==} @@ -16322,6 +16524,7 @@ packages: title-case: 3.0.3 upper-case: 2.0.2 upper-case-first: 2.0.2 + dev: false /change-case@4.1.2: resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} @@ -16338,6 +16541,7 @@ packages: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.6.2 + dev: false /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} @@ -16713,6 +16917,7 @@ packages: /colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + dev: false /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -16775,6 +16980,7 @@ packages: /commander@2.13.0: resolution: {integrity: sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==} + dev: false /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -16808,6 +17014,7 @@ packages: /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + dev: false /commitizen@4.3.0(typescript@4.9.5): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} @@ -16913,6 +17120,7 @@ packages: utils-merge: 1.0.1 transitivePeerDependencies: - supports-color + dev: false /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} @@ -16924,6 +17132,7 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case: 2.0.2 + dev: false /content-disposition@0.5.2: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} @@ -17112,6 +17321,7 @@ packages: is-directory: 0.3.1 js-yaml: 3.14.1 parse-json: 4.0.0 + dev: false /cosmiconfig@6.0.0: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} @@ -17175,6 +17385,7 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 typescript: 5.1.6 + dev: false /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} @@ -17200,7 +17411,7 @@ packages: safe-buffer: 5.2.1 sha.js: 2.4.11 - /create-jest@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@18.18.7): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -17209,7 +17420,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.7) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -17240,6 +17451,7 @@ packages: node-fetch: 2.7.0 transitivePeerDependencies: - encoding + dev: false /cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} @@ -17889,6 +18101,7 @@ packages: /dataloader@2.2.2: resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} + dev: false /datastore-core@8.0.4: resolution: {integrity: sha512-oBA6a024NFXJOTu+w9nLAimfy4wCYUhdE/5XQGtdKt1BmCVtPYW10GORvVT3pdZBcse6k/mVcBl+hjkXIlm65A==} @@ -17963,6 +18176,7 @@ packages: /dayjs@1.11.7: resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + dev: false /death@1.1.0: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} @@ -18263,6 +18477,7 @@ packages: /denodeify@1.2.1: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} + dev: false /denque@1.5.1: resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==} @@ -18280,6 +18495,7 @@ packages: /dependency-graph@0.11.0: resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} engines: {node: '>= 0.6.0'} + dev: false /deprecated-react-native-prop-types@4.1.0: resolution: {integrity: sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw==} @@ -18287,6 +18503,7 @@ packages: '@react-native/normalize-colors': 0.72.0 invariant: 2.2.4 prop-types: 15.8.1 + dev: false /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -18426,6 +18643,7 @@ packages: dependencies: asap: 2.0.6 lodash.clone: 4.5.0 + dev: false /docker-compose@0.23.19: resolution: {integrity: sha512-v5vNLIdUqwj4my80wxFDkNH+4S85zsRuH29SO7dCWVWPCMt/ohZBsGN6g6KXWifT0pzQ7uOxqEKCYCDPJ8Vz4g==} @@ -18612,6 +18830,7 @@ packages: /dset@3.1.3: resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} + dev: false /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} @@ -18812,6 +19031,7 @@ packages: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} dependencies: stackframe: 1.3.4 + dev: false /errorhandler@1.5.1: resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} @@ -18819,6 +19039,7 @@ packages: dependencies: accepts: 1.3.8 escape-html: 1.0.3 + dev: false /es-abstract@1.22.3: resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} @@ -20031,6 +20252,7 @@ packages: /extract-files@11.0.0: resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} engines: {node: ^12.20 || >= 14.13} + dev: false /extract-zip@2.0.1(supports-color@8.1.1): resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} @@ -20141,6 +20363,7 @@ packages: hasBin: true dependencies: strnum: 1.0.5 + dev: false /fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} @@ -20176,6 +20399,7 @@ packages: /fbjs-css-vars@1.0.2: resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + dev: false /fbjs@3.0.5: resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} @@ -20189,6 +20413,7 @@ packages: ua-parser-js: 1.0.36 transitivePeerDependencies: - encoding + dev: false /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -20210,30 +20435,6 @@ packages: node-domexception: 1.0.0 web-streams-polyfill: 3.2.1 - /fetch-mock@9.11.0(node-fetch@3.3.2): - resolution: {integrity: sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==} - engines: {node: '>=4.0.0'} - peerDependencies: - node-fetch: '*' - peerDependenciesMeta: - node-fetch: - optional: true - dependencies: - '@babel/core': 7.23.2 - '@babel/runtime': 7.23.2 - core-js: 3.33.1 - debug: 4.3.4(supports-color@8.1.1) - glob-to-regexp: 0.4.1 - is-subset: 0.1.1 - lodash.isequal: 4.5.0 - node-fetch: 3.3.2 - path-to-regexp: 2.2.1 - querystring: 0.2.1 - whatwg-url: 6.5.0 - transitivePeerDependencies: - - supports-color - dev: true - /fets@0.1.5: resolution: {integrity: sha512-mL/ya591WOgCP1yBBPbp8E37nynj8QQF6iQCUVl0aHDL80BZ9SOL4BcKBy0dnKdC+clnnAkMm05KB9hsj4m4jQ==} dependencies: @@ -20249,6 +20450,7 @@ packages: tslib: 2.6.2 zod: 3.22.4 zod-to-json-schema: 3.21.4(zod@3.22.4) + dev: false /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} @@ -20377,6 +20579,7 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color + dev: false /finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} @@ -20399,6 +20602,7 @@ packages: commondir: 1.0.1 make-dir: 2.1.0 pkg-dir: 3.0.0 + dev: false /find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} @@ -20459,6 +20663,7 @@ packages: engines: {node: '>=6'} dependencies: locate-path: 3.0.0 + dev: false /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -20509,10 +20714,12 @@ packages: /flow-enums-runtime@0.0.5: resolution: {integrity: sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ==} + dev: false /flow-parser@0.206.0: resolution: {integrity: sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==} engines: {node: '>=0.4.0'} + dev: false /flux@4.0.4(react@18.2.0): resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} @@ -20554,6 +20761,7 @@ packages: /foreach@2.0.6: resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} + dev: false /foreground-child@2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} @@ -21428,6 +21636,7 @@ packages: dependencies: graphql: 16.8.1 tslib: 2.6.2 + dev: false /graphql-ws@5.12.1(graphql@16.8.1): resolution: {integrity: sha512-umt4f5NnMK46ChM2coO36PTFhHouBrK9stWWBczERguwYrGnPNxJ9dimU6IyOBfOkC6Izhkg4H8+F51W/8CYDg==} @@ -21436,6 +21645,7 @@ packages: graphql: '>=0.11 <=16' dependencies: graphql: 16.8.1 + dev: false /graphql-ws@5.14.2(graphql@16.8.1): resolution: {integrity: sha512-LycmCwhZ+Op2GlHz4BZDsUYHKRiiUz+3r9wbhBATMETNlORQJAaFlAgTFoeRh6xQoQegwYwIylVD1Qns9/DA3w==} @@ -21444,6 +21654,7 @@ packages: graphql: '>=0.11 <=16' dependencies: graphql: 16.8.1 + dev: false /graphql-yoga@3.9.1(graphql@16.8.1): resolution: {integrity: sha512-BB6EkN64VBTXWmf9Kym2OsVZFzBC0mAsQNo9eNB5xIr3t+x7qepQ34xW5A353NWol3Js3xpzxwIKFVF6l9VsPg==} @@ -21463,6 +21674,7 @@ packages: graphql: 16.8.1 lru-cache: 7.18.3 tslib: 2.6.2 + dev: false /graphql-yoga@5.0.0(graphql@16.8.1): resolution: {integrity: sha512-ZvZlO8MHMDWuLRoDhvJQnXg8SOJD0iDaCA+M/zWuD26AlhEugOEbpnhw/645oqXTYtvHsM91WyxtV7p5XJWYMg==} @@ -21865,6 +22077,7 @@ packages: /hash-it@6.0.0: resolution: {integrity: sha512-KHzmSFx1KwyMPw0kXeeUD752q/Kfbzhy6dAZrjXV9kAIXGqzGvv8vhkUqj+2MGZldTo0IBpw6v7iWE7uxsvH0w==} + dev: false /hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} @@ -21965,23 +22178,27 @@ packages: dependencies: capital-case: 1.0.4 tslib: 2.6.2 + dev: false /heap@0.2.7: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} /hermes-estree@0.12.0: resolution: {integrity: sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw==} + dev: false /hermes-parser@0.12.0: resolution: {integrity: sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw==} dependencies: hermes-estree: 0.12.0 + dev: false /hermes-profile-transformer@0.0.6: resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} engines: {node: '>=8'} dependencies: source-map: 0.7.4 + dev: false /hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} @@ -22030,6 +22247,7 @@ packages: /hotscript@1.0.13: resolution: {integrity: sha512-C++tTF1GqkGYecL+2S1wJTfoH6APGAsbb7PAWQ3iVIwgG/EFseAfEVOKFgAFq4yK3+6j1EjUD4UQ9dRJHX/sSQ==} + dev: false /hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -22375,6 +22593,7 @@ packages: hasBin: true dependencies: queue: 6.0.2 + dev: false /immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -22394,6 +22613,7 @@ packages: /immutable@3.7.6: resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} engines: {node: '>=0.8.0'} + dev: false /immutable@4.2.1: resolution: {integrity: sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==} @@ -22408,6 +22628,7 @@ packages: dependencies: caller-path: 2.0.0 resolve-from: 3.0.0 + dev: false /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -22419,6 +22640,7 @@ packages: /import-from@4.0.0: resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} engines: {node: '>=12.2'} + dev: false /import-lazy@2.1.0: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} @@ -22613,6 +22835,7 @@ packages: /ip@1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} + dev: false /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -23249,6 +23472,7 @@ packages: dependencies: is-relative: 1.0.0 is-windows: 1.0.2 + dev: false /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} @@ -23354,6 +23578,7 @@ packages: /is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} + dev: false /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} @@ -23469,6 +23694,7 @@ packages: resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} dependencies: tslib: 2.6.2 + dev: false /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -23593,6 +23819,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-unc-path: 1.0.0 + dev: false /is-retry-allowed@1.2.0: resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} @@ -23645,10 +23872,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-subset@0.1.1: - resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} - dev: true - /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} @@ -23677,6 +23900,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: unc-path-regex: 0.1.2 + dev: false /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -23686,6 +23910,7 @@ packages: resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} dependencies: tslib: 2.6.2 + dev: false /is-url@1.2.4: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} @@ -23732,6 +23957,7 @@ packages: /is-wsl@1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} + dev: false /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} @@ -23811,6 +24037,7 @@ packages: ws: '*' dependencies: ws: 8.13.0 + dev: false /isomorphic-ws@5.0.0(ws@8.14.2): resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} @@ -23818,6 +24045,7 @@ packages: ws: '*' dependencies: ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + dev: false /isows@1.0.3(ws@8.13.0): resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} @@ -24341,7 +24569,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@18.18.7): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -24351,14 +24579,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@18.18.7) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.7) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -24369,7 +24597,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@18.18.7): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -24404,7 +24632,6 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.1.6) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -24472,29 +24699,6 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /jest-extended@4.0.2(jest@29.7.0): - resolution: {integrity: sha512-FH7aaPgtGYHc9mRjriS0ZEHYM5/W69tLrFTIdzm+yJgeoCmmrSB/luSfMSqWP9O29QWHPEmJ4qmU6EwsZideog==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - jest: '>=27.2.5' - peerDependenciesMeta: - jest: - optional: true - dependencies: - jest: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - dev: true - - /jest-fetch-mock@3.0.3: - resolution: {integrity: sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==} - dependencies: - cross-fetch: 3.1.8 - promise-polyfill: 8.3.0 - transitivePeerDependencies: - - encoding - dev: true - /jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -24573,6 +24777,7 @@ packages: /jest-regex-util@27.5.1: resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: false /jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} @@ -24701,6 +24906,7 @@ packages: ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 + dev: false /jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} @@ -24755,7 +24961,7 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): + /jest@29.7.0(@types/node@18.18.7): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -24765,10 +24971,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@18.18.7) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -24841,9 +25047,11 @@ packages: /jsc-android@250231.0.0: resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} + dev: false /jsc-safe-url@0.2.4: resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + dev: false /jscodeshift@0.14.0(@babel/preset-env@7.23.2): resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} @@ -24873,6 +25081,7 @@ packages: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color + dev: false /jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} @@ -24926,6 +25135,7 @@ packages: /json-bigint-patch@0.0.8: resolution: {integrity: sha512-xa0LTQsyaq8awYyZyuUsporWisZFiyqzxGW8CKM3t7oouf0GFAKYJnqAm6e9NLNBQOCtOLvy614DEiRX/rPbnA==} + dev: false /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -24953,6 +25163,7 @@ packages: resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} dependencies: foreach: 2.0.6 + dev: false /json-rpc-engine@6.1.0: resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} @@ -24982,6 +25193,7 @@ packages: '@babel/runtime': 7.23.2 '@types/json-schema': 7.0.14 ts-algebra: 1.2.2 + dev: false /json-schema-to-typescript@12.0.0: resolution: {integrity: sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==} @@ -25465,6 +25677,7 @@ packages: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} dependencies: immediate: 3.0.6 + dev: false /lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -25627,6 +25840,7 @@ packages: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} dependencies: lie: 3.1.1 + dev: false /locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} @@ -25641,6 +25855,7 @@ packages: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 + dev: false /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} @@ -25675,6 +25890,7 @@ packages: /lodash.clone@4.5.0: resolution: {integrity: sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==} + dev: false /lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} @@ -25778,19 +25994,17 @@ packages: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true - /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true /lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: false /lodash.topath@4.5.2: resolution: {integrity: sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==} + dev: false /lodash.trim@4.5.1: resolution: {integrity: sha512-nJAlRl/K+eiOehWKDzoBVrSMhK0K3A3YQsUNXHQa5yIrKBAhsZgSu3KoAFoFT+mEgiyBHddZ0pRk1ITpIp90Wg==} @@ -25868,6 +26082,7 @@ packages: ansi-fragments: 0.2.1 dayjs: 1.11.10 yargs: 15.4.1 + dev: false /loglevel@1.8.1: resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} @@ -25909,6 +26124,7 @@ packages: resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} dependencies: tslib: 2.6.2 + dev: false /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -25951,6 +26167,7 @@ packages: /lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + dev: false /lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} @@ -26035,6 +26252,7 @@ packages: /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} + dev: false /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} @@ -26200,6 +26418,7 @@ packages: /memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + dev: false /memoizee@0.4.15: resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} @@ -26323,6 +26542,7 @@ packages: optional: true dependencies: '@types/node': 18.18.7 + dev: false /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -26337,10 +26557,12 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color + dev: false /metro-cache-key@0.76.8: resolution: {integrity: sha512-buKQ5xentPig9G6T37Ww/R/bC+/V1MA5xU/D8zjnhlelsrPG6w6LtHUS61ID3zZcMZqYaELWk5UIadIdDsaaLw==} engines: {node: '>=16'} + dev: false /metro-cache@0.76.8: resolution: {integrity: sha512-QBJSJIVNH7Hc/Yo6br/U/qQDUpiUdRgZ2ZBJmvAbmAKp2XDzsapnMwK/3BGj8JNWJF7OLrqrYHsRsukSbUBpvQ==} @@ -26348,6 +26570,7 @@ packages: dependencies: metro-core: 0.76.8 rimraf: 3.0.2 + dev: false /metro-config@0.76.8: resolution: {integrity: sha512-SL1lfKB0qGHALcAk2zBqVgQZpazDYvYFGwCK1ikz0S6Y/CM2i2/HwuZN31kpX6z3mqjv/6KvlzaKoTb1otuSAA==} @@ -26365,6 +26588,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /metro-core@0.76.8: resolution: {integrity: sha512-sl2QLFI3d1b1XUUGxwzw/KbaXXU/bvFYrSKz6Sg19AdYGWFyzsgZ1VISRIDf+HWm4R/TJXluhWMEkEtZuqi3qA==} @@ -26372,6 +26596,7 @@ packages: dependencies: lodash.throttle: 4.1.1 metro-resolver: 0.76.8 + dev: false /metro-file-map@0.76.8: resolution: {integrity: sha512-A/xP1YNEVwO1SUV9/YYo6/Y1MmzhL4ZnVgcJC3VmHp/BYVOXVStzgVbWv2wILe56IIMkfXU+jpXrGKKYhFyHVw==} @@ -26393,6 +26618,7 @@ packages: fsevents: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /metro-inspector-proxy@0.76.8: resolution: {integrity: sha512-Us5o5UEd4Smgn1+TfHX4LvVPoWVo9VsVMn4Ldbk0g5CQx3Gu0ygc/ei2AKPGTwsOZmKxJeACj7yMH2kgxQP/iw==} @@ -26409,18 +26635,21 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /metro-minify-terser@0.76.8: resolution: {integrity: sha512-Orbvg18qXHCrSj1KbaeSDVYRy/gkro2PC7Fy2tDSH1c9RB4aH8tuMOIXnKJE+1SXxBtjWmQ5Yirwkth2DyyEZA==} engines: {node: '>=16'} dependencies: terser: 5.22.0 + dev: false /metro-minify-uglify@0.76.8: resolution: {integrity: sha512-6l8/bEvtVaTSuhG1FqS0+Mc8lZ3Bl4RI8SeRIifVLC21eeSDp4CEBUWSGjpFyUDfi6R5dXzYaFnSgMNyfxADiQ==} engines: {node: '>=16'} dependencies: uglify-es: 3.3.9 + dev: false /metro-react-native-babel-preset@0.76.8(@babel/core@7.23.2): resolution: {integrity: sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==} @@ -26469,6 +26698,7 @@ packages: react-refresh: 0.4.3 transitivePeerDependencies: - supports-color + dev: false /metro-react-native-babel-transformer@0.76.8(@babel/core@7.23.2): resolution: {integrity: sha512-3h+LfS1WG1PAzhq8QF0kfXjxuXetbY/lgz8vYMQhgrMMp17WM1DNJD0gjx8tOGYbpbBC1qesJ45KMS4o5TA73A==} @@ -26483,10 +26713,12 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color + dev: false /metro-resolver@0.76.8: resolution: {integrity: sha512-KccOqc10vrzS7ZhG2NSnL2dh3uVydarB7nOhjreQ7C4zyWuiW9XpLC4h47KtGQv3Rnv/NDLJYeDqaJ4/+140HQ==} engines: {node: '>=16'} + dev: false /metro-runtime@0.76.8: resolution: {integrity: sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==} @@ -26494,6 +26726,7 @@ packages: dependencies: '@babel/runtime': 7.23.2 react-refresh: 0.4.3 + dev: false /metro-source-map@0.76.8: resolution: {integrity: sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==} @@ -26509,6 +26742,7 @@ packages: vlq: 1.0.1 transitivePeerDependencies: - supports-color + dev: false /metro-symbolicate@0.76.8: resolution: {integrity: sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w==} @@ -26523,6 +26757,7 @@ packages: vlq: 1.0.1 transitivePeerDependencies: - supports-color + dev: false /metro-transform-plugins@0.76.8: resolution: {integrity: sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA==} @@ -26535,6 +26770,7 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color + dev: false /metro-transform-worker@0.76.8: resolution: {integrity: sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ==} @@ -26557,6 +26793,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /metro@0.76.8: resolution: {integrity: sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg==} @@ -26616,6 +26853,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} @@ -26842,6 +27080,7 @@ packages: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true + dev: false /mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} @@ -27373,9 +27612,9 @@ packages: /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - /next@13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==} - engines: {node: '>=16.14.0'} + /next@14.0.3(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-AbYdRNfImBr3XGtvnwOxq8ekVCwbFTv/UJoLwmaX89nk9i051AEY4/HAWzU0YpaTDw8IofUpmuIlvzWF13jxIw==} + engines: {node: '>=18.17.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -27388,7 +27627,7 @@ packages: sass: optional: true dependencies: - '@next/env': 13.5.6 + '@next/env': 14.0.3 '@swc/helpers': 0.5.2 busboy: 1.6.0 caniuse-lite: 1.0.30001554 @@ -27398,15 +27637,15 @@ packages: styled-jsx: 5.1.1(@babel/core@7.23.2)(react@18.2.0) watchpack: 2.4.0 optionalDependencies: - '@next/swc-darwin-arm64': 13.5.6 - '@next/swc-darwin-x64': 13.5.6 - '@next/swc-linux-arm64-gnu': 13.5.6 - '@next/swc-linux-arm64-musl': 13.5.6 - '@next/swc-linux-x64-gnu': 13.5.6 - '@next/swc-linux-x64-musl': 13.5.6 - '@next/swc-win32-arm64-msvc': 13.5.6 - '@next/swc-win32-ia32-msvc': 13.5.6 - '@next/swc-win32-x64-msvc': 13.5.6 + '@next/swc-darwin-arm64': 14.0.3 + '@next/swc-darwin-x64': 14.0.3 + '@next/swc-linux-arm64-gnu': 14.0.3 + '@next/swc-linux-arm64-musl': 14.0.3 + '@next/swc-linux-x64-gnu': 14.0.3 + '@next/swc-linux-x64-musl': 14.0.3 + '@next/swc-win32-arm64-msvc': 14.0.3 + '@next/swc-win32-ia32-msvc': 14.0.3 + '@next/swc-win32-x64-msvc': 14.0.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -27453,9 +27692,11 @@ packages: /nocache@3.0.4: resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} engines: {node: '>=12.0.0'} + dev: false /node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: false /node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} @@ -27465,6 +27706,7 @@ packages: engines: {node: '>= 0.10.5'} dependencies: minimatch: 3.1.2 + dev: false /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} @@ -27530,6 +27772,7 @@ packages: /node-stream-zip@1.15.0: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} engines: {node: '>=0.12.0'} + dev: false /nofilter@3.1.0: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} @@ -27569,6 +27812,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: remove-trailing-separator: 1.1.0 + dev: false /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -27629,6 +27873,7 @@ packages: /nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + dev: false /number-is-nan@1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} @@ -27690,6 +27935,7 @@ packages: /ob1@0.76.8: resolution: {integrity: sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==} engines: {node: '>=16'} + dev: false /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -27697,9 +27943,11 @@ packages: /object-inspect@1.10.3: resolution: {integrity: sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==} + dev: false /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -27810,6 +28058,7 @@ packages: engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 + dev: false /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -27843,6 +28092,7 @@ packages: engines: {node: '>=8'} dependencies: is-wsl: 1.1.0 + dev: false /open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} @@ -27850,6 +28100,7 @@ packages: dependencies: is-docker: 2.2.1 is-wsl: 2.2.0 + dev: false /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} @@ -27861,6 +28112,7 @@ packages: /openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + dev: false /opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} @@ -28048,6 +28300,7 @@ packages: engines: {node: '>=6'} dependencies: p-limit: 2.3.0 + dev: false /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} @@ -28210,6 +28463,7 @@ packages: is-absolute: 1.0.0 map-cache: 0.2.2 path-root: 0.1.1 + dev: false /parse-headers@2.0.5: resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} @@ -28301,6 +28555,7 @@ packages: dependencies: dot-case: 3.0.4 tslib: 2.6.2 + dev: false /path-exists@2.1.0: resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} @@ -28344,12 +28599,14 @@ packages: /path-root-regex@0.1.2: resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} engines: {node: '>=0.10.0'} + dev: false /path-root@0.1.1: resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} engines: {node: '>=0.10.0'} dependencies: path-root-regex: 0.1.2 + dev: false /path-scurry@1.10.1: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} @@ -28373,6 +28630,7 @@ packages: /path-to-regexp@2.2.1: resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} + dev: false /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} @@ -28515,6 +28773,7 @@ packages: engines: {node: '>=6'} dependencies: find-up: 3.0.0 + dev: false /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} @@ -29158,14 +29417,11 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - /promise-polyfill@8.3.0: - resolution: {integrity: sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==} - dev: true - /promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} dependencies: asap: 2.0.6 + dev: false /promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} @@ -29429,6 +29685,7 @@ packages: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} dependencies: inherits: 2.0.4 + dev: false /quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -29578,6 +29835,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} @@ -29712,9 +29970,11 @@ packages: base-64: 0.1.0 react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) utf8: 3.0.0 + dev: false /react-native-path@0.0.5: resolution: {integrity: sha512-WJr256xBquk7X2O83QYWKqgLg43Zg3SrgjPc/kr0gCD2LoXA+2L72BW4cmstH12GbGeutqs/eXk3jgDQ2iCSvQ==} + dev: false /react-native@0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0): resolution: {integrity: sha512-RafPY2gM7mcrFySS8TL8x+TIO3q7oAlHpzEmC7Im6pmXni6n1AuufGaVh0Narbr1daxstw7yW7T9BKW5dpVc2A==} @@ -29767,10 +30027,12 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /react-refresh@0.4.3: resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} engines: {node: '>=0.10.0'} + dev: false /react-remove-scroll-bar@2.3.4(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} @@ -29858,6 +30120,7 @@ packages: object-assign: 4.1.1 react: 18.2.0 react-is: 18.2.0 + dev: false /react-style-singleton@2.2.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} @@ -30049,6 +30312,7 @@ packages: /readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} + dev: false /real-require@0.1.0: resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} @@ -30063,6 +30327,7 @@ packages: esprima: 4.0.1 source-map: 0.6.1 tslib: 2.6.2 + dev: false /receptacle@1.3.2: resolution: {integrity: sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==} @@ -30132,6 +30397,7 @@ packages: /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} @@ -30212,6 +30478,7 @@ packages: invariant: 2.2.4 transitivePeerDependencies: - encoding + dev: false /release-zalgo@1.0.0: resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} @@ -30299,6 +30566,7 @@ packages: /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: false /renderkid@2.0.7: resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} @@ -30545,6 +30813,7 @@ packages: hasBin: true dependencies: glob: 7.2.3 + dev: false /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} @@ -30893,6 +31162,7 @@ packages: resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} dependencies: loose-envify: 1.4.0 + dev: false /schema-utils@2.7.0: resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} @@ -31051,10 +31321,12 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 + dev: false /serialize-error@2.1.0: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} + dev: false /serialize-javascript@6.0.0: resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} @@ -31267,6 +31539,7 @@ packages: /signedsource@1.0.0: resolution: {integrity: sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==} + dev: false /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -31331,6 +31604,7 @@ packages: ansi-styles: 3.2.1 astral-regex: 1.0.0 is-fullwidth-code-point: 2.0.0 + dev: false /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} @@ -31363,6 +31637,7 @@ packages: dependencies: dot-case: 3.0.4 tslib: 2.6.2 + dev: false /socket.io-client@4.7.2: resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} @@ -31708,6 +31983,7 @@ packages: resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} dependencies: tslib: 2.6.2 + dev: false /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -31764,6 +32040,7 @@ packages: /stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + dev: false /stacktrace-gps@3.1.2: resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} @@ -32063,6 +32340,7 @@ packages: /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false /style-to-object@0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} @@ -32115,6 +32393,7 @@ packages: /sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} + dev: false /superjson@1.13.3: resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} @@ -32191,6 +32470,7 @@ packages: resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} dependencies: tslib: 2.6.2 + dev: false /swarm-js@0.1.42: resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} @@ -32326,6 +32606,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: rimraf: 2.6.3 + dev: false /terser-webpack-plugin@5.3.9(webpack@5.89.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} @@ -32441,6 +32722,7 @@ packages: /throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + dev: false /throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} @@ -32460,6 +32742,7 @@ packages: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 + dev: false /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} @@ -32518,10 +32801,12 @@ packages: /tiny-lru@11.2.3: resolution: {integrity: sha512-mF9jPTrvN7UHk0bekOk3RlFdFwfyS4CJYVsGc7nInL3pVgUCYj5r9X6GpZBFQgLr0TKJo8Dp+F3oRvYzxU9xiA==} engines: {node: '>=12'} + dev: false /tiny-lru@8.0.2: resolution: {integrity: sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg==} engines: {node: '>=6'} + dev: false /tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} @@ -32545,6 +32830,7 @@ packages: resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} dependencies: tslib: 2.6.2 + dev: false /tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} @@ -32630,12 +32916,6 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - dependencies: - punycode: 2.3.0 - dev: true - /tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} @@ -32683,6 +32963,7 @@ packages: /ts-algebra@1.2.2: resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} + dev: false /ts-command-line-args@2.5.1: resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} @@ -32731,48 +33012,6 @@ packages: tslib: 2.6.2 dev: false - /ts-jest-resolver@2.0.1: - resolution: {integrity: sha512-FolE73BqVZCs8/RbLKxC67iaAtKpBWx7PeLKFW2zJQlOf9j851I7JRxSDenri2NFvVH3QP7v3S8q1AmL24Zb9Q==} - dependencies: - jest-resolve: 29.7.0 - dev: true - - /ts-jest@29.1.1(@babel/core@7.23.2)(babel-jest@29.7.0)(esbuild@0.17.19)(jest@29.7.0)(typescript@5.1.6): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.23.2 - babel-jest: 29.7.0(@babel/core@7.23.2) - bs-logger: 0.2.6 - esbuild: 0.17.19 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.1.6 - yargs-parser: 21.1.1 - dev: true - /ts-loader@9.5.0(typescript@4.9.5)(webpack@5.89.0): resolution: {integrity: sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==} engines: {node: '>=12.0.0'} @@ -32925,6 +33164,7 @@ packages: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 + dev: false /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -32934,12 +33174,15 @@ packages: /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} + dev: false /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + dev: false /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} + dev: false /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -33260,6 +33503,7 @@ packages: /ua-parser-js@1.0.36: resolution: {integrity: sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==} + dev: false /ufo@1.3.1: resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} @@ -33273,6 +33517,7 @@ packages: dependencies: commander: 2.13.0 source-map: 0.6.1 + dev: false /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} @@ -33339,6 +33584,7 @@ packages: /unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} + dev: false /underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} @@ -33534,6 +33780,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: normalize-path: 2.1.1 + dev: false /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} @@ -33585,11 +33832,13 @@ packages: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} dependencies: tslib: 2.6.2 + dev: false /upper-case@2.0.2: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} dependencies: tslib: 2.6.2 + dev: false /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -33651,6 +33900,7 @@ packages: /urlpattern-polyfill@9.0.0: resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} + dev: false /use-callback-ref@1.3.0(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} @@ -33722,6 +33972,7 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 18.2.0 + dev: false /user-home@2.0.0: resolution: {integrity: sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==} @@ -33882,6 +34133,7 @@ packages: /value-or-promise@1.0.12: resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} engines: {node: '>=12'} + dev: false /varint-decoder@1.0.0: resolution: {integrity: sha512-JkOvdztASWGUAsXshCFHrB9f6AgR2Q8W08CEyJ+43b1qtFocmI8Sp1R/M0E/hDOY2FzVIqk63tOYLgDYWuJ7IQ==} @@ -33964,29 +34216,6 @@ packages: - zod dev: true - /viem@1.18.4(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-im+y30k+IGT6VtfD/q1V0RX5PaiHPsFTHkKqvTjTqV+ZT8RgJXzOGPXr5E0uPIm2cbJAJp6A9nR9BCHY7BKR2Q==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@adraffy/ens-normalize': 1.9.4 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.1.6)(zod@3.22.4) - isows: 1.0.3(ws@8.13.0) - typescript: 5.1.6 - ws: 8.13.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - dev: false - /viem@1.18.9(typescript@4.9.5): resolution: {integrity: sha512-eAXtoTwAFA3YEgjTYMb5ZTQrDC0UPx5qyZ4sv90TirVKepcM9mBPksTkC1SSWya0UdxhBmhEBL/CiYMjmGCTWg==} peerDependencies: @@ -34151,6 +34380,7 @@ packages: /vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + dev: false /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} @@ -34624,10 +34854,6 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true - /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -34854,6 +35080,7 @@ packages: /whatwg-fetch@3.6.19: resolution: {integrity: sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==} + dev: false /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} @@ -34874,14 +35101,6 @@ packages: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url@6.5.0: - resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - dev: true - /wherearewe@2.0.1: resolution: {integrity: sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -35082,6 +35301,7 @@ packages: graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 + dev: false /write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} @@ -35127,6 +35347,7 @@ packages: optional: true dependencies: async-limiter: 1.0.1 + dev: false /ws@7.4.6: resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} @@ -35341,6 +35562,7 @@ packages: /yaml@2.3.3: resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} engines: {node: '>= 14'} + dev: false /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} @@ -35500,6 +35722,7 @@ packages: zod: ^3.21.4 dependencies: zod: 3.22.4 + dev: false /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} diff --git a/sdk/.eslintrc.yml b/sdk/.eslintrc.yml index d4bd79ab..da11d20d 100644 --- a/sdk/.eslintrc.yml +++ b/sdk/.eslintrc.yml @@ -9,7 +9,7 @@ parserOptions: plugins: - "@typescript-eslint" root: true -ignorePatterns: ["rollup.config.js", "jest.config.ts", "dist/"] +ignorePatterns: ["rollup.config.js", "vitest.config.ts", "dist/"] rules: "@typescript-eslint/semi": - warn diff --git a/sdk/.graphclientrc.yml b/sdk/.graphclientrc.yml index 2d6deecf..79b1fc24 100644 --- a/sdk/.graphclientrc.yml +++ b/sdk/.graphclientrc.yml @@ -15,10 +15,10 @@ additionalTypeDefs: | } additionalResolvers: - - ./src/utils/resolvers.ts + - src/utils/resolvers.ts documents: - - ./src/indexer/queries/*.graphql + - src/indexer/queries/*.graphql codegen: contextType: "MeshContext & { graphName: string }" diff --git a/sdk/global.d.ts b/sdk/global.d.ts deleted file mode 100644 index 3b47093f..00000000 --- a/sdk/global.d.ts +++ /dev/null @@ -1 +0,0 @@ -import "jest-extended"; diff --git a/sdk/jest.config.ts b/sdk/jest.config.ts deleted file mode 100644 index 7d3d6afb..00000000 --- a/sdk/jest.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Config } from "jest"; - -const config: Config = { - extensionsToTreatAsEsm: [".ts", ".tsx"], - preset: "ts-jest/presets/js-with-ts-esm", // or other ESM presets, - setupFiles: ["./test/setup-env.ts"], - setupFilesAfterEnv: ["jest-extended/all"], - rootDir: ".", - moduleNameMapper: { - "^(\\.{1,2}/.*)\\.js$": "$1", - "^@hypercerts-org/contracts$": require.resolve("@hypercerts-org/contracts"), // this is the trick! - }, - verbose: false, - resolver: "ts-jest-resolver", - moduleFileExtensions: ["js", "jsx", "json", "ts"], - transform: {}, - workerThreads: true, -}; - -export default config; diff --git a/sdk/package.json b/sdk/package.json index fef2c88d..c772fe72 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.0.0-alpha.10", + "version": "1.0.0-alpha.13", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -11,11 +11,9 @@ "module": "./dist/esm/index.js", "types": "./dist/index.d.ts", "exports": { - ".": { - "require": "./dist/cjs/index.js", - "import": "./dist/esm/index.js", - "types": "./dist/index.d.ts" - } + "require": "./dist/cjs/index.js", + "import": "./dist/esm/index.js", + "types": "./dist/index.d.ts" }, "files": [ "dist", @@ -26,6 +24,7 @@ "@ethereum-attestation-service/eas-sdk": "1.2.2-beta.0", "@ethersproject/abstract-signer": "^5.7.0", "@graphprotocol/client-add-source-name": "^2.0.0", + "@graphprotocol/client-cli": "^3.0.0", "@graphprotocol/client-polling-live": "^2.0.0", "@graphql-mesh/cache-localforage": "^0.96.0", "@graphql-mesh/cross-helpers": "^0.4.1", @@ -34,7 +33,6 @@ "@graphql-mesh/merger-bare": "^0.95.7", "@graphql-mesh/runtime": "^0.96.12", "@graphql-mesh/store": "^0.95.7", - "@graphql-mesh/types": "^0.95.7", "@graphql-mesh/utils": "^0.95.7", "@graphql-typed-document-node/core": "^3.2.0", "@hypercerts-org/contracts": "1.0.0-alpha.2", @@ -57,8 +55,6 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.23.2", "@faker-js/faker": "^8.0.2", - "@graphprotocol/client-cli": "^3.0.0", - "@jest/globals": "^29.7.0", "@rollup/plugin-commonjs": "^24.0.1", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", @@ -70,17 +66,12 @@ "@types/sinon": "^10.0.15", "@viem/anvil": "^0.0.6", "abitype": "^0.10.2", - "babel-jest": "^29.7.0", "chai": "^4.3.7", "chai-assertions-count": "^1.0.2", "chai-subset": "^1.6.0", "esbuild": "^0.17.10", "ethereum-waffle": "^4.0.10", - "fetch-mock": "^9.11.0", "it-all": "^2.0.0", - "jest": "^29.3.1", - "jest-extended": "^4.0.0", - "jest-fetch-mock": "^3.0.3", "json-schema-to-typescript": "^12.0.0", "nyc": "^15.1.0", "rollup": "^3.17.2", @@ -90,8 +81,6 @@ "rollup-plugin-node-polyfills": "^0.2.1", "shx": "^0.3.4", "sinon": "^15.2.0", - "ts-jest": "^29.0.3", - "ts-jest-resolver": "^2.0.0", "ts-mocha": "^10.0.0", "ts-node": "^10.9.1", "tslib": "^2.5.0", @@ -99,19 +88,21 @@ "typedoc": "^0.23.25", "typedoc-plugin-markdown": "^3.14.0", "typedoc-plugin-missing-exports": "^2.0.0", - "typescript": "5.1.6" + "typescript": "5.1.6", + "vitest": "^0.28.4" }, "scripts": { - "build": "pnpm types:json && pnpm graph:build:esm && rollup -c", + "build": "pnpm types:json && pnpm graph:build && rollup -c", "docs": "typedoc", "graph:compile": "graphql-codegen", "graph:serve": "graphclient serve-dev", "graph:watch": "graphql-codegen -w", + "graph:build": "rm -rf ./src/.graphclient && graphclient build --throwOnInvalidConfig", "graph:build:esm": "rm -rf ./src/.graphclient && NODE_OPTIONS='--loader ts-node/esm' graphclient build --throwOnInvalidConfig", "clean": "rm -rf ./dist", "prebuild": "pnpm clean", "prepack": "pnpm build", - "test": "NODE_OPTIONS=\"--no-warnings --experimental-vm-modules\" jest --detectOpenHandles --forceExit", + "test": "vitest", "types:json": "pnpm json2ts -i './src/resources/schema/' -o 'src/types' --cwd './src/resources/schema'" } } diff --git a/sdk/src/client.ts b/sdk/src/client.ts index aeef85cc..779ba343 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -1,9 +1,9 @@ import { HypercertMinterAbi } from "@hypercerts-org/contracts"; import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; import { ByteArray, GetContractReturnType, Hex, PublicClient, WalletClient, getContract, parseAbi } from "viem"; -import HypercertEvaluator from "./evaluations"; -import HypercertIndexer from "./indexer"; -import HypercertsStorage from "./storage"; +import { HypercertEvaluator } from "./evaluations"; +import { HypercertIndexer } from "./indexer"; +import { HypercertsStorage } from "./storage"; import { AllowlistEntry, ClientError, @@ -16,7 +16,7 @@ import { TransferRestrictions, } from "./types"; import { getConfig } from "./utils/config"; -import logger from "./utils/logger"; +import { logger } from "./utils"; import { validateAllowlist, validateMetaData, verifyMerkleProof, verifyMerkleProofs } from "./validator"; /** @@ -33,7 +33,7 @@ import { validateAllowlist, validateMetaData, verifyMerkleProof, verifyMerklePro * * @param {Partial} config - The configuration options for the client. */ -export default class HypercertClient implements HypercertClientInterface { +export class HypercertClient implements HypercertClientInterface { readonly _config; private _storage: HypercertsStorage; // TODO better handling readonly. For now not needed since we don't use this class; diff --git a/sdk/src/evaluations/index.ts b/sdk/src/evaluations/index.ts index 44f13c23..9d14b72a 100644 --- a/sdk/src/evaluations/index.ts +++ b/sdk/src/evaluations/index.ts @@ -3,7 +3,7 @@ import { isAddress } from "viem"; // @ts-ignore import { CIDString } from "nft.storage"; -import HypercertsStorage from "../storage"; +import { HypercertsStorage } from "../storage"; import { HypercertClientConfig, HypercertEvaluationSchema, MalformedDataError } from "../types"; export interface EvaluatorInterface { @@ -15,7 +15,7 @@ export interface EvaluatorInterface { submitEvaluation: (evaluation: HypercertEvaluationSchema) => Promise; } -export default class HypercertEvaluator implements EvaluatorInterface { +export class HypercertEvaluator implements EvaluatorInterface { storage: HypercertsStorage; readonly = true; diff --git a/sdk/src/index.ts b/sdk/src/index.ts index 6836893a..58cc06ef 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -1,8 +1,8 @@ import { HypercertMinterAbi, HypercertExchangeAbi } from "@hypercerts-org/contracts"; import { execute } from "../.graphclient"; -import HypercertClient from "./client"; -import HypercertsStorage from "./storage"; +import { HypercertClient } from "./client"; +import { HypercertsStorage } from "./storage"; import { DEPLOYMENTS } from "./constants"; /** diff --git a/sdk/src/indexer.ts b/sdk/src/indexer.ts index 9ffe5eff..331beb93 100644 --- a/sdk/src/indexer.ts +++ b/sdk/src/indexer.ts @@ -1,5 +1,27 @@ -import { logger } from "ethers"; -import { getBuiltGraphSDK, Sdk as GraphClient } from "../.graphclient"; +import { logger } from "./utils"; +import { + getBuiltGraphSDK, + Sdk as GraphClient, + execute, + ClaimsByOwnerDocument, + ClaimsByOwnerQuery, + ClaimByIdDocument, + ClaimByIdQuery, + RecentClaimsDocument, + RecentClaimsQuery, + ClaimsByOwnerQueryVariables, + ClaimByIdQueryVariables, + RecentClaimsQueryVariables, + ClaimTokensByOwnerDocument, + ClaimTokensByOwnerQuery, + ClaimTokensByOwnerQueryVariables, + ClaimTokensByClaimDocument, + ClaimTokensByClaimQueryVariables, + ClaimTokensByClaimQuery, + ClaimTokenByIdDocument, + ClaimTokenByIdQueryVariables, + ClaimTokenByIdQuery, +} from "../.graphclient"; import { defaultQueryParams } from "./indexer/utils"; import { HypercertClientConfig, HypercertIndexerInterface, QueryParams } from "./types"; @@ -15,19 +37,18 @@ import { HypercertClientConfig, HypercertIndexerInterface, QueryParams } from ". * const indexer = new HypercertIndexer({ graphUrl: 'your-graph-url', graphName: 'your-graph-name' }); * const claims = await indexer.claimsByOwner('your-address'); */ -export default class HypercertIndexer implements HypercertIndexerInterface { +export class HypercertIndexer implements HypercertIndexerInterface { /** The Graph client used by the indexer. */ - private _graphClient: GraphClient; + private _graphName: string; /** * Creates a new instance of the `HypercertIndexer` class. * @param options The configuration options for the indexer. */ constructor(options: Partial) { - logger.info("Creating HypercertIndexer", "constructor", options); - this._graphClient = getBuiltGraphSDK({ - graphName: options.graphName, - }); + logger.info("Creating HypercertIndexer", "constructor", { name: options.graphName, url: options.graphUrl }); + if (!options.graphName) throw new Error("Missing graphName"); + this._graphName = options.graphName; } /** @@ -35,7 +56,9 @@ export default class HypercertIndexer implements HypercertIndexerInterface { * @returns The Graph client. */ get graphClient(): GraphClient { - return this._graphClient; + return getBuiltGraphSDK({ + graphName: this._graphName, + }); } /** @@ -44,31 +67,39 @@ export default class HypercertIndexer implements HypercertIndexerInterface { * @param params The query parameters. * @returns A Promise that resolves to the claims. */ - claimsByOwner = async (owner: string, params: QueryParams = defaultQueryParams) => - this.graphClient.ClaimsByOwner({ + claimsByOwner = async (owner: string, params: QueryParams = defaultQueryParams) => { + const query = ClaimsByOwnerDocument; + const variables: ClaimsByOwnerQueryVariables = { owner, ...params, - }); + }; + return (await execute(query, variables, { graphName: this._graphName })) as ClaimsByOwnerQuery; + }; /** * Gets a claim by its ID. * @param id The ID of the claim. * @returns A Promise that resolves to the claim. */ - claimById = async (id: string) => - this.graphClient.ClaimById({ + claimById = async (id: string) => { + const query = ClaimByIdDocument; + const variables: ClaimByIdQueryVariables = { id, - }); - + }; + return (await execute(query, variables, { graphName: this._graphName })) as ClaimByIdQuery; + }; /** * Gets the most recent claims. * @param params The query parameters. * @returns A Promise that resolves to the claims. */ - firstClaims = async (params: QueryParams = defaultQueryParams) => - this.graphClient.RecentClaims({ + firstClaims = async (params: QueryParams = defaultQueryParams) => { + const query = RecentClaimsDocument; + const variables: RecentClaimsQueryVariables = { ...params, - }); + }; + return (await execute(query, variables, { graphName: this._graphName })) as RecentClaimsQuery; + }; /** * Gets the claim tokens owned by a given address. @@ -76,11 +107,14 @@ export default class HypercertIndexer implements HypercertIndexerInterface { * @param params The query parameters. * @returns A Promise that resolves to the claim tokens. */ - fractionsByOwner = async (owner: string, params: QueryParams = defaultQueryParams) => - this.graphClient.ClaimTokensByOwner({ + fractionsByOwner = async (owner: string, params: QueryParams = defaultQueryParams) => { + const query = ClaimTokensByOwnerDocument; + const variables: ClaimTokensByOwnerQueryVariables = { owner, ...params, - }); + }; + return (await execute(query, variables, { graphName: this._graphName })) as ClaimTokensByOwnerQuery; + }; /** * Gets the claim tokens for a given claim. @@ -88,19 +122,25 @@ export default class HypercertIndexer implements HypercertIndexerInterface { * @param params The query parameters. * @returns A Promise that resolves to the claim tokens. */ - fractionsByClaim = async (claimId: string, params: QueryParams = defaultQueryParams) => - this.graphClient.ClaimTokensByClaim({ + fractionsByClaim = async (claimId: string, params: QueryParams = defaultQueryParams) => { + const query = ClaimTokensByClaimDocument; + const variables: ClaimTokensByClaimQueryVariables = { claimId, ...params, - }); + }; + return (await execute(query, variables, { graphName: this._graphName })) as ClaimTokensByClaimQuery; + }; /** * Gets a claim token by its ID. * @param fractionId The ID of the claim token. * @returns A Promise that resolves to the claim token. */ - fractionById = async (fractionId: string) => - this.graphClient.ClaimTokenById({ + fractionById = async (fractionId: string) => { + const query = ClaimTokenByIdDocument; + const variables: ClaimTokenByIdQueryVariables = { claimTokenId: fractionId, - }); + }; + return (await execute(query, variables, { graphName: this._graphName })) as ClaimTokenByIdQuery; + }; } diff --git a/sdk/src/storage.ts b/sdk/src/storage.ts index fb2606e2..3bf2fdbe 100644 --- a/sdk/src/storage.ts +++ b/sdk/src/storage.ts @@ -13,9 +13,8 @@ import { MalformedDataError, StorageError, } from "./types"; -import logger from "./utils/logger"; +import { logger, getFromIPFS } from "./utils"; import { getNftStorageToken, getWeb3StorageToken } from "./utils/config"; -import fetchers from "./utils/fetchers"; /** * A class that provides storage functionality for Hypercerts. @@ -30,7 +29,7 @@ import fetchers from "./utils/fetchers"; * const storage = new HypercertsStorage({ nftStorageToken: 'your-nft-storage-token', web3StorageToken: 'your-web3-storage-token' }); * const metadata = await storage.getMetadata('your-hypercert-id'); */ -export default class HypercertsStorage implements HypercertStorageInterface { +export class HypercertsStorage implements HypercertStorageInterface { /** Whether the storage is read-only. */ readonly: boolean = true; /** The NFT storage client. */ @@ -113,7 +112,7 @@ export default class HypercertsStorage implements HypercertStorageInterface { * @throws {MalformedDataError} Will throw a `MalformedDataError` if the retrieved data is invalid. */ public async getMetadata(cidOrIpfsUri: string): Promise { - const res = await fetchers.getFromIPFS(cidOrIpfsUri); + const res = await getFromIPFS(cidOrIpfsUri); const validation = validateMetaData(res); if (!validation.valid) { @@ -193,6 +192,6 @@ export default class HypercertsStorage implements HypercertStorageInterface { */ // TODO: replace current temporary fix of just using NFT.Storage IPFS gateway - return await fetchers.getFromIPFS(cidOrIpfsUri); + return await getFromIPFS(cidOrIpfsUri); } } diff --git a/sdk/src/types/client.ts b/sdk/src/types/client.ts index 0dd1082d..9a4ec321 100644 --- a/sdk/src/types/client.ts +++ b/sdk/src/types/client.ts @@ -3,7 +3,7 @@ import { PartialTypedDataConfig } from "@ethereum-attestation-service/eas-sdk"; // @ts-ignore import { CIDString } from "nft.storage"; -import HypercertIndexer from "../indexer"; +import { HypercertIndexer } from "../indexer"; import { AllowlistEntry, TransferRestrictions } from "./hypercerts"; import { HypercertMetadata } from "./metadata"; diff --git a/sdk/src/utils/adapters.ts b/sdk/src/utils/adapters.ts index 6108b01a..89f25fe3 100644 --- a/sdk/src/utils/adapters.ts +++ b/sdk/src/utils/adapters.ts @@ -1,6 +1,6 @@ import { providers } from "ethers"; import { PublicClient, HttpTransport, WalletClient } from "viem"; -import logger from "./logger"; +import { logger } from "./logger"; import { Signer, TypedDataSigner } from "@ethersproject/abstract-signer"; /** diff --git a/sdk/src/utils/allowlist.ts b/sdk/src/utils/allowlist.ts index 634c5eab..a0f840e2 100644 --- a/sdk/src/utils/allowlist.ts +++ b/sdk/src/utils/allowlist.ts @@ -1,9 +1,9 @@ import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; -import fetchers from "./fetchers"; -import logger from "./logger"; +import { getFromIPFS } from "./fetchers"; +import { logger } from "./logger"; const getMerkleTreeFromIPFS = async (cidOrIpfsUri: string) => { - const data = await fetchers.getFromIPFS(cidOrIpfsUri); + const data = await getFromIPFS(cidOrIpfsUri); const allowlist = typeof data === "string" ? data : undefined; if (!allowlist) { @@ -43,4 +43,4 @@ const getProofsFromAllowlist = async (cidOrIpfsUri: string, account: `0x${string } }; -export default { getProofsFromAllowlist }; +export { getProofsFromAllowlist }; diff --git a/sdk/src/utils/config.ts b/sdk/src/utils/config.ts index cbc9c70a..5d873cc7 100644 --- a/sdk/src/utils/config.ts +++ b/sdk/src/utils/config.ts @@ -9,7 +9,7 @@ import { SupportedChainIds, UnsupportedChainError, } from "../types"; -import logger from "./logger"; +import { logger } from "./logger"; import { createPublicClient, http, isAddress } from "viem"; import { deployments } from "../../src"; diff --git a/sdk/src/utils/fetchers.ts b/sdk/src/utils/fetchers.ts index 41d9003a..6b0144a6 100644 --- a/sdk/src/utils/fetchers.ts +++ b/sdk/src/utils/fetchers.ts @@ -1,5 +1,5 @@ import { StorageError } from "../types/errors"; -import logger from "./logger"; +import { logger } from "./logger"; import axios from "axios"; /** @@ -44,4 +44,4 @@ const getWeb3StorageGatewayUri = (cidOrIpfsUri: string) => { return WEB3_STORAGE_IPFS_GATEWAY.replace("{cid}", getCid(cidOrIpfsUri)); }; -export default { getFromIPFS }; +export { getFromIPFS }; diff --git a/sdk/src/utils/index.ts b/sdk/src/utils/index.ts index d4dccf7b..23ae4c46 100644 --- a/sdk/src/utils/index.ts +++ b/sdk/src/utils/index.ts @@ -1,7 +1,15 @@ import { walletClientToSigner, publicClientToProvider } from "./adapters"; -import allowlist from "./allowlist"; -import fetchers from "./fetchers"; +import { getProofsFromAllowlist } from "./allowlist"; +import { getFromIPFS } from "./fetchers"; import { formatHypercertData } from "./formatter"; +import { logger } from "./logger"; -export { walletClientToSigner, publicClientToProvider, allowlist, fetchers, formatHypercertData }; +export { + walletClientToSigner, + publicClientToProvider, + getProofsFromAllowlist, + logger, + getFromIPFS, + formatHypercertData, +}; diff --git a/sdk/src/utils/logger.ts b/sdk/src/utils/logger.ts index e2615697..2e4680ff 100644 --- a/sdk/src/utils/logger.ts +++ b/sdk/src/utils/logger.ts @@ -49,4 +49,4 @@ const logger = { }, }; -export default logger; +export { logger }; diff --git a/sdk/src/utils/resolvers.ts b/sdk/src/utils/resolvers.ts index c00838ee..7e096e05 100644 --- a/sdk/src/utils/resolvers.ts +++ b/sdk/src/utils/resolvers.ts @@ -1,6 +1,6 @@ import { Resolvers } from "../../.graphclient"; -export const resolvers: Resolvers = { +const resolvers: Resolvers = { Claim: { graphName: (root, args, context) => root.graphName || context.graphName || "hypercerts-testnet", // The value we provide in the config }, @@ -8,3 +8,5 @@ export const resolvers: Resolvers = { graphName: (root, args, context) => root.graphName || context.graphName || "hypercerts-testnet", // The value we provide in the config }, }; + +export { resolvers }; diff --git a/sdk/test/client.test.ts b/sdk/test/client.test.ts index 6f9e124e..260791f6 100644 --- a/sdk/test/client.test.ts +++ b/sdk/test/client.test.ts @@ -1,3 +1,5 @@ +import { describe, it, afterAll } from "vitest"; + import { expect } from "chai"; import sinon from "sinon"; diff --git a/sdk/test/client/allowlist.minting.test.ts b/sdk/test/client/allowlist.minting.test.ts index fdd398ec..fe9fbacf 100644 --- a/sdk/test/client/allowlist.minting.test.ts +++ b/sdk/test/client/allowlist.minting.test.ts @@ -1,13 +1,17 @@ +import { describe, it, beforeEach, afterAll } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; + import sinon from "sinon"; -import { expect } from "@jest/globals"; -import { HypercertClient } from "../../src"; -import HypercertsStorage from "../../src/storage"; +import { HypercertClient, HypercertsStorage } from "../../src"; import { MalformedDataError, MintingError, TransferRestrictions } from "../../src/types"; import { getAllowlist, getFormattedMetadata, publicClient, walletClient, mockDataSets } from "../helpers"; import { HypercertMinterAbi } from "@hypercerts-org/contracts"; import { encodeFunctionResult, isHex, parseAbi, stringToHex } from "viem"; +chai.use(assertionsCount); + describe("Allows for minting claims from an allowlist", () => { const { hypercertData, hypercertMetadata } = mockDataSets; const metaDataStub = sinon.stub(HypercertsStorage.prototype, "storeMetadata").resolves(hypercertMetadata.cid); @@ -44,6 +48,8 @@ describe("Allows for minting claims from an allowlist", () => { }); beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); + readSpy.resetBehavior(); readSpy.resetHistory(); @@ -67,14 +73,15 @@ describe("Allows for minting claims from an allowlist", () => { const hash = await client.createAllowlist(allowlist, metaData, totalUnits, TransferRestrictions.FromCreatorOnly); - expect(isHex(hash)).toBeTruthy(); - expect(metaDataStub.callCount).toBe(1); - expect(dataStub.callCount).toBe(1); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(1); + expect(isHex(hash)).to.be.true; + expect(metaDataStub.callCount).to.eq(1); + expect(dataStub.callCount).to.eq(1); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(1); }); it("should not create an allowlist if the total units mismatch", async () => { + chai.Assertion.expectAssertions(8); const { allowlist, totalUnits } = getAllowlist(); const metaData = getFormattedMetadata(); @@ -82,24 +89,24 @@ describe("Allows for minting claims from an allowlist", () => { try { hash = await client.createAllowlist(allowlist, metaData, totalUnits + 1n, TransferRestrictions.FromCreatorOnly); } catch (e) { - expect(e instanceof MalformedDataError).toBeTruthy(); + expect(e).to.be.instanceOf(MalformedDataError); const error = e as MalformedDataError; - expect(error.message).toBe("Allowlist validation failed"); - expect(error.payload).toEqual({ + expect(error.message).to.be.eq("Allowlist validation failed"); + expect(error.payload).to.deep.eq({ units: "Total units in allowlist must match total units [expected: 11, got: 10]", }); } - expect(hash).toBeUndefined(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(0); - expect.assertions(8); + expect(hash).to.be.undefined; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(0); }); it("should not create an allowlist if the allowlist is empty", async () => { + chai.Assertion.expectAssertions(8); const { allowlist, totalUnits } = getAllowlist(); const metaData = getFormattedMetadata(); @@ -110,26 +117,26 @@ describe("Allows for minting claims from an allowlist", () => { try { hash = await client.createAllowlist(allowlist, metaData, totalUnits, TransferRestrictions.FromCreatorOnly); } catch (e) { - expect(e instanceof MalformedDataError).toBeTruthy(); + expect(e).to.be.instanceOf(MalformedDataError); const error = e as MalformedDataError; - expect(error.message).toBe("Allowlist validation failed"); - expect(error.payload).toEqual({ + expect(error.message).to.be.eq("Allowlist validation failed"); + expect(error.payload).to.deep.eq({ units: "Total units in allowlist must match total units [expected: 10, got: 9]", }); } - expect(hash).toBeUndefined(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(0); - expect.assertions(8); + expect(hash).to.be.undefined; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(0); }); }); describe("Mint single fraction", () => { it("should allow to mint a claim from an allowlist without the root", async () => { + chai.Assertion.expectAssertions(5); const { allowlist, merkleTree } = getAllowlist({ size: 1 }); writeSpy = writeSpy.resolves(mintClaimFromAllowlistResult); @@ -140,15 +147,15 @@ describe("Allows for minting claims from an allowlist", () => { merkleTree.getProof([allowlist[0].address, allowlist[0].units.toString()]) as `0x${string}`[], ); - expect(isHex(hash)).toBeTruthy(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(1); - expect.assertions(5); + expect(isHex(hash)).to.be.true; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(1); }); it("should allow to mint a claim from an allowlist with a correct root", async () => { + chai.Assertion.expectAssertions(5); const { allowlist, merkleTree } = getAllowlist({ size: 1, address: userAddress }); writeSpy = writeSpy.resolves(mintClaimFromAllowlistResult); @@ -160,15 +167,15 @@ describe("Allows for minting claims from an allowlist", () => { merkleTree.root as `0x${string}`, ); - expect(isHex(hash)).toBeTruthy(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(1); - expect.assertions(5); + expect(isHex(hash)).to.be.true; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(1); }); it("should not allow to mint a claim from an allowlist with an incorrect root", async () => { + chai.Assertion.expectAssertions(8); const { allowlist, merkleTree } = getAllowlist({ size: 1, address: userAddress }); const mockRoot = stringToHex("MOCK_ROOT", { size: 32 }); @@ -182,27 +189,27 @@ describe("Allows for minting claims from an allowlist", () => { mockRoot, ); } catch (e) { - expect(e instanceof MintingError).toBeTruthy(); + expect(e instanceof MintingError).to.be.true; const error = e as MintingError; - expect(error.message).toBe("Merkle proof verification failed"); - expect(error.payload).toEqual({ + expect(error.message).to.eq("Merkle proof verification failed"); + expect(error.payload).to.deep.eq({ root: mockRoot, proof: merkleTree.getProof([allowlist[0].address, allowlist[0].units.toString()]), }); } - expect(hash).toBeUndefined(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(0); - expect.assertions(8); + expect(hash).to.be.undefined; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(0); }); }); describe("Batch mint fractions", () => { it("should allow to batch mint a claim from an allowlist without the root", async () => { + chai.Assertion.expectAssertions(5); const firstList = getAllowlist({ size: 1 }); const secondList = getAllowlist({ size: 1, units: 42n }); @@ -222,15 +229,15 @@ describe("Allows for minting claims from an allowlist", () => { [firstProofs, secondProofs] as `0x${string}`[][], ); - expect(isHex(hash)).toBeTruthy(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(1); - expect.assertions(5); + expect(isHex(hash)).to.be.true; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(1); }); it("should allow to mint a claim from an allowlist with a correct root", async () => { + chai.Assertion.expectAssertions(5); const firstList = getAllowlist({ size: 1, address: userAddress }); const secondList = getAllowlist({ size: 1, units: 42n, address: userAddress }); @@ -251,15 +258,15 @@ describe("Allows for minting claims from an allowlist", () => { [firstList.merkleTree.root, secondList.merkleTree.root] as `0x${string}`[], ); - expect(isHex(hash)).toBeTruthy(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(1); - expect.assertions(5); + expect(isHex(hash)).to.be.true; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(1); }); it("should not allow to mint a claim from an allowlist with an incorrect root", async () => { + chai.Assertion.expectAssertions(8); const firstList = getAllowlist({ size: 1, address: userAddress }); const secondList = getAllowlist({ size: 1, units: 42n, address: userAddress }); @@ -284,22 +291,21 @@ describe("Allows for minting claims from an allowlist", () => { [firstList.merkleTree.root as `0x${string}`, mockRoot], ); } catch (e) { - expect(e instanceof MintingError).toBeTruthy(); + expect(e instanceof MintingError).to.be.true; const error = e as MintingError; - expect(error.message).toBe("Merkle proof verification failed"); - expect(error.payload).toEqual({ + expect(error.message).to.eq("Merkle proof verification failed"); + expect(error.payload).to.deep.eq({ root: mockRoot, proof: secondProofs, }); } - expect(hash).toBeUndefined(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(0); - expect.assertions(8); + expect(hash).to.be.undefined; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(0); }); }); }); diff --git a/sdk/test/client/burn.test.ts b/sdk/test/client/burn.test.ts index 64b2d877..06c1b1f7 100644 --- a/sdk/test/client/burn.test.ts +++ b/sdk/test/client/burn.test.ts @@ -1,10 +1,16 @@ -import HypercertClient from "../../src/client"; +import { describe, it, beforeEach, afterAll } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; + +import { HypercertClient } from "../../src/client"; import { walletClient, publicClient } from "../helpers"; import { ContractFunctionExecutionError, isHex, toHex } from "viem"; import sinon from "sinon"; import { faker } from "@faker-js/faker"; import { ClientError } from "../../src"; +chai.use(assertionsCount); + describe("burn fraction tokens in HypercertClient", () => { const wallet = walletClient; const userAddress = wallet.account?.address; @@ -22,6 +28,8 @@ describe("burn fraction tokens in HypercertClient", () => { let writeSpy = sinon.stub(walletClient, "writeContract"); beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); + readSpy.resetBehavior(); readSpy.resetHistory(); @@ -38,45 +46,45 @@ describe("burn fraction tokens in HypercertClient", () => { writeSpy = writeSpy.resolves(toHex(420)); - expect(client.readonly).toBe(false); + expect(client.readonly).to.be.false; const hash = await client.burnClaimFraction(fractionId); - console.log(hash); //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(isHex(hash)).toBeTruthy(); - expect(readSpy.callCount).toBe(1); - expect(writeSpy.callCount).toBe(1); + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(1); + expect(writeSpy.callCount).to.eq(1); }); it("throws on burning fraction not owned by signer", async () => { + chai.Assertion.expectAssertions(6); readSpy = readSpy.resolves(faker.finance.ethereumAddress()); - expect(client.readonly).toBe(false); + expect(client.readonly).to.be.false; let hash; try { hash = await client.burnClaimFraction(fractionId); } catch (e) { - expect(e instanceof ClientError).toBeTruthy(); + expect(e).to.be.instanceOf(ClientError); const error = e as ClientError; - expect(error.message).toBe("Claim is not owned by the signer"); + expect(error.message).to.eq("Claim is not owned by the signer"); } //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(hash).toBeUndefined(); - expect(readSpy.callCount).toBe(1); - expect(writeSpy.callCount).toBe(0); - expect.assertions(6); + expect(hash).to.be.undefined; + expect(readSpy.callCount).to.eq(1); + expect(writeSpy.callCount).to.eq(0); }); it("allows for a hypercert fraction to be burned with override params", async () => { + chai.Assertion.expectAssertions(6); readSpy = readSpy.resolves(userAddress); writeSpy = writeSpy.resolves(toHex(420)); - expect(client.readonly).toBe(false); + expect(client.readonly).to.be.false; let noHash; @@ -84,17 +92,15 @@ describe("burn fraction tokens in HypercertClient", () => { noHash = await client.burnClaimFraction(fractionId, { gasLimit: "FALSE_VALUE" as unknown as bigint }); expect.fail("should have thrown on incorrect gasLimit value"); } catch (e) { - expect(e instanceof ContractFunctionExecutionError).toBeTruthy(); + expect(e).to.be.instanceOf(ContractFunctionExecutionError); } const hash = await client.burnClaimFraction(fractionId, { gasLimit: 12300000n }); //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(noHash).toBeUndefined(); - - expect(isHex(hash)).toBeTrue(); - expect(readSpy.callCount).toBe(2); - expect(writeSpy.callCount).toBe(1); - expect.assertions(6); + expect(noHash).to.be.undefined; + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(1); }); }); diff --git a/sdk/test/client/minting.test.ts b/sdk/test/client/minting.test.ts index 1136704d..1ac1800e 100644 --- a/sdk/test/client/minting.test.ts +++ b/sdk/test/client/minting.test.ts @@ -1,18 +1,22 @@ -import { expect } from "chai"; +import { describe, it, beforeEach, afterAll, beforeAll } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; import sinon from "sinon"; -import { ContractFunctionExecutionError, encodeFunctionResult, isHex, parseAbi } from "viem"; +import { ContractFunctionExecutionError, encodeFunctionResult, isHex, parseAbi, parseEther } from "viem"; -import HypercertClient from "../../src/client"; +import { HypercertClient } from "../../src/client"; import { HypercertMetadata, formatHypercertData } from "../../src"; import { MalformedDataError } from "../../src/types/errors"; import { TransferRestrictions } from "../../src/types/hypercerts"; -import { getRawInputData, publicClient, walletClient } from "../helpers"; +import { getRawInputData, publicClient, walletClient, testClient } from "../helpers"; import { HypercertMinterAbi } from "@hypercerts-org/contracts"; //eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { CIDString, NFTStorage } from "nft.storage"; +chai.use(assertionsCount); + describe("mintClaim in HypercertClient", () => { const mockCorrectMetadataCid = "testCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u" as CIDString; @@ -35,7 +39,13 @@ describe("mintClaim in HypercertClient", () => { result: [], }); + beforeAll(async () => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await testClient.setBalance({ address: walletClient.account!.address, value: parseEther("1") }); + }); + beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); writeSpy.resetBehavior(); writeSpy.resetHistory(); diff --git a/sdk/test/client/split.merge.test.ts b/sdk/test/client/split.merge.test.ts index 57d19762..f319886c 100644 --- a/sdk/test/client/split.merge.test.ts +++ b/sdk/test/client/split.merge.test.ts @@ -1,10 +1,16 @@ +import { describe, it, beforeEach, afterAll } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; + import sinon from "sinon"; -import HypercertClient from "../../src/client"; +import { HypercertClient } from "../../src/client"; import { publicClient, walletClient } from "../helpers"; import { ContractFunctionExecutionError, isHex, toHex } from "viem"; +chai.use(assertionsCount); + describe("splitClaimUnits in HypercertClient", () => { const wallet = walletClient; const userAddress = wallet.account?.address; @@ -23,6 +29,7 @@ describe("splitClaimUnits in HypercertClient", () => { const fractionId = 9868188640707215440437863615521278132232n; beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); readSpy.resetBehavior(); readSpy.resetHistory(); @@ -35,21 +42,22 @@ describe("splitClaimUnits in HypercertClient", () => { }); it("allows for a hypercert fractions to be splitted over value", async () => { + chai.Assertion.expectExpects(4); readSpy = readSpy.onFirstCall().resolves(userAddress).onSecondCall().resolves(300n); writeSpy = writeSpy.resolves(toHex(420)); - expect(client.readonly).toBe(false); + expect(client.readonly).to.be.false; const hash = await client.splitFractionUnits(fractionId, [100n, 200n]); //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(isHex(hash)).toBeTruthy(); - expect(readSpy.callCount).toBe(2); - expect(writeSpy.callCount).toBe(1); - expect.assertions(4); + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(1); }); it("allows for a hypercert fractions to be splitted over value with override params", async () => { + chai.Assertion.expectExpects(5); readSpy = readSpy .onFirstCall() .resolves(userAddress) @@ -62,21 +70,20 @@ describe("splitClaimUnits in HypercertClient", () => { writeSpy = writeSpy.resolves(toHex(420)); - expect(client.readonly).toBe(false); + expect(client.readonly).to.be.false; try { await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: "FALSE_VALUE" as unknown as bigint }); } catch (e) { - expect(e instanceof ContractFunctionExecutionError).toBeTruthy(); + expect(e instanceof ContractFunctionExecutionError).to.be.true; } const hash = await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: 12300000n }); //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(isHex(hash)).toBeTruthy(); - expect(readSpy.callCount).toBe(4); - expect(writeSpy.callCount).toBe(1); - expect.assertions(5); + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(4); + expect(writeSpy.callCount).to.eq(1); }); // it("throws on splitting with incorrect new total value", async () => { diff --git a/sdk/test/evaluations/evaluator.test.ts b/sdk/test/evaluations/evaluator.test.ts index d79d531f..5e7c3864 100644 --- a/sdk/test/evaluations/evaluator.test.ts +++ b/sdk/test/evaluations/evaluator.test.ts @@ -1,11 +1,15 @@ -import { expect } from "@jest/globals"; +import { describe, it, afterAll, beforeEach } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; import sinon from "sinon"; -import HypercertEvaluator from "../../src/evaluations"; +import { HypercertEvaluator } from "../../src/evaluations"; import { MalformedDataError, StorageError } from "../../src/types/errors"; import { HypercertEvaluationSchema } from "../../src/types/evaluation"; import { getEvaluationData, publicClient, walletClient } from "../helpers"; +chai.use(assertionsCount); + describe("HypercertEvaluator", () => { const signer = walletClient.account; const evaluator = new HypercertEvaluator({ @@ -24,6 +28,8 @@ describe("HypercertEvaluator", () => { describe("submitEvaluation", () => { it("should throw an error for unexpected evaluation source", async () => { + chai.Assertion.expectAssertions(2); + const evaluation = { creator: signer?.address, evaluationSource: { @@ -38,15 +44,15 @@ describe("HypercertEvaluator", () => { try { await evaluator.submitEvaluation(evaluation as HypercertEvaluationSchema); } catch (e) { - expect(e).toBeInstanceOf(Error); + expect(e).to.be.instanceOf(Error); const error = e as StorageError; - expect(error.message).toEqual(`Unexpected evaluation source: ${evaluation.evaluationSource.toString()}`); + expect(error.message).to.eq(`Unexpected evaluation source: ${evaluation.evaluationSource.toString()}`); } - - expect.assertions(2); }); it("should throw an error for invalid creator address", async () => { + chai.Assertion.expectAssertions(2); + const evaluation = { creator: "bob", }; @@ -54,15 +60,15 @@ describe("HypercertEvaluator", () => { try { await evaluator.submitEvaluation(evaluation as HypercertEvaluationSchema); } catch (e) { - expect(e).toBeInstanceOf(MalformedDataError); + expect(e).to.be.instanceOf(MalformedDataError); const error = e as MalformedDataError; - expect(error.message).toEqual(`Invalid creator address: ${evaluation.creator.toString()}`); + expect(error.message).to.be.eq(`Invalid creator address: ${evaluation.creator.toString()}`); } - - expect.assertions(2); }); it("should throw an error for readonly storage", async () => { + chai.Assertion.expectAssertions(2); + const evaluation: HypercertEvaluationSchema = getEvaluationData({ creator: signer?.address }); const readonlyEvaluator = new HypercertEvaluator({ @@ -75,11 +81,10 @@ describe("HypercertEvaluator", () => { await readonlyEvaluator.submitEvaluation(evaluation); } catch (e) { const error = e as Error; - expect(error).toBeInstanceOf(Error); - expect(error.message).toMatch(/Unexpected evaluation source/); + expect(error).to.be.instanceOf(Error); + expect(error.message).to.match(/Unexpected evaluation source/); } - expect.assertions(2); sinon.restore(); }); }); diff --git a/sdk/test/indexer.test.ts b/sdk/test/indexer.test.ts index 71c12b13..1d6b3f24 100644 --- a/sdk/test/indexer.test.ts +++ b/sdk/test/indexer.test.ts @@ -1,17 +1,22 @@ +import { describe, it } from "vitest"; + import { expect } from "chai"; -import HypercertsIndexer from "../src/indexer"; +import { HypercertIndexer } from "../src/indexer"; describe("HypercertsIndexer", () => { it("should be able to create a new instance without valid graphName", () => { - const indexer = new HypercertsIndexer({}); + const indexer = new HypercertIndexer({ graphName: "hypercerts-testnet" }); - expect(indexer).to.be.an.instanceOf(HypercertsIndexer); + expect(indexer).to.be.an.instanceOf(HypercertIndexer); }); it("should be able to create a new instance with valid graphName", () => { - const indexer = new HypercertsIndexer({ graphUrl: "https://api.thegraph.com/subgraphs/name/hypercerts-testnet" }); + const indexer = new HypercertIndexer({ + graphName: "hypercerts-testnet", + graphUrl: "https://api.thegraph.com/subgraphs/name/hypercerts-testnet", + }); - expect(indexer).to.be.an.instanceOf(HypercertsIndexer); + expect(indexer).to.be.an.instanceOf(HypercertIndexer); }); }); diff --git a/sdk/test/indexer/queries.test.ts b/sdk/test/indexer/queries.test.ts index 01a9340b..27096d01 100644 --- a/sdk/test/indexer/queries.test.ts +++ b/sdk/test/indexer/queries.test.ts @@ -1,37 +1,32 @@ -import { jest } from "@jest/globals"; - -import { - ClaimByIdQuery, - ClaimTokenByIdQuery, - ClaimTokensByClaimQuery, - ClaimTokensByOwnerQuery, - ClaimsByOwnerQuery, - RecentClaimsQuery, -} from "../../.graphclient/index.js"; -import HypercertIndexer from "../../src/indexer.js"; -import { defaultQueryParams } from "../../src/indexer/utils.js"; +import { describe, it, beforeEach, afterEach, afterAll, vi, expect } from "vitest"; + +import { HypercertIndexer } from "../../src/indexer"; +import { defaultQueryParams } from "../../src/indexer/utils"; describe("HypercertIndexer", () => { let indexer: HypercertIndexer; beforeEach(() => { - indexer = new HypercertIndexer({ graphUrl: "https://api.thegraph.com/subgraphs/name/hypercerts-testnet" }); + indexer = new HypercertIndexer({ + graphName: "hypercerts-testnet", + graphUrl: "https://api.thegraph.com/subgraphs/name/hypercerts-testnet", + }); }); afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); afterAll(() => { - jest.resetAllMocks(); + vi.resetAllMocks(); }); it("should call graphClient.ClaimsByOwner with the correct parameters", async () => { const owner = "0x1234567890123456789012345678901234567890"; const params = defaultQueryParams; - const mockResponse: ClaimsByOwnerQuery = { claims: [] }; + const mockResponse = { claims: [] }; - const spy = jest.spyOn(indexer, "claimsByOwner").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "claimsByOwner").mockResolvedValue(mockResponse); const result = await indexer.claimsByOwner(owner, params); @@ -42,9 +37,9 @@ describe("HypercertIndexer", () => { it("should call graphClient.ClaimById with the correct parameters", async () => { const id = "0x1234567890123456789012345678901234567890123456789012345678901234"; - const mockResponse: ClaimByIdQuery = { claim: null }; + const mockResponse = { claim: null }; - const spy = jest.spyOn(indexer, "claimById").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "claimById").mockResolvedValue(mockResponse); const result = await indexer.claimById(id); @@ -55,9 +50,9 @@ describe("HypercertIndexer", () => { it("should call graphClient.RecentClaims with the correct parameters", async () => { const params = defaultQueryParams; - const mockResponse: RecentClaimsQuery = { claims: [] }; + const mockResponse = { claims: [] }; - const spy = jest.spyOn(indexer, "firstClaims").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "firstClaims").mockResolvedValue(mockResponse); const result = await indexer.firstClaims(params); @@ -69,9 +64,9 @@ describe("HypercertIndexer", () => { it("should call graphClient.ClaimTokensByOwner with the correct parameters", async () => { const owner = "0x1234567890123456789012345678901234567890"; const params = defaultQueryParams; - const mockResponse: ClaimTokensByOwnerQuery = { claimTokens: [] }; + const mockResponse = { claimTokens: [] }; - const spy = jest.spyOn(indexer, "fractionsByOwner").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "fractionsByOwner").mockResolvedValue(mockResponse); const result = await indexer.fractionsByOwner(owner, params); @@ -83,9 +78,9 @@ describe("HypercertIndexer", () => { it("should call graphClient.ClaimTokensByClaim with the correct parameters", async () => { const claimId = "0x1234567890123456789012345678901234567890123456789012345678901234"; const params = defaultQueryParams; - const mockResponse: ClaimTokensByClaimQuery = { claimTokens: [] }; + const mockResponse = { claimTokens: [] }; - const spy = jest.spyOn(indexer, "fractionsByClaim").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "fractionsByClaim").mockResolvedValue(mockResponse); const result = await indexer.fractionsByClaim(claimId, params); @@ -96,9 +91,9 @@ describe("HypercertIndexer", () => { it("should call graphClient.ClaimTokenById with the correct parameters", async () => { const fractionId = "0x1234567890123456789012345678901234567890123456789012345678901234"; - const mockResponse: ClaimTokenByIdQuery = { claimToken: null }; + const mockResponse = { claimToken: null }; - const spy = jest.spyOn(indexer, "fractionById").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "fractionById").mockResolvedValue(mockResponse); const result = await indexer.fractionById(fractionId); expect(spy).toHaveBeenCalledWith(fractionId); diff --git a/sdk/test/setup-env.ts b/sdk/test/setup-env.ts index 49d24ea3..aa5bf440 100644 --- a/sdk/test/setup-env.ts +++ b/sdk/test/setup-env.ts @@ -1,10 +1,9 @@ import dotenv from "dotenv"; import { startProxy } from "@viem/anvil"; -import fetchMock from "jest-fetch-mock"; +// import fetchMock from "jest-fetch-mock"; -fetchMock.enableMocks(); +// fetchMock.enableMocks(); -fetchMock.enableMocks(); dotenv.config({ path: "./.env" }); const reloadEnv = () => { diff --git a/sdk/test/storage.test.ts b/sdk/test/storage.test.ts index 110da473..f79d0f2c 100644 --- a/sdk/test/storage.test.ts +++ b/sdk/test/storage.test.ts @@ -1,7 +1,9 @@ +import { describe, it, afterAll } from "vitest"; + import { expect } from "chai"; import { HypercertMetadata } from "../src"; -import HypercertsStorage from "../src/storage"; +import { HypercertsStorage } from "../src/storage"; import { StorageError } from "../src/types/errors"; import { reloadEnv } from "./setup-env"; diff --git a/sdk/test/storage/nft.storage.test.ts b/sdk/test/storage/nft.storage.test.ts index c78d96a5..60b9ec86 100644 --- a/sdk/test/storage/nft.storage.test.ts +++ b/sdk/test/storage/nft.storage.test.ts @@ -1,23 +1,24 @@ -import { jest } from "@jest/globals"; +import { describe, it, afterEach, afterAll, vi } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; + //eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { NFTStorage } from "nft.storage"; -import HypercertsStorage from "../../src/storage"; +import { HypercertsStorage } from "../../src/storage"; import { MalformedDataError } from "../../src/types/errors"; import { HypercertMetadata } from "../../src/types/metadata"; import { getFormattedMetadata, mockDataSets } from "../helpers"; -import fetchers from "../../src/utils/fetchers"; import sinon from "sinon"; +import axios from "axios"; + +chai.use(assertionsCount); describe("NFT.Storage Client", () => { const { hypercertMetadata } = mockDataSets; - const storeBlobMock = jest.spyOn(NFTStorage.prototype, "storeBlob").mockImplementation((_: unknown, __?: unknown) => { - return Promise.resolve(hypercertMetadata.cid); - }); - - const ipfsFetcherMock = sinon.stub(fetchers, "getFromIPFS"); + const storeBlobMock = sinon.stub(NFTStorage.prototype, "storeBlob").resolves(hypercertMetadata.cid); const storage = new HypercertsStorage({ nftStorageToken: process.env.NFT_STORAGE_TOKEN, @@ -25,11 +26,13 @@ describe("NFT.Storage Client", () => { }); afterEach(() => { - jest.clearAllMocks(); + chai.Assertion.resetAssertsCheck(); + vi.clearAllMocks(); + sinon.restore(); }); afterAll(() => { - jest.resetAllMocks(); + vi.resetAllMocks(); sinon.resetBehavior(); }); @@ -38,44 +41,42 @@ describe("NFT.Storage Client", () => { */ it("Smoke test - add metadata", async () => { await storage.storeMetadata(getFormattedMetadata()); - expect(storeBlobMock).toHaveBeenCalledTimes(1); + expect(storeBlobMock.callCount).to.eq(1); }); it("Smoke test - get metadata", async () => { - ipfsFetcherMock.returns(Promise.resolve(hypercertMetadata.data)); + sinon.stub(axios, "get").resolves(Promise.resolve({ data: hypercertMetadata.data })); const res = await storage.getMetadata(hypercertMetadata.cid); - expect(res).toMatchObject(hypercertMetadata.data); + expect(res).to.deep.eq(hypercertMetadata.data); }); it("Throws when trying to store incorrect metadata", async () => { + chai.Assertion.expectAssertions(2); // storeData try { await storage.storeMetadata({ data: "false" } as unknown as HypercertMetadata); } catch (e) { - expect(e instanceof MalformedDataError).toBeTruthy(); + expect(e).to.be.an.instanceOf(MalformedDataError); const error = e as MalformedDataError; - expect(error.message).toBe("Invalid metadata."); + expect(error.message).to.eq("Invalid metadata."); } - - expect.assertions(2); }); it("Throws when trying to fetch incorrect metadata", async () => { + chai.Assertion.expectAssertions(2); const incorrectCID = "incorrect-cid"; + sinon.stub(axios, "get").resolves(Promise.resolve({ data: "false" })); - ipfsFetcherMock.resolves({ data: "false" }); // storeData try { await storage.getMetadata(incorrectCID); } catch (e) { - expect(e instanceof MalformedDataError).toBeTruthy(); + expect(e).to.be.an.instanceOf(MalformedDataError); const error = e as MalformedDataError; - expect(error.message).toBe(`Invalid metadata at ${incorrectCID}`); + expect(error.message).to.be.eq(`Invalid metadata at ${incorrectCID}`); } - - expect.assertions(2); }); }); diff --git a/sdk/test/storage/web3.storage.test.ts b/sdk/test/storage/web3.storage.test.ts index a3d5af8e..4210cd5c 100644 --- a/sdk/test/storage/web3.storage.test.ts +++ b/sdk/test/storage/web3.storage.test.ts @@ -1,21 +1,18 @@ -import { jest } from "@jest/globals"; +import { describe, it, afterEach, afterAll } from "vitest"; +import { expect } from "chai"; //eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { Web3Storage } from "web3.storage"; -import HypercertsStorage from "../../src/storage"; +import { HypercertsStorage } from "../../src/storage"; import { mockDataSets } from "../helpers"; -import fetchers from "../../src/utils/fetchers"; +import axios from "axios"; import sinon from "sinon"; describe("Web3.Storage Client", () => { const { hypercertData, hypercertMetadata } = mockDataSets; - const storeBlobMock = jest.spyOn(Web3Storage.prototype, "put").mockImplementation((_: unknown, __?: unknown) => { - return Promise.resolve(hypercertMetadata.cid); - }); - - const ipfsFetcherMock = sinon.stub(fetchers, "getFromIPFS"); + const storeBlobMock = sinon.stub(Web3Storage.prototype, "put").resolves(hypercertMetadata.cid); const storage = new HypercertsStorage({ nftStorageToken: process.env.NFT_STORAGE_TOKEN, @@ -23,11 +20,10 @@ describe("Web3.Storage Client", () => { }); afterEach(() => { - jest.clearAllMocks(); + sinon.restore(); }); afterAll(() => { - jest.resetAllMocks(); sinon.resetBehavior(); }); @@ -36,13 +32,13 @@ describe("Web3.Storage Client", () => { */ it("Smoke test - add data", async () => { await storage.storeData(hypercertData.data); - expect(storeBlobMock).toHaveBeenCalledTimes(1); + expect(storeBlobMock.callCount).to.eq(1); }); it("Smoke test - get data", async () => { - ipfsFetcherMock.returns(Promise.resolve(hypercertData.data)); + sinon.stub(axios, "get").resolves(Promise.resolve({ data: hypercertData.data })); const res = await storage.getData(hypercertData.cid); - expect(res).toMatchObject(hypercertData.data); + expect(res).to.deep.eq(hypercertData.data); }); }); diff --git a/sdk/test/types/errors.test.ts b/sdk/test/types/errors.test.ts index de5e66c5..a5538bb2 100644 --- a/sdk/test/types/errors.test.ts +++ b/sdk/test/types/errors.test.ts @@ -1,3 +1,5 @@ +import { describe, it } from "vitest"; + import { expect } from "chai"; import { @@ -10,7 +12,7 @@ import { UnsupportedChainError, } from "../../src/types/errors"; -describe.only("Error types", () => { +describe("Error types", () => { it("has ClientError", () => { const error = new ClientError("Client error", { foo: "bar" }); error.message = "Client error"; diff --git a/sdk/test/utils/allowlist.test.ts b/sdk/test/utils/allowlist.test.ts index 61fa4f90..444422e4 100644 --- a/sdk/test/utils/allowlist.test.ts +++ b/sdk/test/utils/allowlist.test.ts @@ -1,11 +1,13 @@ +import { describe, it, afterEach, afterAll } from "vitest"; + import chai, { expect } from "chai"; import chaiSubset from "chai-subset"; import sinon from "sinon"; import { faker } from "@faker-js/faker"; import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; -import fetchers from "../../src/utils/fetchers"; -import allowlistUtils from "../../src/utils/allowlist"; +import { getProofsFromAllowlist } from "../../src/utils"; +import axios from "axios"; chai.use(chaiSubset); @@ -23,18 +25,20 @@ const createAllowlist = async () => { }; describe("Fetchers", () => { - const ipfsFetcherMock = sinon.stub(fetchers, "getFromIPFS"); - afterEach(() => { sinon.restore(); }); + afterAll(() => { + sinon.resetBehavior(); + }); + it("Proof: should return valid proof and root", async () => { const { allowlist, tree } = await createAllowlist(); - const stub = ipfsFetcherMock.resolves(Promise.resolve(JSON.stringify(tree.dump()))); + const stub = sinon.stub(axios, "get").resolves(Promise.resolve({ data: JSON.stringify(tree.dump()) })); - const res = await allowlistUtils.getProofsFromAllowlist("test", allowlist[0].address); + const res = await getProofsFromAllowlist("test", allowlist[0].address); expect(res).to.containSubset({ proof: tree.getProof(0), diff --git a/sdk/test/utils/config.test.ts b/sdk/test/utils/config.test.ts index f27c44e5..b3e7d32f 100644 --- a/sdk/test/utils/config.test.ts +++ b/sdk/test/utils/config.test.ts @@ -1,3 +1,5 @@ +import { describe, it, afterEach } from "vitest"; + import chai, { expect } from "chai"; import chaiSubset from "chai-subset"; import sinon from "sinon"; diff --git a/sdk/test/utils/errors.test.ts b/sdk/test/utils/errors.test.ts index 46f07a1b..a4509d23 100644 --- a/sdk/test/utils/errors.test.ts +++ b/sdk/test/utils/errors.test.ts @@ -1,3 +1,5 @@ +import { describe, it } from "vitest"; + import { expect } from "chai"; import { FetchError, MalformedDataError, UnsupportedChainError } from "../../src/types/errors"; diff --git a/sdk/test/utils/fetchers.test.ts b/sdk/test/utils/fetchers.test.ts index cd868b6b..a3586444 100644 --- a/sdk/test/utils/fetchers.test.ts +++ b/sdk/test/utils/fetchers.test.ts @@ -1,8 +1,10 @@ +import { describe, it, afterEach } from "vitest"; + import chai, { expect } from "chai"; import chaiSubset from "chai-subset"; import sinon from "sinon"; -import fetchers from "../../src/utils/fetchers"; +import { getFromIPFS } from "../../src/utils/fetchers"; import axios from "axios"; chai.use(chaiSubset); @@ -16,7 +18,7 @@ describe("Fetchers", () => { const validResponse = { data: "TEST_PASSED" }; const axiosStub = sinon.stub(axios, "get").resolves(Promise.resolve(validResponse)); - const res = await fetchers.getFromIPFS("test"); + const res = await getFromIPFS("test"); expect(res).to.equal(validResponse.data); expect(axiosStub.calledOnce).to.be.true; }); @@ -30,7 +32,7 @@ describe("Fetchers", () => { .onSecondCall() .resolves(Promise.resolve(validResponse)); - const res = await fetchers.getFromIPFS("test"); + const res = await getFromIPFS("test"); expect(res).to.equal(validResponse.data); expect(axiosStub.calledTwice).to.be.true; }); diff --git a/sdk/test/utils/formatter.test.ts b/sdk/test/utils/formatter.test.ts index 15cd6c5e..f492d5cc 100644 --- a/sdk/test/utils/formatter.test.ts +++ b/sdk/test/utils/formatter.test.ts @@ -1,3 +1,4 @@ +import { describe, it } from "vitest"; import { expect } from "chai"; import { formatHypercertData } from "../../src"; diff --git a/sdk/test/utils/logger.test.ts b/sdk/test/utils/logger.test.ts index 06fe768f..55a5caca 100644 --- a/sdk/test/utils/logger.test.ts +++ b/sdk/test/utils/logger.test.ts @@ -1,6 +1,7 @@ +import { describe, it, beforeEach, afterEach, beforeAll, afterAll } from "vitest"; import sinon from "sinon"; -import logger from "../../src/utils/logger.js"; +import { logger } from "../../src/utils"; describe("logger", () => { const stubError = sinon.stub(console, "error"); diff --git a/sdk/test/validator.test.ts b/sdk/test/validator.test.ts index 210fdd1e..8ae0f44f 100644 --- a/sdk/test/validator.test.ts +++ b/sdk/test/validator.test.ts @@ -1,3 +1,5 @@ +import { describe, it } from "vitest"; + import { expect } from "chai"; import { validateClaimData, validateMetaData } from "../src"; @@ -20,7 +22,6 @@ describe("Validate claim test", () => { it("checking default claimdata", () => { const result = validateClaimData(hypercertData.data); - console.log(result); expect(result.valid).to.be.true; const invalidResult = validateClaimData({} as HypercertClaimdata); diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index 2c208243..942fa312 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -22,5 +22,5 @@ "skipLibCheck": true }, "exclude": ["node_modules"], - "include": ["./src/*.ts", "./src/**/*", "./test/*.ts", "./test/**/*.ts", "global.d.ts"] + "include": ["./src/*.ts", "./src/**/*", "./test/*.ts", "./test/**/*.ts"] } diff --git a/sdk/vitest.config.ts b/sdk/vitest.config.ts new file mode 100644 index 00000000..8e1d367d --- /dev/null +++ b/sdk/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + globalSetup: "./test/setup-env.ts", + }, +}); From ccdf65bdddee0cd76312bafeb7a30ae8adf206e1 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Wed, 29 Nov 2023 13:09:39 +0100 Subject: [PATCH 024/118] feat(abis): updated SDK abis and restored tests (#1193) * feat(abis): updated SDK abis and restored tests * chore(bump): viem in fe --- contracts/hardhat.config.ts | 1 - contracts/package.json | 3 +- .../deployment-marketplace-goerli.json | 2 +- contracts/src/index.ts | 4 +- contracts/tasks/deploy-marketplace.ts | 2 +- .../libraries/LowLevelHypercertCaller.md | 2 +- .../marketplace/libraries/OrderStructs.md | 2 +- frontend/package.json | 2 +- pnpm-lock.yaml | 125 ++++-- sdk/package.json | 6 +- sdk/src/client.ts | 10 +- sdk/src/types/client.ts | 5 +- sdk/test/client/allowlist.minting.test.ts | 8 +- sdk/test/client/minting.test.ts | 4 +- sdk/test/client/split.merge.test.ts | 379 +++++++++--------- 15 files changed, 308 insertions(+), 247 deletions(-) diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 656e359b..422bf08e 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -107,7 +107,6 @@ const config: HardhatUserConfig = { path: "./abi", runOnCompile: true, clear: true, - pretty: true, only: [ "CurrencyManager", "HypercertMinter", diff --git a/contracts/package.json b/contracts/package.json index 0d16c149..d3912958 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@hypercerts-org/contracts", "description": "EVM compatible protocol for managing impact claims", - "version": "1.0.0-alpha.4", + "version": "1.0.0-alpha.6", "author": { "name": "Hypercerts Foundation", "url": "https://github.com/hypercerts-org/hypercerts" @@ -65,6 +65,7 @@ "rimraf": "^5.0.5", "rollup": "^4.0.2", "rollup-plugin-auto-external": "^2.0.0", + "rollup-plugin-copy": "^3.5.0", "rollup-plugin-dts": "^6.1.0", "rollup-plugin-esbuild": "^6.1.0", "rollup-plugin-node-polyfills": "^0.2.1", diff --git a/contracts/src/deployments/deployment-marketplace-goerli.json b/contracts/src/deployments/deployment-marketplace-goerli.json index 58ac0626..2c3c30ca 100644 --- a/contracts/src/deployments/deployment-marketplace-goerli.json +++ b/contracts/src/deployments/deployment-marketplace-goerli.json @@ -1,5 +1,5 @@ { - "HypercertsExchange": { + "HypercertExchange": { "address": "0x89524d8a0B1D7742579A7d8AE46D7679a4de1198", "fullNamespace": "LooksRareProtocol", "args": [ diff --git a/contracts/src/index.ts b/contracts/src/index.ts index 533aab40..cbee534e 100644 --- a/contracts/src/index.ts +++ b/contracts/src/index.ts @@ -37,7 +37,7 @@ export type DeploymentProtocol = { }; export type DeploymentMarketplace = { - HypercertsExchange: `0x${string}`; + HypercertExchange: `0x${string}`; TransferManager: `0x${string}`; OrderValidatorV2A: `0x${string}`; }; @@ -49,7 +49,7 @@ export type DeployedChains = keyof typeof DEPLOYMENTS.protocol; const deployments = { 5: { ...DEPLOYMENTS.protocol["5"], - HypercertsExchange: DEPLOYMENTS.marketplace[5].HypercertsExchange.address, + HypercertExchange: DEPLOYMENTS.marketplace[5].HypercertExchange.address, TransferManager: DEPLOYMENTS.marketplace[5].TransferManager.address, OrderValidatorV2A: DEPLOYMENTS.marketplace[5].OrderValidator.address, }, diff --git a/contracts/tasks/deploy-marketplace.ts b/contracts/tasks/deploy-marketplace.ts index d7667c2e..2e75931b 100644 --- a/contracts/tasks/deploy-marketplace.ts +++ b/contracts/tasks/deploy-marketplace.ts @@ -453,7 +453,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") }; const contracts: ContractDeployments = { - HypercertsExchange: { + HypercertExchange: { address: hypercertsExchangeCreate2.address, fullNamespace: "LooksRareProtocol", args: hypercertsExchangeArgs, diff --git a/docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md index 5ed383b6..5951cc56 100644 --- a/docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md +++ b/docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md @@ -1,6 +1,6 @@ # LowLevelHypercertCaller -_LooksRare protocol team (👀,💎)_ +_bitbeckers_ > LowLevelHypercertCaller diff --git a/docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md index 3c166bb7..6ffa83e2 100644 --- a/docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md +++ b/docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md @@ -1,6 +1,6 @@ # OrderStructs -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers_ > OrderStructs diff --git a/frontend/package.json b/frontend/package.json index 93ceffe5..66fba7a5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -66,7 +66,7 @@ "react-toastify": "^9.1.1", "react-use": "^17.4.0", "serve": "^14.0.1", - "viem": "1.18.9", + "viem": "1.19.9", "wagmi": "1.4.5", "yup": "^0.32.11" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index af2dc3a6..968dad6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -141,6 +141,9 @@ importers: rollup-plugin-auto-external: specifier: ^2.0.0 version: 2.0.0(rollup@4.1.4) + rollup-plugin-copy: + specifier: ^3.5.0 + version: 3.5.0 rollup-plugin-dts: specifier: ^6.1.0 version: 6.1.0(rollup@4.1.4)(typescript@4.9.5) @@ -313,7 +316,7 @@ importers: version: 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@celo/rainbowkit-celo': specifier: ^1.1.0 - version: 1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(wagmi@1.4.5)(zod@3.22.4) + version: 1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(wagmi@1.4.5)(zod@3.22.4) '@emotion/react': specifier: ^11.10.5 version: 11.11.1(@types/react@18.2.33)(react@18.2.0) @@ -325,7 +328,7 @@ importers: version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': specifier: 1.0.0-alpha.2 - version: 1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6) + version: 1.0.0-alpha.2(typescript@5.1.6) '@hypercerts-org/observabletreemap': specifier: 'workspace: *' version: link:../vendor/observabletreemap @@ -358,7 +361,7 @@ importers: version: 1.0.333(next@14.0.3)(react-dom@18.2.0)(react@18.2.0) '@rainbow-me/rainbowkit': specifier: 1.2.0 - version: 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.9)(wagmi@1.4.5) + version: 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.5) '@sentry/nextjs': specifier: ^7.73.0 version: 7.75.1(next@14.0.3)(react@18.2.0)(webpack@5.89.0) @@ -453,11 +456,11 @@ importers: specifier: ^14.0.1 version: 14.2.1 viem: - specifier: 1.18.9 - version: 1.18.9(typescript@5.1.6)(zod@3.22.4) + specifier: 1.19.9 + version: 1.19.9(typescript@5.1.6)(zod@3.22.4) wagmi: specifier: 1.4.5 - version: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) + version: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) yup: specifier: ^0.32.11 version: 0.32.11 @@ -580,8 +583,8 @@ importers: specifier: ^3.2.0 version: 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': - specifier: 1.0.0-alpha.2 - version: 1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6) + specifier: 1.0.0-alpha.6 + version: 1.0.0-alpha.6(ts-node@10.9.1)(typescript@5.1.6) '@openzeppelin/merkle-tree': specifier: ^1.0.5 version: 1.0.5 @@ -616,8 +619,8 @@ importers: specifier: ^7.1.1 version: 7.1.1(node-fetch@3.3.2) viem: - specifier: ^1.18.4 - version: 1.18.9(typescript@5.1.6)(zod@3.22.4) + specifier: ^1.19.9 + version: 1.19.9(typescript@5.1.6)(zod@3.22.4) web3.storage: specifier: ^4.5.5 version: 4.5.5(node-fetch@3.3.2) @@ -797,6 +800,7 @@ packages: /@adraffy/ens-normalize@1.9.4: resolution: {integrity: sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw==} + dev: true /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} @@ -2612,7 +2616,7 @@ packages: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} dev: false - /@celo/rainbowkit-celo@1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(wagmi@1.4.5)(zod@3.22.4): + /@celo/rainbowkit-celo@1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(wagmi@1.4.5)(zod@3.22.4): resolution: {integrity: sha512-/G4HFhJNwUk6uU1yqGfQ/LIoNg9UAA4BUcEvFdd0M3DImnKlhodNLUdCmzqv96sjc/I7tMJqBeTnmbhwXdlsjQ==} peerDependencies: '@rainbow-me/rainbowkit': '>=1.0.2 && <=2.0.0' @@ -2620,10 +2624,10 @@ packages: wagmi: '>=1.0.0 && <=2.0.0' dependencies: '@metamask/providers': 11.1.2 - '@rainbow-me/rainbowkit': 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.9)(wagmi@1.4.5) - '@wagmi/connectors': 2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) + '@rainbow-me/rainbowkit': 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.5) + '@wagmi/connectors': 2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@wagmi/chains' @@ -7772,7 +7776,7 @@ packages: resolution: {integrity: sha512-n6fwMsaoR50VITM2upR4OOi4EZJmZvU6vvXrHWCSakP9e1OeDuAOk+kHiK+egqDRYj6uKtg9VTUFKZBYvu3jRg==} dev: false - /@hypercerts-org/contracts@1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6): + /@hypercerts-org/contracts@1.0.0-alpha.2(typescript@5.1.6): resolution: {integrity: sha512-I9TMEyN4cKW3Gfv3Wysk9xoZzwpUjI+dgCECJVjBlInRiCxnaUdahBSqhVvKg1gViWaPMDvDGe5v9jVknZIN/A==} dependencies: hardhat: 2.18.3(ts-node@10.9.1)(typescript@5.1.6) @@ -7784,6 +7788,18 @@ packages: - utf-8-validate dev: false + /@hypercerts-org/contracts@1.0.0-alpha.6(ts-node@10.9.1)(typescript@5.1.6): + resolution: {integrity: sha512-8XV9jlj5P+WL+hFX56OP+cYpLDwicZoGteN3ZAPHc1Y07fy7I2tpx1/MU7Sg2GX2nVO46Xix1MblQxVzx0Xy8Q==} + dependencies: + hardhat: 2.18.3(ts-node@10.9.1)(typescript@5.1.6) + transitivePeerDependencies: + - bufferutil + - supports-color + - ts-node + - typescript + - utf-8-validate + dev: false + /@hypercerts-org/sdk@1.0.0-alpha.10(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4): resolution: {integrity: sha512-PEGKxzxhGZuz0cjYCCj90+bBmbfU4n1mP+q911Kx6jZ0g5sQyj+m685x0cq8OIL4JnYNPShZ2OWDjcX93KzbBA==} dependencies: @@ -7801,7 +7817,7 @@ packages: '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@hypercerts-org/contracts': 1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6) + '@hypercerts-org/contracts': 1.0.0-alpha.2(typescript@5.1.6) '@openzeppelin/merkle-tree': 1.0.5 '@whatwg-node/fetch': 0.9.14 ajv: 8.12.0 @@ -7813,7 +7829,7 @@ packages: loglevel: 1.8.1 mime: 3.0.0 nft.storage: 7.1.1(node-fetch@3.3.2) - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) web3.storage: 4.5.5(node-fetch@3.3.2) transitivePeerDependencies: - '@envelop/core' @@ -10922,7 +10938,7 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - /@rainbow-me/rainbowkit@1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.9)(wagmi@1.4.5): + /@rainbow-me/rainbowkit@1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.5): resolution: {integrity: sha512-XjdeX31GwFdRR/1rCRqPXiO94nbq2qOlnaox5P4K/KMRIUwyelKzak27uWw8Krmor/Hcrd5FisfepGDS0tUfEA==} engines: {node: '>=12.4'} peerDependencies: @@ -10941,8 +10957,8 @@ packages: react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.4(@types/react@18.2.33)(react@18.2.0) ua-parser-js: 1.0.36 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) transitivePeerDependencies: - '@types/react' dev: false @@ -11500,7 +11516,7 @@ packages: resolution: {integrity: sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.12.0 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -11512,7 +11528,7 @@ packages: resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.12.0 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -12764,6 +12780,12 @@ packages: '@types/node': 18.18.7 dev: true + /@types/fs-extra@8.1.5: + resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} + dependencies: + '@types/node': 18.18.7 + dev: true + /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: @@ -13630,7 +13652,7 @@ packages: typescript: 5.1.6 dev: true - /@wagmi/connectors@2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): + /@wagmi/connectors@2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): resolution: {integrity: sha512-1KOL0HTJl5kzSC/YdKwFwiokr6poUQn1V/tcT0TpG3iH2x0lSM7FTkvCjVVY/6lKzTXrLlo9y2aE7AsOPnkvqg==} peerDependencies: '@wagmi/chains': '>=1.7.0' @@ -13653,7 +13675,7 @@ packages: abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - bufferutil @@ -13665,7 +13687,7 @@ packages: - zod dev: false - /@wagmi/connectors@3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): + /@wagmi/connectors@3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): resolution: {integrity: sha512-UgwsQKQDFObJVJMf9pDfFoXTv710o4zrTHyhIWKBTMMkLpCMsMxN5+ZaDhBYt/BgoRinfRYQo8uwuwLhxE6Log==} peerDependencies: typescript: '>=5.0.4' @@ -13685,7 +13707,7 @@ packages: abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@types/react' @@ -13698,7 +13720,7 @@ packages: - zod dev: false - /@wagmi/core@1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): + /@wagmi/core@1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): resolution: {integrity: sha512-N9luRb1Uk4tBN9kaYcQSWKE9AsRt/rvZaFt5IZech4JPzNN2sQlfhKd9GEjOXYRDqEPHdDvos7qyBKiDNTz4GA==} peerDependencies: typescript: '>=5.0.4' @@ -13707,11 +13729,11 @@ packages: typescript: optional: true dependencies: - '@wagmi/connectors': 3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) + '@wagmi/connectors': 3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: - '@react-native-async-storage/async-storage' @@ -16917,7 +16939,6 @@ packages: /colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - dev: false /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -21418,6 +21439,20 @@ packages: define-properties: 1.2.1 dev: true + /globby@10.0.1: + resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} + engines: {node: '>=8'} + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + glob: 7.2.3 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + /globby@10.0.2: resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} engines: {node: '>=8'} @@ -23774,6 +23809,11 @@ packages: dependencies: isobject: 3.0.1 + /is-plain-object@3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} + dev: true + /is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -30883,6 +30923,17 @@ packages: semver: 5.7.2 dev: true + /rollup-plugin-copy@3.5.0: + resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} + engines: {node: '>=8.3'} + dependencies: + '@types/fs-extra': 8.1.5 + colorette: 1.4.0 + fs-extra: 8.1.0 + globby: 10.0.1 + is-plain-object: 3.0.1 + dev: true + /rollup-plugin-dts@5.3.1(rollup@3.29.4)(typescript@5.1.6): resolution: {integrity: sha512-gusMi+Z4gY/JaEQeXnB0RUdU82h1kF0WYzCWgVmV4p3hWXqelaKuCvcJawfeg+EKn2T1Ie+YWF2OiN1/L8bTVg==} engines: {node: '>=v14.21.3'} @@ -34239,15 +34290,15 @@ packages: - zod dev: true - /viem@1.18.9(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-eAXtoTwAFA3YEgjTYMb5ZTQrDC0UPx5qyZ4sv90TirVKepcM9mBPksTkC1SSWya0UdxhBmhEBL/CiYMjmGCTWg==} + /viem@1.19.9(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-Sf9U2x4jU0S/FALqYypcspWOGene0NZyD470oUripNhE0Ta6uOE/OgE4toTDVfRxov8qw0JFinr/wPGxYE3+HQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true dependencies: - '@adraffy/ens-normalize': 1.9.4 + '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 @@ -34416,7 +34467,7 @@ packages: hasBin: true dev: true - /wagmi@1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): + /wagmi@1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): resolution: {integrity: sha512-Ph62E6cO5n2Z8Z5LTyZrkaNprxTsbC4w0qZJT4OJdXrEELziI8z/b4FO6amVFXdu2rDp/wpvF56e4mhKC8/Kdw==} peerDependencies: react: '>=17.0.0' @@ -34429,12 +34480,12 @@ packages: '@tanstack/query-sync-storage-persister': 4.36.1 '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0) '@tanstack/react-query-persist-client': 4.36.1(@tanstack/react-query@4.36.1) - '@wagmi/core': 1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) + '@wagmi/core': 1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) react: 18.2.0 typescript: 5.1.6 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@types/react' diff --git a/sdk/package.json b/sdk/package.json index c772fe72..e8b55be6 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -35,7 +35,7 @@ "@graphql-mesh/store": "^0.95.7", "@graphql-mesh/utils": "^0.95.7", "@graphql-typed-document-node/core": "^3.2.0", - "@hypercerts-org/contracts": "1.0.0-alpha.2", + "@hypercerts-org/contracts": "1.0.0-alpha.6", "@openzeppelin/merkle-tree": "^1.0.5", "@whatwg-node/fetch": "^0.9.13", "ajv": "^8.11.2", @@ -47,7 +47,7 @@ "loglevel": "^1.8.1", "mime": "^3.0.0", "nft.storage": "^7.1.1", - "viem": "^1.18.4", + "viem": "^1.19.9", "web3.storage": "^4.5.5" }, "devDependencies": { diff --git a/sdk/src/client.ts b/sdk/src/client.ts index 779ba343..e0ce6877 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -1,6 +1,6 @@ import { HypercertMinterAbi } from "@hypercerts-org/contracts"; import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; -import { ByteArray, GetContractReturnType, Hex, PublicClient, WalletClient, getContract, parseAbi } from "viem"; +import { ByteArray, GetContractReturnType, Hex, PublicClient, WalletClient, getContract } from "viem"; import { HypercertEvaluator } from "./evaluations"; import { HypercertIndexer } from "./indexer"; import { HypercertsStorage } from "./storage"; @@ -99,10 +99,10 @@ export class HypercertClient implements HypercertClientInterface { * Gets the HypercertMinter contract used by the client. * @returns The contract. */ - get contract(): GetContractReturnType { + get contract(): GetContractReturnType { return getContract({ address: this._config.contractAddress as `0x${string}`, - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, publicClient: this._publicClient, walletClient: this._walletClient, }); @@ -296,6 +296,8 @@ export class HypercertClient implements HypercertClientInterface { ...this.getCleanedOverrides(overrides), }); + console.log(request); + return this.submitRequest(request); }; @@ -432,7 +434,7 @@ export class HypercertClient implements HypercertClientInterface { return getContract({ address: this.config.contractAddress as `0x${string}`, - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, }); }; diff --git a/sdk/src/types/client.ts b/sdk/src/types/client.ts index 9a4ec321..e5ba5c5e 100644 --- a/sdk/src/types/client.ts +++ b/sdk/src/types/client.ts @@ -7,7 +7,8 @@ import { HypercertIndexer } from "../indexer"; import { AllowlistEntry, TransferRestrictions } from "./hypercerts"; import { HypercertMetadata } from "./metadata"; -import { ByteArray, Chain, Hex, PublicClient, WalletClient, Abi } from "viem"; +import { ByteArray, Chain, Hex, PublicClient, WalletClient, GetContractReturnType } from "viem"; +import { HypercertMinterAbi } from "@hypercerts-org/contracts"; export type SupportedChainIds = 5 | 10 | 42220 | 11155111; export type SupportedOverrides = { @@ -120,7 +121,7 @@ export interface HypercertClientState { storage: HypercertStorageInterface; /** The indexer used by the client. */ indexer: HypercertIndexer; - contract: { abi: Abi; address?: `0x${string}` }; + contract: GetContractReturnType; } /** diff --git a/sdk/test/client/allowlist.minting.test.ts b/sdk/test/client/allowlist.minting.test.ts index fe9fbacf..c9cbce48 100644 --- a/sdk/test/client/allowlist.minting.test.ts +++ b/sdk/test/client/allowlist.minting.test.ts @@ -8,7 +8,7 @@ import { HypercertClient, HypercertsStorage } from "../../src"; import { MalformedDataError, MintingError, TransferRestrictions } from "../../src/types"; import { getAllowlist, getFormattedMetadata, publicClient, walletClient, mockDataSets } from "../helpers"; import { HypercertMinterAbi } from "@hypercerts-org/contracts"; -import { encodeFunctionResult, isHex, parseAbi, stringToHex } from "viem"; +import { encodeFunctionResult, isHex, stringToHex } from "viem"; chai.use(assertionsCount); @@ -30,19 +30,19 @@ describe("Allows for minting claims from an allowlist", () => { let writeSpy = sinon.stub(walletClient, "writeContract"); const mintClaimFromAllowlistResult = encodeFunctionResult({ - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, functionName: "mintClaimFromAllowlist", result: [], }); const batchMintClaimFromAllowlistResult = encodeFunctionResult({ - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, functionName: "batchMintClaimsFromAllowlists", result: [], }); const mintClaimResult = encodeFunctionResult({ - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, functionName: "createAllowlist", result: [], }); diff --git a/sdk/test/client/minting.test.ts b/sdk/test/client/minting.test.ts index 1ac1800e..4fbd29fa 100644 --- a/sdk/test/client/minting.test.ts +++ b/sdk/test/client/minting.test.ts @@ -2,7 +2,7 @@ import { describe, it, beforeEach, afterAll, beforeAll } from "vitest"; import chai, { expect } from "chai"; import assertionsCount from "chai-assertions-count"; import sinon from "sinon"; -import { ContractFunctionExecutionError, encodeFunctionResult, isHex, parseAbi, parseEther } from "viem"; +import { ContractFunctionExecutionError, encodeFunctionResult, isHex, parseEther } from "viem"; import { HypercertClient } from "../../src/client"; import { HypercertMetadata, formatHypercertData } from "../../src"; @@ -34,7 +34,7 @@ describe("mintClaim in HypercertClient", () => { let writeSpy = sinon.stub(walletClient, "writeContract"); const mintClaimResult = encodeFunctionResult({ - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, functionName: "mintClaim", result: [], }); diff --git a/sdk/test/client/split.merge.test.ts b/sdk/test/client/split.merge.test.ts index f319886c..27498047 100644 --- a/sdk/test/client/split.merge.test.ts +++ b/sdk/test/client/split.merge.test.ts @@ -8,10 +8,12 @@ import { HypercertClient } from "../../src/client"; import { publicClient, walletClient } from "../helpers"; import { ContractFunctionExecutionError, isHex, toHex } from "viem"; +import { ClientError } from "src"; +import { faker } from "@faker-js/faker"; chai.use(assertionsCount); -describe("splitClaimUnits in HypercertClient", () => { +describe("split and merge", () => { const wallet = walletClient; const userAddress = wallet.account?.address; @@ -28,198 +30,203 @@ describe("splitClaimUnits in HypercertClient", () => { const fractionId = 9868188640707215440437863615521278132232n; - beforeEach(async () => { - chai.Assertion.resetAssertsCheck(); - readSpy.resetBehavior(); - readSpy.resetHistory(); - - writeSpy.resetBehavior(); - writeSpy.resetHistory(); - }); - afterAll(() => { sinon.restore(); }); - it("allows for a hypercert fractions to be splitted over value", async () => { - chai.Assertion.expectExpects(4); - readSpy = readSpy.onFirstCall().resolves(userAddress).onSecondCall().resolves(300n); - writeSpy = writeSpy.resolves(toHex(420)); + describe("splitFractionUnits in HypercertClient", () => { + beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); + readSpy.resetBehavior(); + readSpy.resetHistory(); + + writeSpy.resetBehavior(); + writeSpy.resetHistory(); + }); + + it("allows for a hypercert fractions to be splitted over value", async () => { + chai.Assertion.expectExpects(4); + readSpy = readSpy.onFirstCall().resolves(userAddress).onSecondCall().resolves(300n); + writeSpy = writeSpy.resolves(toHex(420)); + + expect(client.readonly).to.be.false; + + const hash = await client.splitFractionUnits(fractionId, [100n, 200n]); + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(1); + }); + + it("allows for a hypercert fractions to be splitted over value with override params", async () => { + chai.Assertion.expectExpects(5); + readSpy = readSpy + .onFirstCall() + .resolves(userAddress) + .onSecondCall() + .resolves(300n) + .onThirdCall() + .resolves(userAddress) + .onCall(3) + .resolves(300n); + + writeSpy = writeSpy.resolves(toHex(420)); + + expect(client.readonly).to.be.false; + + try { + await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: "FALSE_VALUE" as unknown as bigint }); + } catch (e) { + expect(e instanceof ContractFunctionExecutionError).to.be.true; + } + + const hash = await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: 12300000n }); + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(4); + expect(writeSpy.callCount).to.eq(1); + }); + + it("throws on splitting with incorrect new total value", async () => { + chai.Assertion.expectExpects(4); + readSpy = readSpy + .onFirstCall() + .resolves(userAddress) // ownerOf + .onSecondCall() + .resolves(300n) // unitsOf + .onThirdCall() + .resolves(userAddress) + .onCall(3) + .resolves(300n); + + expect(client.readonly).to.be.false; + + try { + await client.splitFractionUnits(fractionId, [100n, 777n]); + } catch (e) { + expect(e instanceof ClientError).to.be.true; + + const error = e as ClientError; + expect(error.message).to.be.eq("Sum of fractions is not equal to the total units"); + } + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + // Owner + // UnitsOf + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(0); + }); + + it("throws on splitting fractions not owned by signer", async () => { + chai.Assertion.expectExpects(4); + readSpy = readSpy.onFirstCall().resolves(faker.finance.ethereumAddress()).onSecondCall().resolves(300n); // unitsOf; // ownerOf + + expect(client.readonly).to.be.false; + + try { + await client.splitFractionUnits(fractionId, [100n, 200n]); + } catch (e) { + expect(e instanceof ClientError).to.be.true; + + const error = e as ClientError; + expect(error.message).to.be.eq("Claim is not owned by the signer"); + } + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + // Owner + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(0); + }); + }); - expect(client.readonly).to.be.false; + describe("mergeFractionUnits in HypercertClient", () => { + beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); + readSpy.resetBehavior(); + readSpy.resetHistory(); - const hash = await client.splitFractionUnits(fractionId, [100n, 200n]); + writeSpy.resetBehavior(); + writeSpy.resetHistory(); + }); - //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(isHex(hash)).to.be.true; - expect(readSpy.callCount).to.eq(2); - expect(writeSpy.callCount).to.eq(1); - }); + it("allows for hypercert fractions to merge value", async () => { + chai.Assertion.expectExpects(3); + readSpy = readSpy + .onFirstCall() + .resolves(userAddress) // ownerOf + .onSecondCall() + .resolves(userAddress) // unitsOf + .onThirdCall() + .resolves(userAddress); - it("allows for a hypercert fractions to be splitted over value with override params", async () => { - chai.Assertion.expectExpects(5); - readSpy = readSpy - .onFirstCall() - .resolves(userAddress) - .onSecondCall() - .resolves(300n) - .onThirdCall() - .resolves(userAddress) - .onCall(3) - .resolves(300n); - - writeSpy = writeSpy.resolves(toHex(420)); - - expect(client.readonly).to.be.false; - - try { - await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: "FALSE_VALUE" as unknown as bigint }); - } catch (e) { - expect(e instanceof ContractFunctionExecutionError).to.be.true; - } - - const hash = await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: 12300000n }); - - //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(isHex(hash)).to.be.true; - expect(readSpy.callCount).to.eq(4); - expect(writeSpy.callCount).to.eq(1); - }); + writeSpy = writeSpy.resolves(toHex(420)); - // it("throws on splitting with incorrect new total value", async () => { - // const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); - // await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); - // await mockMinter.mock["unitsOf(uint256)"].withArgs(fractionId).returns(42); - - // const client = new HypercertClient({ - // chainId: 5, - // operator: walletClient, - // contractAddress: mockMinter.address, - // }); - // expect(client.readonly).toBe(false); - - // try { - // await client.splitClaimUnits(fractionId, [100n, 200n]); - // } catch (e) { - // expect(e instanceof ClientError).toBeTruthy(); - - // const error = e as ClientError; - // expect(error.message).toBe("Sum of fractions is not equal to the total units"); - // } - - // //TODO determine underlying calls and mock those out. Some are provider simulation calls - // // Owner - // // UnitsOf - // expect(provider.callHistory.length).toBe(5); - // expect.assertions(4); - // }); - - // it("throws on splitting fractions not owned by signer", async () => { - // const otherUser = await provider.getWallets()[1].getAddress(); - // const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); - // await mockMinter.mock.ownerOf.withArgs(fractionId).returns(otherUser); - - // const client = new HypercertClient({ - // chainId: 5, - // operator: walletClient, - // contractAddress: mockMinter.address, - // }); - // expect(client.readonly).toBe(false); - - // try { - // await client.splitClaimUnits(fractionId, [100n, 200n]); - // } catch (e) { - // expect(e instanceof ClientError).toBeTruthy(); - - // const error = e as ClientError; - // expect(error.message).toBe("Claim is not owned by the signer"); - // } - - // //TODO determine underlying calls and mock those out. Some are provider simulation calls - // // Owner - // expect(provider.callHistory.length).toBe(3); - // expect.assertions(4); - // }); -}); + expect(client.readonly).to.be.false; + + const hash = await client.mergeFractionUnits([fractionId, fractionId + 1n]); + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(1); + }); + + it("allows for hypercert fractions to merge value with override params", async () => { + chai.Assertion.expectExpects(7); + + readSpy = readSpy.resolves(userAddress); // ownerOf + + writeSpy = writeSpy.resolves(toHex(420)); + + expect(client.readonly).to.be.false; -// describe("mergeClaimUnits in HypercertClient", () => { -// const provider = testClient; -// const wallet = walletClient; -// const fractionId = 9868188640707215440437863615521278132232n; -// const userAddress = wallet.account.address; - -// it("allows for hypercert fractions to merge value", async () => { -// const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); -// await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); -// await mockMinter.mock.ownerOf.withArgs(fractionId + 1n).returns(userAddress); -// await mockMinter.mock["mergeFractions(address,uint256[])"] -// .withArgs(userAddress, [fractionId, fractionId + 1n]) -// .returns(); - -// const client = new HypercertClient({ -// chainId: 5, -// operator: walletClient, -// contractAddress: mockMinter.address, -// }); -// expect(client.readonly).toBe(false); - -// await client.mergeClaimUnits([fractionId, fractionId + 1n]); - -// //TODO determine underlying calls and mock those out. Some are provider simulation calls -// expect(provider.callHistory.length).toBe(7); -// }, 10000); - -// it("allows for hypercert fractions to merge value with override params", async () => { -// const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); -// await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); -// await mockMinter.mock.ownerOf.withArgs(fractionId + 1n).returns(userAddress); -// await mockMinter.mock["mergeFractions(address,uint256[])"] -// .withArgs(userAddress, [fractionId, fractionId + 1n]) -// .returns(); - -// const client = new HypercertClient({ -// chainId: 5, -// operator: walletClient, -// contractAddress: mockMinter.address, -// }); -// expect(client.readonly).toBe(false); - -// try { -// await client.mergeClaimUnits([fractionId, fractionId + 1n], { gasLimit: "FALSE_VALUE" as unknown as bigint }); -// } catch (e) { -// expect((e as Error).message).toMatch(/invalid BigNumber string/); -// } - -// await client.mergeClaimUnits([fractionId, fractionId + 1n], { gasLimit: 12300000n }); - -// //TODO determine underlying calls and mock those out. Some are provider simulation calls -// expect(provider.callHistory.length).toBe(9); -// }, 10000); - -// it("throws on splitting fractions not owned by signer", async () => { -// const otherUser = await provider.getWallets()[1].getAddress(); - -// const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); -// await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); -// await mockMinter.mock.ownerOf.withArgs(fractionId + 1n).returns(otherUser); - -// const client = new HypercertClient({ -// chainId: 5, -// operator: walletClient, -// contractAddress: mockMinter.address, -// }); -// expect(client.readonly).toBe(false); - -// try { -// await client.mergeClaimUnits([fractionId, fractionId + 1n]); -// } catch (e) { -// expect(e instanceof ClientError).toBeTruthy(); - -// const error = e as ClientError; -// expect(error.message).toBe("One or more claims are not owned by the signer"); -// } - -// //TODO determine underlying calls and mock those out. Some are provider simulation calls -// expect(provider.callHistory.length).toBe(5); -// }); -// }); + let hash; + + try { + hash = await client.mergeFractionUnits([fractionId, fractionId + 1n], { + gasLimit: "FALSE_VALUE" as unknown as bigint, + }); + } catch (e) { + console.log(e); + // https://github.com/wevm/viem/issues/1275 + expect(e instanceof Error).to.be.true; + + // const error = e as ClientError; + // expect(error.message).to.be.eq(/invalid BigNumber string/); + expect(isHex(hash)).to.be.false; + } + + hash = await client.mergeFractionUnits([fractionId, fractionId + 1n], { gasLimit: 12300000n }); + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(4); + expect(writeSpy.callCount).to.eq(1); + }); + + it("throws on splitting fractions not owned by signer", async () => { + chai.Assertion.expectExpects(3); + readSpy = readSpy.onFirstCall().resolves(userAddress).onSecondCall().resolves(faker.finance.ethereumAddress()); // ownerOf + + expect(client.readonly).to.be.false; + + let hash; + try { + hash = await client.mergeFractionUnits([fractionId, fractionId + 1n]); + } catch (e) { + expect(e instanceof ClientError).to.be.true; + + const error = e as ClientError; + expect(error.message).to.be.eq("One or more fractions are not owned by the signer"); + } + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + expect(isHex(hash)).to.be.false; + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(0); + }); + }); +}); From 1acbaa07ce826dde88b8fe3de72df66e036289bc Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 30 Nov 2023 17:47:19 +0100 Subject: [PATCH 025/118] fix(test): add currency admin to test (#1197) --- contracts/hardhat.config.ts | 1 + contracts/package.json | 2 +- contracts/src/index.ts | 4 ++++ .../test/foundry/marketplace/LooksRareProtocol.t.sol | 10 ++++++++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 422bf08e..9958691f 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -109,6 +109,7 @@ const config: HardhatUserConfig = { clear: true, only: [ "CurrencyManager", + "ExecutionManager", "HypercertMinter", "LooksRareProtocol", "OrderValidatorV2A", diff --git a/contracts/package.json b/contracts/package.json index d3912958..2b7597b1 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@hypercerts-org/contracts", "description": "EVM compatible protocol for managing impact claims", - "version": "1.0.0-alpha.6", + "version": "1.0.0-alpha.7", "author": { "name": "Hypercerts Foundation", "url": "https://github.com/hypercerts-org/hypercerts" diff --git a/contracts/src/index.ts b/contracts/src/index.ts index cbee534e..ee478287 100644 --- a/contracts/src/index.ts +++ b/contracts/src/index.ts @@ -8,8 +8,10 @@ import TransferManagerAbi from "../abi/src/marketplace/TransferManager.sol/Trans import StrategyCollectionOfferAbi from "../abi/src/marketplace/executionStrategies/StrategyCollectionOffer.sol/StrategyCollectionOffer.json"; import StrategyHypercertFractionOfferAbi from "../abi/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol/StrategyHypercertFractionOffer.json"; import CreatorFeeManagerWithRoyaltiesAbi from "../abi/src/marketplace/CreatorFeeManagerWithRoyalties.sol/CreatorFeeManagerWithRoyalties.json"; +import ExecutionManagerAbi from "../abi/src/marketplace/ExecutionManager.sol/ExecutionManager.json"; import { + ExecutionManager, HypercertMinter, IHypercertToken, LooksRareProtocol as HypercertExchange, @@ -74,6 +76,7 @@ export { deployments, asDeployedChain }; // Abis export { CreatorFeeManagerWithRoyaltiesAbi, + ExecutionManagerAbi, HypercertMinterAbi, HypercertExchangeAbi, OrderValidatorV2AAbi, @@ -86,6 +89,7 @@ export { // Interfaces export type { CreatorFeeManagerWithRoyalties, + ExecutionManager, IHypercertExchange, IHypercertToken, HypercertExchange, diff --git a/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol b/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol index 5f685cec..eae62a48 100644 --- a/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol +++ b/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol @@ -84,6 +84,10 @@ contract LooksRareProtocolTest is ProtocolBase { _createMockMakerAskAndTakerBid(address(mockERC721)); makerAsk.currency = address(mockERC20); + mockERC20.mint(takerUser, 10 ether); + vm.prank(takerUser); + mockERC20.approve(address(looksRareProtocol), 10 ether); + // Mint asset mockERC721.mint(makerUser, makerAsk.itemIds[0]); @@ -125,6 +129,12 @@ contract LooksRareProtocolTest is ProtocolBase { merkleTrees, false // Non-atomic ); + + vm.prank(_owner); + looksRareProtocol.updateCurrencyStatus(address(mockERC20), true); + + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } function testCannotTradeIfETHIsUsedForMakerBid() public { From de5e0d08c8df33476a34efcadddc676fde8e237f Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Fri, 1 Dec 2023 10:04:53 +0100 Subject: [PATCH 026/118] fix build error - set output:export in next config (#1199) * fix build error * lock nextjs version to 13.x.x --- frontend/package.json | 6 +- pnpm-lock.yaml | 186 ++++++++++++++++++++++++------------------ 2 files changed, 108 insertions(+), 84 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 66fba7a5..8c44c84b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,7 +7,7 @@ "start": "serve out", "deploy": "pnpm export && pnpm sentry:sourcemaps", "dev": "next", - "export": "export SENTRY_RELEASE=`sentry-cli releases propose-version` && next export", + "export": "export SENTRY_RELEASE=`sentry-cli releases propose-version` && next build", "lint": "tsc -v && tsc --noEmit && next lint", "lint:eslint": "eslint --ignore-path ../.gitignore --ignore-path .gitignore --ignore-path --max-warnings 0 .", "lint:prettier": "prettier --ignore-path ../.gitignore --ignore-path .gitignore --loglevel warn --check **/*.{js,jsx,ts,tsx,sol,md,json}", @@ -33,7 +33,7 @@ "@observablehq/runtime": "5", "@openzeppelin/merkle-tree": "^1.0.2", "@plasmicapp/host": "^1.0.171", - "@plasmicapp/loader-nextjs": "^1.0.284", + "@plasmicapp/loader-nextjs": "^1.0.345", "@rainbow-me/rainbowkit": "1.2.0", "@sentry/nextjs": "^7.73.0", "@sentry/utils": "^7.73.0", @@ -54,7 +54,7 @@ "html2canvas": "^1.4.1", "js-confetti": "^0.11.0", "lodash": "^4.17.21", - "next": "latest", + "next": "^13.5.6", "papaparse": "^5.4.1", "primereact": "^9.6.0", "qs": "^6.11.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 968dad6e..298843ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -357,14 +357,14 @@ importers: specifier: ^1.0.171 version: 1.0.177(react-dom@18.2.0)(react@18.2.0) '@plasmicapp/loader-nextjs': - specifier: ^1.0.284 - version: 1.0.333(next@14.0.3)(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.0.345 + version: 1.0.345(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) '@rainbow-me/rainbowkit': specifier: 1.2.0 version: 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.5) '@sentry/nextjs': specifier: ^7.73.0 - version: 7.75.1(next@14.0.3)(react@18.2.0)(webpack@5.89.0) + version: 7.75.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0) '@sentry/utils': specifier: ^7.73.0 version: 7.75.1 @@ -420,8 +420,8 @@ importers: specifier: ^4.17.21 version: 4.17.21 next: - specifier: latest - version: 14.0.3(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + specifier: ^13.5.6 + version: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) papaparse: specifier: ^5.4.1 version: 5.4.1 @@ -6665,7 +6665,7 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@whatwg-node/server': 0.9.16 @@ -6828,7 +6828,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6842,10 +6842,10 @@ packages: '@envelop/core': 5.0.0 '@envelop/extended-validation': 4.0.0(@envelop/core@5.0.0)(graphql@16.8.1) '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -6857,7 +6857,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6873,8 +6873,8 @@ packages: '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -7812,7 +7812,7 @@ packages: '@graphql-mesh/graphql': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -9749,8 +9749,8 @@ packages: murmurhash3js-revisited: 3.0.0 dev: false - /@next/env@14.0.3: - resolution: {integrity: sha512-7xRqh9nMvP5xrW4/+L0jgRRX+HoNRGnfJpD+5Wq6/13j3dsdzxO3BCXn7D3hMqsDb+vjZnJq+vI7+EtgrYZTeA==} + /@next/env@13.5.6: + resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} dev: false /@next/eslint-plugin-next@12.2.0: @@ -9765,8 +9765,8 @@ packages: glob: 7.1.7 dev: false - /@next/swc-darwin-arm64@14.0.3: - resolution: {integrity: sha512-64JbSvi3nbbcEtyitNn2LEDS/hcleAFpHdykpcnrstITFlzFgB/bW0ER5/SJJwUPj+ZPY+z3e+1jAfcczRLVGw==} + /@next/swc-darwin-arm64@13.5.6: + resolution: {integrity: sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -9774,8 +9774,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@14.0.3: - resolution: {integrity: sha512-RkTf+KbAD0SgYdVn1XzqE/+sIxYGB7NLMZRn9I4Z24afrhUpVJx6L8hsRnIwxz3ERE2NFURNliPjJ2QNfnWicQ==} + /@next/swc-darwin-x64@13.5.6: + resolution: {integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -9783,8 +9783,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@14.0.3: - resolution: {integrity: sha512-3tBWGgz7M9RKLO6sPWC6c4pAw4geujSwQ7q7Si4d6bo0l6cLs4tmO+lnSwFp1Tm3lxwfMk0SgkJT7EdwYSJvcg==} + /@next/swc-linux-arm64-gnu@13.5.6: + resolution: {integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -9792,8 +9792,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@14.0.3: - resolution: {integrity: sha512-v0v8Kb8j8T23jvVUWZeA2D8+izWspeyeDGNaT2/mTHWp7+37fiNfL8bmBWiOmeumXkacM/AB0XOUQvEbncSnHA==} + /@next/swc-linux-arm64-musl@13.5.6: + resolution: {integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -9801,8 +9801,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@14.0.3: - resolution: {integrity: sha512-VM1aE1tJKLBwMGtyBR21yy+STfl0MapMQnNrXkxeyLs0GFv/kZqXS5Jw/TQ3TSUnbv0QPDf/X8sDXuMtSgG6eg==} + /@next/swc-linux-x64-gnu@13.5.6: + resolution: {integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -9810,8 +9810,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@14.0.3: - resolution: {integrity: sha512-64EnmKy18MYFL5CzLaSuUn561hbO1Gk16jM/KHznYP3iCIfF9e3yULtHaMy0D8zbHfxset9LTOv6cuYKJgcOxg==} + /@next/swc-linux-x64-musl@13.5.6: + resolution: {integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -9819,8 +9819,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@14.0.3: - resolution: {integrity: sha512-WRDp8QrmsL1bbGtsh5GqQ/KWulmrnMBgbnb+59qNTW1kVi1nG/2ndZLkcbs2GX7NpFLlToLRMWSQXmPzQm4tog==} + /@next/swc-win32-arm64-msvc@13.5.6: + resolution: {integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -9828,8 +9828,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@14.0.3: - resolution: {integrity: sha512-EKffQeqCrj+t6qFFhIFTRoqb2QwX1mU7iTOvMyLbYw3QtqTw9sMwjykyiMlZlrfm2a4fA84+/aeW+PMg1MjuTg==} + /@next/swc-win32-ia32-msvc@13.5.6: + resolution: {integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -9837,8 +9837,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@14.0.3: - resolution: {integrity: sha512-ERhKPSJ1vQrPiwrs15Pjz/rvDHZmkmvbf/BjPN/UCOI++ODftT0GtasDPi0j+y6PPJi5HsXw+dpRaXUaw4vjuQ==} + /@next/swc-win32-x64-msvc@13.5.6: + resolution: {integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -10739,8 +10739,8 @@ packages: requiresBuild: true optional: true - /@plasmicapp/data-sources-context@0.1.17(react@18.2.0): - resolution: {integrity: sha512-vCAcgcxT6+MOn+rGlVszGDHPqBTGszzNZ4FuwXkX5RjN4W7VG8Vep6qpZC2KUZI0KpjGmGq3uLkeK4BcvciRzA==} + /@plasmicapp/data-sources-context@0.1.20(react@18.2.0): + resolution: {integrity: sha512-r+156StkG37WSXTGQSoihYjGLyKu1re+/ziD7GcPpP0VIHXtiUYC4XBINQa9jVer4hYZ54GItOdvUAZsxgCP/g==} engines: {node: '>=10'} peerDependencies: react: '>=16.8.0' @@ -10761,47 +10761,60 @@ packages: window-or-global: 1.0.1 dev: false + /@plasmicapp/host@1.0.185(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Eka3J1gFID3d2E818asFp3PUizG3JQyaFc1y53BmhM0r+OGdlJUvKAof2zPXf6sDHdYJV77OhdBtbgE8ebBMqA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@plasmicapp/query': 0.1.77(react@18.2.0) + csstype: 3.1.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + window-or-global: 1.0.1 + dev: false + /@plasmicapp/isomorphic-unfetch@1.0.3: resolution: {integrity: sha512-cJtPOCf2/FWlFB42Q/n0MK/C47NSZr+YQJbCvQwvyjOrOgOQ4gJ/+gkr4avpMa7UPMa8qLovDAuaR+5k+hMlZQ==} dependencies: unfetch: 4.2.0 dev: false - /@plasmicapp/loader-core@1.0.115: - resolution: {integrity: sha512-Ip/I4kuBFnsOB7DrCTrkhOCfSCGYknDTH83qiWpbQdYwCxWCHUsCtY3P3j9K8U4NYjFgy3OL4d0EkAtOvoBCTw==} + /@plasmicapp/loader-core@1.0.121: + resolution: {integrity: sha512-BOJkCGYNQ8aKXSdHA7+SKTq0BfsIjdB86Xwi9ugEqwh/9PFGXdadlM758Pwo62FL2h4kkelkUqPBsOnYJvgBTA==} engines: {node: '>=10'} dependencies: '@plasmicapp/isomorphic-unfetch': 1.0.3 - '@plasmicapp/loader-fetcher': 1.0.37 + '@plasmicapp/loader-fetcher': 1.0.43 dev: false - /@plasmicapp/loader-edge@1.0.46: - resolution: {integrity: sha512-r3PA6ARF3EDWma5kwHOgPu/meed7hkKnkDp2aUWiHQKe7X0eRDWXpId/+2uYVzh8p1sjIxiINK6P9Bv1jVuXrQ==} + /@plasmicapp/loader-edge@1.0.52: + resolution: {integrity: sha512-YqC6zNIcgScNOE+cDrhR+9gPsUtEsgNVwnIMw+Z5Xmj8TeHQDIQOEKwOX8dzlXgrb6ahycqwdk4vkbww1j56nA==} engines: {node: '>=10'} dependencies: - '@plasmicapp/loader-splits': 1.0.43 + '@plasmicapp/loader-splits': 1.0.49 dev: false - /@plasmicapp/loader-fetcher@1.0.37: - resolution: {integrity: sha512-yLrOGklV8FNeyNteumzuE99zvPVGvNTT7TuLQISMvCkisY+pg4NY6gDxSUvDut65waBH0ie/ZdG6jUtkqb0kBg==} + /@plasmicapp/loader-fetcher@1.0.43: + resolution: {integrity: sha512-WKirusqEdRcCBwqdDaAYtfpQ3Qy6wnf/T5jyr5N0mmiTXTmTLSkTMjq/zCyAiOr+u2bWauHRF3GUs2H9Bd/6nw==} engines: {node: '>=10'} dependencies: '@plasmicapp/isomorphic-unfetch': 1.0.3 dev: false - /@plasmicapp/loader-nextjs@1.0.333(next@14.0.3)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Uhkeeig9UhZQqLgH5QPuV3bd1jE4Z5ZsJgvoxmsL96XrGEuxEO2wUPLq02HQ+EgJtXuNTgbb5bSPZsVCJ/nCKQ==} + /@plasmicapp/loader-nextjs@1.0.345(next@13.5.6)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-50CGunxpvkApK4o805EOKZbN0YLasHybH0hzkDtyQ9AcDi0MuhzSpZQ0MM4zSX4vVo+6uBJ/YfcTQ4Kriw25yQ==} engines: {node: '>=10'} peerDependencies: next: '>=10.1.0' react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@plasmicapp/loader-core': 1.0.115 - '@plasmicapp/loader-edge': 1.0.46 - '@plasmicapp/loader-react': 1.0.312(react-dom@18.2.0)(react@18.2.0) - '@plasmicapp/watcher': 1.0.78 - next: 14.0.3(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@plasmicapp/loader-core': 1.0.121 + '@plasmicapp/loader-edge': 1.0.52 + '@plasmicapp/loader-react': 1.0.324(react-dom@18.2.0)(react@18.2.0) + '@plasmicapp/watcher': 1.0.81 + next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) server-only: 0.0.1 @@ -10811,40 +10824,41 @@ packages: - utf-8-validate dev: false - /@plasmicapp/loader-react@1.0.312(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nUu9TJrlu5/innWFTz1rvJx4NQgm/yLNZwK27cbLufQCYzec4FBdGEr4Ywr7IMHb4OHTzJOJG3ZsEDmFjTeJ3Q==} + /@plasmicapp/loader-react@1.0.324(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wikljq+9lTdKnRw53FRyc0Qj/sJCOZl+wBQvcGFisOWYqEYsIQVPYzBKKy6bcr+ZpTbUHlVQzkG4K3zErquzBg==} engines: {node: '>=12'} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@plasmicapp/data-sources-context': 0.1.17(react@18.2.0) - '@plasmicapp/host': 1.0.177(react-dom@18.2.0)(react@18.2.0) - '@plasmicapp/loader-core': 1.0.115 - '@plasmicapp/loader-splits': 1.0.43 - '@plasmicapp/prepass': 1.0.9(react-dom@18.2.0)(react@18.2.0) - '@plasmicapp/query': 0.1.74(react@18.2.0) + '@plasmicapp/data-sources-context': 0.1.20(react@18.2.0) + '@plasmicapp/host': 1.0.185(react-dom@18.2.0)(react@18.2.0) + '@plasmicapp/loader-core': 1.0.121 + '@plasmicapp/loader-fetcher': 1.0.43 + '@plasmicapp/loader-splits': 1.0.49 + '@plasmicapp/prepass': 1.0.13(react-dom@18.2.0)(react@18.2.0) + '@plasmicapp/query': 0.1.77(react@18.2.0) pascalcase: 1.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) server-only: 0.0.1 dev: false - /@plasmicapp/loader-splits@1.0.43: - resolution: {integrity: sha512-XdSiD/N9ddD/HTjsk6EUhU0SSLFzQl0G4vlapdcHIBI9vBZRLAJQLGPIS98OJJnEK3DsE7j4kMYzKevoE/bycQ==} + /@plasmicapp/loader-splits@1.0.49: + resolution: {integrity: sha512-1L+1esk/hHBEOJo5d18aPUZwoYZEO+X6z/hx9s5I1/MdKeTXj60k++fhVr6D7j6tToofaMDO30oWyXSy9HvYRQ==} engines: {node: '>=10'} dependencies: json-logic-js: 2.0.2 dev: false - /@plasmicapp/prepass@1.0.9(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-0iG7iCD/Kf0I1Qaxw/steVPm3p2ciBPeA8Xa4i/E34gEat5qRsGl6cMi4V2EaPLWOF4cL6B+PEdtHCmZBscOGw==} + /@plasmicapp/prepass@1.0.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Kh9lwlzQnOzKtHnDtzeSiupDvEYU9T6kq+XOQZ0+OR+r+IT60T1CMmFFWQP8ae/Z+m66U6ttonQrlw4vSP0rgw==} engines: {node: '>=12'} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@plasmicapp/query': 0.1.74(react@18.2.0) + '@plasmicapp/query': 0.1.77(react@18.2.0) '@plasmicapp/react-ssr-prepass': 2.0.3(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -10860,6 +10874,16 @@ packages: swr: 1.3.0(react@18.2.0) dev: false + /@plasmicapp/query@0.1.77(react@18.2.0): + resolution: {integrity: sha512-46yTL/y1ys9erE5yDKAX7x/VSq16gNYxpAGm1HF+h0TrFoWyctvFEFsZdAGkrcqPgrp5AYHW71khYkMD1ES/5A==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + swr: 1.3.0(react@18.2.0) + dev: false + /@plasmicapp/react-ssr-prepass@2.0.3(react@18.2.0): resolution: {integrity: sha512-jFde/wfL8NlJEr76Mshyju/3GvJD5Z9YijCG1/8DR+KOEv7m5uRvORjxtEEw2GKDXRp2GqpQqj97iWGLFUsOzA==} peerDependencies: @@ -10868,8 +10892,8 @@ packages: react: 18.2.0 dev: false - /@plasmicapp/watcher@1.0.78: - resolution: {integrity: sha512-YvBtGMkI6pvqgagwP72Rr5btZ3iJsIOyInH7XsT3vDopWaQfrEm2oB4sVwxUxnsxnUZPniH/LHCwn4QJsPmdfQ==} + /@plasmicapp/watcher@1.0.81: + resolution: {integrity: sha512-rkPHPFyafxoFZm/klub2mCo0pRIIjr24shuO6/LTjPwncz3w5XxrJ4Rv/H9F+paV0+wjo43t0tBYmUmu82yRjg==} engines: {node: '>=10'} dependencies: socket.io-client: 4.7.2 @@ -11690,7 +11714,7 @@ packages: '@sentry/types': 5.30.0 tslib: 1.14.1 - /@sentry/nextjs@7.75.1(next@14.0.3)(react@18.2.0)(webpack@5.89.0): + /@sentry/nextjs@7.75.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0): resolution: {integrity: sha512-5DEW6Ksjuox8idf3O0NclF/rHSS0Z1VCIoFHW6d28FHFKU+/RkFwJTB13KfpQMBj1fiA9qSNJdy/2QlGUWVRmA==} engines: {node: '>=8'} peerDependencies: @@ -11711,7 +11735,7 @@ packages: '@sentry/vercel-edge': 7.75.1 '@sentry/webpack-plugin': 1.20.0 chalk: 3.0.0 - next: 14.0.3(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 resolve: 1.22.8 rollup: 2.78.0 @@ -27652,9 +27676,9 @@ packages: /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - /next@14.0.3(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-AbYdRNfImBr3XGtvnwOxq8ekVCwbFTv/UJoLwmaX89nk9i051AEY4/HAWzU0YpaTDw8IofUpmuIlvzWF13jxIw==} - engines: {node: '>=18.17.0'} + /next@13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==} + engines: {node: '>=16.14.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -27667,7 +27691,7 @@ packages: sass: optional: true dependencies: - '@next/env': 14.0.3 + '@next/env': 13.5.6 '@swc/helpers': 0.5.2 busboy: 1.6.0 caniuse-lite: 1.0.30001554 @@ -27677,15 +27701,15 @@ packages: styled-jsx: 5.1.1(@babel/core@7.23.2)(react@18.2.0) watchpack: 2.4.0 optionalDependencies: - '@next/swc-darwin-arm64': 14.0.3 - '@next/swc-darwin-x64': 14.0.3 - '@next/swc-linux-arm64-gnu': 14.0.3 - '@next/swc-linux-arm64-musl': 14.0.3 - '@next/swc-linux-x64-gnu': 14.0.3 - '@next/swc-linux-x64-musl': 14.0.3 - '@next/swc-win32-arm64-msvc': 14.0.3 - '@next/swc-win32-ia32-msvc': 14.0.3 - '@next/swc-win32-x64-msvc': 14.0.3 + '@next/swc-darwin-arm64': 13.5.6 + '@next/swc-darwin-x64': 13.5.6 + '@next/swc-linux-arm64-gnu': 13.5.6 + '@next/swc-linux-arm64-musl': 13.5.6 + '@next/swc-linux-x64-gnu': 13.5.6 + '@next/swc-linux-x64-musl': 13.5.6 + '@next/swc-win32-arm64-msvc': 13.5.6 + '@next/swc-win32-ia32-msvc': 13.5.6 + '@next/swc-win32-x64-msvc': 13.5.6 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros From 31ac54c9a1659e1f5e065c97d925a75a4289fd3d Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Fri, 1 Dec 2023 10:35:13 +0100 Subject: [PATCH 027/118] add placeholder for transfer fraction button (#1201) * add placeholder for transfer fraction button * remove unnecessary logic from transfer-fraction-button.tsx --- .../components/transfer-fraction-button.tsx | 30 +++++++++++++++++++ frontend/plasmic-init.ts | 17 +++++++++++ 2 files changed, 47 insertions(+) create mode 100644 frontend/components/transfer-fraction-button.tsx diff --git a/frontend/components/transfer-fraction-button.tsx b/frontend/components/transfer-fraction-button.tsx new file mode 100644 index 00000000..c8ea4ee5 --- /dev/null +++ b/frontend/components/transfer-fraction-button.tsx @@ -0,0 +1,30 @@ +import { Button } from "@mui/material"; +import React from "react"; + +interface Props { + fractionId: string; + text?: string; + disabled?: boolean; + className?: string; +} +export function TransferFractionButton({ + fractionId, + text, + className, + disabled, +}: Props) { + return ( + + ); +} diff --git a/frontend/plasmic-init.ts b/frontend/plasmic-init.ts index bcd4bac1..20839d9e 100644 --- a/frontend/plasmic-init.ts +++ b/frontend/plasmic-init.ts @@ -32,6 +32,7 @@ import "primereact/resources/primereact.min.css"; import "primereact/resources/themes/tailwind-light/theme.css"; import { MergeAllClaimFractionsButton } from "./components/merge-all-claim-fractions-button"; import { SplitFractionButton } from "./components/split-fraction-button"; +import { TransferFractionButton } from "./components/transfer-fraction-button"; export const PLASMIC = initPlasmicLoader({ projects: [ @@ -673,6 +674,22 @@ PLASMIC.registerComponent(ProjectsClientProvider, { }, }); +PLASMIC.registerComponent(TransferFractionButton, { + name: "TransferFractionButton", + description: "Button that will transfer the fraction currently selected", + props: { + text: { + type: "string", + defaultValue: "Transfer", + helpText: "Text to display on button", + }, + fractionId: "string", + disabled: "boolean", + className: "string", + }, + importPath: "./components/transfer-fraction-button", +}); + PLASMIC.registerComponent(MergeAllClaimFractionsButton, { name: "MergeAllClaimFractionsButton", description: From 5c9408834874ef4a0af20b94fdfb3c3a39767cff Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Fri, 1 Dec 2023 11:35:52 +0100 Subject: [PATCH 028/118] change next build back to next export (#1202) remove unnecessary logic from transfer-fraction-button.tsx --- frontend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index 8c44c84b..1d944407 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,7 +7,7 @@ "start": "serve out", "deploy": "pnpm export && pnpm sentry:sourcemaps", "dev": "next", - "export": "export SENTRY_RELEASE=`sentry-cli releases propose-version` && next build", + "export": "export SENTRY_RELEASE=`sentry-cli releases propose-version` && next export", "lint": "tsc -v && tsc --noEmit && next lint", "lint:eslint": "eslint --ignore-path ../.gitignore --ignore-path .gitignore --ignore-path --max-warnings 0 .", "lint:prettier": "prettier --ignore-path ../.gitignore --ignore-path .gitignore --loglevel warn --check **/*.{js,jsx,ts,tsx,sol,md,json}", From 6ef5b400349236d42438d0181b473f340a4ba5ce Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Fri, 1 Dec 2023 16:05:12 +0100 Subject: [PATCH 029/118] Feature/transfer fraction button (#1203) * add transfer fraction button inside split fraction button * add confirmation dialog when transferring fraction * use override chain id in hypercert fetcher within plasmic * add reading of transfer restrictions to transfer fraction button --- frontend/components/hypercert-fetcher.tsx | 6 +- frontend/components/split-fraction-button.tsx | 2 + .../components/transfer-fraction-button.tsx | 243 +++++++++++++++++- frontend/hooks/fractions.ts | 28 ++ frontend/hooks/hypercerts-client.ts | 11 +- frontend/hooks/readTransferRestriction.ts | 28 ++ frontend/hooks/transferFraction.ts | 102 ++++++++ 7 files changed, 402 insertions(+), 18 deletions(-) create mode 100644 frontend/hooks/readTransferRestriction.ts create mode 100644 frontend/hooks/transferFraction.ts diff --git a/frontend/components/hypercert-fetcher.tsx b/frontend/components/hypercert-fetcher.tsx index e826df7f..78f0da03 100644 --- a/frontend/components/hypercert-fetcher.tsx +++ b/frontend/components/hypercert-fetcher.tsx @@ -28,6 +28,7 @@ export interface HypercertFetcherProps { useQueryString?: boolean; // Forces us to try the query string first byClaimId?: string; // Fetch by claimId byMetadataUri?: string; // Fetch by metadataUri; If both are specified, byMetadataUri will override the URI in the claim + overrideChainId?: number; // Override the chainId } export function HypercertFetcher(props: HypercertFetcherProps) { @@ -40,9 +41,12 @@ export function HypercertFetcher(props: HypercertFetcherProps) { useQueryString, byClaimId, byMetadataUri, + overrideChainId, } = props; const [data, setData] = React.useState(); - const { client } = useHypercertClient(); + const { client } = useHypercertClient({ + overrideChainId, + }); React.useEffect(() => { if (!client) { diff --git a/frontend/components/split-fraction-button.tsx b/frontend/components/split-fraction-button.tsx index c6321870..8b3dae23 100644 --- a/frontend/components/split-fraction-button.tsx +++ b/frontend/components/split-fraction-button.tsx @@ -6,6 +6,7 @@ import { PlusIcon } from "primereact/icons/plus"; import { Delete } from "@mui/icons-material"; import { useSplitFractionUnits } from "../hooks/splitClaimUnits"; import { toast } from "react-toastify"; +import { TransferFractionButton } from "./transfer-fraction-button"; const style = { position: "absolute", @@ -183,6 +184,7 @@ export function SplitFractionButton({ + ); } diff --git a/frontend/components/transfer-fraction-button.tsx b/frontend/components/transfer-fraction-button.tsx index c8ea4ee5..4235837b 100644 --- a/frontend/components/transfer-fraction-button.tsx +++ b/frontend/components/transfer-fraction-button.tsx @@ -1,5 +1,39 @@ -import { Button } from "@mui/material"; -import React from "react"; +import { + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + IconButton, + Modal, + TextField, + Typography, +} from "@mui/material"; +import { Send } from "@mui/icons-material"; +import React, { useState } from "react"; +import { useTransferFraction } from "../hooks/transferFraction"; +import { Form, Formik } from "formik"; +import { isAddress } from "viem"; +import { useClaimById, useFractionById } from "../hooks/fractions"; +import { useAccountLowerCase } from "../hooks/account"; +import { formatAddress } from "../lib/formatting"; +import { TransferRestrictions } from "@hypercerts-org/sdk"; +import { useReadTransferRestrictions } from "../hooks/readTransferRestriction"; + +const style = { + position: "absolute", + top: "50%", + left: "50%", + transform: "translate(-50%, -50%)", + width: 400, + bgcolor: "background.paper", + boxShadow: 24, + pt: 2, + px: 4, + pb: 3, +}; interface Props { fractionId: string; @@ -13,18 +47,199 @@ export function TransferFractionButton({ className, disabled, }: Props) { + const [open, setOpen] = useState(false); + const handleOpen = () => setOpen(true); + const handleClose = () => setOpen(false); + const { address } = useAccountLowerCase(); + + const { write, readOnly, txPending } = useTransferFraction({ + onComplete: () => { + handleClose(); + }, + }); + + const [dialogOpen, setDialogOpen] = React.useState(false); + + const handleDialogOpen = () => { + setDialogOpen(true); + }; + + const handleDialogClose = () => { + setDialogOpen(false); + }; + + const { data: fractionData, isLoading: isLoadingFraction } = + useFractionById(fractionId); + + const { data: claim, isLoading: isLoadingClaim } = useClaimById( + fractionData?.claimToken?.claim.id, + ); + + const { + data: transferRestrictions, + isLoading: isLoadingTransferRestrictions, + } = useReadTransferRestrictions(claim?.claim?.tokenID); + + const determineCanTransfer = () => { + if (!address) { + return false; + } + + if (!transferRestrictions) { + return false; + } + + if (!(transferRestrictions in TransferRestrictions)) { + return false; + } + + const transferRestrictionValue = + TransferRestrictions[ + transferRestrictions as keyof typeof TransferRestrictions + ]; + + if (transferRestrictionValue === TransferRestrictions.DisallowAll) { + return false; + } + + if (transferRestrictionValue === TransferRestrictions.AllowAll) { + return true; + } + + if (transferRestrictionValue === TransferRestrictions.FromCreatorOnly) { + return claim?.claim?.creator === address; + } + + return false; + }; + + const canTransfer = determineCanTransfer(); + + const tokenId = fractionId.split("-")[1]; + const _disabled = + txPending || + readOnly || + disabled || + isLoadingFraction || + isLoadingClaim || + isLoadingTransferRestrictions; + + if (!canTransfer) { + return null; + } + return ( - + <> + { + console.log({ + fractionId, + text, + className, + disabled, + }); + handleOpen(); + }} + > + + + + + { + if (!values.to || values.to === "") { + return { to: "Required" }; + } + + if (!isAddress(values.to)) { + return { to: "Invalid address" }; + } + }} + onSubmit={() => { + handleDialogOpen(); + }} + > + {({ isSubmitting, isValid, setFieldValue, errors, values }) => { + const isDisabled = _disabled || isSubmitting; + return ( + <> +
+ + Transfer this fraction + + { + setFieldValue("to", e.target.value); + }} + /> + + {" "} + + + Are you sure you want to transfer? + + + + Transferring to {formatAddress(values.to)}. This action + cannot be reversed. + + + + + + + + + ); + }} +
+
+
+ ); } diff --git a/frontend/hooks/fractions.ts b/frontend/hooks/fractions.ts index 66b20dde..5103e39b 100644 --- a/frontend/hooks/fractions.ts +++ b/frontend/hooks/fractions.ts @@ -39,3 +39,31 @@ export const useFractionById = (fractionId: string) => { { enabled: !!fractionId }, ); }; + +export const useClaimById = (claimId?: string | null) => { + const { client } = useHypercertClient(); + + return useQuery( + ["graph", "claims", claimId], + () => { + if (!client) return null; + if (!claimId) return null; + return client.indexer.claimById(claimId); + }, + { enabled: !!claimId && !!client }, + ); +}; + +export const useClaimMetadataByUri = (uri?: string | null) => { + const { client } = useHypercertClient(); + + return useQuery( + ["graph", "claim-metadata", uri], + () => { + if (!client) return null; + if (!uri) return null; + return client.storage.getMetadata(uri); + }, + { enabled: !!uri && !!client }, + ); +}; diff --git a/frontend/hooks/hypercerts-client.ts b/frontend/hooks/hypercerts-client.ts index 727b6747..2defcd2c 100644 --- a/frontend/hooks/hypercerts-client.ts +++ b/frontend/hooks/hypercerts-client.ts @@ -4,7 +4,11 @@ import { NFT_STORAGE_TOKEN, WEB3_STORAGE_TOKEN } from "../lib/config"; import { HypercertClient, HypercertClientConfig } from "@hypercerts-org/sdk"; import { useWalletClient, useNetwork } from "wagmi"; -export const useHypercertClient = () => { +export const useHypercertClient = ({ + overrideChainId, +}: { + overrideChainId?: number; +} = {}) => { const { chain } = useNetwork(); const clientConfig = { chain, @@ -26,13 +30,14 @@ export const useHypercertClient = () => { } = useWalletClient(); useEffect(() => { - if (chain?.id && !walletClientLoading && !isError && walletClient) { + const chainId = overrideChainId || chain?.id; + if (chainId && !walletClientLoading && !isError && walletClient) { setIsLoading(true); try { const config: Partial = { ...clientConfig, - chain: { id: chain.id }, + chain: { id: chainId }, walletClient, }; diff --git a/frontend/hooks/readTransferRestriction.ts b/frontend/hooks/readTransferRestriction.ts new file mode 100644 index 00000000..8133140c --- /dev/null +++ b/frontend/hooks/readTransferRestriction.ts @@ -0,0 +1,28 @@ +import { useHypercertClient } from "./hypercerts-client"; +import { useWalletClient } from "wagmi"; +import { useQuery } from "@tanstack/react-query"; +import { readContract } from "viem/actions"; + +export const useReadTransferRestrictions = (tokenId?: bigint) => { + const { client } = useHypercertClient(); + const { data: walletClient } = useWalletClient(); + + return useQuery( + ["read-transfer-restrictions", tokenId], + async () => { + if (!client) return null; + if (!tokenId) return null; + if (!walletClient) return null; + const contract = client.contract; + + if (!contract) return null; + + return (await readContract(walletClient, { + ...contract, + functionName: "readTransferRestriction", + args: [tokenId], + })) as string; + }, + { enabled: !!tokenId && !!client }, + ); +}; diff --git a/frontend/hooks/transferFraction.ts b/frontend/hooks/transferFraction.ts new file mode 100644 index 00000000..e8d1509a --- /dev/null +++ b/frontend/hooks/transferFraction.ts @@ -0,0 +1,102 @@ +import { useContractModal } from "../components/contract-interaction-dialog-context"; +import { useParseBlockchainError } from "../lib/parse-blockchain-error"; +import { toast } from "react-toastify"; +import { useHypercertClient } from "./hypercerts-client"; +import { useState } from "react"; +import { waitForTransactionReceipt, writeContract } from "viem/actions"; +import { useAccount, useWalletClient } from "wagmi"; + +export const useTransferFraction = ({ + onComplete, +}: { + onComplete?: () => void; +}) => { + const [txPending, setTxPending] = useState(false); + + const { client, isLoading } = useHypercertClient(); + const { data: walletClient } = useWalletClient(); + const { address } = useAccount(); + + const stepDescriptions = { + transferring: "Transferring", + waiting: "Awaiting confirmation", + complete: "Done splitting", + }; + + const { setStep, showModal, hideModal } = useContractModal(); + const parseError = useParseBlockchainError(); + + const initializeWrite = async (fractionId: bigint, to: string) => { + if (!client) { + toast("No client found", { + type: "error", + }); + return; + } + + if (!walletClient) { + toast("No wallet client found", { + type: "error", + }); + return; + } + + if (!address) { + toast("No address found", { + type: "error", + }); + return; + } + + const hypercertMinterContract = client.contract; + + showModal({ stepDescriptions }); + setStep("transferring"); + try { + setTxPending(true); + const tx = await writeContract(walletClient, { + ...hypercertMinterContract, + functionName: "safeTransferFrom", + args: [address, to, fractionId, 1, ""], + }); + setStep("waiting"); + const receipt = await waitForTransactionReceipt(walletClient, { + hash: tx, + }); + + if (receipt?.status === "reverted") { + toast("Splitting failed", { + type: "error", + }); + console.error(receipt); + } + if (receipt?.status === "success") { + toast("Fraction successfully sent", { type: "success" }); + + setStep("complete"); + onComplete?.(); + } + } catch (error) { + toast(parseError(error, "Fraction could not be sent"), { + type: "error", + }); + console.error(error); + } finally { + hideModal(); + setTxPending(false); + } + }; + + return { + write: async (id: bigint, to: string) => { + try { + await initializeWrite(id, to); + window.location.reload(); + } catch (e) { + console.error(e); + } + }, + txPending, + readOnly: isLoading || !client || client.readonly, + }; +}; From 6488e7974e76f8e4c5622f30a1fb8e80695f4b38 Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Fri, 1 Dec 2023 16:21:23 +0100 Subject: [PATCH 030/118] add override chain id functionality for plasmic editing (#1204) --- frontend/plasmic-init.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/plasmic-init.ts b/frontend/plasmic-init.ts index 20839d9e..4e22ee73 100644 --- a/frontend/plasmic-init.ts +++ b/frontend/plasmic-init.ts @@ -183,6 +183,12 @@ PLASMIC.registerComponent(HypercertFetcher, { name: "HypercertFetcher", description: "Client-side fetch metadata from IPFS", props: { + overrideChainId: { + type: "number", + helpText: "Override chainId", + editOnly: true, + defaultValue: 5, + }, variableName: { type: "string", helpText: "Name to use in Plasmic data picker", From a6025676c740cad3b01c98fdd450ebc395150218 Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Fri, 1 Dec 2023 16:38:19 +0100 Subject: [PATCH 031/118] Bugfix/add override chain id for plasmit editing (#1205) * add override chain id functionality for plasmic editing * add override chain id to effect dependencies --- frontend/hooks/hypercerts-client.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/hooks/hypercerts-client.ts b/frontend/hooks/hypercerts-client.ts index 2defcd2c..4ca52dda 100644 --- a/frontend/hooks/hypercerts-client.ts +++ b/frontend/hooks/hypercerts-client.ts @@ -11,7 +11,7 @@ export const useHypercertClient = ({ } = {}) => { const { chain } = useNetwork(); const clientConfig = { - chain, + chain: overrideChainId ? { id: overrideChainId } : chain, nftStorageToken: NFT_STORAGE_TOKEN, web3StorageToken: WEB3_STORAGE_TOKEN, }; @@ -49,7 +49,7 @@ export const useHypercertClient = ({ } setIsLoading(false); - }, [chain?.id, walletClient, walletClientLoading]); + }, [chain?.id, overrideChainId, walletClient, walletClientLoading]); return { client, isLoading }; }; From 2406b962836f27b655fac6a075f00f10f0c2148d Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Fri, 1 Dec 2023 16:58:09 +0100 Subject: [PATCH 032/118] remove transfer fraction button from split fraction button (#1206) --- frontend/components/split-fraction-button.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/components/split-fraction-button.tsx b/frontend/components/split-fraction-button.tsx index 8b3dae23..c6321870 100644 --- a/frontend/components/split-fraction-button.tsx +++ b/frontend/components/split-fraction-button.tsx @@ -6,7 +6,6 @@ import { PlusIcon } from "primereact/icons/plus"; import { Delete } from "@mui/icons-material"; import { useSplitFractionUnits } from "../hooks/splitClaimUnits"; import { toast } from "react-toastify"; -import { TransferFractionButton } from "./transfer-fraction-button"; const style = { position: "absolute", @@ -184,7 +183,6 @@ export function SplitFractionButton({ - ); } From 6a93ec8b7cebcf29799645da3ea04af552fd4651 Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Fri, 1 Dec 2023 17:18:26 +0100 Subject: [PATCH 033/118] Bugfix/only show transfer button for fraction owned (#1207) * only show transfer button for fractions owned * only show transfer button for fractions owned --- frontend/components/transfer-fraction-button.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/components/transfer-fraction-button.tsx b/frontend/components/transfer-fraction-button.tsx index 4235837b..12d0dfdf 100644 --- a/frontend/components/transfer-fraction-button.tsx +++ b/frontend/components/transfer-fraction-button.tsx @@ -89,6 +89,10 @@ export function TransferFractionButton({ return false; } + if (!(fractionData?.claimToken?.owner === address)) { + return false; + } + if (!(transferRestrictions in TransferRestrictions)) { return false; } From f36b963c254b5c0710b02e07d2a485179c92e733 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Sat, 2 Dec 2023 02:22:22 +0100 Subject: [PATCH 034/118] Feat/more robust split transfer logic with hc strategy (#1208) * feat(hc): split NFT HC flow * feat(hc): hypercert order routing and validation * fix(e2e): disable faulty E2E tests --- .github/workflows/e2e-tests.yml | 10 - .../src/marketplace/LooksRareProtocol.sol | 78 ++++--- contracts/src/marketplace/TransferManager.sol | 23 +- .../src/marketplace/TransferSelectorNFT.sol | 25 ++- .../marketplace/errors/HypercertErrors.sol | 10 + .../src/marketplace/errors/SharedErrors.sol | 2 +- .../StrategyHypercertFractionOffer.sol | 84 +++++--- .../libraries/LowLevelHypercertCaller.sol | 11 +- .../HypercertFractionOffers.t.sol | 201 +++++++++++++++++- 9 files changed, 341 insertions(+), 103 deletions(-) create mode 100644 contracts/src/marketplace/errors/HypercertErrors.sol diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 1337bfe4..8a81eda9 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -13,16 +13,6 @@ env: # Trigger the workflow when: on: - push: - branches: - - main - - develop - # Or when a pull request event occurs for a pull request against one of the - # matched branches. - pull_request: - branches: - - main - - develop # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/contracts/src/marketplace/LooksRareProtocol.sol b/contracts/src/marketplace/LooksRareProtocol.sol index 3e1ce7ed..3eb51f1b 100644 --- a/contracts/src/marketplace/LooksRareProtocol.sol +++ b/contracts/src/marketplace/LooksRareProtocol.sol @@ -31,13 +31,13 @@ import { // Direct dependencies import {TransferSelectorNFT} from "./TransferSelectorNFT.sol"; import {BatchOrderTypehashRegistry} from "./BatchOrderTypehashRegistry.sol"; -import {StrategyHypercertFractionOffer} from "./executionStrategies/StrategyHypercertFractionOffer.sol"; // Constants import {MAX_CALLDATA_PROOF_LENGTH, ONE_HUNDRED_PERCENT_IN_BP} from "./constants/NumericConstants.sol"; // Enums import {QuoteType} from "./enums/QuoteType.sol"; +import {CollectionType} from "./enums/CollectionType.sol"; /** * @title LooksRareProtocol @@ -371,7 +371,7 @@ contract LooksRareProtocol is _updateUserOrderNonce(isNonceInvalidated, signer, makerBid.orderNonce, orderHash); // Taker action goes first - _transferNFT(makerBid.collection, makerBid.collectionType, msg.sender, signer, itemIds, amounts); + _executeTakerAskTakerAction(makerBid, takerAsk, msg.sender, signer, itemIds, amounts); // Maker action goes second _transferToAskRecipientAndCreatorIfAny(recipients, feeAmounts, makerBid.currency, signer); @@ -444,32 +444,7 @@ contract LooksRareProtocol is _transferToAskRecipientAndCreatorIfAny(recipients, feeAmounts, makerAsk.currency, sender); // Maker action goes second - if ( - ( - strategyInfo[makerAsk.strategyId].selector - == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector - || strategyInfo[makerAsk.strategyId].selector - == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector - ) && (IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[0]) > amounts[0]) - ) { - _splitNFT( - makerAsk.collection, - makerAsk.collectionType, - signer, - takerBid.recipient == address(0) ? sender : takerBid.recipient, - itemIds, - amounts - ); - } else { - _transferNFT( - makerAsk.collection, - makerAsk.collectionType, - signer, - takerBid.recipient == address(0) ? sender : takerBid.recipient, - itemIds, - amounts - ); - } + _executeTakerBidMakerAction(makerAsk, takerBid, signer, sender, itemIds, amounts); emit TakerBid( NonceInvalidationParameters({ @@ -492,6 +467,53 @@ contract LooksRareProtocol is return feeAmounts[2]; } + function _executeTakerAskTakerAction( + OrderStructs.Maker calldata makerBid, + OrderStructs.Taker calldata takerAsk, + address sender, + address recipient, + uint256[] memory itemIds, + uint256[] memory amounts + ) internal { + if (makerBid.collectionType == CollectionType.Hypercert) { + _transferHypercertFraction( + makerBid.collection, makerBid.collectionType, makerBid.strategyId, sender, recipient, itemIds, amounts + ); + } else { + _transferNFT(makerBid.collection, makerBid.collectionType, sender, recipient, itemIds, amounts); + } + } + + function _executeTakerBidMakerAction( + OrderStructs.Maker calldata makerAsk, + OrderStructs.Taker calldata takerBid, + address sender, + address recipient, + uint256[] memory itemIds, + uint256[] memory amounts + ) internal { + if (makerAsk.collectionType == CollectionType.Hypercert) { + _transferHypercertFraction( + makerAsk.collection, + makerAsk.collectionType, + makerAsk.strategyId, + sender, + takerBid.recipient == address(0) ? recipient : takerBid.recipient, + itemIds, + amounts + ); + } else { + _transferNFT( + makerAsk.collection, + makerAsk.collectionType, + sender, + takerBid.recipient == address(0) ? recipient : takerBid.recipient, + itemIds, + amounts + ); + } + } + /** * @notice This function is internal and is used to pay the protocol fee and affiliate fee (if any). * @param currency Currency address to transfer (address(0) is ETH) diff --git a/contracts/src/marketplace/TransferManager.sol b/contracts/src/marketplace/TransferManager.sol index 697e0f2e..6ace6f93 100644 --- a/contracts/src/marketplace/TransferManager.sol +++ b/contracts/src/marketplace/TransferManager.sol @@ -12,6 +12,7 @@ import {LowLevelHypercertCaller} from "./libraries/LowLevelHypercertCaller.sol"; // Interfaces and errors import {ITransferManager} from "./interfaces/ITransferManager.sol"; import {AmountInvalid, LengthsInvalid} from "./errors/SharedErrors.sol"; +import {UnitAmountInvalid} from "./errors/HypercertErrors.sol"; import {IHypercertToken} from "../protocol/interfaces/IHypercertToken.sol"; // Libraries @@ -30,7 +31,7 @@ import {CollectionType} from "./enums/CollectionType.sol"; * Collection type "3" refers to Hyperboard transfer functions. * @dev "Safe" transfer functions for ERC721 are not implemented since they come with added gas costs * to verify if the recipient is a contract as it requires verifying the receiver interface is valid. - * @author LooksRare protocol team (👀,💎) + * @author LooksRare protocol team (👀,💎); bitbeckers */ contract TransferManager is ITransferManager, @@ -176,13 +177,13 @@ contract TransferManager is } /** - * @notice This function transfers items for a single Hypercert. + * @notice This function splits and transfers a fraction of a hypercert. * @param collection Collection address * @param from Sender address * @param to Recipient address * @param itemIds Array of itemIds * @param amounts Array of amounts - * @dev It does not allow batch transferring if from = msg.sender since native function should be used. + * @dev It does not allow batch transferring. */ function splitItemsHypercert( address collection, @@ -191,8 +192,6 @@ contract TransferManager is uint256[] calldata itemIds, uint256[] calldata amounts ) external { - IHypercertToken hypercert = IHypercertToken(collection); - if (itemIds.length != 1 || amounts.length != 1) { revert LengthsInvalid(); } @@ -202,10 +201,20 @@ contract TransferManager is if (amounts[0] == 0) { revert AmountInvalid(); } + uint256[] memory newAmounts = new uint256[](2); - newAmounts[0] = hypercert.unitsOf(itemIds[0]) - amounts[0]; + + //The new amount is the difference between the total amount and the amount being split. + //This will underflow if the amount being split is greater than the total amount. + newAmounts[0] = IHypercertToken(collection).unitsOf(itemIds[0]) - amounts[0]; newAmounts[1] = amounts[0]; - _executeHypercertSplitFraction(collection, from, to, itemIds[0], newAmounts); + + // If the new amount is 0, then the split is will revert but the whole fraction can be transferred. + if (newAmounts[0] == 0) { + _executeERC1155SafeTransferFrom(collection, from, to, itemIds[0], 1); + } else { + _executeHypercertSplitFraction(collection, to, itemIds[0], newAmounts); + } } /** diff --git a/contracts/src/marketplace/TransferSelectorNFT.sol b/contracts/src/marketplace/TransferSelectorNFT.sol index 55e0956a..347dae97 100644 --- a/contracts/src/marketplace/TransferSelectorNFT.sol +++ b/contracts/src/marketplace/TransferSelectorNFT.sol @@ -5,6 +5,7 @@ pragma solidity ^0.8.17; import {PackableReentrancyGuard} from "@looksrare/contracts-libs/contracts/PackableReentrancyGuard.sol"; import {ExecutionManager} from "./ExecutionManager.sol"; import {TransferManager} from "./TransferManager.sol"; +import {StrategyHypercertFractionOffer} from "./executionStrategies/StrategyHypercertFractionOffer.sol"; // Libraries import {OrderStructs} from "./libraries/OrderStructs.sol"; @@ -12,6 +13,9 @@ import {OrderStructs} from "./libraries/OrderStructs.sol"; // Enums import {CollectionType} from "./enums/CollectionType.sol"; +// Interfaces +import {IHypercertToken} from "../protocol/interfaces/IHypercertToken.sol"; + /** * @title TransferSelectorNFT * @notice This contract handles the logic for transferring non-fungible items. @@ -20,7 +24,7 @@ import {CollectionType} from "./enums/CollectionType.sol"; contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { error UnsupportedCollectionType(); /** - * @notice Transfer manager for ERC721 and ERC1155. + * @notice Transfer manager for ERC721, ERC1155 and Hypercerts. */ TransferManager public immutable transferManager; @@ -58,15 +62,13 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { transferManager.transferItemsERC721(collection, sender, recipient, itemIds, amounts); } else if (collectionType == CollectionType.ERC1155) { transferManager.transferItemsERC1155(collection, sender, recipient, itemIds, amounts); - } else if (collectionType == CollectionType.Hypercert) { - transferManager.transferItemsHypercert(collection, sender, recipient, itemIds, amounts); } else { revert UnsupportedCollectionType(); } } /** - * @notice This function is internal and used to transfer non-fungible tokens. + * @notice This function is internal and used to split a hypercert fraction or execute a transfer of the fraction. * @param collection Collection address * @param collectionType Collection type (e.g. 0 = ERC721, 1 = ERC1155, 2 = Hypercert) * @param sender Sender address @@ -74,9 +76,10 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { * @param itemIds Array of itemIds * @param amounts Array of amounts */ - function _splitNFT( + function _transferHypercertFraction( address collection, CollectionType collectionType, + uint256 strategyId, address sender, address recipient, uint256[] memory itemIds, @@ -85,6 +88,16 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { if (collectionType != CollectionType.Hypercert) { revert UnsupportedCollectionType(); } - transferManager.splitItemsHypercert(collection, sender, recipient, itemIds, amounts); + + if ( + strategyInfo[strategyId].selector + == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector + || strategyInfo[strategyId].selector + == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector + ) { + transferManager.splitItemsHypercert(collection, sender, recipient, itemIds, amounts); + } else { + transferManager.transferItemsHypercert(collection, sender, recipient, itemIds, amounts); + } } } diff --git a/contracts/src/marketplace/errors/HypercertErrors.sol b/contracts/src/marketplace/errors/HypercertErrors.sol new file mode 100644 index 00000000..f71638d6 --- /dev/null +++ b/contracts/src/marketplace/errors/HypercertErrors.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @notice It is returned if the available amount of fraction units is not available + * for the selected type of transaction. + * For instance, a split transaction cannot be executed if the amount of fraction units + * is not higher than the amount of fraction units available. + */ +error UnitAmountInvalid(); diff --git a/contracts/src/marketplace/errors/SharedErrors.sol b/contracts/src/marketplace/errors/SharedErrors.sol index bb123902..9ac87690 100644 --- a/contracts/src/marketplace/errors/SharedErrors.sol +++ b/contracts/src/marketplace/errors/SharedErrors.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.17; /** * @notice It is returned if the amount is invalid. - * For ERC721, any number that is not 1. For ERC1155, if amount is 0. + * For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. */ error AmountInvalid(); diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol index dfef144f..98c1c498 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -14,7 +14,14 @@ import {MerkleProofMemory} from "../libraries/OpenZeppelin/MerkleProofMemory.sol import {QuoteType} from "../enums/QuoteType.sol"; // Shared errors -import {OrderInvalid, FunctionSelectorInvalid, MerkleProofInvalid, QuoteTypeInvalid} from "../errors/SharedErrors.sol"; +import { + AmountInvalid, + LengthsInvalid, + OrderInvalid, + FunctionSelectorInvalid, + MerkleProofInvalid, + QuoteTypeInvalid +} from "../errors/SharedErrors.sol"; // Base strategy contracts import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; @@ -58,37 +65,42 @@ contract StrategyHypercertFractionOffer is BaseStrategy { ) external view - returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) + returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) { - amounts = makerAsk.amounts; itemIds = makerAsk.itemIds; // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary - if (amounts.length != 1 || itemIds.length != 1) { - revert OrderInvalid(); + if (makerAsk.amounts.length != 1 || itemIds.length != 1) { + revert LengthsInvalid(); } - uint256 tokenBalance = IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]); + if (makerAsk.amounts[0] == 0) { + revert AmountInvalid(); + } - //units, amount, proof[] - (uint256 unitAmount, uint256 acceptedTokenAmount) = - abi.decode(takerBid.additionalParameters, (uint256, uint256)); + //units, pricePerUnit + (uint256 unitAmount, uint256 pricePerUnit) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); //minUnitAmount, maxUnitAmount, root (uint256 minUnitAmount, uint256 maxUnitAmount) = abi.decode(makerAsk.additionalParameters, (uint256, uint256)); // A collection order can only be executable for 1 itemId but quantity to fill can vary if ( - makerAsk.amounts.length != 1 || makerAsk.itemIds.length != 1 || minUnitAmount > maxUnitAmount - || unitAmount < minUnitAmount || makerAsk.price > acceptedTokenAmount || makerAsk.price == 0 - || tokenBalance < amounts[0] + minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount < minUnitAmount || unitAmount > maxUnitAmount + || pricePerUnit < makerAsk.price || makerAsk.price == 0 + || IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) < unitAmount ) { revert OrderInvalid(); } - price = acceptedTokenAmount * unitAmount; + uint256[] memory amountsToFill = new uint256[](1); + amountsToFill[0] = unitAmount; + amounts = amountsToFill; - isNonceInvalidated = true; + price = unitAmount * pricePerUnit; + // If the amount to fill is equal to the amount of units in the hypercert, we transfer the fraction. + // Otherwise, we do not invalidate the nonce because it is a partial fill. + isNonceInvalidated = IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) == unitAmount; } /** @@ -105,42 +117,46 @@ contract StrategyHypercertFractionOffer is BaseStrategy { OrderStructs.Maker calldata makerAsk ) external - pure + view returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) { itemIds = makerAsk.itemIds; // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary if (makerAsk.amounts.length != 1 || itemIds.length != 1) { - revert OrderInvalid(); + revert LengthsInvalid(); } - //units, amount, proof[] + if (makerAsk.amounts[0] == 0) { + revert AmountInvalid(); + } + + //units, pricePerUnit, proof[] (uint256 unitAmount, uint256 pricePerUnit, bytes32[] memory proof) = abi.decode(takerBid.additionalParameters, (uint256, uint256, bytes32[])); - // A bid needs to at least match the minimum price per unit - if (pricePerUnit < makerAsk.price) { - revert OrderInvalid(); - } - - price = unitAmount * pricePerUnit; - amounts = new uint256[](1); - amounts[0] = unitAmount; + //minUnitAmount, maxUnitAmount, root + (uint256 minUnitAmount, uint256 maxUnitAmount, bytes32 root) = + abi.decode(makerAsk.additionalParameters, (uint256, uint256, bytes32)); - // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary - if (amounts.length != 1 || itemIds.length != 1) { + // A collection order can only be executable for 1 itemId but quantity to fill can vary + if ( + minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount < minUnitAmount || unitAmount > maxUnitAmount + || pricePerUnit < makerAsk.price || makerAsk.price == 0 + || IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) < unitAmount + ) { revert OrderInvalid(); } - //minUnitAmount, maxUnitAmount, root - (uint256 minUnitAmount, uint256 maxUnitAmount, bytes32 root) = - abi.decode(makerAsk.additionalParameters, (uint256, uint256, bytes32)); + uint256[] memory amountsToFill = new uint256[](1); + amountsToFill[0] = unitAmount; + amounts = amountsToFill; + + price = unitAmount * pricePerUnit; - // Nonce is not invalidated because it can be a partial fill - // @dev This strategy represents a partial fill. The protocol will call transfer if the bid would clear the - // offered fraction. - isNonceInvalidated = false; + // If the amount to fill is equal to the amount of units in the hypercert, we transfer the fraction. + // Otherwise, we do not invalidate the nonce because it is a partial fill. + isNonceInvalidated = IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) == unitAmount; bytes32 node = keccak256(abi.encodePacked(takerBid.recipient)); diff --git a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol index a48df879..cd79e160 100644 --- a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol +++ b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol @@ -16,19 +16,14 @@ contract LowLevelHypercertCaller { /** * @notice Execute Hypercert splitFraction * @param collection Address of the collection - * @param from Address of the sender * @param to Address of the recipient * @param tokenId tokenId to transfer * @param amounts split distribution */ - function _executeHypercertSplitFraction( - address collection, - address from, - address to, - uint256 tokenId, - uint256[] memory amounts - ) internal { + function _executeHypercertSplitFraction(address collection, address to, uint256 tokenId, uint256[] memory amounts) + internal + { if (collection.code.length == 0) { revert NotAContract(); } diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol index f8bbf0ee..c04a128a 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol @@ -10,6 +10,7 @@ import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; // Shared errors import { AmountInvalid, + LengthsInvalid, OrderInvalid, FunctionSelectorInvalid, MerkleProofInvalid, @@ -136,7 +137,7 @@ contract HypercertFractionOffersTest is ProtocolBase { _assertOrderIsInvalid(makerAsk, false); _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); - vm.expectRevert(OrderInvalid.selector); + vm.expectRevert(LengthsInvalid.selector); looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); // // With proof @@ -146,7 +147,7 @@ contract HypercertFractionOffersTest is ProtocolBase { _assertOrderIsInvalid(makerAsk, true); _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); - vm.expectRevert(OrderInvalid.selector); + vm.expectRevert(LengthsInvalid.selector); looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } @@ -170,20 +171,178 @@ contract HypercertFractionOffersTest is ProtocolBase { looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } + /** + * A collection offer without merkle tree criteria + */ + + function testTakerBidHypercertFractionOrderPartialFill() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerBid(makerAsk, takerBid, (1 << 128) + 1); + } + + function testTakerBidHypercertFractionOrderFullFill() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000); + takerBid.additionalParameters = abi.encode(10_000, price); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerBidFullFraction(makerAsk, takerBid, (1 << 128) + 1); + } + + function testTakerBidHypercertFractionOrderPartialAndFullFill() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.amounts[0] = 10_000; + makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000); + + takerBid.additionalParameters = abi.encode(3000, price); + + uint256 fractionId = (1 << 128) + 1; + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction partial fill; buy 3000 units + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerBid(makerAsk, takerBid, fractionId); + + makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000); + takerBid.additionalParameters = abi.encode(7000, price); + + // Execute taker ask transaction full fill; buy remaining 7000 units + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + //units, amount, currency, proof[] + (uint256 unitAmount, uint256 bidPrice) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); + + // Taker user has received the asset + assertEq(mockHypercertMinter.ownerOf(fractionId), takerUser); + + // Units have been transfered + assertEq(mockHypercertMinter.unitsOf(fractionId), unitAmount); + + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + function testTakerBidHypercertFractionOrderUnitsOutOfMaxRange() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.additionalParameters = abi.encode(minUnitAmount, 100); + takerBid.additionalParameters = abi.encode(101, price); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerBidHypercertFractionOrderUnitsOutOfMinRange() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.additionalParameters = abi.encode(5, 100); + takerBid.additionalParameters = abi.encode(2, price); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerBidHypercertFractionOrderBidPriceTooLow() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount); + takerBid.additionalParameters = abi.encode(maxUnitAmount, price - 1); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + /** * A collection offer with merkle tree criteria */ /** * TAKER ALLOWLIST */ - function testTakerBidCollectionOrderWithMerkleTreeHypercertAccountAllowlist() public { + function testTakerBidHypercertFractionOrderWithMerkleTreeHypercertAccountAllowlist() public { _setUpUsers(); (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(false); address accountInMerkleTree = takerUser; - uint256 tokenIdInMerkleTree = 2; (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ owner: makerUser, numberOfAccountsInMerkleTree: 5, @@ -218,7 +377,6 @@ contract HypercertFractionOffersTest is ProtocolBase { _createMakerAskAndTakerBidHypercert(false); address accountInMerkleTree = takerUser; - uint256 tokenIdInMerkleTree = 2; (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ owner: makerUser, numberOfAccountsInMerkleTree: 5, @@ -266,7 +424,6 @@ contract HypercertFractionOffersTest is ProtocolBase { // 2. Amount is 0 (with merkle proof) makerAsk.strategyId = 2; address accountInMerkleTree = takerUser; - uint256 tokenIdInMerkleTree = 2; (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ owner: makerUser, numberOfAccountsInMerkleTree: 5, @@ -397,7 +554,7 @@ contract HypercertFractionOffersTest is ProtocolBase { uint256 fractionId ) private { //units, amount, currency, proof[] - (uint256 unitAmount, uint256 price) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); + (uint256 unitAmount, uint256 bidPrice) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); // Taker user has received the asset assertEq(mockHypercertMinter.ownerOf(fractionId), makerUser); @@ -408,14 +565,40 @@ contract HypercertFractionOffersTest is ProtocolBase { assertEq(mockHypercertMinter.unitsOf(fractionId + 1), unitAmount); // Maker bid user pays the whole price - assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser - (unitAmount * price)); + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser - (unitAmount * bidPrice)); // Taker ask user receives 99.5% of the whole price (0.5% protocol) assertEq( weth.balanceOf(makerUser), _initialWETHBalanceUser - + (unitAmount * price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + + (unitAmount * bidPrice * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP ); // Verify the nonce is marked as executed assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), _computeOrderHash(makerAsk)); } + + function _assertSuccessfulTakerBidFullFraction( + OrderStructs.Maker memory makerAsk, + OrderStructs.Taker memory takerBid, + uint256 fractionId + ) private { + //units, amount, currency, proof[] + (uint256 unitAmount, uint256 bidPrice) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); + + // Taker user has received the asset + assertEq(mockHypercertMinter.ownerOf(fractionId), takerUser); + + // Units have been transfered + assertEq(mockHypercertMinter.unitsOf(fractionId), unitAmount); + + // Maker bid user pays the whole price + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser - (unitAmount * bidPrice)); + // Taker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + weth.balanceOf(makerUser), + _initialWETHBalanceUser + + (unitAmount * bidPrice * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } } From 4b86911ec770d14e4920da3dceed79af6b04fc64 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 5 Dec 2023 00:11:53 +0100 Subject: [PATCH 035/118] Feat/docs tests cleanup (#1210) * feat(checks): checkValidityHC, error code, 0.8.17 * feat(validator): overvalidator HC tests * fix(clean): remove hyperboard references * fix(lint): pragma protocol tests * fix(pragma): restore FeeManagerRoy.. pragma * feat(docs): updated version * feat(build): docs 1.0.0-alpha --- contracts/.solhint.json | 2 +- .../CreatorFeeManagerWithRebates.sol | 2 +- .../CreatorFeeManagerWithRoyalties.sol | 2 +- .../src/marketplace/ExecutionManager.sol | 2 +- .../src/marketplace/LooksRareProtocol.sol | 2 +- contracts/src/marketplace/NonceManager.sol | 2 +- .../src/marketplace/ProtocolFeeRecipient.sol | 2 +- contracts/src/marketplace/StrategyManager.sol | 2 +- contracts/src/marketplace/TransferManager.sol | 5 +- .../src/marketplace/TransferSelectorNFT.sol | 2 +- .../constants/ValidationCodeConstants.sol | 20 +- .../src/marketplace/enums/CollectionType.sol | 5 +- .../executionStrategies/BaseStrategy.sol | 2 +- .../StrategyCollectionOffer.sol | 2 +- .../StrategyDutchAuction.sol | 2 +- .../StrategyHypercertFractionOffer.sol | 6 +- .../StrategyItemIdsRange.sol | 2 +- .../marketplace/helpers/OrderValidatorV2A.sol | 72 +- .../interfaces/ICreatorFeeManager.sol | 2 +- .../interfaces/ICurrencyManager.sol | 2 +- .../interfaces/IExecutionManager.sol | 2 +- .../interfaces/IImmutableCreate2Factory.sol | 2 +- .../interfaces/ILooksRareProtocol.sol | 2 +- .../marketplace/interfaces/INonceManager.sol | 2 +- .../interfaces/IRoyaltyFeeRegistry.sol | 2 +- .../src/marketplace/interfaces/IStrategy.sol | 2 +- .../interfaces/IStrategyManager.sol | 2 +- .../interfaces/ITransferManager.sol | 4 +- .../libraries/CurrencyValidator.sol | 2 +- .../libraries/LowLevelHypercertCaller.sol | 2 +- .../MerkleProofCalldataWithNodes.sol | 2 +- .../OpenZeppelin/MerkleProofMemory.sol | 2 +- .../marketplace/libraries/OrderStructs.sol | 4 +- contracts/src/protocol/AllowlistMinter.sol | 2 +- contracts/src/protocol/HypercertMinter.sol | 9 +- contracts/src/protocol/SemiFungible1155.sol | 2 +- .../src/protocol/interfaces/IAllowlist.sol | 2 +- .../protocol/interfaces/IHypercertToken.sol | 2 +- contracts/src/protocol/libs/Errors.sol | 2 +- .../marketplace/OrderValidatorV2A.t.sol | 75 ++ .../foundry/protocol/AllowlistMinter.t.sol | 2 +- .../test/foundry/protocol/Bitshifting.t.sol | 2 +- .../HypercertMinter.batchminting.t.sol | 2 +- .../protocol/HypercertMinter.pausable.t.sol | 2 +- .../foundry/protocol/HypercertMinter.t.sol | 13 +- .../protocol/HypercertMinter.transfers.t.sol | 2 +- .../foundry/protocol/PerformanceTesting.t.sol | 2 +- .../SemiFungible1155.allowances.t.sol | 2 +- .../protocol/SemiFungible1155.burning.t.sol | 2 +- .../protocol/SemiFungible1155.minting.t.sol | 2 +- .../foundry/protocol/SemiFungible1155.t.sol | 2 +- .../protocol/SemiFungible1155.transfers.t.sol | 2 +- .../protocol/SemiFungible1155.units.sol | 2 +- .../foundry/protocol/SemiFungibleHelper.sol | 2 +- contracts/test/mock/MockHypercertMinter.sol | 73 ++ ...MockHypercertMinterSupportsNoInterface.sol | 10 + ...MockHypercertMinterWithoutAnyBalanceOf.sol | 12 + .../MockHypercertMinterWithoutAnyUnitsOf.sol | 10 + .../marketplace/LooksRareProtocol.md | 2 +- .../contracts/marketplace/TransferManager.md | 10 +- .../marketplace/TransferSelectorNFT.md | 2 +- .../StrategyHypercertFractionOffer.md | 20 +- .../marketplace/helpers/OrderValidatorV2A.md | 18 +- .../version-1.0.0-alpha.0/about.md | 24 + .../developer/allowlists.md | 101 ++ .../api/contracts/AllowlistMinter.md | 84 ++ .../api/contracts/HypercertMinter.md | 895 +++++++++++++ .../api/contracts/HypercertTrader.md | 434 +++++++ .../api/contracts/IHypercertMinter.md | 39 + .../api/contracts/SemiFungible1155.md | 457 +++++++ .../v0.8/interfaces/AggregatorV3Interface.md | 77 ++ .../api/contracts/forge-std/src/console.md | 1 + .../api/contracts/forge-std/src/console2.md | 3 + .../api/contracts/interfaces/IAllowlist.md | 29 + .../contracts/interfaces/IHypercertToken.md | 192 +++ .../contracts/interfaces/IHypercertTrader.md | 133 ++ .../developer/api/contracts/libs/Errors.md | 59 + .../marketplace/BatchOrderTypehashRegistry.md | 46 + .../CreatorFeeManagerWithRebates.md | 76 ++ .../CreatorFeeManagerWithRoyalties.md | 64 + .../contracts/marketplace/CurrencyManager.md | 250 ++++ .../contracts/marketplace/ExecutionManager.md | 751 +++++++++++ .../marketplace/InheritedStrategy.md | 9 + .../marketplace/LooksRareProtocol.md | 1157 +++++++++++++++++ .../api/contracts/marketplace/NonceManager.md | 193 +++ .../marketplace/ProtocolFeeRecipient.md | 75 ++ .../contracts/marketplace/StrategyManager.md | 391 ++++++ .../contracts/marketplace/TransferManager.md | 553 ++++++++ .../marketplace/TransferSelectorNFT.md | 779 +++++++++++ .../executionStrategies/BaseStrategy.md | 41 + .../BaseStrategyChainlinkPriceLatency.md | 212 +++ .../StrategyChainlinkUSDDynamicAsk.md | 342 +++++ .../StrategyCollectionOffer.md | 127 ++ .../StrategyDutchAuction.md | 83 ++ .../StrategyHypercertFractionOffer.md | 123 ++ .../StrategyItemIdsRange.md | 75 ++ .../marketplace/helpers/OrderValidatorV2A.md | 215 +++ .../marketplace/helpers/ProtocolHelpers.md | 159 +++ .../interfaces/ICreatorFeeManager.md | 60 + .../interfaces/ICurrencyManager.md | 22 + .../interfaces/IExecutionManager.md | 99 ++ .../interfaces/IImmutableCreate2Factory.md | 41 + .../interfaces/ILooksRareProtocol.md | 157 +++ .../marketplace/interfaces/INonceManager.md | 53 + .../interfaces/IRoyaltyFeeRegistry.md | 29 + .../marketplace/interfaces/IStrategy.md | 41 + .../interfaces/IStrategyManager.md | 84 ++ .../interfaces/ITransferManager.md | 111 ++ .../libraries/CurrencyValidator.md | 7 + .../libraries/LowLevelHypercertCaller.md | 21 + .../MerkleProofCalldataWithNodes.md | 7 + .../OpenZeppelin/MerkleProofMemory.md | 7 + .../marketplace/libraries/OrderStructs.md | 7 + .../api/contracts/protocol/AllowlistMinter.md | 84 ++ .../api/contracts/protocol/HypercertMinter.md | 895 +++++++++++++ .../contracts/protocol/SemiFungible1155.md | 457 +++++++ .../protocol/interfaces/IAllowlist.md | 29 + .../protocol/interfaces/IHypercertToken.md | 192 +++ .../api/contracts/protocol/libs/Errors.md | 59 + .../developer/api/sdk/.nojekyll | 1 + .../developer/api/sdk/README.md | 185 +++ .../developer/api/sdk/classes/ClientError.md | 68 + .../api/sdk/classes/ConfigurationError.md | 66 + .../developer/api/sdk/classes/FetchError.md | 68 + .../api/sdk/classes/HypercertClient.md | 493 +++++++ .../api/sdk/classes/HypercertsStorage.md | 250 ++++ .../api/sdk/classes/InvalidOrMissingError.md | 68 + .../api/sdk/classes/MalformedDataError.md | 68 + .../developer/api/sdk/classes/MintingError.md | 68 + .../developer/api/sdk/classes/StorageError.md | 68 + .../api/sdk/classes/UnknownSchemaError.md | 71 + .../api/sdk/classes/UnsupportedChainError.md | 72 + .../api/sdk/classes/internal.default-1.md | 278 ++++ .../api/sdk/classes/internal.default-2.md | 131 ++ .../api/sdk/classes/internal.default.md | 110 ++ .../api/sdk/interfaces/CustomError.md | 39 + .../api/sdk/interfaces/DuplicateEvaluation.md | 56 + .../api/sdk/interfaces/EASEvaluation.md | 56 + .../api/sdk/interfaces/HypercertClaimdata.md | 167 +++ .../interfaces/HypercertClientInterface.md | 341 +++++ .../sdk/interfaces/HypercertClientMethods.md | 239 ++++ .../sdk/interfaces/HypercertClientState.md | 68 + .../interfaces/HypercertEvaluationSchema.md | 47 + .../interfaces/HypercertIndexerInterface.md | 176 +++ .../api/sdk/interfaces/HypercertMetadata.md | 123 ++ .../api/sdk/interfaces/HypercertPointer.md | 45 + .../interfaces/HypercertStorageInterface.md | 130 ++ .../api/sdk/interfaces/IPFSEvaluation.md | 34 + .../sdk/interfaces/SimpleTextEvaluation.md | 45 + .../interfaces/internal.EvaluatorInterface.md | 43 + .../interfaces/internal.HypercertClaimdata.md | 169 +++ .../interfaces/internal.HypercertMinter.md | 17 + .../developer/api/sdk/modules.md | 638 +++++++++ .../developer/api/sdk/modules/internal.md | 307 +++++ .../developer/burning.md | 12 + .../version-1.0.0-alpha.0/developer/config.md | 112 ++ .../version-1.0.0-alpha.0/developer/errors.md | 18 + .../developer/evaluations.md | 13 + .../developer/minting.md | 57 + .../developer/querying.md | 306 +++++ .../developer/quickstart-javascript.md | 101 ++ .../developer/quickstart-solidity.md | 41 + .../developer/split-merge.md | 29 + .../developer/supported-networks.md | 13 + .../devops/deploy-proxy.md | 120 ++ .../version-1.0.0-alpha.0/devops/errors.md | 45 + .../version-1.0.0-alpha.0/devops/index.md | 18 + .../version-1.0.0-alpha.0/devops/pause.md | 29 + .../version-1.0.0-alpha.0/devops/plasmic.md | 76 ++ .../version-1.0.0-alpha.0/devops/setup.md | 41 + .../version-1.0.0-alpha.0/devops/upgrade.md | 35 + .../version-1.0.0-alpha.0/faq.md | 139 ++ .../further-resources.md | 37 + .../implementation/glossary.md | 139 ++ .../implementation/metadata.md | 188 +++ .../implementation/token-standard.md | 29 + .../version-1.0.0-alpha.0/intro.md | 58 + .../minting-guide/gitcoin-round.md | 166 +++ .../minting-guide/minting-guide-start.md | 44 + .../minting-guide/step-by-step.md | 130 ++ .../whitepaper/evaluation.md | 23 + .../whitepaper/hypercerts-intro.md | 104 ++ .../version-1.0.0-alpha.0/whitepaper/ifs.md | 103 ++ .../whitepaper/impact-space.md | 35 + .../whitepaper/retrospective-funding.md | 42 + .../whitepaper/whitepaper-intro.md | 24 + .../version-1.0.0-alpha.0-sidebars.json | 162 +++ docs/versions.json | 2 +- 188 files changed, 18390 insertions(+), 75 deletions(-) create mode 100644 contracts/test/mock/MockHypercertMinter.sol create mode 100644 contracts/test/mock/MockHypercertMinterSupportsNoInterface.sol create mode 100644 contracts/test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol create mode 100644 contracts/test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/about.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/faq.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md create mode 100644 docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json diff --git a/contracts/.solhint.json b/contracts/.solhint.json index 78d99a5a..142a2076 100644 --- a/contracts/.solhint.json +++ b/contracts/.solhint.json @@ -3,7 +3,7 @@ "rules": { "avoid-low-level-calls": "off", "code-complexity": ["error", 12], - "compiler-version": ["error", ">=0.8.16"], + "compiler-version": ["error", "0.8.17"], "func-visibility": ["error", { "ignoreConstructors": true }], "no-console": "off", "no-empty-blocks": "off", diff --git a/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol b/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol index 9f0bcc3d..3a1de368 100644 --- a/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol +++ b/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; diff --git a/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol b/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol index 4b72630f..a50dde6a 100644 --- a/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol +++ b/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; diff --git a/contracts/src/marketplace/ExecutionManager.sol b/contracts/src/marketplace/ExecutionManager.sol index d0b7ace2..ab421a71 100644 --- a/contracts/src/marketplace/ExecutionManager.sol +++ b/contracts/src/marketplace/ExecutionManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "./libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/LooksRareProtocol.sol b/contracts/src/marketplace/LooksRareProtocol.sol index 3eb51f1b..9f3eb107 100644 --- a/contracts/src/marketplace/LooksRareProtocol.sol +++ b/contracts/src/marketplace/LooksRareProtocol.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {SignatureCheckerCalldata} from "@looksrare/contracts-libs/contracts/SignatureCheckerCalldata.sol"; diff --git a/contracts/src/marketplace/NonceManager.sol b/contracts/src/marketplace/NonceManager.sol index c8c5657b..d9a94cfc 100644 --- a/contracts/src/marketplace/NonceManager.sol +++ b/contracts/src/marketplace/NonceManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Interfaces and errors import {INonceManager} from "./interfaces/INonceManager.sol"; diff --git a/contracts/src/marketplace/ProtocolFeeRecipient.sol b/contracts/src/marketplace/ProtocolFeeRecipient.sol index 4eb12174..33cfceb4 100644 --- a/contracts/src/marketplace/ProtocolFeeRecipient.sol +++ b/contracts/src/marketplace/ProtocolFeeRecipient.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {LowLevelERC20Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Transfer.sol"; diff --git a/contracts/src/marketplace/StrategyManager.sol b/contracts/src/marketplace/StrategyManager.sol index d537563b..4edb9d66 100644 --- a/contracts/src/marketplace/StrategyManager.sol +++ b/contracts/src/marketplace/StrategyManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {CurrencyManager} from "./CurrencyManager.sol"; diff --git a/contracts/src/marketplace/TransferManager.sol b/contracts/src/marketplace/TransferManager.sol index 6ace6f93..eaa5231e 100644 --- a/contracts/src/marketplace/TransferManager.sol +++ b/contracts/src/marketplace/TransferManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; @@ -23,12 +23,11 @@ import {CollectionType} from "./enums/CollectionType.sol"; /** * @title TransferManager - * @notice This contract provides the transfer functions for ERC721/ERC1155/Hypercert/Hyperboard for contracts that + * @notice This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that * require them. * Collection type "0" refers to ERC721 transfer functions. * Collection type "1" refers to ERC1155 transfer functions. * Collection type "2" refers to Hypercert transfer functions. - * Collection type "3" refers to Hyperboard transfer functions. * @dev "Safe" transfer functions for ERC721 are not implemented since they come with added gas costs * to verify if the recipient is a contract as it requires verifying the receiver interface is valid. * @author LooksRare protocol team (👀,💎); bitbeckers diff --git a/contracts/src/marketplace/TransferSelectorNFT.sol b/contracts/src/marketplace/TransferSelectorNFT.sol index 347dae97..5a6e2998 100644 --- a/contracts/src/marketplace/TransferSelectorNFT.sol +++ b/contracts/src/marketplace/TransferSelectorNFT.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Direct dependencies import {PackableReentrancyGuard} from "@looksrare/contracts-libs/contracts/PackableReentrancyGuard.sol"; diff --git a/contracts/src/marketplace/constants/ValidationCodeConstants.sol b/contracts/src/marketplace/constants/ValidationCodeConstants.sol index 73cbc996..5c23fd1a 100644 --- a/contracts/src/marketplace/constants/ValidationCodeConstants.sol +++ b/contracts/src/marketplace/constants/ValidationCodeConstants.sol @@ -192,7 +192,7 @@ uint256 constant TOO_LATE_TO_EXECUTE_ORDER = 502; uint256 constant TOO_EARLY_TO_EXECUTE_ORDER = 503; /** - * 6. Transfer-related (ERC20, ERC721, ERC1155 tokens), including transfers and approvals, codes. + * 6. Transfer-related (ERC20, ERC721, ERC1155, Hypercert tokens), including transfers and approvals, codes. */ /** @@ -258,6 +258,18 @@ uint256 constant ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST = 633; */ uint256 constant ERC1155_NO_APPROVAL_FOR_ALL = 634; +/* + * @dev The Hypercert collaction does not support balanceOf. + * This maker order can become valid without any user's action. + */ +uint256 constant HYPERCERT_UNITS_OF_DOES_NOT_EXIST = 641; + +/* + * @dev The Hypercert fractionId is not owned by the signer (maker ask user). + * This maker order can become valid without any user's action. + */ +uint256 constant HYPERCERT_UNITS_NOT_HELD_BY_USER = 642; + /** * 7. Asset-type codes */ @@ -274,6 +286,12 @@ uint256 constant POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC721 = 701; */ uint256 constant POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155 = 702; +/** + * @dev The collection type specified in the order seems incorrect. + * It is expected to be collectionType = 2. + */ +uint256 constant POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_HYPERCERT = 703; + /** * 8. Transfer manager-related codes */ diff --git a/contracts/src/marketplace/enums/CollectionType.sol b/contracts/src/marketplace/enums/CollectionType.sol index 8eded297..89c79c81 100644 --- a/contracts/src/marketplace/enums/CollectionType.sol +++ b/contracts/src/marketplace/enums/CollectionType.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @notice CollectionType is used in OrderStructs.Maker's collectionType to determine the collection type being traded. @@ -7,6 +7,5 @@ pragma solidity ^0.8.17; enum CollectionType { ERC721, ERC1155, - Hypercert, - Hyperboard + Hypercert } diff --git a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol index 67e40f79..9d0bec3c 100644 --- a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol +++ b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Interfaces import {IStrategy} from "../interfaces/IStrategy.sol"; diff --git a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol index 1f80d52c..9a8f2ff7 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol b/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol index 6dfbfd1f..3c4fcf27 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol index 98c1c498..0680f264 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Interface -import {IHypercertToken} from "../../protocol/interfaces/IHypercertToken.sol"; +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; @@ -48,7 +48,7 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; * 1. If ERC721, the amount must be 1. * 2. If ERC1155, the amount can be greater than 1. * 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. - * @dev Use cases can include trait-based offers or rarity score offers. + * @dev Use cases can include tiered pricing; think early bird tickets. * @author LooksRare protocol team (👀,💎); bitbeckers; */ contract StrategyHypercertFractionOffer is BaseStrategy { diff --git a/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol b/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol index 636c2cb4..b2f5de20 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol index ceb4ef38..e25ed1ca 100644 --- a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol +++ b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {IERC165} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC165.sol"; @@ -16,6 +16,7 @@ import {MerkleProofCalldataWithNodes} from "../libraries/OpenZeppelin/MerkleProo import {ICreatorFeeManager} from "../interfaces/ICreatorFeeManager.sol"; import {IStrategy} from "../interfaces/IStrategy.sol"; import {IRoyaltyFeeRegistry} from "../interfaces/IRoyaltyFeeRegistry.sol"; +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; // Shared errors import {OrderInvalid} from "../errors/SharedErrors.sol"; @@ -41,12 +42,12 @@ import {QuoteType} from "../enums/QuoteType.sol"; * 3. Nonce related issues (e.g., nonce executed or cancelled) * 4. Signature related issues and merkle tree parameters * 5. Timestamp related issues (e.g., order expired) - * 6. Asset-related issues for ERC20/ERC721/ERC1155 (approvals and balances) + * 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) * 7. Collection-type suggestions * 8. Transfer manager related issues * 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) * @dev This version does not handle strategies with partial fills. - * @author LooksRare protocol team (👀,💎) + * @author LooksRare protocol team (👀,💎); bitbeckers */ contract OrderValidatorV2A { using OrderStructs for OrderStructs.Maker; @@ -66,6 +67,11 @@ contract OrderValidatorV2A { */ bytes4 public constant ERC1155_INTERFACE_ID = 0xd9b67a26; + /** + * @notice Hypercert interfaceId + */ + bytes4 public constant HYPERCERT_INTERFACE_ID = 0xda69bafa; + /** * @notice Magic value nonce returned if executed (or cancelled). */ @@ -364,6 +370,10 @@ contract OrderValidatorV2A { if (!IERC165(collection).supportsInterface(ERC1155_INTERFACE_ID)) { return POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155; } + } else if (collectionType == CollectionType.Hypercert) { + if (!IERC165(collection).supportsInterface(HYPERCERT_INTERFACE_ID)) { + return POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_HYPERCERT; + } } } @@ -417,6 +427,8 @@ contract OrderValidatorV2A { validationCode = _checkValidityERC721AndEquivalents(collection, user, itemIds); } else if (collectionType == CollectionType.ERC1155) { validationCode = _checkValidityERC1155(collection, user, itemIds, amounts); + } else if (collectionType == CollectionType.Hypercert) { + validationCode = _checkValidityHypercert(collection, user, itemIds, amounts); } } @@ -552,6 +564,60 @@ contract OrderValidatorV2A { } } + /** + * @notice This function verifies the validity of (1) Hypercerts + 1155 approvals + * (2) and balances to process the maker ask order. + * @param collection Collection address + * @param user User address + * @param itemIds Array of fraction ids + * @param amounts Array of units held by each fraction + * @return validationCode Validation code + */ + function _checkValidityHypercert( + address collection, + address user, + uint256[] memory itemIds, + uint256[] memory amounts + ) private view returns (uint256 validationCode) { + // 1. Verify each itemId is owned by user and catch revertion if ERC1155 ownerOf fails + address[] memory users = new address[](1); + users[0] = user; + + uint256 length = itemIds.length; + + bool success; + bytes memory data; + + bytes4 selector = bytes4(keccak256(bytes("unitsOf(address,uint256)"))); + for (uint256 i; i < length;) { + (success, data) = collection.staticcall(abi.encodeWithSelector(selector, user, itemIds[i])); + + if (!success) { + return HYPERCERT_UNITS_OF_DOES_NOT_EXIST; + } + + if (abi.decode(data, (uint256)) < amounts[i]) { + return HYPERCERT_UNITS_NOT_HELD_BY_USER; + } + + unchecked { + ++i; + } + } + + // 3. Verify if collection is approved by transfer manager + (success, data) = + collection.staticcall(abi.encodeCall(IERC1155.isApprovedForAll, (user, address(transferManager)))); + + if (!success) { + return ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST; + } + + if (!abi.decode(data, (bool))) { + return ERC1155_NO_APPROVAL_FOR_ALL; + } + } + /** * @notice This function verifies the validity of a Merkle proof and the order hash. * @param merkleTree Merkle tree struct diff --git a/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol b/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol index d0091c1a..6b6728e7 100644 --- a/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol +++ b/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Interfaces import {IRoyaltyFeeRegistry} from "./IRoyaltyFeeRegistry.sol"; diff --git a/contracts/src/marketplace/interfaces/ICurrencyManager.sol b/contracts/src/marketplace/interfaces/ICurrencyManager.sol index b4f2a1b4..72d50d2e 100644 --- a/contracts/src/marketplace/interfaces/ICurrencyManager.sol +++ b/contracts/src/marketplace/interfaces/ICurrencyManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title ICurrencyManager diff --git a/contracts/src/marketplace/interfaces/IExecutionManager.sol b/contracts/src/marketplace/interfaces/IExecutionManager.sol index 9f768dca..945637b5 100644 --- a/contracts/src/marketplace/interfaces/IExecutionManager.sol +++ b/contracts/src/marketplace/interfaces/IExecutionManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title IExecutionManager diff --git a/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol b/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol index e220c162..eefb6dfe 100644 --- a/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol +++ b/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; interface IImmutableCreate2Factory { function safeCreate2(bytes32 salt, bytes calldata initializationCode) diff --git a/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol b/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol index 68e222f6..e2a52119 100644 --- a/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol +++ b/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/interfaces/INonceManager.sol b/contracts/src/marketplace/interfaces/INonceManager.sol index 1cbfcbe6..6011291d 100644 --- a/contracts/src/marketplace/interfaces/INonceManager.sol +++ b/contracts/src/marketplace/interfaces/INonceManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title INonceManager diff --git a/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol b/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol index 6f5146da..766d4603 100644 --- a/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol +++ b/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title IRoyaltyFeeRegistry diff --git a/contracts/src/marketplace/interfaces/IStrategy.sol b/contracts/src/marketplace/interfaces/IStrategy.sol index fd725f21..a9b7e450 100644 --- a/contracts/src/marketplace/interfaces/IStrategy.sol +++ b/contracts/src/marketplace/interfaces/IStrategy.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/interfaces/IStrategyManager.sol b/contracts/src/marketplace/interfaces/IStrategyManager.sol index 77251172..283431a2 100644 --- a/contracts/src/marketplace/interfaces/IStrategyManager.sol +++ b/contracts/src/marketplace/interfaces/IStrategyManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title IStrategyManager diff --git a/contracts/src/marketplace/interfaces/ITransferManager.sol b/contracts/src/marketplace/interfaces/ITransferManager.sol index af0f3d0a..ec05a0ba 100644 --- a/contracts/src/marketplace/interfaces/ITransferManager.sol +++ b/contracts/src/marketplace/interfaces/ITransferManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; @@ -15,7 +15,7 @@ interface ITransferManager { /** * @notice This struct is only used for transferBatchItemsAcrossCollections. * @param collection Collection address - * @param collectionType 0 for ERC721, 1 for ERC1155, 2 for Hypercert, 3 for Hyperboard + * @param collectionType 0 for ERC721, 1 for ERC1155, 2 for Hypercert * @param itemIds Array of item ids to transfer * @param amounts Array of amounts to transfer */ diff --git a/contracts/src/marketplace/libraries/CurrencyValidator.sol b/contracts/src/marketplace/libraries/CurrencyValidator.sol index add2e364..61208646 100644 --- a/contracts/src/marketplace/libraries/CurrencyValidator.sol +++ b/contracts/src/marketplace/libraries/CurrencyValidator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Assembly import { diff --git a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol index cd79e160..5c330c38 100644 --- a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol +++ b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Interfaces import {IHypercertToken} from "../../protocol/interfaces/IHypercertToken.sol"; diff --git a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol index b23c7a8f..f3af4e8b 100644 --- a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol +++ b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol index 4bf168ef..442e138f 100644 --- a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol +++ b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title MerkleProofMemory diff --git a/contracts/src/marketplace/libraries/OrderStructs.sol b/contracts/src/marketplace/libraries/OrderStructs.sol index 09eb49f9..38c632b2 100644 --- a/contracts/src/marketplace/libraries/OrderStructs.sol +++ b/contracts/src/marketplace/libraries/OrderStructs.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Enums import {CollectionType} from "../enums/CollectionType.sol"; @@ -22,7 +22,7 @@ library OrderStructs { * @param subsetNonce Subset nonce (shared across bid/ask maker orders) * @param orderNonce Order nonce (it can be shared across bid/ask maker orders) * @param strategyId Strategy id - * @param collectionType Collection type (i.e. 0 = ERC721, 1 = ERC1155, 2 = Hypercert, 3 = Hyperboard) + * @param collectionType Collection type (i.e. 0 = ERC721, 1 = ERC1155, 2 = Hypercert) * @param collection Collection address * @param currency Currency address (@dev address(0) = ETH) * @param signer Signer address diff --git a/contracts/src/protocol/AllowlistMinter.sol b/contracts/src/protocol/AllowlistMinter.sol index 881e0e68..78f1a592 100644 --- a/contracts/src/protocol/AllowlistMinter.sol +++ b/contracts/src/protocol/AllowlistMinter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {MerkleProofUpgradeable} from "oz-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; import {IAllowlist} from "./interfaces/IAllowlist.sol"; diff --git a/contracts/src/protocol/HypercertMinter.sol b/contracts/src/protocol/HypercertMinter.sol index 63cf8cb4..e6df9756 100644 --- a/contracts/src/protocol/HypercertMinter.sol +++ b/contracts/src/protocol/HypercertMinter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {IHypercertToken} from "./interfaces/IHypercertToken.sol"; import {SemiFungible1155} from "./SemiFungible1155.sol"; @@ -241,6 +241,13 @@ contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, } } + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IHypercertToken).interfaceId || super.supportsInterface(interfaceId); + } + /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. diff --git a/contracts/src/protocol/SemiFungible1155.sol b/contracts/src/protocol/SemiFungible1155.sol index 4fe25e1c..ff6c94f2 100644 --- a/contracts/src/protocol/SemiFungible1155.sol +++ b/contracts/src/protocol/SemiFungible1155.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT // Used components of Enjin example implementation for mixed fungibility // https://github.com/enjin/erc-1155/blob/master/contracts/ERC1155MixedFungibleMintable.sol -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {ERC1155Upgradeable} from "oz-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; import {ERC1155BurnableUpgradeable} from "oz-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol"; diff --git a/contracts/src/protocol/interfaces/IAllowlist.sol b/contracts/src/protocol/interfaces/IAllowlist.sol index b4415d42..a29da784 100644 --- a/contracts/src/protocol/interfaces/IAllowlist.sol +++ b/contracts/src/protocol/interfaces/IAllowlist.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity 0.8.17; /// @title Interface for allowlist /// @author bitbeckers diff --git a/contracts/src/protocol/interfaces/IHypercertToken.sol b/contracts/src/protocol/interfaces/IHypercertToken.sol index afd257bf..3e7738b4 100644 --- a/contracts/src/protocol/interfaces/IHypercertToken.sol +++ b/contracts/src/protocol/interfaces/IHypercertToken.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity 0.8.17; /// @title Interface for hypercert token interactions /// @author bitbeckers diff --git a/contracts/src/protocol/libs/Errors.sol b/contracts/src/protocol/libs/Errors.sol index e19d6b5c..e807d828 100644 --- a/contracts/src/protocol/libs/Errors.sol +++ b/contracts/src/protocol/libs/Errors.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity 0.8.17; /// @author bitbeckers library Errors { diff --git a/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol b/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol index 89ecd238..90dc0281 100644 --- a/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol +++ b/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol @@ -19,10 +19,13 @@ import { ERC1155_BALANCE_OF_ITEM_ID_INFERIOR_TO_AMOUNT, ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST, ERC1155_NO_APPROVAL_FOR_ALL, + HYPERCERT_UNITS_NOT_HELD_BY_USER, + HYPERCERT_UNITS_OF_DOES_NOT_EXIST, MAKER_ORDER_INVALID_STANDARD_SALE, MISSING_IS_VALID_SIGNATURE_FUNCTION_EIP1271, POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC721, POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155, + POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_HYPERCERT, STRATEGY_NOT_IMPLEMENTED, TRANSFER_MANAGER_APPROVAL_REVOKED_BY_OWNER_FOR_EXCHANGE } from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; @@ -39,6 +42,10 @@ import {MockERC1155WithoutAnyBalanceOf} from "../../mock/MockERC1155WithoutAnyBa import {MockERC1155WithoutIsApprovedForAll} from "../../mock/MockERC1155WithoutIsApprovedForAll.sol"; import {MockERC721SupportsNoInterface} from "../../mock/MockERC721SupportsNoInterface.sol"; import {MockERC1155SupportsNoInterface} from "../../mock/MockERC1155SupportsNoInterface.sol"; +import {MockHypercertMinter} from "../../mock/MockHypercertMinter.sol"; +import {MockHypercertMinterSupportsNoInterface} from "../../mock/MockHypercertMinterSupportsNoInterface.sol"; +import {MockHypercertMinterWithoutAnyBalanceOf} from "../../mock/MockHypercertMinterWithoutAnyBalanceOf.sol"; +import {MockHypercertMinterWithoutAnyUnitsOf} from "../../mock/MockHypercertMinterWithoutAnyUnitsOf.sol"; import {MockERC20} from "../../mock/MockERC20.sol"; // Enums @@ -205,6 +212,25 @@ contract OrderValidatorV2ATest is TestParameters { assertEq(validationCodes[6], POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155); } + function testMakerAskWrongCollectionTypeHypercert() public { + OrderStructs.Maker memory makerAsk; + makerAsk.collectionType = CollectionType.Hypercert; + makerAsk.collection = address(new MockHypercertMinterSupportsNoInterface()); + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[6], POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_HYPERCERT); + } + + function testMakerBidWrongCollectionTypeHypercert() public { + OrderStructs.Maker memory makerBid; + makerBid.quoteType = QuoteType.Bid; + makerBid.collectionType = CollectionType.Hypercert; + makerBid.collection = address(new MockHypercertMinterSupportsNoInterface()); + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerBid, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[6], POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_HYPERCERT); + } + function testMakerBidInsufficientERC20Allowance() public { OrderStructs.Maker memory makerBid; makerBid.quoteType = QuoteType.Bid; @@ -372,4 +398,53 @@ contract OrderValidatorV2ATest is TestParameters { orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); assertEq(validationCodes[5], ERC1155_NO_APPROVAL_FOR_ALL); } + + // HYPERCERTS + + function _testMakerAskHypercertUnitsInferiorToAmount(bool revertBalanceOf) public { + address collection; + if (revertBalanceOf) { + MockHypercertMinterWithoutAnyBalanceOf mockHypercert = new MockHypercertMinterWithoutAnyBalanceOf(); + collection = address(mockHypercert); + } else { + MockHypercertMinter mockHypercert = new MockHypercertMinter(); + collection = address(mockHypercert); + } + + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.collectionType = CollectionType.Hypercert; + makerAsk.collection = collection; + makerAsk.signer = makerUser; + makerAsk.collectionType = CollectionType.Hypercert; + uint256[] memory itemIds = new uint256[](1); + makerAsk.itemIds = itemIds; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerAsk.amounts = amounts; + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[5], HYPERCERT_UNITS_NOT_HELD_BY_USER); + } + + function testMakerAskHypercertUnitsOfDoesNotExist() public { + MockHypercertMinterWithoutAnyUnitsOf mockHypercert = new MockHypercertMinterWithoutAnyUnitsOf(); + + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.collectionType = CollectionType.Hypercert; + makerAsk.collection = address(mockHypercert); + makerAsk.signer = makerUser; + makerAsk.collectionType = CollectionType.Hypercert; + uint256[] memory itemIds = new uint256[](1); + makerAsk.itemIds = itemIds; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerAsk.amounts = amounts; + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[5], HYPERCERT_UNITS_OF_DOES_NOT_EXIST); + } } diff --git a/contracts/test/foundry/protocol/AllowlistMinter.t.sol b/contracts/test/foundry/protocol/AllowlistMinter.t.sol index a16c343c..a5be53c6 100644 --- a/contracts/test/foundry/protocol/AllowlistMinter.t.sol +++ b/contracts/test/foundry/protocol/AllowlistMinter.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/Bitshifting.t.sol b/contracts/test/foundry/protocol/Bitshifting.t.sol index 6c4d9fe2..4c3aba56 100644 --- a/contracts/test/foundry/protocol/Bitshifting.t.sol +++ b/contracts/test/foundry/protocol/Bitshifting.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol b/contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol index 3f8502d6..e861dc9c 100644 --- a/contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol b/contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol index a4b63061..0253ea7a 100644 --- a/contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {StdCheats} from "forge-std/StdCheats.sol"; import {StdUtils} from "forge-std/StdUtils.sol"; diff --git a/contracts/test/foundry/protocol/HypercertMinter.t.sol b/contracts/test/foundry/protocol/HypercertMinter.t.sol index 86bbe1d5..e286c153 100644 --- a/contracts/test/foundry/protocol/HypercertMinter.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {StdCheats} from "forge-std/StdCheats.sol"; import {StdUtils} from "forge-std/StdUtils.sol"; @@ -68,6 +68,17 @@ contract HypercertMinterTest is PRBTest, StdCheats, StdUtils, MinterTestHelper { startHoax(alice, 10 ether); } + function testSupportsInterface() public { + // 721 + assertEq(hypercertMinter.supportsInterface(0x80ac58cd), false); + + // 1155 + assertEq(hypercertMinter.supportsInterface(0xd9b67a26), true); + + // IHypercertToken + assertEq(hypercertMinter.supportsInterface(0xda69bafa), true); + } + /// @dev Run Forge with `-vvvv` to see console logs. function testFailInitialize() public { hypercertMinter.initialize(); diff --git a/contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol b/contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol index cd2f1773..5533296e 100644 --- a/contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {StdCheats} from "forge-std/StdCheats.sol"; import {StdUtils} from "forge-std/StdUtils.sol"; diff --git a/contracts/test/foundry/protocol/PerformanceTesting.t.sol b/contracts/test/foundry/protocol/PerformanceTesting.t.sol index 956fd3bb..d1ce85d1 100644 --- a/contracts/test/foundry/protocol/PerformanceTesting.t.sol +++ b/contracts/test/foundry/protocol/PerformanceTesting.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol index efe78bef..0f715b6c 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol index 1e3c21a4..2b454992 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity >=0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol index 9458a8cc..0e01f6b4 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {stdError} from "forge-std/StdError.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.t.sol index ea5746c1..3ad7df59 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol index bcad3900..ce19bb64 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {StdCheats} from "forge-std/StdCheats.sol"; import {StdUtils} from "forge-std/StdUtils.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.units.sol b/contracts/test/foundry/protocol/SemiFungible1155.units.sol index 384bcdfb..e462ecd4 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.units.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.units.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungibleHelper.sol b/contracts/test/foundry/protocol/SemiFungibleHelper.sol index 82a1c264..5cc9c863 100644 --- a/contracts/test/foundry/protocol/SemiFungibleHelper.sol +++ b/contracts/test/foundry/protocol/SemiFungibleHelper.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {SemiFungible1155} from "@hypercerts/protocol/SemiFungible1155.sol"; import {PRBTest} from "prb-test/PRBTest.sol"; diff --git a/contracts/test/mock/MockHypercertMinter.sol b/contracts/test/mock/MockHypercertMinter.sol new file mode 100644 index 00000000..417fe794 --- /dev/null +++ b/contracts/test/mock/MockHypercertMinter.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; + +contract MockHypercertMinter is IHypercertToken { + constructor() IHypercertToken() {} + + /// @dev Function called to store a claim referenced via `uri` with a maximum number of fractions `units`. + function mintClaim(address account, uint256 units, string memory uri, TransferRestrictions restrictions) external { + return; + } + + /// @dev Function called to store a claim referenced via `uri` with a set of `fractions`. + /// @dev Fractions are internally summed to total units. + function mintClaimWithFractions( + address account, + uint256 units, + uint256[] memory fractions, + string memory uri, + TransferRestrictions restrictions + ) external { + return; + } + + /// @dev Function called to split `tokenID` owned by `account` into units declared in `values`. + /// @notice The sum of `values` must equal the current value of `_tokenID`. + function splitFraction(address account, uint256 tokenID, uint256[] memory _values) external { + return; + } + + /// @dev Function called to merge tokens within `tokenIDs`. + /// @notice Tokens that have been merged are burned. + function mergeFractions(address account, uint256[] memory tokenIDs) external { + return; + } + + /// @dev Function to burn the token at `tokenID` for `account` + /// @notice Operator must be allowed by `creator` and the token must represent the total amount of available units. + function burnFraction(address account, uint256 tokenID) external { + return; + } + + /// @dev Function to burn the tokens at `tokenIDs` for `account` + /// @notice Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + function batchBurnFraction(address account, uint256[] memory tokenIDs) external { + return; + } + + /// @dev Returns the `units` held by a (fractional) token at `claimID` + /// @dev If `tokenID` is a base type, the total amount of `units` for the claim is returned. + /// @dev If `tokenID` is a fractional token, the `units` held by the token is returned + function unitsOf(uint256 tokenID) external view virtual returns (uint256 units) { + return 0; + } + + /// @dev Returns the `units` held by `account` of a (fractional) token at `claimID` + /// @dev If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned. + /// @dev If `tokenID` is a fractional token, the `units` held by `account` the token is returned + function unitsOf(address account, uint256 tokenID) external view virtual returns (uint256 units) { + return 0; + } + + /// @dev Returns the `uri` for metadata of the claim represented by `tokenID` + /// @dev Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata) + function uri(uint256 tokenID) external view returns (string memory metadata) { + return "metadata"; + } + + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return interfaceId == type(IHypercertToken).interfaceId; + } +} diff --git a/contracts/test/mock/MockHypercertMinterSupportsNoInterface.sol b/contracts/test/mock/MockHypercertMinterSupportsNoInterface.sol new file mode 100644 index 00000000..4f2aac87 --- /dev/null +++ b/contracts/test/mock/MockHypercertMinterSupportsNoInterface.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {MockHypercertMinter} from "./MockHypercertMinter.sol"; + +contract MockHypercertMinterSupportsNoInterface is MockHypercertMinter { + function supportsInterface(bytes4) public view virtual override returns (bool) { + return false; + } +} diff --git a/contracts/test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol b/contracts/test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol new file mode 100644 index 00000000..d8743699 --- /dev/null +++ b/contracts/test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {HypercertMinter} from "@hypercerts/protocol/HypercertMinter.sol"; + +contract MockHypercertMinterWithoutAnyBalanceOf is HypercertMinter { + constructor() HypercertMinter() {} + + function balanceOf(address, uint256) public view virtual override returns (uint256) { + revert("Not implemented"); + } +} diff --git a/contracts/test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol b/contracts/test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol new file mode 100644 index 00000000..d50128f4 --- /dev/null +++ b/contracts/test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {MockHypercertMinter} from "./MockHypercertMinter.sol"; + +contract MockHypercertMinterWithoutAnyUnitsOf is MockHypercertMinter { + function unitsOf(address, uint256) public view virtual override returns (uint256) { + revert("Not implemented"); + } +} diff --git a/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md index b185d072..cc542c7e 100644 --- a/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md +++ b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -408,7 +408,7 @@ This returns the strategy information for a strategy id. function transferManager() external view returns (contract TransferManager) ``` -Transfer manager for ERC721 and ERC1155. +Transfer manager for ERC721, ERC1155 and Hypercerts. #### Returns diff --git a/docs/docs/developer/api/contracts/marketplace/TransferManager.md b/docs/docs/developer/api/contracts/marketplace/TransferManager.md index c2aecdaf..c6766114 100644 --- a/docs/docs/developer/api/contracts/marketplace/TransferManager.md +++ b/docs/docs/developer/api/contracts/marketplace/TransferManager.md @@ -1,10 +1,10 @@ # TransferManager -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers_ > TransferManager -This contract provides the transfer functions for ERC721/ERC1155/Hypercert/Hyperboard for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. Collection type "3" refers to Hyperboard transfer functions. +This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. _"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ @@ -213,9 +213,9 @@ _Each operator address must be approved at the user level to be revoked._ function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable ``` -This function transfers items for a single Hypercert. +This function splits and transfers a fraction of a hypercert. -_It does not allow batch transferring if from = msg.sender since native function should be used._ +_It does not allow batch transferring._ #### Parameters @@ -412,7 +412,7 @@ It is emitted if an operator is removed from the global allowlist. error AmountInvalid() ``` -It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155, if amount is 0. +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. ### ERC1155SafeBatchTransferFromFail diff --git a/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md index 592bd4af..9011bd50 100644 --- a/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md +++ b/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md @@ -278,7 +278,7 @@ This returns the strategy information for a strategy id. function transferManager() external view returns (contract TransferManager) ``` -Transfer manager for ERC721 and ERC1155. +Transfer manager for ERC721, ERC1155 and Hypercerts. #### Returns diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md index a55946ce..daa427e4 100644 --- a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -6,7 +6,7 @@ _LooksRare protocol team (👀,💎); bitbeckers;_ This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. -_Use cases can include trait-based offers or rarity score offers._ +_Use cases can include tiered pricing; think early bird tickets._ ## Methods @@ -35,7 +35,7 @@ function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBi ### executeHypercertFractionStrategyWithTakerBidWithAllowlist ```solidity -function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) ``` #### Parameters @@ -90,6 +90,22 @@ function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) ## Errors +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + ### MerkleProofInvalid ```solidity diff --git a/docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md index 2d6342fd..76918fc5 100644 --- a/docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md +++ b/docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md @@ -1,10 +1,10 @@ # OrderValidatorV2A -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers_ > OrderValidatorV2A -This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155 (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) +This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) _This version does not handle strategies with partial fills._ @@ -66,6 +66,20 @@ ERC721 potential interfaceId. | ---- | ------ | ----------- | | \_0 | bytes4 | undefined | +### HYPERCERT_INTERFACE_ID + +```solidity +function HYPERCERT_INTERFACE_ID() external view returns (bytes4) +``` + +Hypercert interfaceId + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + ### MAGIC_VALUE_ORDER_NONCE_EXECUTED ```solidity diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/about.md b/docs/versioned_docs/version-1.0.0-alpha.0/about.md new file mode 100644 index 00000000..e2d4eb79 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/about.md @@ -0,0 +1,24 @@ +--- +title: The Hypercerts Foundation +id: about +--- + +# The Hypercerts Foundation + +### Mission + +The mission of the Hypercerts Foundation is to advance the development and adoption of open-source protocols for funding and rewarding positive impact. + +### Organization + +The Hypercerts Foundation is a fully independent organisation working closely with stakeholders in the open source, scientific research, and cryptography communities to develop and promote additional protocols that are decentralized, secure, and transparent. The Foundation will also provide support and resources to help drive the wider adoption of these protocols. + +### History + +Research on hypercerts was first presented to the public by David A. Dalrymple at the conference series Funding the Commons in March 2022. However, the concept of “impact certificates” has been a recurring theme at conferences and in online discussion forums since at least 2014. In late 2022, a small team of research scientists, developers, and practitioners began implementing hypercerts as a set of Ethereum-based smart contracts that could be used to assert and fund impact claims. The Hypercerts Foundation will now serve as the long-term home for this work. + +The new foundation is supported in part by Protocol Labs and is part of the broader Protocol Labs Network of hundreds of companies and organizations. The Foundation will complement Protocol Labs Network’s mission of enabling a more secure, open, and accessible internet. The Hypercerts Foundation, however, is fully independent and will focus on protocol development and cultivating a community of developers and impact entrepreneurs well beyond the Protocol Labs Network. + +### Further links + +Read the full [announcement of the Hypercerts Foundation](https://hypercerts.notion.site/Introducing-the-Hypercerts-Foundation-d956203fe0fc4792980da138015e770a). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md new file mode 100644 index 00000000..bc65b116 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md @@ -0,0 +1,101 @@ +# Allowlists + +Allowlists are an efficient way to enable distribution of hypercert fractions amongst a group. +First, the creator will create the hypercert with the metadata and an immutable allowlist. +With the `claimId`, every account specified in the allowlist can later mint their fraction token from that allowlist. + +## Create an allowlist + +First specify an allowlist, mapping addresses to the number of units they should receive. + +```js +import { + TransferRestrictions, + formatHypercertData, + Allowlist, +} from "@hypercerts-org/sdk"; + +const allowlist: Allowlist = [ + { address: "0x123", units: 100 }, + { address: "0xabc", units: 100 }, +]; +``` + +Then, call `createAllowlist` with the metadata and allowlist. + +```js +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; +const transferRestrictions = TransferRestrictions.FromCreatorOnly + +const { claimId } = await hypercerts.createAllowlist({ + allowList, + metaData, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **note** We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree generation and data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree) + +It first checks if the client is writable and if the operator is a signer. If the operator is not a signer, it throws an `InvalidOrMissingError`. + +Next, it validates the allowlist and metadata by calling the `validateAllowlist` and `validateMetaData` functions respectively. If either the allowlist or metadata is invalid, it throws a `MalformedDataError`. + +Once the allowlist and metadata are validated, the method creates a Merkle tree from the allowlist and stores it on IPFS. It then stores the metadata on IPFS as well. + +Finally, the method invokes the `createAllowlist` function on the contract with the signer's `address`, the total number of `units`, the Merkle tree `root`, the metadata `CID`, and the `transfer restrictions`. If the method is called with `overrides`, it passes them to the createAllowlist function. + +## Claiming a fraction token + +Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: + +| Variable | Type | Source | +| -------- | ------------ | ------------ | +| claimId | BigNumberish | Hypercert ID | +| units | BigNumberish | Allowlist | +| proof | BytesLike[] | Merkle tree | + +We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. + +Then, call `mintClaimFractionFromAllowlist` with the required data. The contracts will also verify the proofs. However, when providing the `root` in the function input, the proofs will be verified before a transaction is submitted. + +```js +import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; + +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const address = "0xc0ffee254729296a45a3885639AC7E10F9d54979"; + +const { indexer, storage } = hypercertsClient; +const claimById = await indexer.claimById(claimId); +const { uri, tokenID: _id } = claimById.claim; +const metadata = await storage.getMetadata(uri || ""); +const treeResponse = await storage.getData(metadata.allowList); +const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); + +let args; +// Find the proof in the allowlist +for (const [leaf, value] of tree.entries()) { + if (value[0] === address) { + args = { + proofs: tree.getProof(leaf), + units: Number(value[1]), + claimId: _id, + }; + break; + } +} + +// Mint fraction token +const tx = await hypercerts.mintClaimFractionFromAllowlist({ + ...args, +}); +``` + +Let's see what happens under the hood: + +First, the method checks that the client is not `read only` and that the operator is a signer. If not, it throws an `InvalidOrMissingError`. + +Next, the method verifies the Merkle `proof` using the OpenZeppelin Merkle tree library. If a `root` is provided, the method uses it to verify the proof. If the proof is invalid, it throws an error. + +Finally, the method calls the `mintClaimFromAllowlist` function on the contract with the signer `address`, Merkle `proof`, `claim ID`, and number of `units` as parameters. If overrides are provided, the method uses them to send the transaction. Otherwise, it sends the transaction without overrides. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md new file mode 100644 index 00000000..e31e8840 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md @@ -0,0 +1,434 @@ +# HypercertTrader + +_bitbeckers_ + +> Contract for managing hypercert trades + +Implementation of the HypercertTrader Interface + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsForSale | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +### getOffer + +```solidity +function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------- | ----------- | +| \_0 | IHypercertTrader.Offer | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### offers + +```solidity +function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | --------------------------------- | ----------- | +| offerer | address | undefined | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsAvailable | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| offerType | enum IHypercertTrader.OfferType | undefined | +| status | enum IHypercertTrader.OfferStatus | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### totalUnitsForSale + +```solidity +function totalUnitsForSale(address, uint256) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +## Errors + +### InvalidBuy + +```solidity +error InvalidBuy(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### InvalidOffer + +```solidity +error InvalidOffer(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### NotAllowed + +```solidity +error NotAllowed() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md new file mode 100644 index 00000000..13a84632 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md @@ -0,0 +1,39 @@ +# IHypercertMinter + +## Methods + +### ownerOf + +```solidity +function ownerOf(uint256 id) external view returns (address) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 id) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md new file mode 100644 index 00000000..6be07157 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md @@ -0,0 +1,77 @@ +# AggregatorV3Interface + +## Methods + +### decimals + +```solidity +function decimals() external view returns (uint8) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ----- | ----------- | +| \_0 | uint8 | undefined | + +### description + +```solidity +function description() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### getRoundData + +```solidity +function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------ | ----------- | +| \_roundId | uint80 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### latestRoundData + +```solidity +function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### version + +```solidity +function version() external view returns (uint256) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md new file mode 100644 index 00000000..8d14ad8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md @@ -0,0 +1 @@ +# console diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md new file mode 100644 index 00000000..cb666cd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md @@ -0,0 +1,3 @@ +# console2 + +_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md new file mode 100644 index 00000000..06fb700c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md @@ -0,0 +1,133 @@ +# IHypercertTrader + +_bitbeckers_ + +> Interface for hypercert token trading + +This interface declares the required functionality to interact with the hypercert marketplace + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| units | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +## Events + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md new file mode 100644 index 00000000..4cb96bfc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md @@ -0,0 +1,46 @@ +# BatchOrderTypehashRegistry + +_LooksRare protocol team (👀,💎)_ + +> BatchOrderTypehashRegistry + +The contract generates the batch order hash that is used to compute the digest for signature verification. + +## Methods + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +## Errors + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md new file mode 100644 index 00000000..a32aef65 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md @@ -0,0 +1,76 @@ +# CreatorFeeManagerWithRebates + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRebates + +This contract returns the creator fee address and the creator rebate amount. + +## Methods + +### STANDARD_ROYALTY_FEE_BP + +```solidity +function STANDARD_ROYALTY_FEE_BP() external view returns (uint256) +``` + +Standard royalty fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md new file mode 100644 index 00000000..41cab900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md @@ -0,0 +1,64 @@ +# CreatorFeeManagerWithRoyalties + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRoyalties + +This contract returns the creator fee address and the creator fee amount. + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +_There are two on-chain sources for the royalty fee to distribute. 1. RoyaltyFeeRegistry: It is an on-chain registry where creator fee is defined for all items of a collection. 2. ERC2981: The NFT Royalty Standard where royalty fee is defined at a itemId level in a collection. The on-chain logic looks up the registry first. If it does not find anything, it checks if a collection is ERC2981. If so, it fetches the proper royalty information for the itemId. For a bundle that contains multiple itemIds (for a collection using ERC2981), if the royalty fee/recipient differ among the itemIds part of the bundle, the trade reverts. This contract DOES NOT enforce any restriction for extremely high creator fee, nor verifies the creator fee fetched is inferior to the total price. If any contract relies on it to build an on-chain royalty logic, it should implement protection against: (1) high royalties (2) potential unexpected royalty changes that can occur after the creation of the order._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md new file mode 100644 index 00000000..9ff1c0fc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md @@ -0,0 +1,250 @@ +# CurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> CurrencyManager + +This contract manages the list of valid fungible currencies. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md new file mode 100644 index 00000000..83eefc37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md @@ -0,0 +1,751 @@ +# ExecutionManager + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> ExecutionManager + +This contract handles the execution and resolution of transactions. A transaction is executed on-chain when an off-chain maker order is matched by on-chain taker order of a different kind. For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md new file mode 100644 index 00000000..022cce57 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md @@ -0,0 +1,9 @@ +# InheritedStrategy + +_LooksRare protocol team (👀,💎)_ + +> InheritedStrategy + +This contract handles the verification of parameters for standard transactions. It does not verify the taker struct's itemIds and amounts array as well as minPrice (taker ask) / maxPrice (taker bid) because before the taker executes the transaction and the maker itemIds/amounts/price should have already been confirmed off-chain. + +_A standard transaction (bid or ask) is mapped to strategyId = 0._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md new file mode 100644 index 00000000..cc542c7e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -0,0 +1,1157 @@ +# LooksRareProtocol + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> LooksRareProtocol + +This contract is the core smart contract of the LooksRare protocol ("v2"). It is the main entry point for users to initiate transactions with taker orders and manage the cancellation of maker orders, which exist off-chain. ~~~~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~- ~~~~~~~~ ~~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~~ ~~~~~~~~ ~~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~~~~ + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ETH. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### chainId + +```solidity +function chainId() external view returns (uint256) +``` + +Current chainId. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +Current domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### restrictedExecuteTakerBid + +```solidity +function restrictedExecuteTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, address sender, bytes32 orderHash) external nonpayable returns (uint256 protocolFeeAmount) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| sender | address | undefined | +| orderHash | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| protocolFeeAmount | uint256 | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateDomainSeparator + +```solidity +function updateDomainSeparator() external nonpayable +``` + +This function allows the owner to update the domain separator (if possible). + +_Only callable by owner. If there is a fork of the network with a new chainId, it allows the owner to reset the domain separator for the new chain id._ + +### updateETHGasLimitForTransfer + +```solidity +function updateETHGasLimitForTransfer(uint256 newGasLimitETHTransfer) external nonpayable +``` + +This function allows the owner to update the maximum ETH gas limit for a standard transfer. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------ | +| newGasLimitETHTransfer | uint256 | New gas limit for ETH transfer | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------- | +| gasLimitETHTransfer | uint256 | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| askUser | address | undefined | +| bidUser | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| bidUser | address | undefined | +| bidRecipient | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +## Errors + +### CallerInvalid + +```solidity +error CallerInvalid() +``` + +It is returned if the function cannot be called by the sender. + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### CurrencyInvalid + +```solidity +error CurrencyInvalid() +``` + +It is returned if the currency is invalid. + +### ERC20TransferFromFail + +```solidity +error ERC20TransferFromFail() +``` + +It is emitted if the ERC20 transferFrom fails. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### QuoteTypeInvalid + +```solidity +error QuoteTypeInvalid() +``` + +It is returned if the maker quote type is invalid. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md new file mode 100644 index 00000000..fea95495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md @@ -0,0 +1,193 @@ +# NonceManager + +_LooksRare protocol team (👀,💎)_ + +> NonceManager + +This contract handles the nonce logic that is used for invalidating maker orders that exist off-chain. The nonce logic revolves around three parts at the user level: - order nonce (orders sharing an order nonce are conditional, OCO-like) - subset (orders can be grouped under a same subset) - bid/ask (all orders can be executed only if the bid/ask nonce matches the user's one on-chain) Only the order nonce is invalidated at the time of the execution of a maker order that contains it. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md new file mode 100644 index 00000000..36f6a35c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md @@ -0,0 +1,75 @@ +# ProtocolFeeRecipient + +_LooksRare protocol team (👀,💎)_ + +> ProtocolFeeRecipient + +This contract is used to receive protocol fees and transfer them to the fee sharing setter. Fee sharing setter cannot receive ETH directly, so we need to use this contract as a middleman to convert ETH into WETH before sending it. + +## Methods + +### FEE_SHARING_SETTER + +```solidity +function FEE_SHARING_SETTER() external view returns (address) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### WETH + +```solidity +function WETH() external view returns (contract IWETH) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------- | ----------- | +| \_0 | contract IWETH | undefined | + +### transferERC20 + +```solidity +function transferERC20(address currency) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------------- | +| currency | address | ERC20 currency address | + +### transferETH + +```solidity +function transferETH() external nonpayable +``` + +## Errors + +### ERC20TransferFail + +```solidity +error ERC20TransferFail() +``` + +It is emitted if the ERC20 transfer fails. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NothingToTransfer + +```solidity +error NothingToTransfer() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md new file mode 100644 index 00000000..a55f3985 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md @@ -0,0 +1,391 @@ +# StrategyManager + +_LooksRare protocol team (👀,💎)_ + +> StrategyManager + +This contract handles the addition and the update of execution strategies. + +## Methods + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md new file mode 100644 index 00000000..c6766114 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md @@ -0,0 +1,553 @@ +# TransferManager + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> TransferManager + +This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. + +_"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ + +## Methods + +### allowOperator + +```solidity +function allowOperator(address operator) external nonpayable +``` + +This function allows an operator to be added for the shared transfer system. Once the operator is allowed, users can grant NFT approvals to this operator. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------------- | +| operator | address | Operator address to allow | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### grantApprovals + +```solidity +function grantApprovals(address[] operators) external nonpayable +``` + +This function allows a user to grant approvals for an array of operators. Users cannot grant approvals if the operator is not allowed by this contract's owner. + +_Each operator address must be globally allowed to be approved._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### hasUserApprovedOperator + +```solidity +function hasUserApprovedOperator(address, address) external view returns (bool) +``` + +This returns whether the user has approved the operator address. The first address is the user and the second address is the operator (e.g. LooksRareProtocol). + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isOperatorAllowed + +```solidity +function isOperatorAllowed(address) external view returns (bool) +``` + +This returns whether the operator address is allowed by this contract's owner. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### removeOperator + +```solidity +function removeOperator(address operator) external nonpayable +``` + +This function allows the user to remove an operator for the shared transfer system. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | -------------------------- | +| operator | address | Operator address to remove | + +### revokeApprovals + +```solidity +function revokeApprovals(address[] operators) external nonpayable +``` + +This function allows a user to revoke existing approvals for an array of operators. + +_Each operator address must be approved at the user level to be revoked._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### splitItemsHypercert + +```solidity +function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function splits and transfers a fraction of a hypercert. + +_It does not allow batch transferring._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferBatchItemsAcrossCollections + +```solidity +function transferBatchItemsAcrossCollections(ITransferManager.BatchTransferItem[] items, address from, address to) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------------------------ | ----------- | +| items | ITransferManager.BatchTransferItem[] | undefined | +| from | address | undefined | +| to | address | undefined | + +### transferItemsERC1155 + +```solidity +function transferItemsERC1155(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC1155 collection. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsERC721 + +```solidity +function transferItemsERC721(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC721 collection. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsHypercert + +```solidity +function transferItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single Hypercert. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### ERC1155SafeBatchTransferFromFail + +```solidity +error ERC1155SafeBatchTransferFromFail() +``` + +It is emitted if the ERC1155 safeBatchTransferFrom fails. + +### ERC1155SafeTransferFromFail + +```solidity +error ERC1155SafeTransferFromFail() +``` + +It is emitted if the ERC1155 safeTransferFrom fails. + +### ERC721TransferFromFail + +```solidity +error ERC721TransferFromFail() +``` + +It is emitted if the ERC721 transferFrom fails. + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md new file mode 100644 index 00000000..9011bd50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md @@ -0,0 +1,779 @@ +# TransferSelectorNFT + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> TransferSelectorNFT + +This contract handles the logic for transferring non-fungible items. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md new file mode 100644 index 00000000..37866658 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md @@ -0,0 +1,41 @@ +# BaseStrategy + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md new file mode 100644 index 00000000..c9503939 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md @@ -0,0 +1,212 @@ +# BaseStrategyChainlinkPriceLatency + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategyChainlinkPriceLatency + +This contract allows the owner to define the maximum acceptable Chainlink price latency. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md new file mode 100644 index 00000000..e2d77dd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md @@ -0,0 +1,342 @@ +# StrategyChainlinkUSDDynamicAsk + +_LooksRare protocol team (👀,💎)_ + +> StrategyChainlinkUSDDynamicAsk + +This contract allows a seller to sell an NFT priced in USD and the receivable amount to be in ETH. + +## Methods + +### ETH_USD_PRICE_FEED_DECIMALS + +```solidity +function ETH_USD_PRICE_FEED_DECIMALS() external view returns (uint256) +``` + +_It is possible to call priceFeed.decimals() to get the decimals, but to save gas, it is hard coded instead._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ether (WETH) address. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### priceFeed + +```solidity +function priceFeed() external view returns (contract AggregatorV3Interface) +``` + +ETH/USD Chainlink price feed + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------------ | ----------- | +| \_0 | contract AggregatorV3Interface | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### ChainlinkPriceInvalid + +```solidity +error ChainlinkPriceInvalid() +``` + +It is returned if the Chainlink price is invalid (e.g. negative). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. + +### PriceNotRecentEnough + +```solidity +error PriceNotRecentEnough() +``` + +It is returned if the current block time relative to the latest price's update time is greater than the latency tolerance. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md new file mode 100644 index 00000000..ddec4495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md @@ -0,0 +1,127 @@ +# StrategyCollectionOffer + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> StrategyCollectionOffer + +This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount must be 1 (fractions are NFTs) + +## Methods + +### executeCollectionStrategyWithTakerAsk + +```solidity +function executeCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithAllowlist + +```solidity +function executeCollectionStrategyWithTakerAskWithAllowlist(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithProof + +```solidity +function executeCollectionStrategyWithTakerAskWithProof(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md new file mode 100644 index 00000000..1227878d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md @@ -0,0 +1,83 @@ +# StrategyDutchAuction + +_LooksRare protocol team (👀,💎)_ + +> StrategyDutchAuction + +This contract offers a single execution strategy for users to create Dutch auctions. + +## Methods + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md new file mode 100644 index 00000000..daa427e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -0,0 +1,123 @@ +# StrategyHypercertFractionOffer + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> StrategyHypercertFractionOffer + +This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. + +_Use cases can include tiered pricing; think early bird tickets._ + +## Methods + +### executeHypercertFractionStrategyWithTakerBid + +```solidity +function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeHypercertFractionStrategyWithTakerBidWithAllowlist + +```solidity +function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md new file mode 100644 index 00000000..6a1f0cd5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md @@ -0,0 +1,75 @@ +# StrategyItemIdsRange + +_LooksRare protocol team (👀,💎)_ + +> StrategyItemIdsRange + +This contract offers a single execution strategy for users to bid on a specific amount of items in a range bounded by 2 item ids. + +## Methods + +### executeStrategyWithTakerAsk + +```solidity +function executeStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md new file mode 100644 index 00000000..76918fc5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md @@ -0,0 +1,215 @@ +# OrderValidatorV2A + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderValidatorV2A + +This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) + +_This version does not handle strategies with partial fills._ + +## Methods + +### CRITERIA_GROUPS + +```solidity +function CRITERIA_GROUPS() external view returns (uint256) +``` + +Number of distinct criteria groups checked to evaluate the validity of an order. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### ERC1155_INTERFACE_ID + +```solidity +function ERC1155_INTERFACE_ID() external view returns (bytes4) +``` + +ERC1155 interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_1 + +```solidity +function ERC721_INTERFACE_ID_1() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_2 + +```solidity +function ERC721_INTERFACE_ID_2() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### HYPERCERT_INTERFACE_ID + +```solidity +function HYPERCERT_INTERFACE_ID() external view returns (bytes4) +``` + +Hypercert interfaceId + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### checkMakerOrderValidity + +```solidity +function checkMakerOrderValidity(OrderStructs.Maker makerOrder, bytes signature, OrderStructs.MerkleTree merkleTree) external view returns (uint256[9] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| signature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ---------- | ----------- | +| validationCodes | uint256[9] | undefined | + +### checkMultipleMakerOrderValidities + +```solidity +function checkMultipleMakerOrderValidities(OrderStructs.Maker[] makerOrders, bytes[] signatures, OrderStructs.MerkleTree[] merkleTrees) external view returns (uint256[9][] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------------------------- | ----------- | +| makerOrders | OrderStructs.Maker[] | undefined | +| signatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------------ | ----------- | +| validationCodes | uint256[9][] | undefined | + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +CreatorFeeManager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### deriveProtocolParameters + +```solidity +function deriveProtocolParameters() external nonpayable +``` + +Derive protocol parameters. Anyone can call this function. + +_It allows adjusting if the domain separator or creator fee manager address were to change._ + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +LooksRareProtocol domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +LooksRareProtocol. + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint256) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +TransferManager + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md new file mode 100644 index 00000000..91be29a9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md @@ -0,0 +1,159 @@ +# ProtocolHelpers + +_LooksRare protocol team (👀,💎)_ + +> ProtocolHelpers + +This contract contains helper view functions for order creation. + +## Methods + +### computeDigestMerkleTree + +```solidity +function computeDigestMerkleTree(OrderStructs.MerkleTree merkleTree) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### computeMakerDigest + +```solidity +function computeMakerDigest(OrderStructs.Maker maker) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### verifyMakerSignature + +```solidity +function verifyMakerSignature(OrderStructs.Maker maker, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### verifyMerkleTree + +```solidity +function verifyMerkleTree(OrderStructs.MerkleTree merkleTree, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Errors + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md new file mode 100644 index 00000000..b832744e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md @@ -0,0 +1,60 @@ +# ICreatorFeeManager + +_LooksRare protocol team (👀,💎)_ + +> ICreatorFeeManager + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry royaltyFeeRegistry) +``` + +It returns the royalty fee registry address/interface. + +#### Returns + +| Name | Type | Description | +| ------------------ | ---------------------------- | ------------------------------------- | +| royaltyFeeRegistry | contract IRoyaltyFeeRegistry | Interface of the royalty fee registry | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md new file mode 100644 index 00000000..da683d8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md @@ -0,0 +1,22 @@ +# ICurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> ICurrencyManager + +## Events + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------------------------------- | +| currency | address | Currency address (address(0) = ETH) | +| isAllowed | bool | Whether the currency is allowed | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md new file mode 100644 index 00000000..0e86c75b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md @@ -0,0 +1,99 @@ +# IExecutionManager + +_LooksRare protocol team (👀,💎)_ + +> IExecutionManager + +## Events + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | -------------------------------------- | +| creatorFeeManager | address | Address of the new creator fee manager | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ---------------------------------------- | +| maxCreatorFeeBp | uint256 | New maximum creator fee (in basis point) | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------------------------------------- | +| protocolFeeRecipient | address | Address of the new protocol fee recipient | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md new file mode 100644 index 00000000..393cb24b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md @@ -0,0 +1,41 @@ +# IImmutableCreate2Factory + +## Methods + +### findCreate2Address + +```solidity +function findCreate2Address(bytes32 salt, bytes initializationCode) external view returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | + +### safeCreate2 + +```solidity +function safeCreate2(bytes32 salt, bytes initializationCode) external payable returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md new file mode 100644 index 00000000..e7414f54 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md @@ -0,0 +1,157 @@ +# ILooksRareProtocol + +_LooksRare protocol team (👀,💎)_ + +> ILooksRareProtocol + +## Methods + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +## Events + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------------------------- | +| gasLimitETHTransfer | uint256 | Gas limit for an ETH transfer | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| askUser | address | Address of the ask user | +| bidUser | address | Address of the bid user | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it can be the taker ask user or different) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| bidUser | address | Address of the bid user | +| bidRecipient | address | Address of the recipient of the bid | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it is the maker ask user) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +## Errors + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md new file mode 100644 index 00000000..eaa3f977 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md @@ -0,0 +1,53 @@ +# INonceManager + +_LooksRare protocol team (👀,💎)_ + +> INonceManager + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------- | +| user | address | Address of the user | +| bidNonce | uint256 | New bid nonce | +| askNonce | uint256 | New ask nonce | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ------------------------------- | +| user | address | Address of the user | +| orderNonces | uint256[] | Array of order nonces cancelled | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | -------------------------------- | +| user | address | Address of the user | +| subsetNonces | uint256[] | Array of subset nonces cancelled | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md new file mode 100644 index 00000000..5ed0ef6c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md @@ -0,0 +1,29 @@ +# IRoyaltyFeeRegistry + +_LooksRare protocol team (👀,💎)_ + +> IRoyaltyFeeRegistry + +## Methods + +### royaltyInfo + +```solidity +function royaltyInfo(address collection, uint256 price) external view returns (address receiver, uint256 royaltyFee) +``` + +This function returns the royalty information for a collection at a given transaction price. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | + +#### Returns + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| receiver | address | Receiver address | +| royaltyFee | uint256 | Royalty fee amount | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md new file mode 100644 index 00000000..2b4a45bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md @@ -0,0 +1,41 @@ +# IStrategy + +_LooksRare protocol team (👀,💎)_ + +> IStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool isStrategy) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---------- | ---- | ---------------------------------------------- | +| isStrategy | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md new file mode 100644 index 00000000..ae6ea7b1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md @@ -0,0 +1,84 @@ +# IStrategyManager + +_LooksRare protocol team (👀,💎)_ + +> IStrategyManager + +## Events + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------------- | +| strategyId | uint256 | Id of the new strategy | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the transaction to be executed | +| isMakerBid | bool | Whether the strategyId is for maker bid | +| implementation | address | Address of the implementation of the strategy | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | -------------------------------------------------------- | +| strategyId | uint256 | Id of the strategy | +| isActive | bool | Whether the strategy is active (or not) after the update | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | + +## Errors + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md new file mode 100644 index 00000000..3ba8ca81 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md @@ -0,0 +1,111 @@ +# ITransferManager + +_LooksRare protocol team (👀,💎)_ + +> ITransferManager + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +## Errors + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md new file mode 100644 index 00000000..1b1f41a2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md @@ -0,0 +1,7 @@ +# CurrencyValidator + +_LooksRare protocol team (👀,💎)_ + +> CurrencyValidator + +This library validates the order currency to be the chain's native currency or the specified ERC20 token. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md new file mode 100644 index 00000000..5951cc56 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md @@ -0,0 +1,21 @@ +# LowLevelHypercertCaller + +_bitbeckers_ + +> LowLevelHypercertCaller + +This contract contains low-level calls to transfer ERC1155 tokens. + +## Errors + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### NotAContract + +```solidity +error NotAContract() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md new file mode 100644 index 00000000..943a54cd --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md @@ -0,0 +1,7 @@ +# MerkleProofCalldataWithNodes + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofCalldataWithNodes + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md new file mode 100644 index 00000000..37529181 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md @@ -0,0 +1,7 @@ +# MerkleProofMemory + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofMemory + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md new file mode 100644 index 00000000..6ffa83e2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md @@ -0,0 +1,7 @@ +# OrderStructs + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderStructs + +This library contains all order struct types for the LooksRare protocol (v2). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll new file mode 100644 index 00000000..e2ac6616 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md new file mode 100644 index 00000000..b1434ab0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md @@ -0,0 +1,185 @@ +Hypercerts SDK Documentation / [Exports](modules.md) + +# Hypercert SDK + +## Quickstart Guide + +1. Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +``` + +or + +```bash + yarn add @hypercerts-org/sdk +``` + +2. Import the SDK into your project: + +```bash +import { HypercertClient } from "@hypercerts-org/sdk"; +``` + +3. Create a new instance of the HypercertClient class with your configuration options: + +```js +const client = new HypercertClient({ + chainId: 5, + provider, + signer, + nftStorageToken, + web3StorageToken, +}); +``` + +> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in +> [read-only mode](#read-only-mode) + +4. Use the client object to interact with the Hypercert network. + +For example, you can use the `client.mintClaim` method to create a new claim: + +```js +const tx = await client.mintClaim( + metaData, + totalUnits, + transferRestriction, + overrides, +); +``` + +This will validate the metadata, store it on IPFS, create a new hypercert on-chain and return a transaction receipt. + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more information on how to use the SDK, check out the +[developer documentation](https://hypercerts.org/docs/developer/) and the +[Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. Don't forget to set your +environment variables for your NFT.storage and web3.storage API keys in your .env file. + +## Config + +The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check +the environment variables. + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without a signer or provider. +- The client was initialized with a provider but not a signer. +- The client was initialized with a signer but not a provider. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a +warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief +explanation of each constant: + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphName": "hypercerts-testnet" + } +} +``` + +### Client config properties + +| \| Property | Type | Description | +| ------------------ | -------------------- | -------------------------------------- | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | +| `graphName` | `string` | The name of the Gsubgraph to use. | +| `provider` | `providers.Provider` | A custom provider to use. | +| `signer` | `Signer` | A custom signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +### Environment variables + +To determine the missing configuration values the SDK defaults to the following environment variables: + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +## Client modules + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and +NFT.storage. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the storage, indexer, and contract getters, the HypercertClient allows +developers to easily interact with the various components of the Hypercert system. For example, a developer could use +the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based +on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the +contract. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md new file mode 100644 index 00000000..89f2105f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError + +# Class: ClientError + +An error that is caused by a problem with the client. + +## Hierarchy + +- `Error` + + ↳ **`ClientError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ClientError.md#constructor) + +### Properties + +- [payload](ClientError.md#payload) + +## Constructors + +### constructor + +• **new ClientError**(`message`, `payload?`) + +Creates a new instance of the ClientError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md new file mode 100644 index 00000000..03813867 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md @@ -0,0 +1,66 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError + +# Class: ConfigurationError + +The configuration was invalid + +## Hierarchy + +- `Error` + + ↳ **`ConfigurationError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ConfigurationError.md#constructor) + +### Properties + +- [payload](ConfigurationError.md#payload) + +## Constructors + +### constructor + +• **new ConfigurationError**(`message`, `payload?`) + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `message` | `string` | +| `payload?` | `Object` | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md new file mode 100644 index 00000000..d4c9f7c9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError + +# Class: FetchError + +Fails fetching a remote resource + +## Hierarchy + +- `Error` + + ↳ **`FetchError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](FetchError.md#constructor) + +### Properties + +- [payload](FetchError.md#payload) + +## Constructors + +### constructor + +• **new FetchError**(`message`, `payload?`) + +Creates a new instance of the FetchError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md new file mode 100644 index 00000000..a5a0e900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md @@ -0,0 +1,493 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient + +# Class: HypercertClient + +Hypercerts client factory + +**`Dev`** + +Creates a Hypercerts client instance + +**`Notice`** + +The client is readonly if no signer is set or if the contract address is not set + +**`Param`** + +Hypercerts client configuration + +**`Param`** + +Hypercerts storage object + +## Implements + +- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertClient.md#constructor) + +### Properties + +- [\_config](HypercertClient.md#_config) +- [\_contract](HypercertClient.md#_contract) +- [\_evaluator](HypercertClient.md#_evaluator) +- [\_indexer](HypercertClient.md#_indexer) +- [\_operator](HypercertClient.md#_operator) +- [\_storage](HypercertClient.md#_storage) +- [readonly](HypercertClient.md#readonly) + +### Accessors + +- [contract](HypercertClient.md#contract) +- [indexer](HypercertClient.md#indexer) +- [storage](HypercertClient.md#storage) + +### Methods + +- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClient.md#burnclaimfraction) +- [checkWritable](HypercertClient.md#checkwritable) +- [createAllowlist](HypercertClient.md#createallowlist) +- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) +- [mintClaim](HypercertClient.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClient.md#splitclaimunits) + +## Constructors + +### constructor + +• **new HypercertClient**(`config?`) + +Creates a new instance of the `HypercertClient` class. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | + +#### Defined in + +[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) + +## Properties + +### \_config + +• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) + +#### Defined in + +[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) + +--- + +### \_contract + +• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +#### Defined in + +[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) + +--- + +### \_evaluator + +• `Private` **\_evaluator**: [`default`](internal.default.md) + +#### Defined in + +[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) + +--- + +### \_indexer + +• `Private` **\_indexer**: [`default`](internal.default-1.md) + +#### Defined in + +[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) + +--- + +### \_operator + +• `Private` **\_operator**: `Provider` \| `Signer` + +#### Defined in + +[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) + +--- + +### \_storage + +• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) + +#### Defined in + +[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) + +## Accessors + +### contract + +• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +Gets the HypercertMinter contract used by the client. + +#### Returns + +[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +The contract. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) + +#### Defined in + +[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) + +--- + +### indexer + +• `get` **indexer**(): [`default`](internal.default-1.md) + +Gets the indexer for the client. + +#### Returns + +[`default`](internal.default-1.md) + +The indexer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) + +#### Defined in + +[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) + +--- + +### storage + +• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) + +Gets the storage layer for the client. + +#### Returns + +[`HypercertsStorage`](HypercertsStorage.md) + +The storage layer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) + +#### Defined in + +[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) + +## Methods + +### batchMintClaimFractionsFromAllowlists + +▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | +| `roots?` | `BytesLike`[] | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Implementation of + +HypercertClientInterface.batchMintClaimFractionsFromAllowlists + +#### Defined in + +[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) + +--- + +### burnClaimFraction + +▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> + +Burn a Hypercert claim by providing the claim id + +**`Dev`** + +Burns a Hypercert claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :----------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.burnClaimFraction + +#### Defined in + +[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) + +--- + +### checkWritable + +▸ `Private` **checkWritable**(): `boolean` + +#### Returns + +`boolean` + +#### Defined in + +[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) + +--- + +### createAllowlist + +▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Create a Hypercert claim with an allowlist + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist + +**`Notice`** + +The total number of units in the allowlist must match the total number of units for the Hypercert + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.createAllowlist + +#### Defined in + +[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) + +--- + +### mergeClaimUnits + +▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> + +Merge multiple Hypercert claims fractions into one + +**`Dev`** + +Merges multiple Hypercert claims into one + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :------------------ | +| `claimIds` | `BigNumberish`[] | Hypercert claim ids | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mergeClaimUnits + +#### Defined in + +[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) + +--- + +### mintClaim + +▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units and transfer restrictions + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaim + +#### Defined in + +[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) + +--- + +### mintClaimFractionFromAllowlist + +▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim fraction from an allowlist. + +**`Dev`** + +Verifies the claim proof and mints the claim fraction + +**`Notice`** + +If known, provide the root for client side verification + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `units` | `BigNumberish` | Number of units to mint | +| `proof` | `BytesLike`[] | Merkle proof for the claim | +| `root?` | `BytesLike` | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaimFractionFromAllowlist + +#### Defined in + +[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) + +--- + +### splitClaimUnits + +▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> + +Split a Hypercert's unit into multiple claims with the given fractions + +**`Dev`** + +Submit the ID of the claim to split and new fraction values. + +**`Notice`** + +The sum of the fractions must be equal to the total units of the claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.splitClaimUnits + +#### Defined in + +[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md new file mode 100644 index 00000000..706c14fe --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md @@ -0,0 +1,250 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage + +# Class: HypercertsStorage + +A class that provides storage functionality for Hypercerts. + +## Implements + +- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertsStorage.md#constructor) + +### Properties + +- [nftStorageClient](HypercertsStorage.md#nftstorageclient) +- [readonly](HypercertsStorage.md#readonly) +- [web3StorageClient](HypercertsStorage.md#web3storageclient) + +### Methods + +- [getData](HypercertsStorage.md#getdata) +- [getMetadata](HypercertsStorage.md#getmetadata) +- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) +- [storeData](HypercertsStorage.md#storedata) +- [storeMetadata](HypercertsStorage.md#storemetadata) + +## Constructors + +### constructor + +• **new HypercertsStorage**(`overrides`) + +Creates a new instance of the `HypercertsStorage` class. + +#### Parameters + +| Name | Type | Description | +| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | +| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | + +#### Defined in + +[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) + +## Properties + +### nftStorageClient + +• `Optional` **nftStorageClient**: `NFTStorage` + +The NFT storage client. + +#### Defined in + +[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +Whether the storage is read-only. + +#### Defined in + +[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) + +--- + +### web3StorageClient + +• `Optional` **web3StorageClient**: `any` + +The Web3 storage client. + +#### Defined in + +[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) + +## Methods + +### getData + +▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> + +Gets arbitrary data from Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the data cannot be retrieved. + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :-------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | + +#### Returns + +`Promise`<`any`\> + +A Promise that resolves to the data. + +#### Implementation of + +HypercertStorageInterface.getData + +#### Defined in + +[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) + +--- + +### getMetadata + +▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +Gets metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. E.g. unknown schema + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------ | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | + +#### Returns + +`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +A Promise that resolves to the metadata. + +#### Implementation of + +HypercertStorageInterface.getMetadata + +#### Defined in + +[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) + +--- + +### getNftStorageGatewayUri + +▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` + +#### Parameters + +| Name | Type | +| :------------- | :------- | +| `cidOrIpfsUri` | `string` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) + +--- + +### storeData + +▸ **storeData**(`data`): `Promise`<`CIDString`\> + +Stores arbitrary data in Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Notice`** + +Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Implementation of + +HypercertStorageInterface.storeData + +#### Defined in + +[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) + +--- + +### storeMetadata + +▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> + +Stores metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. + +**`Notice`** + +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------------------------------------------------------- | :--------------------- | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Implementation of + +HypercertStorageInterface.storeMetadata + +#### Defined in + +[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md new file mode 100644 index 00000000..d12c0653 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError + +# Class: InvalidOrMissingError + +The provided value was undefined or empty + +## Hierarchy + +- `Error` + + ↳ **`InvalidOrMissingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](InvalidOrMissingError.md#constructor) + +### Properties + +- [payload](InvalidOrMissingError.md#payload) + +## Constructors + +### constructor + +• **new InvalidOrMissingError**(`message`, `payload?`) + +Creates a new instance of the InvalidOrMissingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md new file mode 100644 index 00000000..028129d8 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError + +# Class: MalformedDataError + +Data doesn't conform to expectations + +## Hierarchy + +- `Error` + + ↳ **`MalformedDataError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MalformedDataError.md#constructor) + +### Properties + +- [payload](MalformedDataError.md#payload) + +## Constructors + +### constructor + +• **new MalformedDataError**(`message`, `payload?`) + +Creates a new instance of the MalformedDataError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md new file mode 100644 index 00000000..de284494 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError + +# Class: MintingError + +Minting transaction failed + +## Hierarchy + +- `Error` + + ↳ **`MintingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MintingError.md#constructor) + +### Properties + +- [payload](MintingError.md#payload) + +## Constructors + +### constructor + +• **new MintingError**(`message`, `payload?`) + +Creates a new instance of the MintingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md new file mode 100644 index 00000000..0dcf0291 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError + +# Class: StorageError + +Fails storing to a remote resource + +## Hierarchy + +- `Error` + + ↳ **`StorageError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](StorageError.md#constructor) + +### Properties + +- [payload](StorageError.md#payload) + +## Constructors + +### constructor + +• **new StorageError**(`message`, `payload?`) + +Creates a new instance of the StorageError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md new file mode 100644 index 00000000..5fdb25e0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md @@ -0,0 +1,71 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError + +# Class: UnknownSchemaError + +Schema could not be loaded + +## Hierarchy + +- `Error` + + ↳ **`UnknownSchemaError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnknownSchemaError.md#constructor) + +### Properties + +- [payload](UnknownSchemaError.md#payload) + +## Constructors + +### constructor + +• **new UnknownSchemaError**(`message`, `payload?`) + +Creates a new instance of the UnknownSchemaError class. + +#### Parameters + +| Name | Type | Description | +| :------------------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.schemaName` | `string` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :----------- | :------- | +| `schemaName` | `string` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md new file mode 100644 index 00000000..0964b138 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md @@ -0,0 +1,72 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError + +# Class: UnsupportedChainError + +This blockchain is not yet supported +Please file an issue + +## Hierarchy + +- `Error` + + ↳ **`UnsupportedChainError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnsupportedChainError.md#constructor) + +### Properties + +- [payload](UnsupportedChainError.md#payload) + +## Constructors + +### constructor + +• **new UnsupportedChainError**(`message`, `payload?`) + +Creates a new instance of the UnsupportedChainError class. + +#### Parameters + +| Name | Type | Description | +| :---------------- | :---------------------------------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.chainID` | `undefined` \| `string` \| `number` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :-------- | :---------------------------------- | +| `chainID` | `undefined` \| `string` \| `number` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md new file mode 100644 index 00000000..1b94a629 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md @@ -0,0 +1,278 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +A class that provides indexing functionality for Hypercerts. + +## Implements + +- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default-1.md#constructor) + +### Properties + +- [\_graphClient](internal.default-1.md#_graphclient) + +### Accessors + +- [graphClient](internal.default-1.md#graphclient) + +### Methods + +- [claimById](internal.default-1.md#claimbyid) +- [claimsByOwner](internal.default-1.md#claimsbyowner) +- [firstClaims](internal.default-1.md#firstclaims) +- [fractionById](internal.default-1.md#fractionbyid) +- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) +- [fractionsByOwner](internal.default-1.md#fractionsbyowner) + +## Constructors + +### constructor + +• **new default**(`options`) + +Creates a new instance of the `HypercertIndexer` class. + +#### Parameters + +| Name | Type | Description | +| :------------------ | :------- | :----------------------------------------- | +| `options` | `Object` | The configuration options for the indexer. | +| `options.graphUrl?` | `string` | - | + +#### Defined in + +[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) + +## Properties + +### \_graphClient + +• `Private` **\_graphClient**: `Object` + +The Graph client used by the indexer. + +#### Type declaration + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Defined in + +[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) + +## Accessors + +### graphClient + +• `get` **graphClient**(): `Object` + +Gets the Graph client used by the indexer. + +#### Returns + +`Object` + +The Graph client. + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Implementation of + +[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) + +#### Defined in + +[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) + +## Methods + +### claimById + +▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +Gets a claim by its ID. + +#### Parameters + +| Name | Type | Description | +| :--- | :------- | :------------------- | +| `id` | `string` | The ID of the claim. | + +#### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +A Promise that resolves to the claim. + +#### Implementation of + +HypercertIndexerInterface.claimById + +#### Defined in + +[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) + +--- + +### claimsByOwner + +▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +Gets the claims owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.claimsByOwner + +#### Defined in + +[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) + +--- + +### firstClaims + +▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +Gets the most recent claims. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :-------------------- | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.firstClaims + +#### Defined in + +[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) + +--- + +### fractionById + +▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +Gets a claim token by its ID. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------- | +| `fractionId` | `string` | The ID of the claim token. | + +#### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +A Promise that resolves to the claim token. + +#### Implementation of + +HypercertIndexerInterface.fractionById + +#### Defined in + +[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) + +--- + +### fractionsByClaim + +▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +Gets the claim tokens for a given claim. + +#### Parameters + +| Name | Type | Default value | Description | +| :-------- | :----------------------------------------- | :------------------- | :-------------------- | +| `claimId` | `string` | `undefined` | The ID of the claim. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByClaim + +#### Defined in + +[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) + +--- + +### fractionsByOwner + +▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +Gets the claim tokens owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByOwner + +#### Defined in + +[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md new file mode 100644 index 00000000..1538ce61 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md @@ -0,0 +1,131 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +The EasEvaluator class provides methods for signing off-chain attestations of evaluations. +Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. + +## Table of contents + +### Constructors + +- [constructor](internal.default-2.md#constructor) + +### Properties + +- [offChain](internal.default-2.md#offchain) +- [readonly](internal.default-2.md#readonly) +- [signer](internal.default-2.md#signer) + +### Methods + +- [getSignature](internal.default-2.md#getsignature) +- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) + +## Constructors + +### constructor + +• **new default**(`config`) + +Creates a new EasEvaluator instance. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | + +#### Defined in + +[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) + +## Properties + +### offChain + +• **offChain**: `Offchain` + +The Offchain instance used for signing off-chain attestations. + +#### Defined in + +[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +The TypedDataSigner instance used for signing typed data. + +#### Defined in + +[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) + +## Methods + +### getSignature + +▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> + +Gets a signature for an off-chain attestation. + +#### Parameters + +| Name | Type | Description | +| :------------ | :------- | :------------------------------------------------ | +| `encodedData` | `string` | The encoded data to sign. | +| `recipient` | `string` | The address of the recipient of the attestation. | +| `schemaUid` | `string` | The UID of the schema to use for the attestation. | + +#### Returns + +`Promise`<`SignedOffchainAttestation`\> + +- The signature for the attestation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) + +--- + +### signOfflineEvaluation + +▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> + +Signs an offline evaluation. + +**`Throws`** + +- If the evaluation data is malformed. + +#### Parameters + +| Name | Type | Description | +| :----------- | :----------------------------------------------- | :--------------------------- | +| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | + +#### Returns + +`Promise`<`undefined` \| `SignedOffchainAttestation`\> + +- The signature for the evaluation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md new file mode 100644 index 00000000..86daa5e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md @@ -0,0 +1,110 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +## Implements + +- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default.md#constructor) + +### Properties + +- [eas](internal.default.md#eas) +- [readonly](internal.default.md#readonly) +- [signer](internal.default.md#signer) +- [storage](internal.default.md#storage) + +### Methods + +- [submitEvaluation](internal.default.md#submitevaluation) + +## Constructors + +### constructor + +• **new default**(`config?`) + +#### Parameters + +| Name | Type | +| :------- | :------------------------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | + +#### Defined in + +[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) + +## Properties + +### eas + +• **eas**: [`default`](internal.default-2.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +#### Defined in + +[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) + +--- + +### storage + +• **storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) + +## Methods + +### submitEvaluation + +▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------------------------ | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | + +#### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Implementation of + +EvaluatorInterface.submitEvaluation + +#### Defined in + +[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md new file mode 100644 index 00000000..b4af6279 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md @@ -0,0 +1,39 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError + +# Interface: CustomError + +An interface for errors that have a specific type. + +## Implemented by + +- [`ClientError`](../classes/ClientError.md) +- [`ConfigurationError`](../classes/ConfigurationError.md) +- [`FetchError`](../classes/FetchError.md) +- [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) +- [`MalformedDataError`](../classes/MalformedDataError.md) +- [`MintingError`](../classes/MintingError.md) +- [`StorageError`](../classes/StorageError.md) +- [`UnknownSchemaError`](../classes/UnknownSchemaError.md) +- [`UnsupportedChainError`](../classes/UnsupportedChainError.md) + +## Table of contents + +### Properties + +- [payload](CustomError.md#payload) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Defined in + +[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md new file mode 100644 index 00000000..4606b46e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation + +# Interface: DuplicateEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) +- [explanation](DuplicateEvaluation.md#explanation) +- [realHypercert](DuplicateEvaluation.md#realhypercert) +- [type](DuplicateEvaluation.md#type) + +## Properties + +### duplicateHypercerts + +• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] + +#### Defined in + +[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) + +--- + +### explanation + +• **explanation**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) + +--- + +### realHypercert + +• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) + +--- + +### type + +• **type**: `"duplicate"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md new file mode 100644 index 00000000..205b7004 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation + +# Interface: EASEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](EASEvaluation.md#chainid) +- [contract](EASEvaluation.md#contract) +- [type](EASEvaluation.md#type) +- [uid](EASEvaluation.md#uid) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) + +--- + +### type + +• **type**: `"EAS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) + +--- + +### uid + +• **uid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md new file mode 100644 index 00000000..3dcea656 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -0,0 +1,167 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](HypercertClaimdata.md#contributors) +- [impact_scope](HypercertClaimdata.md#impact_scope) +- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) +- [rights](HypercertClaimdata.md#rights) +- [work_scope](HypercertClaimdata.md#work_scope) +- [work_timeframe](HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md new file mode 100644 index 00000000..0483b520 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -0,0 +1,341 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface + +# Interface: HypercertClientInterface + +The interface for the Hypercert client. + +## Hierarchy + +- [`HypercertClientMethods`](HypercertClientMethods.md) + +- [`HypercertClientState`](HypercertClientState.md) + + ↳ **`HypercertClientInterface`** + +## Implemented by + +- [`HypercertClient`](../classes/HypercertClient.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) +- [contract](HypercertClientInterface.md#contract) +- [createAllowlist](HypercertClientInterface.md#createallowlist) +- [indexer](HypercertClientInterface.md#indexer) +- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) +- [mintClaim](HypercertClientInterface.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) +- [readonly](HypercertClientInterface.md#readonly) +- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) +- [storage](HypercertClientInterface.md#storage) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md new file mode 100644 index 00000000..734ccbee --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -0,0 +1,239 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods + +# Interface: HypercertClientMethods + +The methods for the Hypercert client. + +## Hierarchy + +- **`HypercertClientMethods`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) +- [createAllowlist](HypercertClientMethods.md#createallowlist) +- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) +- [mintClaim](HypercertClientMethods.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md new file mode 100644 index 00000000..2d90a599 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState + +# Interface: HypercertClientState + +The state of the Hypercert client. + +## Hierarchy + +- **`HypercertClientState`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [contract](HypercertClientState.md#contract) +- [indexer](HypercertClientState.md#indexer) +- [readonly](HypercertClientState.md#readonly) +- [storage](HypercertClientState.md#storage) + +## Properties + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md new file mode 100644 index 00000000..6ebed93a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -0,0 +1,47 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema + +# Interface: HypercertEvaluationSchema + +Schema for evaluating Hypercerts across different sources and evaluation types + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [creator](HypercertEvaluationSchema.md#creator) +- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) +- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) + +## Properties + +### creator + +• **creator**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) + +--- + +### evaluationData + +• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) + +--- + +### evaluationSource + +• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md new file mode 100644 index 00000000..f18c409f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -0,0 +1,176 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface + +# Interface: HypercertIndexerInterface + +## Implemented by + +- [`default`](../classes/internal.default-1.md) + +## Table of contents + +### Properties + +- [claimById](HypercertIndexerInterface.md#claimbyid) +- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) +- [firstClaims](HypercertIndexerInterface.md#firstclaims) +- [fractionById](HypercertIndexerInterface.md#fractionbyid) +- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) +- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) +- [graphClient](HypercertIndexerInterface.md#graphclient) + +## Properties + +### claimById + +• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Type declaration + +▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +##### Parameters + +| Name | Type | +| :--- | :------- | +| `id` | `string` | + +##### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) + +--- + +### claimsByOwner + +• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) + +--- + +### firstClaims + +• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Type declaration + +▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) + +--- + +### fractionById + +• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +##### Parameters + +| Name | Type | +| :----------- | :------- | +| `fractionId` | `string` | + +##### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) + +--- + +### fractionsByClaim + +• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Type declaration + +▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `claimId` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) + +--- + +### fractionsByOwner + +• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) + +--- + +### graphClient + +• **graphClient**: `any` + +#### Defined in + +[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md new file mode 100644 index 00000000..d65362f3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md @@ -0,0 +1,123 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata + +# Interface: HypercertMetadata + +Claim data for hypercert. ERC1155 Metadata compliant + +## Table of contents + +### Properties + +- [allowList](HypercertMetadata.md#allowlist) +- [description](HypercertMetadata.md#description) +- [external_url](HypercertMetadata.md#external_url) +- [hypercert](HypercertMetadata.md#hypercert) +- [image](HypercertMetadata.md#image) +- [name](HypercertMetadata.md#name) +- [properties](HypercertMetadata.md#properties) +- [ref](HypercertMetadata.md#ref) +- [version](HypercertMetadata.md#version) + +## Properties + +### allowList + +• `Optional` **allowList**: `string` + +A CID pointer to the merke tree proof json on ipfs + +#### Defined in + +[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) + +--- + +### description + +• **description**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) + +--- + +### external_url + +• `Optional` **external_url**: `string` + +An url pointing to the external website of the project + +#### Defined in + +[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) + +--- + +### hypercert + +• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) + +#### Defined in + +[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) + +--- + +### image + +• **image**: `string` + +A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. + +#### Defined in + +[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) + +--- + +### name + +• **name**: `string` + +Identifies the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) + +--- + +### properties + +• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] + +#### Defined in + +[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) + +--- + +### ref + +• `Optional` **ref**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) + +--- + +### version + +• `Optional` **version**: `string` + +The version of Hypercert schema used to describe this hypercert + +#### Defined in + +[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md new file mode 100644 index 00000000..773c41d3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer + +# Interface: HypercertPointer + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](HypercertPointer.md#chainid) +- [claimId](HypercertPointer.md#claimid) +- [contract](HypercertPointer.md#contract) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) + +--- + +### claimId + +• **claimId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md new file mode 100644 index 00000000..8ffda51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -0,0 +1,130 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface + +# Interface: HypercertStorageInterface + +The interface for the Hypercert storage layer. + +## Implemented by + +- [`HypercertsStorage`](../classes/HypercertsStorage.md) + +## Table of contents + +### Properties + +- [getData](HypercertStorageInterface.md#getdata) +- [getMetadata](HypercertStorageInterface.md#getmetadata) +- [storeData](HypercertStorageInterface.md#storedata) +- [storeMetadata](HypercertStorageInterface.md#storemetadata) + +## Properties + +### getData + +• **getData**: (`cidOrIpfsUri`: `string`) => `Promise`<`unknown`\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<`unknown`\> + +Retrieves arbitrary data from IPFS. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | + +##### Returns + +`Promise`<`unknown`\> + +A Promise that resolves to the retrieved data. + +#### Defined in + +[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) + +--- + +### getMetadata + +• **getMetadata**: (`cidOrIpfsUri`: `string`) => `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +Retrieves the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :----------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | + +##### Returns + +`Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +A Promise that resolves to the retrieved metadata. + +#### Defined in + +[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) + +--- + +### storeData + +• **storeData**: (`data`: `unknown`) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`data`): `Promise`<`CIDString`\> + +Stores arbitrary data on IPFS. + +##### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Defined in + +[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) + +--- + +### storeMetadata + +• **storeMetadata**: (`metadata`: [`HypercertMetadata`](HypercertMetadata.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`metadata`): `Promise`<`CIDString`\> + +Stores the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------------ | :--------------------- | +| `metadata` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Defined in + +[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md new file mode 100644 index 00000000..5f5871f2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -0,0 +1,34 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation + +# Interface: IPFSEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [cid](IPFSEvaluation.md#cid) +- [type](IPFSEvaluation.md#type) + +## Properties + +### cid + +• **cid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) + +--- + +### type + +• **type**: `"IPFS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md new file mode 100644 index 00000000..3e4b3b92 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation + +# Interface: SimpleTextEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [hypercert](SimpleTextEvaluation.md#hypercert) +- [text](SimpleTextEvaluation.md#text) +- [type](SimpleTextEvaluation.md#type) + +## Properties + +### hypercert + +• **hypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) + +--- + +### text + +• **text**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) + +--- + +### type + +• **type**: `"simpleText"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md new file mode 100644 index 00000000..53ac36ed --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md @@ -0,0 +1,43 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface + +# Interface: EvaluatorInterface + +[internal](../modules/internal.md).EvaluatorInterface + +## Implemented by + +- [`default`](../classes/internal.default.md) + +## Table of contents + +### Properties + +- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) + +## Properties + +### submitEvaluation + +• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +##### Parameters + +| Name | Type | Description | +| :----------- | :---------------------------------------------------------- | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | + +##### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Defined in + +[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md new file mode 100644 index 00000000..273912bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md @@ -0,0 +1,169 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +[internal](../modules/internal.md).HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](internal.HypercertClaimdata.md#contributors) +- [impact_scope](internal.HypercertClaimdata.md#impact_scope) +- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) +- [rights](internal.HypercertClaimdata.md#rights) +- [work_scope](internal.HypercertClaimdata.md#work_scope) +- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md new file mode 100644 index 00000000..3f4ea346 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md @@ -0,0 +1,17 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter + +# Interface: HypercertMinter + +[internal](../modules/internal.md).HypercertMinter + +Hypercert contract interface. + +**`Notice`** + +hacky loop to get typedoc to generate all the docs + +## Hierarchy + +- `HypercertMinter` + + ↳ **`HypercertMinter`** diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md new file mode 100644 index 00000000..15998930 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md @@ -0,0 +1,638 @@ +[Hypercerts SDK Documentation](README.md) / Exports + +# Hypercerts SDK Documentation + +## Table of contents + +### References + +- [Claim](modules.md#claim) +- [ClaimToken](modules.md#claimtoken) +- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) + +### Modules + +- [internal](modules/internal.md) + +### Classes + +- [ClientError](classes/ClientError.md) +- [ConfigurationError](classes/ConfigurationError.md) +- [FetchError](classes/FetchError.md) +- [HypercertClient](classes/HypercertClient.md) +- [HypercertsStorage](classes/HypercertsStorage.md) +- [InvalidOrMissingError](classes/InvalidOrMissingError.md) +- [MalformedDataError](classes/MalformedDataError.md) +- [MintingError](classes/MintingError.md) +- [StorageError](classes/StorageError.md) +- [UnknownSchemaError](classes/UnknownSchemaError.md) +- [UnsupportedChainError](classes/UnsupportedChainError.md) + +### Interfaces + +- [CustomError](interfaces/CustomError.md) +- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) +- [EASEvaluation](interfaces/EASEvaluation.md) +- [HypercertClaimdata](interfaces/HypercertClaimdata.md) +- [HypercertClientInterface](interfaces/HypercertClientInterface.md) +- [HypercertClientMethods](interfaces/HypercertClientMethods.md) +- [HypercertClientState](interfaces/HypercertClientState.md) +- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) +- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) +- [HypercertMetadata](interfaces/HypercertMetadata.md) +- [HypercertPointer](interfaces/HypercertPointer.md) +- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) +- [IPFSEvaluation](interfaces/IPFSEvaluation.md) +- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) + +### Type Aliases + +- [AllowlistEntry](modules.md#allowlistentry) +- [Deployment](modules.md#deployment) +- [EvaluationData](modules.md#evaluationdata) +- [EvaluationSource](modules.md#evaluationsource) +- [HypercertClientConfig](modules.md#hypercertclientconfig) +- [HypercertClientProps](modules.md#hypercertclientprops) +- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) +- [HypercertStorageConfig](modules.md#hypercertstorageconfig) +- [HypercertsSdkError](modules.md#hypercertssdkerror) +- [QueryParams](modules.md#queryparams) +- [SupportedChainIds](modules.md#supportedchainids) +- [TransferRestrictions](modules.md#transferrestrictions) + +### Properties + +- [ClaimByIdQuery](modules.md#claimbyidquery) + +### Variables + +- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) +- [TransferRestrictions](modules.md#transferrestrictions-1) + +### Functions + +- [execute](modules.md#execute) +- [formatDate](modules.md#formatdate) +- [formatHypercertData](modules.md#formathypercertdata) +- [formatUnixTime](modules.md#formatunixtime) +- [validateAllowlist](modules.md#validateallowlist) +- [validateClaimData](modules.md#validateclaimdata) +- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) +- [validateMetaData](modules.md#validatemetadata) +- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) +- [verifyMerkleProof](modules.md#verifymerkleproof) +- [verifyMerkleProofs](modules.md#verifymerkleproofs) + +## References + +### Claim + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimToken + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimTokensByClaimQuery + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +## Type Aliases + +### AllowlistEntry + +Ƭ **AllowlistEntry**: `Object` + +Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol + +**`Param`** + +Address of the recipient + +**`Param`** + +Number of units allocated to the recipient + +#### Type declaration + +| Name | Type | +| :-------- | :------------- | +| `address` | `string` | +| `units` | `BigNumberish` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) + +--- + +### Deployment + +Ƭ **Deployment**: `Object` + +Represents a deployment of a contract on a specific network. + +#### Type declaration + +| Name | Type | Description | +| :---------------- | :------- | :--------------------------------------------------------------------------------------- | +| `chainId` | `number` | The ID of the network on which the contract is deployed. | +| `chainName` | `string` | The name of the network on which the contract is deployed. | +| `contractAddress` | `string` | The address of the deployed contract. | +| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | + +#### Defined in + +[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) + +--- + +### EvaluationData + +Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) + +This file was automatically generated by json-schema-to-typescript. +DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +and run json-schema-to-typescript to regenerate this file. + +#### Defined in + +[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) + +--- + +### EvaluationSource + +Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) + +--- + +### HypercertClientConfig + +Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } + +Configuration options for the Hypercert client. + +#### Defined in + +[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) + +--- + +### HypercertClientProps + +Ƭ **HypercertClientProps**: `Object` + +The props for the Hypercert client. + +#### Type declaration + +| Name | Type | Description | +| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | +| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | + +#### Defined in + +[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) + +--- + +### HypercertEvaluatorConfig + +Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } + +Configuration options for the Hypercert evaluator. + +**`Note`** + +The signer is required for submitting evaluations. + +#### Defined in + +[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) + +--- + +### HypercertStorageConfig + +Ƭ **HypercertStorageConfig**: `Object` + +Configuration options for the Hypercert storage layer. + +**`Note`** + +The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. + +#### Type declaration + +| Name | Type | Description | +| :------------------ | :------- | :------------------------------ | +| `nftStorageToken?` | `string` | The API token for NFT.storage. | +| `web3StorageToken?` | `string` | The API token for Web3.storage. | + +#### Defined in + +[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) + +--- + +### HypercertsSdkError + +Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) + +#### Defined in + +[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) + +--- + +### QueryParams + +Ƭ **QueryParams**: `Object` + +#### Index signature + +▪ [key: `string`]: `any` + +#### Type declaration + +| Name | Type | +| :---------------- | :------------------ | +| `first` | `number` | +| `orderDirections` | `"asc"` \| `"desc"` | +| `skip` | `number` | + +#### Defined in + +[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) + +--- + +### SupportedChainIds + +Ƭ **SupportedChainIds**: `5` \| `10` + +#### Defined in + +[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) + +--- + +### TransferRestrictions + +Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Properties + +### ClaimByIdQuery + +• **ClaimByIdQuery**: `any` + +## Variables + +### INDEFINITE_DATE_STRING + +• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` + +#### Defined in + +[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) + +--- + +### TransferRestrictions + +• `Const` **TransferRestrictions**: `Object` + +Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol + +**`Dev`** + +AllowAll: All transfers are allowed + +**`Dev`** + +DisallowAll: All transfers are disallowed + +**`Dev`** + +FromCreatorOnly: Only the creator can transfer the Hypercert + +#### Type declaration + +| Name | Type | +| :---------------- | :--- | +| `AllowAll` | `0` | +| `DisallowAll` | `1` | +| `FromCreatorOnly` | `2` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Functions + +### execute + +▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------- | +| `document` | `GraphQLOperation`<`any`, `any`\> | +| `variables` | `any` | +| `context?` | `any` | +| `rootValue?` | `any` | +| `operationName?` | `string` | + +#### Returns + +`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Defined in + +node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 + +--- + +### formatDate + +▸ **formatDate**(`date`): `string` + +#### Parameters + +| Name | Type | +| :----- | :----- | +| `date` | `Date` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) + +--- + +### formatHypercertData + +▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) + +Formats input data to an object containing HypercertMetadata including appropriate labels + +#### Parameters + +| Name | Type | +| :----------------------- | :----------------------------------------------- | +| `«destructured»` | `Object` | +| › `contributors` | `string`[] | +| › `description` | `string` | +| › `excludedImpactScope` | `string`[] | +| › `excludedRights` | `string`[] | +| › `excludedWorkScope` | `string`[] | +| › `external_url?` | `string` | +| › `image` | `string` | +| › `impactScope` | `string`[] | +| › `impactTimeframeEnd` | `number` | +| › `impactTimeframeStart` | `number` | +| › `name` | `string` | +| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | +| › `rights` | `string`[] | +| › `version` | `string` | +| › `workScope` | `string`[] | +| › `workTimeframeEnd` | `number` | +| › `workTimeframeStart` | `number` | + +#### Returns + +[`FormatResult`](modules/internal.md#formatresult) + +#### Defined in + +[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) + +--- + +### formatUnixTime + +▸ **formatUnixTime**(`seconds`): `string` + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `seconds` | `number` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) + +--- + +### validateAllowlist + +▸ **validateAllowlist**(`data`, `units`): `Object` + +Validates the data for an allowlist. + +#### Parameters + +| Name | Type | Description | +| :------ | :---------------------------------------------- | :------------------------------------------ | +| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | +| `units` | `BigNumberish` | The total number of units in the allowlist. | + +#### Returns + +`Object` + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +| Name | Type | +| :------- | :------------------------------------------ | +| `errors` | `Record`<`string`, `string` \| `string`[]\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) + +--- + +### validateClaimData + +▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :------------------------------------------------------- | :-------------------- | +| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) + +--- + +### validateDuplicateEvaluationData + +▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a duplicate evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :--------------------------------------------------------- | :-------------------- | +| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) + +--- + +### validateMetaData + +▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------- | :-------------------- | +| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) + +--- + +### validateSimpleTextEvaluationData + +▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------------- | :-------------------- | +| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) + +--- + +### verifyMerkleProof + +▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` + +Verifies a Merkle proof for a given address and units. + +**`Throws`** + +If the Merkle proof verification fails. + +#### Parameters + +| Name | Type | Description | +| :-------------- | :------------- | :-------------------------------------- | +| `root` | `string` | The Merkle root hash to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish` | The units to verify. | +| `proof` | `string`[] | The Merkle proof to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) + +--- + +### verifyMerkleProofs + +▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` + +Batch verifies Merkle proofs for multiple roots, units and proofs for a single address + +**`Throws`** + +If the Merkle proof verification fails. + +**`Notice`** + +Wrapper around `verifyMerkleProof` to batch verify multiple proofs + +#### Parameters + +| Name | Type | Description | +| :-------------- | :--------------- | :---------------------------------------- | +| `roots` | `string`[] | The Merkle root hashes to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish`[] | The units to verify. | +| `proofs` | `string`[][] | The Merkle proofs to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md new file mode 100644 index 00000000..d20a3804 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md @@ -0,0 +1,307 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal + +# Module: internal + +## Table of contents + +### Classes + +- [default](../classes/internal.default.md) +- [default](../classes/internal.default-1.md) +- [default](../classes/internal.default-2.md) + +### Interfaces + +- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) +- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) +- [HypercertMinter](../interfaces/internal.HypercertMinter.md) + +### Type Aliases + +- [Claim](internal.md#claim) +- [ClaimByIdQuery](internal.md#claimbyidquery) +- [ClaimToken](internal.md#claimtoken) +- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) +- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) +- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) +- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) +- [Exact](internal.md#exact) +- [FormatResult](internal.md#formatresult) +- [InputMaybe](internal.md#inputmaybe) +- [Maybe](internal.md#maybe) +- [OrderDirection](internal.md#orderdirection) +- [RecentClaimsQuery](internal.md#recentclaimsquery) +- [Scalars](internal.md#scalars) +- [ValidationResult](internal.md#validationresult) + +## Type Aliases + +### Claim + +Ƭ **Claim**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | +| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | + +#### Defined in + +[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) + +--- + +### ClaimByIdQuery + +Ƭ **ClaimByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | + +#### Defined in + +[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) + +--- + +### ClaimToken + +Ƭ **ClaimToken**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :--------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `claim` | [`Claim`](internal.md#claim) | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | + +#### Defined in + +[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) + +--- + +### ClaimTokenByIdQuery + +Ƭ **ClaimTokenByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | + +#### Defined in + +[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) + +--- + +### ClaimTokensByClaimQuery + +Ƭ **ClaimTokensByClaimQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :------------------------------------------------------------------------------------------------------------------ | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) + +--- + +### ClaimTokensByOwnerQuery + +Ƭ **ClaimTokensByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | + +#### Defined in + +[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) + +--- + +### ClaimsByOwnerQuery + +Ƭ **ClaimsByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) + +--- + +### Exact + +Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } + +#### Type parameters + +| Name | Type | +| :--- | :--------------- | +| `T` | extends `Object` | + +#### Defined in + +[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) + +--- + +### FormatResult + +Ƭ **FormatResult**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------ | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | +| `errors` | `Record`<`string`, `string`\> \| `null` | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) + +--- + +### InputMaybe + +Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) + +--- + +### Maybe + +Ƭ **Maybe**<`T`\>: `T` \| `null` + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) + +--- + +### OrderDirection + +Ƭ **OrderDirection**: `"asc"` \| `"desc"` + +Defines the order direction, either ascending or descending + +#### Defined in + +[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) + +--- + +### RecentClaimsQuery + +Ƭ **RecentClaimsQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) + +--- + +### Scalars + +Ƭ **Scalars**: `Object` + +All built-in and custom scalars, mapped to their actual values + +#### Type declaration + +| Name | Type | +| :----------- | :-------- | +| `BigDecimal` | `any` | +| `BigInt` | `any` | +| `Boolean` | `boolean` | +| `Bytes` | `any` | +| `Float` | `number` | +| `ID` | `string` | +| `Int` | `number` | +| `Int8` | `any` | +| `String` | `string` | + +#### Defined in + +[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) + +--- + +### ValidationResult + +Ƭ **ValidationResult**: `Object` + +The result of a validation. + +**`Property`** + +Whether the data is valid. + +**`Property`** + +A map of errors, where the key is the field that failed validation and the value is the error message. + +#### Type declaration + +| Name | Type | +| :------- | :---------------------------- | +| `errors` | `Record`<`string`, `string`\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md new file mode 100644 index 00000000..b591d11d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md @@ -0,0 +1,12 @@ +# Burning + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Burning fraction tokens + +You can only burn fraction tokens that you own. Hypercert claims cannot be burned once minted. +You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). + +```js +const txn = await hypercerts.burnFraction({ tokenId }); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md new file mode 100644 index 00000000..b26fc0e8 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md @@ -0,0 +1,112 @@ +# Hypercert Client Configuration + +The client provides a high level interface that communicates with the Graph, IPFS and the evm. For easy setup we harmonised the configuration into a flow that allows for configuration with different levels of specificity. + +## Configuration + +### Setup + +The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: + +1. Overrides declared in `Partial` +2. Environment variables exposed via `process.env` + +Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. + +We then process the rest of the overrides and possible environment variables to customise the default configuration. + +To get started quickly you can either: + +- set `process.env.DEFAULT_CHAIN_ID` to 5 or 10 +- initialize a new client by calling `new HypercertClient({chainId: 5})` (or 10) + +Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without an operator. +- The client was initialized with an operator without signing abilities. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the read-only property of the `HypercertClient` instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" + } +} +``` + +You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. + +### Client config properties + +| Property | Type | Description | +| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `graphUrl` | `string` | The url of the subgraph to use. | +| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +### Environment variables + +You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. + +We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +In your `.env` file: + +```bash +LOG_LEVEL="info" +``` + +The SDK logger supports four log levels: `error`, `warn`, `info`, and `debug`. + +- The `error` log level is used to log errors that occur in the SDK. +- The `warn` log level is used to log warnings that do not necessarily indicate an error, but may be important to investigate. +- The `info` log level is used to log general information about the SDK's state or behavior. +- The `debug` log level is used to log detailed information that is useful for debugging purposes. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md new file mode 100644 index 00000000..60f4e5e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md @@ -0,0 +1,18 @@ +# Errors in the SDK + +Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. + +### Handling Errors + +To support debugging we've implemented some custom errors. + +| Error | Reason | Payload | +| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | +| ClientError | An error caused by the client | `{ [key: string]: unknown }` | +| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | +| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | +| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | +| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | +| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | +| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | +| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md new file mode 100644 index 00000000..c5399a4f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md @@ -0,0 +1,13 @@ +# Evaluations + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Respond / or contest an evaluation + +To create an evaluation of a hypercert + +```js +TODO; +``` + +_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md new file mode 100644 index 00000000..d5ff1226 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md @@ -0,0 +1,57 @@ +# Minting + +## Token design + +Hypercerts are semi-fungible tokens. +Thus, each hypercert is represented on-chain by a group of fraction tokens, +each representing a fraction of ownership over the hypercert. +If you want to split your fraction token, or merge multiple tokens into one, +check out the section on [splitting and merging](./split-merge.md). + +## Minting your first hypercert + +To mint a hypercert you need to provide the `metadata`, total amount of `units` and the preferred `TransferRestrictions`. +The resulting hypercert will be wholly owned by the creator. + +```js +import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" + +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; + +const tx: Promise = await hypercerts.mintClaim({ + metadata, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **Note** If you did not initialize your HypercertsClient with an `operator`, `nftStorageToken` and `web3StorageToken`, the client will run in [read-only mode](#read-only-mode) and this will fail. + +Let's see what happens under the hood: + +First, `mintClaim` checks that the client is not `read only` and that the operator is a `Signer`. If not, it throws an `InvalidOrMissingError`. + +Next, the function validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. The function then stores the metadata on `IPFS` using the `storeMetadata` method and returns the `CID` for the metadata. + +Finally, we call the mintClaim function on the contract with the signer `address`, total `units`, `CID`, and `transfer restriction` as parameters. If `overrides` are provided, the function uses them to send the transaction. Otherwise, it sends the transaction without overrides. + +## Transfer restrictions + +When minting a Hypercert, you must pass in a `TransferRestriction` policy. For now there are only 3 implemented policies: + +```js +enum TransferRestrictions { + // Unrestricted + AllowAll, + // All transfers disabled after minting + DisallowAll, + // Only the original creator can transfer + FromCreatorOnly +} +``` + +## Reference + +See the [code](https://github.com/hypercerts-org/hypercerts/tree/main/sdk/src/client.ts) +for more details on how we implement minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md new file mode 100644 index 00000000..98ebbb83 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md @@ -0,0 +1,306 @@ +# Querying + +## Overview + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph. + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the `storage`, `indexer`, and `contract` getters, the HypercertClient allows developers to easily interact with the various components of the Hypercert system directly. +For example, a developer could use the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the contract. + +## Indexer + +For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. + +### Live graph playground + +To inspect the subgraph and explore queries, have a look at the Graph playground for Goerli testnet and Optimism mainnet: + +- [Goerli dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) +- [Optimism dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) + +### Graph client + +Since the client is fully typed, it's easy to explore the functionalities using code completion in IDEs. + +Here's one example from our frontend where we let [react-query](https://www.npmjs.com/package/%2540tanstack/react-query) frequently update the call to the graph: + +```js +import { useHypercertClient } from "./hypercerts-client"; +import { useQuery } from "@tanstack/react-query"; + +export const useFractionsByOwner = (owner: string) => { + const { + client: { indexer }, + } = useHypercertClient(); + + return useQuery( + ["hypercerts", "fractions", "owner", owner], + () => indexer.fractionsByOwner(owner), + { enabled: !!owner, refetchInterval: 5000 }, + ); +}; +``` + +### Queries: Claims + +These tables show the input parameters and output fields for each of the GraphQL queries in [claims.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/claims.graphql). +A claim represents 1 Hypercert and all of the common data across all claim/fraction tokens. + +#### `ClaimsByOwner` + +The `ClaimsByOwner` query retrieves an array of claims that belong to a specific owner. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claims to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `RecentClaims` + +The RecentClaims query retrieves an array of the most recent claims on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | ---------------------------------- | ------------- | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `ClaimByID` + +The ClaimById query retrieves a single claim by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------- | +| `id` | `ID!` | The ID of the claim to retrieve. | + +##### Output + +The query returns a claim object that matches the input parameter. The claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +### Queries: Fractions + +These tables show the input parameters and output fields for each of the GraphQL queries in [fractions.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/fractions.graphql). +A claim token represents a fraction of ownership of a Hypercert. + +#### `ClaimTokensByOwner` + +The `ClaimTokensByOwner` query retrieves an array of claim tokens that belong to a specific owner on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claim tokens to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ------------------------------------------ | +| `chainName` | `String` | The name of the chain. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +#### `ClaimTokensByClaim` + +The `ClaimTokensByClaim` query retrieves an array of claim tokens that belong to a specific claim on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `claimId` | `String!` | The ID of the claim whose claim tokens to retrieve. | None | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | + +#### `ClaimTokenById` Query + +The `ClaimTokenById` query retrieves a single claim token by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------------- | +| `id` | `ID!` | The ID of the claim token to retrieve. | + +##### Output + +The query returns a claim token object that matches the input parameter. The claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +## Storage + +### Hypercert Metadata + +Currently, all metadata is stored off-chain in IPFS. Use the `storage` client to retrieve the metadata + +```js +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const { indexer, storage } = hypercertsClient; +// Get the on-chain claim +const claimById = await indexer.claimById(claimId); +// Get the off-chain metadata +const metadata = await storage.getMetadata(claimById.claim.uri); +``` + +## Contract + +### Typechain bindings + +We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, +which you can import and use from your TypeScript/JavaScript codebase. + +For example: + +```js +import { ethers } from "ethers"; +import { + HyperCertMinterFactory, + HypercertMinterABI, + IHypercertTokenABI, +} from "@hypercerts-org/sdk"; + +const provider = new ethers.getDefaultProvider(network); +const contractInterface = new ethers.utils.Interface(HypercertMinterABI); +const contract = new ethers.Contract( + contractAddress, + HypercertMinterABI, + provider, +); +const metadataUri = await contract.functions.uri(tokenId); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md new file mode 100644 index 00000000..936cc05b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md @@ -0,0 +1,101 @@ +# Getting started with JavaScript + +The Hypercerts SDK makes it easy to integrate Hypercerts into your application or backend with JavaScript/TypeScript. + +## Installation + +Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +# OR yarn add @hypercerts-org/sdk +``` + +## Get storage credentials (only required for minting) + +For now, we store all metadata (e.g. Hypercert claim data) on IPFS using [NFT.Storage](https://nft.storage/) and [web3.storage](https://web3.storage/). + +In order to mint a Hypercert, you will need to create API tokens for both services, which you can learn more about from their respective guides: + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +_Note: In the future, we want to also support other mechanisms for storing off-chain data._ + +## Initialize + +Import the SDK into your project and create a new instance of `HypercertClient` with your configuration options: + +```js +import { HypercertClient } from "@hypercerts-org/sdk"; +import { ethers } from "ethers"; + +// NOTE: you should replace this with your own JSON-RPC provider to the network +// This should have signing abilities and match the `chainId` passed into HypercertClient +const operator = ethers.providers.getDefaultProvider("goerli"); + +const client = new HypercertClient({ + chainId: 5, // goerli testnet + operator, + nftStorageToken, + web3StorageToken, +}); +``` + +Hypercerts is a multi-chain protocol. +See [here](./supported-networks.md) for a list of currently supported networks. + +> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). + +## Make a Hypercert + +Use the client object to interact with the Hypercert network. For example, you can use the `client.mintClaim` method to create a new claim: + +```js +import { + formatHypercertData, + TransferRestrictions, +} from "@hypercerts-org/sdk"; + +// Validate and format your Hypercert metadata +const { data: metadata, valid, errors } = formatHypercertData({ + name, + ... +}) + +// Check on errors +if (!valid) { + return console.error(errors); +} + +// Set the total amount of units available +const totalUnits: BigNumberish = 10_000_000 + +// Define the transfer restriction +const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly + +// Mint your Hypercert! +const tx = await client.mintClaim( + metadata, + totalUnits, + transferRestrictions, +); +``` + +For guidance on how to specify your metadata, see the [minting guide](../minting-guide/step-by-step.md). +This will validate the metadata, store claim metadata on IPFS, create a new hypercert on-chain, and return a transaction receipt. + +For more details, check out the [Minting Guide](./minting.md). + +## Query for Hypercerts + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more details, checkout the [Querying guide](./querying.md) +and our [Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md new file mode 100644 index 00000000..409a1e9d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md @@ -0,0 +1,41 @@ +# Getting started with Solidity + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +If you need the Solidity contracts or interfaces exported from the SDK, +please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Hypercerts deployments + +Hypercerts is a multi-chain protocol and we want to support any network that wants to make positive impact. +We plan to support at most 1 canonical contract deployment per network. +For a complete list of deployments and their contract addresses, see [Supported Networks](./supported-networks.md). + +## Installing the Hypercert contracts + +```bash +npm install @hypercerts-org/contracts +# or yarn add @hypercerts-org/contracts +``` + +## Using the Solidity interface + +If you want to call the Hypercerts contract on your network directly from Solidity, +we export the interface/ABI for you to use from your contract. + +```js +import { IHypercertToken } from "@hypercerts-org/contracts/IHypercertMinter.sol"; + +contract MyContract { + IHypercertToken hypercerts; + + function initialize(address _addr) public virtual initializer { + hypercerts = IHypercertToken(_addr); + } + + function uri(uint256 tokenID) public view returns (string memory _uri) { + _uri = hypercerts.uri(tokenID); + } +} + +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md new file mode 100644 index 00000000..1ac5556e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md @@ -0,0 +1,29 @@ +# Split and Merge + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## By Token Value + +### Split / merge token values + +```js +const { tokenIds } = await hypercerts.splitFraction({ + tokenId, + units: [10, 12, 15], +}); +const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); +``` + +## By Claim Data + +### Split / merge claim data + +```js +const { claimIds } = await hypercerts.splitClaim({ + claimId, + TODO: somehow specify hypercert subregions +}); +const { claimId} = await hypercerts.mergeClaims({ + claimIds, +}); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md new file mode 100644 index 00000000..3bfd0f18 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md @@ -0,0 +1,13 @@ +# Supported networks + +Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. + +We want to support every network that wants to support positive impact! +If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Overview + +| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | +| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | +| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | +| Optimism | 10 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md new file mode 100644 index 00000000..72b3ee2d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md @@ -0,0 +1,120 @@ +# Deploy a new proxy contract + +This should be done only on rare occasions. For example, when: + +- We want to deploy to a new network +- We have updated the contract in a way that is _NOT_ backwards-compatible. + - For most upgrades, please use UUPS [upgrades](./upgrade.md). + +## Smart Contracts + +### Setup the `contracts/` environment + +Navigate to `contracts/`. Configure your `.env` file by following the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/contracts#setup). + +### Build and deploy the smart contracts + +If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. + +```javascript + "optimism-goeri": getChainConfig("optimism-goerli"), +``` + +Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. + +```sh +# Run in contracts/ +yarn build:hardhat +yarn hardhat deploy --network NETWORK +``` + +This will output the new proxy address. Update the root `README.md` with this new address. + +Now transfer ownership over the proxy contract to the multisig: + +```sh +yarn hardhat transfer-owner --network NETWORK --proxy PROXY_CONTRACT_ADDRESS --owner MULTISIG_ADDRESS +``` + +## Subgraph + +### Setup the `graph/` environment + +Navigate to `graph/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/graph#setup) +to get set up. + +### Deploy the subgraph + +Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). + +Now deploy the subgraph + +```sh +# Run in graph/ +yarn build +yarn deploy:hosted +``` + +## OpenZeppelin Defender + +### Create a new Supabase table + +Log into the [Supabase dashboard](https://app.supabase.com/). +We store all data in a single project, but use different tables for each network. +The table name should be suffixed by the network (e.g. `allowlistCache-goerli`). +If you are deploying to a new network, create a new table. You can copy the table schema and RLS policy from another pre-existing table. + +If you are deploying a new proxy contract to a network for which you already have another deployment, you'll have to make a judgement call as to whether you can reuse the existing table, whether you need to clear the existing table, or create another table. + +Note: We want to merge all the tables in this [issue](https://github.com/hypercerts-org/hypercerts/issues/477). + +### Update the OpenZeppelin Defender scripts + +Modify the Defender scripts to support the new network in `defender/src/networks.ts`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. + +Note: The entry point for deployment is in `defender/src/setup.ts`. + +### Setup the `defender/` environment + +Navigate to `defender/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/defender#setup) +to get set up. + +### Deploy defender scripts + +Deploy to OpenZeppelin Defender via + +```sh +# Run in defender/ +yarn deploy +``` + +## Hypercerts SDK + +TODO: Flesh this out + +Run the build in `contracts/`. + +(Soon to be deprecated) Publish `contracts/` to npm + +Configure the SDK to support the new network via the graphclient. + +Publish SDK to npm + +## Deploy the Dapp frontend + +Each frontend build is configured to run on a different network (e.g. `https://testnet.hypercerts.org`). You can use any CDN to serve the site (e.g. Netlify, Vercel, GitHub Pages, Cloudflare Pages, Fleek, Firebase Hosting). + +1. Configure your build environment with the environment variables specified in `frontend/.env.local.example`. + +2. Configure your builds to the following settings: + +- Build command: `yarn build:site` +- Build output directory: `/build` +- Root directory: `/` + +3. Configure the domain that you want for your build. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md new file mode 100644 index 00000000..05dc5b0c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md @@ -0,0 +1,45 @@ +# Errors + +## Deploying + +### Artifact for contract "HypercertMinter" not found + +#### Error message + +`Error HH700: Artifact for contract "HypercertMinter" not found.` + +#### Cause + +Attempting to deploy a contract with `npx hardhat deploy` before the contract has been compiled by hardhat. Contracts compiled by forge are currently not visible to hardhat (this could be a configuration problem). + +### insufficient funds for intrinsic transaction cost + +#### Error message + +`Error: insufficient funds for intrinsic transaction cost` + +#### Cause + +The environment variable `MNEMONIC` is not configured correctly. + +Alternatively, the wallet may not have enough funds for the selected network + +Causing pause twice + +Error: cannot estimate gas; transaction may fail or may require manual gas limit + +reason: 'execution reverted: Pausable: paused', + +#### Etherscan API + +Note: It can take between 5-10 minutes before a newly created etherscan API key becomes valid for queries to goerli. + +When using an etherscan API key that was too recently created, hardhat tasks using etherscan to verify transactions will exit with an error message: + +`Etherscan returned with message: NOTOK, reason: Invalid API Key` + +Despite this error the transaction may have succeeded, the hardhat task just can't confirm it. + +It is unknown if this is a problem for queries to mainnet as well. + +Metamask makes it very difficult to have multiple wallets. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md new file mode 100644 index 00000000..9b208595 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md @@ -0,0 +1,18 @@ +# DevOps + +We use this playbook to encapsulate our practices and current setup. + +## Setup dev environment + +- [Setup guide](./setup.md) +- [Plasmic setup](./plasmic.md) + +## Tasks + +- [Deploy new proxy contract](./deploy-proxy.md) +- [Upgrade contract](./upgrade.md) +- [Pause contract](./pause.md) + +## FAQ + +- [Common errors](./errors.md) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md new file mode 100644 index 00000000..2668f51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md @@ -0,0 +1,29 @@ +# Pause / Unpause + +## Pause + +### Contract owned by an address + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat pause --network NETWORK --address CONTRACT_ADDRESS +``` + +### Contract owned by a multi-sig + +If we transferred ownership to a multisig, we can use +[OpenZeppelin Defender Admin](https://defender.openzeppelin.com/#/admin) +to propose a pause to be approved by the multisig. + +## Unpause + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat unpause --network NETWORK --address CONTRACT_ADDRESS +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md new file mode 100644 index 00000000..10e52f5b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md @@ -0,0 +1,76 @@ +# Plasmic setup + +## HypercertImage + +### Props + +hideImpact + +``` +$ctx.currentForm.impactTimeEnd === "indefinite" && ($ctx.currentForm.impactScopes.length === 0 || ($ctx.currentForm.impactScopes.length === 1 && $ctx.currentForm.impactScopes[0] === "all")) +``` + +color + +``` +$ctx.currentForm.backgroundColor +``` + +vectorart + +``` +$ctx.currentForm.backgroundVectorArt +``` + +### Slots + +logoImage Image URL + +``` +$ctx.currentForm.logoUrl +``` + +title Content + +``` +$ctx.currentForm.name +``` + +workPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.workTimeEnd.format ? $ctx.currentForm.workTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.workTimeEnd}` +``` + +bannerImage Image URL + +``` +$ctx.currentForm.bannerUrl +``` + +impactPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.impactTimeEnd.format ? $ctx.currentForm.impactTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.impactTimeEnd}` +``` + +#### workScopes: repeated ScopeChip + +Collection + +``` +$ctx.currentForm.workScopes.split(/[,\n]/).map(i => i.trim()).filter(i => !!i) +``` + +Element name: `currentWorkScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentWorkScope` + +#### impactScopes: repeated ScopeChip + +Collection: `$ctx.currentForm.impactScopes` +Element name: `currentImpactScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentImpactScope` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md new file mode 100644 index 00000000..afb95296 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md @@ -0,0 +1,41 @@ +# Setup + +## Pre-requisites + +1. Install [NodeJS](https://nodejs.org/en/) and [git](https://git-scm.com/) +2. Install [yarn](https://classic.yarnpkg.com/) + +```sh +npm install --global yarn +``` + +3. Clone the repository: + +``` +git clone git@github.com:hypercerts-org/hypercerts.git +cd hypercerts +``` + +4. Install dependancies: + +To install dependencies across all projects in the monorepo workspace: + +```sh +yarn install +``` + +## Setup your wallets + +We need 2 wallets: a multi-sig for administering the contracts, and a hot wallet for setting everything up. + +1. We use a [Gnosis Safe](https://app.safe.global/) multisig for managing and administering the contracts. Set one up with your desired confirmation threshold (e.g. 2 of 3). This wallet will not require any balance. +2. Separately, set up a wallet that we'll use in our developer scripts. + +- If you don't have one, you can goto `contracts/` and run `yarn hardhat generate-address`. +- Make sure there is enough balance in this account to deploy the contract and transfer ownership to the multisig + - [Goerli Faucet](https://goerlifaucet.com/) + - [Optimism Bridge](https://app.optimism.io/bridge/deposit) + +## Next Steps + +Depending on what you want to do (e.g. in `./sdk/` or `./frontend/`), there will be further setup instructions in the respective `README.md` file. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md new file mode 100644 index 00000000..820255e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md @@ -0,0 +1,35 @@ +# Upgrading the contract + +## Validate upgrade + +Validate contract upgradeability against deployment. + +For example, for the `goerli` deployment: + +```sh +yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS +``` + +## Propose Upgrade + +Propose an upgrade via OpenZeppelin Defender. For more information, see this +[guide](https://docs.openzeppelin.com/defender/guide-upgrades) + +For example, for the `goerli` deployment: + +```sh +yarn build:hardhat +yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS +``` + +This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. + +## Publish to npm + +After you update the contracts, deploy the `contracts/` package to npm. + +TODO + +Update the dependencies in `frontend/package.json` and `sdk/package.json`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/faq.md b/docs/versioned_docs/version-1.0.0-alpha.0/faq.md new file mode 100644 index 00000000..b9659b5a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/faq.md @@ -0,0 +1,139 @@ +--- +title: Frequently Asked Questions +id: faq +--- + +# FAQs + +### How do I create a hypercert? + +We've created a step-by-step guide in the documents, which you can find [here](minting-guide/minting-guide-start). + +### Who gets to claim my hypercert? + +There are currently two types of users who are eligible to claim your hypercert. + +1. You as the creator of the hypercert are eligible to claim your hypercert. For projects with an allow list, you are eligible to claim 50% of the total tokens. For projects with no allow list, you will receive 100% of the tokens automatically and can do whatever you like with them. + +2. Anyone on the hypercert's allow list will be eligible to claim your hypercert. The allow list is stored and the time of minting and allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions through a separate contract interaction. Creators often use allow lists be used to allocate fractions to previous funders and contributors. + +### How do I claim a hypercert? Can I claim all of the ones I’m eligible for at once? + +After you connect your wallet, you will see a dashboard of hypercerts that you can claim. You can either claim them individually or in a batch transaction. Note that if you perform the batch transaction you will automatically claim _all_ hypercerts you are allow-listed for. (You still pay a gas fee for each claim, however.) If you don't want to claim _all_ at once, then you should claim them one-by-one. + +### What token standard do hypercerts utilize? + +The interface supports both ERC-1155s and 721s. Our current implementation makes use of [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) (a semi-fungible token). + +### What are the required fields to generate a hypercert? + +There are six required fields: + +1. Set of contributors: An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. Scope of work: A conjunction of potentially-negated work scope tags, where an empty string means “all”. +3. Time of work: A date range, from the start to the end of the work being claimed by this hypercert. +4. Scope of impact: A conjunction of potentially-negated impact scope tags, where an empty string means “all”. +5. Time of impact: Date ranges from the start to the end of the impact. +6. Rights of the owners: An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Hypercerts also need a name and description. + +### What should I put for my hypercert's work scope? + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +### Are hypercerts the same as impact evaluations? + +No. A hypercert is a claim over a discrete piece of work and the impact that may result from that work. It has no opinion about the legitimacy or quality of the claim. + +An impact evaluation is an opinionated assessment about the legitimacy or quality of a claim. + +For example, a hypercert might represent "Planting trees in the Amazon in 2022". An impact evaluation might point to that hypercert and assert the percent of trees that survived, the amount of CO2 removed by the trees, or the income change among people living around the project. + +Over time, the expectation is that hypercerts that attract multiple, high quality, credibly neutral impact evaluations will be more relevant than ones that do not. + +### What can I do with my hypercert? + +The `rights` dimension specific what an owner can do with their hypercert. Currently, the only `right` that owners have is "Public Display". Over time, we hope the protocol can support various `rights` including transfers, intellectual property, tax-deductibility, carbon offsets, ESG reporting, and more. + +### How is a hypercert different than a POAP or Impact NFT? + +Hypercerts have some things in common with certain POAPs or Impact NFTs, but also a number of crucial differences. + +First, all POAPs and most Impact NFTs are implemented as non-fungible tokens (ERC-721s). Hypercerts are currently being implemented as semi-fungible tokens (ERC-1155s), meaning it is possible to own more than one unit or fraction of a given hypercert. This makes it easy and intuitive to display the share of hypercerts that a given owner has. + +Second, hypercerts have specific metadata requirements and interpretation logic. These include a standard schema for how the six required hypercert dimensions are defined and captured (i.e., work scopes, impact scopes, timeframes, contributors, etc) as well as logic for how to interpret different inputs (e.g., how to include or exclude certain work scopes, create an indefinite time period, etc). POAPs have a completely different schema. Although there is no standard schema for Impact NFTs, an Impact NFT project could choose to adopt the hypercert standard and token interface and thereby achieve compatibility. + +Third, the hypercerts token interface is intended to support several functions that are not possible out of the box with other token standards, chiefly, atomic split and merge capabilities. We also expect other protocols to work with hypercerts for the purposes of prospective and retrospective funding, contributor verification, and impact evaluation. + +For certain use cases, POAPs may be better suited for projects as hypercerts are focused on the funding aspect of impactful work. + +### Where can I purchase a hypercert? + +Currently, it is only possible to purchase a hypercert from a creator or project. This can be facilitated directly by the project or via a third-party marketplace like OpenSea. Currently, hypercerts cannot be resold on secondary markets. + +### What chain(s) is hypercerts running on? + +The hypercerts smart contracts have been deployed on Optimism and Goerli Testnet. We plan to support various EVM chains in the near future. + +### How do I bridge to Optimism? + +There are various bridging services including the official [Optimism Bridge](https://app.optimism.io/bridge/deposit). Note that bridging assets from Ethereum to Optimism will incur a gas fee. + +### How much gas will it cost to create or claim a hypercert? + +In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). Claiming a hypercert should be below 0.0001 ETH or less than $0.10 on Optimism. + +### How do I create a hypercert from a multisig? + +If you are creating a hypercert on Optimism, then you will need an Optimism-based multisig. (Unfortunately, Safe wallets created on Ethereum won't work on Optimism.) + +### Have the smart contracts been audited? + +Yes. The auditor's security report is available [here](https://github.com/pashov/audits/blob/master/solo/Hypercerts-security-review.md). + +### How is the allow list generated? + +For Gitcoin projects, an allow list is generated from a snapshot of all of the on-chain funding received by the project. + +The queries used to generate the allow lists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Once the snapshot is taken, the formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +### Why am I not on the allow list even though I contributed to the project? + +If you contributed less than $1 DAI to a project, then you will not be eligible to claim a hypercert fraction. + +### I supported a project. Why I don't I see the hypercert in my dashboard? + +In order to your hypercert to appear as "claimable", the project needs to mint the hypercert first. If the project has not minted its hypercert yet, then you will not be able to claim it. We suggest you check back in a few days to see if the project has created the hypercert and is now claimable. + +If the project has created its hypercert, then please try the following solutions: + +1. Confirm the wallet address is correct (some users have multiple wallet addresses and forget which one they donated with) +2. Check that your wallet is included in the Dune Dashboards for each Gitcoin Round + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +3. Confirm you donated more than $1 DAI to the project. + +If the project has created its hypercert, and you have confirmed items 1-3, then please send us a DM over Twitter or Telegram with your wallet address and we will get back to you promptly. + +### How do I retire a hypercert? + +We don't yet have a frontend for retiring hypercerts but you can do this by interacting directly with the smart contract on Etherscan. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md b/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md new file mode 100644 index 00000000..86c25331 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md @@ -0,0 +1,37 @@ +--- +title: Further Resources +id: further-resources +--- + +# Papers, Articles, Presentations + +## Writings + +- Feb 14, 2023, Whitepaper draft by [@hypercerts](http://twitter.com/hypercerts): [Hypercerts: A new primitive for impact funding systems (draft v0)](../static/pdf/hypercerts_whitepaper_v0.pdf) +- Aug 24, 2022, Blogpost by [@holkeb](https://twitter.com/holkeb): [Hypercerts: A new primitive for public goods funding](https://protocol.ai/blog/hypercert-new-primitive/) +- Jun 2022, Tech report (draft) by [@davidad](https://twitter.com/davidad): [Hypercerts; an Interoperable Datalayer for Impact-Funding Mechanisms](../static/pdf/hypercerts_Tech_Report_draft.pdf) + +## Talks + +#### Jun 24, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Hypercerts: on-chain primitives for impact markets](https://youtu.be/2hOhOdCbBlU) + + + +#### Jun 23, 2022, Conversation between [@emiyazono](http://twitter.com/emiyazono) and [@owocki](http://twitter.com/owocki) at GreenPill Podcast: [Impact Certificates | Evan Miyazono, Head of Research at Protocol Labs | Green Pill #21](https://youtu.be/kyo5SxtSJ9U) + + + +#### Mar 4, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Interoperable mechanisms for non-rival goods (Hypercerts)](https://youtu.be/acbBeGcevok) + + + +## Other resources + +Overview of some previous writings on impact certificates, retrospective funding and impact markets: + +- Christiano, Paul (2014) Certificates of impact, Rational Altruist, [https://rationalaltruist.com/2014/11/15/certificates-of-impact/](https://rationalaltruist.com/2014/11/15/certificates-of-impact/) +- Christiano, Paul & Katja Grace (2015) The Impact Purchase, [https://impactpurchase.org/why-certificates/](https://impactpurchase.org/why-certificates/) +- Optimism & Buterin, Vitalik (2021) Retroactive Public Goods Funding, [https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c) +- Cotton-Barratt, Owen (2021), Impact Certificates and Impact Markets, Funding the Commons November 2021, [https://youtu.be/ZiDV56o5M7Q](https://youtu.be/ZiDV56o5M7Q) +- Drescher, Denis (2022) Towards Impact Markets, [https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1](https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1) +- Ofer & Cotton-Barratt, Owen (2022) Impact markets may incentivize predictably net-negative projects, [https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6](https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md new file mode 100644 index 00000000..b2451310 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md @@ -0,0 +1,139 @@ +--- +title: Glossary +id: glossary +sidebar_position: 3 +--- + +# Glossary of Hypercerts Terms + +## Main Terms + +### Allowlist + +A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. + +### Claiming a fraction + +Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. + +### Contributor + +An individual or organization that performs some or all of the work described in a hypercert. + +### Creating a hypercert + +Synonymous to minting a hypercert. + +### Fraction + +A token that represents a quantified proportion of a hypercert denominated in units. + +### Funder + +Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. + +### Hypercert + +A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. + +### Hypercerts interface + +The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. + +### Hypercerts implementation + +An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. + +### Hypercerts standard + +A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Impact + +Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. + +### Impact evaluation + +A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. + +### Impact Funding System (IFS) + +A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. + +### Impact space + +A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Merging hypercerts + +An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. + +### Minting a hypercert + +Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. + +### Project + +Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. + +### Prospective funder + +Individual, organization, or algorithm that fund work before it is done. + +### Retrospective funder + +Individual, organization, or algorithm that fund work after it is done. + +### Rights + +An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. + +### Set of contributors + +An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of impact + +A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of work + +A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Splitting hypercerts + +An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. + +### Time of impact + +Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Time of work + +A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Unit + +The smallest possible fraction of a claim. Generally units are grouped in fractions. + +### Work + +Activities that produce impact. + +## Additional Impact Evaluation Terms + +### Auditor + +Individual, organization, or algorithm that evaluates the impact of work after it is done. + +### Beneficiaries + +People or objects that are impacted by work. + +### Evaluator + +Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. + +### Scout + +Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md new file mode 100644 index 00000000..08eb9fcb --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md @@ -0,0 +1,188 @@ +--- +title: Metadata Standard +id: metadata +sidebar_position: 2 +--- + +# Hypercert Metadata Structure + +Hypercerts are represented as [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) tokens. All token instances of a hypercert must share the same ERC-1155 metadata. For sites like OpenSea to pull in off-chain metadata for ERC-1155 assets, your hypercert contract will need to return an IPFS URI that contains all necessary hypercert metadata. + +The hypercert metadata schema follows the [Enjin recommendation](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema) for ERC-1155 metadata. It also includes **six required dimensions** that are necessary to clearly and unambiguously identify the hypercert's impact claim. + +The following are standard ERC-1155 metadata fields. + +## ERC-1155 fields + +| Property | Description | +| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `name` | Name or title of the hypercert. Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. | +| `description` | A human readable description of the hypercert. Markdown is supported. Additional external URLs can be added. | +| `image` | A URI pointing to a resource with mime type image/\* that represents the hypercert's artwork, i.e., `ipfs://`. We recommend images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. | +| `external_url` | [optional] A URL that can be displayed next to the hypercert on webpages like OpenSea and links users to a page that has more information about the project or impact claim. | +| `properties` | [optional] Additional properties (aka attributes) that may be helpful for discovery and curation of hypercerts. Marketplaces like OpenSea will display these properties in the same way as they display rarity traits of NFTs. | + +In order to perform hypercert-specific operations, including split and merge functions, and for your hypercert to robustly claim a set of coordinates in the impact space, there are six additional dimensions that must be included in your metadata. + +## Required Hypercert dimensions + +| Property | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `work_scope` | An _ordered list_ of work scope tags. Work scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any work scope that is explicitly excluded from the claim. | +| `work_timeframe` | Date range from the start to the end of the work in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). | +| `impact_scope` | An _ordered list_ of impact scope tags. Impact scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any impact scope that is explicitly excluded from the claim. The default claim is to "all" impact, giving the owner rights to claim all potential impact created by the work that is represented by the hypercert. | +| `impact_timeframe` | Date range from the start to the end of the impact in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). The default claim is from the start date of work until `indefinite` (i.e., the impact may occur at any point in time in the future). | +| `contributors` | An _ordered list_ of all contributors. Contributors should be itemized as wallet addresses or ENS names, but may be names / pseudonyms. The default claim is to the wallet address that created the hypercert contract. A multisig wallet can be used to represent a group of contributors. | +| `rights` | An _unordered list_ of usage rights tags. The default claim is solely to "public display" of the hypercert, i.e., all other rights remain with the contributors. | + +## Examples + +### Example 1: hypercert with minimal bounds + +Here is an example of hypercert dimensions for work on IPFS with minimal bounds: + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["IPFS"], + "excludes": [], + "display_value": "IPFS" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": [], + "display_value": "All" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1380585600, 1388534399], + "display_value": "2013-10-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1380585600, 0], + "display_value": "2013-10-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["Protocol Labs"], + "display_value": "Protocol Labs" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 2: hypercert with bounded impact claims + +This hypercert is for a carbon removal project that provides a bounded impact scope. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["CO2 in Atmosphere"], + "excludes": [], + "display_value": "CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 3: hypercert with excluded impact claims + +Here is an example that explicitly excludes an impact scope to generate a more fine-grained claim. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": ["CO2 in Atmosphere"], + "display_value": "All ∧ ¬CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Additional guidelines + +Here are some additional guidelines for defining hypercert dimensions. + +- For most hypercerts, the `work_scope` is best represented as the name of the project or activity. Other information contained in the hypercert, namely, the `contributors` and the `work_timeframe` should provide sufficient context to disambiguate multiple claims from the same project. +- Similarly, for most hypercerts, the `impact_scope` will be most clearly represented as "all" (with an indefinite upper bound on the `impact_timeframe` dimensions). This gives the hypercert creator and its owners the flexibility to make claims about impact that may not have been observable or well-understood when the hypercert was created. + +- It is recommended to browse the `impact_scope` and `work_scope` tags that have already been created and are in use by your or other projects. (We are building a catalog to be available at [hypercerts.org](https://hypercerts.org).) Picking established tags can make it easier for users to discover, curate, and interact with your hypercert. In the long-run, we expect different ontologies to emerge in domains like climate solutions, open source software, etc, and picking more established tags will help prevent overlapping or duplicate claims. +- Tags for work scopes and impact scopes are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. +- Scopes that are explicitly excluded from the hypercert claim are enumerated separately and displayed with the `¬` prefix in the tag. Excluded scopes are not currently displayed on hypercert artwork. +- The order of tags matters only for display purposes. The hypercert artwork will only display a limited number of tags in the `impact_scope` and `work_scope` arrays due to image size and stylistic constraints. +- A `contributor` can be identified using any human-readable string. The base case is to set the `contributors` to the wallet address used to create the hypercert. A multisig wallet can be used to represent a group of contributors. + +### Assigning `rights` + +In version 1.0 of the protocol, only one `rights` tag will be enabled: + +> **Public Display**: owners of the hypercert have the right to publicly display and receive social utility from their hypercert. + +This means that any other rights regarding the work described by the hypercert either remain with the original contributors or are governed by other agreements. + +Additional `rights` including the potential for certain types of transfers to be explicitly enabled will be released in subsequent versions. + +## Optional hidden properties + +Creators may wish to add other fields in their metadata that are not a part of the hypercert claim and are not for display on third-party marketplaces like OpenSea. These can be added by creating a `hidden_properties` field in the metadata. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md new file mode 100644 index 00000000..a767c670 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md @@ -0,0 +1,29 @@ +--- +title: Token Standard +id: token-standard +sidebar_position: 1 +--- + +### Hypercerts as a semi-fungible token + +In order to make the token identifiable, traceable, and transferable, hypercerts are represented as [ERC-1155 tokens](https://eips.ethereum.org/EIPS/eip-1155). The ERC-1155 standard enables a single deployed contract to store many hypercerts, facilitating simpler creation, transfers, as well as splitting and merging of hypercerts within a single namespace. As a semi-fungible token, each unique token represents a fraction of ownership of a hypercert. Hypercerts are then represented as a group of tokens, where the total ownership sums to 100%. In order to easily identify which hypercert a token belongs to, we utilize the upper 128 bits of a 256-bit token ID to identify the hypercert. All tokens within the same hypercert group should share the same [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). + +![hypercert id](../../static/img/hypercert_id.png) + +For illustrative purposes, let us assume that token IDs are just 2 bytes long, where the first byte represents the hypercert ID and the last byte represents which fraction of ownership. Alice could create a new hypercert token 0x2301, representing 100% of hypercert 0x23. If Alice wanted to transfer 20% to Bob, Alice could perform a split operation by minting token 0x2302 and transferring 20% of value to it, such that tokens 0x2301 and 0x2302 represent 80% and 20% ownership respectively of hypercert 0x23. Then Alice transfers token 0x2302 to Bob. Similarly, they could merge these 2 tokens together, back to form a token that represented 100% ownership. In this case, the value of 0x2301 would be transferred to 0x2302, and then 0x2301 is subsequently burned. + +Alice can also choose to split or merge hypercerts along some dimension of the impact space. For example, Alice may split hypercert 0x23 into two new hypercerts — 0x24 representing work done before the year 2000, and 0x25 representing work done after 2000. The original hypercert 0x23 is burned and the two new hypercerts store a reference to the previous hypercert. When the history of splits and merges are indexed, we can easily trace through the provenance of any individual hypercert. + +### Claim Data + +Hypercert claim data, such as scope of work and the contributor list, is encoded in JSON format into the [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). Claim data can be stored on-chain alongside the token, or in off-chain storage such as IPFS. For details on the JSON schema and how off-chain storage can be utilized, see the [hypercerts-sdk repository](https://github.com/hypercerts-org/hypercerts/tree/main/sdk). + +When considering whether to store hypercert metadata on-chain or off-chain, we can consider the different trade-offs to the user experience and cost, which may differ depending on which blockchain is being used. Storing data off-chain saves on costs, but could lead to on-chain claims without the metadata. Storing data on-chain adds additional security that the claims will not be forgotten but can lead to higher gas fees. + +Beyond the standard fields of hypercerts that locate the hypercert in the impact space, additional fields can be added. This allows for different templates in different impact areas, such as AI safety or biodiversity, as different additional information will be useful. Importantly, however, all hypercerts will be located in a single impact space – the additional fields do not change that. + +### Multi-chain support + +We expect hypercerts to exist in a multi-chain ecosystem, where the local deployment can be used to support the unique funding systems of that community. In order to visualize a single global impact space, we index the different contract deployments across chains and surface any potential hypercert claim conflicts. Because different blockchains support different subsets of programming languages, we do expect different implementations of the hypercert protocol to exist. However, they must adhere to the same hypercert data model to be indexed into the impact space. + +In order to decide which deployments to index into the hypercerts impact space, decentralized governance institutions will be used to govern the list of contract addresses used across all blockchains. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/intro.md new file mode 100644 index 00000000..0c4d7ca3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/intro.md @@ -0,0 +1,58 @@ +--- +title: What Are Hypercerts? +id: intro +--- + +# What are hypercerts? + +### Hypercerts are a new token standard for tracking and rewarding positive impact. + +Each hypercert represents a unique impact claim capturing the following information: + +- a scope of work and its corresponding scope of impact +- a set of time frames for both the work and its impact +- a set of contributors – the organization or people behind the work +- a set of rights you get by owning a hypercert + +The hypercert itself is an ERC-1155 semi-fungible token with the information above stored as metadata on IPFS. Here’s an example. + +### Hypercert example + +#### Graphic representation + +![hypercert design example](../static/img/hypercert_example.png) + +#### Supplementary information (metadata) + +- **Title of hypercert:** Invention of the InterPlanetary Filesystem (IPFS) +- **Description:** The InterPlanetary File System (IPFS) is a set of composable, peer-to-peer protocols for addressing, routing, and transferring content-addressed data in a decentralized file system. +- **Link:** ipns://ipfs.tech/ + +#### Hypercert dimensions (metadata) + +- **Set of contributors:** 0xb794f5ea0ba39494ce839613fffba74279579268 _(example Ethereum address)_ +- **Scope of work:** IPFS ∧ ¬ go-ipfs +- **Time of work:** 2013-01-01 --> 2013-12-31 +- **Scope of impact:** All +- **Time of impact:** 2013-01-01 --> indefinite +- **Rights:** Public display + +### Why should you care? + +We spend trillions of dollars every year on public goods via governmental agencies, foundations, private donations and corporate spendings; however, we don’t effectively track this work – leaving us in the dark, hoping that it actually has the intended positive impact. + +We believe we can do better: + +- We should start by tracking this work consistently – this is what hypercerts are for. +- We should evaluate how impactful that work was – this is what the open evaluation system of hypercerts supports. +- We should reward the work that was exceptionally impactful – this is what the public display of hypercerts and retrospective funding is for. + +Doing this would unfold powerful incentives. Retrospective funding 1) provides incentives for creators to take on public goods projects with a potentially high, but uncertain, impact, 2) enables feedback loops to learn from successes and failures, and 3) attracts more talent to the public goods sector by improving performance-based compensation. + +While we are excited about the prospects of retrospective funding, hypercerts do not impose any specific funding mechanisms, but start with tracking the work that is supposed to be impactful. As a database for many funding mechanisms this facilitates experimentation and interoperability between funding mechanisms. + +### Next + +Curious and want to learn more? Head over to the [whitepaper](whitepaper/whitepaper-intro.md) to dive deeper into the world of hypercerts. + +Or do you want to get started right away? Head to the [minting guide](minting-guide/minting-guide-start.md). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md new file mode 100644 index 00000000..1ad2310a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md @@ -0,0 +1,166 @@ +--- +title: Gitcoin Alpha Round Instructions +id: gitcoin-round +sidebar_position: 3 +--- + +# Gitcoin Alpha Round Instructions + +## Overview + +- all projects in the Gitcoin Alpha Round are invited to mint a hypercert for their work +- anyone who gave over $1 to a project is automatically allowlisted for that project’s hypercert +- 50% of each hypercert is distributed to the funders, 50% is kept by the project and can be transferred later +- each project has a custom URL to make minting super easy (the link is sent directly to each project) +- everything runs on Optimism (users only need to pay L2 gas costs) + +:::info +If your project participated in the Gitcoin Alpha Round, but you didn't get a message with a custom URL, please reach out to team[at]hypercert.org. +::: + +## Hypercerts x Gitcoin Alpha Round + +Now that Gitcoin’s Alpha Round has officially closed and the funding distribution is finalized, we are inviting all eligible projects that participated to mint a hypercert for their past work and to allocate fractions of their hypercert to a list of supporters. + +We’ve created a dApp that pulls all of the data required to mint your hypercert directly from Gitcoin’s Grant Protocol. You can fine-tune the properties, tweak your artwork, and review the distribution mechanism. Once you’re ready, hit the create button and your hypercert will be released into the ethers! + +Once your hypercert has been minted, the people who supported your project with a contribution of at least $1 DAI on Gitcoin’s Alpha Round will be able to connect and claim their fractions. + +A few important notes about the Alpha Round: + +- The total units of a hypercert is based on the total donations; each funder get awarded units proportional to their donations. +- Transfers will be restricted to one transfer from the project to the supporters. +- There will be no additional rights awarded to the funders except the right to "public display" their support for the project. + +## Instructions + +The following guidance is only for projects that receive a custom URL that pre-populates the hypercerts form based on their Gitcoin Grants' data. + +It explains the default settings in the form and recommends fields that the creator may choose to update or edit. + +:::note +Gitcoin Grant hypercerts are for retrospective work, i.e., they are intended to capture work that happened between Gitcoin Grants Round 15 (September 2022) and the Alpha Round (January 2023). Therefore, the work time period is always set to past dates. (You might need to adjust the name and description to also refer to past work only.) We are focusing solely on retrospective hypercerts for this round as part of broader efforts to promote retrospective funding; you can read more about it [in the whitepaper](whitepaper/retrospective-funding.md). +::: + +### General Fields + +#### Name of Hypercert + +This field is set by default to the name of your project on Gitcoin Grants. You can edit this to be more specific. Given that your project may create numerous hypercerts over time, consider giving each hypercert a name that represents a more discrete phase or output. + +#### Logo + +This field is set to the icon artwork provided for your project on Gitcoin Grants. If there was an error accessing your icon, you will see a generic icon. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +#### Background Banner Image + +This field is set to the banner artwork provided for your project on Gitcoin Grants. If there was an error accessing your banner, you will see a generic Gitcoin banner. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +#### Project Description + +This field is set by default to the description of your project on Gitcoin Grants. Review closely -- a long project description in your Gitcoin Grant description will be truncated. + +You may edit this to provide more details about your work and to remove information that is targeted solely at Gitcoin Grants users. This is also a good place to provide other links, such as Github repos or social media accounts, where the general public can learn more about the work. Please aim for a project description that is less than 500 characters. + +:::note +The project description should refer to **past work**, not future work that you would like to do with additional funding. +::: + +#### Link + +This field is set to the first external URL provided for your project on Gitcoin Grants. You can update this. + +### Hypercert Fields + +#### Work Scope + +This field is set by default to a **shortened version** of the name of your project on Gitcoin Grants. You may edit or add additional work scope tags. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +#### Work Start/End Dates + +The start date has been set by default to the `2022-09-22` for all projects on Gitcoin Grants. This date coincides with the end of Gitcoin Grants Round 15. + +The end date references the last update to your grant page on Gitcoin Grants. + +You may edit or update these fields, however, the end date may not extend beyond `2023-01-31` (the close of the funding round) as all hypercerts will be retrospective in this round. + +#### Set of Contributors + +This field is set by default to the wallet address that is set as the recipient address for receiving Gitcoin Grants funding. + +:::note +You should review this field closely and – if applicable – provide the addresses of additional contributors. +::: + +### Advanced Fields + +#### Impact Scope + +This field is set by default to `all`. + +Updates are currently disabled on the frontend because funding decisions on Gitcoin Grants were not specific to an impact scope or impact time period. + +#### Impact Start/End Dates + +This field is set by default to the work start date of `2022-09-22` (see above) and a work end date of `indefinite`. Updates are currently disabled on the frontend. + +#### Rights + +This field is set by default to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +Updates are currently disabled on the frontend. + +### Distribution + +#### Allowlist + +This field is set by default to a custom allowlist generated for each project based on the funding it received on the Gitcoin Grants Alpha Round. You should not need to update this field. If there is a problem with your allowlist, please contact us. + +50% of the hypercert will be allocated according to this allowlist. The other 50% will be kept by the project, i.e. it is allocated to the address that mints the hypercert. You will be able to transfer or sell these fractions later as long as they are owned by the minter. This means that they can only be transferred or sold once. + +The formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +The queries used to generate the allowlists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Donors who contributed to the matching pool for each round are also eligible to claim hypercerts. + +:::note +You are free to edit your allowlist. You can do this by following the step-by-step instructions [here](minting-guide/step-by-step.md). Just remember that you will need to upload the new allowlist in a CSV format to a storage site like [web3.storage](https://web3.storage) and then update the link in the allowlist field. Contact team[at]hypercerts.org if you need help. +::: + +### Confirmations + +#### Contributors' permission + +Every contributor needs to agree to have their contribution be represented by a hypercert. This is why the person minting the hypercert has to confirm to have the permission of all listed contributors. + +#### Terms & Conditions + +The terms & Conditions can be found [here](https://hypercerts.org/terms). + +### Final step: Click "Create" + +Make sure your Optimism wallet or multi-sig is connected. Click on "create" and wait for your hypercert to be created. Congratulations! diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md new file mode 100644 index 00000000..47e8ad7c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md @@ -0,0 +1,44 @@ +--- +title: Getting Started +id: minting-guide-start +sidebar_position: 1 +--- + +# Getting started + +### How to create a hypercert + +Creating a hypercert is similar to creating an NFT on sites like OpenSea or Zora. + +In this article, we’ll walk through the steps one by one and explain exactly what you need to do to create your first hypercert. + +There are typically two ways of creating a hypercert: + +1. As a project affiliated with a specific funding network (e.g., Gitcoin Grants): In this case, you should receive a custom URL from the funding network that pre-populates most of your hypercert fields. You will still be able to change most of these, so you should review and adjust them as needed to better describe your hypercert. Guidance on how to do so (for Gitcoin Grants projects) is provided at the end of this doc. +2. As a project not affiliated with a specific funding network: In this case, you will be creating a hypercert from scratch and filling in each field on your own. Read on below. + +### Who can create a hypercert? + +Anyone doing work that is intended to have a positive impact can create a hypercert. Your hypercert can be as simple as "I did X on this date and want to claim all future impact from it". + +It can also represent something more, such as a phase in an ongoing team project, an invention or discovery, a research publication, or an important software release. + +Critically, if the work was done by more than one person, then each person should be listed as a contributor to the hypercert and approve the creation of the hypercert. + +_Note: In the future, the approval of each contributor will be verified on-chain._ + +### What do I need to create a hypercert? + +You will need to prepare all of the information required in the form builder (see **Step-by-step instructions for creating a hypercert** below). This includes important metadata, such as a description of the project and the dimensions of your impact claim, as well as a project artwork. You may also want to include an allowlist of wallets that are approved to claim one or more fractions of the hypercert. + +In addition to the information regarding the hypercert itself, you’ll need a crypto wallet to mint your hypercert. “Minting” a hypercert is the process of writing an impact claim to the blockchain. This establishes its immutable record of authenticity and ownership. + +Next, choose a blockchain on which to mint your hypercert. The hypercerts protocol is available on Ethereum, Goerli (testnet), and Optimism. Each of these blockchains has different gas fees associated with transactions on their networks. To reduce gas fees we recommend Optimism for most projects. + +Finally, go ahead and create your hypercert. + +### How much does it cost to create a hypercert? + +You will need enough Ethereum in your wallet to cover gas fees. In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). + +The protocol currently does not offer gas-free or "lazy" minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md new file mode 100644 index 00000000..9f3b6303 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md @@ -0,0 +1,130 @@ +--- +title: Step-by-step Instructions +id: step-by-step +sidebar_position: 2 +--- + +# Step-by-step instructions + +First, go to the [Create Hypercert](https://hypercerts.org/app/create) site with a wallet-enabled browser or follow the custom URL you received to access a prepopulated form. + +Although the site works on mobile, it is easier to use on desktop because the browser will display a dynamic preview of the hypercert while you fill out the Create form. + +Next, connect your wallet. You will be prompted to switch to the Ethereum or Optimism network. + +Once you've connected, you will see an empty form for creating a hypercert. + +### General fields + +#### Name of Hypercert + +Enter the name or title of the hypercert. This is the place to be verbose and specific about what the project is doing. You'll see on the preview when your title becomes too long. + +Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. + +Names are restricted to 100 characters but may include emojis (:smile:), accents (é), non-Latin scripts (表情), and other Unicode characters. + +#### Project Description + +Enter a human readable description of the hypercert. This is the place to share more details about the work and the team or individual behind the work. + +The description field supports [Markdown syntax](https://www.markdownguide.org/cheat-sheet/) and has a limit of 10,000 characters. + +In addition to the main link (see next field) you can add further links in the markdown to help others to understand the work of the project. + +#### Link + +A valid URL for the project, beginning with https:// + +This will be displayed next to the hypercert on webpages like OpenSea and should link users to a page that has more information about the project or impact claim. + +#### Logo + +An icon for the top left part of the card. This could be your project logo. It will be automatically masked to the shape of a circle. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +#### Background Banner Image + +A background image that will extend across the upper half of the artwork. This could be your project masthead or a unique piece of art. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +Currently we don't support zoom / cropping, so you will need to test the look and feel on your own. + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +### Work Scope fields + +#### Work Scope + +One or multiple tags describe the work that the hypercert represents. This work scope will be used to identify the work that is included in the hypercerts and the work that is not included. + +Multiple tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +_Note: In the future, you will be able to specifically exclude work from the hypercert._ + +#### Start and End Date of Work + +The work time period defines when the work was done that the hypercert represents, i.e., only the work in this time period is included in the hypercert. + +The time period of work doesn't need to be the start and end date of a project, but it can be. One project can be split up into multiple hypercerts, e.g. all hypercerts can have the same `work scope`, but different time periods of work. Of course, the time periods are not allowed to overlap. + +### Impact scope fields + +#### Impact Scope + +The impact scope can be used to limit the impact that a hypercert represents, e.g. for the work scope `Planting trees` a hypercert can represent _only_ the impact on biodiversity by including the impact scope tag `Biodiversity`. This would exclude all other impacts, including the impact on CO2 in the atmosphere, which can be useful if that impact is already captured by a carbon credit. + +By default this is set to "`all`" and we strongly recommend keeping it that way. + +Just like the work scope, multiple impact scope tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction). + +#### Start and End Date of Impact + +The impact time period is another way to limit the impact that a hypercert represents, e.g. inventing a new medical treatment has a positive impact over many years, but we might want to capture the positive impact separately for each year. + +By default the `impact start date` is the same as the `work start date` and the `impact end date` is "`indefinite`", i.e., the impact is not restricted time-wise. We strongly recommend keeping it that way. + +### Set of Contributors + +Provide a list of contributors, one per line, or comma-separated. + +The list should include _all_ contributors that performed the described work. + +Contributors are generally itemized as wallet addresses or ENS names, but can also be names / pseudonyms. Groups of contributors can be represented by a multisig or name of an organization. + +### Owners + +#### Allowlist + +The allowlist allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions afterwards. For example, it can be used to allocate fractions to previous funders and contributors. + +The allowlist is implemented as a CSV file specifying `index,address,price,fractions` headers. + +| index | address | price | fractions | +| ----- | ------------------------------------------ | ----- | --------- | +| 0 | 0x5dee7b340764c49a827c60d2b8729e49405fbefc | 0.0 | 100 | +| 1 | 0x1e2dbb9ca3f6d48e085384a821b7259abfdc7d65 | 0.0 | 50 | +| ... | ... | ... | ... | +| 999 | 0x436bad18642f45d3fa5fcaad0a2d81764a9cba85 | 0.0 | 1 | + +The `price` field is denominated in ETH. This should remain at 0.0 for all hypercerts, as primary sales are not currently supported through the app and the secondary sale/transfer of hypercerts is currently not allowed. + +You can store your allowlists on IPFS using [web3.storage](https://web3.storage/). + +:::note +If your allowlist is not properly formatted, you will be unable to mint your hypercert. If you do not include an allowlist, then the creator of the hypercert will receive 100% of the hypercert (set to a default of 10,000 units), which you can then sell or transfer to another wallet a maximum of one time. +::: + +#### Rights + +This field defines the rights that owners of the hypercert have over the work being claimed by this hypercert. + +By default this is set to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +_Note: In the future, additional rights can be included for different hypercerts._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md new file mode 100644 index 00000000..87fb9194 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md @@ -0,0 +1,23 @@ +--- +title: Open Impact Evaluations +id: evaluation +sidebar_position: 5 +--- + +A key design element is that hypercerts themselves do not make a claim about the size of the impact, but only account for the work that is supposed to be impactful. The figure below shows this contrast in a simplified illustration of the example that we introduced above. The open evaluation system allows multiple evaluations to point at the same area of the impact space that a hypercert claims. The evaluations can include self-evaluation from the contributors themselves. Funders observe these and make their funding decisions based on this richer set of information. + +![hypercert evaluations](../../static/img/hypercert_evaluations.png) + +The open evaluation system is also used to provide additional information, e.g. an evaluator or the project itself provides information about the health of the trees. This information can then be used transparently by other evaluators to evaluate the impact on CO2 in the atmosphere. + +An important feature is that the evaluations do not directly point at a hypercert, but rather at an area in the impact space. In practice this area will mostly be the exact same area that a hypercert claims, such that it can be considered an evaluation of the hypercert, but it does not have to. This feature ensures that, if hypercerts are merged or split, previous evaluations will continue to be linked appropriately. + +The form of evaluations can be standardized to simplify handling and comparing multiple evaluations from multiple evaluators. The open evaluation system allows for templates to be created and used by any evaluators. Similar to the emerging ontologies, these are not enforced centrally, but should emerge as useful standards – potentially steered by decentralized governance institutions. + +Important characteristics of the open evaluation system are: + +- Evaluators can submit multiple evaluations of the same area in the impact space as more information becomes available +- Evaluations can challenge other evaluations +- Evaluation methodologies can evolve over time + +These features allow the whole evaluation system to be dynamically improved by each actor. The relevant incentives for this improvement will stem from the funders who will value the signals from some evaluators more than others and evaluators are able to build up reputation. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md new file mode 100644 index 00000000..8acc11d1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md @@ -0,0 +1,104 @@ +--- +title: "Hypercerts: a New Primitive for Impact Funding Systems" +id: hypercerts-intro +sidebar_position: 3 +--- + +### Defining hypercerts + +A hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and represents all or parts of that impact. A hypercert has the following fields (one for each dimension): + +1. **Set of contributors:** An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. **Scope of work:** A conjunction of potentially-negated work scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +3. **Time of work:** A date range, from the start to the end of the work being claimed by this hypercert. +4. **Scope of impact:** A conjunction of potentially-negated impact scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +5. **Time of impact:** Date ranges from the start to the end of the impact. +6. **Rights of the owners:** An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Implementing hypercerts as a semi-fungible token allows multiple contributors and funders to own parts of hypercerts. For instance the original contributors can award 10% of a hypercert to a funder, while keeping 90%, which they can award to other funders later. This is why hypercerts are fractionalizable. + +### Examples + +In the simplest cases of hypercerts, the scope of work and impact as well as the time of impact are not restricted and no rights are transferred to owners of the hypercerts, i.e. the hypercerts just define the who (set of contributors) and when (time of work) of the claimed work. Scope of work and impact would be set to all, time of impact to “indefinite” and the rights to only “public display of support”. The latter is always included as the hypercert is a public record, such that owners will always automatically display their support of the work. + +Take for example hypercert 1 below: It represents all work that contributor 1 has performed in 2013 with all the impact that the work had from the beginning of the work; the hypercert doesn’t give any additional rights to the owners of the hypercert. + +The other fields – except the rights field – can be used to limit the work or impact that is represented by the hypercert. Hypercert 2 limits this to the work on IPFS in 2013, i.e. any other work besides IPFS that contributor 1 performed is not included. Hypercert 3 limits it even further as it excludes a specific aspect of IPFS, the go-ipfs implementation. + +| | **Hypercert 1** | **Hypercert 2** | **Hypercert 3** | +| ----------------------- | ------------------------- | ------------------------- | ------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | all | IPFS | IPFS ∧ ¬ go-ipfs | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | all | all | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → 2013-12-31 | +| **Rights** | Public display of support | Public display of support | Public display of support | + +In the table below we illustrate a use case for limiting the scope of impact. Suppose contributor 1 protects trees in a certain area. This work has positive effects on the CO2 in the atmosphere and could turn into carbon credits; however, the trees have additional positive impacts, such as protecting biodiversity. Instead of including all positive impacts in one hypercert (hypercert 4), the impact can be split between the impact on CO2 in the atmosphere (hypercert 5) and all other positive impacts (hypercert 6). If funders are willing to pay for biodiversity, this would be a new income opportunity. And it would account for the additional positive impact that other methods of reducing CO2 might not have, like industrial carbon capture. Importantly, negative impacts can not be excluded from a hypercert. + +| | **Hypercert 4** | **Hypercert 5** | **Hypercert 6** | +| ----------------------- | -------------------------- | -------------------------- | -------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | Protecting trees in area X | Protecting trees in area X | Protecting trees in area X | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | CO2 in atmosphere | all ∧ ¬ CO2 in atmosphere | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → indefinite | +| **Rights** | Public display of support | Public display of support | Public display of support | + +Importantly a hypercert does not specify the “size” of the impact, e.g. a hypercert does not state “5 tons of CO2 removed from the atmosphere.” Instead the hypercert only defines the work, e.g. “200 trees protected” (scope of work) in 2022 (time of work). The size of the impact is then left to the evaluations of the “CO2 in the atmosphere” (scope of impact) in 2022 (time of impact) that point towards the covered region of the hypercert. For instance: This allows a self evaluation to claim that 5 tons of CO2 were removed in a given year as well as one or multiple evaluations from independent auditors to confirm or challenge how much CO2 has been removed. An evaluator could detect that some of the trees were not healthy and hence only 4 tons of CO2 were removed. Allowing for multiple evaluation is a defining characteristic of the open evaluation system. + +### Functions of hypercerts + +#### 1. Identifiability + +Hypercerts clearly define the work that is supposed to be impactful by creating a record of who (set of contributors) claims to do or have done what (scope of work) in what time period (time of work). They also allow the creation of multiple records of the same work to identify separate impacts that this work had or will have (scope of impact) over specified time periods (time of impact). + +#### 2. Traceability + +As these records are public and logically monotonic (immutable, except to split or merge hypercerts), records are durable and permanent. + +#### 3. Transferability + +The records are a digital object that can be owned and ownership can be transferred (under specific conditions). As hypercerts can be created as fractionalizable, it is also possible to transfer only a specified fraction of the hypercert. Each hypercert defines the rights over the defined work that owners have, such as rights to retrospective rewards, rights to public display of the support (“bragging rights”) or rights to passive income from intellectual property. + +:::note Transferability restrictions + +Hypercerts are generally transferable. However, there are use cases, in which minters of hypercerts want to restrict how their hypercerts can be transferred. The protocol allows the minter to restrict who can transfer the hypercert and/or to whom the hypercert can be transferred. For instance, by specifying that only the original owner can transfer the hypercert, any future owner is prohibited from selling it, i.e. a secondary market would not exist for this hypercert. + +::: + +### Merging hypercerts + +Besides the fungible dimension, hypercerts can be merged and split on any of the six dimensions as shown in box 1. Let us take the hypercert 1 from the section "Hypercerts definition" and focus only on two of the dimensions, scope of work and time of work. These two dimensions create a simplified impact space. The figure below shows how work on IPFS (InterPlanetary File System) could have been minted over time in separate hypercerts, one for each quarter of work. + +![minting hypercerts example](../../static/img/creating.png) + +We created five hypercerts, one for each quarter of work. As the resulting work of all of these together is IPFS 0.1, the merged hypercert in total is more meaningful and more valuable than just the five individual hypercerts. In this case the proverb is true, the whole is greater than the sum of its parts. Hence, we want to merge them as shown in the next figure. + +![merging hypercerts example](../../static/img/merging.png) + +### Splitting hypercerts + +Conversely, splitting can increase the meaningfulness and value of hypercerts as well. We can split the work on IPFS 0.1 into the conceptual work “invention of IPFS” and the implementation via “go-ipfs 0.1” as shown in the next figure. + +![splitting hypercerts examples](../../static/img/splitting.png) + +Other use cases are where multiple contributors want to combine their work on the same scope of work (merging) or disentangle their work (splitting). Ultimately, splitting and merging allows users to repackage the digital representation of their work and impact. + +Importantly, splitting and merging are the only operations that are permitted to change hypercerts. Once an area in the impact space is claimed, it can not be unclaimed. This ensures that claims are never forgotten. + +### Retiring hypercerts + +While a claim in the impact space can not be unclaimed, it can be retired. Retiring a hypercert means that owners can not transfer and sell it anymore. This way owners prove that they are the final buyers of the impact. Technically retiring hypercerts means that they are sent to a specific null address, which ensures that the retired hypercerts are recorded and traceable. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md new file mode 100644 index 00000000..6f71ac50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md @@ -0,0 +1,103 @@ +--- +title: The Need for Interoperable Impact Funding Systems (IFSs) +id: ifs +--- + +# The Need for Interoperable Impact Funding Systems (IFSs) + +### An IFS consists of + +- **Actors:** Contributors, funders, evaluators, and beneficiaries +- **Funding mechanisms:** Grants, bounties, retrospective funding, etc. +- **Coordination mechanisms:** Roadmapping, communication forums, etc. +- **A goal:** Maximize the domain-specific positive value created (impact) + +The goal will be specific to the impact area, e.g. prevent existential risks from artificial intelligence (AI) would be the goal for the impact area “AI safety.” To achieve these goals, skilled contributors must work with high effort on promising projects. Additionally, for those projects that create impact continuously, sufficient income streams are necessary to cover both their ongoing operating expenses and contributors’ upside incentives. + +#### Actors in IFSs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeSubtypeDescription
ContributorsPeople or organizations who do the work
FundersProspective fundersPeople or organizations who fund work before it is done
Retrospective fundersPeople or organizations who fund work after it is done
EvaluatorsScoutsPeople or organizations who evaluate the potential impact of work before it is done
AuditorsPeople or organizations who evaluate the impact of work after it is done
BeneficiariesPeople or objects that are impacted by the work
+ +### Guiding questions for designing IFSs + +1. **Projects:** How can we improve the chances that the most promising projects are worked on? +2. **Talent & resources:** How can we attract top talent to contribute to the most promising projects and provide them with the necessary resources? +3. **Effort:** How can we reward contributors for their impact on outcomes? +4. **Sustainable income:** How can we create recurring income streams and financial sustainability for impactful projects? + +Markets have been proven very powerful in answering these questions if they are directed towards maximizing profits. As we are directing systems towards maximizing impact, these answers become more challenging. In particular, in an IFS we are facing coordination and incentive problems in funding impact, such as the free-rider problem. + +### Example dynamics between actors in an IFS + +In order for impact funding systems to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources and (3) evaluations. In the diagram below you see a potential dynamic between the actors of an IFS. In that scenario hypercerts can account for the prospective funding (steps 2-3) as well as for the retrospective funding (steps 8-9) from different funders. Evaluations are made public and can be discovered through the hypercerts for all funders (steps 5-7). Retrospective funders can reward not only the contributors but also the prospective funders (steps 10-11). + +```mermaid +sequenceDiagram + autonumber + participant Beneficiaries + participant Contributors + participant Prospective funders + participant Retrospective funders + participant Evaluators + Contributors ->> Contributors: Mint hypercerts + Prospective funders ->> Contributors: Award funding + Contributors ->> Prospective funders: Award fractions of
the hypercert + Contributors ->> Beneficiaries: Create impact + Retrospective funders ->> Evaluators: Fund evaluation + Evaluators ->> Beneficiaries: Evaluate impact on beneficiaries + Evaluators ->> Retrospective funders: Make evaluations public,
esp. for retrospective
funders + Retrospective funders ->> Contributors: Award funding + Contributors ->> Retrospective funders: Award fractions of hypercerts + opt + Retrospective funders ->> Prospective funders: Award funding + Prospective funders ->> Retrospective funders: Transfer fractions
of hypercert + end +``` + +### Hypercerts as a data layer for IFSs + +By serving as a single, open, shared, decentralized database hypercerts lower the transaction costs to coordinate and fund impactful work together. This is important because the optimal funding decisions of a single funder depends on the funding decision of all other funders. For instance, some work is only impactful if a minimum funding is provided: The impact is non-linear in the funding amount, e.g. half a bridge is not half as impactful as a full bridge. Other work might be over-funded, i.e. the impact of an additional dollar is basically zero. Ultimately, funders want to find the highest impact for each additional dollar spend (cf. S-process as in Critch, 2021). Today multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Through hypercerts the funding becomes more transparent and the credits for funding impactful work can be easily shared. Coordinating funding becomes easier. + +Hypercerts don’t solve this coordination problem by themselves, but build the basis for different decision and funding mechanisms as shown below. Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. Hypercerts do not lock in any particular decision-making scheme for funders. + +![Hypercerts as a data layer for an IFS](../../static/img/hypercert_data_layer.png) + +Looking farther into the future: If a large majority of funding across an entire IFS ends up flowing through hypercerts, funders have created the transparency that enables each of them to make the best decisions given the funding decision of everyone else. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md new file mode 100644 index 00000000..f8fed762 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md @@ -0,0 +1,35 @@ +--- +title: A Consistent Impact Space +id: impact-space +sidebar_position: 4 +--- + +Every hypercert represents a claim in the impact space, which itself represents all possible claims. Above we illustrated the impact space with two dimensions, scope and time of work. The complete impact space is spanned by the six dimensions introduced in the definition of hypercerts. + +### Consistency of the impact space + +Every point in the impact space should either be claimed or not be claimed. No point must be claimed twice, or equivalently: + +- If the impact of some work is represented in one hypercert, it must not be part of any other hypercert. +- Hypercerts must not overlap with each other. + +The table below shows two hypercerts that were illustrated in the section on "Hypercerts operations", but now with all six fields. The two hypercerts can represent the exact same work by the same contributor, but they do not overlap because of the difference in the time of work. + +| | **Hypercert 7** | **Hypercert 8** | +| ----------------------- | ------------------------ | ------------------------ | +| **Set of contributors** | Contributor 1 | Contributor 1 | +| **Scope of work** | IPFS | IPFS | +| **Time of work** | 2013-10-01 to 2013-12-31 | 2014-01-01 to 2014-03-31 | +| **Scope of impact** | all | all | +| **Time of impact** | 2013-10-01 → indefinite | 2014-01-01 → indefinite | +| **Rights** | None | None | + +The consistency of the impact space is crucial as it ensures that no rights to an impact claim are sold twice. If for example someone owns the right to retrospective rewards for the impact of some work, the owners must be identifiable unambiguously. + +Because users can create hypercerts with arbitrary data on any chain, on which a hypercert contract is deployed, we provide ways to help users detect collisions in the impact space. For example, if one hypercert on Ethereum points to the work on “IPFS”, and another hypercert on Filecoin points to the work on “https://github.com/ipfs/go-ipfs” both with the same contributor and time of work, which of these overlapping hypercerts is the correct one to support? To surface such overlapping hypercerts, the hypercerts protocol and SDK will support mechanisms to index, search, and visualize neighbors in the impact space. With these tools evaluators can quickly detect potential conflicts and submit the results as evaluations to help disambiguate proper credit and attribution. + +### Emerging ontologies + +Common ontologies for the scope of work and scope of impact are useful to create transparency and improve discoverability. Such ontologies need to be created from the practices and should be adapted over time. They are like emerging norms, instead of fixed rules. However, some larger players or a group of smaller players could enforce certain ontologies, e.g. if multiple funders agree that they only fund projects that follow a specified ontology. + +As some ontologies might be more useful than others, we would ideally see a consensus emerge between participants and experts in each impact area. Decentralized governance institutions can help facilitate this; however, further details on the design are out of the scope of this paper and are left for future work. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md new file mode 100644 index 00000000..57444581 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md @@ -0,0 +1,42 @@ +--- +title: Retrospective Impact Funding +id: retrospective-funding +sidebar_position: 6 +--- + +### Introducing retrospective funding + +While hypercerts do not impose any specific funding mechanisms, they are especially useful for retrospective funding. The core idea, from the perspective of contributors building impactful goods, is this: if you can reasonably expect to get funded retrospectively for your work once you produce a positive impact, then you can work now, in expectation of a probabilistic future cash flow. In another conception, you are effectively “borrowing” money from this anticipated future cash flow to fund the work in the first place; the expectation of future funding “retro-causes” the impactful work. Retrospective funding may be able to 1) provide incentives for contributors to take on impactful goods projects with a potentially high, but uncertain, impact and 2) create a more efficient IFS by back-propagating signals on what outcomes were impactful post-hoc. + +In addition, contributors are able to receive fair compensation by providing outsized impact that will be highly valued. It incentivizes you to create a positive impact, beyond your intrinsic motivation. This does not mean that the most successful contributors to impactful goods automatically have potential upside comparable to some for-profit startup founders (or that they should), just that their potential upside does depend on how much funders later value their past work. This will attract more talent to the impact sector by improving performance-based compensation. + +The crucial aspect for this to work: funders need to retrospectively fund impact, and send credible signals that they will do so in the future. Based on these signals contributors form expectations about future retrospective rewards and can start working today to receive them in the future. + +Hypercerts facilitate retrospective funding as the impact claims are identifiable, traceable and transferable. Contributors can sell parts of their hypercerts to prospective funders to receive the necessary funding for their project (“activity” in the figure below). The project delivers impact to a larger group (“beneficiaries”), which retrospectively buys the hypercerts from the prospective funder, and from the contributors if they retained some fraction of their hypercerts (the latter is not represented in the figure). + +![Retrospective funding with hypercerts](../../static/img/retrospective_funding.png) + +### Increasing rewards + +Retrospective funding allows us to increase rewards as more impact is created because impact is easier to observe, measure and prove retrospectively. Increasing rewards – as shown in the next figure – incentivizes contributors to put in their highest effort to produce impact and enables contributors to be rewarded for their talent. Moreover, prospective funders are incentivized to select, fund and support the projects with the highest expected impact, if they also receive retrospective rewards. + +![Increasing rewards](../../static/img/increasing_rewards.png) + +Note that retrospective funding should not be used in cases where a significant negative impact is possible since a nongovernmental, permissionless framework can not impose retrospective penalties for negative externalities. See Ofer & Cotton-Barratt (2022) for a discussion of this limitation of retrospective funding. + +In some cases we do not expect the retrospective evaluation to be any different than the prospective evaluation, i.e. there is no uncertainty resolved over time as the impact of an activity is already “known” prospectively. In these cases retrospective funding would only complicate the funding mechanism and funding via grants or milestone bounties would be preferable. Retrospective funding is preferable only if uncertainty is resolved over time. + +### Impact evaluations + +The relevance of impact evaluations will depend on how much their signals influence the funding decisions of retrospective funders (see the potential dynamics in the section on "IFSs"). This is a critical difference to many impact reports today: If a project was funded by a grant, the funders as well as the project want to receive a positive evaluation. If, however, the funding decisions of the retrospective funders are outstanding, they are interested in truthful signals about the impact. Hence, funders value improvements in evaluation methodologies and can fund independent evaluators. Evaluators in turn would build up a reputation for their evaluation methodologies and improve the strength of their signals to retrospective funders. + +Impact evaluators can take on a range of forms ranging forms, such as + +- Voting by relevant communities or beneficiaries +- Expert panels +- Professional evaluators similar to financial rating agencies +- Automatic monitoring and data collection by sensors and oracles + +The most useful form or combinations thereof will depend on the specific requirements of the impact area. For a generalized framework on impact evaluators see Protocol Labs (2023). + +While retrospective funding makes impact evaluations financially relevant for funders and contributors, hypercerts enable to pre-commit funding for those evaluations: As impact claims are never forgotten, any actor can at any time commit funding to a future evaluation of these claims. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md new file mode 100644 index 00000000..4d4648ba --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md @@ -0,0 +1,24 @@ +--- +title: Introduction +id: whitepaper-intro +--- + +# Vision & Whitepaper + +:::note + +If you prefer to read the draft whitepaper (v0) as a pdf, you can find it [here](../../static/pdf/hypercerts_whitepaper_v0.pdf). The content is mostly identical to the following pages. + +::: + +#### The world faces unprecedented challenges, from climate change to safe artificial intelligence, that require billions to trillions of dollars of public goods funding. + +High-upside/high-uncertainty endeavors are often overlooked due to the absence of strong incentives to pursue them in the dominant public goods funding framework of at-cost grants or even a milestone-bounty framework (which directly exposes small contributors to aversive risk levels). Yet these should be pursued when the expected positive value is very high, as it often is. New impact funding mechanisms can address this. One such mechanism is retrospective funding, which rewards projects based on the impact they create after the impact is observable. If projects can reasonably expect such retrospective rewards, they are incentivized to maximize their impact and – together with prospective funders – take risky bets when the expected positive value is high. + +#### In order for Impact Funding Systems (IFSs) to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources, and (3) evaluations. + +Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. We do not wish to lock in any particular decision-making scheme for funders. Without mechanisms like these, multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Funders should be able to easily collaborate with other funders or to intentionally fund different projects to diversify the funded approaches. Evaluators should be able to evaluate the same impact with different methodologies – potentially with conflicting results, to foster rigor and progress of evaluation methodologies. + +#### Hypercerts create this interoperability by serving as a single, open, shared, decentralized database for impact funding mechanisms. + +A single hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and whose ownership is fractionizable and transferable (under specific conditions). Hypercerts do not impose any specific funding mechanisms but provide baseline invariant guarantees such that claims will not be forgotten as different mechanisms come into and out of fashion. This is also why hypercerts are especially useful for any retrospective funding mechanisms – funding can be applied to claims of the past. diff --git a/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json b/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json new file mode 100644 index 00000000..33a5ba79 --- /dev/null +++ b/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json @@ -0,0 +1,162 @@ +{ + "mySidebar": [ + { + "type": "doc", + "id": "intro" + }, + { + "type": "category", + "label": "Vision & Whitepaper", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "whitepaper/whitepaper-intro" + }, + { + "type": "doc", + "id": "whitepaper/ifs" + }, + { + "type": "doc", + "id": "whitepaper/hypercerts-intro" + }, + { + "type": "doc", + "id": "whitepaper/impact-space" + }, + { + "type": "doc", + "id": "whitepaper/evaluation" + }, + { + "type": "doc", + "id": "whitepaper/retrospective-funding" + } + ] + }, + { + "type": "category", + "label": "Developer Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "developer/quickstart-javascript" + }, + { + "type": "doc", + "id": "developer/quickstart-solidity" + }, + { + "type": "doc", + "id": "developer/minting" + }, + { + "type": "doc", + "id": "developer/allowlists" + }, + { + "type": "doc", + "id": "developer/querying" + }, + { + "type": "doc", + "id": "developer/split-merge" + }, + { + "type": "doc", + "id": "developer/evaluations" + }, + { + "type": "doc", + "id": "developer/burning" + }, + { + "type": "doc", + "id": "developer/supported-networks" + }, + { + "type": "doc", + "id": "devops/index" + }, + { + "type": "category", + "label": "API Reference", + "collapsed": true, + "items": [ + { + "type": "category", + "label": "Contracts", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "developer/api/contracts/HypercertMinter" + }, + { + "type": "doc", + "id": "developer/api/contracts/SemiFungible1155" + }, + { + "type": "doc", + "id": "developer/api/contracts/AllowlistMinter" + } + ] + }, + { + "type": "doc", + "id": "developer/api/sdk/modules" + } + ] + } + ] + }, + { + "type": "category", + "label": "Minting Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "minting-guide/minting-guide-start" + }, + { + "type": "doc", + "id": "minting-guide/step-by-step" + }, + { + "type": "doc", + "id": "minting-guide/gitcoin-round" + } + ] + }, + { + "type": "category", + "label": "Implementation", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "implementation/token-standard" + }, + { + "type": "doc", + "id": "implementation/metadata" + }, + { + "type": "doc", + "id": "implementation/glossary" + } + ] + }, + { + "type": "doc", + "id": "faq" + }, + { + "type": "doc", + "id": "further-resources" + } + ] +} diff --git a/docs/versions.json b/docs/versions.json index 1e3a80c1..41c95742 100644 --- a/docs/versions.json +++ b/docs/versions.json @@ -1 +1 @@ -["0.3.0", "0.0.1"] +["1.0.0-alpha.0", "0.3.0", "0.0.1"] From b253cd6cf42bf33695005a40d536a6507c545b23 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 5 Dec 2023 00:25:14 +0100 Subject: [PATCH 036/118] Feat/docs tests cleanup (#1211) * feat(checks): checkValidityHC, error code, 0.8.17 * feat(validator): overvalidator HC tests * fix(clean): remove hyperboard references * fix(lint): pragma protocol tests * fix(pragma): restore FeeManagerRoy.. pragma * feat(docs): updated version * feat(build): docs 1.0.0-alpha * chore(docs): natspec tweaks --- contracts/src/marketplace/TransferSelectorNFT.sol | 7 ++++--- .../executionStrategies/StrategyHypercertFractionOffer.sol | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/contracts/src/marketplace/TransferSelectorNFT.sol b/contracts/src/marketplace/TransferSelectorNFT.sol index 5a6e2998..d66d40b4 100644 --- a/contracts/src/marketplace/TransferSelectorNFT.sol +++ b/contracts/src/marketplace/TransferSelectorNFT.sol @@ -33,7 +33,7 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { * @notice Constructor * @param _owner Owner address * @param _protocolFeeRecipient Protocol fee recipient address - * @param _transferManager Address of the transfer manager for ERC721/ERC1155 + * @param _transferManager Address of the transfer manager for ERC721/ERC1155/Hypercerts */ constructor(address _owner, address _protocolFeeRecipient, address _transferManager) ExecutionManager(_owner, _protocolFeeRecipient) @@ -44,7 +44,7 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { /** * @notice This function is internal and used to transfer non-fungible tokens. * @param collection Collection address - * @param collectionType Collection type (e.g. 0 = ERC721, 1 = ERC1155) + * @param collectionType Collection type (e.g. 0 = ERC721, 1 = ERC1155, 2 = Hypercert); only 0 and 1 are supported. * @param sender Sender address * @param recipient Recipient address * @param itemIds Array of itemIds @@ -70,7 +70,7 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { /** * @notice This function is internal and used to split a hypercert fraction or execute a transfer of the fraction. * @param collection Collection address - * @param collectionType Collection type (e.g. 0 = ERC721, 1 = ERC1155, 2 = Hypercert) + * @param collectionType Collection type (e.g. 0 = ERC721, 1 = ERC1155, 2 = Hypercert); only 2 is supported. * @param sender Sender address * @param recipient Recipient address * @param itemIds Array of itemIds @@ -89,6 +89,7 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { revert UnsupportedCollectionType(); } + // Check if split strategies if ( strategyInfo[strategyId].selector == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol index 0680f264..84972b4c 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -34,7 +34,9 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; * Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. * Bob wants to buy 10 units. * Bob can create a taker bid order with the following parameters: - * - unitAmount: 10 + * - unitAmount: 10000 // Total amount for sale; in `amounts` array + * - minUnitAmount: 100 // Minimum amount to buy; in `additionalParameters` + * - maxUnitAmount: 1000 // Maximum amount to buy; in `additionalParameters` * - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) * - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 * - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] From 2637ed0862298f0f46233094fe83789993fed603 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 5 Dec 2023 00:49:24 +0100 Subject: [PATCH 037/118] Feat/docs tests cleanup (#1212) * feat(checks): checkValidityHC, error code, 0.8.17 * feat(validator): overvalidator HC tests * fix(clean): remove hyperboard references * fix(lint): pragma protocol tests * fix(pragma): restore FeeManagerRoy.. pragma * feat(docs): updated version * feat(build): docs 1.0.0-alpha * chore(docs): natspec tweaks * feat(docs): docs sidebar --- docs/docs/developer/config.md | 4 +- .../version-1.0.0-alpha.1/about.md | 24 + .../developer/allowlists.md | 101 ++ .../api/contracts/AllowlistMinter.md | 84 ++ .../api/contracts/HypercertMinter.md | 895 +++++++++++++ .../api/contracts/HypercertTrader.md | 434 +++++++ .../api/contracts/IHypercertMinter.md | 39 + .../api/contracts/SemiFungible1155.md | 457 +++++++ .../v0.8/interfaces/AggregatorV3Interface.md | 77 ++ .../api/contracts/forge-std/src/console.md | 1 + .../api/contracts/forge-std/src/console2.md | 3 + .../api/contracts/interfaces/IAllowlist.md | 29 + .../contracts/interfaces/IHypercertToken.md | 192 +++ .../contracts/interfaces/IHypercertTrader.md | 133 ++ .../developer/api/contracts/libs/Errors.md | 59 + .../marketplace/BatchOrderTypehashRegistry.md | 46 + .../CreatorFeeManagerWithRebates.md | 76 ++ .../CreatorFeeManagerWithRoyalties.md | 64 + .../contracts/marketplace/CurrencyManager.md | 250 ++++ .../contracts/marketplace/ExecutionManager.md | 751 +++++++++++ .../marketplace/InheritedStrategy.md | 9 + .../marketplace/LooksRareProtocol.md | 1157 +++++++++++++++++ .../api/contracts/marketplace/NonceManager.md | 193 +++ .../marketplace/ProtocolFeeRecipient.md | 75 ++ .../contracts/marketplace/StrategyManager.md | 391 ++++++ .../contracts/marketplace/TransferManager.md | 553 ++++++++ .../marketplace/TransferSelectorNFT.md | 779 +++++++++++ .../executionStrategies/BaseStrategy.md | 41 + .../BaseStrategyChainlinkPriceLatency.md | 212 +++ .../StrategyChainlinkUSDDynamicAsk.md | 342 +++++ .../StrategyCollectionOffer.md | 127 ++ .../StrategyDutchAuction.md | 83 ++ .../StrategyHypercertFractionOffer.md | 123 ++ .../StrategyItemIdsRange.md | 75 ++ .../marketplace/helpers/OrderValidatorV2A.md | 215 +++ .../marketplace/helpers/ProtocolHelpers.md | 159 +++ .../interfaces/ICreatorFeeManager.md | 60 + .../interfaces/ICurrencyManager.md | 22 + .../interfaces/IExecutionManager.md | 99 ++ .../interfaces/IImmutableCreate2Factory.md | 41 + .../interfaces/ILooksRareProtocol.md | 157 +++ .../marketplace/interfaces/INonceManager.md | 53 + .../interfaces/IRoyaltyFeeRegistry.md | 29 + .../marketplace/interfaces/IStrategy.md | 41 + .../interfaces/IStrategyManager.md | 84 ++ .../interfaces/ITransferManager.md | 111 ++ .../libraries/CurrencyValidator.md | 7 + .../libraries/LowLevelHypercertCaller.md | 21 + .../MerkleProofCalldataWithNodes.md | 7 + .../OpenZeppelin/MerkleProofMemory.md | 7 + .../marketplace/libraries/OrderStructs.md | 7 + .../api/contracts/protocol/AllowlistMinter.md | 84 ++ .../api/contracts/protocol/HypercertMinter.md | 895 +++++++++++++ .../contracts/protocol/SemiFungible1155.md | 457 +++++++ .../protocol/interfaces/IAllowlist.md | 29 + .../protocol/interfaces/IHypercertToken.md | 192 +++ .../api/contracts/protocol/libs/Errors.md | 59 + .../developer/api/sdk/.nojekyll | 1 + .../developer/api/sdk/README.md | 185 +++ .../developer/api/sdk/classes/ClientError.md | 68 + .../api/sdk/classes/ConfigurationError.md | 66 + .../developer/api/sdk/classes/FetchError.md | 68 + .../api/sdk/classes/HypercertClient.md | 493 +++++++ .../api/sdk/classes/HypercertsStorage.md | 250 ++++ .../api/sdk/classes/InvalidOrMissingError.md | 68 + .../api/sdk/classes/MalformedDataError.md | 68 + .../developer/api/sdk/classes/MintingError.md | 68 + .../developer/api/sdk/classes/StorageError.md | 68 + .../api/sdk/classes/UnknownSchemaError.md | 71 + .../api/sdk/classes/UnsupportedChainError.md | 72 + .../api/sdk/classes/internal.default-1.md | 278 ++++ .../api/sdk/classes/internal.default-2.md | 131 ++ .../api/sdk/classes/internal.default.md | 110 ++ .../api/sdk/interfaces/CustomError.md | 39 + .../api/sdk/interfaces/DuplicateEvaluation.md | 56 + .../api/sdk/interfaces/EASEvaluation.md | 56 + .../api/sdk/interfaces/HypercertClaimdata.md | 167 +++ .../interfaces/HypercertClientInterface.md | 341 +++++ .../sdk/interfaces/HypercertClientMethods.md | 239 ++++ .../sdk/interfaces/HypercertClientState.md | 68 + .../interfaces/HypercertEvaluationSchema.md | 47 + .../interfaces/HypercertIndexerInterface.md | 176 +++ .../api/sdk/interfaces/HypercertMetadata.md | 123 ++ .../api/sdk/interfaces/HypercertPointer.md | 45 + .../interfaces/HypercertStorageInterface.md | 130 ++ .../api/sdk/interfaces/IPFSEvaluation.md | 34 + .../sdk/interfaces/SimpleTextEvaluation.md | 45 + .../interfaces/internal.EvaluatorInterface.md | 43 + .../interfaces/internal.HypercertClaimdata.md | 169 +++ .../interfaces/internal.HypercertMinter.md | 17 + .../developer/api/sdk/modules.md | 638 +++++++++ .../developer/api/sdk/modules/internal.md | 307 +++++ .../developer/burning.md | 12 + .../version-1.0.0-alpha.1/developer/config.md | 110 ++ .../version-1.0.0-alpha.1/developer/errors.md | 18 + .../developer/evaluations.md | 13 + .../developer/minting.md | 57 + .../developer/querying.md | 306 +++++ .../developer/quickstart-javascript.md | 101 ++ .../developer/quickstart-solidity.md | 41 + .../developer/split-merge.md | 29 + .../developer/supported-networks.md | 13 + .../devops/deploy-proxy.md | 120 ++ .../version-1.0.0-alpha.1/devops/errors.md | 45 + .../version-1.0.0-alpha.1/devops/index.md | 18 + .../version-1.0.0-alpha.1/devops/pause.md | 29 + .../version-1.0.0-alpha.1/devops/plasmic.md | 76 ++ .../version-1.0.0-alpha.1/devops/setup.md | 41 + .../version-1.0.0-alpha.1/devops/upgrade.md | 35 + .../version-1.0.0-alpha.1/faq.md | 139 ++ .../further-resources.md | 37 + .../implementation/glossary.md | 139 ++ .../implementation/metadata.md | 188 +++ .../implementation/token-standard.md | 29 + .../version-1.0.0-alpha.1/intro.md | 58 + .../minting-guide/gitcoin-round.md | 166 +++ .../minting-guide/minting-guide-start.md | 44 + .../minting-guide/step-by-step.md | 130 ++ .../whitepaper/evaluation.md | 23 + .../whitepaper/hypercerts-intro.md | 104 ++ .../version-1.0.0-alpha.1/whitepaper/ifs.md | 103 ++ .../whitepaper/impact-space.md | 35 + .../whitepaper/retrospective-funding.md | 42 + .../whitepaper/whitepaper-intro.md | 24 + .../version-1.0.0-alpha.1-sidebars.json | 165 +++ docs/versions.json | 3 +- 126 files changed, 18009 insertions(+), 4 deletions(-) create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/about.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/faq.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md create mode 100644 docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json diff --git a/docs/docs/developer/config.md b/docs/docs/developer/config.md index b26fc0e8..0be153cb 100644 --- a/docs/docs/developer/config.md +++ b/docs/docs/developer/config.md @@ -9,7 +9,6 @@ The client provides a high level interface that communicates with the Graph, IPF The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: 1. Overrides declared in `Partial` -2. Environment variables exposed via `process.env` Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. @@ -17,8 +16,7 @@ We then process the rest of the overrides and possible environment variables to To get started quickly you can either: -- set `process.env.DEFAULT_CHAIN_ID` to 5 or 10 -- initialize a new client by calling `new HypercertClient({chainId: 5})` (or 10) +- initialize a new client by calling `new HypercertClient({chain: {id: 5})` (or 10) Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/about.md b/docs/versioned_docs/version-1.0.0-alpha.1/about.md new file mode 100644 index 00000000..e2d4eb79 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/about.md @@ -0,0 +1,24 @@ +--- +title: The Hypercerts Foundation +id: about +--- + +# The Hypercerts Foundation + +### Mission + +The mission of the Hypercerts Foundation is to advance the development and adoption of open-source protocols for funding and rewarding positive impact. + +### Organization + +The Hypercerts Foundation is a fully independent organisation working closely with stakeholders in the open source, scientific research, and cryptography communities to develop and promote additional protocols that are decentralized, secure, and transparent. The Foundation will also provide support and resources to help drive the wider adoption of these protocols. + +### History + +Research on hypercerts was first presented to the public by David A. Dalrymple at the conference series Funding the Commons in March 2022. However, the concept of “impact certificates” has been a recurring theme at conferences and in online discussion forums since at least 2014. In late 2022, a small team of research scientists, developers, and practitioners began implementing hypercerts as a set of Ethereum-based smart contracts that could be used to assert and fund impact claims. The Hypercerts Foundation will now serve as the long-term home for this work. + +The new foundation is supported in part by Protocol Labs and is part of the broader Protocol Labs Network of hundreds of companies and organizations. The Foundation will complement Protocol Labs Network’s mission of enabling a more secure, open, and accessible internet. The Hypercerts Foundation, however, is fully independent and will focus on protocol development and cultivating a community of developers and impact entrepreneurs well beyond the Protocol Labs Network. + +### Further links + +Read the full [announcement of the Hypercerts Foundation](https://hypercerts.notion.site/Introducing-the-Hypercerts-Foundation-d956203fe0fc4792980da138015e770a). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md new file mode 100644 index 00000000..bc65b116 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md @@ -0,0 +1,101 @@ +# Allowlists + +Allowlists are an efficient way to enable distribution of hypercert fractions amongst a group. +First, the creator will create the hypercert with the metadata and an immutable allowlist. +With the `claimId`, every account specified in the allowlist can later mint their fraction token from that allowlist. + +## Create an allowlist + +First specify an allowlist, mapping addresses to the number of units they should receive. + +```js +import { + TransferRestrictions, + formatHypercertData, + Allowlist, +} from "@hypercerts-org/sdk"; + +const allowlist: Allowlist = [ + { address: "0x123", units: 100 }, + { address: "0xabc", units: 100 }, +]; +``` + +Then, call `createAllowlist` with the metadata and allowlist. + +```js +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; +const transferRestrictions = TransferRestrictions.FromCreatorOnly + +const { claimId } = await hypercerts.createAllowlist({ + allowList, + metaData, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **note** We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree generation and data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree) + +It first checks if the client is writable and if the operator is a signer. If the operator is not a signer, it throws an `InvalidOrMissingError`. + +Next, it validates the allowlist and metadata by calling the `validateAllowlist` and `validateMetaData` functions respectively. If either the allowlist or metadata is invalid, it throws a `MalformedDataError`. + +Once the allowlist and metadata are validated, the method creates a Merkle tree from the allowlist and stores it on IPFS. It then stores the metadata on IPFS as well. + +Finally, the method invokes the `createAllowlist` function on the contract with the signer's `address`, the total number of `units`, the Merkle tree `root`, the metadata `CID`, and the `transfer restrictions`. If the method is called with `overrides`, it passes them to the createAllowlist function. + +## Claiming a fraction token + +Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: + +| Variable | Type | Source | +| -------- | ------------ | ------------ | +| claimId | BigNumberish | Hypercert ID | +| units | BigNumberish | Allowlist | +| proof | BytesLike[] | Merkle tree | + +We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. + +Then, call `mintClaimFractionFromAllowlist` with the required data. The contracts will also verify the proofs. However, when providing the `root` in the function input, the proofs will be verified before a transaction is submitted. + +```js +import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; + +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const address = "0xc0ffee254729296a45a3885639AC7E10F9d54979"; + +const { indexer, storage } = hypercertsClient; +const claimById = await indexer.claimById(claimId); +const { uri, tokenID: _id } = claimById.claim; +const metadata = await storage.getMetadata(uri || ""); +const treeResponse = await storage.getData(metadata.allowList); +const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); + +let args; +// Find the proof in the allowlist +for (const [leaf, value] of tree.entries()) { + if (value[0] === address) { + args = { + proofs: tree.getProof(leaf), + units: Number(value[1]), + claimId: _id, + }; + break; + } +} + +// Mint fraction token +const tx = await hypercerts.mintClaimFractionFromAllowlist({ + ...args, +}); +``` + +Let's see what happens under the hood: + +First, the method checks that the client is not `read only` and that the operator is a signer. If not, it throws an `InvalidOrMissingError`. + +Next, the method verifies the Merkle `proof` using the OpenZeppelin Merkle tree library. If a `root` is provided, the method uses it to verify the proof. If the proof is invalid, it throws an error. + +Finally, the method calls the `mintClaimFromAllowlist` function on the contract with the signer `address`, Merkle `proof`, `claim ID`, and number of `units` as parameters. If overrides are provided, the method uses them to send the transaction. Otherwise, it sends the transaction without overrides. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md new file mode 100644 index 00000000..e31e8840 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md @@ -0,0 +1,434 @@ +# HypercertTrader + +_bitbeckers_ + +> Contract for managing hypercert trades + +Implementation of the HypercertTrader Interface + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsForSale | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +### getOffer + +```solidity +function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------- | ----------- | +| \_0 | IHypercertTrader.Offer | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### offers + +```solidity +function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | --------------------------------- | ----------- | +| offerer | address | undefined | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsAvailable | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| offerType | enum IHypercertTrader.OfferType | undefined | +| status | enum IHypercertTrader.OfferStatus | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### totalUnitsForSale + +```solidity +function totalUnitsForSale(address, uint256) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +## Errors + +### InvalidBuy + +```solidity +error InvalidBuy(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### InvalidOffer + +```solidity +error InvalidOffer(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### NotAllowed + +```solidity +error NotAllowed() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md new file mode 100644 index 00000000..13a84632 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md @@ -0,0 +1,39 @@ +# IHypercertMinter + +## Methods + +### ownerOf + +```solidity +function ownerOf(uint256 id) external view returns (address) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 id) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md new file mode 100644 index 00000000..6be07157 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md @@ -0,0 +1,77 @@ +# AggregatorV3Interface + +## Methods + +### decimals + +```solidity +function decimals() external view returns (uint8) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ----- | ----------- | +| \_0 | uint8 | undefined | + +### description + +```solidity +function description() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### getRoundData + +```solidity +function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------ | ----------- | +| \_roundId | uint80 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### latestRoundData + +```solidity +function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### version + +```solidity +function version() external view returns (uint256) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md new file mode 100644 index 00000000..8d14ad8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md @@ -0,0 +1 @@ +# console diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md new file mode 100644 index 00000000..cb666cd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md @@ -0,0 +1,3 @@ +# console2 + +_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md new file mode 100644 index 00000000..06fb700c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md @@ -0,0 +1,133 @@ +# IHypercertTrader + +_bitbeckers_ + +> Interface for hypercert token trading + +This interface declares the required functionality to interact with the hypercert marketplace + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| units | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +## Events + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md new file mode 100644 index 00000000..4cb96bfc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md @@ -0,0 +1,46 @@ +# BatchOrderTypehashRegistry + +_LooksRare protocol team (👀,💎)_ + +> BatchOrderTypehashRegistry + +The contract generates the batch order hash that is used to compute the digest for signature verification. + +## Methods + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +## Errors + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md new file mode 100644 index 00000000..a32aef65 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md @@ -0,0 +1,76 @@ +# CreatorFeeManagerWithRebates + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRebates + +This contract returns the creator fee address and the creator rebate amount. + +## Methods + +### STANDARD_ROYALTY_FEE_BP + +```solidity +function STANDARD_ROYALTY_FEE_BP() external view returns (uint256) +``` + +Standard royalty fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md new file mode 100644 index 00000000..41cab900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md @@ -0,0 +1,64 @@ +# CreatorFeeManagerWithRoyalties + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRoyalties + +This contract returns the creator fee address and the creator fee amount. + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +_There are two on-chain sources for the royalty fee to distribute. 1. RoyaltyFeeRegistry: It is an on-chain registry where creator fee is defined for all items of a collection. 2. ERC2981: The NFT Royalty Standard where royalty fee is defined at a itemId level in a collection. The on-chain logic looks up the registry first. If it does not find anything, it checks if a collection is ERC2981. If so, it fetches the proper royalty information for the itemId. For a bundle that contains multiple itemIds (for a collection using ERC2981), if the royalty fee/recipient differ among the itemIds part of the bundle, the trade reverts. This contract DOES NOT enforce any restriction for extremely high creator fee, nor verifies the creator fee fetched is inferior to the total price. If any contract relies on it to build an on-chain royalty logic, it should implement protection against: (1) high royalties (2) potential unexpected royalty changes that can occur after the creation of the order._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md new file mode 100644 index 00000000..9ff1c0fc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md @@ -0,0 +1,250 @@ +# CurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> CurrencyManager + +This contract manages the list of valid fungible currencies. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md new file mode 100644 index 00000000..83eefc37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md @@ -0,0 +1,751 @@ +# ExecutionManager + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> ExecutionManager + +This contract handles the execution and resolution of transactions. A transaction is executed on-chain when an off-chain maker order is matched by on-chain taker order of a different kind. For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md new file mode 100644 index 00000000..022cce57 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md @@ -0,0 +1,9 @@ +# InheritedStrategy + +_LooksRare protocol team (👀,💎)_ + +> InheritedStrategy + +This contract handles the verification of parameters for standard transactions. It does not verify the taker struct's itemIds and amounts array as well as minPrice (taker ask) / maxPrice (taker bid) because before the taker executes the transaction and the maker itemIds/amounts/price should have already been confirmed off-chain. + +_A standard transaction (bid or ask) is mapped to strategyId = 0._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md new file mode 100644 index 00000000..cc542c7e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -0,0 +1,1157 @@ +# LooksRareProtocol + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> LooksRareProtocol + +This contract is the core smart contract of the LooksRare protocol ("v2"). It is the main entry point for users to initiate transactions with taker orders and manage the cancellation of maker orders, which exist off-chain. ~~~~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~- ~~~~~~~~ ~~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~~ ~~~~~~~~ ~~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~~~~ + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ETH. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### chainId + +```solidity +function chainId() external view returns (uint256) +``` + +Current chainId. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +Current domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### restrictedExecuteTakerBid + +```solidity +function restrictedExecuteTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, address sender, bytes32 orderHash) external nonpayable returns (uint256 protocolFeeAmount) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| sender | address | undefined | +| orderHash | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| protocolFeeAmount | uint256 | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateDomainSeparator + +```solidity +function updateDomainSeparator() external nonpayable +``` + +This function allows the owner to update the domain separator (if possible). + +_Only callable by owner. If there is a fork of the network with a new chainId, it allows the owner to reset the domain separator for the new chain id._ + +### updateETHGasLimitForTransfer + +```solidity +function updateETHGasLimitForTransfer(uint256 newGasLimitETHTransfer) external nonpayable +``` + +This function allows the owner to update the maximum ETH gas limit for a standard transfer. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------ | +| newGasLimitETHTransfer | uint256 | New gas limit for ETH transfer | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------- | +| gasLimitETHTransfer | uint256 | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| askUser | address | undefined | +| bidUser | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| bidUser | address | undefined | +| bidRecipient | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +## Errors + +### CallerInvalid + +```solidity +error CallerInvalid() +``` + +It is returned if the function cannot be called by the sender. + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### CurrencyInvalid + +```solidity +error CurrencyInvalid() +``` + +It is returned if the currency is invalid. + +### ERC20TransferFromFail + +```solidity +error ERC20TransferFromFail() +``` + +It is emitted if the ERC20 transferFrom fails. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### QuoteTypeInvalid + +```solidity +error QuoteTypeInvalid() +``` + +It is returned if the maker quote type is invalid. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md new file mode 100644 index 00000000..fea95495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md @@ -0,0 +1,193 @@ +# NonceManager + +_LooksRare protocol team (👀,💎)_ + +> NonceManager + +This contract handles the nonce logic that is used for invalidating maker orders that exist off-chain. The nonce logic revolves around three parts at the user level: - order nonce (orders sharing an order nonce are conditional, OCO-like) - subset (orders can be grouped under a same subset) - bid/ask (all orders can be executed only if the bid/ask nonce matches the user's one on-chain) Only the order nonce is invalidated at the time of the execution of a maker order that contains it. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md new file mode 100644 index 00000000..36f6a35c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md @@ -0,0 +1,75 @@ +# ProtocolFeeRecipient + +_LooksRare protocol team (👀,💎)_ + +> ProtocolFeeRecipient + +This contract is used to receive protocol fees and transfer them to the fee sharing setter. Fee sharing setter cannot receive ETH directly, so we need to use this contract as a middleman to convert ETH into WETH before sending it. + +## Methods + +### FEE_SHARING_SETTER + +```solidity +function FEE_SHARING_SETTER() external view returns (address) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### WETH + +```solidity +function WETH() external view returns (contract IWETH) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------- | ----------- | +| \_0 | contract IWETH | undefined | + +### transferERC20 + +```solidity +function transferERC20(address currency) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------------- | +| currency | address | ERC20 currency address | + +### transferETH + +```solidity +function transferETH() external nonpayable +``` + +## Errors + +### ERC20TransferFail + +```solidity +error ERC20TransferFail() +``` + +It is emitted if the ERC20 transfer fails. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NothingToTransfer + +```solidity +error NothingToTransfer() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md new file mode 100644 index 00000000..a55f3985 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md @@ -0,0 +1,391 @@ +# StrategyManager + +_LooksRare protocol team (👀,💎)_ + +> StrategyManager + +This contract handles the addition and the update of execution strategies. + +## Methods + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md new file mode 100644 index 00000000..c6766114 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md @@ -0,0 +1,553 @@ +# TransferManager + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> TransferManager + +This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. + +_"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ + +## Methods + +### allowOperator + +```solidity +function allowOperator(address operator) external nonpayable +``` + +This function allows an operator to be added for the shared transfer system. Once the operator is allowed, users can grant NFT approvals to this operator. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------------- | +| operator | address | Operator address to allow | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### grantApprovals + +```solidity +function grantApprovals(address[] operators) external nonpayable +``` + +This function allows a user to grant approvals for an array of operators. Users cannot grant approvals if the operator is not allowed by this contract's owner. + +_Each operator address must be globally allowed to be approved._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### hasUserApprovedOperator + +```solidity +function hasUserApprovedOperator(address, address) external view returns (bool) +``` + +This returns whether the user has approved the operator address. The first address is the user and the second address is the operator (e.g. LooksRareProtocol). + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isOperatorAllowed + +```solidity +function isOperatorAllowed(address) external view returns (bool) +``` + +This returns whether the operator address is allowed by this contract's owner. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### removeOperator + +```solidity +function removeOperator(address operator) external nonpayable +``` + +This function allows the user to remove an operator for the shared transfer system. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | -------------------------- | +| operator | address | Operator address to remove | + +### revokeApprovals + +```solidity +function revokeApprovals(address[] operators) external nonpayable +``` + +This function allows a user to revoke existing approvals for an array of operators. + +_Each operator address must be approved at the user level to be revoked._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### splitItemsHypercert + +```solidity +function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function splits and transfers a fraction of a hypercert. + +_It does not allow batch transferring._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferBatchItemsAcrossCollections + +```solidity +function transferBatchItemsAcrossCollections(ITransferManager.BatchTransferItem[] items, address from, address to) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------------------------ | ----------- | +| items | ITransferManager.BatchTransferItem[] | undefined | +| from | address | undefined | +| to | address | undefined | + +### transferItemsERC1155 + +```solidity +function transferItemsERC1155(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC1155 collection. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsERC721 + +```solidity +function transferItemsERC721(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC721 collection. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsHypercert + +```solidity +function transferItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single Hypercert. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### ERC1155SafeBatchTransferFromFail + +```solidity +error ERC1155SafeBatchTransferFromFail() +``` + +It is emitted if the ERC1155 safeBatchTransferFrom fails. + +### ERC1155SafeTransferFromFail + +```solidity +error ERC1155SafeTransferFromFail() +``` + +It is emitted if the ERC1155 safeTransferFrom fails. + +### ERC721TransferFromFail + +```solidity +error ERC721TransferFromFail() +``` + +It is emitted if the ERC721 transferFrom fails. + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md new file mode 100644 index 00000000..9011bd50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md @@ -0,0 +1,779 @@ +# TransferSelectorNFT + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> TransferSelectorNFT + +This contract handles the logic for transferring non-fungible items. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md new file mode 100644 index 00000000..37866658 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md @@ -0,0 +1,41 @@ +# BaseStrategy + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md new file mode 100644 index 00000000..c9503939 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md @@ -0,0 +1,212 @@ +# BaseStrategyChainlinkPriceLatency + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategyChainlinkPriceLatency + +This contract allows the owner to define the maximum acceptable Chainlink price latency. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md new file mode 100644 index 00000000..e2d77dd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md @@ -0,0 +1,342 @@ +# StrategyChainlinkUSDDynamicAsk + +_LooksRare protocol team (👀,💎)_ + +> StrategyChainlinkUSDDynamicAsk + +This contract allows a seller to sell an NFT priced in USD and the receivable amount to be in ETH. + +## Methods + +### ETH_USD_PRICE_FEED_DECIMALS + +```solidity +function ETH_USD_PRICE_FEED_DECIMALS() external view returns (uint256) +``` + +_It is possible to call priceFeed.decimals() to get the decimals, but to save gas, it is hard coded instead._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ether (WETH) address. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### priceFeed + +```solidity +function priceFeed() external view returns (contract AggregatorV3Interface) +``` + +ETH/USD Chainlink price feed + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------------ | ----------- | +| \_0 | contract AggregatorV3Interface | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### ChainlinkPriceInvalid + +```solidity +error ChainlinkPriceInvalid() +``` + +It is returned if the Chainlink price is invalid (e.g. negative). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. + +### PriceNotRecentEnough + +```solidity +error PriceNotRecentEnough() +``` + +It is returned if the current block time relative to the latest price's update time is greater than the latency tolerance. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md new file mode 100644 index 00000000..ddec4495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md @@ -0,0 +1,127 @@ +# StrategyCollectionOffer + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> StrategyCollectionOffer + +This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount must be 1 (fractions are NFTs) + +## Methods + +### executeCollectionStrategyWithTakerAsk + +```solidity +function executeCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithAllowlist + +```solidity +function executeCollectionStrategyWithTakerAskWithAllowlist(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithProof + +```solidity +function executeCollectionStrategyWithTakerAskWithProof(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md new file mode 100644 index 00000000..1227878d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md @@ -0,0 +1,83 @@ +# StrategyDutchAuction + +_LooksRare protocol team (👀,💎)_ + +> StrategyDutchAuction + +This contract offers a single execution strategy for users to create Dutch auctions. + +## Methods + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md new file mode 100644 index 00000000..daa427e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -0,0 +1,123 @@ +# StrategyHypercertFractionOffer + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> StrategyHypercertFractionOffer + +This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. + +_Use cases can include tiered pricing; think early bird tickets._ + +## Methods + +### executeHypercertFractionStrategyWithTakerBid + +```solidity +function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeHypercertFractionStrategyWithTakerBidWithAllowlist + +```solidity +function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md new file mode 100644 index 00000000..6a1f0cd5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md @@ -0,0 +1,75 @@ +# StrategyItemIdsRange + +_LooksRare protocol team (👀,💎)_ + +> StrategyItemIdsRange + +This contract offers a single execution strategy for users to bid on a specific amount of items in a range bounded by 2 item ids. + +## Methods + +### executeStrategyWithTakerAsk + +```solidity +function executeStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md new file mode 100644 index 00000000..76918fc5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md @@ -0,0 +1,215 @@ +# OrderValidatorV2A + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderValidatorV2A + +This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) + +_This version does not handle strategies with partial fills._ + +## Methods + +### CRITERIA_GROUPS + +```solidity +function CRITERIA_GROUPS() external view returns (uint256) +``` + +Number of distinct criteria groups checked to evaluate the validity of an order. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### ERC1155_INTERFACE_ID + +```solidity +function ERC1155_INTERFACE_ID() external view returns (bytes4) +``` + +ERC1155 interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_1 + +```solidity +function ERC721_INTERFACE_ID_1() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_2 + +```solidity +function ERC721_INTERFACE_ID_2() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### HYPERCERT_INTERFACE_ID + +```solidity +function HYPERCERT_INTERFACE_ID() external view returns (bytes4) +``` + +Hypercert interfaceId + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### checkMakerOrderValidity + +```solidity +function checkMakerOrderValidity(OrderStructs.Maker makerOrder, bytes signature, OrderStructs.MerkleTree merkleTree) external view returns (uint256[9] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| signature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ---------- | ----------- | +| validationCodes | uint256[9] | undefined | + +### checkMultipleMakerOrderValidities + +```solidity +function checkMultipleMakerOrderValidities(OrderStructs.Maker[] makerOrders, bytes[] signatures, OrderStructs.MerkleTree[] merkleTrees) external view returns (uint256[9][] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------------------------- | ----------- | +| makerOrders | OrderStructs.Maker[] | undefined | +| signatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------------ | ----------- | +| validationCodes | uint256[9][] | undefined | + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +CreatorFeeManager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### deriveProtocolParameters + +```solidity +function deriveProtocolParameters() external nonpayable +``` + +Derive protocol parameters. Anyone can call this function. + +_It allows adjusting if the domain separator or creator fee manager address were to change._ + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +LooksRareProtocol domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +LooksRareProtocol. + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint256) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +TransferManager + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md new file mode 100644 index 00000000..91be29a9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md @@ -0,0 +1,159 @@ +# ProtocolHelpers + +_LooksRare protocol team (👀,💎)_ + +> ProtocolHelpers + +This contract contains helper view functions for order creation. + +## Methods + +### computeDigestMerkleTree + +```solidity +function computeDigestMerkleTree(OrderStructs.MerkleTree merkleTree) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### computeMakerDigest + +```solidity +function computeMakerDigest(OrderStructs.Maker maker) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### verifyMakerSignature + +```solidity +function verifyMakerSignature(OrderStructs.Maker maker, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### verifyMerkleTree + +```solidity +function verifyMerkleTree(OrderStructs.MerkleTree merkleTree, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Errors + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md new file mode 100644 index 00000000..b832744e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md @@ -0,0 +1,60 @@ +# ICreatorFeeManager + +_LooksRare protocol team (👀,💎)_ + +> ICreatorFeeManager + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry royaltyFeeRegistry) +``` + +It returns the royalty fee registry address/interface. + +#### Returns + +| Name | Type | Description | +| ------------------ | ---------------------------- | ------------------------------------- | +| royaltyFeeRegistry | contract IRoyaltyFeeRegistry | Interface of the royalty fee registry | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md new file mode 100644 index 00000000..da683d8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md @@ -0,0 +1,22 @@ +# ICurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> ICurrencyManager + +## Events + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------------------------------- | +| currency | address | Currency address (address(0) = ETH) | +| isAllowed | bool | Whether the currency is allowed | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md new file mode 100644 index 00000000..0e86c75b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md @@ -0,0 +1,99 @@ +# IExecutionManager + +_LooksRare protocol team (👀,💎)_ + +> IExecutionManager + +## Events + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | -------------------------------------- | +| creatorFeeManager | address | Address of the new creator fee manager | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ---------------------------------------- | +| maxCreatorFeeBp | uint256 | New maximum creator fee (in basis point) | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------------------------------------- | +| protocolFeeRecipient | address | Address of the new protocol fee recipient | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md new file mode 100644 index 00000000..393cb24b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md @@ -0,0 +1,41 @@ +# IImmutableCreate2Factory + +## Methods + +### findCreate2Address + +```solidity +function findCreate2Address(bytes32 salt, bytes initializationCode) external view returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | + +### safeCreate2 + +```solidity +function safeCreate2(bytes32 salt, bytes initializationCode) external payable returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md new file mode 100644 index 00000000..e7414f54 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md @@ -0,0 +1,157 @@ +# ILooksRareProtocol + +_LooksRare protocol team (👀,💎)_ + +> ILooksRareProtocol + +## Methods + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +## Events + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------------------------- | +| gasLimitETHTransfer | uint256 | Gas limit for an ETH transfer | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| askUser | address | Address of the ask user | +| bidUser | address | Address of the bid user | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it can be the taker ask user or different) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| bidUser | address | Address of the bid user | +| bidRecipient | address | Address of the recipient of the bid | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it is the maker ask user) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +## Errors + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md new file mode 100644 index 00000000..eaa3f977 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md @@ -0,0 +1,53 @@ +# INonceManager + +_LooksRare protocol team (👀,💎)_ + +> INonceManager + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------- | +| user | address | Address of the user | +| bidNonce | uint256 | New bid nonce | +| askNonce | uint256 | New ask nonce | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ------------------------------- | +| user | address | Address of the user | +| orderNonces | uint256[] | Array of order nonces cancelled | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | -------------------------------- | +| user | address | Address of the user | +| subsetNonces | uint256[] | Array of subset nonces cancelled | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md new file mode 100644 index 00000000..5ed0ef6c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md @@ -0,0 +1,29 @@ +# IRoyaltyFeeRegistry + +_LooksRare protocol team (👀,💎)_ + +> IRoyaltyFeeRegistry + +## Methods + +### royaltyInfo + +```solidity +function royaltyInfo(address collection, uint256 price) external view returns (address receiver, uint256 royaltyFee) +``` + +This function returns the royalty information for a collection at a given transaction price. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | + +#### Returns + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| receiver | address | Receiver address | +| royaltyFee | uint256 | Royalty fee amount | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md new file mode 100644 index 00000000..2b4a45bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md @@ -0,0 +1,41 @@ +# IStrategy + +_LooksRare protocol team (👀,💎)_ + +> IStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool isStrategy) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---------- | ---- | ---------------------------------------------- | +| isStrategy | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md new file mode 100644 index 00000000..ae6ea7b1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md @@ -0,0 +1,84 @@ +# IStrategyManager + +_LooksRare protocol team (👀,💎)_ + +> IStrategyManager + +## Events + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------------- | +| strategyId | uint256 | Id of the new strategy | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the transaction to be executed | +| isMakerBid | bool | Whether the strategyId is for maker bid | +| implementation | address | Address of the implementation of the strategy | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | -------------------------------------------------------- | +| strategyId | uint256 | Id of the strategy | +| isActive | bool | Whether the strategy is active (or not) after the update | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | + +## Errors + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md new file mode 100644 index 00000000..3ba8ca81 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md @@ -0,0 +1,111 @@ +# ITransferManager + +_LooksRare protocol team (👀,💎)_ + +> ITransferManager + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +## Errors + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md new file mode 100644 index 00000000..1b1f41a2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md @@ -0,0 +1,7 @@ +# CurrencyValidator + +_LooksRare protocol team (👀,💎)_ + +> CurrencyValidator + +This library validates the order currency to be the chain's native currency or the specified ERC20 token. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md new file mode 100644 index 00000000..5951cc56 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md @@ -0,0 +1,21 @@ +# LowLevelHypercertCaller + +_bitbeckers_ + +> LowLevelHypercertCaller + +This contract contains low-level calls to transfer ERC1155 tokens. + +## Errors + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### NotAContract + +```solidity +error NotAContract() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md new file mode 100644 index 00000000..943a54cd --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md @@ -0,0 +1,7 @@ +# MerkleProofCalldataWithNodes + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofCalldataWithNodes + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md new file mode 100644 index 00000000..37529181 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md @@ -0,0 +1,7 @@ +# MerkleProofMemory + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofMemory + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md new file mode 100644 index 00000000..6ffa83e2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md @@ -0,0 +1,7 @@ +# OrderStructs + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderStructs + +This library contains all order struct types for the LooksRare protocol (v2). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll new file mode 100644 index 00000000..e2ac6616 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md new file mode 100644 index 00000000..b1434ab0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md @@ -0,0 +1,185 @@ +Hypercerts SDK Documentation / [Exports](modules.md) + +# Hypercert SDK + +## Quickstart Guide + +1. Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +``` + +or + +```bash + yarn add @hypercerts-org/sdk +``` + +2. Import the SDK into your project: + +```bash +import { HypercertClient } from "@hypercerts-org/sdk"; +``` + +3. Create a new instance of the HypercertClient class with your configuration options: + +```js +const client = new HypercertClient({ + chainId: 5, + provider, + signer, + nftStorageToken, + web3StorageToken, +}); +``` + +> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in +> [read-only mode](#read-only-mode) + +4. Use the client object to interact with the Hypercert network. + +For example, you can use the `client.mintClaim` method to create a new claim: + +```js +const tx = await client.mintClaim( + metaData, + totalUnits, + transferRestriction, + overrides, +); +``` + +This will validate the metadata, store it on IPFS, create a new hypercert on-chain and return a transaction receipt. + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more information on how to use the SDK, check out the +[developer documentation](https://hypercerts.org/docs/developer/) and the +[Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. Don't forget to set your +environment variables for your NFT.storage and web3.storage API keys in your .env file. + +## Config + +The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check +the environment variables. + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without a signer or provider. +- The client was initialized with a provider but not a signer. +- The client was initialized with a signer but not a provider. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a +warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief +explanation of each constant: + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphName": "hypercerts-testnet" + } +} +``` + +### Client config properties + +| \| Property | Type | Description | +| ------------------ | -------------------- | -------------------------------------- | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | +| `graphName` | `string` | The name of the Gsubgraph to use. | +| `provider` | `providers.Provider` | A custom provider to use. | +| `signer` | `Signer` | A custom signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +### Environment variables + +To determine the missing configuration values the SDK defaults to the following environment variables: + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +## Client modules + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and +NFT.storage. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the storage, indexer, and contract getters, the HypercertClient allows +developers to easily interact with the various components of the Hypercert system. For example, a developer could use +the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based +on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the +contract. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md new file mode 100644 index 00000000..89f2105f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError + +# Class: ClientError + +An error that is caused by a problem with the client. + +## Hierarchy + +- `Error` + + ↳ **`ClientError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ClientError.md#constructor) + +### Properties + +- [payload](ClientError.md#payload) + +## Constructors + +### constructor + +• **new ClientError**(`message`, `payload?`) + +Creates a new instance of the ClientError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md new file mode 100644 index 00000000..03813867 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md @@ -0,0 +1,66 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError + +# Class: ConfigurationError + +The configuration was invalid + +## Hierarchy + +- `Error` + + ↳ **`ConfigurationError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ConfigurationError.md#constructor) + +### Properties + +- [payload](ConfigurationError.md#payload) + +## Constructors + +### constructor + +• **new ConfigurationError**(`message`, `payload?`) + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `message` | `string` | +| `payload?` | `Object` | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md new file mode 100644 index 00000000..d4c9f7c9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError + +# Class: FetchError + +Fails fetching a remote resource + +## Hierarchy + +- `Error` + + ↳ **`FetchError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](FetchError.md#constructor) + +### Properties + +- [payload](FetchError.md#payload) + +## Constructors + +### constructor + +• **new FetchError**(`message`, `payload?`) + +Creates a new instance of the FetchError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md new file mode 100644 index 00000000..a5a0e900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md @@ -0,0 +1,493 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient + +# Class: HypercertClient + +Hypercerts client factory + +**`Dev`** + +Creates a Hypercerts client instance + +**`Notice`** + +The client is readonly if no signer is set or if the contract address is not set + +**`Param`** + +Hypercerts client configuration + +**`Param`** + +Hypercerts storage object + +## Implements + +- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertClient.md#constructor) + +### Properties + +- [\_config](HypercertClient.md#_config) +- [\_contract](HypercertClient.md#_contract) +- [\_evaluator](HypercertClient.md#_evaluator) +- [\_indexer](HypercertClient.md#_indexer) +- [\_operator](HypercertClient.md#_operator) +- [\_storage](HypercertClient.md#_storage) +- [readonly](HypercertClient.md#readonly) + +### Accessors + +- [contract](HypercertClient.md#contract) +- [indexer](HypercertClient.md#indexer) +- [storage](HypercertClient.md#storage) + +### Methods + +- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClient.md#burnclaimfraction) +- [checkWritable](HypercertClient.md#checkwritable) +- [createAllowlist](HypercertClient.md#createallowlist) +- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) +- [mintClaim](HypercertClient.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClient.md#splitclaimunits) + +## Constructors + +### constructor + +• **new HypercertClient**(`config?`) + +Creates a new instance of the `HypercertClient` class. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | + +#### Defined in + +[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) + +## Properties + +### \_config + +• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) + +#### Defined in + +[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) + +--- + +### \_contract + +• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +#### Defined in + +[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) + +--- + +### \_evaluator + +• `Private` **\_evaluator**: [`default`](internal.default.md) + +#### Defined in + +[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) + +--- + +### \_indexer + +• `Private` **\_indexer**: [`default`](internal.default-1.md) + +#### Defined in + +[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) + +--- + +### \_operator + +• `Private` **\_operator**: `Provider` \| `Signer` + +#### Defined in + +[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) + +--- + +### \_storage + +• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) + +#### Defined in + +[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) + +## Accessors + +### contract + +• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +Gets the HypercertMinter contract used by the client. + +#### Returns + +[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +The contract. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) + +#### Defined in + +[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) + +--- + +### indexer + +• `get` **indexer**(): [`default`](internal.default-1.md) + +Gets the indexer for the client. + +#### Returns + +[`default`](internal.default-1.md) + +The indexer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) + +#### Defined in + +[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) + +--- + +### storage + +• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) + +Gets the storage layer for the client. + +#### Returns + +[`HypercertsStorage`](HypercertsStorage.md) + +The storage layer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) + +#### Defined in + +[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) + +## Methods + +### batchMintClaimFractionsFromAllowlists + +▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | +| `roots?` | `BytesLike`[] | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Implementation of + +HypercertClientInterface.batchMintClaimFractionsFromAllowlists + +#### Defined in + +[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) + +--- + +### burnClaimFraction + +▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> + +Burn a Hypercert claim by providing the claim id + +**`Dev`** + +Burns a Hypercert claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :----------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.burnClaimFraction + +#### Defined in + +[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) + +--- + +### checkWritable + +▸ `Private` **checkWritable**(): `boolean` + +#### Returns + +`boolean` + +#### Defined in + +[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) + +--- + +### createAllowlist + +▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Create a Hypercert claim with an allowlist + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist + +**`Notice`** + +The total number of units in the allowlist must match the total number of units for the Hypercert + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.createAllowlist + +#### Defined in + +[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) + +--- + +### mergeClaimUnits + +▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> + +Merge multiple Hypercert claims fractions into one + +**`Dev`** + +Merges multiple Hypercert claims into one + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :------------------ | +| `claimIds` | `BigNumberish`[] | Hypercert claim ids | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mergeClaimUnits + +#### Defined in + +[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) + +--- + +### mintClaim + +▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units and transfer restrictions + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaim + +#### Defined in + +[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) + +--- + +### mintClaimFractionFromAllowlist + +▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim fraction from an allowlist. + +**`Dev`** + +Verifies the claim proof and mints the claim fraction + +**`Notice`** + +If known, provide the root for client side verification + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `units` | `BigNumberish` | Number of units to mint | +| `proof` | `BytesLike`[] | Merkle proof for the claim | +| `root?` | `BytesLike` | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaimFractionFromAllowlist + +#### Defined in + +[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) + +--- + +### splitClaimUnits + +▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> + +Split a Hypercert's unit into multiple claims with the given fractions + +**`Dev`** + +Submit the ID of the claim to split and new fraction values. + +**`Notice`** + +The sum of the fractions must be equal to the total units of the claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.splitClaimUnits + +#### Defined in + +[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md new file mode 100644 index 00000000..706c14fe --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md @@ -0,0 +1,250 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage + +# Class: HypercertsStorage + +A class that provides storage functionality for Hypercerts. + +## Implements + +- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertsStorage.md#constructor) + +### Properties + +- [nftStorageClient](HypercertsStorage.md#nftstorageclient) +- [readonly](HypercertsStorage.md#readonly) +- [web3StorageClient](HypercertsStorage.md#web3storageclient) + +### Methods + +- [getData](HypercertsStorage.md#getdata) +- [getMetadata](HypercertsStorage.md#getmetadata) +- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) +- [storeData](HypercertsStorage.md#storedata) +- [storeMetadata](HypercertsStorage.md#storemetadata) + +## Constructors + +### constructor + +• **new HypercertsStorage**(`overrides`) + +Creates a new instance of the `HypercertsStorage` class. + +#### Parameters + +| Name | Type | Description | +| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | +| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | + +#### Defined in + +[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) + +## Properties + +### nftStorageClient + +• `Optional` **nftStorageClient**: `NFTStorage` + +The NFT storage client. + +#### Defined in + +[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +Whether the storage is read-only. + +#### Defined in + +[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) + +--- + +### web3StorageClient + +• `Optional` **web3StorageClient**: `any` + +The Web3 storage client. + +#### Defined in + +[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) + +## Methods + +### getData + +▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> + +Gets arbitrary data from Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the data cannot be retrieved. + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :-------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | + +#### Returns + +`Promise`<`any`\> + +A Promise that resolves to the data. + +#### Implementation of + +HypercertStorageInterface.getData + +#### Defined in + +[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) + +--- + +### getMetadata + +▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +Gets metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. E.g. unknown schema + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------ | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | + +#### Returns + +`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +A Promise that resolves to the metadata. + +#### Implementation of + +HypercertStorageInterface.getMetadata + +#### Defined in + +[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) + +--- + +### getNftStorageGatewayUri + +▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` + +#### Parameters + +| Name | Type | +| :------------- | :------- | +| `cidOrIpfsUri` | `string` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) + +--- + +### storeData + +▸ **storeData**(`data`): `Promise`<`CIDString`\> + +Stores arbitrary data in Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Notice`** + +Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Implementation of + +HypercertStorageInterface.storeData + +#### Defined in + +[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) + +--- + +### storeMetadata + +▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> + +Stores metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. + +**`Notice`** + +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------------------------------------------------------- | :--------------------- | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Implementation of + +HypercertStorageInterface.storeMetadata + +#### Defined in + +[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md new file mode 100644 index 00000000..d12c0653 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError + +# Class: InvalidOrMissingError + +The provided value was undefined or empty + +## Hierarchy + +- `Error` + + ↳ **`InvalidOrMissingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](InvalidOrMissingError.md#constructor) + +### Properties + +- [payload](InvalidOrMissingError.md#payload) + +## Constructors + +### constructor + +• **new InvalidOrMissingError**(`message`, `payload?`) + +Creates a new instance of the InvalidOrMissingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md new file mode 100644 index 00000000..028129d8 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError + +# Class: MalformedDataError + +Data doesn't conform to expectations + +## Hierarchy + +- `Error` + + ↳ **`MalformedDataError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MalformedDataError.md#constructor) + +### Properties + +- [payload](MalformedDataError.md#payload) + +## Constructors + +### constructor + +• **new MalformedDataError**(`message`, `payload?`) + +Creates a new instance of the MalformedDataError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md new file mode 100644 index 00000000..de284494 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError + +# Class: MintingError + +Minting transaction failed + +## Hierarchy + +- `Error` + + ↳ **`MintingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MintingError.md#constructor) + +### Properties + +- [payload](MintingError.md#payload) + +## Constructors + +### constructor + +• **new MintingError**(`message`, `payload?`) + +Creates a new instance of the MintingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md new file mode 100644 index 00000000..0dcf0291 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError + +# Class: StorageError + +Fails storing to a remote resource + +## Hierarchy + +- `Error` + + ↳ **`StorageError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](StorageError.md#constructor) + +### Properties + +- [payload](StorageError.md#payload) + +## Constructors + +### constructor + +• **new StorageError**(`message`, `payload?`) + +Creates a new instance of the StorageError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md new file mode 100644 index 00000000..5fdb25e0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md @@ -0,0 +1,71 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError + +# Class: UnknownSchemaError + +Schema could not be loaded + +## Hierarchy + +- `Error` + + ↳ **`UnknownSchemaError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnknownSchemaError.md#constructor) + +### Properties + +- [payload](UnknownSchemaError.md#payload) + +## Constructors + +### constructor + +• **new UnknownSchemaError**(`message`, `payload?`) + +Creates a new instance of the UnknownSchemaError class. + +#### Parameters + +| Name | Type | Description | +| :------------------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.schemaName` | `string` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :----------- | :------- | +| `schemaName` | `string` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md new file mode 100644 index 00000000..0964b138 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md @@ -0,0 +1,72 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError + +# Class: UnsupportedChainError + +This blockchain is not yet supported +Please file an issue + +## Hierarchy + +- `Error` + + ↳ **`UnsupportedChainError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnsupportedChainError.md#constructor) + +### Properties + +- [payload](UnsupportedChainError.md#payload) + +## Constructors + +### constructor + +• **new UnsupportedChainError**(`message`, `payload?`) + +Creates a new instance of the UnsupportedChainError class. + +#### Parameters + +| Name | Type | Description | +| :---------------- | :---------------------------------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.chainID` | `undefined` \| `string` \| `number` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :-------- | :---------------------------------- | +| `chainID` | `undefined` \| `string` \| `number` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md new file mode 100644 index 00000000..1b94a629 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md @@ -0,0 +1,278 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +A class that provides indexing functionality for Hypercerts. + +## Implements + +- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default-1.md#constructor) + +### Properties + +- [\_graphClient](internal.default-1.md#_graphclient) + +### Accessors + +- [graphClient](internal.default-1.md#graphclient) + +### Methods + +- [claimById](internal.default-1.md#claimbyid) +- [claimsByOwner](internal.default-1.md#claimsbyowner) +- [firstClaims](internal.default-1.md#firstclaims) +- [fractionById](internal.default-1.md#fractionbyid) +- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) +- [fractionsByOwner](internal.default-1.md#fractionsbyowner) + +## Constructors + +### constructor + +• **new default**(`options`) + +Creates a new instance of the `HypercertIndexer` class. + +#### Parameters + +| Name | Type | Description | +| :------------------ | :------- | :----------------------------------------- | +| `options` | `Object` | The configuration options for the indexer. | +| `options.graphUrl?` | `string` | - | + +#### Defined in + +[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) + +## Properties + +### \_graphClient + +• `Private` **\_graphClient**: `Object` + +The Graph client used by the indexer. + +#### Type declaration + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Defined in + +[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) + +## Accessors + +### graphClient + +• `get` **graphClient**(): `Object` + +Gets the Graph client used by the indexer. + +#### Returns + +`Object` + +The Graph client. + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Implementation of + +[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) + +#### Defined in + +[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) + +## Methods + +### claimById + +▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +Gets a claim by its ID. + +#### Parameters + +| Name | Type | Description | +| :--- | :------- | :------------------- | +| `id` | `string` | The ID of the claim. | + +#### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +A Promise that resolves to the claim. + +#### Implementation of + +HypercertIndexerInterface.claimById + +#### Defined in + +[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) + +--- + +### claimsByOwner + +▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +Gets the claims owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.claimsByOwner + +#### Defined in + +[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) + +--- + +### firstClaims + +▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +Gets the most recent claims. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :-------------------- | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.firstClaims + +#### Defined in + +[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) + +--- + +### fractionById + +▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +Gets a claim token by its ID. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------- | +| `fractionId` | `string` | The ID of the claim token. | + +#### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +A Promise that resolves to the claim token. + +#### Implementation of + +HypercertIndexerInterface.fractionById + +#### Defined in + +[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) + +--- + +### fractionsByClaim + +▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +Gets the claim tokens for a given claim. + +#### Parameters + +| Name | Type | Default value | Description | +| :-------- | :----------------------------------------- | :------------------- | :-------------------- | +| `claimId` | `string` | `undefined` | The ID of the claim. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByClaim + +#### Defined in + +[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) + +--- + +### fractionsByOwner + +▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +Gets the claim tokens owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByOwner + +#### Defined in + +[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md new file mode 100644 index 00000000..1538ce61 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md @@ -0,0 +1,131 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +The EasEvaluator class provides methods for signing off-chain attestations of evaluations. +Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. + +## Table of contents + +### Constructors + +- [constructor](internal.default-2.md#constructor) + +### Properties + +- [offChain](internal.default-2.md#offchain) +- [readonly](internal.default-2.md#readonly) +- [signer](internal.default-2.md#signer) + +### Methods + +- [getSignature](internal.default-2.md#getsignature) +- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) + +## Constructors + +### constructor + +• **new default**(`config`) + +Creates a new EasEvaluator instance. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | + +#### Defined in + +[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) + +## Properties + +### offChain + +• **offChain**: `Offchain` + +The Offchain instance used for signing off-chain attestations. + +#### Defined in + +[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +The TypedDataSigner instance used for signing typed data. + +#### Defined in + +[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) + +## Methods + +### getSignature + +▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> + +Gets a signature for an off-chain attestation. + +#### Parameters + +| Name | Type | Description | +| :------------ | :------- | :------------------------------------------------ | +| `encodedData` | `string` | The encoded data to sign. | +| `recipient` | `string` | The address of the recipient of the attestation. | +| `schemaUid` | `string` | The UID of the schema to use for the attestation. | + +#### Returns + +`Promise`<`SignedOffchainAttestation`\> + +- The signature for the attestation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) + +--- + +### signOfflineEvaluation + +▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> + +Signs an offline evaluation. + +**`Throws`** + +- If the evaluation data is malformed. + +#### Parameters + +| Name | Type | Description | +| :----------- | :----------------------------------------------- | :--------------------------- | +| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | + +#### Returns + +`Promise`<`undefined` \| `SignedOffchainAttestation`\> + +- The signature for the evaluation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md new file mode 100644 index 00000000..86daa5e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md @@ -0,0 +1,110 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +## Implements + +- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default.md#constructor) + +### Properties + +- [eas](internal.default.md#eas) +- [readonly](internal.default.md#readonly) +- [signer](internal.default.md#signer) +- [storage](internal.default.md#storage) + +### Methods + +- [submitEvaluation](internal.default.md#submitevaluation) + +## Constructors + +### constructor + +• **new default**(`config?`) + +#### Parameters + +| Name | Type | +| :------- | :------------------------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | + +#### Defined in + +[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) + +## Properties + +### eas + +• **eas**: [`default`](internal.default-2.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +#### Defined in + +[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) + +--- + +### storage + +• **storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) + +## Methods + +### submitEvaluation + +▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------------------------ | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | + +#### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Implementation of + +EvaluatorInterface.submitEvaluation + +#### Defined in + +[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md new file mode 100644 index 00000000..b4af6279 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md @@ -0,0 +1,39 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError + +# Interface: CustomError + +An interface for errors that have a specific type. + +## Implemented by + +- [`ClientError`](../classes/ClientError.md) +- [`ConfigurationError`](../classes/ConfigurationError.md) +- [`FetchError`](../classes/FetchError.md) +- [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) +- [`MalformedDataError`](../classes/MalformedDataError.md) +- [`MintingError`](../classes/MintingError.md) +- [`StorageError`](../classes/StorageError.md) +- [`UnknownSchemaError`](../classes/UnknownSchemaError.md) +- [`UnsupportedChainError`](../classes/UnsupportedChainError.md) + +## Table of contents + +### Properties + +- [payload](CustomError.md#payload) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Defined in + +[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md new file mode 100644 index 00000000..4606b46e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation + +# Interface: DuplicateEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) +- [explanation](DuplicateEvaluation.md#explanation) +- [realHypercert](DuplicateEvaluation.md#realhypercert) +- [type](DuplicateEvaluation.md#type) + +## Properties + +### duplicateHypercerts + +• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] + +#### Defined in + +[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) + +--- + +### explanation + +• **explanation**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) + +--- + +### realHypercert + +• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) + +--- + +### type + +• **type**: `"duplicate"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md new file mode 100644 index 00000000..205b7004 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation + +# Interface: EASEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](EASEvaluation.md#chainid) +- [contract](EASEvaluation.md#contract) +- [type](EASEvaluation.md#type) +- [uid](EASEvaluation.md#uid) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) + +--- + +### type + +• **type**: `"EAS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) + +--- + +### uid + +• **uid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md new file mode 100644 index 00000000..3dcea656 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -0,0 +1,167 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](HypercertClaimdata.md#contributors) +- [impact_scope](HypercertClaimdata.md#impact_scope) +- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) +- [rights](HypercertClaimdata.md#rights) +- [work_scope](HypercertClaimdata.md#work_scope) +- [work_timeframe](HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md new file mode 100644 index 00000000..0483b520 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -0,0 +1,341 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface + +# Interface: HypercertClientInterface + +The interface for the Hypercert client. + +## Hierarchy + +- [`HypercertClientMethods`](HypercertClientMethods.md) + +- [`HypercertClientState`](HypercertClientState.md) + + ↳ **`HypercertClientInterface`** + +## Implemented by + +- [`HypercertClient`](../classes/HypercertClient.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) +- [contract](HypercertClientInterface.md#contract) +- [createAllowlist](HypercertClientInterface.md#createallowlist) +- [indexer](HypercertClientInterface.md#indexer) +- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) +- [mintClaim](HypercertClientInterface.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) +- [readonly](HypercertClientInterface.md#readonly) +- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) +- [storage](HypercertClientInterface.md#storage) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md new file mode 100644 index 00000000..734ccbee --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -0,0 +1,239 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods + +# Interface: HypercertClientMethods + +The methods for the Hypercert client. + +## Hierarchy + +- **`HypercertClientMethods`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) +- [createAllowlist](HypercertClientMethods.md#createallowlist) +- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) +- [mintClaim](HypercertClientMethods.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md new file mode 100644 index 00000000..2d90a599 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState + +# Interface: HypercertClientState + +The state of the Hypercert client. + +## Hierarchy + +- **`HypercertClientState`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [contract](HypercertClientState.md#contract) +- [indexer](HypercertClientState.md#indexer) +- [readonly](HypercertClientState.md#readonly) +- [storage](HypercertClientState.md#storage) + +## Properties + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md new file mode 100644 index 00000000..6ebed93a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -0,0 +1,47 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema + +# Interface: HypercertEvaluationSchema + +Schema for evaluating Hypercerts across different sources and evaluation types + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [creator](HypercertEvaluationSchema.md#creator) +- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) +- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) + +## Properties + +### creator + +• **creator**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) + +--- + +### evaluationData + +• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) + +--- + +### evaluationSource + +• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md new file mode 100644 index 00000000..f18c409f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -0,0 +1,176 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface + +# Interface: HypercertIndexerInterface + +## Implemented by + +- [`default`](../classes/internal.default-1.md) + +## Table of contents + +### Properties + +- [claimById](HypercertIndexerInterface.md#claimbyid) +- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) +- [firstClaims](HypercertIndexerInterface.md#firstclaims) +- [fractionById](HypercertIndexerInterface.md#fractionbyid) +- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) +- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) +- [graphClient](HypercertIndexerInterface.md#graphclient) + +## Properties + +### claimById + +• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Type declaration + +▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +##### Parameters + +| Name | Type | +| :--- | :------- | +| `id` | `string` | + +##### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) + +--- + +### claimsByOwner + +• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) + +--- + +### firstClaims + +• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Type declaration + +▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) + +--- + +### fractionById + +• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +##### Parameters + +| Name | Type | +| :----------- | :------- | +| `fractionId` | `string` | + +##### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) + +--- + +### fractionsByClaim + +• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Type declaration + +▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `claimId` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) + +--- + +### fractionsByOwner + +• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) + +--- + +### graphClient + +• **graphClient**: `any` + +#### Defined in + +[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md new file mode 100644 index 00000000..d65362f3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md @@ -0,0 +1,123 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata + +# Interface: HypercertMetadata + +Claim data for hypercert. ERC1155 Metadata compliant + +## Table of contents + +### Properties + +- [allowList](HypercertMetadata.md#allowlist) +- [description](HypercertMetadata.md#description) +- [external_url](HypercertMetadata.md#external_url) +- [hypercert](HypercertMetadata.md#hypercert) +- [image](HypercertMetadata.md#image) +- [name](HypercertMetadata.md#name) +- [properties](HypercertMetadata.md#properties) +- [ref](HypercertMetadata.md#ref) +- [version](HypercertMetadata.md#version) + +## Properties + +### allowList + +• `Optional` **allowList**: `string` + +A CID pointer to the merke tree proof json on ipfs + +#### Defined in + +[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) + +--- + +### description + +• **description**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) + +--- + +### external_url + +• `Optional` **external_url**: `string` + +An url pointing to the external website of the project + +#### Defined in + +[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) + +--- + +### hypercert + +• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) + +#### Defined in + +[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) + +--- + +### image + +• **image**: `string` + +A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. + +#### Defined in + +[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) + +--- + +### name + +• **name**: `string` + +Identifies the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) + +--- + +### properties + +• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] + +#### Defined in + +[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) + +--- + +### ref + +• `Optional` **ref**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) + +--- + +### version + +• `Optional` **version**: `string` + +The version of Hypercert schema used to describe this hypercert + +#### Defined in + +[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md new file mode 100644 index 00000000..773c41d3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer + +# Interface: HypercertPointer + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](HypercertPointer.md#chainid) +- [claimId](HypercertPointer.md#claimid) +- [contract](HypercertPointer.md#contract) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) + +--- + +### claimId + +• **claimId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md new file mode 100644 index 00000000..8ffda51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -0,0 +1,130 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface + +# Interface: HypercertStorageInterface + +The interface for the Hypercert storage layer. + +## Implemented by + +- [`HypercertsStorage`](../classes/HypercertsStorage.md) + +## Table of contents + +### Properties + +- [getData](HypercertStorageInterface.md#getdata) +- [getMetadata](HypercertStorageInterface.md#getmetadata) +- [storeData](HypercertStorageInterface.md#storedata) +- [storeMetadata](HypercertStorageInterface.md#storemetadata) + +## Properties + +### getData + +• **getData**: (`cidOrIpfsUri`: `string`) => `Promise`<`unknown`\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<`unknown`\> + +Retrieves arbitrary data from IPFS. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | + +##### Returns + +`Promise`<`unknown`\> + +A Promise that resolves to the retrieved data. + +#### Defined in + +[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) + +--- + +### getMetadata + +• **getMetadata**: (`cidOrIpfsUri`: `string`) => `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +Retrieves the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :----------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | + +##### Returns + +`Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +A Promise that resolves to the retrieved metadata. + +#### Defined in + +[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) + +--- + +### storeData + +• **storeData**: (`data`: `unknown`) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`data`): `Promise`<`CIDString`\> + +Stores arbitrary data on IPFS. + +##### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Defined in + +[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) + +--- + +### storeMetadata + +• **storeMetadata**: (`metadata`: [`HypercertMetadata`](HypercertMetadata.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`metadata`): `Promise`<`CIDString`\> + +Stores the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------------ | :--------------------- | +| `metadata` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Defined in + +[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md new file mode 100644 index 00000000..5f5871f2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -0,0 +1,34 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation + +# Interface: IPFSEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [cid](IPFSEvaluation.md#cid) +- [type](IPFSEvaluation.md#type) + +## Properties + +### cid + +• **cid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) + +--- + +### type + +• **type**: `"IPFS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md new file mode 100644 index 00000000..3e4b3b92 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation + +# Interface: SimpleTextEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [hypercert](SimpleTextEvaluation.md#hypercert) +- [text](SimpleTextEvaluation.md#text) +- [type](SimpleTextEvaluation.md#type) + +## Properties + +### hypercert + +• **hypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) + +--- + +### text + +• **text**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) + +--- + +### type + +• **type**: `"simpleText"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md new file mode 100644 index 00000000..53ac36ed --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md @@ -0,0 +1,43 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface + +# Interface: EvaluatorInterface + +[internal](../modules/internal.md).EvaluatorInterface + +## Implemented by + +- [`default`](../classes/internal.default.md) + +## Table of contents + +### Properties + +- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) + +## Properties + +### submitEvaluation + +• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +##### Parameters + +| Name | Type | Description | +| :----------- | :---------------------------------------------------------- | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | + +##### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Defined in + +[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md new file mode 100644 index 00000000..273912bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md @@ -0,0 +1,169 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +[internal](../modules/internal.md).HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](internal.HypercertClaimdata.md#contributors) +- [impact_scope](internal.HypercertClaimdata.md#impact_scope) +- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) +- [rights](internal.HypercertClaimdata.md#rights) +- [work_scope](internal.HypercertClaimdata.md#work_scope) +- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md new file mode 100644 index 00000000..3f4ea346 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md @@ -0,0 +1,17 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter + +# Interface: HypercertMinter + +[internal](../modules/internal.md).HypercertMinter + +Hypercert contract interface. + +**`Notice`** + +hacky loop to get typedoc to generate all the docs + +## Hierarchy + +- `HypercertMinter` + + ↳ **`HypercertMinter`** diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md new file mode 100644 index 00000000..15998930 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md @@ -0,0 +1,638 @@ +[Hypercerts SDK Documentation](README.md) / Exports + +# Hypercerts SDK Documentation + +## Table of contents + +### References + +- [Claim](modules.md#claim) +- [ClaimToken](modules.md#claimtoken) +- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) + +### Modules + +- [internal](modules/internal.md) + +### Classes + +- [ClientError](classes/ClientError.md) +- [ConfigurationError](classes/ConfigurationError.md) +- [FetchError](classes/FetchError.md) +- [HypercertClient](classes/HypercertClient.md) +- [HypercertsStorage](classes/HypercertsStorage.md) +- [InvalidOrMissingError](classes/InvalidOrMissingError.md) +- [MalformedDataError](classes/MalformedDataError.md) +- [MintingError](classes/MintingError.md) +- [StorageError](classes/StorageError.md) +- [UnknownSchemaError](classes/UnknownSchemaError.md) +- [UnsupportedChainError](classes/UnsupportedChainError.md) + +### Interfaces + +- [CustomError](interfaces/CustomError.md) +- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) +- [EASEvaluation](interfaces/EASEvaluation.md) +- [HypercertClaimdata](interfaces/HypercertClaimdata.md) +- [HypercertClientInterface](interfaces/HypercertClientInterface.md) +- [HypercertClientMethods](interfaces/HypercertClientMethods.md) +- [HypercertClientState](interfaces/HypercertClientState.md) +- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) +- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) +- [HypercertMetadata](interfaces/HypercertMetadata.md) +- [HypercertPointer](interfaces/HypercertPointer.md) +- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) +- [IPFSEvaluation](interfaces/IPFSEvaluation.md) +- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) + +### Type Aliases + +- [AllowlistEntry](modules.md#allowlistentry) +- [Deployment](modules.md#deployment) +- [EvaluationData](modules.md#evaluationdata) +- [EvaluationSource](modules.md#evaluationsource) +- [HypercertClientConfig](modules.md#hypercertclientconfig) +- [HypercertClientProps](modules.md#hypercertclientprops) +- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) +- [HypercertStorageConfig](modules.md#hypercertstorageconfig) +- [HypercertsSdkError](modules.md#hypercertssdkerror) +- [QueryParams](modules.md#queryparams) +- [SupportedChainIds](modules.md#supportedchainids) +- [TransferRestrictions](modules.md#transferrestrictions) + +### Properties + +- [ClaimByIdQuery](modules.md#claimbyidquery) + +### Variables + +- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) +- [TransferRestrictions](modules.md#transferrestrictions-1) + +### Functions + +- [execute](modules.md#execute) +- [formatDate](modules.md#formatdate) +- [formatHypercertData](modules.md#formathypercertdata) +- [formatUnixTime](modules.md#formatunixtime) +- [validateAllowlist](modules.md#validateallowlist) +- [validateClaimData](modules.md#validateclaimdata) +- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) +- [validateMetaData](modules.md#validatemetadata) +- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) +- [verifyMerkleProof](modules.md#verifymerkleproof) +- [verifyMerkleProofs](modules.md#verifymerkleproofs) + +## References + +### Claim + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimToken + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimTokensByClaimQuery + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +## Type Aliases + +### AllowlistEntry + +Ƭ **AllowlistEntry**: `Object` + +Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol + +**`Param`** + +Address of the recipient + +**`Param`** + +Number of units allocated to the recipient + +#### Type declaration + +| Name | Type | +| :-------- | :------------- | +| `address` | `string` | +| `units` | `BigNumberish` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) + +--- + +### Deployment + +Ƭ **Deployment**: `Object` + +Represents a deployment of a contract on a specific network. + +#### Type declaration + +| Name | Type | Description | +| :---------------- | :------- | :--------------------------------------------------------------------------------------- | +| `chainId` | `number` | The ID of the network on which the contract is deployed. | +| `chainName` | `string` | The name of the network on which the contract is deployed. | +| `contractAddress` | `string` | The address of the deployed contract. | +| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | + +#### Defined in + +[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) + +--- + +### EvaluationData + +Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) + +This file was automatically generated by json-schema-to-typescript. +DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +and run json-schema-to-typescript to regenerate this file. + +#### Defined in + +[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) + +--- + +### EvaluationSource + +Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) + +--- + +### HypercertClientConfig + +Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } + +Configuration options for the Hypercert client. + +#### Defined in + +[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) + +--- + +### HypercertClientProps + +Ƭ **HypercertClientProps**: `Object` + +The props for the Hypercert client. + +#### Type declaration + +| Name | Type | Description | +| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | +| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | + +#### Defined in + +[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) + +--- + +### HypercertEvaluatorConfig + +Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } + +Configuration options for the Hypercert evaluator. + +**`Note`** + +The signer is required for submitting evaluations. + +#### Defined in + +[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) + +--- + +### HypercertStorageConfig + +Ƭ **HypercertStorageConfig**: `Object` + +Configuration options for the Hypercert storage layer. + +**`Note`** + +The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. + +#### Type declaration + +| Name | Type | Description | +| :------------------ | :------- | :------------------------------ | +| `nftStorageToken?` | `string` | The API token for NFT.storage. | +| `web3StorageToken?` | `string` | The API token for Web3.storage. | + +#### Defined in + +[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) + +--- + +### HypercertsSdkError + +Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) + +#### Defined in + +[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) + +--- + +### QueryParams + +Ƭ **QueryParams**: `Object` + +#### Index signature + +▪ [key: `string`]: `any` + +#### Type declaration + +| Name | Type | +| :---------------- | :------------------ | +| `first` | `number` | +| `orderDirections` | `"asc"` \| `"desc"` | +| `skip` | `number` | + +#### Defined in + +[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) + +--- + +### SupportedChainIds + +Ƭ **SupportedChainIds**: `5` \| `10` + +#### Defined in + +[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) + +--- + +### TransferRestrictions + +Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Properties + +### ClaimByIdQuery + +• **ClaimByIdQuery**: `any` + +## Variables + +### INDEFINITE_DATE_STRING + +• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` + +#### Defined in + +[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) + +--- + +### TransferRestrictions + +• `Const` **TransferRestrictions**: `Object` + +Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol + +**`Dev`** + +AllowAll: All transfers are allowed + +**`Dev`** + +DisallowAll: All transfers are disallowed + +**`Dev`** + +FromCreatorOnly: Only the creator can transfer the Hypercert + +#### Type declaration + +| Name | Type | +| :---------------- | :--- | +| `AllowAll` | `0` | +| `DisallowAll` | `1` | +| `FromCreatorOnly` | `2` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Functions + +### execute + +▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------- | +| `document` | `GraphQLOperation`<`any`, `any`\> | +| `variables` | `any` | +| `context?` | `any` | +| `rootValue?` | `any` | +| `operationName?` | `string` | + +#### Returns + +`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Defined in + +node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 + +--- + +### formatDate + +▸ **formatDate**(`date`): `string` + +#### Parameters + +| Name | Type | +| :----- | :----- | +| `date` | `Date` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) + +--- + +### formatHypercertData + +▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) + +Formats input data to an object containing HypercertMetadata including appropriate labels + +#### Parameters + +| Name | Type | +| :----------------------- | :----------------------------------------------- | +| `«destructured»` | `Object` | +| › `contributors` | `string`[] | +| › `description` | `string` | +| › `excludedImpactScope` | `string`[] | +| › `excludedRights` | `string`[] | +| › `excludedWorkScope` | `string`[] | +| › `external_url?` | `string` | +| › `image` | `string` | +| › `impactScope` | `string`[] | +| › `impactTimeframeEnd` | `number` | +| › `impactTimeframeStart` | `number` | +| › `name` | `string` | +| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | +| › `rights` | `string`[] | +| › `version` | `string` | +| › `workScope` | `string`[] | +| › `workTimeframeEnd` | `number` | +| › `workTimeframeStart` | `number` | + +#### Returns + +[`FormatResult`](modules/internal.md#formatresult) + +#### Defined in + +[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) + +--- + +### formatUnixTime + +▸ **formatUnixTime**(`seconds`): `string` + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `seconds` | `number` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) + +--- + +### validateAllowlist + +▸ **validateAllowlist**(`data`, `units`): `Object` + +Validates the data for an allowlist. + +#### Parameters + +| Name | Type | Description | +| :------ | :---------------------------------------------- | :------------------------------------------ | +| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | +| `units` | `BigNumberish` | The total number of units in the allowlist. | + +#### Returns + +`Object` + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +| Name | Type | +| :------- | :------------------------------------------ | +| `errors` | `Record`<`string`, `string` \| `string`[]\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) + +--- + +### validateClaimData + +▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :------------------------------------------------------- | :-------------------- | +| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) + +--- + +### validateDuplicateEvaluationData + +▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a duplicate evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :--------------------------------------------------------- | :-------------------- | +| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) + +--- + +### validateMetaData + +▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------- | :-------------------- | +| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) + +--- + +### validateSimpleTextEvaluationData + +▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------------- | :-------------------- | +| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) + +--- + +### verifyMerkleProof + +▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` + +Verifies a Merkle proof for a given address and units. + +**`Throws`** + +If the Merkle proof verification fails. + +#### Parameters + +| Name | Type | Description | +| :-------------- | :------------- | :-------------------------------------- | +| `root` | `string` | The Merkle root hash to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish` | The units to verify. | +| `proof` | `string`[] | The Merkle proof to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) + +--- + +### verifyMerkleProofs + +▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` + +Batch verifies Merkle proofs for multiple roots, units and proofs for a single address + +**`Throws`** + +If the Merkle proof verification fails. + +**`Notice`** + +Wrapper around `verifyMerkleProof` to batch verify multiple proofs + +#### Parameters + +| Name | Type | Description | +| :-------------- | :--------------- | :---------------------------------------- | +| `roots` | `string`[] | The Merkle root hashes to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish`[] | The units to verify. | +| `proofs` | `string`[][] | The Merkle proofs to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md new file mode 100644 index 00000000..d20a3804 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md @@ -0,0 +1,307 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal + +# Module: internal + +## Table of contents + +### Classes + +- [default](../classes/internal.default.md) +- [default](../classes/internal.default-1.md) +- [default](../classes/internal.default-2.md) + +### Interfaces + +- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) +- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) +- [HypercertMinter](../interfaces/internal.HypercertMinter.md) + +### Type Aliases + +- [Claim](internal.md#claim) +- [ClaimByIdQuery](internal.md#claimbyidquery) +- [ClaimToken](internal.md#claimtoken) +- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) +- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) +- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) +- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) +- [Exact](internal.md#exact) +- [FormatResult](internal.md#formatresult) +- [InputMaybe](internal.md#inputmaybe) +- [Maybe](internal.md#maybe) +- [OrderDirection](internal.md#orderdirection) +- [RecentClaimsQuery](internal.md#recentclaimsquery) +- [Scalars](internal.md#scalars) +- [ValidationResult](internal.md#validationresult) + +## Type Aliases + +### Claim + +Ƭ **Claim**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | +| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | + +#### Defined in + +[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) + +--- + +### ClaimByIdQuery + +Ƭ **ClaimByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | + +#### Defined in + +[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) + +--- + +### ClaimToken + +Ƭ **ClaimToken**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :--------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `claim` | [`Claim`](internal.md#claim) | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | + +#### Defined in + +[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) + +--- + +### ClaimTokenByIdQuery + +Ƭ **ClaimTokenByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | + +#### Defined in + +[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) + +--- + +### ClaimTokensByClaimQuery + +Ƭ **ClaimTokensByClaimQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :------------------------------------------------------------------------------------------------------------------ | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) + +--- + +### ClaimTokensByOwnerQuery + +Ƭ **ClaimTokensByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | + +#### Defined in + +[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) + +--- + +### ClaimsByOwnerQuery + +Ƭ **ClaimsByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) + +--- + +### Exact + +Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } + +#### Type parameters + +| Name | Type | +| :--- | :--------------- | +| `T` | extends `Object` | + +#### Defined in + +[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) + +--- + +### FormatResult + +Ƭ **FormatResult**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------ | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | +| `errors` | `Record`<`string`, `string`\> \| `null` | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) + +--- + +### InputMaybe + +Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) + +--- + +### Maybe + +Ƭ **Maybe**<`T`\>: `T` \| `null` + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) + +--- + +### OrderDirection + +Ƭ **OrderDirection**: `"asc"` \| `"desc"` + +Defines the order direction, either ascending or descending + +#### Defined in + +[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) + +--- + +### RecentClaimsQuery + +Ƭ **RecentClaimsQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) + +--- + +### Scalars + +Ƭ **Scalars**: `Object` + +All built-in and custom scalars, mapped to their actual values + +#### Type declaration + +| Name | Type | +| :----------- | :-------- | +| `BigDecimal` | `any` | +| `BigInt` | `any` | +| `Boolean` | `boolean` | +| `Bytes` | `any` | +| `Float` | `number` | +| `ID` | `string` | +| `Int` | `number` | +| `Int8` | `any` | +| `String` | `string` | + +#### Defined in + +[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) + +--- + +### ValidationResult + +Ƭ **ValidationResult**: `Object` + +The result of a validation. + +**`Property`** + +Whether the data is valid. + +**`Property`** + +A map of errors, where the key is the field that failed validation and the value is the error message. + +#### Type declaration + +| Name | Type | +| :------- | :---------------------------- | +| `errors` | `Record`<`string`, `string`\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md new file mode 100644 index 00000000..b591d11d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md @@ -0,0 +1,12 @@ +# Burning + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Burning fraction tokens + +You can only burn fraction tokens that you own. Hypercert claims cannot be burned once minted. +You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). + +```js +const txn = await hypercerts.burnFraction({ tokenId }); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md new file mode 100644 index 00000000..0be153cb --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md @@ -0,0 +1,110 @@ +# Hypercert Client Configuration + +The client provides a high level interface that communicates with the Graph, IPFS and the evm. For easy setup we harmonised the configuration into a flow that allows for configuration with different levels of specificity. + +## Configuration + +### Setup + +The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: + +1. Overrides declared in `Partial` + +Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. + +We then process the rest of the overrides and possible environment variables to customise the default configuration. + +To get started quickly you can either: + +- initialize a new client by calling `new HypercertClient({chain: {id: 5})` (or 10) + +Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without an operator. +- The client was initialized with an operator without signing abilities. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the read-only property of the `HypercertClient` instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" + } +} +``` + +You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. + +### Client config properties + +| Property | Type | Description | +| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `graphUrl` | `string` | The url of the subgraph to use. | +| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +### Environment variables + +You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. + +We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +In your `.env` file: + +```bash +LOG_LEVEL="info" +``` + +The SDK logger supports four log levels: `error`, `warn`, `info`, and `debug`. + +- The `error` log level is used to log errors that occur in the SDK. +- The `warn` log level is used to log warnings that do not necessarily indicate an error, but may be important to investigate. +- The `info` log level is used to log general information about the SDK's state or behavior. +- The `debug` log level is used to log detailed information that is useful for debugging purposes. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md new file mode 100644 index 00000000..60f4e5e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md @@ -0,0 +1,18 @@ +# Errors in the SDK + +Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. + +### Handling Errors + +To support debugging we've implemented some custom errors. + +| Error | Reason | Payload | +| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | +| ClientError | An error caused by the client | `{ [key: string]: unknown }` | +| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | +| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | +| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | +| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | +| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | +| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | +| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md new file mode 100644 index 00000000..c5399a4f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md @@ -0,0 +1,13 @@ +# Evaluations + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Respond / or contest an evaluation + +To create an evaluation of a hypercert + +```js +TODO; +``` + +_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md new file mode 100644 index 00000000..d5ff1226 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md @@ -0,0 +1,57 @@ +# Minting + +## Token design + +Hypercerts are semi-fungible tokens. +Thus, each hypercert is represented on-chain by a group of fraction tokens, +each representing a fraction of ownership over the hypercert. +If you want to split your fraction token, or merge multiple tokens into one, +check out the section on [splitting and merging](./split-merge.md). + +## Minting your first hypercert + +To mint a hypercert you need to provide the `metadata`, total amount of `units` and the preferred `TransferRestrictions`. +The resulting hypercert will be wholly owned by the creator. + +```js +import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" + +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; + +const tx: Promise = await hypercerts.mintClaim({ + metadata, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **Note** If you did not initialize your HypercertsClient with an `operator`, `nftStorageToken` and `web3StorageToken`, the client will run in [read-only mode](#read-only-mode) and this will fail. + +Let's see what happens under the hood: + +First, `mintClaim` checks that the client is not `read only` and that the operator is a `Signer`. If not, it throws an `InvalidOrMissingError`. + +Next, the function validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. The function then stores the metadata on `IPFS` using the `storeMetadata` method and returns the `CID` for the metadata. + +Finally, we call the mintClaim function on the contract with the signer `address`, total `units`, `CID`, and `transfer restriction` as parameters. If `overrides` are provided, the function uses them to send the transaction. Otherwise, it sends the transaction without overrides. + +## Transfer restrictions + +When minting a Hypercert, you must pass in a `TransferRestriction` policy. For now there are only 3 implemented policies: + +```js +enum TransferRestrictions { + // Unrestricted + AllowAll, + // All transfers disabled after minting + DisallowAll, + // Only the original creator can transfer + FromCreatorOnly +} +``` + +## Reference + +See the [code](https://github.com/hypercerts-org/hypercerts/tree/main/sdk/src/client.ts) +for more details on how we implement minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md new file mode 100644 index 00000000..98ebbb83 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md @@ -0,0 +1,306 @@ +# Querying + +## Overview + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph. + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the `storage`, `indexer`, and `contract` getters, the HypercertClient allows developers to easily interact with the various components of the Hypercert system directly. +For example, a developer could use the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the contract. + +## Indexer + +For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. + +### Live graph playground + +To inspect the subgraph and explore queries, have a look at the Graph playground for Goerli testnet and Optimism mainnet: + +- [Goerli dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) +- [Optimism dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) + +### Graph client + +Since the client is fully typed, it's easy to explore the functionalities using code completion in IDEs. + +Here's one example from our frontend where we let [react-query](https://www.npmjs.com/package/%2540tanstack/react-query) frequently update the call to the graph: + +```js +import { useHypercertClient } from "./hypercerts-client"; +import { useQuery } from "@tanstack/react-query"; + +export const useFractionsByOwner = (owner: string) => { + const { + client: { indexer }, + } = useHypercertClient(); + + return useQuery( + ["hypercerts", "fractions", "owner", owner], + () => indexer.fractionsByOwner(owner), + { enabled: !!owner, refetchInterval: 5000 }, + ); +}; +``` + +### Queries: Claims + +These tables show the input parameters and output fields for each of the GraphQL queries in [claims.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/claims.graphql). +A claim represents 1 Hypercert and all of the common data across all claim/fraction tokens. + +#### `ClaimsByOwner` + +The `ClaimsByOwner` query retrieves an array of claims that belong to a specific owner. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claims to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `RecentClaims` + +The RecentClaims query retrieves an array of the most recent claims on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | ---------------------------------- | ------------- | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `ClaimByID` + +The ClaimById query retrieves a single claim by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------- | +| `id` | `ID!` | The ID of the claim to retrieve. | + +##### Output + +The query returns a claim object that matches the input parameter. The claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +### Queries: Fractions + +These tables show the input parameters and output fields for each of the GraphQL queries in [fractions.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/fractions.graphql). +A claim token represents a fraction of ownership of a Hypercert. + +#### `ClaimTokensByOwner` + +The `ClaimTokensByOwner` query retrieves an array of claim tokens that belong to a specific owner on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claim tokens to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ------------------------------------------ | +| `chainName` | `String` | The name of the chain. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +#### `ClaimTokensByClaim` + +The `ClaimTokensByClaim` query retrieves an array of claim tokens that belong to a specific claim on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `claimId` | `String!` | The ID of the claim whose claim tokens to retrieve. | None | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | + +#### `ClaimTokenById` Query + +The `ClaimTokenById` query retrieves a single claim token by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------------- | +| `id` | `ID!` | The ID of the claim token to retrieve. | + +##### Output + +The query returns a claim token object that matches the input parameter. The claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +## Storage + +### Hypercert Metadata + +Currently, all metadata is stored off-chain in IPFS. Use the `storage` client to retrieve the metadata + +```js +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const { indexer, storage } = hypercertsClient; +// Get the on-chain claim +const claimById = await indexer.claimById(claimId); +// Get the off-chain metadata +const metadata = await storage.getMetadata(claimById.claim.uri); +``` + +## Contract + +### Typechain bindings + +We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, +which you can import and use from your TypeScript/JavaScript codebase. + +For example: + +```js +import { ethers } from "ethers"; +import { + HyperCertMinterFactory, + HypercertMinterABI, + IHypercertTokenABI, +} from "@hypercerts-org/sdk"; + +const provider = new ethers.getDefaultProvider(network); +const contractInterface = new ethers.utils.Interface(HypercertMinterABI); +const contract = new ethers.Contract( + contractAddress, + HypercertMinterABI, + provider, +); +const metadataUri = await contract.functions.uri(tokenId); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md new file mode 100644 index 00000000..936cc05b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md @@ -0,0 +1,101 @@ +# Getting started with JavaScript + +The Hypercerts SDK makes it easy to integrate Hypercerts into your application or backend with JavaScript/TypeScript. + +## Installation + +Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +# OR yarn add @hypercerts-org/sdk +``` + +## Get storage credentials (only required for minting) + +For now, we store all metadata (e.g. Hypercert claim data) on IPFS using [NFT.Storage](https://nft.storage/) and [web3.storage](https://web3.storage/). + +In order to mint a Hypercert, you will need to create API tokens for both services, which you can learn more about from their respective guides: + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +_Note: In the future, we want to also support other mechanisms for storing off-chain data._ + +## Initialize + +Import the SDK into your project and create a new instance of `HypercertClient` with your configuration options: + +```js +import { HypercertClient } from "@hypercerts-org/sdk"; +import { ethers } from "ethers"; + +// NOTE: you should replace this with your own JSON-RPC provider to the network +// This should have signing abilities and match the `chainId` passed into HypercertClient +const operator = ethers.providers.getDefaultProvider("goerli"); + +const client = new HypercertClient({ + chainId: 5, // goerli testnet + operator, + nftStorageToken, + web3StorageToken, +}); +``` + +Hypercerts is a multi-chain protocol. +See [here](./supported-networks.md) for a list of currently supported networks. + +> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). + +## Make a Hypercert + +Use the client object to interact with the Hypercert network. For example, you can use the `client.mintClaim` method to create a new claim: + +```js +import { + formatHypercertData, + TransferRestrictions, +} from "@hypercerts-org/sdk"; + +// Validate and format your Hypercert metadata +const { data: metadata, valid, errors } = formatHypercertData({ + name, + ... +}) + +// Check on errors +if (!valid) { + return console.error(errors); +} + +// Set the total amount of units available +const totalUnits: BigNumberish = 10_000_000 + +// Define the transfer restriction +const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly + +// Mint your Hypercert! +const tx = await client.mintClaim( + metadata, + totalUnits, + transferRestrictions, +); +``` + +For guidance on how to specify your metadata, see the [minting guide](../minting-guide/step-by-step.md). +This will validate the metadata, store claim metadata on IPFS, create a new hypercert on-chain, and return a transaction receipt. + +For more details, check out the [Minting Guide](./minting.md). + +## Query for Hypercerts + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more details, checkout the [Querying guide](./querying.md) +and our [Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md new file mode 100644 index 00000000..409a1e9d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md @@ -0,0 +1,41 @@ +# Getting started with Solidity + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +If you need the Solidity contracts or interfaces exported from the SDK, +please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Hypercerts deployments + +Hypercerts is a multi-chain protocol and we want to support any network that wants to make positive impact. +We plan to support at most 1 canonical contract deployment per network. +For a complete list of deployments and their contract addresses, see [Supported Networks](./supported-networks.md). + +## Installing the Hypercert contracts + +```bash +npm install @hypercerts-org/contracts +# or yarn add @hypercerts-org/contracts +``` + +## Using the Solidity interface + +If you want to call the Hypercerts contract on your network directly from Solidity, +we export the interface/ABI for you to use from your contract. + +```js +import { IHypercertToken } from "@hypercerts-org/contracts/IHypercertMinter.sol"; + +contract MyContract { + IHypercertToken hypercerts; + + function initialize(address _addr) public virtual initializer { + hypercerts = IHypercertToken(_addr); + } + + function uri(uint256 tokenID) public view returns (string memory _uri) { + _uri = hypercerts.uri(tokenID); + } +} + +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md new file mode 100644 index 00000000..1ac5556e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md @@ -0,0 +1,29 @@ +# Split and Merge + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## By Token Value + +### Split / merge token values + +```js +const { tokenIds } = await hypercerts.splitFraction({ + tokenId, + units: [10, 12, 15], +}); +const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); +``` + +## By Claim Data + +### Split / merge claim data + +```js +const { claimIds } = await hypercerts.splitClaim({ + claimId, + TODO: somehow specify hypercert subregions +}); +const { claimId} = await hypercerts.mergeClaims({ + claimIds, +}); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md new file mode 100644 index 00000000..3bfd0f18 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md @@ -0,0 +1,13 @@ +# Supported networks + +Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. + +We want to support every network that wants to support positive impact! +If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Overview + +| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | +| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | +| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | +| Optimism | 10 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md new file mode 100644 index 00000000..72b3ee2d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md @@ -0,0 +1,120 @@ +# Deploy a new proxy contract + +This should be done only on rare occasions. For example, when: + +- We want to deploy to a new network +- We have updated the contract in a way that is _NOT_ backwards-compatible. + - For most upgrades, please use UUPS [upgrades](./upgrade.md). + +## Smart Contracts + +### Setup the `contracts/` environment + +Navigate to `contracts/`. Configure your `.env` file by following the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/contracts#setup). + +### Build and deploy the smart contracts + +If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. + +```javascript + "optimism-goeri": getChainConfig("optimism-goerli"), +``` + +Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. + +```sh +# Run in contracts/ +yarn build:hardhat +yarn hardhat deploy --network NETWORK +``` + +This will output the new proxy address. Update the root `README.md` with this new address. + +Now transfer ownership over the proxy contract to the multisig: + +```sh +yarn hardhat transfer-owner --network NETWORK --proxy PROXY_CONTRACT_ADDRESS --owner MULTISIG_ADDRESS +``` + +## Subgraph + +### Setup the `graph/` environment + +Navigate to `graph/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/graph#setup) +to get set up. + +### Deploy the subgraph + +Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). + +Now deploy the subgraph + +```sh +# Run in graph/ +yarn build +yarn deploy:hosted +``` + +## OpenZeppelin Defender + +### Create a new Supabase table + +Log into the [Supabase dashboard](https://app.supabase.com/). +We store all data in a single project, but use different tables for each network. +The table name should be suffixed by the network (e.g. `allowlistCache-goerli`). +If you are deploying to a new network, create a new table. You can copy the table schema and RLS policy from another pre-existing table. + +If you are deploying a new proxy contract to a network for which you already have another deployment, you'll have to make a judgement call as to whether you can reuse the existing table, whether you need to clear the existing table, or create another table. + +Note: We want to merge all the tables in this [issue](https://github.com/hypercerts-org/hypercerts/issues/477). + +### Update the OpenZeppelin Defender scripts + +Modify the Defender scripts to support the new network in `defender/src/networks.ts`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. + +Note: The entry point for deployment is in `defender/src/setup.ts`. + +### Setup the `defender/` environment + +Navigate to `defender/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/defender#setup) +to get set up. + +### Deploy defender scripts + +Deploy to OpenZeppelin Defender via + +```sh +# Run in defender/ +yarn deploy +``` + +## Hypercerts SDK + +TODO: Flesh this out + +Run the build in `contracts/`. + +(Soon to be deprecated) Publish `contracts/` to npm + +Configure the SDK to support the new network via the graphclient. + +Publish SDK to npm + +## Deploy the Dapp frontend + +Each frontend build is configured to run on a different network (e.g. `https://testnet.hypercerts.org`). You can use any CDN to serve the site (e.g. Netlify, Vercel, GitHub Pages, Cloudflare Pages, Fleek, Firebase Hosting). + +1. Configure your build environment with the environment variables specified in `frontend/.env.local.example`. + +2. Configure your builds to the following settings: + +- Build command: `yarn build:site` +- Build output directory: `/build` +- Root directory: `/` + +3. Configure the domain that you want for your build. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md new file mode 100644 index 00000000..05dc5b0c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md @@ -0,0 +1,45 @@ +# Errors + +## Deploying + +### Artifact for contract "HypercertMinter" not found + +#### Error message + +`Error HH700: Artifact for contract "HypercertMinter" not found.` + +#### Cause + +Attempting to deploy a contract with `npx hardhat deploy` before the contract has been compiled by hardhat. Contracts compiled by forge are currently not visible to hardhat (this could be a configuration problem). + +### insufficient funds for intrinsic transaction cost + +#### Error message + +`Error: insufficient funds for intrinsic transaction cost` + +#### Cause + +The environment variable `MNEMONIC` is not configured correctly. + +Alternatively, the wallet may not have enough funds for the selected network + +Causing pause twice + +Error: cannot estimate gas; transaction may fail or may require manual gas limit + +reason: 'execution reverted: Pausable: paused', + +#### Etherscan API + +Note: It can take between 5-10 minutes before a newly created etherscan API key becomes valid for queries to goerli. + +When using an etherscan API key that was too recently created, hardhat tasks using etherscan to verify transactions will exit with an error message: + +`Etherscan returned with message: NOTOK, reason: Invalid API Key` + +Despite this error the transaction may have succeeded, the hardhat task just can't confirm it. + +It is unknown if this is a problem for queries to mainnet as well. + +Metamask makes it very difficult to have multiple wallets. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md new file mode 100644 index 00000000..9b208595 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md @@ -0,0 +1,18 @@ +# DevOps + +We use this playbook to encapsulate our practices and current setup. + +## Setup dev environment + +- [Setup guide](./setup.md) +- [Plasmic setup](./plasmic.md) + +## Tasks + +- [Deploy new proxy contract](./deploy-proxy.md) +- [Upgrade contract](./upgrade.md) +- [Pause contract](./pause.md) + +## FAQ + +- [Common errors](./errors.md) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md new file mode 100644 index 00000000..2668f51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md @@ -0,0 +1,29 @@ +# Pause / Unpause + +## Pause + +### Contract owned by an address + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat pause --network NETWORK --address CONTRACT_ADDRESS +``` + +### Contract owned by a multi-sig + +If we transferred ownership to a multisig, we can use +[OpenZeppelin Defender Admin](https://defender.openzeppelin.com/#/admin) +to propose a pause to be approved by the multisig. + +## Unpause + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat unpause --network NETWORK --address CONTRACT_ADDRESS +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md new file mode 100644 index 00000000..10e52f5b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md @@ -0,0 +1,76 @@ +# Plasmic setup + +## HypercertImage + +### Props + +hideImpact + +``` +$ctx.currentForm.impactTimeEnd === "indefinite" && ($ctx.currentForm.impactScopes.length === 0 || ($ctx.currentForm.impactScopes.length === 1 && $ctx.currentForm.impactScopes[0] === "all")) +``` + +color + +``` +$ctx.currentForm.backgroundColor +``` + +vectorart + +``` +$ctx.currentForm.backgroundVectorArt +``` + +### Slots + +logoImage Image URL + +``` +$ctx.currentForm.logoUrl +``` + +title Content + +``` +$ctx.currentForm.name +``` + +workPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.workTimeEnd.format ? $ctx.currentForm.workTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.workTimeEnd}` +``` + +bannerImage Image URL + +``` +$ctx.currentForm.bannerUrl +``` + +impactPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.impactTimeEnd.format ? $ctx.currentForm.impactTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.impactTimeEnd}` +``` + +#### workScopes: repeated ScopeChip + +Collection + +``` +$ctx.currentForm.workScopes.split(/[,\n]/).map(i => i.trim()).filter(i => !!i) +``` + +Element name: `currentWorkScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentWorkScope` + +#### impactScopes: repeated ScopeChip + +Collection: `$ctx.currentForm.impactScopes` +Element name: `currentImpactScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentImpactScope` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md new file mode 100644 index 00000000..afb95296 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md @@ -0,0 +1,41 @@ +# Setup + +## Pre-requisites + +1. Install [NodeJS](https://nodejs.org/en/) and [git](https://git-scm.com/) +2. Install [yarn](https://classic.yarnpkg.com/) + +```sh +npm install --global yarn +``` + +3. Clone the repository: + +``` +git clone git@github.com:hypercerts-org/hypercerts.git +cd hypercerts +``` + +4. Install dependancies: + +To install dependencies across all projects in the monorepo workspace: + +```sh +yarn install +``` + +## Setup your wallets + +We need 2 wallets: a multi-sig for administering the contracts, and a hot wallet for setting everything up. + +1. We use a [Gnosis Safe](https://app.safe.global/) multisig for managing and administering the contracts. Set one up with your desired confirmation threshold (e.g. 2 of 3). This wallet will not require any balance. +2. Separately, set up a wallet that we'll use in our developer scripts. + +- If you don't have one, you can goto `contracts/` and run `yarn hardhat generate-address`. +- Make sure there is enough balance in this account to deploy the contract and transfer ownership to the multisig + - [Goerli Faucet](https://goerlifaucet.com/) + - [Optimism Bridge](https://app.optimism.io/bridge/deposit) + +## Next Steps + +Depending on what you want to do (e.g. in `./sdk/` or `./frontend/`), there will be further setup instructions in the respective `README.md` file. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md new file mode 100644 index 00000000..820255e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md @@ -0,0 +1,35 @@ +# Upgrading the contract + +## Validate upgrade + +Validate contract upgradeability against deployment. + +For example, for the `goerli` deployment: + +```sh +yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS +``` + +## Propose Upgrade + +Propose an upgrade via OpenZeppelin Defender. For more information, see this +[guide](https://docs.openzeppelin.com/defender/guide-upgrades) + +For example, for the `goerli` deployment: + +```sh +yarn build:hardhat +yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS +``` + +This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. + +## Publish to npm + +After you update the contracts, deploy the `contracts/` package to npm. + +TODO + +Update the dependencies in `frontend/package.json` and `sdk/package.json`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/faq.md b/docs/versioned_docs/version-1.0.0-alpha.1/faq.md new file mode 100644 index 00000000..b9659b5a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/faq.md @@ -0,0 +1,139 @@ +--- +title: Frequently Asked Questions +id: faq +--- + +# FAQs + +### How do I create a hypercert? + +We've created a step-by-step guide in the documents, which you can find [here](minting-guide/minting-guide-start). + +### Who gets to claim my hypercert? + +There are currently two types of users who are eligible to claim your hypercert. + +1. You as the creator of the hypercert are eligible to claim your hypercert. For projects with an allow list, you are eligible to claim 50% of the total tokens. For projects with no allow list, you will receive 100% of the tokens automatically and can do whatever you like with them. + +2. Anyone on the hypercert's allow list will be eligible to claim your hypercert. The allow list is stored and the time of minting and allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions through a separate contract interaction. Creators often use allow lists be used to allocate fractions to previous funders and contributors. + +### How do I claim a hypercert? Can I claim all of the ones I’m eligible for at once? + +After you connect your wallet, you will see a dashboard of hypercerts that you can claim. You can either claim them individually or in a batch transaction. Note that if you perform the batch transaction you will automatically claim _all_ hypercerts you are allow-listed for. (You still pay a gas fee for each claim, however.) If you don't want to claim _all_ at once, then you should claim them one-by-one. + +### What token standard do hypercerts utilize? + +The interface supports both ERC-1155s and 721s. Our current implementation makes use of [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) (a semi-fungible token). + +### What are the required fields to generate a hypercert? + +There are six required fields: + +1. Set of contributors: An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. Scope of work: A conjunction of potentially-negated work scope tags, where an empty string means “all”. +3. Time of work: A date range, from the start to the end of the work being claimed by this hypercert. +4. Scope of impact: A conjunction of potentially-negated impact scope tags, where an empty string means “all”. +5. Time of impact: Date ranges from the start to the end of the impact. +6. Rights of the owners: An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Hypercerts also need a name and description. + +### What should I put for my hypercert's work scope? + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +### Are hypercerts the same as impact evaluations? + +No. A hypercert is a claim over a discrete piece of work and the impact that may result from that work. It has no opinion about the legitimacy or quality of the claim. + +An impact evaluation is an opinionated assessment about the legitimacy or quality of a claim. + +For example, a hypercert might represent "Planting trees in the Amazon in 2022". An impact evaluation might point to that hypercert and assert the percent of trees that survived, the amount of CO2 removed by the trees, or the income change among people living around the project. + +Over time, the expectation is that hypercerts that attract multiple, high quality, credibly neutral impact evaluations will be more relevant than ones that do not. + +### What can I do with my hypercert? + +The `rights` dimension specific what an owner can do with their hypercert. Currently, the only `right` that owners have is "Public Display". Over time, we hope the protocol can support various `rights` including transfers, intellectual property, tax-deductibility, carbon offsets, ESG reporting, and more. + +### How is a hypercert different than a POAP or Impact NFT? + +Hypercerts have some things in common with certain POAPs or Impact NFTs, but also a number of crucial differences. + +First, all POAPs and most Impact NFTs are implemented as non-fungible tokens (ERC-721s). Hypercerts are currently being implemented as semi-fungible tokens (ERC-1155s), meaning it is possible to own more than one unit or fraction of a given hypercert. This makes it easy and intuitive to display the share of hypercerts that a given owner has. + +Second, hypercerts have specific metadata requirements and interpretation logic. These include a standard schema for how the six required hypercert dimensions are defined and captured (i.e., work scopes, impact scopes, timeframes, contributors, etc) as well as logic for how to interpret different inputs (e.g., how to include or exclude certain work scopes, create an indefinite time period, etc). POAPs have a completely different schema. Although there is no standard schema for Impact NFTs, an Impact NFT project could choose to adopt the hypercert standard and token interface and thereby achieve compatibility. + +Third, the hypercerts token interface is intended to support several functions that are not possible out of the box with other token standards, chiefly, atomic split and merge capabilities. We also expect other protocols to work with hypercerts for the purposes of prospective and retrospective funding, contributor verification, and impact evaluation. + +For certain use cases, POAPs may be better suited for projects as hypercerts are focused on the funding aspect of impactful work. + +### Where can I purchase a hypercert? + +Currently, it is only possible to purchase a hypercert from a creator or project. This can be facilitated directly by the project or via a third-party marketplace like OpenSea. Currently, hypercerts cannot be resold on secondary markets. + +### What chain(s) is hypercerts running on? + +The hypercerts smart contracts have been deployed on Optimism and Goerli Testnet. We plan to support various EVM chains in the near future. + +### How do I bridge to Optimism? + +There are various bridging services including the official [Optimism Bridge](https://app.optimism.io/bridge/deposit). Note that bridging assets from Ethereum to Optimism will incur a gas fee. + +### How much gas will it cost to create or claim a hypercert? + +In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). Claiming a hypercert should be below 0.0001 ETH or less than $0.10 on Optimism. + +### How do I create a hypercert from a multisig? + +If you are creating a hypercert on Optimism, then you will need an Optimism-based multisig. (Unfortunately, Safe wallets created on Ethereum won't work on Optimism.) + +### Have the smart contracts been audited? + +Yes. The auditor's security report is available [here](https://github.com/pashov/audits/blob/master/solo/Hypercerts-security-review.md). + +### How is the allow list generated? + +For Gitcoin projects, an allow list is generated from a snapshot of all of the on-chain funding received by the project. + +The queries used to generate the allow lists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Once the snapshot is taken, the formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +### Why am I not on the allow list even though I contributed to the project? + +If you contributed less than $1 DAI to a project, then you will not be eligible to claim a hypercert fraction. + +### I supported a project. Why I don't I see the hypercert in my dashboard? + +In order to your hypercert to appear as "claimable", the project needs to mint the hypercert first. If the project has not minted its hypercert yet, then you will not be able to claim it. We suggest you check back in a few days to see if the project has created the hypercert and is now claimable. + +If the project has created its hypercert, then please try the following solutions: + +1. Confirm the wallet address is correct (some users have multiple wallet addresses and forget which one they donated with) +2. Check that your wallet is included in the Dune Dashboards for each Gitcoin Round + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +3. Confirm you donated more than $1 DAI to the project. + +If the project has created its hypercert, and you have confirmed items 1-3, then please send us a DM over Twitter or Telegram with your wallet address and we will get back to you promptly. + +### How do I retire a hypercert? + +We don't yet have a frontend for retiring hypercerts but you can do this by interacting directly with the smart contract on Etherscan. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md b/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md new file mode 100644 index 00000000..86c25331 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md @@ -0,0 +1,37 @@ +--- +title: Further Resources +id: further-resources +--- + +# Papers, Articles, Presentations + +## Writings + +- Feb 14, 2023, Whitepaper draft by [@hypercerts](http://twitter.com/hypercerts): [Hypercerts: A new primitive for impact funding systems (draft v0)](../static/pdf/hypercerts_whitepaper_v0.pdf) +- Aug 24, 2022, Blogpost by [@holkeb](https://twitter.com/holkeb): [Hypercerts: A new primitive for public goods funding](https://protocol.ai/blog/hypercert-new-primitive/) +- Jun 2022, Tech report (draft) by [@davidad](https://twitter.com/davidad): [Hypercerts; an Interoperable Datalayer for Impact-Funding Mechanisms](../static/pdf/hypercerts_Tech_Report_draft.pdf) + +## Talks + +#### Jun 24, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Hypercerts: on-chain primitives for impact markets](https://youtu.be/2hOhOdCbBlU) + + + +#### Jun 23, 2022, Conversation between [@emiyazono](http://twitter.com/emiyazono) and [@owocki](http://twitter.com/owocki) at GreenPill Podcast: [Impact Certificates | Evan Miyazono, Head of Research at Protocol Labs | Green Pill #21](https://youtu.be/kyo5SxtSJ9U) + + + +#### Mar 4, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Interoperable mechanisms for non-rival goods (Hypercerts)](https://youtu.be/acbBeGcevok) + + + +## Other resources + +Overview of some previous writings on impact certificates, retrospective funding and impact markets: + +- Christiano, Paul (2014) Certificates of impact, Rational Altruist, [https://rationalaltruist.com/2014/11/15/certificates-of-impact/](https://rationalaltruist.com/2014/11/15/certificates-of-impact/) +- Christiano, Paul & Katja Grace (2015) The Impact Purchase, [https://impactpurchase.org/why-certificates/](https://impactpurchase.org/why-certificates/) +- Optimism & Buterin, Vitalik (2021) Retroactive Public Goods Funding, [https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c) +- Cotton-Barratt, Owen (2021), Impact Certificates and Impact Markets, Funding the Commons November 2021, [https://youtu.be/ZiDV56o5M7Q](https://youtu.be/ZiDV56o5M7Q) +- Drescher, Denis (2022) Towards Impact Markets, [https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1](https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1) +- Ofer & Cotton-Barratt, Owen (2022) Impact markets may incentivize predictably net-negative projects, [https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6](https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md new file mode 100644 index 00000000..b2451310 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md @@ -0,0 +1,139 @@ +--- +title: Glossary +id: glossary +sidebar_position: 3 +--- + +# Glossary of Hypercerts Terms + +## Main Terms + +### Allowlist + +A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. + +### Claiming a fraction + +Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. + +### Contributor + +An individual or organization that performs some or all of the work described in a hypercert. + +### Creating a hypercert + +Synonymous to minting a hypercert. + +### Fraction + +A token that represents a quantified proportion of a hypercert denominated in units. + +### Funder + +Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. + +### Hypercert + +A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. + +### Hypercerts interface + +The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. + +### Hypercerts implementation + +An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. + +### Hypercerts standard + +A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Impact + +Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. + +### Impact evaluation + +A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. + +### Impact Funding System (IFS) + +A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. + +### Impact space + +A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Merging hypercerts + +An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. + +### Minting a hypercert + +Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. + +### Project + +Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. + +### Prospective funder + +Individual, organization, or algorithm that fund work before it is done. + +### Retrospective funder + +Individual, organization, or algorithm that fund work after it is done. + +### Rights + +An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. + +### Set of contributors + +An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of impact + +A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of work + +A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Splitting hypercerts + +An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. + +### Time of impact + +Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Time of work + +A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Unit + +The smallest possible fraction of a claim. Generally units are grouped in fractions. + +### Work + +Activities that produce impact. + +## Additional Impact Evaluation Terms + +### Auditor + +Individual, organization, or algorithm that evaluates the impact of work after it is done. + +### Beneficiaries + +People or objects that are impacted by work. + +### Evaluator + +Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. + +### Scout + +Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md new file mode 100644 index 00000000..08eb9fcb --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md @@ -0,0 +1,188 @@ +--- +title: Metadata Standard +id: metadata +sidebar_position: 2 +--- + +# Hypercert Metadata Structure + +Hypercerts are represented as [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) tokens. All token instances of a hypercert must share the same ERC-1155 metadata. For sites like OpenSea to pull in off-chain metadata for ERC-1155 assets, your hypercert contract will need to return an IPFS URI that contains all necessary hypercert metadata. + +The hypercert metadata schema follows the [Enjin recommendation](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema) for ERC-1155 metadata. It also includes **six required dimensions** that are necessary to clearly and unambiguously identify the hypercert's impact claim. + +The following are standard ERC-1155 metadata fields. + +## ERC-1155 fields + +| Property | Description | +| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `name` | Name or title of the hypercert. Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. | +| `description` | A human readable description of the hypercert. Markdown is supported. Additional external URLs can be added. | +| `image` | A URI pointing to a resource with mime type image/\* that represents the hypercert's artwork, i.e., `ipfs://`. We recommend images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. | +| `external_url` | [optional] A URL that can be displayed next to the hypercert on webpages like OpenSea and links users to a page that has more information about the project or impact claim. | +| `properties` | [optional] Additional properties (aka attributes) that may be helpful for discovery and curation of hypercerts. Marketplaces like OpenSea will display these properties in the same way as they display rarity traits of NFTs. | + +In order to perform hypercert-specific operations, including split and merge functions, and for your hypercert to robustly claim a set of coordinates in the impact space, there are six additional dimensions that must be included in your metadata. + +## Required Hypercert dimensions + +| Property | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `work_scope` | An _ordered list_ of work scope tags. Work scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any work scope that is explicitly excluded from the claim. | +| `work_timeframe` | Date range from the start to the end of the work in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). | +| `impact_scope` | An _ordered list_ of impact scope tags. Impact scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any impact scope that is explicitly excluded from the claim. The default claim is to "all" impact, giving the owner rights to claim all potential impact created by the work that is represented by the hypercert. | +| `impact_timeframe` | Date range from the start to the end of the impact in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). The default claim is from the start date of work until `indefinite` (i.e., the impact may occur at any point in time in the future). | +| `contributors` | An _ordered list_ of all contributors. Contributors should be itemized as wallet addresses or ENS names, but may be names / pseudonyms. The default claim is to the wallet address that created the hypercert contract. A multisig wallet can be used to represent a group of contributors. | +| `rights` | An _unordered list_ of usage rights tags. The default claim is solely to "public display" of the hypercert, i.e., all other rights remain with the contributors. | + +## Examples + +### Example 1: hypercert with minimal bounds + +Here is an example of hypercert dimensions for work on IPFS with minimal bounds: + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["IPFS"], + "excludes": [], + "display_value": "IPFS" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": [], + "display_value": "All" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1380585600, 1388534399], + "display_value": "2013-10-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1380585600, 0], + "display_value": "2013-10-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["Protocol Labs"], + "display_value": "Protocol Labs" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 2: hypercert with bounded impact claims + +This hypercert is for a carbon removal project that provides a bounded impact scope. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["CO2 in Atmosphere"], + "excludes": [], + "display_value": "CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 3: hypercert with excluded impact claims + +Here is an example that explicitly excludes an impact scope to generate a more fine-grained claim. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": ["CO2 in Atmosphere"], + "display_value": "All ∧ ¬CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Additional guidelines + +Here are some additional guidelines for defining hypercert dimensions. + +- For most hypercerts, the `work_scope` is best represented as the name of the project or activity. Other information contained in the hypercert, namely, the `contributors` and the `work_timeframe` should provide sufficient context to disambiguate multiple claims from the same project. +- Similarly, for most hypercerts, the `impact_scope` will be most clearly represented as "all" (with an indefinite upper bound on the `impact_timeframe` dimensions). This gives the hypercert creator and its owners the flexibility to make claims about impact that may not have been observable or well-understood when the hypercert was created. + +- It is recommended to browse the `impact_scope` and `work_scope` tags that have already been created and are in use by your or other projects. (We are building a catalog to be available at [hypercerts.org](https://hypercerts.org).) Picking established tags can make it easier for users to discover, curate, and interact with your hypercert. In the long-run, we expect different ontologies to emerge in domains like climate solutions, open source software, etc, and picking more established tags will help prevent overlapping or duplicate claims. +- Tags for work scopes and impact scopes are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. +- Scopes that are explicitly excluded from the hypercert claim are enumerated separately and displayed with the `¬` prefix in the tag. Excluded scopes are not currently displayed on hypercert artwork. +- The order of tags matters only for display purposes. The hypercert artwork will only display a limited number of tags in the `impact_scope` and `work_scope` arrays due to image size and stylistic constraints. +- A `contributor` can be identified using any human-readable string. The base case is to set the `contributors` to the wallet address used to create the hypercert. A multisig wallet can be used to represent a group of contributors. + +### Assigning `rights` + +In version 1.0 of the protocol, only one `rights` tag will be enabled: + +> **Public Display**: owners of the hypercert have the right to publicly display and receive social utility from their hypercert. + +This means that any other rights regarding the work described by the hypercert either remain with the original contributors or are governed by other agreements. + +Additional `rights` including the potential for certain types of transfers to be explicitly enabled will be released in subsequent versions. + +## Optional hidden properties + +Creators may wish to add other fields in their metadata that are not a part of the hypercert claim and are not for display on third-party marketplaces like OpenSea. These can be added by creating a `hidden_properties` field in the metadata. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md new file mode 100644 index 00000000..a767c670 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md @@ -0,0 +1,29 @@ +--- +title: Token Standard +id: token-standard +sidebar_position: 1 +--- + +### Hypercerts as a semi-fungible token + +In order to make the token identifiable, traceable, and transferable, hypercerts are represented as [ERC-1155 tokens](https://eips.ethereum.org/EIPS/eip-1155). The ERC-1155 standard enables a single deployed contract to store many hypercerts, facilitating simpler creation, transfers, as well as splitting and merging of hypercerts within a single namespace. As a semi-fungible token, each unique token represents a fraction of ownership of a hypercert. Hypercerts are then represented as a group of tokens, where the total ownership sums to 100%. In order to easily identify which hypercert a token belongs to, we utilize the upper 128 bits of a 256-bit token ID to identify the hypercert. All tokens within the same hypercert group should share the same [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). + +![hypercert id](../../static/img/hypercert_id.png) + +For illustrative purposes, let us assume that token IDs are just 2 bytes long, where the first byte represents the hypercert ID and the last byte represents which fraction of ownership. Alice could create a new hypercert token 0x2301, representing 100% of hypercert 0x23. If Alice wanted to transfer 20% to Bob, Alice could perform a split operation by minting token 0x2302 and transferring 20% of value to it, such that tokens 0x2301 and 0x2302 represent 80% and 20% ownership respectively of hypercert 0x23. Then Alice transfers token 0x2302 to Bob. Similarly, they could merge these 2 tokens together, back to form a token that represented 100% ownership. In this case, the value of 0x2301 would be transferred to 0x2302, and then 0x2301 is subsequently burned. + +Alice can also choose to split or merge hypercerts along some dimension of the impact space. For example, Alice may split hypercert 0x23 into two new hypercerts — 0x24 representing work done before the year 2000, and 0x25 representing work done after 2000. The original hypercert 0x23 is burned and the two new hypercerts store a reference to the previous hypercert. When the history of splits and merges are indexed, we can easily trace through the provenance of any individual hypercert. + +### Claim Data + +Hypercert claim data, such as scope of work and the contributor list, is encoded in JSON format into the [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). Claim data can be stored on-chain alongside the token, or in off-chain storage such as IPFS. For details on the JSON schema and how off-chain storage can be utilized, see the [hypercerts-sdk repository](https://github.com/hypercerts-org/hypercerts/tree/main/sdk). + +When considering whether to store hypercert metadata on-chain or off-chain, we can consider the different trade-offs to the user experience and cost, which may differ depending on which blockchain is being used. Storing data off-chain saves on costs, but could lead to on-chain claims without the metadata. Storing data on-chain adds additional security that the claims will not be forgotten but can lead to higher gas fees. + +Beyond the standard fields of hypercerts that locate the hypercert in the impact space, additional fields can be added. This allows for different templates in different impact areas, such as AI safety or biodiversity, as different additional information will be useful. Importantly, however, all hypercerts will be located in a single impact space – the additional fields do not change that. + +### Multi-chain support + +We expect hypercerts to exist in a multi-chain ecosystem, where the local deployment can be used to support the unique funding systems of that community. In order to visualize a single global impact space, we index the different contract deployments across chains and surface any potential hypercert claim conflicts. Because different blockchains support different subsets of programming languages, we do expect different implementations of the hypercert protocol to exist. However, they must adhere to the same hypercert data model to be indexed into the impact space. + +In order to decide which deployments to index into the hypercerts impact space, decentralized governance institutions will be used to govern the list of contract addresses used across all blockchains. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/intro.md new file mode 100644 index 00000000..0c4d7ca3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/intro.md @@ -0,0 +1,58 @@ +--- +title: What Are Hypercerts? +id: intro +--- + +# What are hypercerts? + +### Hypercerts are a new token standard for tracking and rewarding positive impact. + +Each hypercert represents a unique impact claim capturing the following information: + +- a scope of work and its corresponding scope of impact +- a set of time frames for both the work and its impact +- a set of contributors – the organization or people behind the work +- a set of rights you get by owning a hypercert + +The hypercert itself is an ERC-1155 semi-fungible token with the information above stored as metadata on IPFS. Here’s an example. + +### Hypercert example + +#### Graphic representation + +![hypercert design example](../static/img/hypercert_example.png) + +#### Supplementary information (metadata) + +- **Title of hypercert:** Invention of the InterPlanetary Filesystem (IPFS) +- **Description:** The InterPlanetary File System (IPFS) is a set of composable, peer-to-peer protocols for addressing, routing, and transferring content-addressed data in a decentralized file system. +- **Link:** ipns://ipfs.tech/ + +#### Hypercert dimensions (metadata) + +- **Set of contributors:** 0xb794f5ea0ba39494ce839613fffba74279579268 _(example Ethereum address)_ +- **Scope of work:** IPFS ∧ ¬ go-ipfs +- **Time of work:** 2013-01-01 --> 2013-12-31 +- **Scope of impact:** All +- **Time of impact:** 2013-01-01 --> indefinite +- **Rights:** Public display + +### Why should you care? + +We spend trillions of dollars every year on public goods via governmental agencies, foundations, private donations and corporate spendings; however, we don’t effectively track this work – leaving us in the dark, hoping that it actually has the intended positive impact. + +We believe we can do better: + +- We should start by tracking this work consistently – this is what hypercerts are for. +- We should evaluate how impactful that work was – this is what the open evaluation system of hypercerts supports. +- We should reward the work that was exceptionally impactful – this is what the public display of hypercerts and retrospective funding is for. + +Doing this would unfold powerful incentives. Retrospective funding 1) provides incentives for creators to take on public goods projects with a potentially high, but uncertain, impact, 2) enables feedback loops to learn from successes and failures, and 3) attracts more talent to the public goods sector by improving performance-based compensation. + +While we are excited about the prospects of retrospective funding, hypercerts do not impose any specific funding mechanisms, but start with tracking the work that is supposed to be impactful. As a database for many funding mechanisms this facilitates experimentation and interoperability between funding mechanisms. + +### Next + +Curious and want to learn more? Head over to the [whitepaper](whitepaper/whitepaper-intro.md) to dive deeper into the world of hypercerts. + +Or do you want to get started right away? Head to the [minting guide](minting-guide/minting-guide-start.md). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md new file mode 100644 index 00000000..1ad2310a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md @@ -0,0 +1,166 @@ +--- +title: Gitcoin Alpha Round Instructions +id: gitcoin-round +sidebar_position: 3 +--- + +# Gitcoin Alpha Round Instructions + +## Overview + +- all projects in the Gitcoin Alpha Round are invited to mint a hypercert for their work +- anyone who gave over $1 to a project is automatically allowlisted for that project’s hypercert +- 50% of each hypercert is distributed to the funders, 50% is kept by the project and can be transferred later +- each project has a custom URL to make minting super easy (the link is sent directly to each project) +- everything runs on Optimism (users only need to pay L2 gas costs) + +:::info +If your project participated in the Gitcoin Alpha Round, but you didn't get a message with a custom URL, please reach out to team[at]hypercert.org. +::: + +## Hypercerts x Gitcoin Alpha Round + +Now that Gitcoin’s Alpha Round has officially closed and the funding distribution is finalized, we are inviting all eligible projects that participated to mint a hypercert for their past work and to allocate fractions of their hypercert to a list of supporters. + +We’ve created a dApp that pulls all of the data required to mint your hypercert directly from Gitcoin’s Grant Protocol. You can fine-tune the properties, tweak your artwork, and review the distribution mechanism. Once you’re ready, hit the create button and your hypercert will be released into the ethers! + +Once your hypercert has been minted, the people who supported your project with a contribution of at least $1 DAI on Gitcoin’s Alpha Round will be able to connect and claim their fractions. + +A few important notes about the Alpha Round: + +- The total units of a hypercert is based on the total donations; each funder get awarded units proportional to their donations. +- Transfers will be restricted to one transfer from the project to the supporters. +- There will be no additional rights awarded to the funders except the right to "public display" their support for the project. + +## Instructions + +The following guidance is only for projects that receive a custom URL that pre-populates the hypercerts form based on their Gitcoin Grants' data. + +It explains the default settings in the form and recommends fields that the creator may choose to update or edit. + +:::note +Gitcoin Grant hypercerts are for retrospective work, i.e., they are intended to capture work that happened between Gitcoin Grants Round 15 (September 2022) and the Alpha Round (January 2023). Therefore, the work time period is always set to past dates. (You might need to adjust the name and description to also refer to past work only.) We are focusing solely on retrospective hypercerts for this round as part of broader efforts to promote retrospective funding; you can read more about it [in the whitepaper](whitepaper/retrospective-funding.md). +::: + +### General Fields + +#### Name of Hypercert + +This field is set by default to the name of your project on Gitcoin Grants. You can edit this to be more specific. Given that your project may create numerous hypercerts over time, consider giving each hypercert a name that represents a more discrete phase or output. + +#### Logo + +This field is set to the icon artwork provided for your project on Gitcoin Grants. If there was an error accessing your icon, you will see a generic icon. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +#### Background Banner Image + +This field is set to the banner artwork provided for your project on Gitcoin Grants. If there was an error accessing your banner, you will see a generic Gitcoin banner. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +#### Project Description + +This field is set by default to the description of your project on Gitcoin Grants. Review closely -- a long project description in your Gitcoin Grant description will be truncated. + +You may edit this to provide more details about your work and to remove information that is targeted solely at Gitcoin Grants users. This is also a good place to provide other links, such as Github repos or social media accounts, where the general public can learn more about the work. Please aim for a project description that is less than 500 characters. + +:::note +The project description should refer to **past work**, not future work that you would like to do with additional funding. +::: + +#### Link + +This field is set to the first external URL provided for your project on Gitcoin Grants. You can update this. + +### Hypercert Fields + +#### Work Scope + +This field is set by default to a **shortened version** of the name of your project on Gitcoin Grants. You may edit or add additional work scope tags. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +#### Work Start/End Dates + +The start date has been set by default to the `2022-09-22` for all projects on Gitcoin Grants. This date coincides with the end of Gitcoin Grants Round 15. + +The end date references the last update to your grant page on Gitcoin Grants. + +You may edit or update these fields, however, the end date may not extend beyond `2023-01-31` (the close of the funding round) as all hypercerts will be retrospective in this round. + +#### Set of Contributors + +This field is set by default to the wallet address that is set as the recipient address for receiving Gitcoin Grants funding. + +:::note +You should review this field closely and – if applicable – provide the addresses of additional contributors. +::: + +### Advanced Fields + +#### Impact Scope + +This field is set by default to `all`. + +Updates are currently disabled on the frontend because funding decisions on Gitcoin Grants were not specific to an impact scope or impact time period. + +#### Impact Start/End Dates + +This field is set by default to the work start date of `2022-09-22` (see above) and a work end date of `indefinite`. Updates are currently disabled on the frontend. + +#### Rights + +This field is set by default to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +Updates are currently disabled on the frontend. + +### Distribution + +#### Allowlist + +This field is set by default to a custom allowlist generated for each project based on the funding it received on the Gitcoin Grants Alpha Round. You should not need to update this field. If there is a problem with your allowlist, please contact us. + +50% of the hypercert will be allocated according to this allowlist. The other 50% will be kept by the project, i.e. it is allocated to the address that mints the hypercert. You will be able to transfer or sell these fractions later as long as they are owned by the minter. This means that they can only be transferred or sold once. + +The formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +The queries used to generate the allowlists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Donors who contributed to the matching pool for each round are also eligible to claim hypercerts. + +:::note +You are free to edit your allowlist. You can do this by following the step-by-step instructions [here](minting-guide/step-by-step.md). Just remember that you will need to upload the new allowlist in a CSV format to a storage site like [web3.storage](https://web3.storage) and then update the link in the allowlist field. Contact team[at]hypercerts.org if you need help. +::: + +### Confirmations + +#### Contributors' permission + +Every contributor needs to agree to have their contribution be represented by a hypercert. This is why the person minting the hypercert has to confirm to have the permission of all listed contributors. + +#### Terms & Conditions + +The terms & Conditions can be found [here](https://hypercerts.org/terms). + +### Final step: Click "Create" + +Make sure your Optimism wallet or multi-sig is connected. Click on "create" and wait for your hypercert to be created. Congratulations! diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md new file mode 100644 index 00000000..47e8ad7c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md @@ -0,0 +1,44 @@ +--- +title: Getting Started +id: minting-guide-start +sidebar_position: 1 +--- + +# Getting started + +### How to create a hypercert + +Creating a hypercert is similar to creating an NFT on sites like OpenSea or Zora. + +In this article, we’ll walk through the steps one by one and explain exactly what you need to do to create your first hypercert. + +There are typically two ways of creating a hypercert: + +1. As a project affiliated with a specific funding network (e.g., Gitcoin Grants): In this case, you should receive a custom URL from the funding network that pre-populates most of your hypercert fields. You will still be able to change most of these, so you should review and adjust them as needed to better describe your hypercert. Guidance on how to do so (for Gitcoin Grants projects) is provided at the end of this doc. +2. As a project not affiliated with a specific funding network: In this case, you will be creating a hypercert from scratch and filling in each field on your own. Read on below. + +### Who can create a hypercert? + +Anyone doing work that is intended to have a positive impact can create a hypercert. Your hypercert can be as simple as "I did X on this date and want to claim all future impact from it". + +It can also represent something more, such as a phase in an ongoing team project, an invention or discovery, a research publication, or an important software release. + +Critically, if the work was done by more than one person, then each person should be listed as a contributor to the hypercert and approve the creation of the hypercert. + +_Note: In the future, the approval of each contributor will be verified on-chain._ + +### What do I need to create a hypercert? + +You will need to prepare all of the information required in the form builder (see **Step-by-step instructions for creating a hypercert** below). This includes important metadata, such as a description of the project and the dimensions of your impact claim, as well as a project artwork. You may also want to include an allowlist of wallets that are approved to claim one or more fractions of the hypercert. + +In addition to the information regarding the hypercert itself, you’ll need a crypto wallet to mint your hypercert. “Minting” a hypercert is the process of writing an impact claim to the blockchain. This establishes its immutable record of authenticity and ownership. + +Next, choose a blockchain on which to mint your hypercert. The hypercerts protocol is available on Ethereum, Goerli (testnet), and Optimism. Each of these blockchains has different gas fees associated with transactions on their networks. To reduce gas fees we recommend Optimism for most projects. + +Finally, go ahead and create your hypercert. + +### How much does it cost to create a hypercert? + +You will need enough Ethereum in your wallet to cover gas fees. In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). + +The protocol currently does not offer gas-free or "lazy" minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md new file mode 100644 index 00000000..9f3b6303 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md @@ -0,0 +1,130 @@ +--- +title: Step-by-step Instructions +id: step-by-step +sidebar_position: 2 +--- + +# Step-by-step instructions + +First, go to the [Create Hypercert](https://hypercerts.org/app/create) site with a wallet-enabled browser or follow the custom URL you received to access a prepopulated form. + +Although the site works on mobile, it is easier to use on desktop because the browser will display a dynamic preview of the hypercert while you fill out the Create form. + +Next, connect your wallet. You will be prompted to switch to the Ethereum or Optimism network. + +Once you've connected, you will see an empty form for creating a hypercert. + +### General fields + +#### Name of Hypercert + +Enter the name or title of the hypercert. This is the place to be verbose and specific about what the project is doing. You'll see on the preview when your title becomes too long. + +Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. + +Names are restricted to 100 characters but may include emojis (:smile:), accents (é), non-Latin scripts (表情), and other Unicode characters. + +#### Project Description + +Enter a human readable description of the hypercert. This is the place to share more details about the work and the team or individual behind the work. + +The description field supports [Markdown syntax](https://www.markdownguide.org/cheat-sheet/) and has a limit of 10,000 characters. + +In addition to the main link (see next field) you can add further links in the markdown to help others to understand the work of the project. + +#### Link + +A valid URL for the project, beginning with https:// + +This will be displayed next to the hypercert on webpages like OpenSea and should link users to a page that has more information about the project or impact claim. + +#### Logo + +An icon for the top left part of the card. This could be your project logo. It will be automatically masked to the shape of a circle. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +#### Background Banner Image + +A background image that will extend across the upper half of the artwork. This could be your project masthead or a unique piece of art. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +Currently we don't support zoom / cropping, so you will need to test the look and feel on your own. + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +### Work Scope fields + +#### Work Scope + +One or multiple tags describe the work that the hypercert represents. This work scope will be used to identify the work that is included in the hypercerts and the work that is not included. + +Multiple tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +_Note: In the future, you will be able to specifically exclude work from the hypercert._ + +#### Start and End Date of Work + +The work time period defines when the work was done that the hypercert represents, i.e., only the work in this time period is included in the hypercert. + +The time period of work doesn't need to be the start and end date of a project, but it can be. One project can be split up into multiple hypercerts, e.g. all hypercerts can have the same `work scope`, but different time periods of work. Of course, the time periods are not allowed to overlap. + +### Impact scope fields + +#### Impact Scope + +The impact scope can be used to limit the impact that a hypercert represents, e.g. for the work scope `Planting trees` a hypercert can represent _only_ the impact on biodiversity by including the impact scope tag `Biodiversity`. This would exclude all other impacts, including the impact on CO2 in the atmosphere, which can be useful if that impact is already captured by a carbon credit. + +By default this is set to "`all`" and we strongly recommend keeping it that way. + +Just like the work scope, multiple impact scope tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction). + +#### Start and End Date of Impact + +The impact time period is another way to limit the impact that a hypercert represents, e.g. inventing a new medical treatment has a positive impact over many years, but we might want to capture the positive impact separately for each year. + +By default the `impact start date` is the same as the `work start date` and the `impact end date` is "`indefinite`", i.e., the impact is not restricted time-wise. We strongly recommend keeping it that way. + +### Set of Contributors + +Provide a list of contributors, one per line, or comma-separated. + +The list should include _all_ contributors that performed the described work. + +Contributors are generally itemized as wallet addresses or ENS names, but can also be names / pseudonyms. Groups of contributors can be represented by a multisig or name of an organization. + +### Owners + +#### Allowlist + +The allowlist allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions afterwards. For example, it can be used to allocate fractions to previous funders and contributors. + +The allowlist is implemented as a CSV file specifying `index,address,price,fractions` headers. + +| index | address | price | fractions | +| ----- | ------------------------------------------ | ----- | --------- | +| 0 | 0x5dee7b340764c49a827c60d2b8729e49405fbefc | 0.0 | 100 | +| 1 | 0x1e2dbb9ca3f6d48e085384a821b7259abfdc7d65 | 0.0 | 50 | +| ... | ... | ... | ... | +| 999 | 0x436bad18642f45d3fa5fcaad0a2d81764a9cba85 | 0.0 | 1 | + +The `price` field is denominated in ETH. This should remain at 0.0 for all hypercerts, as primary sales are not currently supported through the app and the secondary sale/transfer of hypercerts is currently not allowed. + +You can store your allowlists on IPFS using [web3.storage](https://web3.storage/). + +:::note +If your allowlist is not properly formatted, you will be unable to mint your hypercert. If you do not include an allowlist, then the creator of the hypercert will receive 100% of the hypercert (set to a default of 10,000 units), which you can then sell or transfer to another wallet a maximum of one time. +::: + +#### Rights + +This field defines the rights that owners of the hypercert have over the work being claimed by this hypercert. + +By default this is set to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +_Note: In the future, additional rights can be included for different hypercerts._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md new file mode 100644 index 00000000..87fb9194 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md @@ -0,0 +1,23 @@ +--- +title: Open Impact Evaluations +id: evaluation +sidebar_position: 5 +--- + +A key design element is that hypercerts themselves do not make a claim about the size of the impact, but only account for the work that is supposed to be impactful. The figure below shows this contrast in a simplified illustration of the example that we introduced above. The open evaluation system allows multiple evaluations to point at the same area of the impact space that a hypercert claims. The evaluations can include self-evaluation from the contributors themselves. Funders observe these and make their funding decisions based on this richer set of information. + +![hypercert evaluations](../../static/img/hypercert_evaluations.png) + +The open evaluation system is also used to provide additional information, e.g. an evaluator or the project itself provides information about the health of the trees. This information can then be used transparently by other evaluators to evaluate the impact on CO2 in the atmosphere. + +An important feature is that the evaluations do not directly point at a hypercert, but rather at an area in the impact space. In practice this area will mostly be the exact same area that a hypercert claims, such that it can be considered an evaluation of the hypercert, but it does not have to. This feature ensures that, if hypercerts are merged or split, previous evaluations will continue to be linked appropriately. + +The form of evaluations can be standardized to simplify handling and comparing multiple evaluations from multiple evaluators. The open evaluation system allows for templates to be created and used by any evaluators. Similar to the emerging ontologies, these are not enforced centrally, but should emerge as useful standards – potentially steered by decentralized governance institutions. + +Important characteristics of the open evaluation system are: + +- Evaluators can submit multiple evaluations of the same area in the impact space as more information becomes available +- Evaluations can challenge other evaluations +- Evaluation methodologies can evolve over time + +These features allow the whole evaluation system to be dynamically improved by each actor. The relevant incentives for this improvement will stem from the funders who will value the signals from some evaluators more than others and evaluators are able to build up reputation. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md new file mode 100644 index 00000000..8acc11d1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md @@ -0,0 +1,104 @@ +--- +title: "Hypercerts: a New Primitive for Impact Funding Systems" +id: hypercerts-intro +sidebar_position: 3 +--- + +### Defining hypercerts + +A hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and represents all or parts of that impact. A hypercert has the following fields (one for each dimension): + +1. **Set of contributors:** An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. **Scope of work:** A conjunction of potentially-negated work scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +3. **Time of work:** A date range, from the start to the end of the work being claimed by this hypercert. +4. **Scope of impact:** A conjunction of potentially-negated impact scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +5. **Time of impact:** Date ranges from the start to the end of the impact. +6. **Rights of the owners:** An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Implementing hypercerts as a semi-fungible token allows multiple contributors and funders to own parts of hypercerts. For instance the original contributors can award 10% of a hypercert to a funder, while keeping 90%, which they can award to other funders later. This is why hypercerts are fractionalizable. + +### Examples + +In the simplest cases of hypercerts, the scope of work and impact as well as the time of impact are not restricted and no rights are transferred to owners of the hypercerts, i.e. the hypercerts just define the who (set of contributors) and when (time of work) of the claimed work. Scope of work and impact would be set to all, time of impact to “indefinite” and the rights to only “public display of support”. The latter is always included as the hypercert is a public record, such that owners will always automatically display their support of the work. + +Take for example hypercert 1 below: It represents all work that contributor 1 has performed in 2013 with all the impact that the work had from the beginning of the work; the hypercert doesn’t give any additional rights to the owners of the hypercert. + +The other fields – except the rights field – can be used to limit the work or impact that is represented by the hypercert. Hypercert 2 limits this to the work on IPFS in 2013, i.e. any other work besides IPFS that contributor 1 performed is not included. Hypercert 3 limits it even further as it excludes a specific aspect of IPFS, the go-ipfs implementation. + +| | **Hypercert 1** | **Hypercert 2** | **Hypercert 3** | +| ----------------------- | ------------------------- | ------------------------- | ------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | all | IPFS | IPFS ∧ ¬ go-ipfs | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | all | all | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → 2013-12-31 | +| **Rights** | Public display of support | Public display of support | Public display of support | + +In the table below we illustrate a use case for limiting the scope of impact. Suppose contributor 1 protects trees in a certain area. This work has positive effects on the CO2 in the atmosphere and could turn into carbon credits; however, the trees have additional positive impacts, such as protecting biodiversity. Instead of including all positive impacts in one hypercert (hypercert 4), the impact can be split between the impact on CO2 in the atmosphere (hypercert 5) and all other positive impacts (hypercert 6). If funders are willing to pay for biodiversity, this would be a new income opportunity. And it would account for the additional positive impact that other methods of reducing CO2 might not have, like industrial carbon capture. Importantly, negative impacts can not be excluded from a hypercert. + +| | **Hypercert 4** | **Hypercert 5** | **Hypercert 6** | +| ----------------------- | -------------------------- | -------------------------- | -------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | Protecting trees in area X | Protecting trees in area X | Protecting trees in area X | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | CO2 in atmosphere | all ∧ ¬ CO2 in atmosphere | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → indefinite | +| **Rights** | Public display of support | Public display of support | Public display of support | + +Importantly a hypercert does not specify the “size” of the impact, e.g. a hypercert does not state “5 tons of CO2 removed from the atmosphere.” Instead the hypercert only defines the work, e.g. “200 trees protected” (scope of work) in 2022 (time of work). The size of the impact is then left to the evaluations of the “CO2 in the atmosphere” (scope of impact) in 2022 (time of impact) that point towards the covered region of the hypercert. For instance: This allows a self evaluation to claim that 5 tons of CO2 were removed in a given year as well as one or multiple evaluations from independent auditors to confirm or challenge how much CO2 has been removed. An evaluator could detect that some of the trees were not healthy and hence only 4 tons of CO2 were removed. Allowing for multiple evaluation is a defining characteristic of the open evaluation system. + +### Functions of hypercerts + +#### 1. Identifiability + +Hypercerts clearly define the work that is supposed to be impactful by creating a record of who (set of contributors) claims to do or have done what (scope of work) in what time period (time of work). They also allow the creation of multiple records of the same work to identify separate impacts that this work had or will have (scope of impact) over specified time periods (time of impact). + +#### 2. Traceability + +As these records are public and logically monotonic (immutable, except to split or merge hypercerts), records are durable and permanent. + +#### 3. Transferability + +The records are a digital object that can be owned and ownership can be transferred (under specific conditions). As hypercerts can be created as fractionalizable, it is also possible to transfer only a specified fraction of the hypercert. Each hypercert defines the rights over the defined work that owners have, such as rights to retrospective rewards, rights to public display of the support (“bragging rights”) or rights to passive income from intellectual property. + +:::note Transferability restrictions + +Hypercerts are generally transferable. However, there are use cases, in which minters of hypercerts want to restrict how their hypercerts can be transferred. The protocol allows the minter to restrict who can transfer the hypercert and/or to whom the hypercert can be transferred. For instance, by specifying that only the original owner can transfer the hypercert, any future owner is prohibited from selling it, i.e. a secondary market would not exist for this hypercert. + +::: + +### Merging hypercerts + +Besides the fungible dimension, hypercerts can be merged and split on any of the six dimensions as shown in box 1. Let us take the hypercert 1 from the section "Hypercerts definition" and focus only on two of the dimensions, scope of work and time of work. These two dimensions create a simplified impact space. The figure below shows how work on IPFS (InterPlanetary File System) could have been minted over time in separate hypercerts, one for each quarter of work. + +![minting hypercerts example](../../static/img/creating.png) + +We created five hypercerts, one for each quarter of work. As the resulting work of all of these together is IPFS 0.1, the merged hypercert in total is more meaningful and more valuable than just the five individual hypercerts. In this case the proverb is true, the whole is greater than the sum of its parts. Hence, we want to merge them as shown in the next figure. + +![merging hypercerts example](../../static/img/merging.png) + +### Splitting hypercerts + +Conversely, splitting can increase the meaningfulness and value of hypercerts as well. We can split the work on IPFS 0.1 into the conceptual work “invention of IPFS” and the implementation via “go-ipfs 0.1” as shown in the next figure. + +![splitting hypercerts examples](../../static/img/splitting.png) + +Other use cases are where multiple contributors want to combine their work on the same scope of work (merging) or disentangle their work (splitting). Ultimately, splitting and merging allows users to repackage the digital representation of their work and impact. + +Importantly, splitting and merging are the only operations that are permitted to change hypercerts. Once an area in the impact space is claimed, it can not be unclaimed. This ensures that claims are never forgotten. + +### Retiring hypercerts + +While a claim in the impact space can not be unclaimed, it can be retired. Retiring a hypercert means that owners can not transfer and sell it anymore. This way owners prove that they are the final buyers of the impact. Technically retiring hypercerts means that they are sent to a specific null address, which ensures that the retired hypercerts are recorded and traceable. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md new file mode 100644 index 00000000..6f71ac50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md @@ -0,0 +1,103 @@ +--- +title: The Need for Interoperable Impact Funding Systems (IFSs) +id: ifs +--- + +# The Need for Interoperable Impact Funding Systems (IFSs) + +### An IFS consists of + +- **Actors:** Contributors, funders, evaluators, and beneficiaries +- **Funding mechanisms:** Grants, bounties, retrospective funding, etc. +- **Coordination mechanisms:** Roadmapping, communication forums, etc. +- **A goal:** Maximize the domain-specific positive value created (impact) + +The goal will be specific to the impact area, e.g. prevent existential risks from artificial intelligence (AI) would be the goal for the impact area “AI safety.” To achieve these goals, skilled contributors must work with high effort on promising projects. Additionally, for those projects that create impact continuously, sufficient income streams are necessary to cover both their ongoing operating expenses and contributors’ upside incentives. + +#### Actors in IFSs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeSubtypeDescription
ContributorsPeople or organizations who do the work
FundersProspective fundersPeople or organizations who fund work before it is done
Retrospective fundersPeople or organizations who fund work after it is done
EvaluatorsScoutsPeople or organizations who evaluate the potential impact of work before it is done
AuditorsPeople or organizations who evaluate the impact of work after it is done
BeneficiariesPeople or objects that are impacted by the work
+ +### Guiding questions for designing IFSs + +1. **Projects:** How can we improve the chances that the most promising projects are worked on? +2. **Talent & resources:** How can we attract top talent to contribute to the most promising projects and provide them with the necessary resources? +3. **Effort:** How can we reward contributors for their impact on outcomes? +4. **Sustainable income:** How can we create recurring income streams and financial sustainability for impactful projects? + +Markets have been proven very powerful in answering these questions if they are directed towards maximizing profits. As we are directing systems towards maximizing impact, these answers become more challenging. In particular, in an IFS we are facing coordination and incentive problems in funding impact, such as the free-rider problem. + +### Example dynamics between actors in an IFS + +In order for impact funding systems to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources and (3) evaluations. In the diagram below you see a potential dynamic between the actors of an IFS. In that scenario hypercerts can account for the prospective funding (steps 2-3) as well as for the retrospective funding (steps 8-9) from different funders. Evaluations are made public and can be discovered through the hypercerts for all funders (steps 5-7). Retrospective funders can reward not only the contributors but also the prospective funders (steps 10-11). + +```mermaid +sequenceDiagram + autonumber + participant Beneficiaries + participant Contributors + participant Prospective funders + participant Retrospective funders + participant Evaluators + Contributors ->> Contributors: Mint hypercerts + Prospective funders ->> Contributors: Award funding + Contributors ->> Prospective funders: Award fractions of
the hypercert + Contributors ->> Beneficiaries: Create impact + Retrospective funders ->> Evaluators: Fund evaluation + Evaluators ->> Beneficiaries: Evaluate impact on beneficiaries + Evaluators ->> Retrospective funders: Make evaluations public,
esp. for retrospective
funders + Retrospective funders ->> Contributors: Award funding + Contributors ->> Retrospective funders: Award fractions of hypercerts + opt + Retrospective funders ->> Prospective funders: Award funding + Prospective funders ->> Retrospective funders: Transfer fractions
of hypercert + end +``` + +### Hypercerts as a data layer for IFSs + +By serving as a single, open, shared, decentralized database hypercerts lower the transaction costs to coordinate and fund impactful work together. This is important because the optimal funding decisions of a single funder depends on the funding decision of all other funders. For instance, some work is only impactful if a minimum funding is provided: The impact is non-linear in the funding amount, e.g. half a bridge is not half as impactful as a full bridge. Other work might be over-funded, i.e. the impact of an additional dollar is basically zero. Ultimately, funders want to find the highest impact for each additional dollar spend (cf. S-process as in Critch, 2021). Today multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Through hypercerts the funding becomes more transparent and the credits for funding impactful work can be easily shared. Coordinating funding becomes easier. + +Hypercerts don’t solve this coordination problem by themselves, but build the basis for different decision and funding mechanisms as shown below. Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. Hypercerts do not lock in any particular decision-making scheme for funders. + +![Hypercerts as a data layer for an IFS](../../static/img/hypercert_data_layer.png) + +Looking farther into the future: If a large majority of funding across an entire IFS ends up flowing through hypercerts, funders have created the transparency that enables each of them to make the best decisions given the funding decision of everyone else. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md new file mode 100644 index 00000000..f8fed762 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md @@ -0,0 +1,35 @@ +--- +title: A Consistent Impact Space +id: impact-space +sidebar_position: 4 +--- + +Every hypercert represents a claim in the impact space, which itself represents all possible claims. Above we illustrated the impact space with two dimensions, scope and time of work. The complete impact space is spanned by the six dimensions introduced in the definition of hypercerts. + +### Consistency of the impact space + +Every point in the impact space should either be claimed or not be claimed. No point must be claimed twice, or equivalently: + +- If the impact of some work is represented in one hypercert, it must not be part of any other hypercert. +- Hypercerts must not overlap with each other. + +The table below shows two hypercerts that were illustrated in the section on "Hypercerts operations", but now with all six fields. The two hypercerts can represent the exact same work by the same contributor, but they do not overlap because of the difference in the time of work. + +| | **Hypercert 7** | **Hypercert 8** | +| ----------------------- | ------------------------ | ------------------------ | +| **Set of contributors** | Contributor 1 | Contributor 1 | +| **Scope of work** | IPFS | IPFS | +| **Time of work** | 2013-10-01 to 2013-12-31 | 2014-01-01 to 2014-03-31 | +| **Scope of impact** | all | all | +| **Time of impact** | 2013-10-01 → indefinite | 2014-01-01 → indefinite | +| **Rights** | None | None | + +The consistency of the impact space is crucial as it ensures that no rights to an impact claim are sold twice. If for example someone owns the right to retrospective rewards for the impact of some work, the owners must be identifiable unambiguously. + +Because users can create hypercerts with arbitrary data on any chain, on which a hypercert contract is deployed, we provide ways to help users detect collisions in the impact space. For example, if one hypercert on Ethereum points to the work on “IPFS”, and another hypercert on Filecoin points to the work on “https://github.com/ipfs/go-ipfs” both with the same contributor and time of work, which of these overlapping hypercerts is the correct one to support? To surface such overlapping hypercerts, the hypercerts protocol and SDK will support mechanisms to index, search, and visualize neighbors in the impact space. With these tools evaluators can quickly detect potential conflicts and submit the results as evaluations to help disambiguate proper credit and attribution. + +### Emerging ontologies + +Common ontologies for the scope of work and scope of impact are useful to create transparency and improve discoverability. Such ontologies need to be created from the practices and should be adapted over time. They are like emerging norms, instead of fixed rules. However, some larger players or a group of smaller players could enforce certain ontologies, e.g. if multiple funders agree that they only fund projects that follow a specified ontology. + +As some ontologies might be more useful than others, we would ideally see a consensus emerge between participants and experts in each impact area. Decentralized governance institutions can help facilitate this; however, further details on the design are out of the scope of this paper and are left for future work. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md new file mode 100644 index 00000000..57444581 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md @@ -0,0 +1,42 @@ +--- +title: Retrospective Impact Funding +id: retrospective-funding +sidebar_position: 6 +--- + +### Introducing retrospective funding + +While hypercerts do not impose any specific funding mechanisms, they are especially useful for retrospective funding. The core idea, from the perspective of contributors building impactful goods, is this: if you can reasonably expect to get funded retrospectively for your work once you produce a positive impact, then you can work now, in expectation of a probabilistic future cash flow. In another conception, you are effectively “borrowing” money from this anticipated future cash flow to fund the work in the first place; the expectation of future funding “retro-causes” the impactful work. Retrospective funding may be able to 1) provide incentives for contributors to take on impactful goods projects with a potentially high, but uncertain, impact and 2) create a more efficient IFS by back-propagating signals on what outcomes were impactful post-hoc. + +In addition, contributors are able to receive fair compensation by providing outsized impact that will be highly valued. It incentivizes you to create a positive impact, beyond your intrinsic motivation. This does not mean that the most successful contributors to impactful goods automatically have potential upside comparable to some for-profit startup founders (or that they should), just that their potential upside does depend on how much funders later value their past work. This will attract more talent to the impact sector by improving performance-based compensation. + +The crucial aspect for this to work: funders need to retrospectively fund impact, and send credible signals that they will do so in the future. Based on these signals contributors form expectations about future retrospective rewards and can start working today to receive them in the future. + +Hypercerts facilitate retrospective funding as the impact claims are identifiable, traceable and transferable. Contributors can sell parts of their hypercerts to prospective funders to receive the necessary funding for their project (“activity” in the figure below). The project delivers impact to a larger group (“beneficiaries”), which retrospectively buys the hypercerts from the prospective funder, and from the contributors if they retained some fraction of their hypercerts (the latter is not represented in the figure). + +![Retrospective funding with hypercerts](../../static/img/retrospective_funding.png) + +### Increasing rewards + +Retrospective funding allows us to increase rewards as more impact is created because impact is easier to observe, measure and prove retrospectively. Increasing rewards – as shown in the next figure – incentivizes contributors to put in their highest effort to produce impact and enables contributors to be rewarded for their talent. Moreover, prospective funders are incentivized to select, fund and support the projects with the highest expected impact, if they also receive retrospective rewards. + +![Increasing rewards](../../static/img/increasing_rewards.png) + +Note that retrospective funding should not be used in cases where a significant negative impact is possible since a nongovernmental, permissionless framework can not impose retrospective penalties for negative externalities. See Ofer & Cotton-Barratt (2022) for a discussion of this limitation of retrospective funding. + +In some cases we do not expect the retrospective evaluation to be any different than the prospective evaluation, i.e. there is no uncertainty resolved over time as the impact of an activity is already “known” prospectively. In these cases retrospective funding would only complicate the funding mechanism and funding via grants or milestone bounties would be preferable. Retrospective funding is preferable only if uncertainty is resolved over time. + +### Impact evaluations + +The relevance of impact evaluations will depend on how much their signals influence the funding decisions of retrospective funders (see the potential dynamics in the section on "IFSs"). This is a critical difference to many impact reports today: If a project was funded by a grant, the funders as well as the project want to receive a positive evaluation. If, however, the funding decisions of the retrospective funders are outstanding, they are interested in truthful signals about the impact. Hence, funders value improvements in evaluation methodologies and can fund independent evaluators. Evaluators in turn would build up a reputation for their evaluation methodologies and improve the strength of their signals to retrospective funders. + +Impact evaluators can take on a range of forms ranging forms, such as + +- Voting by relevant communities or beneficiaries +- Expert panels +- Professional evaluators similar to financial rating agencies +- Automatic monitoring and data collection by sensors and oracles + +The most useful form or combinations thereof will depend on the specific requirements of the impact area. For a generalized framework on impact evaluators see Protocol Labs (2023). + +While retrospective funding makes impact evaluations financially relevant for funders and contributors, hypercerts enable to pre-commit funding for those evaluations: As impact claims are never forgotten, any actor can at any time commit funding to a future evaluation of these claims. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md new file mode 100644 index 00000000..4d4648ba --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md @@ -0,0 +1,24 @@ +--- +title: Introduction +id: whitepaper-intro +--- + +# Vision & Whitepaper + +:::note + +If you prefer to read the draft whitepaper (v0) as a pdf, you can find it [here](../../static/pdf/hypercerts_whitepaper_v0.pdf). The content is mostly identical to the following pages. + +::: + +#### The world faces unprecedented challenges, from climate change to safe artificial intelligence, that require billions to trillions of dollars of public goods funding. + +High-upside/high-uncertainty endeavors are often overlooked due to the absence of strong incentives to pursue them in the dominant public goods funding framework of at-cost grants or even a milestone-bounty framework (which directly exposes small contributors to aversive risk levels). Yet these should be pursued when the expected positive value is very high, as it often is. New impact funding mechanisms can address this. One such mechanism is retrospective funding, which rewards projects based on the impact they create after the impact is observable. If projects can reasonably expect such retrospective rewards, they are incentivized to maximize their impact and – together with prospective funders – take risky bets when the expected positive value is high. + +#### In order for Impact Funding Systems (IFSs) to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources, and (3) evaluations. + +Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. We do not wish to lock in any particular decision-making scheme for funders. Without mechanisms like these, multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Funders should be able to easily collaborate with other funders or to intentionally fund different projects to diversify the funded approaches. Evaluators should be able to evaluate the same impact with different methodologies – potentially with conflicting results, to foster rigor and progress of evaluation methodologies. + +#### Hypercerts create this interoperability by serving as a single, open, shared, decentralized database for impact funding mechanisms. + +A single hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and whose ownership is fractionizable and transferable (under specific conditions). Hypercerts do not impose any specific funding mechanisms but provide baseline invariant guarantees such that claims will not be forgotten as different mechanisms come into and out of fashion. This is also why hypercerts are especially useful for any retrospective funding mechanisms – funding can be applied to claims of the past. diff --git a/docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json b/docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json new file mode 100644 index 00000000..91fbd94e --- /dev/null +++ b/docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json @@ -0,0 +1,165 @@ +{ + "mySidebar": [ + { + "type": "doc", + "id": "intro" + }, + { + "type": "category", + "label": "Vision & Whitepaper", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "whitepaper/whitepaper-intro" + }, + { + "type": "doc", + "id": "whitepaper/ifs" + }, + { + "type": "doc", + "id": "whitepaper/hypercerts-intro" + }, + { + "type": "doc", + "id": "whitepaper/impact-space" + }, + { + "type": "doc", + "id": "whitepaper/evaluation" + }, + { + "type": "doc", + "id": "whitepaper/retrospective-funding" + } + ] + }, + { + "type": "category", + "label": "Developer Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "developer/quickstart-javascript" + }, + { + "type": "doc", + "id": "developer/quickstart-solidity" + }, + { + "type": "doc", + "id": "developer/minting" + }, + { + "type": "doc", + "id": "developer/allowlists" + }, + { + "type": "doc", + "id": "developer/querying" + }, + { + "type": "doc", + "id": "developer/split-merge" + }, + { + "type": "doc", + "id": "developer/evaluations" + }, + { + "type": "doc", + "id": "developer/burning" + }, + { + "type": "doc", + "id": "developer/supported-networks" + }, + { + "type": "doc", + "id": "devops/index" + }, + { + "type": "category", + "label": "API Reference", + "collapsed": true, + "items": [ + { + "type": "category", + "label": "Protocol", + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "developer/api/contracts/protocol" + } + ] + }, + { + "type": "category", + "label": "Exchange", + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "developer/api/contracts/marketplace" + } + ] + }, + { + "type": "doc", + "id": "developer/api/sdk/modules" + } + ] + } + ] + }, + { + "type": "category", + "label": "Minting Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "minting-guide/minting-guide-start" + }, + { + "type": "doc", + "id": "minting-guide/step-by-step" + }, + { + "type": "doc", + "id": "minting-guide/gitcoin-round" + } + ] + }, + { + "type": "category", + "label": "Implementation", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "implementation/token-standard" + }, + { + "type": "doc", + "id": "implementation/metadata" + }, + { + "type": "doc", + "id": "implementation/glossary" + } + ] + }, + { + "type": "doc", + "id": "faq" + }, + { + "type": "doc", + "id": "further-resources" + } + ] +} diff --git a/docs/versions.json b/docs/versions.json index 41c95742..df2daf73 100644 --- a/docs/versions.json +++ b/docs/versions.json @@ -1 +1,2 @@ -["1.0.0-alpha.0", "0.3.0", "0.0.1"] +["1.0.0-alpha.1", "0.3.0", "0.0.1"] + From 197968d71ff7782a4b3a9df8941666e8c466e7a9 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 5 Dec 2023 01:02:34 +0100 Subject: [PATCH 038/118] Develop (#1213) * Feat/sdk common js (#1191) * feat(fractions): added strategy and tests * feat(tests): update tests and tweak strat * feat(test): fix all the test and clean comms * fix(dist): moar contracts * fix(tweak): little cleanups * chore(lint): fix lint errors * fix(lint): updated foundry lint * feat(test): uncomment unused tests * feat(bugs): cjs build and import alpha.13 * fix(only): unexpected only in sdk test * feat(abis): updated SDK abis and restored tests (#1193) * feat(abis): updated SDK abis and restored tests * chore(bump): viem in fe * fix(test): add currency admin to test (#1197) * fix build error - set output:export in next config (#1199) * fix build error * lock nextjs version to 13.x.x * add placeholder for transfer fraction button (#1201) * add placeholder for transfer fraction button * remove unnecessary logic from transfer-fraction-button.tsx * change next build back to next export (#1202) remove unnecessary logic from transfer-fraction-button.tsx * Feature/transfer fraction button (#1203) * add transfer fraction button inside split fraction button * add confirmation dialog when transferring fraction * use override chain id in hypercert fetcher within plasmic * add reading of transfer restrictions to transfer fraction button * add override chain id functionality for plasmic editing (#1204) * Bugfix/add override chain id for plasmit editing (#1205) * add override chain id functionality for plasmic editing * add override chain id to effect dependencies * remove transfer fraction button from split fraction button (#1206) * Bugfix/only show transfer button for fraction owned (#1207) * only show transfer button for fractions owned * only show transfer button for fractions owned * Feat/more robust split transfer logic with hc strategy (#1208) * feat(hc): split NFT HC flow * feat(hc): hypercert order routing and validation * fix(e2e): disable faulty E2E tests * Feat/docs tests cleanup (#1210) * feat(checks): checkValidityHC, error code, 0.8.17 * feat(validator): overvalidator HC tests * fix(clean): remove hyperboard references * fix(lint): pragma protocol tests * fix(pragma): restore FeeManagerRoy.. pragma * feat(docs): updated version * feat(build): docs 1.0.0-alpha * Feat/docs tests cleanup (#1211) * feat(checks): checkValidityHC, error code, 0.8.17 * feat(validator): overvalidator HC tests * fix(clean): remove hyperboard references * fix(lint): pragma protocol tests * fix(pragma): restore FeeManagerRoy.. pragma * feat(docs): updated version * feat(build): docs 1.0.0-alpha * chore(docs): natspec tweaks * Feat/docs tests cleanup (#1212) * feat(checks): checkValidityHC, error code, 0.8.17 * feat(validator): overvalidator HC tests * fix(clean): remove hyperboard references * fix(lint): pragma protocol tests * fix(pragma): restore FeeManagerRoy.. pragma * feat(docs): updated version * feat(build): docs 1.0.0-alpha * chore(docs): natspec tweaks * feat(docs): docs sidebar --------- Co-authored-by: Jip Stavenuiter --- .github/workflows/e2e-tests.yml | 10 - contracts/.solhint.json | 2 +- contracts/hardhat.config.ts | 2 +- contracts/package.json | 3 +- .../deployment-marketplace-goerli.json | 2 +- contracts/src/index.ts | 8 +- .../CreatorFeeManagerWithRebates.sol | 2 +- .../CreatorFeeManagerWithRoyalties.sol | 2 +- .../src/marketplace/ExecutionManager.sol | 2 +- .../src/marketplace/LooksRareProtocol.sol | 80 +- contracts/src/marketplace/NonceManager.sol | 2 +- .../src/marketplace/ProtocolFeeRecipient.sol | 2 +- contracts/src/marketplace/StrategyManager.sol | 2 +- contracts/src/marketplace/TransferManager.sol | 28 +- .../src/marketplace/TransferSelectorNFT.sol | 34 +- .../constants/ValidationCodeConstants.sol | 20 +- .../src/marketplace/enums/CollectionType.sol | 5 +- .../marketplace/errors/HypercertErrors.sol | 10 + .../src/marketplace/errors/SharedErrors.sol | 2 +- .../executionStrategies/BaseStrategy.sol | 2 +- .../StrategyCollectionOffer.sol | 2 +- .../StrategyDutchAuction.sol | 2 +- .../StrategyHypercertFractionOffer.sol | 94 +- .../StrategyItemIdsRange.sol | 2 +- .../marketplace/helpers/OrderValidatorV2A.sol | 72 +- .../interfaces/ICreatorFeeManager.sol | 2 +- .../interfaces/ICurrencyManager.sol | 2 +- .../interfaces/IExecutionManager.sol | 2 +- .../interfaces/IImmutableCreate2Factory.sol | 2 +- .../interfaces/ILooksRareProtocol.sol | 2 +- .../marketplace/interfaces/INonceManager.sol | 2 +- .../interfaces/IRoyaltyFeeRegistry.sol | 2 +- .../src/marketplace/interfaces/IStrategy.sol | 2 +- .../interfaces/IStrategyManager.sol | 2 +- .../interfaces/ITransferManager.sol | 4 +- .../libraries/CurrencyValidator.sol | 2 +- .../libraries/LowLevelHypercertCaller.sol | 13 +- .../MerkleProofCalldataWithNodes.sol | 2 +- .../OpenZeppelin/MerkleProofMemory.sol | 2 +- .../marketplace/libraries/OrderStructs.sol | 4 +- contracts/src/protocol/AllowlistMinter.sol | 2 +- contracts/src/protocol/HypercertMinter.sol | 9 +- contracts/src/protocol/SemiFungible1155.sol | 2 +- .../src/protocol/interfaces/IAllowlist.sol | 2 +- .../protocol/interfaces/IHypercertToken.sol | 2 +- contracts/src/protocol/libs/Errors.sol | 2 +- contracts/tasks/deploy-marketplace.ts | 2 +- .../marketplace/LooksRareProtocol.t.sol | 10 + .../marketplace/OrderValidatorV2A.t.sol | 75 ++ .../HypercertFractionOffers.t.sol | 201 ++- .../foundry/protocol/AllowlistMinter.t.sol | 2 +- .../test/foundry/protocol/Bitshifting.t.sol | 2 +- .../HypercertMinter.batchminting.t.sol | 2 +- .../protocol/HypercertMinter.pausable.t.sol | 2 +- .../foundry/protocol/HypercertMinter.t.sol | 13 +- .../protocol/HypercertMinter.transfers.t.sol | 2 +- .../foundry/protocol/PerformanceTesting.t.sol | 2 +- .../SemiFungible1155.allowances.t.sol | 2 +- .../protocol/SemiFungible1155.burning.t.sol | 2 +- .../protocol/SemiFungible1155.minting.t.sol | 2 +- .../foundry/protocol/SemiFungible1155.t.sol | 2 +- .../protocol/SemiFungible1155.transfers.t.sol | 2 +- .../protocol/SemiFungible1155.units.sol | 2 +- .../foundry/protocol/SemiFungibleHelper.sol | 2 +- contracts/test/mock/MockHypercertMinter.sol | 73 ++ ...MockHypercertMinterSupportsNoInterface.sol | 10 + ...MockHypercertMinterWithoutAnyBalanceOf.sol | 12 + .../MockHypercertMinterWithoutAnyUnitsOf.sol | 10 + .../marketplace/LooksRareProtocol.md | 2 +- .../contracts/marketplace/TransferManager.md | 10 +- .../marketplace/TransferSelectorNFT.md | 2 +- .../StrategyHypercertFractionOffer.md | 20 +- .../marketplace/helpers/OrderValidatorV2A.md | 18 +- .../libraries/LowLevelHypercertCaller.md | 2 +- .../marketplace/libraries/OrderStructs.md | 2 +- docs/docs/developer/config.md | 4 +- .../version-1.0.0-alpha.0/about.md | 24 + .../developer/allowlists.md | 101 ++ .../api/contracts/AllowlistMinter.md | 84 ++ .../api/contracts/HypercertMinter.md | 895 +++++++++++++ .../api/contracts/HypercertTrader.md | 434 +++++++ .../api/contracts/IHypercertMinter.md | 39 + .../api/contracts/SemiFungible1155.md | 457 +++++++ .../v0.8/interfaces/AggregatorV3Interface.md | 77 ++ .../api/contracts/forge-std/src/console.md | 1 + .../api/contracts/forge-std/src/console2.md | 3 + .../api/contracts/interfaces/IAllowlist.md | 29 + .../contracts/interfaces/IHypercertToken.md | 192 +++ .../contracts/interfaces/IHypercertTrader.md | 133 ++ .../developer/api/contracts/libs/Errors.md | 59 + .../marketplace/BatchOrderTypehashRegistry.md | 46 + .../CreatorFeeManagerWithRebates.md | 76 ++ .../CreatorFeeManagerWithRoyalties.md | 64 + .../contracts/marketplace/CurrencyManager.md | 250 ++++ .../contracts/marketplace/ExecutionManager.md | 751 +++++++++++ .../marketplace/InheritedStrategy.md | 9 + .../marketplace/LooksRareProtocol.md | 1157 +++++++++++++++++ .../api/contracts/marketplace/NonceManager.md | 193 +++ .../marketplace/ProtocolFeeRecipient.md | 75 ++ .../contracts/marketplace/StrategyManager.md | 391 ++++++ .../contracts/marketplace/TransferManager.md | 553 ++++++++ .../marketplace/TransferSelectorNFT.md | 779 +++++++++++ .../executionStrategies/BaseStrategy.md | 41 + .../BaseStrategyChainlinkPriceLatency.md | 212 +++ .../StrategyChainlinkUSDDynamicAsk.md | 342 +++++ .../StrategyCollectionOffer.md | 127 ++ .../StrategyDutchAuction.md | 83 ++ .../StrategyHypercertFractionOffer.md | 123 ++ .../StrategyItemIdsRange.md | 75 ++ .../marketplace/helpers/OrderValidatorV2A.md | 215 +++ .../marketplace/helpers/ProtocolHelpers.md | 159 +++ .../interfaces/ICreatorFeeManager.md | 60 + .../interfaces/ICurrencyManager.md | 22 + .../interfaces/IExecutionManager.md | 99 ++ .../interfaces/IImmutableCreate2Factory.md | 41 + .../interfaces/ILooksRareProtocol.md | 157 +++ .../marketplace/interfaces/INonceManager.md | 53 + .../interfaces/IRoyaltyFeeRegistry.md | 29 + .../marketplace/interfaces/IStrategy.md | 41 + .../interfaces/IStrategyManager.md | 84 ++ .../interfaces/ITransferManager.md | 111 ++ .../libraries/CurrencyValidator.md | 7 + .../libraries/LowLevelHypercertCaller.md | 21 + .../MerkleProofCalldataWithNodes.md | 7 + .../OpenZeppelin/MerkleProofMemory.md | 7 + .../marketplace/libraries/OrderStructs.md | 7 + .../api/contracts/protocol/AllowlistMinter.md | 84 ++ .../api/contracts/protocol/HypercertMinter.md | 895 +++++++++++++ .../contracts/protocol/SemiFungible1155.md | 457 +++++++ .../protocol/interfaces/IAllowlist.md | 29 + .../protocol/interfaces/IHypercertToken.md | 192 +++ .../api/contracts/protocol/libs/Errors.md | 59 + .../developer/api/sdk/.nojekyll | 1 + .../developer/api/sdk/README.md | 185 +++ .../developer/api/sdk/classes/ClientError.md | 68 + .../api/sdk/classes/ConfigurationError.md | 66 + .../developer/api/sdk/classes/FetchError.md | 68 + .../api/sdk/classes/HypercertClient.md | 493 +++++++ .../api/sdk/classes/HypercertsStorage.md | 250 ++++ .../api/sdk/classes/InvalidOrMissingError.md | 68 + .../api/sdk/classes/MalformedDataError.md | 68 + .../developer/api/sdk/classes/MintingError.md | 68 + .../developer/api/sdk/classes/StorageError.md | 68 + .../api/sdk/classes/UnknownSchemaError.md | 71 + .../api/sdk/classes/UnsupportedChainError.md | 72 + .../api/sdk/classes/internal.default-1.md | 278 ++++ .../api/sdk/classes/internal.default-2.md | 131 ++ .../api/sdk/classes/internal.default.md | 110 ++ .../api/sdk/interfaces/CustomError.md | 39 + .../api/sdk/interfaces/DuplicateEvaluation.md | 56 + .../api/sdk/interfaces/EASEvaluation.md | 56 + .../api/sdk/interfaces/HypercertClaimdata.md | 167 +++ .../interfaces/HypercertClientInterface.md | 341 +++++ .../sdk/interfaces/HypercertClientMethods.md | 239 ++++ .../sdk/interfaces/HypercertClientState.md | 68 + .../interfaces/HypercertEvaluationSchema.md | 47 + .../interfaces/HypercertIndexerInterface.md | 176 +++ .../api/sdk/interfaces/HypercertMetadata.md | 123 ++ .../api/sdk/interfaces/HypercertPointer.md | 45 + .../interfaces/HypercertStorageInterface.md | 130 ++ .../api/sdk/interfaces/IPFSEvaluation.md | 34 + .../sdk/interfaces/SimpleTextEvaluation.md | 45 + .../interfaces/internal.EvaluatorInterface.md | 43 + .../interfaces/internal.HypercertClaimdata.md | 169 +++ .../interfaces/internal.HypercertMinter.md | 17 + .../developer/api/sdk/modules.md | 638 +++++++++ .../developer/api/sdk/modules/internal.md | 307 +++++ .../developer/burning.md | 12 + .../version-1.0.0-alpha.0/developer/config.md | 112 ++ .../version-1.0.0-alpha.0/developer/errors.md | 18 + .../developer/evaluations.md | 13 + .../developer/minting.md | 57 + .../developer/querying.md | 306 +++++ .../developer/quickstart-javascript.md | 101 ++ .../developer/quickstart-solidity.md | 41 + .../developer/split-merge.md | 29 + .../developer/supported-networks.md | 13 + .../devops/deploy-proxy.md | 120 ++ .../version-1.0.0-alpha.0/devops/errors.md | 45 + .../version-1.0.0-alpha.0/devops/index.md | 18 + .../version-1.0.0-alpha.0/devops/pause.md | 29 + .../version-1.0.0-alpha.0/devops/plasmic.md | 76 ++ .../version-1.0.0-alpha.0/devops/setup.md | 41 + .../version-1.0.0-alpha.0/devops/upgrade.md | 35 + .../version-1.0.0-alpha.0/faq.md | 139 ++ .../further-resources.md | 37 + .../implementation/glossary.md | 139 ++ .../implementation/metadata.md | 188 +++ .../implementation/token-standard.md | 29 + .../version-1.0.0-alpha.0/intro.md | 58 + .../minting-guide/gitcoin-round.md | 166 +++ .../minting-guide/minting-guide-start.md | 44 + .../minting-guide/step-by-step.md | 130 ++ .../whitepaper/evaluation.md | 23 + .../whitepaper/hypercerts-intro.md | 104 ++ .../version-1.0.0-alpha.0/whitepaper/ifs.md | 103 ++ .../whitepaper/impact-space.md | 35 + .../whitepaper/retrospective-funding.md | 42 + .../whitepaper/whitepaper-intro.md | 24 + .../version-1.0.0-alpha.1/about.md | 24 + .../developer/allowlists.md | 101 ++ .../api/contracts/AllowlistMinter.md | 84 ++ .../api/contracts/HypercertMinter.md | 895 +++++++++++++ .../api/contracts/HypercertTrader.md | 434 +++++++ .../api/contracts/IHypercertMinter.md | 39 + .../api/contracts/SemiFungible1155.md | 457 +++++++ .../v0.8/interfaces/AggregatorV3Interface.md | 77 ++ .../api/contracts/forge-std/src/console.md | 1 + .../api/contracts/forge-std/src/console2.md | 3 + .../api/contracts/interfaces/IAllowlist.md | 29 + .../contracts/interfaces/IHypercertToken.md | 192 +++ .../contracts/interfaces/IHypercertTrader.md | 133 ++ .../developer/api/contracts/libs/Errors.md | 59 + .../marketplace/BatchOrderTypehashRegistry.md | 46 + .../CreatorFeeManagerWithRebates.md | 76 ++ .../CreatorFeeManagerWithRoyalties.md | 64 + .../contracts/marketplace/CurrencyManager.md | 250 ++++ .../contracts/marketplace/ExecutionManager.md | 751 +++++++++++ .../marketplace/InheritedStrategy.md | 9 + .../marketplace/LooksRareProtocol.md | 1157 +++++++++++++++++ .../api/contracts/marketplace/NonceManager.md | 193 +++ .../marketplace/ProtocolFeeRecipient.md | 75 ++ .../contracts/marketplace/StrategyManager.md | 391 ++++++ .../contracts/marketplace/TransferManager.md | 553 ++++++++ .../marketplace/TransferSelectorNFT.md | 779 +++++++++++ .../executionStrategies/BaseStrategy.md | 41 + .../BaseStrategyChainlinkPriceLatency.md | 212 +++ .../StrategyChainlinkUSDDynamicAsk.md | 342 +++++ .../StrategyCollectionOffer.md | 127 ++ .../StrategyDutchAuction.md | 83 ++ .../StrategyHypercertFractionOffer.md | 123 ++ .../StrategyItemIdsRange.md | 75 ++ .../marketplace/helpers/OrderValidatorV2A.md | 215 +++ .../marketplace/helpers/ProtocolHelpers.md | 159 +++ .../interfaces/ICreatorFeeManager.md | 60 + .../interfaces/ICurrencyManager.md | 22 + .../interfaces/IExecutionManager.md | 99 ++ .../interfaces/IImmutableCreate2Factory.md | 41 + .../interfaces/ILooksRareProtocol.md | 157 +++ .../marketplace/interfaces/INonceManager.md | 53 + .../interfaces/IRoyaltyFeeRegistry.md | 29 + .../marketplace/interfaces/IStrategy.md | 41 + .../interfaces/IStrategyManager.md | 84 ++ .../interfaces/ITransferManager.md | 111 ++ .../libraries/CurrencyValidator.md | 7 + .../libraries/LowLevelHypercertCaller.md | 21 + .../MerkleProofCalldataWithNodes.md | 7 + .../OpenZeppelin/MerkleProofMemory.md | 7 + .../marketplace/libraries/OrderStructs.md | 7 + .../api/contracts/protocol/AllowlistMinter.md | 84 ++ .../api/contracts/protocol/HypercertMinter.md | 895 +++++++++++++ .../contracts/protocol/SemiFungible1155.md | 457 +++++++ .../protocol/interfaces/IAllowlist.md | 29 + .../protocol/interfaces/IHypercertToken.md | 192 +++ .../api/contracts/protocol/libs/Errors.md | 59 + .../developer/api/sdk/.nojekyll | 1 + .../developer/api/sdk/README.md | 185 +++ .../developer/api/sdk/classes/ClientError.md | 68 + .../api/sdk/classes/ConfigurationError.md | 66 + .../developer/api/sdk/classes/FetchError.md | 68 + .../api/sdk/classes/HypercertClient.md | 493 +++++++ .../api/sdk/classes/HypercertsStorage.md | 250 ++++ .../api/sdk/classes/InvalidOrMissingError.md | 68 + .../api/sdk/classes/MalformedDataError.md | 68 + .../developer/api/sdk/classes/MintingError.md | 68 + .../developer/api/sdk/classes/StorageError.md | 68 + .../api/sdk/classes/UnknownSchemaError.md | 71 + .../api/sdk/classes/UnsupportedChainError.md | 72 + .../api/sdk/classes/internal.default-1.md | 278 ++++ .../api/sdk/classes/internal.default-2.md | 131 ++ .../api/sdk/classes/internal.default.md | 110 ++ .../api/sdk/interfaces/CustomError.md | 39 + .../api/sdk/interfaces/DuplicateEvaluation.md | 56 + .../api/sdk/interfaces/EASEvaluation.md | 56 + .../api/sdk/interfaces/HypercertClaimdata.md | 167 +++ .../interfaces/HypercertClientInterface.md | 341 +++++ .../sdk/interfaces/HypercertClientMethods.md | 239 ++++ .../sdk/interfaces/HypercertClientState.md | 68 + .../interfaces/HypercertEvaluationSchema.md | 47 + .../interfaces/HypercertIndexerInterface.md | 176 +++ .../api/sdk/interfaces/HypercertMetadata.md | 123 ++ .../api/sdk/interfaces/HypercertPointer.md | 45 + .../interfaces/HypercertStorageInterface.md | 130 ++ .../api/sdk/interfaces/IPFSEvaluation.md | 34 + .../sdk/interfaces/SimpleTextEvaluation.md | 45 + .../interfaces/internal.EvaluatorInterface.md | 43 + .../interfaces/internal.HypercertClaimdata.md | 169 +++ .../interfaces/internal.HypercertMinter.md | 17 + .../developer/api/sdk/modules.md | 638 +++++++++ .../developer/api/sdk/modules/internal.md | 307 +++++ .../developer/burning.md | 12 + .../version-1.0.0-alpha.1/developer/config.md | 110 ++ .../version-1.0.0-alpha.1/developer/errors.md | 18 + .../developer/evaluations.md | 13 + .../developer/minting.md | 57 + .../developer/querying.md | 306 +++++ .../developer/quickstart-javascript.md | 101 ++ .../developer/quickstart-solidity.md | 41 + .../developer/split-merge.md | 29 + .../developer/supported-networks.md | 13 + .../devops/deploy-proxy.md | 120 ++ .../version-1.0.0-alpha.1/devops/errors.md | 45 + .../version-1.0.0-alpha.1/devops/index.md | 18 + .../version-1.0.0-alpha.1/devops/pause.md | 29 + .../version-1.0.0-alpha.1/devops/plasmic.md | 76 ++ .../version-1.0.0-alpha.1/devops/setup.md | 41 + .../version-1.0.0-alpha.1/devops/upgrade.md | 35 + .../version-1.0.0-alpha.1/faq.md | 139 ++ .../further-resources.md | 37 + .../implementation/glossary.md | 139 ++ .../implementation/metadata.md | 188 +++ .../implementation/token-standard.md | 29 + .../version-1.0.0-alpha.1/intro.md | 58 + .../minting-guide/gitcoin-round.md | 166 +++ .../minting-guide/minting-guide-start.md | 44 + .../minting-guide/step-by-step.md | 130 ++ .../whitepaper/evaluation.md | 23 + .../whitepaper/hypercerts-intro.md | 104 ++ .../version-1.0.0-alpha.1/whitepaper/ifs.md | 103 ++ .../whitepaper/impact-space.md | 35 + .../whitepaper/retrospective-funding.md | 42 + .../whitepaper/whitepaper-intro.md | 24 + .../version-1.0.0-alpha.0-sidebars.json | 162 +++ .../version-1.0.0-alpha.1-sidebars.json | 165 +++ docs/versions.json | 3 +- frontend/components/hypercert-fetcher.tsx | 6 +- .../components/transfer-fraction-button.tsx | 249 ++++ frontend/hooks/fractions.ts | 28 + frontend/hooks/hypercerts-client.ts | 15 +- frontend/hooks/readTransferRestriction.ts | 28 + frontend/hooks/transferFraction.ts | 102 ++ frontend/package.json | 6 +- frontend/plasmic-init.ts | 23 + package.json | 2 +- pnpm-lock.yaml | 1038 +++++++++------ sdk/.eslintrc.yml | 2 +- sdk/.graphclientrc.yml | 4 +- sdk/global.d.ts | 1 - sdk/jest.config.ts | 20 - sdk/package.json | 33 +- sdk/src/client.ts | 20 +- sdk/src/evaluations/index.ts | 4 +- sdk/src/index.ts | 4 +- sdk/src/indexer.ts | 96 +- sdk/src/storage.ts | 9 +- sdk/src/types/client.ts | 7 +- sdk/src/utils/adapters.ts | 2 +- sdk/src/utils/allowlist.ts | 8 +- sdk/src/utils/config.ts | 2 +- sdk/src/utils/fetchers.ts | 4 +- sdk/src/utils/index.ts | 14 +- sdk/src/utils/logger.ts | 2 +- sdk/src/utils/resolvers.ts | 4 +- sdk/test/client.test.ts | 2 + sdk/test/client/allowlist.minting.test.ts | 150 ++- sdk/test/client/burn.test.ts | 48 +- sdk/test/client/minting.test.ts | 20 +- sdk/test/client/split.merge.test.ts | 386 +++--- sdk/test/evaluations/evaluator.test.ts | 31 +- sdk/test/indexer.test.ts | 15 +- sdk/test/indexer/queries.test.ts | 49 +- sdk/test/setup-env.ts | 5 +- sdk/test/storage.test.ts | 4 +- sdk/test/storage/nft.storage.test.ts | 45 +- sdk/test/storage/web3.storage.test.ts | 22 +- sdk/test/types/errors.test.ts | 4 +- sdk/test/utils/allowlist.test.ts | 16 +- sdk/test/utils/config.test.ts | 2 + sdk/test/utils/errors.test.ts | 2 + sdk/test/utils/fetchers.test.ts | 8 +- sdk/test/utils/formatter.test.ts | 1 + sdk/test/utils/logger.test.ts | 3 +- sdk/test/validator.test.ts | 3 +- sdk/tsconfig.json | 2 +- sdk/vitest.config.ts | 7 + 375 files changed, 38459 insertions(+), 1061 deletions(-) create mode 100644 contracts/src/marketplace/errors/HypercertErrors.sol create mode 100644 contracts/test/mock/MockHypercertMinter.sol create mode 100644 contracts/test/mock/MockHypercertMinterSupportsNoInterface.sol create mode 100644 contracts/test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol create mode 100644 contracts/test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/about.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/faq.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/about.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/faq.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md create mode 100644 docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json create mode 100644 docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json create mode 100644 frontend/components/transfer-fraction-button.tsx create mode 100644 frontend/hooks/readTransferRestriction.ts create mode 100644 frontend/hooks/transferFraction.ts delete mode 100644 sdk/global.d.ts delete mode 100644 sdk/jest.config.ts create mode 100644 sdk/vitest.config.ts diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 1337bfe4..8a81eda9 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -13,16 +13,6 @@ env: # Trigger the workflow when: on: - push: - branches: - - main - - develop - # Or when a pull request event occurs for a pull request against one of the - # matched branches. - pull_request: - branches: - - main - - develop # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/contracts/.solhint.json b/contracts/.solhint.json index 78d99a5a..142a2076 100644 --- a/contracts/.solhint.json +++ b/contracts/.solhint.json @@ -3,7 +3,7 @@ "rules": { "avoid-low-level-calls": "off", "code-complexity": ["error", 12], - "compiler-version": ["error", ">=0.8.16"], + "compiler-version": ["error", "0.8.17"], "func-visibility": ["error", { "ignoreConstructors": true }], "no-console": "off", "no-empty-blocks": "off", diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 656e359b..9958691f 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -107,9 +107,9 @@ const config: HardhatUserConfig = { path: "./abi", runOnCompile: true, clear: true, - pretty: true, only: [ "CurrencyManager", + "ExecutionManager", "HypercertMinter", "LooksRareProtocol", "OrderValidatorV2A", diff --git a/contracts/package.json b/contracts/package.json index 0d16c149..2b7597b1 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@hypercerts-org/contracts", "description": "EVM compatible protocol for managing impact claims", - "version": "1.0.0-alpha.4", + "version": "1.0.0-alpha.7", "author": { "name": "Hypercerts Foundation", "url": "https://github.com/hypercerts-org/hypercerts" @@ -65,6 +65,7 @@ "rimraf": "^5.0.5", "rollup": "^4.0.2", "rollup-plugin-auto-external": "^2.0.0", + "rollup-plugin-copy": "^3.5.0", "rollup-plugin-dts": "^6.1.0", "rollup-plugin-esbuild": "^6.1.0", "rollup-plugin-node-polyfills": "^0.2.1", diff --git a/contracts/src/deployments/deployment-marketplace-goerli.json b/contracts/src/deployments/deployment-marketplace-goerli.json index 58ac0626..2c3c30ca 100644 --- a/contracts/src/deployments/deployment-marketplace-goerli.json +++ b/contracts/src/deployments/deployment-marketplace-goerli.json @@ -1,5 +1,5 @@ { - "HypercertsExchange": { + "HypercertExchange": { "address": "0x89524d8a0B1D7742579A7d8AE46D7679a4de1198", "fullNamespace": "LooksRareProtocol", "args": [ diff --git a/contracts/src/index.ts b/contracts/src/index.ts index 533aab40..ee478287 100644 --- a/contracts/src/index.ts +++ b/contracts/src/index.ts @@ -8,8 +8,10 @@ import TransferManagerAbi from "../abi/src/marketplace/TransferManager.sol/Trans import StrategyCollectionOfferAbi from "../abi/src/marketplace/executionStrategies/StrategyCollectionOffer.sol/StrategyCollectionOffer.json"; import StrategyHypercertFractionOfferAbi from "../abi/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol/StrategyHypercertFractionOffer.json"; import CreatorFeeManagerWithRoyaltiesAbi from "../abi/src/marketplace/CreatorFeeManagerWithRoyalties.sol/CreatorFeeManagerWithRoyalties.json"; +import ExecutionManagerAbi from "../abi/src/marketplace/ExecutionManager.sol/ExecutionManager.json"; import { + ExecutionManager, HypercertMinter, IHypercertToken, LooksRareProtocol as HypercertExchange, @@ -37,7 +39,7 @@ export type DeploymentProtocol = { }; export type DeploymentMarketplace = { - HypercertsExchange: `0x${string}`; + HypercertExchange: `0x${string}`; TransferManager: `0x${string}`; OrderValidatorV2A: `0x${string}`; }; @@ -49,7 +51,7 @@ export type DeployedChains = keyof typeof DEPLOYMENTS.protocol; const deployments = { 5: { ...DEPLOYMENTS.protocol["5"], - HypercertsExchange: DEPLOYMENTS.marketplace[5].HypercertsExchange.address, + HypercertExchange: DEPLOYMENTS.marketplace[5].HypercertExchange.address, TransferManager: DEPLOYMENTS.marketplace[5].TransferManager.address, OrderValidatorV2A: DEPLOYMENTS.marketplace[5].OrderValidator.address, }, @@ -74,6 +76,7 @@ export { deployments, asDeployedChain }; // Abis export { CreatorFeeManagerWithRoyaltiesAbi, + ExecutionManagerAbi, HypercertMinterAbi, HypercertExchangeAbi, OrderValidatorV2AAbi, @@ -86,6 +89,7 @@ export { // Interfaces export type { CreatorFeeManagerWithRoyalties, + ExecutionManager, IHypercertExchange, IHypercertToken, HypercertExchange, diff --git a/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol b/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol index 9f0bcc3d..3a1de368 100644 --- a/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol +++ b/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; diff --git a/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol b/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol index 4b72630f..a50dde6a 100644 --- a/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol +++ b/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {IERC2981} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC2981.sol"; diff --git a/contracts/src/marketplace/ExecutionManager.sol b/contracts/src/marketplace/ExecutionManager.sol index d0b7ace2..ab421a71 100644 --- a/contracts/src/marketplace/ExecutionManager.sol +++ b/contracts/src/marketplace/ExecutionManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "./libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/LooksRareProtocol.sol b/contracts/src/marketplace/LooksRareProtocol.sol index 3e1ce7ed..9f3eb107 100644 --- a/contracts/src/marketplace/LooksRareProtocol.sol +++ b/contracts/src/marketplace/LooksRareProtocol.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {SignatureCheckerCalldata} from "@looksrare/contracts-libs/contracts/SignatureCheckerCalldata.sol"; @@ -31,13 +31,13 @@ import { // Direct dependencies import {TransferSelectorNFT} from "./TransferSelectorNFT.sol"; import {BatchOrderTypehashRegistry} from "./BatchOrderTypehashRegistry.sol"; -import {StrategyHypercertFractionOffer} from "./executionStrategies/StrategyHypercertFractionOffer.sol"; // Constants import {MAX_CALLDATA_PROOF_LENGTH, ONE_HUNDRED_PERCENT_IN_BP} from "./constants/NumericConstants.sol"; // Enums import {QuoteType} from "./enums/QuoteType.sol"; +import {CollectionType} from "./enums/CollectionType.sol"; /** * @title LooksRareProtocol @@ -371,7 +371,7 @@ contract LooksRareProtocol is _updateUserOrderNonce(isNonceInvalidated, signer, makerBid.orderNonce, orderHash); // Taker action goes first - _transferNFT(makerBid.collection, makerBid.collectionType, msg.sender, signer, itemIds, amounts); + _executeTakerAskTakerAction(makerBid, takerAsk, msg.sender, signer, itemIds, amounts); // Maker action goes second _transferToAskRecipientAndCreatorIfAny(recipients, feeAmounts, makerBid.currency, signer); @@ -444,32 +444,7 @@ contract LooksRareProtocol is _transferToAskRecipientAndCreatorIfAny(recipients, feeAmounts, makerAsk.currency, sender); // Maker action goes second - if ( - ( - strategyInfo[makerAsk.strategyId].selector - == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector - || strategyInfo[makerAsk.strategyId].selector - == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector - ) && (IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[0]) > amounts[0]) - ) { - _splitNFT( - makerAsk.collection, - makerAsk.collectionType, - signer, - takerBid.recipient == address(0) ? sender : takerBid.recipient, - itemIds, - amounts - ); - } else { - _transferNFT( - makerAsk.collection, - makerAsk.collectionType, - signer, - takerBid.recipient == address(0) ? sender : takerBid.recipient, - itemIds, - amounts - ); - } + _executeTakerBidMakerAction(makerAsk, takerBid, signer, sender, itemIds, amounts); emit TakerBid( NonceInvalidationParameters({ @@ -492,6 +467,53 @@ contract LooksRareProtocol is return feeAmounts[2]; } + function _executeTakerAskTakerAction( + OrderStructs.Maker calldata makerBid, + OrderStructs.Taker calldata takerAsk, + address sender, + address recipient, + uint256[] memory itemIds, + uint256[] memory amounts + ) internal { + if (makerBid.collectionType == CollectionType.Hypercert) { + _transferHypercertFraction( + makerBid.collection, makerBid.collectionType, makerBid.strategyId, sender, recipient, itemIds, amounts + ); + } else { + _transferNFT(makerBid.collection, makerBid.collectionType, sender, recipient, itemIds, amounts); + } + } + + function _executeTakerBidMakerAction( + OrderStructs.Maker calldata makerAsk, + OrderStructs.Taker calldata takerBid, + address sender, + address recipient, + uint256[] memory itemIds, + uint256[] memory amounts + ) internal { + if (makerAsk.collectionType == CollectionType.Hypercert) { + _transferHypercertFraction( + makerAsk.collection, + makerAsk.collectionType, + makerAsk.strategyId, + sender, + takerBid.recipient == address(0) ? recipient : takerBid.recipient, + itemIds, + amounts + ); + } else { + _transferNFT( + makerAsk.collection, + makerAsk.collectionType, + sender, + takerBid.recipient == address(0) ? recipient : takerBid.recipient, + itemIds, + amounts + ); + } + } + /** * @notice This function is internal and is used to pay the protocol fee and affiliate fee (if any). * @param currency Currency address to transfer (address(0) is ETH) diff --git a/contracts/src/marketplace/NonceManager.sol b/contracts/src/marketplace/NonceManager.sol index c8c5657b..d9a94cfc 100644 --- a/contracts/src/marketplace/NonceManager.sol +++ b/contracts/src/marketplace/NonceManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Interfaces and errors import {INonceManager} from "./interfaces/INonceManager.sol"; diff --git a/contracts/src/marketplace/ProtocolFeeRecipient.sol b/contracts/src/marketplace/ProtocolFeeRecipient.sol index 4eb12174..33cfceb4 100644 --- a/contracts/src/marketplace/ProtocolFeeRecipient.sol +++ b/contracts/src/marketplace/ProtocolFeeRecipient.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {LowLevelERC20Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Transfer.sol"; diff --git a/contracts/src/marketplace/StrategyManager.sol b/contracts/src/marketplace/StrategyManager.sol index d537563b..4edb9d66 100644 --- a/contracts/src/marketplace/StrategyManager.sol +++ b/contracts/src/marketplace/StrategyManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {CurrencyManager} from "./CurrencyManager.sol"; diff --git a/contracts/src/marketplace/TransferManager.sol b/contracts/src/marketplace/TransferManager.sol index 697e0f2e..eaa5231e 100644 --- a/contracts/src/marketplace/TransferManager.sol +++ b/contracts/src/marketplace/TransferManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; @@ -12,6 +12,7 @@ import {LowLevelHypercertCaller} from "./libraries/LowLevelHypercertCaller.sol"; // Interfaces and errors import {ITransferManager} from "./interfaces/ITransferManager.sol"; import {AmountInvalid, LengthsInvalid} from "./errors/SharedErrors.sol"; +import {UnitAmountInvalid} from "./errors/HypercertErrors.sol"; import {IHypercertToken} from "../protocol/interfaces/IHypercertToken.sol"; // Libraries @@ -22,15 +23,14 @@ import {CollectionType} from "./enums/CollectionType.sol"; /** * @title TransferManager - * @notice This contract provides the transfer functions for ERC721/ERC1155/Hypercert/Hyperboard for contracts that + * @notice This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that * require them. * Collection type "0" refers to ERC721 transfer functions. * Collection type "1" refers to ERC1155 transfer functions. * Collection type "2" refers to Hypercert transfer functions. - * Collection type "3" refers to Hyperboard transfer functions. * @dev "Safe" transfer functions for ERC721 are not implemented since they come with added gas costs * to verify if the recipient is a contract as it requires verifying the receiver interface is valid. - * @author LooksRare protocol team (👀,💎) + * @author LooksRare protocol team (👀,💎); bitbeckers */ contract TransferManager is ITransferManager, @@ -176,13 +176,13 @@ contract TransferManager is } /** - * @notice This function transfers items for a single Hypercert. + * @notice This function splits and transfers a fraction of a hypercert. * @param collection Collection address * @param from Sender address * @param to Recipient address * @param itemIds Array of itemIds * @param amounts Array of amounts - * @dev It does not allow batch transferring if from = msg.sender since native function should be used. + * @dev It does not allow batch transferring. */ function splitItemsHypercert( address collection, @@ -191,8 +191,6 @@ contract TransferManager is uint256[] calldata itemIds, uint256[] calldata amounts ) external { - IHypercertToken hypercert = IHypercertToken(collection); - if (itemIds.length != 1 || amounts.length != 1) { revert LengthsInvalid(); } @@ -202,10 +200,20 @@ contract TransferManager is if (amounts[0] == 0) { revert AmountInvalid(); } + uint256[] memory newAmounts = new uint256[](2); - newAmounts[0] = hypercert.unitsOf(itemIds[0]) - amounts[0]; + + //The new amount is the difference between the total amount and the amount being split. + //This will underflow if the amount being split is greater than the total amount. + newAmounts[0] = IHypercertToken(collection).unitsOf(itemIds[0]) - amounts[0]; newAmounts[1] = amounts[0]; - _executeHypercertSplitFraction(collection, from, to, itemIds[0], newAmounts); + + // If the new amount is 0, then the split is will revert but the whole fraction can be transferred. + if (newAmounts[0] == 0) { + _executeERC1155SafeTransferFrom(collection, from, to, itemIds[0], 1); + } else { + _executeHypercertSplitFraction(collection, to, itemIds[0], newAmounts); + } } /** diff --git a/contracts/src/marketplace/TransferSelectorNFT.sol b/contracts/src/marketplace/TransferSelectorNFT.sol index 55e0956a..d66d40b4 100644 --- a/contracts/src/marketplace/TransferSelectorNFT.sol +++ b/contracts/src/marketplace/TransferSelectorNFT.sol @@ -1,10 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Direct dependencies import {PackableReentrancyGuard} from "@looksrare/contracts-libs/contracts/PackableReentrancyGuard.sol"; import {ExecutionManager} from "./ExecutionManager.sol"; import {TransferManager} from "./TransferManager.sol"; +import {StrategyHypercertFractionOffer} from "./executionStrategies/StrategyHypercertFractionOffer.sol"; // Libraries import {OrderStructs} from "./libraries/OrderStructs.sol"; @@ -12,6 +13,9 @@ import {OrderStructs} from "./libraries/OrderStructs.sol"; // Enums import {CollectionType} from "./enums/CollectionType.sol"; +// Interfaces +import {IHypercertToken} from "../protocol/interfaces/IHypercertToken.sol"; + /** * @title TransferSelectorNFT * @notice This contract handles the logic for transferring non-fungible items. @@ -20,7 +24,7 @@ import {CollectionType} from "./enums/CollectionType.sol"; contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { error UnsupportedCollectionType(); /** - * @notice Transfer manager for ERC721 and ERC1155. + * @notice Transfer manager for ERC721, ERC1155 and Hypercerts. */ TransferManager public immutable transferManager; @@ -29,7 +33,7 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { * @notice Constructor * @param _owner Owner address * @param _protocolFeeRecipient Protocol fee recipient address - * @param _transferManager Address of the transfer manager for ERC721/ERC1155 + * @param _transferManager Address of the transfer manager for ERC721/ERC1155/Hypercerts */ constructor(address _owner, address _protocolFeeRecipient, address _transferManager) ExecutionManager(_owner, _protocolFeeRecipient) @@ -40,7 +44,7 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { /** * @notice This function is internal and used to transfer non-fungible tokens. * @param collection Collection address - * @param collectionType Collection type (e.g. 0 = ERC721, 1 = ERC1155) + * @param collectionType Collection type (e.g. 0 = ERC721, 1 = ERC1155, 2 = Hypercert); only 0 and 1 are supported. * @param sender Sender address * @param recipient Recipient address * @param itemIds Array of itemIds @@ -58,25 +62,24 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { transferManager.transferItemsERC721(collection, sender, recipient, itemIds, amounts); } else if (collectionType == CollectionType.ERC1155) { transferManager.transferItemsERC1155(collection, sender, recipient, itemIds, amounts); - } else if (collectionType == CollectionType.Hypercert) { - transferManager.transferItemsHypercert(collection, sender, recipient, itemIds, amounts); } else { revert UnsupportedCollectionType(); } } /** - * @notice This function is internal and used to transfer non-fungible tokens. + * @notice This function is internal and used to split a hypercert fraction or execute a transfer of the fraction. * @param collection Collection address - * @param collectionType Collection type (e.g. 0 = ERC721, 1 = ERC1155, 2 = Hypercert) + * @param collectionType Collection type (e.g. 0 = ERC721, 1 = ERC1155, 2 = Hypercert); only 2 is supported. * @param sender Sender address * @param recipient Recipient address * @param itemIds Array of itemIds * @param amounts Array of amounts */ - function _splitNFT( + function _transferHypercertFraction( address collection, CollectionType collectionType, + uint256 strategyId, address sender, address recipient, uint256[] memory itemIds, @@ -85,6 +88,17 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { if (collectionType != CollectionType.Hypercert) { revert UnsupportedCollectionType(); } - transferManager.splitItemsHypercert(collection, sender, recipient, itemIds, amounts); + + // Check if split strategies + if ( + strategyInfo[strategyId].selector + == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector + || strategyInfo[strategyId].selector + == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector + ) { + transferManager.splitItemsHypercert(collection, sender, recipient, itemIds, amounts); + } else { + transferManager.transferItemsHypercert(collection, sender, recipient, itemIds, amounts); + } } } diff --git a/contracts/src/marketplace/constants/ValidationCodeConstants.sol b/contracts/src/marketplace/constants/ValidationCodeConstants.sol index 73cbc996..5c23fd1a 100644 --- a/contracts/src/marketplace/constants/ValidationCodeConstants.sol +++ b/contracts/src/marketplace/constants/ValidationCodeConstants.sol @@ -192,7 +192,7 @@ uint256 constant TOO_LATE_TO_EXECUTE_ORDER = 502; uint256 constant TOO_EARLY_TO_EXECUTE_ORDER = 503; /** - * 6. Transfer-related (ERC20, ERC721, ERC1155 tokens), including transfers and approvals, codes. + * 6. Transfer-related (ERC20, ERC721, ERC1155, Hypercert tokens), including transfers and approvals, codes. */ /** @@ -258,6 +258,18 @@ uint256 constant ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST = 633; */ uint256 constant ERC1155_NO_APPROVAL_FOR_ALL = 634; +/* + * @dev The Hypercert collaction does not support balanceOf. + * This maker order can become valid without any user's action. + */ +uint256 constant HYPERCERT_UNITS_OF_DOES_NOT_EXIST = 641; + +/* + * @dev The Hypercert fractionId is not owned by the signer (maker ask user). + * This maker order can become valid without any user's action. + */ +uint256 constant HYPERCERT_UNITS_NOT_HELD_BY_USER = 642; + /** * 7. Asset-type codes */ @@ -274,6 +286,12 @@ uint256 constant POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC721 = 701; */ uint256 constant POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155 = 702; +/** + * @dev The collection type specified in the order seems incorrect. + * It is expected to be collectionType = 2. + */ +uint256 constant POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_HYPERCERT = 703; + /** * 8. Transfer manager-related codes */ diff --git a/contracts/src/marketplace/enums/CollectionType.sol b/contracts/src/marketplace/enums/CollectionType.sol index 8eded297..89c79c81 100644 --- a/contracts/src/marketplace/enums/CollectionType.sol +++ b/contracts/src/marketplace/enums/CollectionType.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @notice CollectionType is used in OrderStructs.Maker's collectionType to determine the collection type being traded. @@ -7,6 +7,5 @@ pragma solidity ^0.8.17; enum CollectionType { ERC721, ERC1155, - Hypercert, - Hyperboard + Hypercert } diff --git a/contracts/src/marketplace/errors/HypercertErrors.sol b/contracts/src/marketplace/errors/HypercertErrors.sol new file mode 100644 index 00000000..f71638d6 --- /dev/null +++ b/contracts/src/marketplace/errors/HypercertErrors.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +/** + * @notice It is returned if the available amount of fraction units is not available + * for the selected type of transaction. + * For instance, a split transaction cannot be executed if the amount of fraction units + * is not higher than the amount of fraction units available. + */ +error UnitAmountInvalid(); diff --git a/contracts/src/marketplace/errors/SharedErrors.sol b/contracts/src/marketplace/errors/SharedErrors.sol index bb123902..9ac87690 100644 --- a/contracts/src/marketplace/errors/SharedErrors.sol +++ b/contracts/src/marketplace/errors/SharedErrors.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.17; /** * @notice It is returned if the amount is invalid. - * For ERC721, any number that is not 1. For ERC1155, if amount is 0. + * For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. */ error AmountInvalid(); diff --git a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol index 67e40f79..9d0bec3c 100644 --- a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol +++ b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Interfaces import {IStrategy} from "../interfaces/IStrategy.sol"; diff --git a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol index 1f80d52c..9a8f2ff7 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol b/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol index 6dfbfd1f..3c4fcf27 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol index dfef144f..84972b4c 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Interface -import {IHypercertToken} from "../../protocol/interfaces/IHypercertToken.sol"; +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; @@ -14,7 +14,14 @@ import {MerkleProofMemory} from "../libraries/OpenZeppelin/MerkleProofMemory.sol import {QuoteType} from "../enums/QuoteType.sol"; // Shared errors -import {OrderInvalid, FunctionSelectorInvalid, MerkleProofInvalid, QuoteTypeInvalid} from "../errors/SharedErrors.sol"; +import { + AmountInvalid, + LengthsInvalid, + OrderInvalid, + FunctionSelectorInvalid, + MerkleProofInvalid, + QuoteTypeInvalid +} from "../errors/SharedErrors.sol"; // Base strategy contracts import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; @@ -27,7 +34,9 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; * Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. * Bob wants to buy 10 units. * Bob can create a taker bid order with the following parameters: - * - unitAmount: 10 + * - unitAmount: 10000 // Total amount for sale; in `amounts` array + * - minUnitAmount: 100 // Minimum amount to buy; in `additionalParameters` + * - maxUnitAmount: 1000 // Maximum amount to buy; in `additionalParameters` * - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) * - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 * - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] @@ -41,7 +50,7 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; * 1. If ERC721, the amount must be 1. * 2. If ERC1155, the amount can be greater than 1. * 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. - * @dev Use cases can include trait-based offers or rarity score offers. + * @dev Use cases can include tiered pricing; think early bird tickets. * @author LooksRare protocol team (👀,💎); bitbeckers; */ contract StrategyHypercertFractionOffer is BaseStrategy { @@ -58,37 +67,42 @@ contract StrategyHypercertFractionOffer is BaseStrategy { ) external view - returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) + returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) { - amounts = makerAsk.amounts; itemIds = makerAsk.itemIds; // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary - if (amounts.length != 1 || itemIds.length != 1) { - revert OrderInvalid(); + if (makerAsk.amounts.length != 1 || itemIds.length != 1) { + revert LengthsInvalid(); } - uint256 tokenBalance = IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]); + if (makerAsk.amounts[0] == 0) { + revert AmountInvalid(); + } - //units, amount, proof[] - (uint256 unitAmount, uint256 acceptedTokenAmount) = - abi.decode(takerBid.additionalParameters, (uint256, uint256)); + //units, pricePerUnit + (uint256 unitAmount, uint256 pricePerUnit) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); //minUnitAmount, maxUnitAmount, root (uint256 minUnitAmount, uint256 maxUnitAmount) = abi.decode(makerAsk.additionalParameters, (uint256, uint256)); // A collection order can only be executable for 1 itemId but quantity to fill can vary if ( - makerAsk.amounts.length != 1 || makerAsk.itemIds.length != 1 || minUnitAmount > maxUnitAmount - || unitAmount < minUnitAmount || makerAsk.price > acceptedTokenAmount || makerAsk.price == 0 - || tokenBalance < amounts[0] + minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount < minUnitAmount || unitAmount > maxUnitAmount + || pricePerUnit < makerAsk.price || makerAsk.price == 0 + || IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) < unitAmount ) { revert OrderInvalid(); } - price = acceptedTokenAmount * unitAmount; + uint256[] memory amountsToFill = new uint256[](1); + amountsToFill[0] = unitAmount; + amounts = amountsToFill; - isNonceInvalidated = true; + price = unitAmount * pricePerUnit; + // If the amount to fill is equal to the amount of units in the hypercert, we transfer the fraction. + // Otherwise, we do not invalidate the nonce because it is a partial fill. + isNonceInvalidated = IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) == unitAmount; } /** @@ -105,42 +119,46 @@ contract StrategyHypercertFractionOffer is BaseStrategy { OrderStructs.Maker calldata makerAsk ) external - pure + view returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) { itemIds = makerAsk.itemIds; // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary if (makerAsk.amounts.length != 1 || itemIds.length != 1) { - revert OrderInvalid(); + revert LengthsInvalid(); } - //units, amount, proof[] + if (makerAsk.amounts[0] == 0) { + revert AmountInvalid(); + } + + //units, pricePerUnit, proof[] (uint256 unitAmount, uint256 pricePerUnit, bytes32[] memory proof) = abi.decode(takerBid.additionalParameters, (uint256, uint256, bytes32[])); - // A bid needs to at least match the minimum price per unit - if (pricePerUnit < makerAsk.price) { - revert OrderInvalid(); - } - - price = unitAmount * pricePerUnit; - amounts = new uint256[](1); - amounts[0] = unitAmount; + //minUnitAmount, maxUnitAmount, root + (uint256 minUnitAmount, uint256 maxUnitAmount, bytes32 root) = + abi.decode(makerAsk.additionalParameters, (uint256, uint256, bytes32)); - // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary - if (amounts.length != 1 || itemIds.length != 1) { + // A collection order can only be executable for 1 itemId but quantity to fill can vary + if ( + minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount < minUnitAmount || unitAmount > maxUnitAmount + || pricePerUnit < makerAsk.price || makerAsk.price == 0 + || IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) < unitAmount + ) { revert OrderInvalid(); } - //minUnitAmount, maxUnitAmount, root - (uint256 minUnitAmount, uint256 maxUnitAmount, bytes32 root) = - abi.decode(makerAsk.additionalParameters, (uint256, uint256, bytes32)); + uint256[] memory amountsToFill = new uint256[](1); + amountsToFill[0] = unitAmount; + amounts = amountsToFill; + + price = unitAmount * pricePerUnit; - // Nonce is not invalidated because it can be a partial fill - // @dev This strategy represents a partial fill. The protocol will call transfer if the bid would clear the - // offered fraction. - isNonceInvalidated = false; + // If the amount to fill is equal to the amount of units in the hypercert, we transfer the fraction. + // Otherwise, we do not invalidate the nonce because it is a partial fill. + isNonceInvalidated = IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) == unitAmount; bytes32 node = keccak256(abi.encodePacked(takerBid.recipient)); diff --git a/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol b/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol index 636c2cb4..b2f5de20 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol index ceb4ef38..e25ed1ca 100644 --- a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol +++ b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // LooksRare unopinionated libraries import {IERC165} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC165.sol"; @@ -16,6 +16,7 @@ import {MerkleProofCalldataWithNodes} from "../libraries/OpenZeppelin/MerkleProo import {ICreatorFeeManager} from "../interfaces/ICreatorFeeManager.sol"; import {IStrategy} from "../interfaces/IStrategy.sol"; import {IRoyaltyFeeRegistry} from "../interfaces/IRoyaltyFeeRegistry.sol"; +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; // Shared errors import {OrderInvalid} from "../errors/SharedErrors.sol"; @@ -41,12 +42,12 @@ import {QuoteType} from "../enums/QuoteType.sol"; * 3. Nonce related issues (e.g., nonce executed or cancelled) * 4. Signature related issues and merkle tree parameters * 5. Timestamp related issues (e.g., order expired) - * 6. Asset-related issues for ERC20/ERC721/ERC1155 (approvals and balances) + * 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) * 7. Collection-type suggestions * 8. Transfer manager related issues * 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) * @dev This version does not handle strategies with partial fills. - * @author LooksRare protocol team (👀,💎) + * @author LooksRare protocol team (👀,💎); bitbeckers */ contract OrderValidatorV2A { using OrderStructs for OrderStructs.Maker; @@ -66,6 +67,11 @@ contract OrderValidatorV2A { */ bytes4 public constant ERC1155_INTERFACE_ID = 0xd9b67a26; + /** + * @notice Hypercert interfaceId + */ + bytes4 public constant HYPERCERT_INTERFACE_ID = 0xda69bafa; + /** * @notice Magic value nonce returned if executed (or cancelled). */ @@ -364,6 +370,10 @@ contract OrderValidatorV2A { if (!IERC165(collection).supportsInterface(ERC1155_INTERFACE_ID)) { return POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155; } + } else if (collectionType == CollectionType.Hypercert) { + if (!IERC165(collection).supportsInterface(HYPERCERT_INTERFACE_ID)) { + return POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_HYPERCERT; + } } } @@ -417,6 +427,8 @@ contract OrderValidatorV2A { validationCode = _checkValidityERC721AndEquivalents(collection, user, itemIds); } else if (collectionType == CollectionType.ERC1155) { validationCode = _checkValidityERC1155(collection, user, itemIds, amounts); + } else if (collectionType == CollectionType.Hypercert) { + validationCode = _checkValidityHypercert(collection, user, itemIds, amounts); } } @@ -552,6 +564,60 @@ contract OrderValidatorV2A { } } + /** + * @notice This function verifies the validity of (1) Hypercerts + 1155 approvals + * (2) and balances to process the maker ask order. + * @param collection Collection address + * @param user User address + * @param itemIds Array of fraction ids + * @param amounts Array of units held by each fraction + * @return validationCode Validation code + */ + function _checkValidityHypercert( + address collection, + address user, + uint256[] memory itemIds, + uint256[] memory amounts + ) private view returns (uint256 validationCode) { + // 1. Verify each itemId is owned by user and catch revertion if ERC1155 ownerOf fails + address[] memory users = new address[](1); + users[0] = user; + + uint256 length = itemIds.length; + + bool success; + bytes memory data; + + bytes4 selector = bytes4(keccak256(bytes("unitsOf(address,uint256)"))); + for (uint256 i; i < length;) { + (success, data) = collection.staticcall(abi.encodeWithSelector(selector, user, itemIds[i])); + + if (!success) { + return HYPERCERT_UNITS_OF_DOES_NOT_EXIST; + } + + if (abi.decode(data, (uint256)) < amounts[i]) { + return HYPERCERT_UNITS_NOT_HELD_BY_USER; + } + + unchecked { + ++i; + } + } + + // 3. Verify if collection is approved by transfer manager + (success, data) = + collection.staticcall(abi.encodeCall(IERC1155.isApprovedForAll, (user, address(transferManager)))); + + if (!success) { + return ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST; + } + + if (!abi.decode(data, (bool))) { + return ERC1155_NO_APPROVAL_FOR_ALL; + } + } + /** * @notice This function verifies the validity of a Merkle proof and the order hash. * @param merkleTree Merkle tree struct diff --git a/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol b/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol index d0091c1a..6b6728e7 100644 --- a/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol +++ b/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Interfaces import {IRoyaltyFeeRegistry} from "./IRoyaltyFeeRegistry.sol"; diff --git a/contracts/src/marketplace/interfaces/ICurrencyManager.sol b/contracts/src/marketplace/interfaces/ICurrencyManager.sol index b4f2a1b4..72d50d2e 100644 --- a/contracts/src/marketplace/interfaces/ICurrencyManager.sol +++ b/contracts/src/marketplace/interfaces/ICurrencyManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title ICurrencyManager diff --git a/contracts/src/marketplace/interfaces/IExecutionManager.sol b/contracts/src/marketplace/interfaces/IExecutionManager.sol index 9f768dca..945637b5 100644 --- a/contracts/src/marketplace/interfaces/IExecutionManager.sol +++ b/contracts/src/marketplace/interfaces/IExecutionManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title IExecutionManager diff --git a/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol b/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol index e220c162..eefb6dfe 100644 --- a/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol +++ b/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; interface IImmutableCreate2Factory { function safeCreate2(bytes32 salt, bytes calldata initializationCode) diff --git a/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol b/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol index 68e222f6..e2a52119 100644 --- a/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol +++ b/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/interfaces/INonceManager.sol b/contracts/src/marketplace/interfaces/INonceManager.sol index 1cbfcbe6..6011291d 100644 --- a/contracts/src/marketplace/interfaces/INonceManager.sol +++ b/contracts/src/marketplace/interfaces/INonceManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title INonceManager diff --git a/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol b/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol index 6f5146da..766d4603 100644 --- a/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol +++ b/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title IRoyaltyFeeRegistry diff --git a/contracts/src/marketplace/interfaces/IStrategy.sol b/contracts/src/marketplace/interfaces/IStrategy.sol index fd725f21..a9b7e450 100644 --- a/contracts/src/marketplace/interfaces/IStrategy.sol +++ b/contracts/src/marketplace/interfaces/IStrategy.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/interfaces/IStrategyManager.sol b/contracts/src/marketplace/interfaces/IStrategyManager.sol index 77251172..283431a2 100644 --- a/contracts/src/marketplace/interfaces/IStrategyManager.sol +++ b/contracts/src/marketplace/interfaces/IStrategyManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title IStrategyManager diff --git a/contracts/src/marketplace/interfaces/ITransferManager.sol b/contracts/src/marketplace/interfaces/ITransferManager.sol index af0f3d0a..ec05a0ba 100644 --- a/contracts/src/marketplace/interfaces/ITransferManager.sol +++ b/contracts/src/marketplace/interfaces/ITransferManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; @@ -15,7 +15,7 @@ interface ITransferManager { /** * @notice This struct is only used for transferBatchItemsAcrossCollections. * @param collection Collection address - * @param collectionType 0 for ERC721, 1 for ERC1155, 2 for Hypercert, 3 for Hyperboard + * @param collectionType 0 for ERC721, 1 for ERC1155, 2 for Hypercert * @param itemIds Array of item ids to transfer * @param amounts Array of amounts to transfer */ diff --git a/contracts/src/marketplace/libraries/CurrencyValidator.sol b/contracts/src/marketplace/libraries/CurrencyValidator.sol index add2e364..61208646 100644 --- a/contracts/src/marketplace/libraries/CurrencyValidator.sol +++ b/contracts/src/marketplace/libraries/CurrencyValidator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Assembly import { diff --git a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol index a48df879..5c330c38 100644 --- a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol +++ b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Interfaces import {IHypercertToken} from "../../protocol/interfaces/IHypercertToken.sol"; @@ -16,19 +16,14 @@ contract LowLevelHypercertCaller { /** * @notice Execute Hypercert splitFraction * @param collection Address of the collection - * @param from Address of the sender * @param to Address of the recipient * @param tokenId tokenId to transfer * @param amounts split distribution */ - function _executeHypercertSplitFraction( - address collection, - address from, - address to, - uint256 tokenId, - uint256[] memory amounts - ) internal { + function _executeHypercertSplitFraction(address collection, address to, uint256 tokenId, uint256[] memory amounts) + internal + { if (collection.code.length == 0) { revert NotAContract(); } diff --git a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol index b23c7a8f..f3af4e8b 100644 --- a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol +++ b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../../libraries/OrderStructs.sol"; diff --git a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol index 4bf168ef..442e138f 100644 --- a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol +++ b/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; /** * @title MerkleProofMemory diff --git a/contracts/src/marketplace/libraries/OrderStructs.sol b/contracts/src/marketplace/libraries/OrderStructs.sol index 09eb49f9..38c632b2 100644 --- a/contracts/src/marketplace/libraries/OrderStructs.sol +++ b/contracts/src/marketplace/libraries/OrderStructs.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity 0.8.17; // Enums import {CollectionType} from "../enums/CollectionType.sol"; @@ -22,7 +22,7 @@ library OrderStructs { * @param subsetNonce Subset nonce (shared across bid/ask maker orders) * @param orderNonce Order nonce (it can be shared across bid/ask maker orders) * @param strategyId Strategy id - * @param collectionType Collection type (i.e. 0 = ERC721, 1 = ERC1155, 2 = Hypercert, 3 = Hyperboard) + * @param collectionType Collection type (i.e. 0 = ERC721, 1 = ERC1155, 2 = Hypercert) * @param collection Collection address * @param currency Currency address (@dev address(0) = ETH) * @param signer Signer address diff --git a/contracts/src/protocol/AllowlistMinter.sol b/contracts/src/protocol/AllowlistMinter.sol index 881e0e68..78f1a592 100644 --- a/contracts/src/protocol/AllowlistMinter.sol +++ b/contracts/src/protocol/AllowlistMinter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {MerkleProofUpgradeable} from "oz-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; import {IAllowlist} from "./interfaces/IAllowlist.sol"; diff --git a/contracts/src/protocol/HypercertMinter.sol b/contracts/src/protocol/HypercertMinter.sol index 63cf8cb4..e6df9756 100644 --- a/contracts/src/protocol/HypercertMinter.sol +++ b/contracts/src/protocol/HypercertMinter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {IHypercertToken} from "./interfaces/IHypercertToken.sol"; import {SemiFungible1155} from "./SemiFungible1155.sol"; @@ -241,6 +241,13 @@ contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, } } + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IHypercertToken).interfaceId || super.supportsInterface(interfaceId); + } + /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. diff --git a/contracts/src/protocol/SemiFungible1155.sol b/contracts/src/protocol/SemiFungible1155.sol index 4fe25e1c..ff6c94f2 100644 --- a/contracts/src/protocol/SemiFungible1155.sol +++ b/contracts/src/protocol/SemiFungible1155.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT // Used components of Enjin example implementation for mixed fungibility // https://github.com/enjin/erc-1155/blob/master/contracts/ERC1155MixedFungibleMintable.sol -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {ERC1155Upgradeable} from "oz-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; import {ERC1155BurnableUpgradeable} from "oz-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol"; diff --git a/contracts/src/protocol/interfaces/IAllowlist.sol b/contracts/src/protocol/interfaces/IAllowlist.sol index b4415d42..a29da784 100644 --- a/contracts/src/protocol/interfaces/IAllowlist.sol +++ b/contracts/src/protocol/interfaces/IAllowlist.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity 0.8.17; /// @title Interface for allowlist /// @author bitbeckers diff --git a/contracts/src/protocol/interfaces/IHypercertToken.sol b/contracts/src/protocol/interfaces/IHypercertToken.sol index afd257bf..3e7738b4 100644 --- a/contracts/src/protocol/interfaces/IHypercertToken.sol +++ b/contracts/src/protocol/interfaces/IHypercertToken.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity 0.8.17; /// @title Interface for hypercert token interactions /// @author bitbeckers diff --git a/contracts/src/protocol/libs/Errors.sol b/contracts/src/protocol/libs/Errors.sol index e19d6b5c..e807d828 100644 --- a/contracts/src/protocol/libs/Errors.sol +++ b/contracts/src/protocol/libs/Errors.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity 0.8.17; /// @author bitbeckers library Errors { diff --git a/contracts/tasks/deploy-marketplace.ts b/contracts/tasks/deploy-marketplace.ts index d7667c2e..2e75931b 100644 --- a/contracts/tasks/deploy-marketplace.ts +++ b/contracts/tasks/deploy-marketplace.ts @@ -453,7 +453,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") }; const contracts: ContractDeployments = { - HypercertsExchange: { + HypercertExchange: { address: hypercertsExchangeCreate2.address, fullNamespace: "LooksRareProtocol", args: hypercertsExchangeArgs, diff --git a/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol b/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol index 5f685cec..eae62a48 100644 --- a/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol +++ b/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol @@ -84,6 +84,10 @@ contract LooksRareProtocolTest is ProtocolBase { _createMockMakerAskAndTakerBid(address(mockERC721)); makerAsk.currency = address(mockERC20); + mockERC20.mint(takerUser, 10 ether); + vm.prank(takerUser); + mockERC20.approve(address(looksRareProtocol), 10 ether); + // Mint asset mockERC721.mint(makerUser, makerAsk.itemIds[0]); @@ -125,6 +129,12 @@ contract LooksRareProtocolTest is ProtocolBase { merkleTrees, false // Non-atomic ); + + vm.prank(_owner); + looksRareProtocol.updateCurrencyStatus(address(mockERC20), true); + + vm.prank(takerUser); + looksRareProtocol.executeTakerBid{value: price}(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } function testCannotTradeIfETHIsUsedForMakerBid() public { diff --git a/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol b/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol index 89ecd238..90dc0281 100644 --- a/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol +++ b/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol @@ -19,10 +19,13 @@ import { ERC1155_BALANCE_OF_ITEM_ID_INFERIOR_TO_AMOUNT, ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST, ERC1155_NO_APPROVAL_FOR_ALL, + HYPERCERT_UNITS_NOT_HELD_BY_USER, + HYPERCERT_UNITS_OF_DOES_NOT_EXIST, MAKER_ORDER_INVALID_STANDARD_SALE, MISSING_IS_VALID_SIGNATURE_FUNCTION_EIP1271, POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC721, POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155, + POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_HYPERCERT, STRATEGY_NOT_IMPLEMENTED, TRANSFER_MANAGER_APPROVAL_REVOKED_BY_OWNER_FOR_EXCHANGE } from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; @@ -39,6 +42,10 @@ import {MockERC1155WithoutAnyBalanceOf} from "../../mock/MockERC1155WithoutAnyBa import {MockERC1155WithoutIsApprovedForAll} from "../../mock/MockERC1155WithoutIsApprovedForAll.sol"; import {MockERC721SupportsNoInterface} from "../../mock/MockERC721SupportsNoInterface.sol"; import {MockERC1155SupportsNoInterface} from "../../mock/MockERC1155SupportsNoInterface.sol"; +import {MockHypercertMinter} from "../../mock/MockHypercertMinter.sol"; +import {MockHypercertMinterSupportsNoInterface} from "../../mock/MockHypercertMinterSupportsNoInterface.sol"; +import {MockHypercertMinterWithoutAnyBalanceOf} from "../../mock/MockHypercertMinterWithoutAnyBalanceOf.sol"; +import {MockHypercertMinterWithoutAnyUnitsOf} from "../../mock/MockHypercertMinterWithoutAnyUnitsOf.sol"; import {MockERC20} from "../../mock/MockERC20.sol"; // Enums @@ -205,6 +212,25 @@ contract OrderValidatorV2ATest is TestParameters { assertEq(validationCodes[6], POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC1155); } + function testMakerAskWrongCollectionTypeHypercert() public { + OrderStructs.Maker memory makerAsk; + makerAsk.collectionType = CollectionType.Hypercert; + makerAsk.collection = address(new MockHypercertMinterSupportsNoInterface()); + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[6], POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_HYPERCERT); + } + + function testMakerBidWrongCollectionTypeHypercert() public { + OrderStructs.Maker memory makerBid; + makerBid.quoteType = QuoteType.Bid; + makerBid.collectionType = CollectionType.Hypercert; + makerBid.collection = address(new MockHypercertMinterSupportsNoInterface()); + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerBid, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[6], POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_HYPERCERT); + } + function testMakerBidInsufficientERC20Allowance() public { OrderStructs.Maker memory makerBid; makerBid.quoteType = QuoteType.Bid; @@ -372,4 +398,53 @@ contract OrderValidatorV2ATest is TestParameters { orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); assertEq(validationCodes[5], ERC1155_NO_APPROVAL_FOR_ALL); } + + // HYPERCERTS + + function _testMakerAskHypercertUnitsInferiorToAmount(bool revertBalanceOf) public { + address collection; + if (revertBalanceOf) { + MockHypercertMinterWithoutAnyBalanceOf mockHypercert = new MockHypercertMinterWithoutAnyBalanceOf(); + collection = address(mockHypercert); + } else { + MockHypercertMinter mockHypercert = new MockHypercertMinter(); + collection = address(mockHypercert); + } + + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.collectionType = CollectionType.Hypercert; + makerAsk.collection = collection; + makerAsk.signer = makerUser; + makerAsk.collectionType = CollectionType.Hypercert; + uint256[] memory itemIds = new uint256[](1); + makerAsk.itemIds = itemIds; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerAsk.amounts = amounts; + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[5], HYPERCERT_UNITS_NOT_HELD_BY_USER); + } + + function testMakerAskHypercertUnitsOfDoesNotExist() public { + MockHypercertMinterWithoutAnyUnitsOf mockHypercert = new MockHypercertMinterWithoutAnyUnitsOf(); + + OrderStructs.Maker memory makerAsk; + makerAsk.quoteType = QuoteType.Ask; + makerAsk.collectionType = CollectionType.Hypercert; + makerAsk.collection = address(mockHypercert); + makerAsk.signer = makerUser; + makerAsk.collectionType = CollectionType.Hypercert; + uint256[] memory itemIds = new uint256[](1); + makerAsk.itemIds = itemIds; + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerAsk.amounts = amounts; + + uint256[9] memory validationCodes = + orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); + assertEq(validationCodes[5], HYPERCERT_UNITS_OF_DOES_NOT_EXIST); + } } diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol index f8bbf0ee..c04a128a 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol @@ -10,6 +10,7 @@ import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; // Shared errors import { AmountInvalid, + LengthsInvalid, OrderInvalid, FunctionSelectorInvalid, MerkleProofInvalid, @@ -136,7 +137,7 @@ contract HypercertFractionOffersTest is ProtocolBase { _assertOrderIsInvalid(makerAsk, false); _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); - vm.expectRevert(OrderInvalid.selector); + vm.expectRevert(LengthsInvalid.selector); looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); // // With proof @@ -146,7 +147,7 @@ contract HypercertFractionOffersTest is ProtocolBase { _assertOrderIsInvalid(makerAsk, true); _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); - vm.expectRevert(OrderInvalid.selector); + vm.expectRevert(LengthsInvalid.selector); looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } @@ -170,20 +171,178 @@ contract HypercertFractionOffersTest is ProtocolBase { looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } + /** + * A collection offer without merkle tree criteria + */ + + function testTakerBidHypercertFractionOrderPartialFill() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerBid(makerAsk, takerBid, (1 << 128) + 1); + } + + function testTakerBidHypercertFractionOrderFullFill() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000); + takerBid.additionalParameters = abi.encode(10_000, price); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerBidFullFraction(makerAsk, takerBid, (1 << 128) + 1); + } + + function testTakerBidHypercertFractionOrderPartialAndFullFill() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.amounts[0] = 10_000; + makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000); + + takerBid.additionalParameters = abi.encode(3000, price); + + uint256 fractionId = (1 << 128) + 1; + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction partial fill; buy 3000 units + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerBid(makerAsk, takerBid, fractionId); + + makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000); + takerBid.additionalParameters = abi.encode(7000, price); + + // Execute taker ask transaction full fill; buy remaining 7000 units + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + //units, amount, currency, proof[] + (uint256 unitAmount, uint256 bidPrice) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); + + // Taker user has received the asset + assertEq(mockHypercertMinter.ownerOf(fractionId), takerUser); + + // Units have been transfered + assertEq(mockHypercertMinter.unitsOf(fractionId), unitAmount); + + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + function testTakerBidHypercertFractionOrderUnitsOutOfMaxRange() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.additionalParameters = abi.encode(minUnitAmount, 100); + takerBid.additionalParameters = abi.encode(101, price); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerBidHypercertFractionOrderUnitsOutOfMinRange() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.additionalParameters = abi.encode(5, 100); + takerBid.additionalParameters = abi.encode(2, price); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerBidHypercertFractionOrderBidPriceTooLow() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount); + takerBid.additionalParameters = abi.encode(maxUnitAmount, price - 1); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + /** * A collection offer with merkle tree criteria */ /** * TAKER ALLOWLIST */ - function testTakerBidCollectionOrderWithMerkleTreeHypercertAccountAllowlist() public { + function testTakerBidHypercertFractionOrderWithMerkleTreeHypercertAccountAllowlist() public { _setUpUsers(); (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(false); address accountInMerkleTree = takerUser; - uint256 tokenIdInMerkleTree = 2; (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ owner: makerUser, numberOfAccountsInMerkleTree: 5, @@ -218,7 +377,6 @@ contract HypercertFractionOffersTest is ProtocolBase { _createMakerAskAndTakerBidHypercert(false); address accountInMerkleTree = takerUser; - uint256 tokenIdInMerkleTree = 2; (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ owner: makerUser, numberOfAccountsInMerkleTree: 5, @@ -266,7 +424,6 @@ contract HypercertFractionOffersTest is ProtocolBase { // 2. Amount is 0 (with merkle proof) makerAsk.strategyId = 2; address accountInMerkleTree = takerUser; - uint256 tokenIdInMerkleTree = 2; (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ owner: makerUser, numberOfAccountsInMerkleTree: 5, @@ -397,7 +554,7 @@ contract HypercertFractionOffersTest is ProtocolBase { uint256 fractionId ) private { //units, amount, currency, proof[] - (uint256 unitAmount, uint256 price) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); + (uint256 unitAmount, uint256 bidPrice) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); // Taker user has received the asset assertEq(mockHypercertMinter.ownerOf(fractionId), makerUser); @@ -408,14 +565,40 @@ contract HypercertFractionOffersTest is ProtocolBase { assertEq(mockHypercertMinter.unitsOf(fractionId + 1), unitAmount); // Maker bid user pays the whole price - assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser - (unitAmount * price)); + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser - (unitAmount * bidPrice)); // Taker ask user receives 99.5% of the whole price (0.5% protocol) assertEq( weth.balanceOf(makerUser), _initialWETHBalanceUser - + (unitAmount * price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + + (unitAmount * bidPrice * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP ); // Verify the nonce is marked as executed assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), _computeOrderHash(makerAsk)); } + + function _assertSuccessfulTakerBidFullFraction( + OrderStructs.Maker memory makerAsk, + OrderStructs.Taker memory takerBid, + uint256 fractionId + ) private { + //units, amount, currency, proof[] + (uint256 unitAmount, uint256 bidPrice) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); + + // Taker user has received the asset + assertEq(mockHypercertMinter.ownerOf(fractionId), takerUser); + + // Units have been transfered + assertEq(mockHypercertMinter.unitsOf(fractionId), unitAmount); + + // Maker bid user pays the whole price + assertEq(weth.balanceOf(takerUser), _initialWETHBalanceUser - (unitAmount * bidPrice)); + // Taker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + weth.balanceOf(makerUser), + _initialWETHBalanceUser + + (unitAmount * bidPrice * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } } diff --git a/contracts/test/foundry/protocol/AllowlistMinter.t.sol b/contracts/test/foundry/protocol/AllowlistMinter.t.sol index a16c343c..a5be53c6 100644 --- a/contracts/test/foundry/protocol/AllowlistMinter.t.sol +++ b/contracts/test/foundry/protocol/AllowlistMinter.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/Bitshifting.t.sol b/contracts/test/foundry/protocol/Bitshifting.t.sol index 6c4d9fe2..4c3aba56 100644 --- a/contracts/test/foundry/protocol/Bitshifting.t.sol +++ b/contracts/test/foundry/protocol/Bitshifting.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol b/contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol index 3f8502d6..e861dc9c 100644 --- a/contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol b/contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol index a4b63061..0253ea7a 100644 --- a/contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {StdCheats} from "forge-std/StdCheats.sol"; import {StdUtils} from "forge-std/StdUtils.sol"; diff --git a/contracts/test/foundry/protocol/HypercertMinter.t.sol b/contracts/test/foundry/protocol/HypercertMinter.t.sol index 86bbe1d5..e286c153 100644 --- a/contracts/test/foundry/protocol/HypercertMinter.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {StdCheats} from "forge-std/StdCheats.sol"; import {StdUtils} from "forge-std/StdUtils.sol"; @@ -68,6 +68,17 @@ contract HypercertMinterTest is PRBTest, StdCheats, StdUtils, MinterTestHelper { startHoax(alice, 10 ether); } + function testSupportsInterface() public { + // 721 + assertEq(hypercertMinter.supportsInterface(0x80ac58cd), false); + + // 1155 + assertEq(hypercertMinter.supportsInterface(0xd9b67a26), true); + + // IHypercertToken + assertEq(hypercertMinter.supportsInterface(0xda69bafa), true); + } + /// @dev Run Forge with `-vvvv` to see console logs. function testFailInitialize() public { hypercertMinter.initialize(); diff --git a/contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol b/contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol index cd2f1773..5533296e 100644 --- a/contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol +++ b/contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {StdCheats} from "forge-std/StdCheats.sol"; import {StdUtils} from "forge-std/StdUtils.sol"; diff --git a/contracts/test/foundry/protocol/PerformanceTesting.t.sol b/contracts/test/foundry/protocol/PerformanceTesting.t.sol index 956fd3bb..d1ce85d1 100644 --- a/contracts/test/foundry/protocol/PerformanceTesting.t.sol +++ b/contracts/test/foundry/protocol/PerformanceTesting.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol index efe78bef..0f715b6c 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol index 1e3c21a4..2b454992 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity >=0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol index 9458a8cc..0e01f6b4 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {stdError} from "forge-std/StdError.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.t.sol index ea5746c1..3ad7df59 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol index bcad3900..ce19bb64 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {StdCheats} from "forge-std/StdCheats.sol"; import {StdUtils} from "forge-std/StdUtils.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungible1155.units.sol b/contracts/test/foundry/protocol/SemiFungible1155.units.sol index 384bcdfb..e462ecd4 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.units.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.units.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; diff --git a/contracts/test/foundry/protocol/SemiFungibleHelper.sol b/contracts/test/foundry/protocol/SemiFungibleHelper.sol index 82a1c264..5cc9c863 100644 --- a/contracts/test/foundry/protocol/SemiFungibleHelper.sol +++ b/contracts/test/foundry/protocol/SemiFungibleHelper.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.16; +pragma solidity 0.8.17; import {SemiFungible1155} from "@hypercerts/protocol/SemiFungible1155.sol"; import {PRBTest} from "prb-test/PRBTest.sol"; diff --git a/contracts/test/mock/MockHypercertMinter.sol b/contracts/test/mock/MockHypercertMinter.sol new file mode 100644 index 00000000..417fe794 --- /dev/null +++ b/contracts/test/mock/MockHypercertMinter.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; + +contract MockHypercertMinter is IHypercertToken { + constructor() IHypercertToken() {} + + /// @dev Function called to store a claim referenced via `uri` with a maximum number of fractions `units`. + function mintClaim(address account, uint256 units, string memory uri, TransferRestrictions restrictions) external { + return; + } + + /// @dev Function called to store a claim referenced via `uri` with a set of `fractions`. + /// @dev Fractions are internally summed to total units. + function mintClaimWithFractions( + address account, + uint256 units, + uint256[] memory fractions, + string memory uri, + TransferRestrictions restrictions + ) external { + return; + } + + /// @dev Function called to split `tokenID` owned by `account` into units declared in `values`. + /// @notice The sum of `values` must equal the current value of `_tokenID`. + function splitFraction(address account, uint256 tokenID, uint256[] memory _values) external { + return; + } + + /// @dev Function called to merge tokens within `tokenIDs`. + /// @notice Tokens that have been merged are burned. + function mergeFractions(address account, uint256[] memory tokenIDs) external { + return; + } + + /// @dev Function to burn the token at `tokenID` for `account` + /// @notice Operator must be allowed by `creator` and the token must represent the total amount of available units. + function burnFraction(address account, uint256 tokenID) external { + return; + } + + /// @dev Function to burn the tokens at `tokenIDs` for `account` + /// @notice Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + function batchBurnFraction(address account, uint256[] memory tokenIDs) external { + return; + } + + /// @dev Returns the `units` held by a (fractional) token at `claimID` + /// @dev If `tokenID` is a base type, the total amount of `units` for the claim is returned. + /// @dev If `tokenID` is a fractional token, the `units` held by the token is returned + function unitsOf(uint256 tokenID) external view virtual returns (uint256 units) { + return 0; + } + + /// @dev Returns the `units` held by `account` of a (fractional) token at `claimID` + /// @dev If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned. + /// @dev If `tokenID` is a fractional token, the `units` held by `account` the token is returned + function unitsOf(address account, uint256 tokenID) external view virtual returns (uint256 units) { + return 0; + } + + /// @dev Returns the `uri` for metadata of the claim represented by `tokenID` + /// @dev Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata) + function uri(uint256 tokenID) external view returns (string memory metadata) { + return "metadata"; + } + + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return interfaceId == type(IHypercertToken).interfaceId; + } +} diff --git a/contracts/test/mock/MockHypercertMinterSupportsNoInterface.sol b/contracts/test/mock/MockHypercertMinterSupportsNoInterface.sol new file mode 100644 index 00000000..4f2aac87 --- /dev/null +++ b/contracts/test/mock/MockHypercertMinterSupportsNoInterface.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {MockHypercertMinter} from "./MockHypercertMinter.sol"; + +contract MockHypercertMinterSupportsNoInterface is MockHypercertMinter { + function supportsInterface(bytes4) public view virtual override returns (bool) { + return false; + } +} diff --git a/contracts/test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol b/contracts/test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol new file mode 100644 index 00000000..d8743699 --- /dev/null +++ b/contracts/test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {HypercertMinter} from "@hypercerts/protocol/HypercertMinter.sol"; + +contract MockHypercertMinterWithoutAnyBalanceOf is HypercertMinter { + constructor() HypercertMinter() {} + + function balanceOf(address, uint256) public view virtual override returns (uint256) { + revert("Not implemented"); + } +} diff --git a/contracts/test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol b/contracts/test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol new file mode 100644 index 00000000..d50128f4 --- /dev/null +++ b/contracts/test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {MockHypercertMinter} from "./MockHypercertMinter.sol"; + +contract MockHypercertMinterWithoutAnyUnitsOf is MockHypercertMinter { + function unitsOf(address, uint256) public view virtual override returns (uint256) { + revert("Not implemented"); + } +} diff --git a/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md index b185d072..cc542c7e 100644 --- a/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md +++ b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -408,7 +408,7 @@ This returns the strategy information for a strategy id. function transferManager() external view returns (contract TransferManager) ``` -Transfer manager for ERC721 and ERC1155. +Transfer manager for ERC721, ERC1155 and Hypercerts. #### Returns diff --git a/docs/docs/developer/api/contracts/marketplace/TransferManager.md b/docs/docs/developer/api/contracts/marketplace/TransferManager.md index c2aecdaf..c6766114 100644 --- a/docs/docs/developer/api/contracts/marketplace/TransferManager.md +++ b/docs/docs/developer/api/contracts/marketplace/TransferManager.md @@ -1,10 +1,10 @@ # TransferManager -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers_ > TransferManager -This contract provides the transfer functions for ERC721/ERC1155/Hypercert/Hyperboard for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. Collection type "3" refers to Hyperboard transfer functions. +This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. _"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ @@ -213,9 +213,9 @@ _Each operator address must be approved at the user level to be revoked._ function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable ``` -This function transfers items for a single Hypercert. +This function splits and transfers a fraction of a hypercert. -_It does not allow batch transferring if from = msg.sender since native function should be used._ +_It does not allow batch transferring._ #### Parameters @@ -412,7 +412,7 @@ It is emitted if an operator is removed from the global allowlist. error AmountInvalid() ``` -It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155, if amount is 0. +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. ### ERC1155SafeBatchTransferFromFail diff --git a/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md index 592bd4af..9011bd50 100644 --- a/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md +++ b/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md @@ -278,7 +278,7 @@ This returns the strategy information for a strategy id. function transferManager() external view returns (contract TransferManager) ``` -Transfer manager for ERC721 and ERC1155. +Transfer manager for ERC721, ERC1155 and Hypercerts. #### Returns diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md index a55946ce..daa427e4 100644 --- a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -6,7 +6,7 @@ _LooksRare protocol team (👀,💎); bitbeckers;_ This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. -_Use cases can include trait-based offers or rarity score offers._ +_Use cases can include tiered pricing; think early bird tickets._ ## Methods @@ -35,7 +35,7 @@ function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBi ### executeHypercertFractionStrategyWithTakerBidWithAllowlist ```solidity -function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) ``` #### Parameters @@ -90,6 +90,22 @@ function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) ## Errors +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + ### MerkleProofInvalid ```solidity diff --git a/docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md index 2d6342fd..76918fc5 100644 --- a/docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md +++ b/docs/docs/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md @@ -1,10 +1,10 @@ # OrderValidatorV2A -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers_ > OrderValidatorV2A -This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155 (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) +This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) _This version does not handle strategies with partial fills._ @@ -66,6 +66,20 @@ ERC721 potential interfaceId. | ---- | ------ | ----------- | | \_0 | bytes4 | undefined | +### HYPERCERT_INTERFACE_ID + +```solidity +function HYPERCERT_INTERFACE_ID() external view returns (bytes4) +``` + +Hypercert interfaceId + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + ### MAGIC_VALUE_ORDER_NONCE_EXECUTED ```solidity diff --git a/docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md index 5ed383b6..5951cc56 100644 --- a/docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md +++ b/docs/docs/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md @@ -1,6 +1,6 @@ # LowLevelHypercertCaller -_LooksRare protocol team (👀,💎)_ +_bitbeckers_ > LowLevelHypercertCaller diff --git a/docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md index 3c166bb7..6ffa83e2 100644 --- a/docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md +++ b/docs/docs/developer/api/contracts/marketplace/libraries/OrderStructs.md @@ -1,6 +1,6 @@ # OrderStructs -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers_ > OrderStructs diff --git a/docs/docs/developer/config.md b/docs/docs/developer/config.md index b26fc0e8..0be153cb 100644 --- a/docs/docs/developer/config.md +++ b/docs/docs/developer/config.md @@ -9,7 +9,6 @@ The client provides a high level interface that communicates with the Graph, IPF The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: 1. Overrides declared in `Partial` -2. Environment variables exposed via `process.env` Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. @@ -17,8 +16,7 @@ We then process the rest of the overrides and possible environment variables to To get started quickly you can either: -- set `process.env.DEFAULT_CHAIN_ID` to 5 or 10 -- initialize a new client by calling `new HypercertClient({chainId: 5})` (or 10) +- initialize a new client by calling `new HypercertClient({chain: {id: 5})` (or 10) Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/about.md b/docs/versioned_docs/version-1.0.0-alpha.0/about.md new file mode 100644 index 00000000..e2d4eb79 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/about.md @@ -0,0 +1,24 @@ +--- +title: The Hypercerts Foundation +id: about +--- + +# The Hypercerts Foundation + +### Mission + +The mission of the Hypercerts Foundation is to advance the development and adoption of open-source protocols for funding and rewarding positive impact. + +### Organization + +The Hypercerts Foundation is a fully independent organisation working closely with stakeholders in the open source, scientific research, and cryptography communities to develop and promote additional protocols that are decentralized, secure, and transparent. The Foundation will also provide support and resources to help drive the wider adoption of these protocols. + +### History + +Research on hypercerts was first presented to the public by David A. Dalrymple at the conference series Funding the Commons in March 2022. However, the concept of “impact certificates” has been a recurring theme at conferences and in online discussion forums since at least 2014. In late 2022, a small team of research scientists, developers, and practitioners began implementing hypercerts as a set of Ethereum-based smart contracts that could be used to assert and fund impact claims. The Hypercerts Foundation will now serve as the long-term home for this work. + +The new foundation is supported in part by Protocol Labs and is part of the broader Protocol Labs Network of hundreds of companies and organizations. The Foundation will complement Protocol Labs Network’s mission of enabling a more secure, open, and accessible internet. The Hypercerts Foundation, however, is fully independent and will focus on protocol development and cultivating a community of developers and impact entrepreneurs well beyond the Protocol Labs Network. + +### Further links + +Read the full [announcement of the Hypercerts Foundation](https://hypercerts.notion.site/Introducing-the-Hypercerts-Foundation-d956203fe0fc4792980da138015e770a). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md new file mode 100644 index 00000000..bc65b116 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md @@ -0,0 +1,101 @@ +# Allowlists + +Allowlists are an efficient way to enable distribution of hypercert fractions amongst a group. +First, the creator will create the hypercert with the metadata and an immutable allowlist. +With the `claimId`, every account specified in the allowlist can later mint their fraction token from that allowlist. + +## Create an allowlist + +First specify an allowlist, mapping addresses to the number of units they should receive. + +```js +import { + TransferRestrictions, + formatHypercertData, + Allowlist, +} from "@hypercerts-org/sdk"; + +const allowlist: Allowlist = [ + { address: "0x123", units: 100 }, + { address: "0xabc", units: 100 }, +]; +``` + +Then, call `createAllowlist` with the metadata and allowlist. + +```js +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; +const transferRestrictions = TransferRestrictions.FromCreatorOnly + +const { claimId } = await hypercerts.createAllowlist({ + allowList, + metaData, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **note** We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree generation and data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree) + +It first checks if the client is writable and if the operator is a signer. If the operator is not a signer, it throws an `InvalidOrMissingError`. + +Next, it validates the allowlist and metadata by calling the `validateAllowlist` and `validateMetaData` functions respectively. If either the allowlist or metadata is invalid, it throws a `MalformedDataError`. + +Once the allowlist and metadata are validated, the method creates a Merkle tree from the allowlist and stores it on IPFS. It then stores the metadata on IPFS as well. + +Finally, the method invokes the `createAllowlist` function on the contract with the signer's `address`, the total number of `units`, the Merkle tree `root`, the metadata `CID`, and the `transfer restrictions`. If the method is called with `overrides`, it passes them to the createAllowlist function. + +## Claiming a fraction token + +Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: + +| Variable | Type | Source | +| -------- | ------------ | ------------ | +| claimId | BigNumberish | Hypercert ID | +| units | BigNumberish | Allowlist | +| proof | BytesLike[] | Merkle tree | + +We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. + +Then, call `mintClaimFractionFromAllowlist` with the required data. The contracts will also verify the proofs. However, when providing the `root` in the function input, the proofs will be verified before a transaction is submitted. + +```js +import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; + +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const address = "0xc0ffee254729296a45a3885639AC7E10F9d54979"; + +const { indexer, storage } = hypercertsClient; +const claimById = await indexer.claimById(claimId); +const { uri, tokenID: _id } = claimById.claim; +const metadata = await storage.getMetadata(uri || ""); +const treeResponse = await storage.getData(metadata.allowList); +const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); + +let args; +// Find the proof in the allowlist +for (const [leaf, value] of tree.entries()) { + if (value[0] === address) { + args = { + proofs: tree.getProof(leaf), + units: Number(value[1]), + claimId: _id, + }; + break; + } +} + +// Mint fraction token +const tx = await hypercerts.mintClaimFractionFromAllowlist({ + ...args, +}); +``` + +Let's see what happens under the hood: + +First, the method checks that the client is not `read only` and that the operator is a signer. If not, it throws an `InvalidOrMissingError`. + +Next, the method verifies the Merkle `proof` using the OpenZeppelin Merkle tree library. If a `root` is provided, the method uses it to verify the proof. If the proof is invalid, it throws an error. + +Finally, the method calls the `mintClaimFromAllowlist` function on the contract with the signer `address`, Merkle `proof`, `claim ID`, and number of `units` as parameters. If overrides are provided, the method uses them to send the transaction. Otherwise, it sends the transaction without overrides. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md new file mode 100644 index 00000000..e31e8840 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md @@ -0,0 +1,434 @@ +# HypercertTrader + +_bitbeckers_ + +> Contract for managing hypercert trades + +Implementation of the HypercertTrader Interface + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsForSale | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +### getOffer + +```solidity +function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------- | ----------- | +| \_0 | IHypercertTrader.Offer | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### offers + +```solidity +function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | --------------------------------- | ----------- | +| offerer | address | undefined | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsAvailable | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| offerType | enum IHypercertTrader.OfferType | undefined | +| status | enum IHypercertTrader.OfferStatus | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### totalUnitsForSale + +```solidity +function totalUnitsForSale(address, uint256) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +## Errors + +### InvalidBuy + +```solidity +error InvalidBuy(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### InvalidOffer + +```solidity +error InvalidOffer(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### NotAllowed + +```solidity +error NotAllowed() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md new file mode 100644 index 00000000..13a84632 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md @@ -0,0 +1,39 @@ +# IHypercertMinter + +## Methods + +### ownerOf + +```solidity +function ownerOf(uint256 id) external view returns (address) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 id) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md new file mode 100644 index 00000000..6be07157 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md @@ -0,0 +1,77 @@ +# AggregatorV3Interface + +## Methods + +### decimals + +```solidity +function decimals() external view returns (uint8) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ----- | ----------- | +| \_0 | uint8 | undefined | + +### description + +```solidity +function description() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### getRoundData + +```solidity +function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------ | ----------- | +| \_roundId | uint80 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### latestRoundData + +```solidity +function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### version + +```solidity +function version() external view returns (uint256) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md new file mode 100644 index 00000000..8d14ad8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md @@ -0,0 +1 @@ +# console diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md new file mode 100644 index 00000000..cb666cd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md @@ -0,0 +1,3 @@ +# console2 + +_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md new file mode 100644 index 00000000..06fb700c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md @@ -0,0 +1,133 @@ +# IHypercertTrader + +_bitbeckers_ + +> Interface for hypercert token trading + +This interface declares the required functionality to interact with the hypercert marketplace + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| units | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +## Events + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md new file mode 100644 index 00000000..4cb96bfc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md @@ -0,0 +1,46 @@ +# BatchOrderTypehashRegistry + +_LooksRare protocol team (👀,💎)_ + +> BatchOrderTypehashRegistry + +The contract generates the batch order hash that is used to compute the digest for signature verification. + +## Methods + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +## Errors + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md new file mode 100644 index 00000000..a32aef65 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md @@ -0,0 +1,76 @@ +# CreatorFeeManagerWithRebates + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRebates + +This contract returns the creator fee address and the creator rebate amount. + +## Methods + +### STANDARD_ROYALTY_FEE_BP + +```solidity +function STANDARD_ROYALTY_FEE_BP() external view returns (uint256) +``` + +Standard royalty fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md new file mode 100644 index 00000000..41cab900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md @@ -0,0 +1,64 @@ +# CreatorFeeManagerWithRoyalties + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRoyalties + +This contract returns the creator fee address and the creator fee amount. + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +_There are two on-chain sources for the royalty fee to distribute. 1. RoyaltyFeeRegistry: It is an on-chain registry where creator fee is defined for all items of a collection. 2. ERC2981: The NFT Royalty Standard where royalty fee is defined at a itemId level in a collection. The on-chain logic looks up the registry first. If it does not find anything, it checks if a collection is ERC2981. If so, it fetches the proper royalty information for the itemId. For a bundle that contains multiple itemIds (for a collection using ERC2981), if the royalty fee/recipient differ among the itemIds part of the bundle, the trade reverts. This contract DOES NOT enforce any restriction for extremely high creator fee, nor verifies the creator fee fetched is inferior to the total price. If any contract relies on it to build an on-chain royalty logic, it should implement protection against: (1) high royalties (2) potential unexpected royalty changes that can occur after the creation of the order._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md new file mode 100644 index 00000000..9ff1c0fc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md @@ -0,0 +1,250 @@ +# CurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> CurrencyManager + +This contract manages the list of valid fungible currencies. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md new file mode 100644 index 00000000..83eefc37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md @@ -0,0 +1,751 @@ +# ExecutionManager + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> ExecutionManager + +This contract handles the execution and resolution of transactions. A transaction is executed on-chain when an off-chain maker order is matched by on-chain taker order of a different kind. For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md new file mode 100644 index 00000000..022cce57 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md @@ -0,0 +1,9 @@ +# InheritedStrategy + +_LooksRare protocol team (👀,💎)_ + +> InheritedStrategy + +This contract handles the verification of parameters for standard transactions. It does not verify the taker struct's itemIds and amounts array as well as minPrice (taker ask) / maxPrice (taker bid) because before the taker executes the transaction and the maker itemIds/amounts/price should have already been confirmed off-chain. + +_A standard transaction (bid or ask) is mapped to strategyId = 0._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md new file mode 100644 index 00000000..cc542c7e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -0,0 +1,1157 @@ +# LooksRareProtocol + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> LooksRareProtocol + +This contract is the core smart contract of the LooksRare protocol ("v2"). It is the main entry point for users to initiate transactions with taker orders and manage the cancellation of maker orders, which exist off-chain. ~~~~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~- ~~~~~~~~ ~~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~~ ~~~~~~~~ ~~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~~~~ + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ETH. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### chainId + +```solidity +function chainId() external view returns (uint256) +``` + +Current chainId. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +Current domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### restrictedExecuteTakerBid + +```solidity +function restrictedExecuteTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, address sender, bytes32 orderHash) external nonpayable returns (uint256 protocolFeeAmount) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| sender | address | undefined | +| orderHash | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| protocolFeeAmount | uint256 | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateDomainSeparator + +```solidity +function updateDomainSeparator() external nonpayable +``` + +This function allows the owner to update the domain separator (if possible). + +_Only callable by owner. If there is a fork of the network with a new chainId, it allows the owner to reset the domain separator for the new chain id._ + +### updateETHGasLimitForTransfer + +```solidity +function updateETHGasLimitForTransfer(uint256 newGasLimitETHTransfer) external nonpayable +``` + +This function allows the owner to update the maximum ETH gas limit for a standard transfer. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------ | +| newGasLimitETHTransfer | uint256 | New gas limit for ETH transfer | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------- | +| gasLimitETHTransfer | uint256 | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| askUser | address | undefined | +| bidUser | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| bidUser | address | undefined | +| bidRecipient | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +## Errors + +### CallerInvalid + +```solidity +error CallerInvalid() +``` + +It is returned if the function cannot be called by the sender. + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### CurrencyInvalid + +```solidity +error CurrencyInvalid() +``` + +It is returned if the currency is invalid. + +### ERC20TransferFromFail + +```solidity +error ERC20TransferFromFail() +``` + +It is emitted if the ERC20 transferFrom fails. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### QuoteTypeInvalid + +```solidity +error QuoteTypeInvalid() +``` + +It is returned if the maker quote type is invalid. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md new file mode 100644 index 00000000..fea95495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md @@ -0,0 +1,193 @@ +# NonceManager + +_LooksRare protocol team (👀,💎)_ + +> NonceManager + +This contract handles the nonce logic that is used for invalidating maker orders that exist off-chain. The nonce logic revolves around three parts at the user level: - order nonce (orders sharing an order nonce are conditional, OCO-like) - subset (orders can be grouped under a same subset) - bid/ask (all orders can be executed only if the bid/ask nonce matches the user's one on-chain) Only the order nonce is invalidated at the time of the execution of a maker order that contains it. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md new file mode 100644 index 00000000..36f6a35c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md @@ -0,0 +1,75 @@ +# ProtocolFeeRecipient + +_LooksRare protocol team (👀,💎)_ + +> ProtocolFeeRecipient + +This contract is used to receive protocol fees and transfer them to the fee sharing setter. Fee sharing setter cannot receive ETH directly, so we need to use this contract as a middleman to convert ETH into WETH before sending it. + +## Methods + +### FEE_SHARING_SETTER + +```solidity +function FEE_SHARING_SETTER() external view returns (address) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### WETH + +```solidity +function WETH() external view returns (contract IWETH) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------- | ----------- | +| \_0 | contract IWETH | undefined | + +### transferERC20 + +```solidity +function transferERC20(address currency) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------------- | +| currency | address | ERC20 currency address | + +### transferETH + +```solidity +function transferETH() external nonpayable +``` + +## Errors + +### ERC20TransferFail + +```solidity +error ERC20TransferFail() +``` + +It is emitted if the ERC20 transfer fails. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NothingToTransfer + +```solidity +error NothingToTransfer() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md new file mode 100644 index 00000000..a55f3985 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md @@ -0,0 +1,391 @@ +# StrategyManager + +_LooksRare protocol team (👀,💎)_ + +> StrategyManager + +This contract handles the addition and the update of execution strategies. + +## Methods + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md new file mode 100644 index 00000000..c6766114 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md @@ -0,0 +1,553 @@ +# TransferManager + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> TransferManager + +This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. + +_"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ + +## Methods + +### allowOperator + +```solidity +function allowOperator(address operator) external nonpayable +``` + +This function allows an operator to be added for the shared transfer system. Once the operator is allowed, users can grant NFT approvals to this operator. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------------- | +| operator | address | Operator address to allow | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### grantApprovals + +```solidity +function grantApprovals(address[] operators) external nonpayable +``` + +This function allows a user to grant approvals for an array of operators. Users cannot grant approvals if the operator is not allowed by this contract's owner. + +_Each operator address must be globally allowed to be approved._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### hasUserApprovedOperator + +```solidity +function hasUserApprovedOperator(address, address) external view returns (bool) +``` + +This returns whether the user has approved the operator address. The first address is the user and the second address is the operator (e.g. LooksRareProtocol). + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isOperatorAllowed + +```solidity +function isOperatorAllowed(address) external view returns (bool) +``` + +This returns whether the operator address is allowed by this contract's owner. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### removeOperator + +```solidity +function removeOperator(address operator) external nonpayable +``` + +This function allows the user to remove an operator for the shared transfer system. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | -------------------------- | +| operator | address | Operator address to remove | + +### revokeApprovals + +```solidity +function revokeApprovals(address[] operators) external nonpayable +``` + +This function allows a user to revoke existing approvals for an array of operators. + +_Each operator address must be approved at the user level to be revoked._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### splitItemsHypercert + +```solidity +function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function splits and transfers a fraction of a hypercert. + +_It does not allow batch transferring._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferBatchItemsAcrossCollections + +```solidity +function transferBatchItemsAcrossCollections(ITransferManager.BatchTransferItem[] items, address from, address to) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------------------------ | ----------- | +| items | ITransferManager.BatchTransferItem[] | undefined | +| from | address | undefined | +| to | address | undefined | + +### transferItemsERC1155 + +```solidity +function transferItemsERC1155(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC1155 collection. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsERC721 + +```solidity +function transferItemsERC721(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC721 collection. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsHypercert + +```solidity +function transferItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single Hypercert. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### ERC1155SafeBatchTransferFromFail + +```solidity +error ERC1155SafeBatchTransferFromFail() +``` + +It is emitted if the ERC1155 safeBatchTransferFrom fails. + +### ERC1155SafeTransferFromFail + +```solidity +error ERC1155SafeTransferFromFail() +``` + +It is emitted if the ERC1155 safeTransferFrom fails. + +### ERC721TransferFromFail + +```solidity +error ERC721TransferFromFail() +``` + +It is emitted if the ERC721 transferFrom fails. + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md new file mode 100644 index 00000000..9011bd50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md @@ -0,0 +1,779 @@ +# TransferSelectorNFT + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> TransferSelectorNFT + +This contract handles the logic for transferring non-fungible items. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md new file mode 100644 index 00000000..37866658 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md @@ -0,0 +1,41 @@ +# BaseStrategy + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md new file mode 100644 index 00000000..c9503939 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md @@ -0,0 +1,212 @@ +# BaseStrategyChainlinkPriceLatency + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategyChainlinkPriceLatency + +This contract allows the owner to define the maximum acceptable Chainlink price latency. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md new file mode 100644 index 00000000..e2d77dd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md @@ -0,0 +1,342 @@ +# StrategyChainlinkUSDDynamicAsk + +_LooksRare protocol team (👀,💎)_ + +> StrategyChainlinkUSDDynamicAsk + +This contract allows a seller to sell an NFT priced in USD and the receivable amount to be in ETH. + +## Methods + +### ETH_USD_PRICE_FEED_DECIMALS + +```solidity +function ETH_USD_PRICE_FEED_DECIMALS() external view returns (uint256) +``` + +_It is possible to call priceFeed.decimals() to get the decimals, but to save gas, it is hard coded instead._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ether (WETH) address. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### priceFeed + +```solidity +function priceFeed() external view returns (contract AggregatorV3Interface) +``` + +ETH/USD Chainlink price feed + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------------ | ----------- | +| \_0 | contract AggregatorV3Interface | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### ChainlinkPriceInvalid + +```solidity +error ChainlinkPriceInvalid() +``` + +It is returned if the Chainlink price is invalid (e.g. negative). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. + +### PriceNotRecentEnough + +```solidity +error PriceNotRecentEnough() +``` + +It is returned if the current block time relative to the latest price's update time is greater than the latency tolerance. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md new file mode 100644 index 00000000..ddec4495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md @@ -0,0 +1,127 @@ +# StrategyCollectionOffer + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> StrategyCollectionOffer + +This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount must be 1 (fractions are NFTs) + +## Methods + +### executeCollectionStrategyWithTakerAsk + +```solidity +function executeCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithAllowlist + +```solidity +function executeCollectionStrategyWithTakerAskWithAllowlist(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithProof + +```solidity +function executeCollectionStrategyWithTakerAskWithProof(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md new file mode 100644 index 00000000..1227878d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md @@ -0,0 +1,83 @@ +# StrategyDutchAuction + +_LooksRare protocol team (👀,💎)_ + +> StrategyDutchAuction + +This contract offers a single execution strategy for users to create Dutch auctions. + +## Methods + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md new file mode 100644 index 00000000..daa427e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -0,0 +1,123 @@ +# StrategyHypercertFractionOffer + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> StrategyHypercertFractionOffer + +This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. + +_Use cases can include tiered pricing; think early bird tickets._ + +## Methods + +### executeHypercertFractionStrategyWithTakerBid + +```solidity +function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeHypercertFractionStrategyWithTakerBidWithAllowlist + +```solidity +function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md new file mode 100644 index 00000000..6a1f0cd5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md @@ -0,0 +1,75 @@ +# StrategyItemIdsRange + +_LooksRare protocol team (👀,💎)_ + +> StrategyItemIdsRange + +This contract offers a single execution strategy for users to bid on a specific amount of items in a range bounded by 2 item ids. + +## Methods + +### executeStrategyWithTakerAsk + +```solidity +function executeStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md new file mode 100644 index 00000000..76918fc5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md @@ -0,0 +1,215 @@ +# OrderValidatorV2A + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderValidatorV2A + +This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) + +_This version does not handle strategies with partial fills._ + +## Methods + +### CRITERIA_GROUPS + +```solidity +function CRITERIA_GROUPS() external view returns (uint256) +``` + +Number of distinct criteria groups checked to evaluate the validity of an order. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### ERC1155_INTERFACE_ID + +```solidity +function ERC1155_INTERFACE_ID() external view returns (bytes4) +``` + +ERC1155 interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_1 + +```solidity +function ERC721_INTERFACE_ID_1() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_2 + +```solidity +function ERC721_INTERFACE_ID_2() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### HYPERCERT_INTERFACE_ID + +```solidity +function HYPERCERT_INTERFACE_ID() external view returns (bytes4) +``` + +Hypercert interfaceId + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### checkMakerOrderValidity + +```solidity +function checkMakerOrderValidity(OrderStructs.Maker makerOrder, bytes signature, OrderStructs.MerkleTree merkleTree) external view returns (uint256[9] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| signature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ---------- | ----------- | +| validationCodes | uint256[9] | undefined | + +### checkMultipleMakerOrderValidities + +```solidity +function checkMultipleMakerOrderValidities(OrderStructs.Maker[] makerOrders, bytes[] signatures, OrderStructs.MerkleTree[] merkleTrees) external view returns (uint256[9][] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------------------------- | ----------- | +| makerOrders | OrderStructs.Maker[] | undefined | +| signatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------------ | ----------- | +| validationCodes | uint256[9][] | undefined | + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +CreatorFeeManager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### deriveProtocolParameters + +```solidity +function deriveProtocolParameters() external nonpayable +``` + +Derive protocol parameters. Anyone can call this function. + +_It allows adjusting if the domain separator or creator fee manager address were to change._ + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +LooksRareProtocol domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +LooksRareProtocol. + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint256) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +TransferManager + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md new file mode 100644 index 00000000..91be29a9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md @@ -0,0 +1,159 @@ +# ProtocolHelpers + +_LooksRare protocol team (👀,💎)_ + +> ProtocolHelpers + +This contract contains helper view functions for order creation. + +## Methods + +### computeDigestMerkleTree + +```solidity +function computeDigestMerkleTree(OrderStructs.MerkleTree merkleTree) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### computeMakerDigest + +```solidity +function computeMakerDigest(OrderStructs.Maker maker) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### verifyMakerSignature + +```solidity +function verifyMakerSignature(OrderStructs.Maker maker, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### verifyMerkleTree + +```solidity +function verifyMerkleTree(OrderStructs.MerkleTree merkleTree, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Errors + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md new file mode 100644 index 00000000..b832744e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md @@ -0,0 +1,60 @@ +# ICreatorFeeManager + +_LooksRare protocol team (👀,💎)_ + +> ICreatorFeeManager + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry royaltyFeeRegistry) +``` + +It returns the royalty fee registry address/interface. + +#### Returns + +| Name | Type | Description | +| ------------------ | ---------------------------- | ------------------------------------- | +| royaltyFeeRegistry | contract IRoyaltyFeeRegistry | Interface of the royalty fee registry | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md new file mode 100644 index 00000000..da683d8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md @@ -0,0 +1,22 @@ +# ICurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> ICurrencyManager + +## Events + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------------------------------- | +| currency | address | Currency address (address(0) = ETH) | +| isAllowed | bool | Whether the currency is allowed | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md new file mode 100644 index 00000000..0e86c75b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md @@ -0,0 +1,99 @@ +# IExecutionManager + +_LooksRare protocol team (👀,💎)_ + +> IExecutionManager + +## Events + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | -------------------------------------- | +| creatorFeeManager | address | Address of the new creator fee manager | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ---------------------------------------- | +| maxCreatorFeeBp | uint256 | New maximum creator fee (in basis point) | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------------------------------------- | +| protocolFeeRecipient | address | Address of the new protocol fee recipient | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md new file mode 100644 index 00000000..393cb24b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md @@ -0,0 +1,41 @@ +# IImmutableCreate2Factory + +## Methods + +### findCreate2Address + +```solidity +function findCreate2Address(bytes32 salt, bytes initializationCode) external view returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | + +### safeCreate2 + +```solidity +function safeCreate2(bytes32 salt, bytes initializationCode) external payable returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md new file mode 100644 index 00000000..e7414f54 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md @@ -0,0 +1,157 @@ +# ILooksRareProtocol + +_LooksRare protocol team (👀,💎)_ + +> ILooksRareProtocol + +## Methods + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +## Events + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------------------------- | +| gasLimitETHTransfer | uint256 | Gas limit for an ETH transfer | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| askUser | address | Address of the ask user | +| bidUser | address | Address of the bid user | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it can be the taker ask user or different) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| bidUser | address | Address of the bid user | +| bidRecipient | address | Address of the recipient of the bid | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it is the maker ask user) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +## Errors + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md new file mode 100644 index 00000000..eaa3f977 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md @@ -0,0 +1,53 @@ +# INonceManager + +_LooksRare protocol team (👀,💎)_ + +> INonceManager + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------- | +| user | address | Address of the user | +| bidNonce | uint256 | New bid nonce | +| askNonce | uint256 | New ask nonce | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ------------------------------- | +| user | address | Address of the user | +| orderNonces | uint256[] | Array of order nonces cancelled | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | -------------------------------- | +| user | address | Address of the user | +| subsetNonces | uint256[] | Array of subset nonces cancelled | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md new file mode 100644 index 00000000..5ed0ef6c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md @@ -0,0 +1,29 @@ +# IRoyaltyFeeRegistry + +_LooksRare protocol team (👀,💎)_ + +> IRoyaltyFeeRegistry + +## Methods + +### royaltyInfo + +```solidity +function royaltyInfo(address collection, uint256 price) external view returns (address receiver, uint256 royaltyFee) +``` + +This function returns the royalty information for a collection at a given transaction price. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | + +#### Returns + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| receiver | address | Receiver address | +| royaltyFee | uint256 | Royalty fee amount | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md new file mode 100644 index 00000000..2b4a45bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md @@ -0,0 +1,41 @@ +# IStrategy + +_LooksRare protocol team (👀,💎)_ + +> IStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool isStrategy) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---------- | ---- | ---------------------------------------------- | +| isStrategy | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md new file mode 100644 index 00000000..ae6ea7b1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md @@ -0,0 +1,84 @@ +# IStrategyManager + +_LooksRare protocol team (👀,💎)_ + +> IStrategyManager + +## Events + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------------- | +| strategyId | uint256 | Id of the new strategy | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the transaction to be executed | +| isMakerBid | bool | Whether the strategyId is for maker bid | +| implementation | address | Address of the implementation of the strategy | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | -------------------------------------------------------- | +| strategyId | uint256 | Id of the strategy | +| isActive | bool | Whether the strategy is active (or not) after the update | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | + +## Errors + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md new file mode 100644 index 00000000..3ba8ca81 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md @@ -0,0 +1,111 @@ +# ITransferManager + +_LooksRare protocol team (👀,💎)_ + +> ITransferManager + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +## Errors + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md new file mode 100644 index 00000000..1b1f41a2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md @@ -0,0 +1,7 @@ +# CurrencyValidator + +_LooksRare protocol team (👀,💎)_ + +> CurrencyValidator + +This library validates the order currency to be the chain's native currency or the specified ERC20 token. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md new file mode 100644 index 00000000..5951cc56 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md @@ -0,0 +1,21 @@ +# LowLevelHypercertCaller + +_bitbeckers_ + +> LowLevelHypercertCaller + +This contract contains low-level calls to transfer ERC1155 tokens. + +## Errors + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### NotAContract + +```solidity +error NotAContract() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md new file mode 100644 index 00000000..943a54cd --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md @@ -0,0 +1,7 @@ +# MerkleProofCalldataWithNodes + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofCalldataWithNodes + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md new file mode 100644 index 00000000..37529181 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md @@ -0,0 +1,7 @@ +# MerkleProofMemory + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofMemory + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md new file mode 100644 index 00000000..6ffa83e2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md @@ -0,0 +1,7 @@ +# OrderStructs + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderStructs + +This library contains all order struct types for the LooksRare protocol (v2). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll new file mode 100644 index 00000000..e2ac6616 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md new file mode 100644 index 00000000..b1434ab0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md @@ -0,0 +1,185 @@ +Hypercerts SDK Documentation / [Exports](modules.md) + +# Hypercert SDK + +## Quickstart Guide + +1. Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +``` + +or + +```bash + yarn add @hypercerts-org/sdk +``` + +2. Import the SDK into your project: + +```bash +import { HypercertClient } from "@hypercerts-org/sdk"; +``` + +3. Create a new instance of the HypercertClient class with your configuration options: + +```js +const client = new HypercertClient({ + chainId: 5, + provider, + signer, + nftStorageToken, + web3StorageToken, +}); +``` + +> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in +> [read-only mode](#read-only-mode) + +4. Use the client object to interact with the Hypercert network. + +For example, you can use the `client.mintClaim` method to create a new claim: + +```js +const tx = await client.mintClaim( + metaData, + totalUnits, + transferRestriction, + overrides, +); +``` + +This will validate the metadata, store it on IPFS, create a new hypercert on-chain and return a transaction receipt. + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more information on how to use the SDK, check out the +[developer documentation](https://hypercerts.org/docs/developer/) and the +[Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. Don't forget to set your +environment variables for your NFT.storage and web3.storage API keys in your .env file. + +## Config + +The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check +the environment variables. + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without a signer or provider. +- The client was initialized with a provider but not a signer. +- The client was initialized with a signer but not a provider. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a +warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief +explanation of each constant: + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphName": "hypercerts-testnet" + } +} +``` + +### Client config properties + +| \| Property | Type | Description | +| ------------------ | -------------------- | -------------------------------------- | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | +| `graphName` | `string` | The name of the Gsubgraph to use. | +| `provider` | `providers.Provider` | A custom provider to use. | +| `signer` | `Signer` | A custom signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +### Environment variables + +To determine the missing configuration values the SDK defaults to the following environment variables: + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +## Client modules + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and +NFT.storage. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the storage, indexer, and contract getters, the HypercertClient allows +developers to easily interact with the various components of the Hypercert system. For example, a developer could use +the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based +on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the +contract. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md new file mode 100644 index 00000000..89f2105f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError + +# Class: ClientError + +An error that is caused by a problem with the client. + +## Hierarchy + +- `Error` + + ↳ **`ClientError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ClientError.md#constructor) + +### Properties + +- [payload](ClientError.md#payload) + +## Constructors + +### constructor + +• **new ClientError**(`message`, `payload?`) + +Creates a new instance of the ClientError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md new file mode 100644 index 00000000..03813867 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md @@ -0,0 +1,66 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError + +# Class: ConfigurationError + +The configuration was invalid + +## Hierarchy + +- `Error` + + ↳ **`ConfigurationError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ConfigurationError.md#constructor) + +### Properties + +- [payload](ConfigurationError.md#payload) + +## Constructors + +### constructor + +• **new ConfigurationError**(`message`, `payload?`) + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `message` | `string` | +| `payload?` | `Object` | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md new file mode 100644 index 00000000..d4c9f7c9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError + +# Class: FetchError + +Fails fetching a remote resource + +## Hierarchy + +- `Error` + + ↳ **`FetchError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](FetchError.md#constructor) + +### Properties + +- [payload](FetchError.md#payload) + +## Constructors + +### constructor + +• **new FetchError**(`message`, `payload?`) + +Creates a new instance of the FetchError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md new file mode 100644 index 00000000..a5a0e900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md @@ -0,0 +1,493 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient + +# Class: HypercertClient + +Hypercerts client factory + +**`Dev`** + +Creates a Hypercerts client instance + +**`Notice`** + +The client is readonly if no signer is set or if the contract address is not set + +**`Param`** + +Hypercerts client configuration + +**`Param`** + +Hypercerts storage object + +## Implements + +- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertClient.md#constructor) + +### Properties + +- [\_config](HypercertClient.md#_config) +- [\_contract](HypercertClient.md#_contract) +- [\_evaluator](HypercertClient.md#_evaluator) +- [\_indexer](HypercertClient.md#_indexer) +- [\_operator](HypercertClient.md#_operator) +- [\_storage](HypercertClient.md#_storage) +- [readonly](HypercertClient.md#readonly) + +### Accessors + +- [contract](HypercertClient.md#contract) +- [indexer](HypercertClient.md#indexer) +- [storage](HypercertClient.md#storage) + +### Methods + +- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClient.md#burnclaimfraction) +- [checkWritable](HypercertClient.md#checkwritable) +- [createAllowlist](HypercertClient.md#createallowlist) +- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) +- [mintClaim](HypercertClient.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClient.md#splitclaimunits) + +## Constructors + +### constructor + +• **new HypercertClient**(`config?`) + +Creates a new instance of the `HypercertClient` class. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | + +#### Defined in + +[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) + +## Properties + +### \_config + +• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) + +#### Defined in + +[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) + +--- + +### \_contract + +• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +#### Defined in + +[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) + +--- + +### \_evaluator + +• `Private` **\_evaluator**: [`default`](internal.default.md) + +#### Defined in + +[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) + +--- + +### \_indexer + +• `Private` **\_indexer**: [`default`](internal.default-1.md) + +#### Defined in + +[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) + +--- + +### \_operator + +• `Private` **\_operator**: `Provider` \| `Signer` + +#### Defined in + +[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) + +--- + +### \_storage + +• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) + +#### Defined in + +[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) + +## Accessors + +### contract + +• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +Gets the HypercertMinter contract used by the client. + +#### Returns + +[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +The contract. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) + +#### Defined in + +[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) + +--- + +### indexer + +• `get` **indexer**(): [`default`](internal.default-1.md) + +Gets the indexer for the client. + +#### Returns + +[`default`](internal.default-1.md) + +The indexer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) + +#### Defined in + +[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) + +--- + +### storage + +• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) + +Gets the storage layer for the client. + +#### Returns + +[`HypercertsStorage`](HypercertsStorage.md) + +The storage layer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) + +#### Defined in + +[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) + +## Methods + +### batchMintClaimFractionsFromAllowlists + +▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | +| `roots?` | `BytesLike`[] | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Implementation of + +HypercertClientInterface.batchMintClaimFractionsFromAllowlists + +#### Defined in + +[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) + +--- + +### burnClaimFraction + +▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> + +Burn a Hypercert claim by providing the claim id + +**`Dev`** + +Burns a Hypercert claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :----------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.burnClaimFraction + +#### Defined in + +[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) + +--- + +### checkWritable + +▸ `Private` **checkWritable**(): `boolean` + +#### Returns + +`boolean` + +#### Defined in + +[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) + +--- + +### createAllowlist + +▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Create a Hypercert claim with an allowlist + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist + +**`Notice`** + +The total number of units in the allowlist must match the total number of units for the Hypercert + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.createAllowlist + +#### Defined in + +[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) + +--- + +### mergeClaimUnits + +▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> + +Merge multiple Hypercert claims fractions into one + +**`Dev`** + +Merges multiple Hypercert claims into one + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :------------------ | +| `claimIds` | `BigNumberish`[] | Hypercert claim ids | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mergeClaimUnits + +#### Defined in + +[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) + +--- + +### mintClaim + +▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units and transfer restrictions + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaim + +#### Defined in + +[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) + +--- + +### mintClaimFractionFromAllowlist + +▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim fraction from an allowlist. + +**`Dev`** + +Verifies the claim proof and mints the claim fraction + +**`Notice`** + +If known, provide the root for client side verification + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `units` | `BigNumberish` | Number of units to mint | +| `proof` | `BytesLike`[] | Merkle proof for the claim | +| `root?` | `BytesLike` | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaimFractionFromAllowlist + +#### Defined in + +[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) + +--- + +### splitClaimUnits + +▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> + +Split a Hypercert's unit into multiple claims with the given fractions + +**`Dev`** + +Submit the ID of the claim to split and new fraction values. + +**`Notice`** + +The sum of the fractions must be equal to the total units of the claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.splitClaimUnits + +#### Defined in + +[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md new file mode 100644 index 00000000..706c14fe --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md @@ -0,0 +1,250 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage + +# Class: HypercertsStorage + +A class that provides storage functionality for Hypercerts. + +## Implements + +- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertsStorage.md#constructor) + +### Properties + +- [nftStorageClient](HypercertsStorage.md#nftstorageclient) +- [readonly](HypercertsStorage.md#readonly) +- [web3StorageClient](HypercertsStorage.md#web3storageclient) + +### Methods + +- [getData](HypercertsStorage.md#getdata) +- [getMetadata](HypercertsStorage.md#getmetadata) +- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) +- [storeData](HypercertsStorage.md#storedata) +- [storeMetadata](HypercertsStorage.md#storemetadata) + +## Constructors + +### constructor + +• **new HypercertsStorage**(`overrides`) + +Creates a new instance of the `HypercertsStorage` class. + +#### Parameters + +| Name | Type | Description | +| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | +| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | + +#### Defined in + +[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) + +## Properties + +### nftStorageClient + +• `Optional` **nftStorageClient**: `NFTStorage` + +The NFT storage client. + +#### Defined in + +[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +Whether the storage is read-only. + +#### Defined in + +[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) + +--- + +### web3StorageClient + +• `Optional` **web3StorageClient**: `any` + +The Web3 storage client. + +#### Defined in + +[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) + +## Methods + +### getData + +▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> + +Gets arbitrary data from Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the data cannot be retrieved. + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :-------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | + +#### Returns + +`Promise`<`any`\> + +A Promise that resolves to the data. + +#### Implementation of + +HypercertStorageInterface.getData + +#### Defined in + +[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) + +--- + +### getMetadata + +▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +Gets metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. E.g. unknown schema + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------ | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | + +#### Returns + +`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +A Promise that resolves to the metadata. + +#### Implementation of + +HypercertStorageInterface.getMetadata + +#### Defined in + +[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) + +--- + +### getNftStorageGatewayUri + +▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` + +#### Parameters + +| Name | Type | +| :------------- | :------- | +| `cidOrIpfsUri` | `string` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) + +--- + +### storeData + +▸ **storeData**(`data`): `Promise`<`CIDString`\> + +Stores arbitrary data in Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Notice`** + +Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Implementation of + +HypercertStorageInterface.storeData + +#### Defined in + +[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) + +--- + +### storeMetadata + +▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> + +Stores metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. + +**`Notice`** + +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------------------------------------------------------- | :--------------------- | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Implementation of + +HypercertStorageInterface.storeMetadata + +#### Defined in + +[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md new file mode 100644 index 00000000..d12c0653 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError + +# Class: InvalidOrMissingError + +The provided value was undefined or empty + +## Hierarchy + +- `Error` + + ↳ **`InvalidOrMissingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](InvalidOrMissingError.md#constructor) + +### Properties + +- [payload](InvalidOrMissingError.md#payload) + +## Constructors + +### constructor + +• **new InvalidOrMissingError**(`message`, `payload?`) + +Creates a new instance of the InvalidOrMissingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md new file mode 100644 index 00000000..028129d8 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError + +# Class: MalformedDataError + +Data doesn't conform to expectations + +## Hierarchy + +- `Error` + + ↳ **`MalformedDataError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MalformedDataError.md#constructor) + +### Properties + +- [payload](MalformedDataError.md#payload) + +## Constructors + +### constructor + +• **new MalformedDataError**(`message`, `payload?`) + +Creates a new instance of the MalformedDataError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md new file mode 100644 index 00000000..de284494 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError + +# Class: MintingError + +Minting transaction failed + +## Hierarchy + +- `Error` + + ↳ **`MintingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MintingError.md#constructor) + +### Properties + +- [payload](MintingError.md#payload) + +## Constructors + +### constructor + +• **new MintingError**(`message`, `payload?`) + +Creates a new instance of the MintingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md new file mode 100644 index 00000000..0dcf0291 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError + +# Class: StorageError + +Fails storing to a remote resource + +## Hierarchy + +- `Error` + + ↳ **`StorageError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](StorageError.md#constructor) + +### Properties + +- [payload](StorageError.md#payload) + +## Constructors + +### constructor + +• **new StorageError**(`message`, `payload?`) + +Creates a new instance of the StorageError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md new file mode 100644 index 00000000..5fdb25e0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md @@ -0,0 +1,71 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError + +# Class: UnknownSchemaError + +Schema could not be loaded + +## Hierarchy + +- `Error` + + ↳ **`UnknownSchemaError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnknownSchemaError.md#constructor) + +### Properties + +- [payload](UnknownSchemaError.md#payload) + +## Constructors + +### constructor + +• **new UnknownSchemaError**(`message`, `payload?`) + +Creates a new instance of the UnknownSchemaError class. + +#### Parameters + +| Name | Type | Description | +| :------------------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.schemaName` | `string` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :----------- | :------- | +| `schemaName` | `string` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md new file mode 100644 index 00000000..0964b138 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md @@ -0,0 +1,72 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError + +# Class: UnsupportedChainError + +This blockchain is not yet supported +Please file an issue + +## Hierarchy + +- `Error` + + ↳ **`UnsupportedChainError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnsupportedChainError.md#constructor) + +### Properties + +- [payload](UnsupportedChainError.md#payload) + +## Constructors + +### constructor + +• **new UnsupportedChainError**(`message`, `payload?`) + +Creates a new instance of the UnsupportedChainError class. + +#### Parameters + +| Name | Type | Description | +| :---------------- | :---------------------------------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.chainID` | `undefined` \| `string` \| `number` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :-------- | :---------------------------------- | +| `chainID` | `undefined` \| `string` \| `number` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md new file mode 100644 index 00000000..1b94a629 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md @@ -0,0 +1,278 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +A class that provides indexing functionality for Hypercerts. + +## Implements + +- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default-1.md#constructor) + +### Properties + +- [\_graphClient](internal.default-1.md#_graphclient) + +### Accessors + +- [graphClient](internal.default-1.md#graphclient) + +### Methods + +- [claimById](internal.default-1.md#claimbyid) +- [claimsByOwner](internal.default-1.md#claimsbyowner) +- [firstClaims](internal.default-1.md#firstclaims) +- [fractionById](internal.default-1.md#fractionbyid) +- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) +- [fractionsByOwner](internal.default-1.md#fractionsbyowner) + +## Constructors + +### constructor + +• **new default**(`options`) + +Creates a new instance of the `HypercertIndexer` class. + +#### Parameters + +| Name | Type | Description | +| :------------------ | :------- | :----------------------------------------- | +| `options` | `Object` | The configuration options for the indexer. | +| `options.graphUrl?` | `string` | - | + +#### Defined in + +[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) + +## Properties + +### \_graphClient + +• `Private` **\_graphClient**: `Object` + +The Graph client used by the indexer. + +#### Type declaration + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Defined in + +[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) + +## Accessors + +### graphClient + +• `get` **graphClient**(): `Object` + +Gets the Graph client used by the indexer. + +#### Returns + +`Object` + +The Graph client. + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Implementation of + +[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) + +#### Defined in + +[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) + +## Methods + +### claimById + +▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +Gets a claim by its ID. + +#### Parameters + +| Name | Type | Description | +| :--- | :------- | :------------------- | +| `id` | `string` | The ID of the claim. | + +#### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +A Promise that resolves to the claim. + +#### Implementation of + +HypercertIndexerInterface.claimById + +#### Defined in + +[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) + +--- + +### claimsByOwner + +▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +Gets the claims owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.claimsByOwner + +#### Defined in + +[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) + +--- + +### firstClaims + +▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +Gets the most recent claims. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :-------------------- | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.firstClaims + +#### Defined in + +[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) + +--- + +### fractionById + +▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +Gets a claim token by its ID. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------- | +| `fractionId` | `string` | The ID of the claim token. | + +#### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +A Promise that resolves to the claim token. + +#### Implementation of + +HypercertIndexerInterface.fractionById + +#### Defined in + +[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) + +--- + +### fractionsByClaim + +▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +Gets the claim tokens for a given claim. + +#### Parameters + +| Name | Type | Default value | Description | +| :-------- | :----------------------------------------- | :------------------- | :-------------------- | +| `claimId` | `string` | `undefined` | The ID of the claim. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByClaim + +#### Defined in + +[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) + +--- + +### fractionsByOwner + +▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +Gets the claim tokens owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByOwner + +#### Defined in + +[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md new file mode 100644 index 00000000..1538ce61 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md @@ -0,0 +1,131 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +The EasEvaluator class provides methods for signing off-chain attestations of evaluations. +Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. + +## Table of contents + +### Constructors + +- [constructor](internal.default-2.md#constructor) + +### Properties + +- [offChain](internal.default-2.md#offchain) +- [readonly](internal.default-2.md#readonly) +- [signer](internal.default-2.md#signer) + +### Methods + +- [getSignature](internal.default-2.md#getsignature) +- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) + +## Constructors + +### constructor + +• **new default**(`config`) + +Creates a new EasEvaluator instance. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | + +#### Defined in + +[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) + +## Properties + +### offChain + +• **offChain**: `Offchain` + +The Offchain instance used for signing off-chain attestations. + +#### Defined in + +[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +The TypedDataSigner instance used for signing typed data. + +#### Defined in + +[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) + +## Methods + +### getSignature + +▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> + +Gets a signature for an off-chain attestation. + +#### Parameters + +| Name | Type | Description | +| :------------ | :------- | :------------------------------------------------ | +| `encodedData` | `string` | The encoded data to sign. | +| `recipient` | `string` | The address of the recipient of the attestation. | +| `schemaUid` | `string` | The UID of the schema to use for the attestation. | + +#### Returns + +`Promise`<`SignedOffchainAttestation`\> + +- The signature for the attestation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) + +--- + +### signOfflineEvaluation + +▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> + +Signs an offline evaluation. + +**`Throws`** + +- If the evaluation data is malformed. + +#### Parameters + +| Name | Type | Description | +| :----------- | :----------------------------------------------- | :--------------------------- | +| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | + +#### Returns + +`Promise`<`undefined` \| `SignedOffchainAttestation`\> + +- The signature for the evaluation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md new file mode 100644 index 00000000..86daa5e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md @@ -0,0 +1,110 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +## Implements + +- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default.md#constructor) + +### Properties + +- [eas](internal.default.md#eas) +- [readonly](internal.default.md#readonly) +- [signer](internal.default.md#signer) +- [storage](internal.default.md#storage) + +### Methods + +- [submitEvaluation](internal.default.md#submitevaluation) + +## Constructors + +### constructor + +• **new default**(`config?`) + +#### Parameters + +| Name | Type | +| :------- | :------------------------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | + +#### Defined in + +[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) + +## Properties + +### eas + +• **eas**: [`default`](internal.default-2.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +#### Defined in + +[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) + +--- + +### storage + +• **storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) + +## Methods + +### submitEvaluation + +▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------------------------ | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | + +#### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Implementation of + +EvaluatorInterface.submitEvaluation + +#### Defined in + +[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md new file mode 100644 index 00000000..b4af6279 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md @@ -0,0 +1,39 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError + +# Interface: CustomError + +An interface for errors that have a specific type. + +## Implemented by + +- [`ClientError`](../classes/ClientError.md) +- [`ConfigurationError`](../classes/ConfigurationError.md) +- [`FetchError`](../classes/FetchError.md) +- [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) +- [`MalformedDataError`](../classes/MalformedDataError.md) +- [`MintingError`](../classes/MintingError.md) +- [`StorageError`](../classes/StorageError.md) +- [`UnknownSchemaError`](../classes/UnknownSchemaError.md) +- [`UnsupportedChainError`](../classes/UnsupportedChainError.md) + +## Table of contents + +### Properties + +- [payload](CustomError.md#payload) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Defined in + +[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md new file mode 100644 index 00000000..4606b46e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation + +# Interface: DuplicateEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) +- [explanation](DuplicateEvaluation.md#explanation) +- [realHypercert](DuplicateEvaluation.md#realhypercert) +- [type](DuplicateEvaluation.md#type) + +## Properties + +### duplicateHypercerts + +• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] + +#### Defined in + +[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) + +--- + +### explanation + +• **explanation**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) + +--- + +### realHypercert + +• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) + +--- + +### type + +• **type**: `"duplicate"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md new file mode 100644 index 00000000..205b7004 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation + +# Interface: EASEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](EASEvaluation.md#chainid) +- [contract](EASEvaluation.md#contract) +- [type](EASEvaluation.md#type) +- [uid](EASEvaluation.md#uid) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) + +--- + +### type + +• **type**: `"EAS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) + +--- + +### uid + +• **uid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md new file mode 100644 index 00000000..3dcea656 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -0,0 +1,167 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](HypercertClaimdata.md#contributors) +- [impact_scope](HypercertClaimdata.md#impact_scope) +- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) +- [rights](HypercertClaimdata.md#rights) +- [work_scope](HypercertClaimdata.md#work_scope) +- [work_timeframe](HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md new file mode 100644 index 00000000..0483b520 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -0,0 +1,341 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface + +# Interface: HypercertClientInterface + +The interface for the Hypercert client. + +## Hierarchy + +- [`HypercertClientMethods`](HypercertClientMethods.md) + +- [`HypercertClientState`](HypercertClientState.md) + + ↳ **`HypercertClientInterface`** + +## Implemented by + +- [`HypercertClient`](../classes/HypercertClient.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) +- [contract](HypercertClientInterface.md#contract) +- [createAllowlist](HypercertClientInterface.md#createallowlist) +- [indexer](HypercertClientInterface.md#indexer) +- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) +- [mintClaim](HypercertClientInterface.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) +- [readonly](HypercertClientInterface.md#readonly) +- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) +- [storage](HypercertClientInterface.md#storage) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md new file mode 100644 index 00000000..734ccbee --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -0,0 +1,239 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods + +# Interface: HypercertClientMethods + +The methods for the Hypercert client. + +## Hierarchy + +- **`HypercertClientMethods`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) +- [createAllowlist](HypercertClientMethods.md#createallowlist) +- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) +- [mintClaim](HypercertClientMethods.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md new file mode 100644 index 00000000..2d90a599 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState + +# Interface: HypercertClientState + +The state of the Hypercert client. + +## Hierarchy + +- **`HypercertClientState`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [contract](HypercertClientState.md#contract) +- [indexer](HypercertClientState.md#indexer) +- [readonly](HypercertClientState.md#readonly) +- [storage](HypercertClientState.md#storage) + +## Properties + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md new file mode 100644 index 00000000..6ebed93a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -0,0 +1,47 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema + +# Interface: HypercertEvaluationSchema + +Schema for evaluating Hypercerts across different sources and evaluation types + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [creator](HypercertEvaluationSchema.md#creator) +- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) +- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) + +## Properties + +### creator + +• **creator**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) + +--- + +### evaluationData + +• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) + +--- + +### evaluationSource + +• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md new file mode 100644 index 00000000..f18c409f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -0,0 +1,176 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface + +# Interface: HypercertIndexerInterface + +## Implemented by + +- [`default`](../classes/internal.default-1.md) + +## Table of contents + +### Properties + +- [claimById](HypercertIndexerInterface.md#claimbyid) +- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) +- [firstClaims](HypercertIndexerInterface.md#firstclaims) +- [fractionById](HypercertIndexerInterface.md#fractionbyid) +- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) +- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) +- [graphClient](HypercertIndexerInterface.md#graphclient) + +## Properties + +### claimById + +• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Type declaration + +▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +##### Parameters + +| Name | Type | +| :--- | :------- | +| `id` | `string` | + +##### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) + +--- + +### claimsByOwner + +• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) + +--- + +### firstClaims + +• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Type declaration + +▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) + +--- + +### fractionById + +• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +##### Parameters + +| Name | Type | +| :----------- | :------- | +| `fractionId` | `string` | + +##### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) + +--- + +### fractionsByClaim + +• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Type declaration + +▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `claimId` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) + +--- + +### fractionsByOwner + +• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) + +--- + +### graphClient + +• **graphClient**: `any` + +#### Defined in + +[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md new file mode 100644 index 00000000..d65362f3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md @@ -0,0 +1,123 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata + +# Interface: HypercertMetadata + +Claim data for hypercert. ERC1155 Metadata compliant + +## Table of contents + +### Properties + +- [allowList](HypercertMetadata.md#allowlist) +- [description](HypercertMetadata.md#description) +- [external_url](HypercertMetadata.md#external_url) +- [hypercert](HypercertMetadata.md#hypercert) +- [image](HypercertMetadata.md#image) +- [name](HypercertMetadata.md#name) +- [properties](HypercertMetadata.md#properties) +- [ref](HypercertMetadata.md#ref) +- [version](HypercertMetadata.md#version) + +## Properties + +### allowList + +• `Optional` **allowList**: `string` + +A CID pointer to the merke tree proof json on ipfs + +#### Defined in + +[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) + +--- + +### description + +• **description**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) + +--- + +### external_url + +• `Optional` **external_url**: `string` + +An url pointing to the external website of the project + +#### Defined in + +[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) + +--- + +### hypercert + +• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) + +#### Defined in + +[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) + +--- + +### image + +• **image**: `string` + +A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. + +#### Defined in + +[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) + +--- + +### name + +• **name**: `string` + +Identifies the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) + +--- + +### properties + +• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] + +#### Defined in + +[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) + +--- + +### ref + +• `Optional` **ref**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) + +--- + +### version + +• `Optional` **version**: `string` + +The version of Hypercert schema used to describe this hypercert + +#### Defined in + +[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md new file mode 100644 index 00000000..773c41d3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer + +# Interface: HypercertPointer + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](HypercertPointer.md#chainid) +- [claimId](HypercertPointer.md#claimid) +- [contract](HypercertPointer.md#contract) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) + +--- + +### claimId + +• **claimId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md new file mode 100644 index 00000000..8ffda51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -0,0 +1,130 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface + +# Interface: HypercertStorageInterface + +The interface for the Hypercert storage layer. + +## Implemented by + +- [`HypercertsStorage`](../classes/HypercertsStorage.md) + +## Table of contents + +### Properties + +- [getData](HypercertStorageInterface.md#getdata) +- [getMetadata](HypercertStorageInterface.md#getmetadata) +- [storeData](HypercertStorageInterface.md#storedata) +- [storeMetadata](HypercertStorageInterface.md#storemetadata) + +## Properties + +### getData + +• **getData**: (`cidOrIpfsUri`: `string`) => `Promise`<`unknown`\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<`unknown`\> + +Retrieves arbitrary data from IPFS. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | + +##### Returns + +`Promise`<`unknown`\> + +A Promise that resolves to the retrieved data. + +#### Defined in + +[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) + +--- + +### getMetadata + +• **getMetadata**: (`cidOrIpfsUri`: `string`) => `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +Retrieves the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :----------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | + +##### Returns + +`Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +A Promise that resolves to the retrieved metadata. + +#### Defined in + +[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) + +--- + +### storeData + +• **storeData**: (`data`: `unknown`) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`data`): `Promise`<`CIDString`\> + +Stores arbitrary data on IPFS. + +##### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Defined in + +[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) + +--- + +### storeMetadata + +• **storeMetadata**: (`metadata`: [`HypercertMetadata`](HypercertMetadata.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`metadata`): `Promise`<`CIDString`\> + +Stores the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------------ | :--------------------- | +| `metadata` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Defined in + +[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md new file mode 100644 index 00000000..5f5871f2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -0,0 +1,34 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation + +# Interface: IPFSEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [cid](IPFSEvaluation.md#cid) +- [type](IPFSEvaluation.md#type) + +## Properties + +### cid + +• **cid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) + +--- + +### type + +• **type**: `"IPFS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md new file mode 100644 index 00000000..3e4b3b92 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation + +# Interface: SimpleTextEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [hypercert](SimpleTextEvaluation.md#hypercert) +- [text](SimpleTextEvaluation.md#text) +- [type](SimpleTextEvaluation.md#type) + +## Properties + +### hypercert + +• **hypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) + +--- + +### text + +• **text**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) + +--- + +### type + +• **type**: `"simpleText"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md new file mode 100644 index 00000000..53ac36ed --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md @@ -0,0 +1,43 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface + +# Interface: EvaluatorInterface + +[internal](../modules/internal.md).EvaluatorInterface + +## Implemented by + +- [`default`](../classes/internal.default.md) + +## Table of contents + +### Properties + +- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) + +## Properties + +### submitEvaluation + +• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +##### Parameters + +| Name | Type | Description | +| :----------- | :---------------------------------------------------------- | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | + +##### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Defined in + +[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md new file mode 100644 index 00000000..273912bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md @@ -0,0 +1,169 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +[internal](../modules/internal.md).HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](internal.HypercertClaimdata.md#contributors) +- [impact_scope](internal.HypercertClaimdata.md#impact_scope) +- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) +- [rights](internal.HypercertClaimdata.md#rights) +- [work_scope](internal.HypercertClaimdata.md#work_scope) +- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md new file mode 100644 index 00000000..3f4ea346 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md @@ -0,0 +1,17 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter + +# Interface: HypercertMinter + +[internal](../modules/internal.md).HypercertMinter + +Hypercert contract interface. + +**`Notice`** + +hacky loop to get typedoc to generate all the docs + +## Hierarchy + +- `HypercertMinter` + + ↳ **`HypercertMinter`** diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md new file mode 100644 index 00000000..15998930 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md @@ -0,0 +1,638 @@ +[Hypercerts SDK Documentation](README.md) / Exports + +# Hypercerts SDK Documentation + +## Table of contents + +### References + +- [Claim](modules.md#claim) +- [ClaimToken](modules.md#claimtoken) +- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) + +### Modules + +- [internal](modules/internal.md) + +### Classes + +- [ClientError](classes/ClientError.md) +- [ConfigurationError](classes/ConfigurationError.md) +- [FetchError](classes/FetchError.md) +- [HypercertClient](classes/HypercertClient.md) +- [HypercertsStorage](classes/HypercertsStorage.md) +- [InvalidOrMissingError](classes/InvalidOrMissingError.md) +- [MalformedDataError](classes/MalformedDataError.md) +- [MintingError](classes/MintingError.md) +- [StorageError](classes/StorageError.md) +- [UnknownSchemaError](classes/UnknownSchemaError.md) +- [UnsupportedChainError](classes/UnsupportedChainError.md) + +### Interfaces + +- [CustomError](interfaces/CustomError.md) +- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) +- [EASEvaluation](interfaces/EASEvaluation.md) +- [HypercertClaimdata](interfaces/HypercertClaimdata.md) +- [HypercertClientInterface](interfaces/HypercertClientInterface.md) +- [HypercertClientMethods](interfaces/HypercertClientMethods.md) +- [HypercertClientState](interfaces/HypercertClientState.md) +- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) +- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) +- [HypercertMetadata](interfaces/HypercertMetadata.md) +- [HypercertPointer](interfaces/HypercertPointer.md) +- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) +- [IPFSEvaluation](interfaces/IPFSEvaluation.md) +- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) + +### Type Aliases + +- [AllowlistEntry](modules.md#allowlistentry) +- [Deployment](modules.md#deployment) +- [EvaluationData](modules.md#evaluationdata) +- [EvaluationSource](modules.md#evaluationsource) +- [HypercertClientConfig](modules.md#hypercertclientconfig) +- [HypercertClientProps](modules.md#hypercertclientprops) +- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) +- [HypercertStorageConfig](modules.md#hypercertstorageconfig) +- [HypercertsSdkError](modules.md#hypercertssdkerror) +- [QueryParams](modules.md#queryparams) +- [SupportedChainIds](modules.md#supportedchainids) +- [TransferRestrictions](modules.md#transferrestrictions) + +### Properties + +- [ClaimByIdQuery](modules.md#claimbyidquery) + +### Variables + +- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) +- [TransferRestrictions](modules.md#transferrestrictions-1) + +### Functions + +- [execute](modules.md#execute) +- [formatDate](modules.md#formatdate) +- [formatHypercertData](modules.md#formathypercertdata) +- [formatUnixTime](modules.md#formatunixtime) +- [validateAllowlist](modules.md#validateallowlist) +- [validateClaimData](modules.md#validateclaimdata) +- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) +- [validateMetaData](modules.md#validatemetadata) +- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) +- [verifyMerkleProof](modules.md#verifymerkleproof) +- [verifyMerkleProofs](modules.md#verifymerkleproofs) + +## References + +### Claim + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimToken + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimTokensByClaimQuery + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +## Type Aliases + +### AllowlistEntry + +Ƭ **AllowlistEntry**: `Object` + +Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol + +**`Param`** + +Address of the recipient + +**`Param`** + +Number of units allocated to the recipient + +#### Type declaration + +| Name | Type | +| :-------- | :------------- | +| `address` | `string` | +| `units` | `BigNumberish` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) + +--- + +### Deployment + +Ƭ **Deployment**: `Object` + +Represents a deployment of a contract on a specific network. + +#### Type declaration + +| Name | Type | Description | +| :---------------- | :------- | :--------------------------------------------------------------------------------------- | +| `chainId` | `number` | The ID of the network on which the contract is deployed. | +| `chainName` | `string` | The name of the network on which the contract is deployed. | +| `contractAddress` | `string` | The address of the deployed contract. | +| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | + +#### Defined in + +[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) + +--- + +### EvaluationData + +Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) + +This file was automatically generated by json-schema-to-typescript. +DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +and run json-schema-to-typescript to regenerate this file. + +#### Defined in + +[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) + +--- + +### EvaluationSource + +Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) + +--- + +### HypercertClientConfig + +Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } + +Configuration options for the Hypercert client. + +#### Defined in + +[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) + +--- + +### HypercertClientProps + +Ƭ **HypercertClientProps**: `Object` + +The props for the Hypercert client. + +#### Type declaration + +| Name | Type | Description | +| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | +| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | + +#### Defined in + +[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) + +--- + +### HypercertEvaluatorConfig + +Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } + +Configuration options for the Hypercert evaluator. + +**`Note`** + +The signer is required for submitting evaluations. + +#### Defined in + +[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) + +--- + +### HypercertStorageConfig + +Ƭ **HypercertStorageConfig**: `Object` + +Configuration options for the Hypercert storage layer. + +**`Note`** + +The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. + +#### Type declaration + +| Name | Type | Description | +| :------------------ | :------- | :------------------------------ | +| `nftStorageToken?` | `string` | The API token for NFT.storage. | +| `web3StorageToken?` | `string` | The API token for Web3.storage. | + +#### Defined in + +[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) + +--- + +### HypercertsSdkError + +Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) + +#### Defined in + +[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) + +--- + +### QueryParams + +Ƭ **QueryParams**: `Object` + +#### Index signature + +▪ [key: `string`]: `any` + +#### Type declaration + +| Name | Type | +| :---------------- | :------------------ | +| `first` | `number` | +| `orderDirections` | `"asc"` \| `"desc"` | +| `skip` | `number` | + +#### Defined in + +[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) + +--- + +### SupportedChainIds + +Ƭ **SupportedChainIds**: `5` \| `10` + +#### Defined in + +[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) + +--- + +### TransferRestrictions + +Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Properties + +### ClaimByIdQuery + +• **ClaimByIdQuery**: `any` + +## Variables + +### INDEFINITE_DATE_STRING + +• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` + +#### Defined in + +[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) + +--- + +### TransferRestrictions + +• `Const` **TransferRestrictions**: `Object` + +Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol + +**`Dev`** + +AllowAll: All transfers are allowed + +**`Dev`** + +DisallowAll: All transfers are disallowed + +**`Dev`** + +FromCreatorOnly: Only the creator can transfer the Hypercert + +#### Type declaration + +| Name | Type | +| :---------------- | :--- | +| `AllowAll` | `0` | +| `DisallowAll` | `1` | +| `FromCreatorOnly` | `2` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Functions + +### execute + +▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------- | +| `document` | `GraphQLOperation`<`any`, `any`\> | +| `variables` | `any` | +| `context?` | `any` | +| `rootValue?` | `any` | +| `operationName?` | `string` | + +#### Returns + +`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Defined in + +node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 + +--- + +### formatDate + +▸ **formatDate**(`date`): `string` + +#### Parameters + +| Name | Type | +| :----- | :----- | +| `date` | `Date` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) + +--- + +### formatHypercertData + +▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) + +Formats input data to an object containing HypercertMetadata including appropriate labels + +#### Parameters + +| Name | Type | +| :----------------------- | :----------------------------------------------- | +| `«destructured»` | `Object` | +| › `contributors` | `string`[] | +| › `description` | `string` | +| › `excludedImpactScope` | `string`[] | +| › `excludedRights` | `string`[] | +| › `excludedWorkScope` | `string`[] | +| › `external_url?` | `string` | +| › `image` | `string` | +| › `impactScope` | `string`[] | +| › `impactTimeframeEnd` | `number` | +| › `impactTimeframeStart` | `number` | +| › `name` | `string` | +| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | +| › `rights` | `string`[] | +| › `version` | `string` | +| › `workScope` | `string`[] | +| › `workTimeframeEnd` | `number` | +| › `workTimeframeStart` | `number` | + +#### Returns + +[`FormatResult`](modules/internal.md#formatresult) + +#### Defined in + +[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) + +--- + +### formatUnixTime + +▸ **formatUnixTime**(`seconds`): `string` + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `seconds` | `number` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) + +--- + +### validateAllowlist + +▸ **validateAllowlist**(`data`, `units`): `Object` + +Validates the data for an allowlist. + +#### Parameters + +| Name | Type | Description | +| :------ | :---------------------------------------------- | :------------------------------------------ | +| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | +| `units` | `BigNumberish` | The total number of units in the allowlist. | + +#### Returns + +`Object` + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +| Name | Type | +| :------- | :------------------------------------------ | +| `errors` | `Record`<`string`, `string` \| `string`[]\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) + +--- + +### validateClaimData + +▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :------------------------------------------------------- | :-------------------- | +| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) + +--- + +### validateDuplicateEvaluationData + +▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a duplicate evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :--------------------------------------------------------- | :-------------------- | +| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) + +--- + +### validateMetaData + +▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------- | :-------------------- | +| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) + +--- + +### validateSimpleTextEvaluationData + +▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------------- | :-------------------- | +| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) + +--- + +### verifyMerkleProof + +▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` + +Verifies a Merkle proof for a given address and units. + +**`Throws`** + +If the Merkle proof verification fails. + +#### Parameters + +| Name | Type | Description | +| :-------------- | :------------- | :-------------------------------------- | +| `root` | `string` | The Merkle root hash to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish` | The units to verify. | +| `proof` | `string`[] | The Merkle proof to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) + +--- + +### verifyMerkleProofs + +▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` + +Batch verifies Merkle proofs for multiple roots, units and proofs for a single address + +**`Throws`** + +If the Merkle proof verification fails. + +**`Notice`** + +Wrapper around `verifyMerkleProof` to batch verify multiple proofs + +#### Parameters + +| Name | Type | Description | +| :-------------- | :--------------- | :---------------------------------------- | +| `roots` | `string`[] | The Merkle root hashes to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish`[] | The units to verify. | +| `proofs` | `string`[][] | The Merkle proofs to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md new file mode 100644 index 00000000..d20a3804 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md @@ -0,0 +1,307 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal + +# Module: internal + +## Table of contents + +### Classes + +- [default](../classes/internal.default.md) +- [default](../classes/internal.default-1.md) +- [default](../classes/internal.default-2.md) + +### Interfaces + +- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) +- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) +- [HypercertMinter](../interfaces/internal.HypercertMinter.md) + +### Type Aliases + +- [Claim](internal.md#claim) +- [ClaimByIdQuery](internal.md#claimbyidquery) +- [ClaimToken](internal.md#claimtoken) +- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) +- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) +- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) +- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) +- [Exact](internal.md#exact) +- [FormatResult](internal.md#formatresult) +- [InputMaybe](internal.md#inputmaybe) +- [Maybe](internal.md#maybe) +- [OrderDirection](internal.md#orderdirection) +- [RecentClaimsQuery](internal.md#recentclaimsquery) +- [Scalars](internal.md#scalars) +- [ValidationResult](internal.md#validationresult) + +## Type Aliases + +### Claim + +Ƭ **Claim**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | +| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | + +#### Defined in + +[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) + +--- + +### ClaimByIdQuery + +Ƭ **ClaimByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | + +#### Defined in + +[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) + +--- + +### ClaimToken + +Ƭ **ClaimToken**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :--------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `claim` | [`Claim`](internal.md#claim) | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | + +#### Defined in + +[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) + +--- + +### ClaimTokenByIdQuery + +Ƭ **ClaimTokenByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | + +#### Defined in + +[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) + +--- + +### ClaimTokensByClaimQuery + +Ƭ **ClaimTokensByClaimQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :------------------------------------------------------------------------------------------------------------------ | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) + +--- + +### ClaimTokensByOwnerQuery + +Ƭ **ClaimTokensByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | + +#### Defined in + +[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) + +--- + +### ClaimsByOwnerQuery + +Ƭ **ClaimsByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) + +--- + +### Exact + +Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } + +#### Type parameters + +| Name | Type | +| :--- | :--------------- | +| `T` | extends `Object` | + +#### Defined in + +[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) + +--- + +### FormatResult + +Ƭ **FormatResult**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------ | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | +| `errors` | `Record`<`string`, `string`\> \| `null` | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) + +--- + +### InputMaybe + +Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) + +--- + +### Maybe + +Ƭ **Maybe**<`T`\>: `T` \| `null` + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) + +--- + +### OrderDirection + +Ƭ **OrderDirection**: `"asc"` \| `"desc"` + +Defines the order direction, either ascending or descending + +#### Defined in + +[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) + +--- + +### RecentClaimsQuery + +Ƭ **RecentClaimsQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) + +--- + +### Scalars + +Ƭ **Scalars**: `Object` + +All built-in and custom scalars, mapped to their actual values + +#### Type declaration + +| Name | Type | +| :----------- | :-------- | +| `BigDecimal` | `any` | +| `BigInt` | `any` | +| `Boolean` | `boolean` | +| `Bytes` | `any` | +| `Float` | `number` | +| `ID` | `string` | +| `Int` | `number` | +| `Int8` | `any` | +| `String` | `string` | + +#### Defined in + +[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) + +--- + +### ValidationResult + +Ƭ **ValidationResult**: `Object` + +The result of a validation. + +**`Property`** + +Whether the data is valid. + +**`Property`** + +A map of errors, where the key is the field that failed validation and the value is the error message. + +#### Type declaration + +| Name | Type | +| :------- | :---------------------------- | +| `errors` | `Record`<`string`, `string`\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md new file mode 100644 index 00000000..b591d11d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md @@ -0,0 +1,12 @@ +# Burning + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Burning fraction tokens + +You can only burn fraction tokens that you own. Hypercert claims cannot be burned once minted. +You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). + +```js +const txn = await hypercerts.burnFraction({ tokenId }); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md new file mode 100644 index 00000000..b26fc0e8 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md @@ -0,0 +1,112 @@ +# Hypercert Client Configuration + +The client provides a high level interface that communicates with the Graph, IPFS and the evm. For easy setup we harmonised the configuration into a flow that allows for configuration with different levels of specificity. + +## Configuration + +### Setup + +The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: + +1. Overrides declared in `Partial` +2. Environment variables exposed via `process.env` + +Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. + +We then process the rest of the overrides and possible environment variables to customise the default configuration. + +To get started quickly you can either: + +- set `process.env.DEFAULT_CHAIN_ID` to 5 or 10 +- initialize a new client by calling `new HypercertClient({chainId: 5})` (or 10) + +Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without an operator. +- The client was initialized with an operator without signing abilities. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the read-only property of the `HypercertClient` instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" + } +} +``` + +You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. + +### Client config properties + +| Property | Type | Description | +| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `graphUrl` | `string` | The url of the subgraph to use. | +| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +### Environment variables + +You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. + +We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +In your `.env` file: + +```bash +LOG_LEVEL="info" +``` + +The SDK logger supports four log levels: `error`, `warn`, `info`, and `debug`. + +- The `error` log level is used to log errors that occur in the SDK. +- The `warn` log level is used to log warnings that do not necessarily indicate an error, but may be important to investigate. +- The `info` log level is used to log general information about the SDK's state or behavior. +- The `debug` log level is used to log detailed information that is useful for debugging purposes. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md new file mode 100644 index 00000000..60f4e5e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md @@ -0,0 +1,18 @@ +# Errors in the SDK + +Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. + +### Handling Errors + +To support debugging we've implemented some custom errors. + +| Error | Reason | Payload | +| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | +| ClientError | An error caused by the client | `{ [key: string]: unknown }` | +| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | +| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | +| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | +| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | +| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | +| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | +| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md new file mode 100644 index 00000000..c5399a4f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md @@ -0,0 +1,13 @@ +# Evaluations + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Respond / or contest an evaluation + +To create an evaluation of a hypercert + +```js +TODO; +``` + +_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md new file mode 100644 index 00000000..d5ff1226 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md @@ -0,0 +1,57 @@ +# Minting + +## Token design + +Hypercerts are semi-fungible tokens. +Thus, each hypercert is represented on-chain by a group of fraction tokens, +each representing a fraction of ownership over the hypercert. +If you want to split your fraction token, or merge multiple tokens into one, +check out the section on [splitting and merging](./split-merge.md). + +## Minting your first hypercert + +To mint a hypercert you need to provide the `metadata`, total amount of `units` and the preferred `TransferRestrictions`. +The resulting hypercert will be wholly owned by the creator. + +```js +import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" + +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; + +const tx: Promise = await hypercerts.mintClaim({ + metadata, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **Note** If you did not initialize your HypercertsClient with an `operator`, `nftStorageToken` and `web3StorageToken`, the client will run in [read-only mode](#read-only-mode) and this will fail. + +Let's see what happens under the hood: + +First, `mintClaim` checks that the client is not `read only` and that the operator is a `Signer`. If not, it throws an `InvalidOrMissingError`. + +Next, the function validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. The function then stores the metadata on `IPFS` using the `storeMetadata` method and returns the `CID` for the metadata. + +Finally, we call the mintClaim function on the contract with the signer `address`, total `units`, `CID`, and `transfer restriction` as parameters. If `overrides` are provided, the function uses them to send the transaction. Otherwise, it sends the transaction without overrides. + +## Transfer restrictions + +When minting a Hypercert, you must pass in a `TransferRestriction` policy. For now there are only 3 implemented policies: + +```js +enum TransferRestrictions { + // Unrestricted + AllowAll, + // All transfers disabled after minting + DisallowAll, + // Only the original creator can transfer + FromCreatorOnly +} +``` + +## Reference + +See the [code](https://github.com/hypercerts-org/hypercerts/tree/main/sdk/src/client.ts) +for more details on how we implement minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md new file mode 100644 index 00000000..98ebbb83 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md @@ -0,0 +1,306 @@ +# Querying + +## Overview + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph. + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the `storage`, `indexer`, and `contract` getters, the HypercertClient allows developers to easily interact with the various components of the Hypercert system directly. +For example, a developer could use the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the contract. + +## Indexer + +For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. + +### Live graph playground + +To inspect the subgraph and explore queries, have a look at the Graph playground for Goerli testnet and Optimism mainnet: + +- [Goerli dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) +- [Optimism dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) + +### Graph client + +Since the client is fully typed, it's easy to explore the functionalities using code completion in IDEs. + +Here's one example from our frontend where we let [react-query](https://www.npmjs.com/package/%2540tanstack/react-query) frequently update the call to the graph: + +```js +import { useHypercertClient } from "./hypercerts-client"; +import { useQuery } from "@tanstack/react-query"; + +export const useFractionsByOwner = (owner: string) => { + const { + client: { indexer }, + } = useHypercertClient(); + + return useQuery( + ["hypercerts", "fractions", "owner", owner], + () => indexer.fractionsByOwner(owner), + { enabled: !!owner, refetchInterval: 5000 }, + ); +}; +``` + +### Queries: Claims + +These tables show the input parameters and output fields for each of the GraphQL queries in [claims.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/claims.graphql). +A claim represents 1 Hypercert and all of the common data across all claim/fraction tokens. + +#### `ClaimsByOwner` + +The `ClaimsByOwner` query retrieves an array of claims that belong to a specific owner. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claims to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `RecentClaims` + +The RecentClaims query retrieves an array of the most recent claims on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | ---------------------------------- | ------------- | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `ClaimByID` + +The ClaimById query retrieves a single claim by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------- | +| `id` | `ID!` | The ID of the claim to retrieve. | + +##### Output + +The query returns a claim object that matches the input parameter. The claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +### Queries: Fractions + +These tables show the input parameters and output fields for each of the GraphQL queries in [fractions.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/fractions.graphql). +A claim token represents a fraction of ownership of a Hypercert. + +#### `ClaimTokensByOwner` + +The `ClaimTokensByOwner` query retrieves an array of claim tokens that belong to a specific owner on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claim tokens to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ------------------------------------------ | +| `chainName` | `String` | The name of the chain. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +#### `ClaimTokensByClaim` + +The `ClaimTokensByClaim` query retrieves an array of claim tokens that belong to a specific claim on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `claimId` | `String!` | The ID of the claim whose claim tokens to retrieve. | None | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | + +#### `ClaimTokenById` Query + +The `ClaimTokenById` query retrieves a single claim token by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------------- | +| `id` | `ID!` | The ID of the claim token to retrieve. | + +##### Output + +The query returns a claim token object that matches the input parameter. The claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +## Storage + +### Hypercert Metadata + +Currently, all metadata is stored off-chain in IPFS. Use the `storage` client to retrieve the metadata + +```js +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const { indexer, storage } = hypercertsClient; +// Get the on-chain claim +const claimById = await indexer.claimById(claimId); +// Get the off-chain metadata +const metadata = await storage.getMetadata(claimById.claim.uri); +``` + +## Contract + +### Typechain bindings + +We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, +which you can import and use from your TypeScript/JavaScript codebase. + +For example: + +```js +import { ethers } from "ethers"; +import { + HyperCertMinterFactory, + HypercertMinterABI, + IHypercertTokenABI, +} from "@hypercerts-org/sdk"; + +const provider = new ethers.getDefaultProvider(network); +const contractInterface = new ethers.utils.Interface(HypercertMinterABI); +const contract = new ethers.Contract( + contractAddress, + HypercertMinterABI, + provider, +); +const metadataUri = await contract.functions.uri(tokenId); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md new file mode 100644 index 00000000..936cc05b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md @@ -0,0 +1,101 @@ +# Getting started with JavaScript + +The Hypercerts SDK makes it easy to integrate Hypercerts into your application or backend with JavaScript/TypeScript. + +## Installation + +Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +# OR yarn add @hypercerts-org/sdk +``` + +## Get storage credentials (only required for minting) + +For now, we store all metadata (e.g. Hypercert claim data) on IPFS using [NFT.Storage](https://nft.storage/) and [web3.storage](https://web3.storage/). + +In order to mint a Hypercert, you will need to create API tokens for both services, which you can learn more about from their respective guides: + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +_Note: In the future, we want to also support other mechanisms for storing off-chain data._ + +## Initialize + +Import the SDK into your project and create a new instance of `HypercertClient` with your configuration options: + +```js +import { HypercertClient } from "@hypercerts-org/sdk"; +import { ethers } from "ethers"; + +// NOTE: you should replace this with your own JSON-RPC provider to the network +// This should have signing abilities and match the `chainId` passed into HypercertClient +const operator = ethers.providers.getDefaultProvider("goerli"); + +const client = new HypercertClient({ + chainId: 5, // goerli testnet + operator, + nftStorageToken, + web3StorageToken, +}); +``` + +Hypercerts is a multi-chain protocol. +See [here](./supported-networks.md) for a list of currently supported networks. + +> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). + +## Make a Hypercert + +Use the client object to interact with the Hypercert network. For example, you can use the `client.mintClaim` method to create a new claim: + +```js +import { + formatHypercertData, + TransferRestrictions, +} from "@hypercerts-org/sdk"; + +// Validate and format your Hypercert metadata +const { data: metadata, valid, errors } = formatHypercertData({ + name, + ... +}) + +// Check on errors +if (!valid) { + return console.error(errors); +} + +// Set the total amount of units available +const totalUnits: BigNumberish = 10_000_000 + +// Define the transfer restriction +const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly + +// Mint your Hypercert! +const tx = await client.mintClaim( + metadata, + totalUnits, + transferRestrictions, +); +``` + +For guidance on how to specify your metadata, see the [minting guide](../minting-guide/step-by-step.md). +This will validate the metadata, store claim metadata on IPFS, create a new hypercert on-chain, and return a transaction receipt. + +For more details, check out the [Minting Guide](./minting.md). + +## Query for Hypercerts + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more details, checkout the [Querying guide](./querying.md) +and our [Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md new file mode 100644 index 00000000..409a1e9d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md @@ -0,0 +1,41 @@ +# Getting started with Solidity + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +If you need the Solidity contracts or interfaces exported from the SDK, +please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Hypercerts deployments + +Hypercerts is a multi-chain protocol and we want to support any network that wants to make positive impact. +We plan to support at most 1 canonical contract deployment per network. +For a complete list of deployments and their contract addresses, see [Supported Networks](./supported-networks.md). + +## Installing the Hypercert contracts + +```bash +npm install @hypercerts-org/contracts +# or yarn add @hypercerts-org/contracts +``` + +## Using the Solidity interface + +If you want to call the Hypercerts contract on your network directly from Solidity, +we export the interface/ABI for you to use from your contract. + +```js +import { IHypercertToken } from "@hypercerts-org/contracts/IHypercertMinter.sol"; + +contract MyContract { + IHypercertToken hypercerts; + + function initialize(address _addr) public virtual initializer { + hypercerts = IHypercertToken(_addr); + } + + function uri(uint256 tokenID) public view returns (string memory _uri) { + _uri = hypercerts.uri(tokenID); + } +} + +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md new file mode 100644 index 00000000..1ac5556e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md @@ -0,0 +1,29 @@ +# Split and Merge + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## By Token Value + +### Split / merge token values + +```js +const { tokenIds } = await hypercerts.splitFraction({ + tokenId, + units: [10, 12, 15], +}); +const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); +``` + +## By Claim Data + +### Split / merge claim data + +```js +const { claimIds } = await hypercerts.splitClaim({ + claimId, + TODO: somehow specify hypercert subregions +}); +const { claimId} = await hypercerts.mergeClaims({ + claimIds, +}); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md new file mode 100644 index 00000000..3bfd0f18 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md @@ -0,0 +1,13 @@ +# Supported networks + +Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. + +We want to support every network that wants to support positive impact! +If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Overview + +| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | +| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | +| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | +| Optimism | 10 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md new file mode 100644 index 00000000..72b3ee2d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md @@ -0,0 +1,120 @@ +# Deploy a new proxy contract + +This should be done only on rare occasions. For example, when: + +- We want to deploy to a new network +- We have updated the contract in a way that is _NOT_ backwards-compatible. + - For most upgrades, please use UUPS [upgrades](./upgrade.md). + +## Smart Contracts + +### Setup the `contracts/` environment + +Navigate to `contracts/`. Configure your `.env` file by following the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/contracts#setup). + +### Build and deploy the smart contracts + +If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. + +```javascript + "optimism-goeri": getChainConfig("optimism-goerli"), +``` + +Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. + +```sh +# Run in contracts/ +yarn build:hardhat +yarn hardhat deploy --network NETWORK +``` + +This will output the new proxy address. Update the root `README.md` with this new address. + +Now transfer ownership over the proxy contract to the multisig: + +```sh +yarn hardhat transfer-owner --network NETWORK --proxy PROXY_CONTRACT_ADDRESS --owner MULTISIG_ADDRESS +``` + +## Subgraph + +### Setup the `graph/` environment + +Navigate to `graph/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/graph#setup) +to get set up. + +### Deploy the subgraph + +Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). + +Now deploy the subgraph + +```sh +# Run in graph/ +yarn build +yarn deploy:hosted +``` + +## OpenZeppelin Defender + +### Create a new Supabase table + +Log into the [Supabase dashboard](https://app.supabase.com/). +We store all data in a single project, but use different tables for each network. +The table name should be suffixed by the network (e.g. `allowlistCache-goerli`). +If you are deploying to a new network, create a new table. You can copy the table schema and RLS policy from another pre-existing table. + +If you are deploying a new proxy contract to a network for which you already have another deployment, you'll have to make a judgement call as to whether you can reuse the existing table, whether you need to clear the existing table, or create another table. + +Note: We want to merge all the tables in this [issue](https://github.com/hypercerts-org/hypercerts/issues/477). + +### Update the OpenZeppelin Defender scripts + +Modify the Defender scripts to support the new network in `defender/src/networks.ts`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. + +Note: The entry point for deployment is in `defender/src/setup.ts`. + +### Setup the `defender/` environment + +Navigate to `defender/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/defender#setup) +to get set up. + +### Deploy defender scripts + +Deploy to OpenZeppelin Defender via + +```sh +# Run in defender/ +yarn deploy +``` + +## Hypercerts SDK + +TODO: Flesh this out + +Run the build in `contracts/`. + +(Soon to be deprecated) Publish `contracts/` to npm + +Configure the SDK to support the new network via the graphclient. + +Publish SDK to npm + +## Deploy the Dapp frontend + +Each frontend build is configured to run on a different network (e.g. `https://testnet.hypercerts.org`). You can use any CDN to serve the site (e.g. Netlify, Vercel, GitHub Pages, Cloudflare Pages, Fleek, Firebase Hosting). + +1. Configure your build environment with the environment variables specified in `frontend/.env.local.example`. + +2. Configure your builds to the following settings: + +- Build command: `yarn build:site` +- Build output directory: `/build` +- Root directory: `/` + +3. Configure the domain that you want for your build. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md new file mode 100644 index 00000000..05dc5b0c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md @@ -0,0 +1,45 @@ +# Errors + +## Deploying + +### Artifact for contract "HypercertMinter" not found + +#### Error message + +`Error HH700: Artifact for contract "HypercertMinter" not found.` + +#### Cause + +Attempting to deploy a contract with `npx hardhat deploy` before the contract has been compiled by hardhat. Contracts compiled by forge are currently not visible to hardhat (this could be a configuration problem). + +### insufficient funds for intrinsic transaction cost + +#### Error message + +`Error: insufficient funds for intrinsic transaction cost` + +#### Cause + +The environment variable `MNEMONIC` is not configured correctly. + +Alternatively, the wallet may not have enough funds for the selected network + +Causing pause twice + +Error: cannot estimate gas; transaction may fail or may require manual gas limit + +reason: 'execution reverted: Pausable: paused', + +#### Etherscan API + +Note: It can take between 5-10 minutes before a newly created etherscan API key becomes valid for queries to goerli. + +When using an etherscan API key that was too recently created, hardhat tasks using etherscan to verify transactions will exit with an error message: + +`Etherscan returned with message: NOTOK, reason: Invalid API Key` + +Despite this error the transaction may have succeeded, the hardhat task just can't confirm it. + +It is unknown if this is a problem for queries to mainnet as well. + +Metamask makes it very difficult to have multiple wallets. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md new file mode 100644 index 00000000..9b208595 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md @@ -0,0 +1,18 @@ +# DevOps + +We use this playbook to encapsulate our practices and current setup. + +## Setup dev environment + +- [Setup guide](./setup.md) +- [Plasmic setup](./plasmic.md) + +## Tasks + +- [Deploy new proxy contract](./deploy-proxy.md) +- [Upgrade contract](./upgrade.md) +- [Pause contract](./pause.md) + +## FAQ + +- [Common errors](./errors.md) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md new file mode 100644 index 00000000..2668f51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md @@ -0,0 +1,29 @@ +# Pause / Unpause + +## Pause + +### Contract owned by an address + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat pause --network NETWORK --address CONTRACT_ADDRESS +``` + +### Contract owned by a multi-sig + +If we transferred ownership to a multisig, we can use +[OpenZeppelin Defender Admin](https://defender.openzeppelin.com/#/admin) +to propose a pause to be approved by the multisig. + +## Unpause + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat unpause --network NETWORK --address CONTRACT_ADDRESS +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md new file mode 100644 index 00000000..10e52f5b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md @@ -0,0 +1,76 @@ +# Plasmic setup + +## HypercertImage + +### Props + +hideImpact + +``` +$ctx.currentForm.impactTimeEnd === "indefinite" && ($ctx.currentForm.impactScopes.length === 0 || ($ctx.currentForm.impactScopes.length === 1 && $ctx.currentForm.impactScopes[0] === "all")) +``` + +color + +``` +$ctx.currentForm.backgroundColor +``` + +vectorart + +``` +$ctx.currentForm.backgroundVectorArt +``` + +### Slots + +logoImage Image URL + +``` +$ctx.currentForm.logoUrl +``` + +title Content + +``` +$ctx.currentForm.name +``` + +workPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.workTimeEnd.format ? $ctx.currentForm.workTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.workTimeEnd}` +``` + +bannerImage Image URL + +``` +$ctx.currentForm.bannerUrl +``` + +impactPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.impactTimeEnd.format ? $ctx.currentForm.impactTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.impactTimeEnd}` +``` + +#### workScopes: repeated ScopeChip + +Collection + +``` +$ctx.currentForm.workScopes.split(/[,\n]/).map(i => i.trim()).filter(i => !!i) +``` + +Element name: `currentWorkScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentWorkScope` + +#### impactScopes: repeated ScopeChip + +Collection: `$ctx.currentForm.impactScopes` +Element name: `currentImpactScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentImpactScope` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md new file mode 100644 index 00000000..afb95296 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md @@ -0,0 +1,41 @@ +# Setup + +## Pre-requisites + +1. Install [NodeJS](https://nodejs.org/en/) and [git](https://git-scm.com/) +2. Install [yarn](https://classic.yarnpkg.com/) + +```sh +npm install --global yarn +``` + +3. Clone the repository: + +``` +git clone git@github.com:hypercerts-org/hypercerts.git +cd hypercerts +``` + +4. Install dependancies: + +To install dependencies across all projects in the monorepo workspace: + +```sh +yarn install +``` + +## Setup your wallets + +We need 2 wallets: a multi-sig for administering the contracts, and a hot wallet for setting everything up. + +1. We use a [Gnosis Safe](https://app.safe.global/) multisig for managing and administering the contracts. Set one up with your desired confirmation threshold (e.g. 2 of 3). This wallet will not require any balance. +2. Separately, set up a wallet that we'll use in our developer scripts. + +- If you don't have one, you can goto `contracts/` and run `yarn hardhat generate-address`. +- Make sure there is enough balance in this account to deploy the contract and transfer ownership to the multisig + - [Goerli Faucet](https://goerlifaucet.com/) + - [Optimism Bridge](https://app.optimism.io/bridge/deposit) + +## Next Steps + +Depending on what you want to do (e.g. in `./sdk/` or `./frontend/`), there will be further setup instructions in the respective `README.md` file. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md new file mode 100644 index 00000000..820255e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md @@ -0,0 +1,35 @@ +# Upgrading the contract + +## Validate upgrade + +Validate contract upgradeability against deployment. + +For example, for the `goerli` deployment: + +```sh +yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS +``` + +## Propose Upgrade + +Propose an upgrade via OpenZeppelin Defender. For more information, see this +[guide](https://docs.openzeppelin.com/defender/guide-upgrades) + +For example, for the `goerli` deployment: + +```sh +yarn build:hardhat +yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS +``` + +This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. + +## Publish to npm + +After you update the contracts, deploy the `contracts/` package to npm. + +TODO + +Update the dependencies in `frontend/package.json` and `sdk/package.json`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/faq.md b/docs/versioned_docs/version-1.0.0-alpha.0/faq.md new file mode 100644 index 00000000..b9659b5a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/faq.md @@ -0,0 +1,139 @@ +--- +title: Frequently Asked Questions +id: faq +--- + +# FAQs + +### How do I create a hypercert? + +We've created a step-by-step guide in the documents, which you can find [here](minting-guide/minting-guide-start). + +### Who gets to claim my hypercert? + +There are currently two types of users who are eligible to claim your hypercert. + +1. You as the creator of the hypercert are eligible to claim your hypercert. For projects with an allow list, you are eligible to claim 50% of the total tokens. For projects with no allow list, you will receive 100% of the tokens automatically and can do whatever you like with them. + +2. Anyone on the hypercert's allow list will be eligible to claim your hypercert. The allow list is stored and the time of minting and allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions through a separate contract interaction. Creators often use allow lists be used to allocate fractions to previous funders and contributors. + +### How do I claim a hypercert? Can I claim all of the ones I’m eligible for at once? + +After you connect your wallet, you will see a dashboard of hypercerts that you can claim. You can either claim them individually or in a batch transaction. Note that if you perform the batch transaction you will automatically claim _all_ hypercerts you are allow-listed for. (You still pay a gas fee for each claim, however.) If you don't want to claim _all_ at once, then you should claim them one-by-one. + +### What token standard do hypercerts utilize? + +The interface supports both ERC-1155s and 721s. Our current implementation makes use of [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) (a semi-fungible token). + +### What are the required fields to generate a hypercert? + +There are six required fields: + +1. Set of contributors: An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. Scope of work: A conjunction of potentially-negated work scope tags, where an empty string means “all”. +3. Time of work: A date range, from the start to the end of the work being claimed by this hypercert. +4. Scope of impact: A conjunction of potentially-negated impact scope tags, where an empty string means “all”. +5. Time of impact: Date ranges from the start to the end of the impact. +6. Rights of the owners: An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Hypercerts also need a name and description. + +### What should I put for my hypercert's work scope? + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +### Are hypercerts the same as impact evaluations? + +No. A hypercert is a claim over a discrete piece of work and the impact that may result from that work. It has no opinion about the legitimacy or quality of the claim. + +An impact evaluation is an opinionated assessment about the legitimacy or quality of a claim. + +For example, a hypercert might represent "Planting trees in the Amazon in 2022". An impact evaluation might point to that hypercert and assert the percent of trees that survived, the amount of CO2 removed by the trees, or the income change among people living around the project. + +Over time, the expectation is that hypercerts that attract multiple, high quality, credibly neutral impact evaluations will be more relevant than ones that do not. + +### What can I do with my hypercert? + +The `rights` dimension specific what an owner can do with their hypercert. Currently, the only `right` that owners have is "Public Display". Over time, we hope the protocol can support various `rights` including transfers, intellectual property, tax-deductibility, carbon offsets, ESG reporting, and more. + +### How is a hypercert different than a POAP or Impact NFT? + +Hypercerts have some things in common with certain POAPs or Impact NFTs, but also a number of crucial differences. + +First, all POAPs and most Impact NFTs are implemented as non-fungible tokens (ERC-721s). Hypercerts are currently being implemented as semi-fungible tokens (ERC-1155s), meaning it is possible to own more than one unit or fraction of a given hypercert. This makes it easy and intuitive to display the share of hypercerts that a given owner has. + +Second, hypercerts have specific metadata requirements and interpretation logic. These include a standard schema for how the six required hypercert dimensions are defined and captured (i.e., work scopes, impact scopes, timeframes, contributors, etc) as well as logic for how to interpret different inputs (e.g., how to include or exclude certain work scopes, create an indefinite time period, etc). POAPs have a completely different schema. Although there is no standard schema for Impact NFTs, an Impact NFT project could choose to adopt the hypercert standard and token interface and thereby achieve compatibility. + +Third, the hypercerts token interface is intended to support several functions that are not possible out of the box with other token standards, chiefly, atomic split and merge capabilities. We also expect other protocols to work with hypercerts for the purposes of prospective and retrospective funding, contributor verification, and impact evaluation. + +For certain use cases, POAPs may be better suited for projects as hypercerts are focused on the funding aspect of impactful work. + +### Where can I purchase a hypercert? + +Currently, it is only possible to purchase a hypercert from a creator or project. This can be facilitated directly by the project or via a third-party marketplace like OpenSea. Currently, hypercerts cannot be resold on secondary markets. + +### What chain(s) is hypercerts running on? + +The hypercerts smart contracts have been deployed on Optimism and Goerli Testnet. We plan to support various EVM chains in the near future. + +### How do I bridge to Optimism? + +There are various bridging services including the official [Optimism Bridge](https://app.optimism.io/bridge/deposit). Note that bridging assets from Ethereum to Optimism will incur a gas fee. + +### How much gas will it cost to create or claim a hypercert? + +In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). Claiming a hypercert should be below 0.0001 ETH or less than $0.10 on Optimism. + +### How do I create a hypercert from a multisig? + +If you are creating a hypercert on Optimism, then you will need an Optimism-based multisig. (Unfortunately, Safe wallets created on Ethereum won't work on Optimism.) + +### Have the smart contracts been audited? + +Yes. The auditor's security report is available [here](https://github.com/pashov/audits/blob/master/solo/Hypercerts-security-review.md). + +### How is the allow list generated? + +For Gitcoin projects, an allow list is generated from a snapshot of all of the on-chain funding received by the project. + +The queries used to generate the allow lists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Once the snapshot is taken, the formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +### Why am I not on the allow list even though I contributed to the project? + +If you contributed less than $1 DAI to a project, then you will not be eligible to claim a hypercert fraction. + +### I supported a project. Why I don't I see the hypercert in my dashboard? + +In order to your hypercert to appear as "claimable", the project needs to mint the hypercert first. If the project has not minted its hypercert yet, then you will not be able to claim it. We suggest you check back in a few days to see if the project has created the hypercert and is now claimable. + +If the project has created its hypercert, then please try the following solutions: + +1. Confirm the wallet address is correct (some users have multiple wallet addresses and forget which one they donated with) +2. Check that your wallet is included in the Dune Dashboards for each Gitcoin Round + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +3. Confirm you donated more than $1 DAI to the project. + +If the project has created its hypercert, and you have confirmed items 1-3, then please send us a DM over Twitter or Telegram with your wallet address and we will get back to you promptly. + +### How do I retire a hypercert? + +We don't yet have a frontend for retiring hypercerts but you can do this by interacting directly with the smart contract on Etherscan. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md b/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md new file mode 100644 index 00000000..86c25331 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md @@ -0,0 +1,37 @@ +--- +title: Further Resources +id: further-resources +--- + +# Papers, Articles, Presentations + +## Writings + +- Feb 14, 2023, Whitepaper draft by [@hypercerts](http://twitter.com/hypercerts): [Hypercerts: A new primitive for impact funding systems (draft v0)](../static/pdf/hypercerts_whitepaper_v0.pdf) +- Aug 24, 2022, Blogpost by [@holkeb](https://twitter.com/holkeb): [Hypercerts: A new primitive for public goods funding](https://protocol.ai/blog/hypercert-new-primitive/) +- Jun 2022, Tech report (draft) by [@davidad](https://twitter.com/davidad): [Hypercerts; an Interoperable Datalayer for Impact-Funding Mechanisms](../static/pdf/hypercerts_Tech_Report_draft.pdf) + +## Talks + +#### Jun 24, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Hypercerts: on-chain primitives for impact markets](https://youtu.be/2hOhOdCbBlU) + + + +#### Jun 23, 2022, Conversation between [@emiyazono](http://twitter.com/emiyazono) and [@owocki](http://twitter.com/owocki) at GreenPill Podcast: [Impact Certificates | Evan Miyazono, Head of Research at Protocol Labs | Green Pill #21](https://youtu.be/kyo5SxtSJ9U) + + + +#### Mar 4, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Interoperable mechanisms for non-rival goods (Hypercerts)](https://youtu.be/acbBeGcevok) + + + +## Other resources + +Overview of some previous writings on impact certificates, retrospective funding and impact markets: + +- Christiano, Paul (2014) Certificates of impact, Rational Altruist, [https://rationalaltruist.com/2014/11/15/certificates-of-impact/](https://rationalaltruist.com/2014/11/15/certificates-of-impact/) +- Christiano, Paul & Katja Grace (2015) The Impact Purchase, [https://impactpurchase.org/why-certificates/](https://impactpurchase.org/why-certificates/) +- Optimism & Buterin, Vitalik (2021) Retroactive Public Goods Funding, [https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c) +- Cotton-Barratt, Owen (2021), Impact Certificates and Impact Markets, Funding the Commons November 2021, [https://youtu.be/ZiDV56o5M7Q](https://youtu.be/ZiDV56o5M7Q) +- Drescher, Denis (2022) Towards Impact Markets, [https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1](https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1) +- Ofer & Cotton-Barratt, Owen (2022) Impact markets may incentivize predictably net-negative projects, [https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6](https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md new file mode 100644 index 00000000..b2451310 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md @@ -0,0 +1,139 @@ +--- +title: Glossary +id: glossary +sidebar_position: 3 +--- + +# Glossary of Hypercerts Terms + +## Main Terms + +### Allowlist + +A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. + +### Claiming a fraction + +Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. + +### Contributor + +An individual or organization that performs some or all of the work described in a hypercert. + +### Creating a hypercert + +Synonymous to minting a hypercert. + +### Fraction + +A token that represents a quantified proportion of a hypercert denominated in units. + +### Funder + +Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. + +### Hypercert + +A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. + +### Hypercerts interface + +The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. + +### Hypercerts implementation + +An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. + +### Hypercerts standard + +A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Impact + +Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. + +### Impact evaluation + +A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. + +### Impact Funding System (IFS) + +A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. + +### Impact space + +A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Merging hypercerts + +An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. + +### Minting a hypercert + +Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. + +### Project + +Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. + +### Prospective funder + +Individual, organization, or algorithm that fund work before it is done. + +### Retrospective funder + +Individual, organization, or algorithm that fund work after it is done. + +### Rights + +An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. + +### Set of contributors + +An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of impact + +A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of work + +A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Splitting hypercerts + +An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. + +### Time of impact + +Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Time of work + +A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Unit + +The smallest possible fraction of a claim. Generally units are grouped in fractions. + +### Work + +Activities that produce impact. + +## Additional Impact Evaluation Terms + +### Auditor + +Individual, organization, or algorithm that evaluates the impact of work after it is done. + +### Beneficiaries + +People or objects that are impacted by work. + +### Evaluator + +Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. + +### Scout + +Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md new file mode 100644 index 00000000..08eb9fcb --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md @@ -0,0 +1,188 @@ +--- +title: Metadata Standard +id: metadata +sidebar_position: 2 +--- + +# Hypercert Metadata Structure + +Hypercerts are represented as [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) tokens. All token instances of a hypercert must share the same ERC-1155 metadata. For sites like OpenSea to pull in off-chain metadata for ERC-1155 assets, your hypercert contract will need to return an IPFS URI that contains all necessary hypercert metadata. + +The hypercert metadata schema follows the [Enjin recommendation](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema) for ERC-1155 metadata. It also includes **six required dimensions** that are necessary to clearly and unambiguously identify the hypercert's impact claim. + +The following are standard ERC-1155 metadata fields. + +## ERC-1155 fields + +| Property | Description | +| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `name` | Name or title of the hypercert. Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. | +| `description` | A human readable description of the hypercert. Markdown is supported. Additional external URLs can be added. | +| `image` | A URI pointing to a resource with mime type image/\* that represents the hypercert's artwork, i.e., `ipfs://`. We recommend images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. | +| `external_url` | [optional] A URL that can be displayed next to the hypercert on webpages like OpenSea and links users to a page that has more information about the project or impact claim. | +| `properties` | [optional] Additional properties (aka attributes) that may be helpful for discovery and curation of hypercerts. Marketplaces like OpenSea will display these properties in the same way as they display rarity traits of NFTs. | + +In order to perform hypercert-specific operations, including split and merge functions, and for your hypercert to robustly claim a set of coordinates in the impact space, there are six additional dimensions that must be included in your metadata. + +## Required Hypercert dimensions + +| Property | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `work_scope` | An _ordered list_ of work scope tags. Work scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any work scope that is explicitly excluded from the claim. | +| `work_timeframe` | Date range from the start to the end of the work in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). | +| `impact_scope` | An _ordered list_ of impact scope tags. Impact scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any impact scope that is explicitly excluded from the claim. The default claim is to "all" impact, giving the owner rights to claim all potential impact created by the work that is represented by the hypercert. | +| `impact_timeframe` | Date range from the start to the end of the impact in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). The default claim is from the start date of work until `indefinite` (i.e., the impact may occur at any point in time in the future). | +| `contributors` | An _ordered list_ of all contributors. Contributors should be itemized as wallet addresses or ENS names, but may be names / pseudonyms. The default claim is to the wallet address that created the hypercert contract. A multisig wallet can be used to represent a group of contributors. | +| `rights` | An _unordered list_ of usage rights tags. The default claim is solely to "public display" of the hypercert, i.e., all other rights remain with the contributors. | + +## Examples + +### Example 1: hypercert with minimal bounds + +Here is an example of hypercert dimensions for work on IPFS with minimal bounds: + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["IPFS"], + "excludes": [], + "display_value": "IPFS" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": [], + "display_value": "All" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1380585600, 1388534399], + "display_value": "2013-10-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1380585600, 0], + "display_value": "2013-10-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["Protocol Labs"], + "display_value": "Protocol Labs" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 2: hypercert with bounded impact claims + +This hypercert is for a carbon removal project that provides a bounded impact scope. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["CO2 in Atmosphere"], + "excludes": [], + "display_value": "CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 3: hypercert with excluded impact claims + +Here is an example that explicitly excludes an impact scope to generate a more fine-grained claim. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": ["CO2 in Atmosphere"], + "display_value": "All ∧ ¬CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Additional guidelines + +Here are some additional guidelines for defining hypercert dimensions. + +- For most hypercerts, the `work_scope` is best represented as the name of the project or activity. Other information contained in the hypercert, namely, the `contributors` and the `work_timeframe` should provide sufficient context to disambiguate multiple claims from the same project. +- Similarly, for most hypercerts, the `impact_scope` will be most clearly represented as "all" (with an indefinite upper bound on the `impact_timeframe` dimensions). This gives the hypercert creator and its owners the flexibility to make claims about impact that may not have been observable or well-understood when the hypercert was created. + +- It is recommended to browse the `impact_scope` and `work_scope` tags that have already been created and are in use by your or other projects. (We are building a catalog to be available at [hypercerts.org](https://hypercerts.org).) Picking established tags can make it easier for users to discover, curate, and interact with your hypercert. In the long-run, we expect different ontologies to emerge in domains like climate solutions, open source software, etc, and picking more established tags will help prevent overlapping or duplicate claims. +- Tags for work scopes and impact scopes are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. +- Scopes that are explicitly excluded from the hypercert claim are enumerated separately and displayed with the `¬` prefix in the tag. Excluded scopes are not currently displayed on hypercert artwork. +- The order of tags matters only for display purposes. The hypercert artwork will only display a limited number of tags in the `impact_scope` and `work_scope` arrays due to image size and stylistic constraints. +- A `contributor` can be identified using any human-readable string. The base case is to set the `contributors` to the wallet address used to create the hypercert. A multisig wallet can be used to represent a group of contributors. + +### Assigning `rights` + +In version 1.0 of the protocol, only one `rights` tag will be enabled: + +> **Public Display**: owners of the hypercert have the right to publicly display and receive social utility from their hypercert. + +This means that any other rights regarding the work described by the hypercert either remain with the original contributors or are governed by other agreements. + +Additional `rights` including the potential for certain types of transfers to be explicitly enabled will be released in subsequent versions. + +## Optional hidden properties + +Creators may wish to add other fields in their metadata that are not a part of the hypercert claim and are not for display on third-party marketplaces like OpenSea. These can be added by creating a `hidden_properties` field in the metadata. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md new file mode 100644 index 00000000..a767c670 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md @@ -0,0 +1,29 @@ +--- +title: Token Standard +id: token-standard +sidebar_position: 1 +--- + +### Hypercerts as a semi-fungible token + +In order to make the token identifiable, traceable, and transferable, hypercerts are represented as [ERC-1155 tokens](https://eips.ethereum.org/EIPS/eip-1155). The ERC-1155 standard enables a single deployed contract to store many hypercerts, facilitating simpler creation, transfers, as well as splitting and merging of hypercerts within a single namespace. As a semi-fungible token, each unique token represents a fraction of ownership of a hypercert. Hypercerts are then represented as a group of tokens, where the total ownership sums to 100%. In order to easily identify which hypercert a token belongs to, we utilize the upper 128 bits of a 256-bit token ID to identify the hypercert. All tokens within the same hypercert group should share the same [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). + +![hypercert id](../../static/img/hypercert_id.png) + +For illustrative purposes, let us assume that token IDs are just 2 bytes long, where the first byte represents the hypercert ID and the last byte represents which fraction of ownership. Alice could create a new hypercert token 0x2301, representing 100% of hypercert 0x23. If Alice wanted to transfer 20% to Bob, Alice could perform a split operation by minting token 0x2302 and transferring 20% of value to it, such that tokens 0x2301 and 0x2302 represent 80% and 20% ownership respectively of hypercert 0x23. Then Alice transfers token 0x2302 to Bob. Similarly, they could merge these 2 tokens together, back to form a token that represented 100% ownership. In this case, the value of 0x2301 would be transferred to 0x2302, and then 0x2301 is subsequently burned. + +Alice can also choose to split or merge hypercerts along some dimension of the impact space. For example, Alice may split hypercert 0x23 into two new hypercerts — 0x24 representing work done before the year 2000, and 0x25 representing work done after 2000. The original hypercert 0x23 is burned and the two new hypercerts store a reference to the previous hypercert. When the history of splits and merges are indexed, we can easily trace through the provenance of any individual hypercert. + +### Claim Data + +Hypercert claim data, such as scope of work and the contributor list, is encoded in JSON format into the [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). Claim data can be stored on-chain alongside the token, or in off-chain storage such as IPFS. For details on the JSON schema and how off-chain storage can be utilized, see the [hypercerts-sdk repository](https://github.com/hypercerts-org/hypercerts/tree/main/sdk). + +When considering whether to store hypercert metadata on-chain or off-chain, we can consider the different trade-offs to the user experience and cost, which may differ depending on which blockchain is being used. Storing data off-chain saves on costs, but could lead to on-chain claims without the metadata. Storing data on-chain adds additional security that the claims will not be forgotten but can lead to higher gas fees. + +Beyond the standard fields of hypercerts that locate the hypercert in the impact space, additional fields can be added. This allows for different templates in different impact areas, such as AI safety or biodiversity, as different additional information will be useful. Importantly, however, all hypercerts will be located in a single impact space – the additional fields do not change that. + +### Multi-chain support + +We expect hypercerts to exist in a multi-chain ecosystem, where the local deployment can be used to support the unique funding systems of that community. In order to visualize a single global impact space, we index the different contract deployments across chains and surface any potential hypercert claim conflicts. Because different blockchains support different subsets of programming languages, we do expect different implementations of the hypercert protocol to exist. However, they must adhere to the same hypercert data model to be indexed into the impact space. + +In order to decide which deployments to index into the hypercerts impact space, decentralized governance institutions will be used to govern the list of contract addresses used across all blockchains. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/intro.md new file mode 100644 index 00000000..0c4d7ca3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/intro.md @@ -0,0 +1,58 @@ +--- +title: What Are Hypercerts? +id: intro +--- + +# What are hypercerts? + +### Hypercerts are a new token standard for tracking and rewarding positive impact. + +Each hypercert represents a unique impact claim capturing the following information: + +- a scope of work and its corresponding scope of impact +- a set of time frames for both the work and its impact +- a set of contributors – the organization or people behind the work +- a set of rights you get by owning a hypercert + +The hypercert itself is an ERC-1155 semi-fungible token with the information above stored as metadata on IPFS. Here’s an example. + +### Hypercert example + +#### Graphic representation + +![hypercert design example](../static/img/hypercert_example.png) + +#### Supplementary information (metadata) + +- **Title of hypercert:** Invention of the InterPlanetary Filesystem (IPFS) +- **Description:** The InterPlanetary File System (IPFS) is a set of composable, peer-to-peer protocols for addressing, routing, and transferring content-addressed data in a decentralized file system. +- **Link:** ipns://ipfs.tech/ + +#### Hypercert dimensions (metadata) + +- **Set of contributors:** 0xb794f5ea0ba39494ce839613fffba74279579268 _(example Ethereum address)_ +- **Scope of work:** IPFS ∧ ¬ go-ipfs +- **Time of work:** 2013-01-01 --> 2013-12-31 +- **Scope of impact:** All +- **Time of impact:** 2013-01-01 --> indefinite +- **Rights:** Public display + +### Why should you care? + +We spend trillions of dollars every year on public goods via governmental agencies, foundations, private donations and corporate spendings; however, we don’t effectively track this work – leaving us in the dark, hoping that it actually has the intended positive impact. + +We believe we can do better: + +- We should start by tracking this work consistently – this is what hypercerts are for. +- We should evaluate how impactful that work was – this is what the open evaluation system of hypercerts supports. +- We should reward the work that was exceptionally impactful – this is what the public display of hypercerts and retrospective funding is for. + +Doing this would unfold powerful incentives. Retrospective funding 1) provides incentives for creators to take on public goods projects with a potentially high, but uncertain, impact, 2) enables feedback loops to learn from successes and failures, and 3) attracts more talent to the public goods sector by improving performance-based compensation. + +While we are excited about the prospects of retrospective funding, hypercerts do not impose any specific funding mechanisms, but start with tracking the work that is supposed to be impactful. As a database for many funding mechanisms this facilitates experimentation and interoperability between funding mechanisms. + +### Next + +Curious and want to learn more? Head over to the [whitepaper](whitepaper/whitepaper-intro.md) to dive deeper into the world of hypercerts. + +Or do you want to get started right away? Head to the [minting guide](minting-guide/minting-guide-start.md). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md new file mode 100644 index 00000000..1ad2310a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md @@ -0,0 +1,166 @@ +--- +title: Gitcoin Alpha Round Instructions +id: gitcoin-round +sidebar_position: 3 +--- + +# Gitcoin Alpha Round Instructions + +## Overview + +- all projects in the Gitcoin Alpha Round are invited to mint a hypercert for their work +- anyone who gave over $1 to a project is automatically allowlisted for that project’s hypercert +- 50% of each hypercert is distributed to the funders, 50% is kept by the project and can be transferred later +- each project has a custom URL to make minting super easy (the link is sent directly to each project) +- everything runs on Optimism (users only need to pay L2 gas costs) + +:::info +If your project participated in the Gitcoin Alpha Round, but you didn't get a message with a custom URL, please reach out to team[at]hypercert.org. +::: + +## Hypercerts x Gitcoin Alpha Round + +Now that Gitcoin’s Alpha Round has officially closed and the funding distribution is finalized, we are inviting all eligible projects that participated to mint a hypercert for their past work and to allocate fractions of their hypercert to a list of supporters. + +We’ve created a dApp that pulls all of the data required to mint your hypercert directly from Gitcoin’s Grant Protocol. You can fine-tune the properties, tweak your artwork, and review the distribution mechanism. Once you’re ready, hit the create button and your hypercert will be released into the ethers! + +Once your hypercert has been minted, the people who supported your project with a contribution of at least $1 DAI on Gitcoin’s Alpha Round will be able to connect and claim their fractions. + +A few important notes about the Alpha Round: + +- The total units of a hypercert is based on the total donations; each funder get awarded units proportional to their donations. +- Transfers will be restricted to one transfer from the project to the supporters. +- There will be no additional rights awarded to the funders except the right to "public display" their support for the project. + +## Instructions + +The following guidance is only for projects that receive a custom URL that pre-populates the hypercerts form based on their Gitcoin Grants' data. + +It explains the default settings in the form and recommends fields that the creator may choose to update or edit. + +:::note +Gitcoin Grant hypercerts are for retrospective work, i.e., they are intended to capture work that happened between Gitcoin Grants Round 15 (September 2022) and the Alpha Round (January 2023). Therefore, the work time period is always set to past dates. (You might need to adjust the name and description to also refer to past work only.) We are focusing solely on retrospective hypercerts for this round as part of broader efforts to promote retrospective funding; you can read more about it [in the whitepaper](whitepaper/retrospective-funding.md). +::: + +### General Fields + +#### Name of Hypercert + +This field is set by default to the name of your project on Gitcoin Grants. You can edit this to be more specific. Given that your project may create numerous hypercerts over time, consider giving each hypercert a name that represents a more discrete phase or output. + +#### Logo + +This field is set to the icon artwork provided for your project on Gitcoin Grants. If there was an error accessing your icon, you will see a generic icon. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +#### Background Banner Image + +This field is set to the banner artwork provided for your project on Gitcoin Grants. If there was an error accessing your banner, you will see a generic Gitcoin banner. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +#### Project Description + +This field is set by default to the description of your project on Gitcoin Grants. Review closely -- a long project description in your Gitcoin Grant description will be truncated. + +You may edit this to provide more details about your work and to remove information that is targeted solely at Gitcoin Grants users. This is also a good place to provide other links, such as Github repos or social media accounts, where the general public can learn more about the work. Please aim for a project description that is less than 500 characters. + +:::note +The project description should refer to **past work**, not future work that you would like to do with additional funding. +::: + +#### Link + +This field is set to the first external URL provided for your project on Gitcoin Grants. You can update this. + +### Hypercert Fields + +#### Work Scope + +This field is set by default to a **shortened version** of the name of your project on Gitcoin Grants. You may edit or add additional work scope tags. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +#### Work Start/End Dates + +The start date has been set by default to the `2022-09-22` for all projects on Gitcoin Grants. This date coincides with the end of Gitcoin Grants Round 15. + +The end date references the last update to your grant page on Gitcoin Grants. + +You may edit or update these fields, however, the end date may not extend beyond `2023-01-31` (the close of the funding round) as all hypercerts will be retrospective in this round. + +#### Set of Contributors + +This field is set by default to the wallet address that is set as the recipient address for receiving Gitcoin Grants funding. + +:::note +You should review this field closely and – if applicable – provide the addresses of additional contributors. +::: + +### Advanced Fields + +#### Impact Scope + +This field is set by default to `all`. + +Updates are currently disabled on the frontend because funding decisions on Gitcoin Grants were not specific to an impact scope or impact time period. + +#### Impact Start/End Dates + +This field is set by default to the work start date of `2022-09-22` (see above) and a work end date of `indefinite`. Updates are currently disabled on the frontend. + +#### Rights + +This field is set by default to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +Updates are currently disabled on the frontend. + +### Distribution + +#### Allowlist + +This field is set by default to a custom allowlist generated for each project based on the funding it received on the Gitcoin Grants Alpha Round. You should not need to update this field. If there is a problem with your allowlist, please contact us. + +50% of the hypercert will be allocated according to this allowlist. The other 50% will be kept by the project, i.e. it is allocated to the address that mints the hypercert. You will be able to transfer or sell these fractions later as long as they are owned by the minter. This means that they can only be transferred or sold once. + +The formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +The queries used to generate the allowlists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Donors who contributed to the matching pool for each round are also eligible to claim hypercerts. + +:::note +You are free to edit your allowlist. You can do this by following the step-by-step instructions [here](minting-guide/step-by-step.md). Just remember that you will need to upload the new allowlist in a CSV format to a storage site like [web3.storage](https://web3.storage) and then update the link in the allowlist field. Contact team[at]hypercerts.org if you need help. +::: + +### Confirmations + +#### Contributors' permission + +Every contributor needs to agree to have their contribution be represented by a hypercert. This is why the person minting the hypercert has to confirm to have the permission of all listed contributors. + +#### Terms & Conditions + +The terms & Conditions can be found [here](https://hypercerts.org/terms). + +### Final step: Click "Create" + +Make sure your Optimism wallet or multi-sig is connected. Click on "create" and wait for your hypercert to be created. Congratulations! diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md new file mode 100644 index 00000000..47e8ad7c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md @@ -0,0 +1,44 @@ +--- +title: Getting Started +id: minting-guide-start +sidebar_position: 1 +--- + +# Getting started + +### How to create a hypercert + +Creating a hypercert is similar to creating an NFT on sites like OpenSea or Zora. + +In this article, we’ll walk through the steps one by one and explain exactly what you need to do to create your first hypercert. + +There are typically two ways of creating a hypercert: + +1. As a project affiliated with a specific funding network (e.g., Gitcoin Grants): In this case, you should receive a custom URL from the funding network that pre-populates most of your hypercert fields. You will still be able to change most of these, so you should review and adjust them as needed to better describe your hypercert. Guidance on how to do so (for Gitcoin Grants projects) is provided at the end of this doc. +2. As a project not affiliated with a specific funding network: In this case, you will be creating a hypercert from scratch and filling in each field on your own. Read on below. + +### Who can create a hypercert? + +Anyone doing work that is intended to have a positive impact can create a hypercert. Your hypercert can be as simple as "I did X on this date and want to claim all future impact from it". + +It can also represent something more, such as a phase in an ongoing team project, an invention or discovery, a research publication, or an important software release. + +Critically, if the work was done by more than one person, then each person should be listed as a contributor to the hypercert and approve the creation of the hypercert. + +_Note: In the future, the approval of each contributor will be verified on-chain._ + +### What do I need to create a hypercert? + +You will need to prepare all of the information required in the form builder (see **Step-by-step instructions for creating a hypercert** below). This includes important metadata, such as a description of the project and the dimensions of your impact claim, as well as a project artwork. You may also want to include an allowlist of wallets that are approved to claim one or more fractions of the hypercert. + +In addition to the information regarding the hypercert itself, you’ll need a crypto wallet to mint your hypercert. “Minting” a hypercert is the process of writing an impact claim to the blockchain. This establishes its immutable record of authenticity and ownership. + +Next, choose a blockchain on which to mint your hypercert. The hypercerts protocol is available on Ethereum, Goerli (testnet), and Optimism. Each of these blockchains has different gas fees associated with transactions on their networks. To reduce gas fees we recommend Optimism for most projects. + +Finally, go ahead and create your hypercert. + +### How much does it cost to create a hypercert? + +You will need enough Ethereum in your wallet to cover gas fees. In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). + +The protocol currently does not offer gas-free or "lazy" minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md new file mode 100644 index 00000000..9f3b6303 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md @@ -0,0 +1,130 @@ +--- +title: Step-by-step Instructions +id: step-by-step +sidebar_position: 2 +--- + +# Step-by-step instructions + +First, go to the [Create Hypercert](https://hypercerts.org/app/create) site with a wallet-enabled browser or follow the custom URL you received to access a prepopulated form. + +Although the site works on mobile, it is easier to use on desktop because the browser will display a dynamic preview of the hypercert while you fill out the Create form. + +Next, connect your wallet. You will be prompted to switch to the Ethereum or Optimism network. + +Once you've connected, you will see an empty form for creating a hypercert. + +### General fields + +#### Name of Hypercert + +Enter the name or title of the hypercert. This is the place to be verbose and specific about what the project is doing. You'll see on the preview when your title becomes too long. + +Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. + +Names are restricted to 100 characters but may include emojis (:smile:), accents (é), non-Latin scripts (表情), and other Unicode characters. + +#### Project Description + +Enter a human readable description of the hypercert. This is the place to share more details about the work and the team or individual behind the work. + +The description field supports [Markdown syntax](https://www.markdownguide.org/cheat-sheet/) and has a limit of 10,000 characters. + +In addition to the main link (see next field) you can add further links in the markdown to help others to understand the work of the project. + +#### Link + +A valid URL for the project, beginning with https:// + +This will be displayed next to the hypercert on webpages like OpenSea and should link users to a page that has more information about the project or impact claim. + +#### Logo + +An icon for the top left part of the card. This could be your project logo. It will be automatically masked to the shape of a circle. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +#### Background Banner Image + +A background image that will extend across the upper half of the artwork. This could be your project masthead or a unique piece of art. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +Currently we don't support zoom / cropping, so you will need to test the look and feel on your own. + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +### Work Scope fields + +#### Work Scope + +One or multiple tags describe the work that the hypercert represents. This work scope will be used to identify the work that is included in the hypercerts and the work that is not included. + +Multiple tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +_Note: In the future, you will be able to specifically exclude work from the hypercert._ + +#### Start and End Date of Work + +The work time period defines when the work was done that the hypercert represents, i.e., only the work in this time period is included in the hypercert. + +The time period of work doesn't need to be the start and end date of a project, but it can be. One project can be split up into multiple hypercerts, e.g. all hypercerts can have the same `work scope`, but different time periods of work. Of course, the time periods are not allowed to overlap. + +### Impact scope fields + +#### Impact Scope + +The impact scope can be used to limit the impact that a hypercert represents, e.g. for the work scope `Planting trees` a hypercert can represent _only_ the impact on biodiversity by including the impact scope tag `Biodiversity`. This would exclude all other impacts, including the impact on CO2 in the atmosphere, which can be useful if that impact is already captured by a carbon credit. + +By default this is set to "`all`" and we strongly recommend keeping it that way. + +Just like the work scope, multiple impact scope tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction). + +#### Start and End Date of Impact + +The impact time period is another way to limit the impact that a hypercert represents, e.g. inventing a new medical treatment has a positive impact over many years, but we might want to capture the positive impact separately for each year. + +By default the `impact start date` is the same as the `work start date` and the `impact end date` is "`indefinite`", i.e., the impact is not restricted time-wise. We strongly recommend keeping it that way. + +### Set of Contributors + +Provide a list of contributors, one per line, or comma-separated. + +The list should include _all_ contributors that performed the described work. + +Contributors are generally itemized as wallet addresses or ENS names, but can also be names / pseudonyms. Groups of contributors can be represented by a multisig or name of an organization. + +### Owners + +#### Allowlist + +The allowlist allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions afterwards. For example, it can be used to allocate fractions to previous funders and contributors. + +The allowlist is implemented as a CSV file specifying `index,address,price,fractions` headers. + +| index | address | price | fractions | +| ----- | ------------------------------------------ | ----- | --------- | +| 0 | 0x5dee7b340764c49a827c60d2b8729e49405fbefc | 0.0 | 100 | +| 1 | 0x1e2dbb9ca3f6d48e085384a821b7259abfdc7d65 | 0.0 | 50 | +| ... | ... | ... | ... | +| 999 | 0x436bad18642f45d3fa5fcaad0a2d81764a9cba85 | 0.0 | 1 | + +The `price` field is denominated in ETH. This should remain at 0.0 for all hypercerts, as primary sales are not currently supported through the app and the secondary sale/transfer of hypercerts is currently not allowed. + +You can store your allowlists on IPFS using [web3.storage](https://web3.storage/). + +:::note +If your allowlist is not properly formatted, you will be unable to mint your hypercert. If you do not include an allowlist, then the creator of the hypercert will receive 100% of the hypercert (set to a default of 10,000 units), which you can then sell or transfer to another wallet a maximum of one time. +::: + +#### Rights + +This field defines the rights that owners of the hypercert have over the work being claimed by this hypercert. + +By default this is set to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +_Note: In the future, additional rights can be included for different hypercerts._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md new file mode 100644 index 00000000..87fb9194 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md @@ -0,0 +1,23 @@ +--- +title: Open Impact Evaluations +id: evaluation +sidebar_position: 5 +--- + +A key design element is that hypercerts themselves do not make a claim about the size of the impact, but only account for the work that is supposed to be impactful. The figure below shows this contrast in a simplified illustration of the example that we introduced above. The open evaluation system allows multiple evaluations to point at the same area of the impact space that a hypercert claims. The evaluations can include self-evaluation from the contributors themselves. Funders observe these and make their funding decisions based on this richer set of information. + +![hypercert evaluations](../../static/img/hypercert_evaluations.png) + +The open evaluation system is also used to provide additional information, e.g. an evaluator or the project itself provides information about the health of the trees. This information can then be used transparently by other evaluators to evaluate the impact on CO2 in the atmosphere. + +An important feature is that the evaluations do not directly point at a hypercert, but rather at an area in the impact space. In practice this area will mostly be the exact same area that a hypercert claims, such that it can be considered an evaluation of the hypercert, but it does not have to. This feature ensures that, if hypercerts are merged or split, previous evaluations will continue to be linked appropriately. + +The form of evaluations can be standardized to simplify handling and comparing multiple evaluations from multiple evaluators. The open evaluation system allows for templates to be created and used by any evaluators. Similar to the emerging ontologies, these are not enforced centrally, but should emerge as useful standards – potentially steered by decentralized governance institutions. + +Important characteristics of the open evaluation system are: + +- Evaluators can submit multiple evaluations of the same area in the impact space as more information becomes available +- Evaluations can challenge other evaluations +- Evaluation methodologies can evolve over time + +These features allow the whole evaluation system to be dynamically improved by each actor. The relevant incentives for this improvement will stem from the funders who will value the signals from some evaluators more than others and evaluators are able to build up reputation. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md new file mode 100644 index 00000000..8acc11d1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md @@ -0,0 +1,104 @@ +--- +title: "Hypercerts: a New Primitive for Impact Funding Systems" +id: hypercerts-intro +sidebar_position: 3 +--- + +### Defining hypercerts + +A hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and represents all or parts of that impact. A hypercert has the following fields (one for each dimension): + +1. **Set of contributors:** An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. **Scope of work:** A conjunction of potentially-negated work scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +3. **Time of work:** A date range, from the start to the end of the work being claimed by this hypercert. +4. **Scope of impact:** A conjunction of potentially-negated impact scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +5. **Time of impact:** Date ranges from the start to the end of the impact. +6. **Rights of the owners:** An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Implementing hypercerts as a semi-fungible token allows multiple contributors and funders to own parts of hypercerts. For instance the original contributors can award 10% of a hypercert to a funder, while keeping 90%, which they can award to other funders later. This is why hypercerts are fractionalizable. + +### Examples + +In the simplest cases of hypercerts, the scope of work and impact as well as the time of impact are not restricted and no rights are transferred to owners of the hypercerts, i.e. the hypercerts just define the who (set of contributors) and when (time of work) of the claimed work. Scope of work and impact would be set to all, time of impact to “indefinite” and the rights to only “public display of support”. The latter is always included as the hypercert is a public record, such that owners will always automatically display their support of the work. + +Take for example hypercert 1 below: It represents all work that contributor 1 has performed in 2013 with all the impact that the work had from the beginning of the work; the hypercert doesn’t give any additional rights to the owners of the hypercert. + +The other fields – except the rights field – can be used to limit the work or impact that is represented by the hypercert. Hypercert 2 limits this to the work on IPFS in 2013, i.e. any other work besides IPFS that contributor 1 performed is not included. Hypercert 3 limits it even further as it excludes a specific aspect of IPFS, the go-ipfs implementation. + +| | **Hypercert 1** | **Hypercert 2** | **Hypercert 3** | +| ----------------------- | ------------------------- | ------------------------- | ------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | all | IPFS | IPFS ∧ ¬ go-ipfs | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | all | all | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → 2013-12-31 | +| **Rights** | Public display of support | Public display of support | Public display of support | + +In the table below we illustrate a use case for limiting the scope of impact. Suppose contributor 1 protects trees in a certain area. This work has positive effects on the CO2 in the atmosphere and could turn into carbon credits; however, the trees have additional positive impacts, such as protecting biodiversity. Instead of including all positive impacts in one hypercert (hypercert 4), the impact can be split between the impact on CO2 in the atmosphere (hypercert 5) and all other positive impacts (hypercert 6). If funders are willing to pay for biodiversity, this would be a new income opportunity. And it would account for the additional positive impact that other methods of reducing CO2 might not have, like industrial carbon capture. Importantly, negative impacts can not be excluded from a hypercert. + +| | **Hypercert 4** | **Hypercert 5** | **Hypercert 6** | +| ----------------------- | -------------------------- | -------------------------- | -------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | Protecting trees in area X | Protecting trees in area X | Protecting trees in area X | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | CO2 in atmosphere | all ∧ ¬ CO2 in atmosphere | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → indefinite | +| **Rights** | Public display of support | Public display of support | Public display of support | + +Importantly a hypercert does not specify the “size” of the impact, e.g. a hypercert does not state “5 tons of CO2 removed from the atmosphere.” Instead the hypercert only defines the work, e.g. “200 trees protected” (scope of work) in 2022 (time of work). The size of the impact is then left to the evaluations of the “CO2 in the atmosphere” (scope of impact) in 2022 (time of impact) that point towards the covered region of the hypercert. For instance: This allows a self evaluation to claim that 5 tons of CO2 were removed in a given year as well as one or multiple evaluations from independent auditors to confirm or challenge how much CO2 has been removed. An evaluator could detect that some of the trees were not healthy and hence only 4 tons of CO2 were removed. Allowing for multiple evaluation is a defining characteristic of the open evaluation system. + +### Functions of hypercerts + +#### 1. Identifiability + +Hypercerts clearly define the work that is supposed to be impactful by creating a record of who (set of contributors) claims to do or have done what (scope of work) in what time period (time of work). They also allow the creation of multiple records of the same work to identify separate impacts that this work had or will have (scope of impact) over specified time periods (time of impact). + +#### 2. Traceability + +As these records are public and logically monotonic (immutable, except to split or merge hypercerts), records are durable and permanent. + +#### 3. Transferability + +The records are a digital object that can be owned and ownership can be transferred (under specific conditions). As hypercerts can be created as fractionalizable, it is also possible to transfer only a specified fraction of the hypercert. Each hypercert defines the rights over the defined work that owners have, such as rights to retrospective rewards, rights to public display of the support (“bragging rights”) or rights to passive income from intellectual property. + +:::note Transferability restrictions + +Hypercerts are generally transferable. However, there are use cases, in which minters of hypercerts want to restrict how their hypercerts can be transferred. The protocol allows the minter to restrict who can transfer the hypercert and/or to whom the hypercert can be transferred. For instance, by specifying that only the original owner can transfer the hypercert, any future owner is prohibited from selling it, i.e. a secondary market would not exist for this hypercert. + +::: + +### Merging hypercerts + +Besides the fungible dimension, hypercerts can be merged and split on any of the six dimensions as shown in box 1. Let us take the hypercert 1 from the section "Hypercerts definition" and focus only on two of the dimensions, scope of work and time of work. These two dimensions create a simplified impact space. The figure below shows how work on IPFS (InterPlanetary File System) could have been minted over time in separate hypercerts, one for each quarter of work. + +![minting hypercerts example](../../static/img/creating.png) + +We created five hypercerts, one for each quarter of work. As the resulting work of all of these together is IPFS 0.1, the merged hypercert in total is more meaningful and more valuable than just the five individual hypercerts. In this case the proverb is true, the whole is greater than the sum of its parts. Hence, we want to merge them as shown in the next figure. + +![merging hypercerts example](../../static/img/merging.png) + +### Splitting hypercerts + +Conversely, splitting can increase the meaningfulness and value of hypercerts as well. We can split the work on IPFS 0.1 into the conceptual work “invention of IPFS” and the implementation via “go-ipfs 0.1” as shown in the next figure. + +![splitting hypercerts examples](../../static/img/splitting.png) + +Other use cases are where multiple contributors want to combine their work on the same scope of work (merging) or disentangle their work (splitting). Ultimately, splitting and merging allows users to repackage the digital representation of their work and impact. + +Importantly, splitting and merging are the only operations that are permitted to change hypercerts. Once an area in the impact space is claimed, it can not be unclaimed. This ensures that claims are never forgotten. + +### Retiring hypercerts + +While a claim in the impact space can not be unclaimed, it can be retired. Retiring a hypercert means that owners can not transfer and sell it anymore. This way owners prove that they are the final buyers of the impact. Technically retiring hypercerts means that they are sent to a specific null address, which ensures that the retired hypercerts are recorded and traceable. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md new file mode 100644 index 00000000..6f71ac50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md @@ -0,0 +1,103 @@ +--- +title: The Need for Interoperable Impact Funding Systems (IFSs) +id: ifs +--- + +# The Need for Interoperable Impact Funding Systems (IFSs) + +### An IFS consists of + +- **Actors:** Contributors, funders, evaluators, and beneficiaries +- **Funding mechanisms:** Grants, bounties, retrospective funding, etc. +- **Coordination mechanisms:** Roadmapping, communication forums, etc. +- **A goal:** Maximize the domain-specific positive value created (impact) + +The goal will be specific to the impact area, e.g. prevent existential risks from artificial intelligence (AI) would be the goal for the impact area “AI safety.” To achieve these goals, skilled contributors must work with high effort on promising projects. Additionally, for those projects that create impact continuously, sufficient income streams are necessary to cover both their ongoing operating expenses and contributors’ upside incentives. + +#### Actors in IFSs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeSubtypeDescription
ContributorsPeople or organizations who do the work
FundersProspective fundersPeople or organizations who fund work before it is done
Retrospective fundersPeople or organizations who fund work after it is done
EvaluatorsScoutsPeople or organizations who evaluate the potential impact of work before it is done
AuditorsPeople or organizations who evaluate the impact of work after it is done
BeneficiariesPeople or objects that are impacted by the work
+ +### Guiding questions for designing IFSs + +1. **Projects:** How can we improve the chances that the most promising projects are worked on? +2. **Talent & resources:** How can we attract top talent to contribute to the most promising projects and provide them with the necessary resources? +3. **Effort:** How can we reward contributors for their impact on outcomes? +4. **Sustainable income:** How can we create recurring income streams and financial sustainability for impactful projects? + +Markets have been proven very powerful in answering these questions if they are directed towards maximizing profits. As we are directing systems towards maximizing impact, these answers become more challenging. In particular, in an IFS we are facing coordination and incentive problems in funding impact, such as the free-rider problem. + +### Example dynamics between actors in an IFS + +In order for impact funding systems to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources and (3) evaluations. In the diagram below you see a potential dynamic between the actors of an IFS. In that scenario hypercerts can account for the prospective funding (steps 2-3) as well as for the retrospective funding (steps 8-9) from different funders. Evaluations are made public and can be discovered through the hypercerts for all funders (steps 5-7). Retrospective funders can reward not only the contributors but also the prospective funders (steps 10-11). + +```mermaid +sequenceDiagram + autonumber + participant Beneficiaries + participant Contributors + participant Prospective funders + participant Retrospective funders + participant Evaluators + Contributors ->> Contributors: Mint hypercerts + Prospective funders ->> Contributors: Award funding + Contributors ->> Prospective funders: Award fractions of
the hypercert + Contributors ->> Beneficiaries: Create impact + Retrospective funders ->> Evaluators: Fund evaluation + Evaluators ->> Beneficiaries: Evaluate impact on beneficiaries + Evaluators ->> Retrospective funders: Make evaluations public,
esp. for retrospective
funders + Retrospective funders ->> Contributors: Award funding + Contributors ->> Retrospective funders: Award fractions of hypercerts + opt + Retrospective funders ->> Prospective funders: Award funding + Prospective funders ->> Retrospective funders: Transfer fractions
of hypercert + end +``` + +### Hypercerts as a data layer for IFSs + +By serving as a single, open, shared, decentralized database hypercerts lower the transaction costs to coordinate and fund impactful work together. This is important because the optimal funding decisions of a single funder depends on the funding decision of all other funders. For instance, some work is only impactful if a minimum funding is provided: The impact is non-linear in the funding amount, e.g. half a bridge is not half as impactful as a full bridge. Other work might be over-funded, i.e. the impact of an additional dollar is basically zero. Ultimately, funders want to find the highest impact for each additional dollar spend (cf. S-process as in Critch, 2021). Today multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Through hypercerts the funding becomes more transparent and the credits for funding impactful work can be easily shared. Coordinating funding becomes easier. + +Hypercerts don’t solve this coordination problem by themselves, but build the basis for different decision and funding mechanisms as shown below. Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. Hypercerts do not lock in any particular decision-making scheme for funders. + +![Hypercerts as a data layer for an IFS](../../static/img/hypercert_data_layer.png) + +Looking farther into the future: If a large majority of funding across an entire IFS ends up flowing through hypercerts, funders have created the transparency that enables each of them to make the best decisions given the funding decision of everyone else. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md new file mode 100644 index 00000000..f8fed762 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md @@ -0,0 +1,35 @@ +--- +title: A Consistent Impact Space +id: impact-space +sidebar_position: 4 +--- + +Every hypercert represents a claim in the impact space, which itself represents all possible claims. Above we illustrated the impact space with two dimensions, scope and time of work. The complete impact space is spanned by the six dimensions introduced in the definition of hypercerts. + +### Consistency of the impact space + +Every point in the impact space should either be claimed or not be claimed. No point must be claimed twice, or equivalently: + +- If the impact of some work is represented in one hypercert, it must not be part of any other hypercert. +- Hypercerts must not overlap with each other. + +The table below shows two hypercerts that were illustrated in the section on "Hypercerts operations", but now with all six fields. The two hypercerts can represent the exact same work by the same contributor, but they do not overlap because of the difference in the time of work. + +| | **Hypercert 7** | **Hypercert 8** | +| ----------------------- | ------------------------ | ------------------------ | +| **Set of contributors** | Contributor 1 | Contributor 1 | +| **Scope of work** | IPFS | IPFS | +| **Time of work** | 2013-10-01 to 2013-12-31 | 2014-01-01 to 2014-03-31 | +| **Scope of impact** | all | all | +| **Time of impact** | 2013-10-01 → indefinite | 2014-01-01 → indefinite | +| **Rights** | None | None | + +The consistency of the impact space is crucial as it ensures that no rights to an impact claim are sold twice. If for example someone owns the right to retrospective rewards for the impact of some work, the owners must be identifiable unambiguously. + +Because users can create hypercerts with arbitrary data on any chain, on which a hypercert contract is deployed, we provide ways to help users detect collisions in the impact space. For example, if one hypercert on Ethereum points to the work on “IPFS”, and another hypercert on Filecoin points to the work on “https://github.com/ipfs/go-ipfs” both with the same contributor and time of work, which of these overlapping hypercerts is the correct one to support? To surface such overlapping hypercerts, the hypercerts protocol and SDK will support mechanisms to index, search, and visualize neighbors in the impact space. With these tools evaluators can quickly detect potential conflicts and submit the results as evaluations to help disambiguate proper credit and attribution. + +### Emerging ontologies + +Common ontologies for the scope of work and scope of impact are useful to create transparency and improve discoverability. Such ontologies need to be created from the practices and should be adapted over time. They are like emerging norms, instead of fixed rules. However, some larger players or a group of smaller players could enforce certain ontologies, e.g. if multiple funders agree that they only fund projects that follow a specified ontology. + +As some ontologies might be more useful than others, we would ideally see a consensus emerge between participants and experts in each impact area. Decentralized governance institutions can help facilitate this; however, further details on the design are out of the scope of this paper and are left for future work. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md new file mode 100644 index 00000000..57444581 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md @@ -0,0 +1,42 @@ +--- +title: Retrospective Impact Funding +id: retrospective-funding +sidebar_position: 6 +--- + +### Introducing retrospective funding + +While hypercerts do not impose any specific funding mechanisms, they are especially useful for retrospective funding. The core idea, from the perspective of contributors building impactful goods, is this: if you can reasonably expect to get funded retrospectively for your work once you produce a positive impact, then you can work now, in expectation of a probabilistic future cash flow. In another conception, you are effectively “borrowing” money from this anticipated future cash flow to fund the work in the first place; the expectation of future funding “retro-causes” the impactful work. Retrospective funding may be able to 1) provide incentives for contributors to take on impactful goods projects with a potentially high, but uncertain, impact and 2) create a more efficient IFS by back-propagating signals on what outcomes were impactful post-hoc. + +In addition, contributors are able to receive fair compensation by providing outsized impact that will be highly valued. It incentivizes you to create a positive impact, beyond your intrinsic motivation. This does not mean that the most successful contributors to impactful goods automatically have potential upside comparable to some for-profit startup founders (or that they should), just that their potential upside does depend on how much funders later value their past work. This will attract more talent to the impact sector by improving performance-based compensation. + +The crucial aspect for this to work: funders need to retrospectively fund impact, and send credible signals that they will do so in the future. Based on these signals contributors form expectations about future retrospective rewards and can start working today to receive them in the future. + +Hypercerts facilitate retrospective funding as the impact claims are identifiable, traceable and transferable. Contributors can sell parts of their hypercerts to prospective funders to receive the necessary funding for their project (“activity” in the figure below). The project delivers impact to a larger group (“beneficiaries”), which retrospectively buys the hypercerts from the prospective funder, and from the contributors if they retained some fraction of their hypercerts (the latter is not represented in the figure). + +![Retrospective funding with hypercerts](../../static/img/retrospective_funding.png) + +### Increasing rewards + +Retrospective funding allows us to increase rewards as more impact is created because impact is easier to observe, measure and prove retrospectively. Increasing rewards – as shown in the next figure – incentivizes contributors to put in their highest effort to produce impact and enables contributors to be rewarded for their talent. Moreover, prospective funders are incentivized to select, fund and support the projects with the highest expected impact, if they also receive retrospective rewards. + +![Increasing rewards](../../static/img/increasing_rewards.png) + +Note that retrospective funding should not be used in cases where a significant negative impact is possible since a nongovernmental, permissionless framework can not impose retrospective penalties for negative externalities. See Ofer & Cotton-Barratt (2022) for a discussion of this limitation of retrospective funding. + +In some cases we do not expect the retrospective evaluation to be any different than the prospective evaluation, i.e. there is no uncertainty resolved over time as the impact of an activity is already “known” prospectively. In these cases retrospective funding would only complicate the funding mechanism and funding via grants or milestone bounties would be preferable. Retrospective funding is preferable only if uncertainty is resolved over time. + +### Impact evaluations + +The relevance of impact evaluations will depend on how much their signals influence the funding decisions of retrospective funders (see the potential dynamics in the section on "IFSs"). This is a critical difference to many impact reports today: If a project was funded by a grant, the funders as well as the project want to receive a positive evaluation. If, however, the funding decisions of the retrospective funders are outstanding, they are interested in truthful signals about the impact. Hence, funders value improvements in evaluation methodologies and can fund independent evaluators. Evaluators in turn would build up a reputation for their evaluation methodologies and improve the strength of their signals to retrospective funders. + +Impact evaluators can take on a range of forms ranging forms, such as + +- Voting by relevant communities or beneficiaries +- Expert panels +- Professional evaluators similar to financial rating agencies +- Automatic monitoring and data collection by sensors and oracles + +The most useful form or combinations thereof will depend on the specific requirements of the impact area. For a generalized framework on impact evaluators see Protocol Labs (2023). + +While retrospective funding makes impact evaluations financially relevant for funders and contributors, hypercerts enable to pre-commit funding for those evaluations: As impact claims are never forgotten, any actor can at any time commit funding to a future evaluation of these claims. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md new file mode 100644 index 00000000..4d4648ba --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md @@ -0,0 +1,24 @@ +--- +title: Introduction +id: whitepaper-intro +--- + +# Vision & Whitepaper + +:::note + +If you prefer to read the draft whitepaper (v0) as a pdf, you can find it [here](../../static/pdf/hypercerts_whitepaper_v0.pdf). The content is mostly identical to the following pages. + +::: + +#### The world faces unprecedented challenges, from climate change to safe artificial intelligence, that require billions to trillions of dollars of public goods funding. + +High-upside/high-uncertainty endeavors are often overlooked due to the absence of strong incentives to pursue them in the dominant public goods funding framework of at-cost grants or even a milestone-bounty framework (which directly exposes small contributors to aversive risk levels). Yet these should be pursued when the expected positive value is very high, as it often is. New impact funding mechanisms can address this. One such mechanism is retrospective funding, which rewards projects based on the impact they create after the impact is observable. If projects can reasonably expect such retrospective rewards, they are incentivized to maximize their impact and – together with prospective funders – take risky bets when the expected positive value is high. + +#### In order for Impact Funding Systems (IFSs) to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources, and (3) evaluations. + +Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. We do not wish to lock in any particular decision-making scheme for funders. Without mechanisms like these, multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Funders should be able to easily collaborate with other funders or to intentionally fund different projects to diversify the funded approaches. Evaluators should be able to evaluate the same impact with different methodologies – potentially with conflicting results, to foster rigor and progress of evaluation methodologies. + +#### Hypercerts create this interoperability by serving as a single, open, shared, decentralized database for impact funding mechanisms. + +A single hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and whose ownership is fractionizable and transferable (under specific conditions). Hypercerts do not impose any specific funding mechanisms but provide baseline invariant guarantees such that claims will not be forgotten as different mechanisms come into and out of fashion. This is also why hypercerts are especially useful for any retrospective funding mechanisms – funding can be applied to claims of the past. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/about.md b/docs/versioned_docs/version-1.0.0-alpha.1/about.md new file mode 100644 index 00000000..e2d4eb79 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/about.md @@ -0,0 +1,24 @@ +--- +title: The Hypercerts Foundation +id: about +--- + +# The Hypercerts Foundation + +### Mission + +The mission of the Hypercerts Foundation is to advance the development and adoption of open-source protocols for funding and rewarding positive impact. + +### Organization + +The Hypercerts Foundation is a fully independent organisation working closely with stakeholders in the open source, scientific research, and cryptography communities to develop and promote additional protocols that are decentralized, secure, and transparent. The Foundation will also provide support and resources to help drive the wider adoption of these protocols. + +### History + +Research on hypercerts was first presented to the public by David A. Dalrymple at the conference series Funding the Commons in March 2022. However, the concept of “impact certificates” has been a recurring theme at conferences and in online discussion forums since at least 2014. In late 2022, a small team of research scientists, developers, and practitioners began implementing hypercerts as a set of Ethereum-based smart contracts that could be used to assert and fund impact claims. The Hypercerts Foundation will now serve as the long-term home for this work. + +The new foundation is supported in part by Protocol Labs and is part of the broader Protocol Labs Network of hundreds of companies and organizations. The Foundation will complement Protocol Labs Network’s mission of enabling a more secure, open, and accessible internet. The Hypercerts Foundation, however, is fully independent and will focus on protocol development and cultivating a community of developers and impact entrepreneurs well beyond the Protocol Labs Network. + +### Further links + +Read the full [announcement of the Hypercerts Foundation](https://hypercerts.notion.site/Introducing-the-Hypercerts-Foundation-d956203fe0fc4792980da138015e770a). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md new file mode 100644 index 00000000..bc65b116 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md @@ -0,0 +1,101 @@ +# Allowlists + +Allowlists are an efficient way to enable distribution of hypercert fractions amongst a group. +First, the creator will create the hypercert with the metadata and an immutable allowlist. +With the `claimId`, every account specified in the allowlist can later mint their fraction token from that allowlist. + +## Create an allowlist + +First specify an allowlist, mapping addresses to the number of units they should receive. + +```js +import { + TransferRestrictions, + formatHypercertData, + Allowlist, +} from "@hypercerts-org/sdk"; + +const allowlist: Allowlist = [ + { address: "0x123", units: 100 }, + { address: "0xabc", units: 100 }, +]; +``` + +Then, call `createAllowlist` with the metadata and allowlist. + +```js +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; +const transferRestrictions = TransferRestrictions.FromCreatorOnly + +const { claimId } = await hypercerts.createAllowlist({ + allowList, + metaData, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **note** We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree generation and data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree) + +It first checks if the client is writable and if the operator is a signer. If the operator is not a signer, it throws an `InvalidOrMissingError`. + +Next, it validates the allowlist and metadata by calling the `validateAllowlist` and `validateMetaData` functions respectively. If either the allowlist or metadata is invalid, it throws a `MalformedDataError`. + +Once the allowlist and metadata are validated, the method creates a Merkle tree from the allowlist and stores it on IPFS. It then stores the metadata on IPFS as well. + +Finally, the method invokes the `createAllowlist` function on the contract with the signer's `address`, the total number of `units`, the Merkle tree `root`, the metadata `CID`, and the `transfer restrictions`. If the method is called with `overrides`, it passes them to the createAllowlist function. + +## Claiming a fraction token + +Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: + +| Variable | Type | Source | +| -------- | ------------ | ------------ | +| claimId | BigNumberish | Hypercert ID | +| units | BigNumberish | Allowlist | +| proof | BytesLike[] | Merkle tree | + +We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. + +Then, call `mintClaimFractionFromAllowlist` with the required data. The contracts will also verify the proofs. However, when providing the `root` in the function input, the proofs will be verified before a transaction is submitted. + +```js +import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; + +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const address = "0xc0ffee254729296a45a3885639AC7E10F9d54979"; + +const { indexer, storage } = hypercertsClient; +const claimById = await indexer.claimById(claimId); +const { uri, tokenID: _id } = claimById.claim; +const metadata = await storage.getMetadata(uri || ""); +const treeResponse = await storage.getData(metadata.allowList); +const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); + +let args; +// Find the proof in the allowlist +for (const [leaf, value] of tree.entries()) { + if (value[0] === address) { + args = { + proofs: tree.getProof(leaf), + units: Number(value[1]), + claimId: _id, + }; + break; + } +} + +// Mint fraction token +const tx = await hypercerts.mintClaimFractionFromAllowlist({ + ...args, +}); +``` + +Let's see what happens under the hood: + +First, the method checks that the client is not `read only` and that the operator is a signer. If not, it throws an `InvalidOrMissingError`. + +Next, the method verifies the Merkle `proof` using the OpenZeppelin Merkle tree library. If a `root` is provided, the method uses it to verify the proof. If the proof is invalid, it throws an error. + +Finally, the method calls the `mintClaimFromAllowlist` function on the contract with the signer `address`, Merkle `proof`, `claim ID`, and number of `units` as parameters. If overrides are provided, the method uses them to send the transaction. Otherwise, it sends the transaction without overrides. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md new file mode 100644 index 00000000..e31e8840 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md @@ -0,0 +1,434 @@ +# HypercertTrader + +_bitbeckers_ + +> Contract for managing hypercert trades + +Implementation of the HypercertTrader Interface + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsForSale | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +### getOffer + +```solidity +function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------- | ----------- | +| \_0 | IHypercertTrader.Offer | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### offers + +```solidity +function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | --------------------------------- | ----------- | +| offerer | address | undefined | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsAvailable | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| offerType | enum IHypercertTrader.OfferType | undefined | +| status | enum IHypercertTrader.OfferStatus | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### totalUnitsForSale + +```solidity +function totalUnitsForSale(address, uint256) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +## Errors + +### InvalidBuy + +```solidity +error InvalidBuy(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### InvalidOffer + +```solidity +error InvalidOffer(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### NotAllowed + +```solidity +error NotAllowed() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md new file mode 100644 index 00000000..13a84632 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md @@ -0,0 +1,39 @@ +# IHypercertMinter + +## Methods + +### ownerOf + +```solidity +function ownerOf(uint256 id) external view returns (address) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 id) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md new file mode 100644 index 00000000..6be07157 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md @@ -0,0 +1,77 @@ +# AggregatorV3Interface + +## Methods + +### decimals + +```solidity +function decimals() external view returns (uint8) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ----- | ----------- | +| \_0 | uint8 | undefined | + +### description + +```solidity +function description() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### getRoundData + +```solidity +function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------ | ----------- | +| \_roundId | uint80 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### latestRoundData + +```solidity +function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### version + +```solidity +function version() external view returns (uint256) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md new file mode 100644 index 00000000..8d14ad8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md @@ -0,0 +1 @@ +# console diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md new file mode 100644 index 00000000..cb666cd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md @@ -0,0 +1,3 @@ +# console2 + +_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md new file mode 100644 index 00000000..06fb700c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md @@ -0,0 +1,133 @@ +# IHypercertTrader + +_bitbeckers_ + +> Interface for hypercert token trading + +This interface declares the required functionality to interact with the hypercert marketplace + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| units | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +## Events + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md new file mode 100644 index 00000000..4cb96bfc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md @@ -0,0 +1,46 @@ +# BatchOrderTypehashRegistry + +_LooksRare protocol team (👀,💎)_ + +> BatchOrderTypehashRegistry + +The contract generates the batch order hash that is used to compute the digest for signature verification. + +## Methods + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +## Errors + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md new file mode 100644 index 00000000..a32aef65 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md @@ -0,0 +1,76 @@ +# CreatorFeeManagerWithRebates + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRebates + +This contract returns the creator fee address and the creator rebate amount. + +## Methods + +### STANDARD_ROYALTY_FEE_BP + +```solidity +function STANDARD_ROYALTY_FEE_BP() external view returns (uint256) +``` + +Standard royalty fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md new file mode 100644 index 00000000..41cab900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md @@ -0,0 +1,64 @@ +# CreatorFeeManagerWithRoyalties + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRoyalties + +This contract returns the creator fee address and the creator fee amount. + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +_There are two on-chain sources for the royalty fee to distribute. 1. RoyaltyFeeRegistry: It is an on-chain registry where creator fee is defined for all items of a collection. 2. ERC2981: The NFT Royalty Standard where royalty fee is defined at a itemId level in a collection. The on-chain logic looks up the registry first. If it does not find anything, it checks if a collection is ERC2981. If so, it fetches the proper royalty information for the itemId. For a bundle that contains multiple itemIds (for a collection using ERC2981), if the royalty fee/recipient differ among the itemIds part of the bundle, the trade reverts. This contract DOES NOT enforce any restriction for extremely high creator fee, nor verifies the creator fee fetched is inferior to the total price. If any contract relies on it to build an on-chain royalty logic, it should implement protection against: (1) high royalties (2) potential unexpected royalty changes that can occur after the creation of the order._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md new file mode 100644 index 00000000..9ff1c0fc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md @@ -0,0 +1,250 @@ +# CurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> CurrencyManager + +This contract manages the list of valid fungible currencies. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md new file mode 100644 index 00000000..83eefc37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md @@ -0,0 +1,751 @@ +# ExecutionManager + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> ExecutionManager + +This contract handles the execution and resolution of transactions. A transaction is executed on-chain when an off-chain maker order is matched by on-chain taker order of a different kind. For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md new file mode 100644 index 00000000..022cce57 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md @@ -0,0 +1,9 @@ +# InheritedStrategy + +_LooksRare protocol team (👀,💎)_ + +> InheritedStrategy + +This contract handles the verification of parameters for standard transactions. It does not verify the taker struct's itemIds and amounts array as well as minPrice (taker ask) / maxPrice (taker bid) because before the taker executes the transaction and the maker itemIds/amounts/price should have already been confirmed off-chain. + +_A standard transaction (bid or ask) is mapped to strategyId = 0._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md new file mode 100644 index 00000000..cc542c7e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -0,0 +1,1157 @@ +# LooksRareProtocol + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> LooksRareProtocol + +This contract is the core smart contract of the LooksRare protocol ("v2"). It is the main entry point for users to initiate transactions with taker orders and manage the cancellation of maker orders, which exist off-chain. ~~~~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~- ~~~~~~~~ ~~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~~ ~~~~~~~~ ~~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~~~~ + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ETH. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### chainId + +```solidity +function chainId() external view returns (uint256) +``` + +Current chainId. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +Current domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### restrictedExecuteTakerBid + +```solidity +function restrictedExecuteTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, address sender, bytes32 orderHash) external nonpayable returns (uint256 protocolFeeAmount) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| sender | address | undefined | +| orderHash | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| protocolFeeAmount | uint256 | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateDomainSeparator + +```solidity +function updateDomainSeparator() external nonpayable +``` + +This function allows the owner to update the domain separator (if possible). + +_Only callable by owner. If there is a fork of the network with a new chainId, it allows the owner to reset the domain separator for the new chain id._ + +### updateETHGasLimitForTransfer + +```solidity +function updateETHGasLimitForTransfer(uint256 newGasLimitETHTransfer) external nonpayable +``` + +This function allows the owner to update the maximum ETH gas limit for a standard transfer. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------ | +| newGasLimitETHTransfer | uint256 | New gas limit for ETH transfer | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------- | +| gasLimitETHTransfer | uint256 | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| askUser | address | undefined | +| bidUser | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| bidUser | address | undefined | +| bidRecipient | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +## Errors + +### CallerInvalid + +```solidity +error CallerInvalid() +``` + +It is returned if the function cannot be called by the sender. + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### CurrencyInvalid + +```solidity +error CurrencyInvalid() +``` + +It is returned if the currency is invalid. + +### ERC20TransferFromFail + +```solidity +error ERC20TransferFromFail() +``` + +It is emitted if the ERC20 transferFrom fails. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### QuoteTypeInvalid + +```solidity +error QuoteTypeInvalid() +``` + +It is returned if the maker quote type is invalid. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md new file mode 100644 index 00000000..fea95495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md @@ -0,0 +1,193 @@ +# NonceManager + +_LooksRare protocol team (👀,💎)_ + +> NonceManager + +This contract handles the nonce logic that is used for invalidating maker orders that exist off-chain. The nonce logic revolves around three parts at the user level: - order nonce (orders sharing an order nonce are conditional, OCO-like) - subset (orders can be grouped under a same subset) - bid/ask (all orders can be executed only if the bid/ask nonce matches the user's one on-chain) Only the order nonce is invalidated at the time of the execution of a maker order that contains it. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md new file mode 100644 index 00000000..36f6a35c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md @@ -0,0 +1,75 @@ +# ProtocolFeeRecipient + +_LooksRare protocol team (👀,💎)_ + +> ProtocolFeeRecipient + +This contract is used to receive protocol fees and transfer them to the fee sharing setter. Fee sharing setter cannot receive ETH directly, so we need to use this contract as a middleman to convert ETH into WETH before sending it. + +## Methods + +### FEE_SHARING_SETTER + +```solidity +function FEE_SHARING_SETTER() external view returns (address) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### WETH + +```solidity +function WETH() external view returns (contract IWETH) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------- | ----------- | +| \_0 | contract IWETH | undefined | + +### transferERC20 + +```solidity +function transferERC20(address currency) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------------- | +| currency | address | ERC20 currency address | + +### transferETH + +```solidity +function transferETH() external nonpayable +``` + +## Errors + +### ERC20TransferFail + +```solidity +error ERC20TransferFail() +``` + +It is emitted if the ERC20 transfer fails. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NothingToTransfer + +```solidity +error NothingToTransfer() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md new file mode 100644 index 00000000..a55f3985 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md @@ -0,0 +1,391 @@ +# StrategyManager + +_LooksRare protocol team (👀,💎)_ + +> StrategyManager + +This contract handles the addition and the update of execution strategies. + +## Methods + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md new file mode 100644 index 00000000..c6766114 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md @@ -0,0 +1,553 @@ +# TransferManager + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> TransferManager + +This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. + +_"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ + +## Methods + +### allowOperator + +```solidity +function allowOperator(address operator) external nonpayable +``` + +This function allows an operator to be added for the shared transfer system. Once the operator is allowed, users can grant NFT approvals to this operator. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------------- | +| operator | address | Operator address to allow | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### grantApprovals + +```solidity +function grantApprovals(address[] operators) external nonpayable +``` + +This function allows a user to grant approvals for an array of operators. Users cannot grant approvals if the operator is not allowed by this contract's owner. + +_Each operator address must be globally allowed to be approved._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### hasUserApprovedOperator + +```solidity +function hasUserApprovedOperator(address, address) external view returns (bool) +``` + +This returns whether the user has approved the operator address. The first address is the user and the second address is the operator (e.g. LooksRareProtocol). + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isOperatorAllowed + +```solidity +function isOperatorAllowed(address) external view returns (bool) +``` + +This returns whether the operator address is allowed by this contract's owner. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### removeOperator + +```solidity +function removeOperator(address operator) external nonpayable +``` + +This function allows the user to remove an operator for the shared transfer system. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | -------------------------- | +| operator | address | Operator address to remove | + +### revokeApprovals + +```solidity +function revokeApprovals(address[] operators) external nonpayable +``` + +This function allows a user to revoke existing approvals for an array of operators. + +_Each operator address must be approved at the user level to be revoked._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### splitItemsHypercert + +```solidity +function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function splits and transfers a fraction of a hypercert. + +_It does not allow batch transferring._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferBatchItemsAcrossCollections + +```solidity +function transferBatchItemsAcrossCollections(ITransferManager.BatchTransferItem[] items, address from, address to) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------------------------ | ----------- | +| items | ITransferManager.BatchTransferItem[] | undefined | +| from | address | undefined | +| to | address | undefined | + +### transferItemsERC1155 + +```solidity +function transferItemsERC1155(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC1155 collection. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsERC721 + +```solidity +function transferItemsERC721(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC721 collection. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsHypercert + +```solidity +function transferItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single Hypercert. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### ERC1155SafeBatchTransferFromFail + +```solidity +error ERC1155SafeBatchTransferFromFail() +``` + +It is emitted if the ERC1155 safeBatchTransferFrom fails. + +### ERC1155SafeTransferFromFail + +```solidity +error ERC1155SafeTransferFromFail() +``` + +It is emitted if the ERC1155 safeTransferFrom fails. + +### ERC721TransferFromFail + +```solidity +error ERC721TransferFromFail() +``` + +It is emitted if the ERC721 transferFrom fails. + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md new file mode 100644 index 00000000..9011bd50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md @@ -0,0 +1,779 @@ +# TransferSelectorNFT + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> TransferSelectorNFT + +This contract handles the logic for transferring non-fungible items. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md new file mode 100644 index 00000000..37866658 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md @@ -0,0 +1,41 @@ +# BaseStrategy + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md new file mode 100644 index 00000000..c9503939 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md @@ -0,0 +1,212 @@ +# BaseStrategyChainlinkPriceLatency + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategyChainlinkPriceLatency + +This contract allows the owner to define the maximum acceptable Chainlink price latency. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md new file mode 100644 index 00000000..e2d77dd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md @@ -0,0 +1,342 @@ +# StrategyChainlinkUSDDynamicAsk + +_LooksRare protocol team (👀,💎)_ + +> StrategyChainlinkUSDDynamicAsk + +This contract allows a seller to sell an NFT priced in USD and the receivable amount to be in ETH. + +## Methods + +### ETH_USD_PRICE_FEED_DECIMALS + +```solidity +function ETH_USD_PRICE_FEED_DECIMALS() external view returns (uint256) +``` + +_It is possible to call priceFeed.decimals() to get the decimals, but to save gas, it is hard coded instead._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ether (WETH) address. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### priceFeed + +```solidity +function priceFeed() external view returns (contract AggregatorV3Interface) +``` + +ETH/USD Chainlink price feed + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------------ | ----------- | +| \_0 | contract AggregatorV3Interface | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### ChainlinkPriceInvalid + +```solidity +error ChainlinkPriceInvalid() +``` + +It is returned if the Chainlink price is invalid (e.g. negative). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. + +### PriceNotRecentEnough + +```solidity +error PriceNotRecentEnough() +``` + +It is returned if the current block time relative to the latest price's update time is greater than the latency tolerance. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md new file mode 100644 index 00000000..ddec4495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md @@ -0,0 +1,127 @@ +# StrategyCollectionOffer + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> StrategyCollectionOffer + +This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount must be 1 (fractions are NFTs) + +## Methods + +### executeCollectionStrategyWithTakerAsk + +```solidity +function executeCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithAllowlist + +```solidity +function executeCollectionStrategyWithTakerAskWithAllowlist(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithProof + +```solidity +function executeCollectionStrategyWithTakerAskWithProof(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md new file mode 100644 index 00000000..1227878d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md @@ -0,0 +1,83 @@ +# StrategyDutchAuction + +_LooksRare protocol team (👀,💎)_ + +> StrategyDutchAuction + +This contract offers a single execution strategy for users to create Dutch auctions. + +## Methods + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md new file mode 100644 index 00000000..daa427e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -0,0 +1,123 @@ +# StrategyHypercertFractionOffer + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> StrategyHypercertFractionOffer + +This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. + +_Use cases can include tiered pricing; think early bird tickets._ + +## Methods + +### executeHypercertFractionStrategyWithTakerBid + +```solidity +function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeHypercertFractionStrategyWithTakerBidWithAllowlist + +```solidity +function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md new file mode 100644 index 00000000..6a1f0cd5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md @@ -0,0 +1,75 @@ +# StrategyItemIdsRange + +_LooksRare protocol team (👀,💎)_ + +> StrategyItemIdsRange + +This contract offers a single execution strategy for users to bid on a specific amount of items in a range bounded by 2 item ids. + +## Methods + +### executeStrategyWithTakerAsk + +```solidity +function executeStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md new file mode 100644 index 00000000..76918fc5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md @@ -0,0 +1,215 @@ +# OrderValidatorV2A + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderValidatorV2A + +This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) + +_This version does not handle strategies with partial fills._ + +## Methods + +### CRITERIA_GROUPS + +```solidity +function CRITERIA_GROUPS() external view returns (uint256) +``` + +Number of distinct criteria groups checked to evaluate the validity of an order. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### ERC1155_INTERFACE_ID + +```solidity +function ERC1155_INTERFACE_ID() external view returns (bytes4) +``` + +ERC1155 interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_1 + +```solidity +function ERC721_INTERFACE_ID_1() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_2 + +```solidity +function ERC721_INTERFACE_ID_2() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### HYPERCERT_INTERFACE_ID + +```solidity +function HYPERCERT_INTERFACE_ID() external view returns (bytes4) +``` + +Hypercert interfaceId + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### checkMakerOrderValidity + +```solidity +function checkMakerOrderValidity(OrderStructs.Maker makerOrder, bytes signature, OrderStructs.MerkleTree merkleTree) external view returns (uint256[9] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| signature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ---------- | ----------- | +| validationCodes | uint256[9] | undefined | + +### checkMultipleMakerOrderValidities + +```solidity +function checkMultipleMakerOrderValidities(OrderStructs.Maker[] makerOrders, bytes[] signatures, OrderStructs.MerkleTree[] merkleTrees) external view returns (uint256[9][] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------------------------- | ----------- | +| makerOrders | OrderStructs.Maker[] | undefined | +| signatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------------ | ----------- | +| validationCodes | uint256[9][] | undefined | + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +CreatorFeeManager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### deriveProtocolParameters + +```solidity +function deriveProtocolParameters() external nonpayable +``` + +Derive protocol parameters. Anyone can call this function. + +_It allows adjusting if the domain separator or creator fee manager address were to change._ + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +LooksRareProtocol domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +LooksRareProtocol. + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint256) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +TransferManager + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md new file mode 100644 index 00000000..91be29a9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md @@ -0,0 +1,159 @@ +# ProtocolHelpers + +_LooksRare protocol team (👀,💎)_ + +> ProtocolHelpers + +This contract contains helper view functions for order creation. + +## Methods + +### computeDigestMerkleTree + +```solidity +function computeDigestMerkleTree(OrderStructs.MerkleTree merkleTree) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### computeMakerDigest + +```solidity +function computeMakerDigest(OrderStructs.Maker maker) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### verifyMakerSignature + +```solidity +function verifyMakerSignature(OrderStructs.Maker maker, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### verifyMerkleTree + +```solidity +function verifyMerkleTree(OrderStructs.MerkleTree merkleTree, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Errors + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md new file mode 100644 index 00000000..b832744e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md @@ -0,0 +1,60 @@ +# ICreatorFeeManager + +_LooksRare protocol team (👀,💎)_ + +> ICreatorFeeManager + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry royaltyFeeRegistry) +``` + +It returns the royalty fee registry address/interface. + +#### Returns + +| Name | Type | Description | +| ------------------ | ---------------------------- | ------------------------------------- | +| royaltyFeeRegistry | contract IRoyaltyFeeRegistry | Interface of the royalty fee registry | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md new file mode 100644 index 00000000..da683d8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md @@ -0,0 +1,22 @@ +# ICurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> ICurrencyManager + +## Events + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------------------------------- | +| currency | address | Currency address (address(0) = ETH) | +| isAllowed | bool | Whether the currency is allowed | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md new file mode 100644 index 00000000..0e86c75b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md @@ -0,0 +1,99 @@ +# IExecutionManager + +_LooksRare protocol team (👀,💎)_ + +> IExecutionManager + +## Events + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | -------------------------------------- | +| creatorFeeManager | address | Address of the new creator fee manager | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ---------------------------------------- | +| maxCreatorFeeBp | uint256 | New maximum creator fee (in basis point) | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------------------------------------- | +| protocolFeeRecipient | address | Address of the new protocol fee recipient | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md new file mode 100644 index 00000000..393cb24b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md @@ -0,0 +1,41 @@ +# IImmutableCreate2Factory + +## Methods + +### findCreate2Address + +```solidity +function findCreate2Address(bytes32 salt, bytes initializationCode) external view returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | + +### safeCreate2 + +```solidity +function safeCreate2(bytes32 salt, bytes initializationCode) external payable returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md new file mode 100644 index 00000000..e7414f54 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md @@ -0,0 +1,157 @@ +# ILooksRareProtocol + +_LooksRare protocol team (👀,💎)_ + +> ILooksRareProtocol + +## Methods + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +## Events + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------------------------- | +| gasLimitETHTransfer | uint256 | Gas limit for an ETH transfer | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| askUser | address | Address of the ask user | +| bidUser | address | Address of the bid user | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it can be the taker ask user or different) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| bidUser | address | Address of the bid user | +| bidRecipient | address | Address of the recipient of the bid | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it is the maker ask user) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +## Errors + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md new file mode 100644 index 00000000..eaa3f977 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md @@ -0,0 +1,53 @@ +# INonceManager + +_LooksRare protocol team (👀,💎)_ + +> INonceManager + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------- | +| user | address | Address of the user | +| bidNonce | uint256 | New bid nonce | +| askNonce | uint256 | New ask nonce | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ------------------------------- | +| user | address | Address of the user | +| orderNonces | uint256[] | Array of order nonces cancelled | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | -------------------------------- | +| user | address | Address of the user | +| subsetNonces | uint256[] | Array of subset nonces cancelled | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md new file mode 100644 index 00000000..5ed0ef6c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md @@ -0,0 +1,29 @@ +# IRoyaltyFeeRegistry + +_LooksRare protocol team (👀,💎)_ + +> IRoyaltyFeeRegistry + +## Methods + +### royaltyInfo + +```solidity +function royaltyInfo(address collection, uint256 price) external view returns (address receiver, uint256 royaltyFee) +``` + +This function returns the royalty information for a collection at a given transaction price. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | + +#### Returns + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| receiver | address | Receiver address | +| royaltyFee | uint256 | Royalty fee amount | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md new file mode 100644 index 00000000..2b4a45bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md @@ -0,0 +1,41 @@ +# IStrategy + +_LooksRare protocol team (👀,💎)_ + +> IStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool isStrategy) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---------- | ---- | ---------------------------------------------- | +| isStrategy | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md new file mode 100644 index 00000000..ae6ea7b1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md @@ -0,0 +1,84 @@ +# IStrategyManager + +_LooksRare protocol team (👀,💎)_ + +> IStrategyManager + +## Events + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------------- | +| strategyId | uint256 | Id of the new strategy | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the transaction to be executed | +| isMakerBid | bool | Whether the strategyId is for maker bid | +| implementation | address | Address of the implementation of the strategy | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | -------------------------------------------------------- | +| strategyId | uint256 | Id of the strategy | +| isActive | bool | Whether the strategy is active (or not) after the update | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | + +## Errors + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md new file mode 100644 index 00000000..3ba8ca81 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md @@ -0,0 +1,111 @@ +# ITransferManager + +_LooksRare protocol team (👀,💎)_ + +> ITransferManager + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +## Errors + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md new file mode 100644 index 00000000..1b1f41a2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md @@ -0,0 +1,7 @@ +# CurrencyValidator + +_LooksRare protocol team (👀,💎)_ + +> CurrencyValidator + +This library validates the order currency to be the chain's native currency or the specified ERC20 token. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md new file mode 100644 index 00000000..5951cc56 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md @@ -0,0 +1,21 @@ +# LowLevelHypercertCaller + +_bitbeckers_ + +> LowLevelHypercertCaller + +This contract contains low-level calls to transfer ERC1155 tokens. + +## Errors + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### NotAContract + +```solidity +error NotAContract() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md new file mode 100644 index 00000000..943a54cd --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md @@ -0,0 +1,7 @@ +# MerkleProofCalldataWithNodes + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofCalldataWithNodes + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md new file mode 100644 index 00000000..37529181 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md @@ -0,0 +1,7 @@ +# MerkleProofMemory + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofMemory + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md new file mode 100644 index 00000000..6ffa83e2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md @@ -0,0 +1,7 @@ +# OrderStructs + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderStructs + +This library contains all order struct types for the LooksRare protocol (v2). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll new file mode 100644 index 00000000..e2ac6616 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md new file mode 100644 index 00000000..b1434ab0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md @@ -0,0 +1,185 @@ +Hypercerts SDK Documentation / [Exports](modules.md) + +# Hypercert SDK + +## Quickstart Guide + +1. Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +``` + +or + +```bash + yarn add @hypercerts-org/sdk +``` + +2. Import the SDK into your project: + +```bash +import { HypercertClient } from "@hypercerts-org/sdk"; +``` + +3. Create a new instance of the HypercertClient class with your configuration options: + +```js +const client = new HypercertClient({ + chainId: 5, + provider, + signer, + nftStorageToken, + web3StorageToken, +}); +``` + +> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in +> [read-only mode](#read-only-mode) + +4. Use the client object to interact with the Hypercert network. + +For example, you can use the `client.mintClaim` method to create a new claim: + +```js +const tx = await client.mintClaim( + metaData, + totalUnits, + transferRestriction, + overrides, +); +``` + +This will validate the metadata, store it on IPFS, create a new hypercert on-chain and return a transaction receipt. + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more information on how to use the SDK, check out the +[developer documentation](https://hypercerts.org/docs/developer/) and the +[Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. Don't forget to set your +environment variables for your NFT.storage and web3.storage API keys in your .env file. + +## Config + +The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check +the environment variables. + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without a signer or provider. +- The client was initialized with a provider but not a signer. +- The client was initialized with a signer but not a provider. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a +warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief +explanation of each constant: + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphName": "hypercerts-testnet" + } +} +``` + +### Client config properties + +| \| Property | Type | Description | +| ------------------ | -------------------- | -------------------------------------- | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | +| `graphName` | `string` | The name of the Gsubgraph to use. | +| `provider` | `providers.Provider` | A custom provider to use. | +| `signer` | `Signer` | A custom signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +### Environment variables + +To determine the missing configuration values the SDK defaults to the following environment variables: + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +## Client modules + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and +NFT.storage. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the storage, indexer, and contract getters, the HypercertClient allows +developers to easily interact with the various components of the Hypercert system. For example, a developer could use +the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based +on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the +contract. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md new file mode 100644 index 00000000..89f2105f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError + +# Class: ClientError + +An error that is caused by a problem with the client. + +## Hierarchy + +- `Error` + + ↳ **`ClientError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ClientError.md#constructor) + +### Properties + +- [payload](ClientError.md#payload) + +## Constructors + +### constructor + +• **new ClientError**(`message`, `payload?`) + +Creates a new instance of the ClientError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md new file mode 100644 index 00000000..03813867 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md @@ -0,0 +1,66 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError + +# Class: ConfigurationError + +The configuration was invalid + +## Hierarchy + +- `Error` + + ↳ **`ConfigurationError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ConfigurationError.md#constructor) + +### Properties + +- [payload](ConfigurationError.md#payload) + +## Constructors + +### constructor + +• **new ConfigurationError**(`message`, `payload?`) + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `message` | `string` | +| `payload?` | `Object` | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md new file mode 100644 index 00000000..d4c9f7c9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError + +# Class: FetchError + +Fails fetching a remote resource + +## Hierarchy + +- `Error` + + ↳ **`FetchError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](FetchError.md#constructor) + +### Properties + +- [payload](FetchError.md#payload) + +## Constructors + +### constructor + +• **new FetchError**(`message`, `payload?`) + +Creates a new instance of the FetchError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md new file mode 100644 index 00000000..a5a0e900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md @@ -0,0 +1,493 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient + +# Class: HypercertClient + +Hypercerts client factory + +**`Dev`** + +Creates a Hypercerts client instance + +**`Notice`** + +The client is readonly if no signer is set or if the contract address is not set + +**`Param`** + +Hypercerts client configuration + +**`Param`** + +Hypercerts storage object + +## Implements + +- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertClient.md#constructor) + +### Properties + +- [\_config](HypercertClient.md#_config) +- [\_contract](HypercertClient.md#_contract) +- [\_evaluator](HypercertClient.md#_evaluator) +- [\_indexer](HypercertClient.md#_indexer) +- [\_operator](HypercertClient.md#_operator) +- [\_storage](HypercertClient.md#_storage) +- [readonly](HypercertClient.md#readonly) + +### Accessors + +- [contract](HypercertClient.md#contract) +- [indexer](HypercertClient.md#indexer) +- [storage](HypercertClient.md#storage) + +### Methods + +- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClient.md#burnclaimfraction) +- [checkWritable](HypercertClient.md#checkwritable) +- [createAllowlist](HypercertClient.md#createallowlist) +- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) +- [mintClaim](HypercertClient.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClient.md#splitclaimunits) + +## Constructors + +### constructor + +• **new HypercertClient**(`config?`) + +Creates a new instance of the `HypercertClient` class. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | + +#### Defined in + +[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) + +## Properties + +### \_config + +• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) + +#### Defined in + +[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) + +--- + +### \_contract + +• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +#### Defined in + +[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) + +--- + +### \_evaluator + +• `Private` **\_evaluator**: [`default`](internal.default.md) + +#### Defined in + +[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) + +--- + +### \_indexer + +• `Private` **\_indexer**: [`default`](internal.default-1.md) + +#### Defined in + +[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) + +--- + +### \_operator + +• `Private` **\_operator**: `Provider` \| `Signer` + +#### Defined in + +[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) + +--- + +### \_storage + +• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) + +#### Defined in + +[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) + +## Accessors + +### contract + +• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +Gets the HypercertMinter contract used by the client. + +#### Returns + +[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +The contract. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) + +#### Defined in + +[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) + +--- + +### indexer + +• `get` **indexer**(): [`default`](internal.default-1.md) + +Gets the indexer for the client. + +#### Returns + +[`default`](internal.default-1.md) + +The indexer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) + +#### Defined in + +[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) + +--- + +### storage + +• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) + +Gets the storage layer for the client. + +#### Returns + +[`HypercertsStorage`](HypercertsStorage.md) + +The storage layer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) + +#### Defined in + +[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) + +## Methods + +### batchMintClaimFractionsFromAllowlists + +▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | +| `roots?` | `BytesLike`[] | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Implementation of + +HypercertClientInterface.batchMintClaimFractionsFromAllowlists + +#### Defined in + +[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) + +--- + +### burnClaimFraction + +▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> + +Burn a Hypercert claim by providing the claim id + +**`Dev`** + +Burns a Hypercert claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :----------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.burnClaimFraction + +#### Defined in + +[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) + +--- + +### checkWritable + +▸ `Private` **checkWritable**(): `boolean` + +#### Returns + +`boolean` + +#### Defined in + +[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) + +--- + +### createAllowlist + +▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Create a Hypercert claim with an allowlist + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist + +**`Notice`** + +The total number of units in the allowlist must match the total number of units for the Hypercert + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.createAllowlist + +#### Defined in + +[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) + +--- + +### mergeClaimUnits + +▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> + +Merge multiple Hypercert claims fractions into one + +**`Dev`** + +Merges multiple Hypercert claims into one + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :------------------ | +| `claimIds` | `BigNumberish`[] | Hypercert claim ids | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mergeClaimUnits + +#### Defined in + +[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) + +--- + +### mintClaim + +▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units and transfer restrictions + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaim + +#### Defined in + +[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) + +--- + +### mintClaimFractionFromAllowlist + +▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim fraction from an allowlist. + +**`Dev`** + +Verifies the claim proof and mints the claim fraction + +**`Notice`** + +If known, provide the root for client side verification + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `units` | `BigNumberish` | Number of units to mint | +| `proof` | `BytesLike`[] | Merkle proof for the claim | +| `root?` | `BytesLike` | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaimFractionFromAllowlist + +#### Defined in + +[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) + +--- + +### splitClaimUnits + +▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> + +Split a Hypercert's unit into multiple claims with the given fractions + +**`Dev`** + +Submit the ID of the claim to split and new fraction values. + +**`Notice`** + +The sum of the fractions must be equal to the total units of the claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.splitClaimUnits + +#### Defined in + +[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md new file mode 100644 index 00000000..706c14fe --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md @@ -0,0 +1,250 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage + +# Class: HypercertsStorage + +A class that provides storage functionality for Hypercerts. + +## Implements + +- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertsStorage.md#constructor) + +### Properties + +- [nftStorageClient](HypercertsStorage.md#nftstorageclient) +- [readonly](HypercertsStorage.md#readonly) +- [web3StorageClient](HypercertsStorage.md#web3storageclient) + +### Methods + +- [getData](HypercertsStorage.md#getdata) +- [getMetadata](HypercertsStorage.md#getmetadata) +- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) +- [storeData](HypercertsStorage.md#storedata) +- [storeMetadata](HypercertsStorage.md#storemetadata) + +## Constructors + +### constructor + +• **new HypercertsStorage**(`overrides`) + +Creates a new instance of the `HypercertsStorage` class. + +#### Parameters + +| Name | Type | Description | +| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | +| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | + +#### Defined in + +[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) + +## Properties + +### nftStorageClient + +• `Optional` **nftStorageClient**: `NFTStorage` + +The NFT storage client. + +#### Defined in + +[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +Whether the storage is read-only. + +#### Defined in + +[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) + +--- + +### web3StorageClient + +• `Optional` **web3StorageClient**: `any` + +The Web3 storage client. + +#### Defined in + +[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) + +## Methods + +### getData + +▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> + +Gets arbitrary data from Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the data cannot be retrieved. + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :-------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | + +#### Returns + +`Promise`<`any`\> + +A Promise that resolves to the data. + +#### Implementation of + +HypercertStorageInterface.getData + +#### Defined in + +[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) + +--- + +### getMetadata + +▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +Gets metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. E.g. unknown schema + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------ | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | + +#### Returns + +`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +A Promise that resolves to the metadata. + +#### Implementation of + +HypercertStorageInterface.getMetadata + +#### Defined in + +[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) + +--- + +### getNftStorageGatewayUri + +▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` + +#### Parameters + +| Name | Type | +| :------------- | :------- | +| `cidOrIpfsUri` | `string` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) + +--- + +### storeData + +▸ **storeData**(`data`): `Promise`<`CIDString`\> + +Stores arbitrary data in Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Notice`** + +Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Implementation of + +HypercertStorageInterface.storeData + +#### Defined in + +[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) + +--- + +### storeMetadata + +▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> + +Stores metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. + +**`Notice`** + +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------------------------------------------------------- | :--------------------- | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Implementation of + +HypercertStorageInterface.storeMetadata + +#### Defined in + +[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md new file mode 100644 index 00000000..d12c0653 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError + +# Class: InvalidOrMissingError + +The provided value was undefined or empty + +## Hierarchy + +- `Error` + + ↳ **`InvalidOrMissingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](InvalidOrMissingError.md#constructor) + +### Properties + +- [payload](InvalidOrMissingError.md#payload) + +## Constructors + +### constructor + +• **new InvalidOrMissingError**(`message`, `payload?`) + +Creates a new instance of the InvalidOrMissingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md new file mode 100644 index 00000000..028129d8 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError + +# Class: MalformedDataError + +Data doesn't conform to expectations + +## Hierarchy + +- `Error` + + ↳ **`MalformedDataError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MalformedDataError.md#constructor) + +### Properties + +- [payload](MalformedDataError.md#payload) + +## Constructors + +### constructor + +• **new MalformedDataError**(`message`, `payload?`) + +Creates a new instance of the MalformedDataError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md new file mode 100644 index 00000000..de284494 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError + +# Class: MintingError + +Minting transaction failed + +## Hierarchy + +- `Error` + + ↳ **`MintingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MintingError.md#constructor) + +### Properties + +- [payload](MintingError.md#payload) + +## Constructors + +### constructor + +• **new MintingError**(`message`, `payload?`) + +Creates a new instance of the MintingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md new file mode 100644 index 00000000..0dcf0291 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError + +# Class: StorageError + +Fails storing to a remote resource + +## Hierarchy + +- `Error` + + ↳ **`StorageError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](StorageError.md#constructor) + +### Properties + +- [payload](StorageError.md#payload) + +## Constructors + +### constructor + +• **new StorageError**(`message`, `payload?`) + +Creates a new instance of the StorageError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md new file mode 100644 index 00000000..5fdb25e0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md @@ -0,0 +1,71 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError + +# Class: UnknownSchemaError + +Schema could not be loaded + +## Hierarchy + +- `Error` + + ↳ **`UnknownSchemaError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnknownSchemaError.md#constructor) + +### Properties + +- [payload](UnknownSchemaError.md#payload) + +## Constructors + +### constructor + +• **new UnknownSchemaError**(`message`, `payload?`) + +Creates a new instance of the UnknownSchemaError class. + +#### Parameters + +| Name | Type | Description | +| :------------------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.schemaName` | `string` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :----------- | :------- | +| `schemaName` | `string` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md new file mode 100644 index 00000000..0964b138 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md @@ -0,0 +1,72 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError + +# Class: UnsupportedChainError + +This blockchain is not yet supported +Please file an issue + +## Hierarchy + +- `Error` + + ↳ **`UnsupportedChainError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnsupportedChainError.md#constructor) + +### Properties + +- [payload](UnsupportedChainError.md#payload) + +## Constructors + +### constructor + +• **new UnsupportedChainError**(`message`, `payload?`) + +Creates a new instance of the UnsupportedChainError class. + +#### Parameters + +| Name | Type | Description | +| :---------------- | :---------------------------------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.chainID` | `undefined` \| `string` \| `number` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :-------- | :---------------------------------- | +| `chainID` | `undefined` \| `string` \| `number` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md new file mode 100644 index 00000000..1b94a629 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md @@ -0,0 +1,278 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +A class that provides indexing functionality for Hypercerts. + +## Implements + +- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default-1.md#constructor) + +### Properties + +- [\_graphClient](internal.default-1.md#_graphclient) + +### Accessors + +- [graphClient](internal.default-1.md#graphclient) + +### Methods + +- [claimById](internal.default-1.md#claimbyid) +- [claimsByOwner](internal.default-1.md#claimsbyowner) +- [firstClaims](internal.default-1.md#firstclaims) +- [fractionById](internal.default-1.md#fractionbyid) +- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) +- [fractionsByOwner](internal.default-1.md#fractionsbyowner) + +## Constructors + +### constructor + +• **new default**(`options`) + +Creates a new instance of the `HypercertIndexer` class. + +#### Parameters + +| Name | Type | Description | +| :------------------ | :------- | :----------------------------------------- | +| `options` | `Object` | The configuration options for the indexer. | +| `options.graphUrl?` | `string` | - | + +#### Defined in + +[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) + +## Properties + +### \_graphClient + +• `Private` **\_graphClient**: `Object` + +The Graph client used by the indexer. + +#### Type declaration + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Defined in + +[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) + +## Accessors + +### graphClient + +• `get` **graphClient**(): `Object` + +Gets the Graph client used by the indexer. + +#### Returns + +`Object` + +The Graph client. + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Implementation of + +[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) + +#### Defined in + +[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) + +## Methods + +### claimById + +▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +Gets a claim by its ID. + +#### Parameters + +| Name | Type | Description | +| :--- | :------- | :------------------- | +| `id` | `string` | The ID of the claim. | + +#### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +A Promise that resolves to the claim. + +#### Implementation of + +HypercertIndexerInterface.claimById + +#### Defined in + +[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) + +--- + +### claimsByOwner + +▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +Gets the claims owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.claimsByOwner + +#### Defined in + +[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) + +--- + +### firstClaims + +▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +Gets the most recent claims. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :-------------------- | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.firstClaims + +#### Defined in + +[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) + +--- + +### fractionById + +▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +Gets a claim token by its ID. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------- | +| `fractionId` | `string` | The ID of the claim token. | + +#### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +A Promise that resolves to the claim token. + +#### Implementation of + +HypercertIndexerInterface.fractionById + +#### Defined in + +[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) + +--- + +### fractionsByClaim + +▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +Gets the claim tokens for a given claim. + +#### Parameters + +| Name | Type | Default value | Description | +| :-------- | :----------------------------------------- | :------------------- | :-------------------- | +| `claimId` | `string` | `undefined` | The ID of the claim. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByClaim + +#### Defined in + +[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) + +--- + +### fractionsByOwner + +▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +Gets the claim tokens owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByOwner + +#### Defined in + +[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md new file mode 100644 index 00000000..1538ce61 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md @@ -0,0 +1,131 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +The EasEvaluator class provides methods for signing off-chain attestations of evaluations. +Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. + +## Table of contents + +### Constructors + +- [constructor](internal.default-2.md#constructor) + +### Properties + +- [offChain](internal.default-2.md#offchain) +- [readonly](internal.default-2.md#readonly) +- [signer](internal.default-2.md#signer) + +### Methods + +- [getSignature](internal.default-2.md#getsignature) +- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) + +## Constructors + +### constructor + +• **new default**(`config`) + +Creates a new EasEvaluator instance. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | + +#### Defined in + +[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) + +## Properties + +### offChain + +• **offChain**: `Offchain` + +The Offchain instance used for signing off-chain attestations. + +#### Defined in + +[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +The TypedDataSigner instance used for signing typed data. + +#### Defined in + +[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) + +## Methods + +### getSignature + +▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> + +Gets a signature for an off-chain attestation. + +#### Parameters + +| Name | Type | Description | +| :------------ | :------- | :------------------------------------------------ | +| `encodedData` | `string` | The encoded data to sign. | +| `recipient` | `string` | The address of the recipient of the attestation. | +| `schemaUid` | `string` | The UID of the schema to use for the attestation. | + +#### Returns + +`Promise`<`SignedOffchainAttestation`\> + +- The signature for the attestation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) + +--- + +### signOfflineEvaluation + +▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> + +Signs an offline evaluation. + +**`Throws`** + +- If the evaluation data is malformed. + +#### Parameters + +| Name | Type | Description | +| :----------- | :----------------------------------------------- | :--------------------------- | +| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | + +#### Returns + +`Promise`<`undefined` \| `SignedOffchainAttestation`\> + +- The signature for the evaluation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md new file mode 100644 index 00000000..86daa5e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md @@ -0,0 +1,110 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +## Implements + +- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default.md#constructor) + +### Properties + +- [eas](internal.default.md#eas) +- [readonly](internal.default.md#readonly) +- [signer](internal.default.md#signer) +- [storage](internal.default.md#storage) + +### Methods + +- [submitEvaluation](internal.default.md#submitevaluation) + +## Constructors + +### constructor + +• **new default**(`config?`) + +#### Parameters + +| Name | Type | +| :------- | :------------------------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | + +#### Defined in + +[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) + +## Properties + +### eas + +• **eas**: [`default`](internal.default-2.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +#### Defined in + +[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) + +--- + +### storage + +• **storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) + +## Methods + +### submitEvaluation + +▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------------------------ | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | + +#### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Implementation of + +EvaluatorInterface.submitEvaluation + +#### Defined in + +[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md new file mode 100644 index 00000000..b4af6279 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md @@ -0,0 +1,39 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError + +# Interface: CustomError + +An interface for errors that have a specific type. + +## Implemented by + +- [`ClientError`](../classes/ClientError.md) +- [`ConfigurationError`](../classes/ConfigurationError.md) +- [`FetchError`](../classes/FetchError.md) +- [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) +- [`MalformedDataError`](../classes/MalformedDataError.md) +- [`MintingError`](../classes/MintingError.md) +- [`StorageError`](../classes/StorageError.md) +- [`UnknownSchemaError`](../classes/UnknownSchemaError.md) +- [`UnsupportedChainError`](../classes/UnsupportedChainError.md) + +## Table of contents + +### Properties + +- [payload](CustomError.md#payload) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Defined in + +[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md new file mode 100644 index 00000000..4606b46e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation + +# Interface: DuplicateEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) +- [explanation](DuplicateEvaluation.md#explanation) +- [realHypercert](DuplicateEvaluation.md#realhypercert) +- [type](DuplicateEvaluation.md#type) + +## Properties + +### duplicateHypercerts + +• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] + +#### Defined in + +[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) + +--- + +### explanation + +• **explanation**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) + +--- + +### realHypercert + +• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) + +--- + +### type + +• **type**: `"duplicate"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md new file mode 100644 index 00000000..205b7004 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation + +# Interface: EASEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](EASEvaluation.md#chainid) +- [contract](EASEvaluation.md#contract) +- [type](EASEvaluation.md#type) +- [uid](EASEvaluation.md#uid) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) + +--- + +### type + +• **type**: `"EAS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) + +--- + +### uid + +• **uid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md new file mode 100644 index 00000000..3dcea656 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -0,0 +1,167 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](HypercertClaimdata.md#contributors) +- [impact_scope](HypercertClaimdata.md#impact_scope) +- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) +- [rights](HypercertClaimdata.md#rights) +- [work_scope](HypercertClaimdata.md#work_scope) +- [work_timeframe](HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md new file mode 100644 index 00000000..0483b520 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -0,0 +1,341 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface + +# Interface: HypercertClientInterface + +The interface for the Hypercert client. + +## Hierarchy + +- [`HypercertClientMethods`](HypercertClientMethods.md) + +- [`HypercertClientState`](HypercertClientState.md) + + ↳ **`HypercertClientInterface`** + +## Implemented by + +- [`HypercertClient`](../classes/HypercertClient.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) +- [contract](HypercertClientInterface.md#contract) +- [createAllowlist](HypercertClientInterface.md#createallowlist) +- [indexer](HypercertClientInterface.md#indexer) +- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) +- [mintClaim](HypercertClientInterface.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) +- [readonly](HypercertClientInterface.md#readonly) +- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) +- [storage](HypercertClientInterface.md#storage) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md new file mode 100644 index 00000000..734ccbee --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -0,0 +1,239 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods + +# Interface: HypercertClientMethods + +The methods for the Hypercert client. + +## Hierarchy + +- **`HypercertClientMethods`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) +- [createAllowlist](HypercertClientMethods.md#createallowlist) +- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) +- [mintClaim](HypercertClientMethods.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md new file mode 100644 index 00000000..2d90a599 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState + +# Interface: HypercertClientState + +The state of the Hypercert client. + +## Hierarchy + +- **`HypercertClientState`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [contract](HypercertClientState.md#contract) +- [indexer](HypercertClientState.md#indexer) +- [readonly](HypercertClientState.md#readonly) +- [storage](HypercertClientState.md#storage) + +## Properties + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md new file mode 100644 index 00000000..6ebed93a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -0,0 +1,47 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema + +# Interface: HypercertEvaluationSchema + +Schema for evaluating Hypercerts across different sources and evaluation types + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [creator](HypercertEvaluationSchema.md#creator) +- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) +- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) + +## Properties + +### creator + +• **creator**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) + +--- + +### evaluationData + +• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) + +--- + +### evaluationSource + +• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md new file mode 100644 index 00000000..f18c409f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -0,0 +1,176 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface + +# Interface: HypercertIndexerInterface + +## Implemented by + +- [`default`](../classes/internal.default-1.md) + +## Table of contents + +### Properties + +- [claimById](HypercertIndexerInterface.md#claimbyid) +- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) +- [firstClaims](HypercertIndexerInterface.md#firstclaims) +- [fractionById](HypercertIndexerInterface.md#fractionbyid) +- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) +- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) +- [graphClient](HypercertIndexerInterface.md#graphclient) + +## Properties + +### claimById + +• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Type declaration + +▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +##### Parameters + +| Name | Type | +| :--- | :------- | +| `id` | `string` | + +##### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) + +--- + +### claimsByOwner + +• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) + +--- + +### firstClaims + +• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Type declaration + +▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) + +--- + +### fractionById + +• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +##### Parameters + +| Name | Type | +| :----------- | :------- | +| `fractionId` | `string` | + +##### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) + +--- + +### fractionsByClaim + +• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Type declaration + +▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `claimId` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) + +--- + +### fractionsByOwner + +• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) + +--- + +### graphClient + +• **graphClient**: `any` + +#### Defined in + +[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md new file mode 100644 index 00000000..d65362f3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md @@ -0,0 +1,123 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata + +# Interface: HypercertMetadata + +Claim data for hypercert. ERC1155 Metadata compliant + +## Table of contents + +### Properties + +- [allowList](HypercertMetadata.md#allowlist) +- [description](HypercertMetadata.md#description) +- [external_url](HypercertMetadata.md#external_url) +- [hypercert](HypercertMetadata.md#hypercert) +- [image](HypercertMetadata.md#image) +- [name](HypercertMetadata.md#name) +- [properties](HypercertMetadata.md#properties) +- [ref](HypercertMetadata.md#ref) +- [version](HypercertMetadata.md#version) + +## Properties + +### allowList + +• `Optional` **allowList**: `string` + +A CID pointer to the merke tree proof json on ipfs + +#### Defined in + +[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) + +--- + +### description + +• **description**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) + +--- + +### external_url + +• `Optional` **external_url**: `string` + +An url pointing to the external website of the project + +#### Defined in + +[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) + +--- + +### hypercert + +• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) + +#### Defined in + +[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) + +--- + +### image + +• **image**: `string` + +A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. + +#### Defined in + +[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) + +--- + +### name + +• **name**: `string` + +Identifies the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) + +--- + +### properties + +• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] + +#### Defined in + +[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) + +--- + +### ref + +• `Optional` **ref**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) + +--- + +### version + +• `Optional` **version**: `string` + +The version of Hypercert schema used to describe this hypercert + +#### Defined in + +[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md new file mode 100644 index 00000000..773c41d3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer + +# Interface: HypercertPointer + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](HypercertPointer.md#chainid) +- [claimId](HypercertPointer.md#claimid) +- [contract](HypercertPointer.md#contract) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) + +--- + +### claimId + +• **claimId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md new file mode 100644 index 00000000..8ffda51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -0,0 +1,130 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface + +# Interface: HypercertStorageInterface + +The interface for the Hypercert storage layer. + +## Implemented by + +- [`HypercertsStorage`](../classes/HypercertsStorage.md) + +## Table of contents + +### Properties + +- [getData](HypercertStorageInterface.md#getdata) +- [getMetadata](HypercertStorageInterface.md#getmetadata) +- [storeData](HypercertStorageInterface.md#storedata) +- [storeMetadata](HypercertStorageInterface.md#storemetadata) + +## Properties + +### getData + +• **getData**: (`cidOrIpfsUri`: `string`) => `Promise`<`unknown`\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<`unknown`\> + +Retrieves arbitrary data from IPFS. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | + +##### Returns + +`Promise`<`unknown`\> + +A Promise that resolves to the retrieved data. + +#### Defined in + +[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) + +--- + +### getMetadata + +• **getMetadata**: (`cidOrIpfsUri`: `string`) => `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +Retrieves the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :----------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | + +##### Returns + +`Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +A Promise that resolves to the retrieved metadata. + +#### Defined in + +[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) + +--- + +### storeData + +• **storeData**: (`data`: `unknown`) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`data`): `Promise`<`CIDString`\> + +Stores arbitrary data on IPFS. + +##### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Defined in + +[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) + +--- + +### storeMetadata + +• **storeMetadata**: (`metadata`: [`HypercertMetadata`](HypercertMetadata.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`metadata`): `Promise`<`CIDString`\> + +Stores the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------------ | :--------------------- | +| `metadata` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Defined in + +[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md new file mode 100644 index 00000000..5f5871f2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -0,0 +1,34 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation + +# Interface: IPFSEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [cid](IPFSEvaluation.md#cid) +- [type](IPFSEvaluation.md#type) + +## Properties + +### cid + +• **cid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) + +--- + +### type + +• **type**: `"IPFS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md new file mode 100644 index 00000000..3e4b3b92 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation + +# Interface: SimpleTextEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [hypercert](SimpleTextEvaluation.md#hypercert) +- [text](SimpleTextEvaluation.md#text) +- [type](SimpleTextEvaluation.md#type) + +## Properties + +### hypercert + +• **hypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) + +--- + +### text + +• **text**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) + +--- + +### type + +• **type**: `"simpleText"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md new file mode 100644 index 00000000..53ac36ed --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md @@ -0,0 +1,43 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface + +# Interface: EvaluatorInterface + +[internal](../modules/internal.md).EvaluatorInterface + +## Implemented by + +- [`default`](../classes/internal.default.md) + +## Table of contents + +### Properties + +- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) + +## Properties + +### submitEvaluation + +• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +##### Parameters + +| Name | Type | Description | +| :----------- | :---------------------------------------------------------- | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | + +##### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Defined in + +[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md new file mode 100644 index 00000000..273912bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md @@ -0,0 +1,169 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +[internal](../modules/internal.md).HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](internal.HypercertClaimdata.md#contributors) +- [impact_scope](internal.HypercertClaimdata.md#impact_scope) +- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) +- [rights](internal.HypercertClaimdata.md#rights) +- [work_scope](internal.HypercertClaimdata.md#work_scope) +- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md new file mode 100644 index 00000000..3f4ea346 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md @@ -0,0 +1,17 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter + +# Interface: HypercertMinter + +[internal](../modules/internal.md).HypercertMinter + +Hypercert contract interface. + +**`Notice`** + +hacky loop to get typedoc to generate all the docs + +## Hierarchy + +- `HypercertMinter` + + ↳ **`HypercertMinter`** diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md new file mode 100644 index 00000000..15998930 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md @@ -0,0 +1,638 @@ +[Hypercerts SDK Documentation](README.md) / Exports + +# Hypercerts SDK Documentation + +## Table of contents + +### References + +- [Claim](modules.md#claim) +- [ClaimToken](modules.md#claimtoken) +- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) + +### Modules + +- [internal](modules/internal.md) + +### Classes + +- [ClientError](classes/ClientError.md) +- [ConfigurationError](classes/ConfigurationError.md) +- [FetchError](classes/FetchError.md) +- [HypercertClient](classes/HypercertClient.md) +- [HypercertsStorage](classes/HypercertsStorage.md) +- [InvalidOrMissingError](classes/InvalidOrMissingError.md) +- [MalformedDataError](classes/MalformedDataError.md) +- [MintingError](classes/MintingError.md) +- [StorageError](classes/StorageError.md) +- [UnknownSchemaError](classes/UnknownSchemaError.md) +- [UnsupportedChainError](classes/UnsupportedChainError.md) + +### Interfaces + +- [CustomError](interfaces/CustomError.md) +- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) +- [EASEvaluation](interfaces/EASEvaluation.md) +- [HypercertClaimdata](interfaces/HypercertClaimdata.md) +- [HypercertClientInterface](interfaces/HypercertClientInterface.md) +- [HypercertClientMethods](interfaces/HypercertClientMethods.md) +- [HypercertClientState](interfaces/HypercertClientState.md) +- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) +- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) +- [HypercertMetadata](interfaces/HypercertMetadata.md) +- [HypercertPointer](interfaces/HypercertPointer.md) +- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) +- [IPFSEvaluation](interfaces/IPFSEvaluation.md) +- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) + +### Type Aliases + +- [AllowlistEntry](modules.md#allowlistentry) +- [Deployment](modules.md#deployment) +- [EvaluationData](modules.md#evaluationdata) +- [EvaluationSource](modules.md#evaluationsource) +- [HypercertClientConfig](modules.md#hypercertclientconfig) +- [HypercertClientProps](modules.md#hypercertclientprops) +- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) +- [HypercertStorageConfig](modules.md#hypercertstorageconfig) +- [HypercertsSdkError](modules.md#hypercertssdkerror) +- [QueryParams](modules.md#queryparams) +- [SupportedChainIds](modules.md#supportedchainids) +- [TransferRestrictions](modules.md#transferrestrictions) + +### Properties + +- [ClaimByIdQuery](modules.md#claimbyidquery) + +### Variables + +- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) +- [TransferRestrictions](modules.md#transferrestrictions-1) + +### Functions + +- [execute](modules.md#execute) +- [formatDate](modules.md#formatdate) +- [formatHypercertData](modules.md#formathypercertdata) +- [formatUnixTime](modules.md#formatunixtime) +- [validateAllowlist](modules.md#validateallowlist) +- [validateClaimData](modules.md#validateclaimdata) +- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) +- [validateMetaData](modules.md#validatemetadata) +- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) +- [verifyMerkleProof](modules.md#verifymerkleproof) +- [verifyMerkleProofs](modules.md#verifymerkleproofs) + +## References + +### Claim + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimToken + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimTokensByClaimQuery + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +## Type Aliases + +### AllowlistEntry + +Ƭ **AllowlistEntry**: `Object` + +Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol + +**`Param`** + +Address of the recipient + +**`Param`** + +Number of units allocated to the recipient + +#### Type declaration + +| Name | Type | +| :-------- | :------------- | +| `address` | `string` | +| `units` | `BigNumberish` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) + +--- + +### Deployment + +Ƭ **Deployment**: `Object` + +Represents a deployment of a contract on a specific network. + +#### Type declaration + +| Name | Type | Description | +| :---------------- | :------- | :--------------------------------------------------------------------------------------- | +| `chainId` | `number` | The ID of the network on which the contract is deployed. | +| `chainName` | `string` | The name of the network on which the contract is deployed. | +| `contractAddress` | `string` | The address of the deployed contract. | +| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | + +#### Defined in + +[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) + +--- + +### EvaluationData + +Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) + +This file was automatically generated by json-schema-to-typescript. +DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +and run json-schema-to-typescript to regenerate this file. + +#### Defined in + +[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) + +--- + +### EvaluationSource + +Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) + +--- + +### HypercertClientConfig + +Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } + +Configuration options for the Hypercert client. + +#### Defined in + +[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) + +--- + +### HypercertClientProps + +Ƭ **HypercertClientProps**: `Object` + +The props for the Hypercert client. + +#### Type declaration + +| Name | Type | Description | +| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | +| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | + +#### Defined in + +[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) + +--- + +### HypercertEvaluatorConfig + +Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } + +Configuration options for the Hypercert evaluator. + +**`Note`** + +The signer is required for submitting evaluations. + +#### Defined in + +[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) + +--- + +### HypercertStorageConfig + +Ƭ **HypercertStorageConfig**: `Object` + +Configuration options for the Hypercert storage layer. + +**`Note`** + +The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. + +#### Type declaration + +| Name | Type | Description | +| :------------------ | :------- | :------------------------------ | +| `nftStorageToken?` | `string` | The API token for NFT.storage. | +| `web3StorageToken?` | `string` | The API token for Web3.storage. | + +#### Defined in + +[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) + +--- + +### HypercertsSdkError + +Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) + +#### Defined in + +[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) + +--- + +### QueryParams + +Ƭ **QueryParams**: `Object` + +#### Index signature + +▪ [key: `string`]: `any` + +#### Type declaration + +| Name | Type | +| :---------------- | :------------------ | +| `first` | `number` | +| `orderDirections` | `"asc"` \| `"desc"` | +| `skip` | `number` | + +#### Defined in + +[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) + +--- + +### SupportedChainIds + +Ƭ **SupportedChainIds**: `5` \| `10` + +#### Defined in + +[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) + +--- + +### TransferRestrictions + +Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Properties + +### ClaimByIdQuery + +• **ClaimByIdQuery**: `any` + +## Variables + +### INDEFINITE_DATE_STRING + +• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` + +#### Defined in + +[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) + +--- + +### TransferRestrictions + +• `Const` **TransferRestrictions**: `Object` + +Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol + +**`Dev`** + +AllowAll: All transfers are allowed + +**`Dev`** + +DisallowAll: All transfers are disallowed + +**`Dev`** + +FromCreatorOnly: Only the creator can transfer the Hypercert + +#### Type declaration + +| Name | Type | +| :---------------- | :--- | +| `AllowAll` | `0` | +| `DisallowAll` | `1` | +| `FromCreatorOnly` | `2` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Functions + +### execute + +▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------- | +| `document` | `GraphQLOperation`<`any`, `any`\> | +| `variables` | `any` | +| `context?` | `any` | +| `rootValue?` | `any` | +| `operationName?` | `string` | + +#### Returns + +`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Defined in + +node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 + +--- + +### formatDate + +▸ **formatDate**(`date`): `string` + +#### Parameters + +| Name | Type | +| :----- | :----- | +| `date` | `Date` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) + +--- + +### formatHypercertData + +▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) + +Formats input data to an object containing HypercertMetadata including appropriate labels + +#### Parameters + +| Name | Type | +| :----------------------- | :----------------------------------------------- | +| `«destructured»` | `Object` | +| › `contributors` | `string`[] | +| › `description` | `string` | +| › `excludedImpactScope` | `string`[] | +| › `excludedRights` | `string`[] | +| › `excludedWorkScope` | `string`[] | +| › `external_url?` | `string` | +| › `image` | `string` | +| › `impactScope` | `string`[] | +| › `impactTimeframeEnd` | `number` | +| › `impactTimeframeStart` | `number` | +| › `name` | `string` | +| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | +| › `rights` | `string`[] | +| › `version` | `string` | +| › `workScope` | `string`[] | +| › `workTimeframeEnd` | `number` | +| › `workTimeframeStart` | `number` | + +#### Returns + +[`FormatResult`](modules/internal.md#formatresult) + +#### Defined in + +[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) + +--- + +### formatUnixTime + +▸ **formatUnixTime**(`seconds`): `string` + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `seconds` | `number` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) + +--- + +### validateAllowlist + +▸ **validateAllowlist**(`data`, `units`): `Object` + +Validates the data for an allowlist. + +#### Parameters + +| Name | Type | Description | +| :------ | :---------------------------------------------- | :------------------------------------------ | +| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | +| `units` | `BigNumberish` | The total number of units in the allowlist. | + +#### Returns + +`Object` + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +| Name | Type | +| :------- | :------------------------------------------ | +| `errors` | `Record`<`string`, `string` \| `string`[]\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) + +--- + +### validateClaimData + +▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :------------------------------------------------------- | :-------------------- | +| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) + +--- + +### validateDuplicateEvaluationData + +▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a duplicate evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :--------------------------------------------------------- | :-------------------- | +| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) + +--- + +### validateMetaData + +▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------- | :-------------------- | +| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) + +--- + +### validateSimpleTextEvaluationData + +▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------------- | :-------------------- | +| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) + +--- + +### verifyMerkleProof + +▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` + +Verifies a Merkle proof for a given address and units. + +**`Throws`** + +If the Merkle proof verification fails. + +#### Parameters + +| Name | Type | Description | +| :-------------- | :------------- | :-------------------------------------- | +| `root` | `string` | The Merkle root hash to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish` | The units to verify. | +| `proof` | `string`[] | The Merkle proof to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) + +--- + +### verifyMerkleProofs + +▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` + +Batch verifies Merkle proofs for multiple roots, units and proofs for a single address + +**`Throws`** + +If the Merkle proof verification fails. + +**`Notice`** + +Wrapper around `verifyMerkleProof` to batch verify multiple proofs + +#### Parameters + +| Name | Type | Description | +| :-------------- | :--------------- | :---------------------------------------- | +| `roots` | `string`[] | The Merkle root hashes to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish`[] | The units to verify. | +| `proofs` | `string`[][] | The Merkle proofs to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md new file mode 100644 index 00000000..d20a3804 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md @@ -0,0 +1,307 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal + +# Module: internal + +## Table of contents + +### Classes + +- [default](../classes/internal.default.md) +- [default](../classes/internal.default-1.md) +- [default](../classes/internal.default-2.md) + +### Interfaces + +- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) +- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) +- [HypercertMinter](../interfaces/internal.HypercertMinter.md) + +### Type Aliases + +- [Claim](internal.md#claim) +- [ClaimByIdQuery](internal.md#claimbyidquery) +- [ClaimToken](internal.md#claimtoken) +- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) +- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) +- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) +- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) +- [Exact](internal.md#exact) +- [FormatResult](internal.md#formatresult) +- [InputMaybe](internal.md#inputmaybe) +- [Maybe](internal.md#maybe) +- [OrderDirection](internal.md#orderdirection) +- [RecentClaimsQuery](internal.md#recentclaimsquery) +- [Scalars](internal.md#scalars) +- [ValidationResult](internal.md#validationresult) + +## Type Aliases + +### Claim + +Ƭ **Claim**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | +| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | + +#### Defined in + +[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) + +--- + +### ClaimByIdQuery + +Ƭ **ClaimByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | + +#### Defined in + +[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) + +--- + +### ClaimToken + +Ƭ **ClaimToken**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :--------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `claim` | [`Claim`](internal.md#claim) | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | + +#### Defined in + +[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) + +--- + +### ClaimTokenByIdQuery + +Ƭ **ClaimTokenByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | + +#### Defined in + +[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) + +--- + +### ClaimTokensByClaimQuery + +Ƭ **ClaimTokensByClaimQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :------------------------------------------------------------------------------------------------------------------ | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) + +--- + +### ClaimTokensByOwnerQuery + +Ƭ **ClaimTokensByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | + +#### Defined in + +[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) + +--- + +### ClaimsByOwnerQuery + +Ƭ **ClaimsByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) + +--- + +### Exact + +Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } + +#### Type parameters + +| Name | Type | +| :--- | :--------------- | +| `T` | extends `Object` | + +#### Defined in + +[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) + +--- + +### FormatResult + +Ƭ **FormatResult**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------ | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | +| `errors` | `Record`<`string`, `string`\> \| `null` | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) + +--- + +### InputMaybe + +Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) + +--- + +### Maybe + +Ƭ **Maybe**<`T`\>: `T` \| `null` + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) + +--- + +### OrderDirection + +Ƭ **OrderDirection**: `"asc"` \| `"desc"` + +Defines the order direction, either ascending or descending + +#### Defined in + +[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) + +--- + +### RecentClaimsQuery + +Ƭ **RecentClaimsQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) + +--- + +### Scalars + +Ƭ **Scalars**: `Object` + +All built-in and custom scalars, mapped to their actual values + +#### Type declaration + +| Name | Type | +| :----------- | :-------- | +| `BigDecimal` | `any` | +| `BigInt` | `any` | +| `Boolean` | `boolean` | +| `Bytes` | `any` | +| `Float` | `number` | +| `ID` | `string` | +| `Int` | `number` | +| `Int8` | `any` | +| `String` | `string` | + +#### Defined in + +[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) + +--- + +### ValidationResult + +Ƭ **ValidationResult**: `Object` + +The result of a validation. + +**`Property`** + +Whether the data is valid. + +**`Property`** + +A map of errors, where the key is the field that failed validation and the value is the error message. + +#### Type declaration + +| Name | Type | +| :------- | :---------------------------- | +| `errors` | `Record`<`string`, `string`\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md new file mode 100644 index 00000000..b591d11d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md @@ -0,0 +1,12 @@ +# Burning + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Burning fraction tokens + +You can only burn fraction tokens that you own. Hypercert claims cannot be burned once minted. +You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). + +```js +const txn = await hypercerts.burnFraction({ tokenId }); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md new file mode 100644 index 00000000..0be153cb --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md @@ -0,0 +1,110 @@ +# Hypercert Client Configuration + +The client provides a high level interface that communicates with the Graph, IPFS and the evm. For easy setup we harmonised the configuration into a flow that allows for configuration with different levels of specificity. + +## Configuration + +### Setup + +The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: + +1. Overrides declared in `Partial` + +Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. + +We then process the rest of the overrides and possible environment variables to customise the default configuration. + +To get started quickly you can either: + +- initialize a new client by calling `new HypercertClient({chain: {id: 5})` (or 10) + +Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without an operator. +- The client was initialized with an operator without signing abilities. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the read-only property of the `HypercertClient` instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" + } +} +``` + +You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. + +### Client config properties + +| Property | Type | Description | +| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `graphUrl` | `string` | The url of the subgraph to use. | +| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +### Environment variables + +You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. + +We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +In your `.env` file: + +```bash +LOG_LEVEL="info" +``` + +The SDK logger supports four log levels: `error`, `warn`, `info`, and `debug`. + +- The `error` log level is used to log errors that occur in the SDK. +- The `warn` log level is used to log warnings that do not necessarily indicate an error, but may be important to investigate. +- The `info` log level is used to log general information about the SDK's state or behavior. +- The `debug` log level is used to log detailed information that is useful for debugging purposes. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md new file mode 100644 index 00000000..60f4e5e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md @@ -0,0 +1,18 @@ +# Errors in the SDK + +Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. + +### Handling Errors + +To support debugging we've implemented some custom errors. + +| Error | Reason | Payload | +| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | +| ClientError | An error caused by the client | `{ [key: string]: unknown }` | +| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | +| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | +| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | +| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | +| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | +| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | +| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md new file mode 100644 index 00000000..c5399a4f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md @@ -0,0 +1,13 @@ +# Evaluations + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Respond / or contest an evaluation + +To create an evaluation of a hypercert + +```js +TODO; +``` + +_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md new file mode 100644 index 00000000..d5ff1226 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md @@ -0,0 +1,57 @@ +# Minting + +## Token design + +Hypercerts are semi-fungible tokens. +Thus, each hypercert is represented on-chain by a group of fraction tokens, +each representing a fraction of ownership over the hypercert. +If you want to split your fraction token, or merge multiple tokens into one, +check out the section on [splitting and merging](./split-merge.md). + +## Minting your first hypercert + +To mint a hypercert you need to provide the `metadata`, total amount of `units` and the preferred `TransferRestrictions`. +The resulting hypercert will be wholly owned by the creator. + +```js +import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" + +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; + +const tx: Promise = await hypercerts.mintClaim({ + metadata, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **Note** If you did not initialize your HypercertsClient with an `operator`, `nftStorageToken` and `web3StorageToken`, the client will run in [read-only mode](#read-only-mode) and this will fail. + +Let's see what happens under the hood: + +First, `mintClaim` checks that the client is not `read only` and that the operator is a `Signer`. If not, it throws an `InvalidOrMissingError`. + +Next, the function validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. The function then stores the metadata on `IPFS` using the `storeMetadata` method and returns the `CID` for the metadata. + +Finally, we call the mintClaim function on the contract with the signer `address`, total `units`, `CID`, and `transfer restriction` as parameters. If `overrides` are provided, the function uses them to send the transaction. Otherwise, it sends the transaction without overrides. + +## Transfer restrictions + +When minting a Hypercert, you must pass in a `TransferRestriction` policy. For now there are only 3 implemented policies: + +```js +enum TransferRestrictions { + // Unrestricted + AllowAll, + // All transfers disabled after minting + DisallowAll, + // Only the original creator can transfer + FromCreatorOnly +} +``` + +## Reference + +See the [code](https://github.com/hypercerts-org/hypercerts/tree/main/sdk/src/client.ts) +for more details on how we implement minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md new file mode 100644 index 00000000..98ebbb83 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md @@ -0,0 +1,306 @@ +# Querying + +## Overview + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph. + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the `storage`, `indexer`, and `contract` getters, the HypercertClient allows developers to easily interact with the various components of the Hypercert system directly. +For example, a developer could use the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the contract. + +## Indexer + +For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. + +### Live graph playground + +To inspect the subgraph and explore queries, have a look at the Graph playground for Goerli testnet and Optimism mainnet: + +- [Goerli dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) +- [Optimism dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) + +### Graph client + +Since the client is fully typed, it's easy to explore the functionalities using code completion in IDEs. + +Here's one example from our frontend where we let [react-query](https://www.npmjs.com/package/%2540tanstack/react-query) frequently update the call to the graph: + +```js +import { useHypercertClient } from "./hypercerts-client"; +import { useQuery } from "@tanstack/react-query"; + +export const useFractionsByOwner = (owner: string) => { + const { + client: { indexer }, + } = useHypercertClient(); + + return useQuery( + ["hypercerts", "fractions", "owner", owner], + () => indexer.fractionsByOwner(owner), + { enabled: !!owner, refetchInterval: 5000 }, + ); +}; +``` + +### Queries: Claims + +These tables show the input parameters and output fields for each of the GraphQL queries in [claims.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/claims.graphql). +A claim represents 1 Hypercert and all of the common data across all claim/fraction tokens. + +#### `ClaimsByOwner` + +The `ClaimsByOwner` query retrieves an array of claims that belong to a specific owner. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claims to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `RecentClaims` + +The RecentClaims query retrieves an array of the most recent claims on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | ---------------------------------- | ------------- | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `ClaimByID` + +The ClaimById query retrieves a single claim by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------- | +| `id` | `ID!` | The ID of the claim to retrieve. | + +##### Output + +The query returns a claim object that matches the input parameter. The claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +### Queries: Fractions + +These tables show the input parameters and output fields for each of the GraphQL queries in [fractions.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/fractions.graphql). +A claim token represents a fraction of ownership of a Hypercert. + +#### `ClaimTokensByOwner` + +The `ClaimTokensByOwner` query retrieves an array of claim tokens that belong to a specific owner on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claim tokens to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ------------------------------------------ | +| `chainName` | `String` | The name of the chain. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +#### `ClaimTokensByClaim` + +The `ClaimTokensByClaim` query retrieves an array of claim tokens that belong to a specific claim on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `claimId` | `String!` | The ID of the claim whose claim tokens to retrieve. | None | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | + +#### `ClaimTokenById` Query + +The `ClaimTokenById` query retrieves a single claim token by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------------- | +| `id` | `ID!` | The ID of the claim token to retrieve. | + +##### Output + +The query returns a claim token object that matches the input parameter. The claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +## Storage + +### Hypercert Metadata + +Currently, all metadata is stored off-chain in IPFS. Use the `storage` client to retrieve the metadata + +```js +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const { indexer, storage } = hypercertsClient; +// Get the on-chain claim +const claimById = await indexer.claimById(claimId); +// Get the off-chain metadata +const metadata = await storage.getMetadata(claimById.claim.uri); +``` + +## Contract + +### Typechain bindings + +We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, +which you can import and use from your TypeScript/JavaScript codebase. + +For example: + +```js +import { ethers } from "ethers"; +import { + HyperCertMinterFactory, + HypercertMinterABI, + IHypercertTokenABI, +} from "@hypercerts-org/sdk"; + +const provider = new ethers.getDefaultProvider(network); +const contractInterface = new ethers.utils.Interface(HypercertMinterABI); +const contract = new ethers.Contract( + contractAddress, + HypercertMinterABI, + provider, +); +const metadataUri = await contract.functions.uri(tokenId); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md new file mode 100644 index 00000000..936cc05b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md @@ -0,0 +1,101 @@ +# Getting started with JavaScript + +The Hypercerts SDK makes it easy to integrate Hypercerts into your application or backend with JavaScript/TypeScript. + +## Installation + +Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +# OR yarn add @hypercerts-org/sdk +``` + +## Get storage credentials (only required for minting) + +For now, we store all metadata (e.g. Hypercert claim data) on IPFS using [NFT.Storage](https://nft.storage/) and [web3.storage](https://web3.storage/). + +In order to mint a Hypercert, you will need to create API tokens for both services, which you can learn more about from their respective guides: + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +_Note: In the future, we want to also support other mechanisms for storing off-chain data._ + +## Initialize + +Import the SDK into your project and create a new instance of `HypercertClient` with your configuration options: + +```js +import { HypercertClient } from "@hypercerts-org/sdk"; +import { ethers } from "ethers"; + +// NOTE: you should replace this with your own JSON-RPC provider to the network +// This should have signing abilities and match the `chainId` passed into HypercertClient +const operator = ethers.providers.getDefaultProvider("goerli"); + +const client = new HypercertClient({ + chainId: 5, // goerli testnet + operator, + nftStorageToken, + web3StorageToken, +}); +``` + +Hypercerts is a multi-chain protocol. +See [here](./supported-networks.md) for a list of currently supported networks. + +> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). + +## Make a Hypercert + +Use the client object to interact with the Hypercert network. For example, you can use the `client.mintClaim` method to create a new claim: + +```js +import { + formatHypercertData, + TransferRestrictions, +} from "@hypercerts-org/sdk"; + +// Validate and format your Hypercert metadata +const { data: metadata, valid, errors } = formatHypercertData({ + name, + ... +}) + +// Check on errors +if (!valid) { + return console.error(errors); +} + +// Set the total amount of units available +const totalUnits: BigNumberish = 10_000_000 + +// Define the transfer restriction +const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly + +// Mint your Hypercert! +const tx = await client.mintClaim( + metadata, + totalUnits, + transferRestrictions, +); +``` + +For guidance on how to specify your metadata, see the [minting guide](../minting-guide/step-by-step.md). +This will validate the metadata, store claim metadata on IPFS, create a new hypercert on-chain, and return a transaction receipt. + +For more details, check out the [Minting Guide](./minting.md). + +## Query for Hypercerts + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more details, checkout the [Querying guide](./querying.md) +and our [Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md new file mode 100644 index 00000000..409a1e9d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md @@ -0,0 +1,41 @@ +# Getting started with Solidity + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +If you need the Solidity contracts or interfaces exported from the SDK, +please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Hypercerts deployments + +Hypercerts is a multi-chain protocol and we want to support any network that wants to make positive impact. +We plan to support at most 1 canonical contract deployment per network. +For a complete list of deployments and their contract addresses, see [Supported Networks](./supported-networks.md). + +## Installing the Hypercert contracts + +```bash +npm install @hypercerts-org/contracts +# or yarn add @hypercerts-org/contracts +``` + +## Using the Solidity interface + +If you want to call the Hypercerts contract on your network directly from Solidity, +we export the interface/ABI for you to use from your contract. + +```js +import { IHypercertToken } from "@hypercerts-org/contracts/IHypercertMinter.sol"; + +contract MyContract { + IHypercertToken hypercerts; + + function initialize(address _addr) public virtual initializer { + hypercerts = IHypercertToken(_addr); + } + + function uri(uint256 tokenID) public view returns (string memory _uri) { + _uri = hypercerts.uri(tokenID); + } +} + +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md new file mode 100644 index 00000000..1ac5556e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md @@ -0,0 +1,29 @@ +# Split and Merge + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## By Token Value + +### Split / merge token values + +```js +const { tokenIds } = await hypercerts.splitFraction({ + tokenId, + units: [10, 12, 15], +}); +const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); +``` + +## By Claim Data + +### Split / merge claim data + +```js +const { claimIds } = await hypercerts.splitClaim({ + claimId, + TODO: somehow specify hypercert subregions +}); +const { claimId} = await hypercerts.mergeClaims({ + claimIds, +}); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md new file mode 100644 index 00000000..3bfd0f18 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md @@ -0,0 +1,13 @@ +# Supported networks + +Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. + +We want to support every network that wants to support positive impact! +If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Overview + +| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | +| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | +| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | +| Optimism | 10 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md new file mode 100644 index 00000000..72b3ee2d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md @@ -0,0 +1,120 @@ +# Deploy a new proxy contract + +This should be done only on rare occasions. For example, when: + +- We want to deploy to a new network +- We have updated the contract in a way that is _NOT_ backwards-compatible. + - For most upgrades, please use UUPS [upgrades](./upgrade.md). + +## Smart Contracts + +### Setup the `contracts/` environment + +Navigate to `contracts/`. Configure your `.env` file by following the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/contracts#setup). + +### Build and deploy the smart contracts + +If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. + +```javascript + "optimism-goeri": getChainConfig("optimism-goerli"), +``` + +Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. + +```sh +# Run in contracts/ +yarn build:hardhat +yarn hardhat deploy --network NETWORK +``` + +This will output the new proxy address. Update the root `README.md` with this new address. + +Now transfer ownership over the proxy contract to the multisig: + +```sh +yarn hardhat transfer-owner --network NETWORK --proxy PROXY_CONTRACT_ADDRESS --owner MULTISIG_ADDRESS +``` + +## Subgraph + +### Setup the `graph/` environment + +Navigate to `graph/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/graph#setup) +to get set up. + +### Deploy the subgraph + +Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). + +Now deploy the subgraph + +```sh +# Run in graph/ +yarn build +yarn deploy:hosted +``` + +## OpenZeppelin Defender + +### Create a new Supabase table + +Log into the [Supabase dashboard](https://app.supabase.com/). +We store all data in a single project, but use different tables for each network. +The table name should be suffixed by the network (e.g. `allowlistCache-goerli`). +If you are deploying to a new network, create a new table. You can copy the table schema and RLS policy from another pre-existing table. + +If you are deploying a new proxy contract to a network for which you already have another deployment, you'll have to make a judgement call as to whether you can reuse the existing table, whether you need to clear the existing table, or create another table. + +Note: We want to merge all the tables in this [issue](https://github.com/hypercerts-org/hypercerts/issues/477). + +### Update the OpenZeppelin Defender scripts + +Modify the Defender scripts to support the new network in `defender/src/networks.ts`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. + +Note: The entry point for deployment is in `defender/src/setup.ts`. + +### Setup the `defender/` environment + +Navigate to `defender/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/defender#setup) +to get set up. + +### Deploy defender scripts + +Deploy to OpenZeppelin Defender via + +```sh +# Run in defender/ +yarn deploy +``` + +## Hypercerts SDK + +TODO: Flesh this out + +Run the build in `contracts/`. + +(Soon to be deprecated) Publish `contracts/` to npm + +Configure the SDK to support the new network via the graphclient. + +Publish SDK to npm + +## Deploy the Dapp frontend + +Each frontend build is configured to run on a different network (e.g. `https://testnet.hypercerts.org`). You can use any CDN to serve the site (e.g. Netlify, Vercel, GitHub Pages, Cloudflare Pages, Fleek, Firebase Hosting). + +1. Configure your build environment with the environment variables specified in `frontend/.env.local.example`. + +2. Configure your builds to the following settings: + +- Build command: `yarn build:site` +- Build output directory: `/build` +- Root directory: `/` + +3. Configure the domain that you want for your build. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md new file mode 100644 index 00000000..05dc5b0c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md @@ -0,0 +1,45 @@ +# Errors + +## Deploying + +### Artifact for contract "HypercertMinter" not found + +#### Error message + +`Error HH700: Artifact for contract "HypercertMinter" not found.` + +#### Cause + +Attempting to deploy a contract with `npx hardhat deploy` before the contract has been compiled by hardhat. Contracts compiled by forge are currently not visible to hardhat (this could be a configuration problem). + +### insufficient funds for intrinsic transaction cost + +#### Error message + +`Error: insufficient funds for intrinsic transaction cost` + +#### Cause + +The environment variable `MNEMONIC` is not configured correctly. + +Alternatively, the wallet may not have enough funds for the selected network + +Causing pause twice + +Error: cannot estimate gas; transaction may fail or may require manual gas limit + +reason: 'execution reverted: Pausable: paused', + +#### Etherscan API + +Note: It can take between 5-10 minutes before a newly created etherscan API key becomes valid for queries to goerli. + +When using an etherscan API key that was too recently created, hardhat tasks using etherscan to verify transactions will exit with an error message: + +`Etherscan returned with message: NOTOK, reason: Invalid API Key` + +Despite this error the transaction may have succeeded, the hardhat task just can't confirm it. + +It is unknown if this is a problem for queries to mainnet as well. + +Metamask makes it very difficult to have multiple wallets. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md new file mode 100644 index 00000000..9b208595 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md @@ -0,0 +1,18 @@ +# DevOps + +We use this playbook to encapsulate our practices and current setup. + +## Setup dev environment + +- [Setup guide](./setup.md) +- [Plasmic setup](./plasmic.md) + +## Tasks + +- [Deploy new proxy contract](./deploy-proxy.md) +- [Upgrade contract](./upgrade.md) +- [Pause contract](./pause.md) + +## FAQ + +- [Common errors](./errors.md) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md new file mode 100644 index 00000000..2668f51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md @@ -0,0 +1,29 @@ +# Pause / Unpause + +## Pause + +### Contract owned by an address + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat pause --network NETWORK --address CONTRACT_ADDRESS +``` + +### Contract owned by a multi-sig + +If we transferred ownership to a multisig, we can use +[OpenZeppelin Defender Admin](https://defender.openzeppelin.com/#/admin) +to propose a pause to be approved by the multisig. + +## Unpause + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat unpause --network NETWORK --address CONTRACT_ADDRESS +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md new file mode 100644 index 00000000..10e52f5b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md @@ -0,0 +1,76 @@ +# Plasmic setup + +## HypercertImage + +### Props + +hideImpact + +``` +$ctx.currentForm.impactTimeEnd === "indefinite" && ($ctx.currentForm.impactScopes.length === 0 || ($ctx.currentForm.impactScopes.length === 1 && $ctx.currentForm.impactScopes[0] === "all")) +``` + +color + +``` +$ctx.currentForm.backgroundColor +``` + +vectorart + +``` +$ctx.currentForm.backgroundVectorArt +``` + +### Slots + +logoImage Image URL + +``` +$ctx.currentForm.logoUrl +``` + +title Content + +``` +$ctx.currentForm.name +``` + +workPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.workTimeEnd.format ? $ctx.currentForm.workTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.workTimeEnd}` +``` + +bannerImage Image URL + +``` +$ctx.currentForm.bannerUrl +``` + +impactPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.impactTimeEnd.format ? $ctx.currentForm.impactTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.impactTimeEnd}` +``` + +#### workScopes: repeated ScopeChip + +Collection + +``` +$ctx.currentForm.workScopes.split(/[,\n]/).map(i => i.trim()).filter(i => !!i) +``` + +Element name: `currentWorkScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentWorkScope` + +#### impactScopes: repeated ScopeChip + +Collection: `$ctx.currentForm.impactScopes` +Element name: `currentImpactScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentImpactScope` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md new file mode 100644 index 00000000..afb95296 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md @@ -0,0 +1,41 @@ +# Setup + +## Pre-requisites + +1. Install [NodeJS](https://nodejs.org/en/) and [git](https://git-scm.com/) +2. Install [yarn](https://classic.yarnpkg.com/) + +```sh +npm install --global yarn +``` + +3. Clone the repository: + +``` +git clone git@github.com:hypercerts-org/hypercerts.git +cd hypercerts +``` + +4. Install dependancies: + +To install dependencies across all projects in the monorepo workspace: + +```sh +yarn install +``` + +## Setup your wallets + +We need 2 wallets: a multi-sig for administering the contracts, and a hot wallet for setting everything up. + +1. We use a [Gnosis Safe](https://app.safe.global/) multisig for managing and administering the contracts. Set one up with your desired confirmation threshold (e.g. 2 of 3). This wallet will not require any balance. +2. Separately, set up a wallet that we'll use in our developer scripts. + +- If you don't have one, you can goto `contracts/` and run `yarn hardhat generate-address`. +- Make sure there is enough balance in this account to deploy the contract and transfer ownership to the multisig + - [Goerli Faucet](https://goerlifaucet.com/) + - [Optimism Bridge](https://app.optimism.io/bridge/deposit) + +## Next Steps + +Depending on what you want to do (e.g. in `./sdk/` or `./frontend/`), there will be further setup instructions in the respective `README.md` file. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md new file mode 100644 index 00000000..820255e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md @@ -0,0 +1,35 @@ +# Upgrading the contract + +## Validate upgrade + +Validate contract upgradeability against deployment. + +For example, for the `goerli` deployment: + +```sh +yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS +``` + +## Propose Upgrade + +Propose an upgrade via OpenZeppelin Defender. For more information, see this +[guide](https://docs.openzeppelin.com/defender/guide-upgrades) + +For example, for the `goerli` deployment: + +```sh +yarn build:hardhat +yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS +``` + +This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. + +## Publish to npm + +After you update the contracts, deploy the `contracts/` package to npm. + +TODO + +Update the dependencies in `frontend/package.json` and `sdk/package.json`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/faq.md b/docs/versioned_docs/version-1.0.0-alpha.1/faq.md new file mode 100644 index 00000000..b9659b5a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/faq.md @@ -0,0 +1,139 @@ +--- +title: Frequently Asked Questions +id: faq +--- + +# FAQs + +### How do I create a hypercert? + +We've created a step-by-step guide in the documents, which you can find [here](minting-guide/minting-guide-start). + +### Who gets to claim my hypercert? + +There are currently two types of users who are eligible to claim your hypercert. + +1. You as the creator of the hypercert are eligible to claim your hypercert. For projects with an allow list, you are eligible to claim 50% of the total tokens. For projects with no allow list, you will receive 100% of the tokens automatically and can do whatever you like with them. + +2. Anyone on the hypercert's allow list will be eligible to claim your hypercert. The allow list is stored and the time of minting and allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions through a separate contract interaction. Creators often use allow lists be used to allocate fractions to previous funders and contributors. + +### How do I claim a hypercert? Can I claim all of the ones I’m eligible for at once? + +After you connect your wallet, you will see a dashboard of hypercerts that you can claim. You can either claim them individually or in a batch transaction. Note that if you perform the batch transaction you will automatically claim _all_ hypercerts you are allow-listed for. (You still pay a gas fee for each claim, however.) If you don't want to claim _all_ at once, then you should claim them one-by-one. + +### What token standard do hypercerts utilize? + +The interface supports both ERC-1155s and 721s. Our current implementation makes use of [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) (a semi-fungible token). + +### What are the required fields to generate a hypercert? + +There are six required fields: + +1. Set of contributors: An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. Scope of work: A conjunction of potentially-negated work scope tags, where an empty string means “all”. +3. Time of work: A date range, from the start to the end of the work being claimed by this hypercert. +4. Scope of impact: A conjunction of potentially-negated impact scope tags, where an empty string means “all”. +5. Time of impact: Date ranges from the start to the end of the impact. +6. Rights of the owners: An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Hypercerts also need a name and description. + +### What should I put for my hypercert's work scope? + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +### Are hypercerts the same as impact evaluations? + +No. A hypercert is a claim over a discrete piece of work and the impact that may result from that work. It has no opinion about the legitimacy or quality of the claim. + +An impact evaluation is an opinionated assessment about the legitimacy or quality of a claim. + +For example, a hypercert might represent "Planting trees in the Amazon in 2022". An impact evaluation might point to that hypercert and assert the percent of trees that survived, the amount of CO2 removed by the trees, or the income change among people living around the project. + +Over time, the expectation is that hypercerts that attract multiple, high quality, credibly neutral impact evaluations will be more relevant than ones that do not. + +### What can I do with my hypercert? + +The `rights` dimension specific what an owner can do with their hypercert. Currently, the only `right` that owners have is "Public Display". Over time, we hope the protocol can support various `rights` including transfers, intellectual property, tax-deductibility, carbon offsets, ESG reporting, and more. + +### How is a hypercert different than a POAP or Impact NFT? + +Hypercerts have some things in common with certain POAPs or Impact NFTs, but also a number of crucial differences. + +First, all POAPs and most Impact NFTs are implemented as non-fungible tokens (ERC-721s). Hypercerts are currently being implemented as semi-fungible tokens (ERC-1155s), meaning it is possible to own more than one unit or fraction of a given hypercert. This makes it easy and intuitive to display the share of hypercerts that a given owner has. + +Second, hypercerts have specific metadata requirements and interpretation logic. These include a standard schema for how the six required hypercert dimensions are defined and captured (i.e., work scopes, impact scopes, timeframes, contributors, etc) as well as logic for how to interpret different inputs (e.g., how to include or exclude certain work scopes, create an indefinite time period, etc). POAPs have a completely different schema. Although there is no standard schema for Impact NFTs, an Impact NFT project could choose to adopt the hypercert standard and token interface and thereby achieve compatibility. + +Third, the hypercerts token interface is intended to support several functions that are not possible out of the box with other token standards, chiefly, atomic split and merge capabilities. We also expect other protocols to work with hypercerts for the purposes of prospective and retrospective funding, contributor verification, and impact evaluation. + +For certain use cases, POAPs may be better suited for projects as hypercerts are focused on the funding aspect of impactful work. + +### Where can I purchase a hypercert? + +Currently, it is only possible to purchase a hypercert from a creator or project. This can be facilitated directly by the project or via a third-party marketplace like OpenSea. Currently, hypercerts cannot be resold on secondary markets. + +### What chain(s) is hypercerts running on? + +The hypercerts smart contracts have been deployed on Optimism and Goerli Testnet. We plan to support various EVM chains in the near future. + +### How do I bridge to Optimism? + +There are various bridging services including the official [Optimism Bridge](https://app.optimism.io/bridge/deposit). Note that bridging assets from Ethereum to Optimism will incur a gas fee. + +### How much gas will it cost to create or claim a hypercert? + +In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). Claiming a hypercert should be below 0.0001 ETH or less than $0.10 on Optimism. + +### How do I create a hypercert from a multisig? + +If you are creating a hypercert on Optimism, then you will need an Optimism-based multisig. (Unfortunately, Safe wallets created on Ethereum won't work on Optimism.) + +### Have the smart contracts been audited? + +Yes. The auditor's security report is available [here](https://github.com/pashov/audits/blob/master/solo/Hypercerts-security-review.md). + +### How is the allow list generated? + +For Gitcoin projects, an allow list is generated from a snapshot of all of the on-chain funding received by the project. + +The queries used to generate the allow lists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Once the snapshot is taken, the formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +### Why am I not on the allow list even though I contributed to the project? + +If you contributed less than $1 DAI to a project, then you will not be eligible to claim a hypercert fraction. + +### I supported a project. Why I don't I see the hypercert in my dashboard? + +In order to your hypercert to appear as "claimable", the project needs to mint the hypercert first. If the project has not minted its hypercert yet, then you will not be able to claim it. We suggest you check back in a few days to see if the project has created the hypercert and is now claimable. + +If the project has created its hypercert, then please try the following solutions: + +1. Confirm the wallet address is correct (some users have multiple wallet addresses and forget which one they donated with) +2. Check that your wallet is included in the Dune Dashboards for each Gitcoin Round + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +3. Confirm you donated more than $1 DAI to the project. + +If the project has created its hypercert, and you have confirmed items 1-3, then please send us a DM over Twitter or Telegram with your wallet address and we will get back to you promptly. + +### How do I retire a hypercert? + +We don't yet have a frontend for retiring hypercerts but you can do this by interacting directly with the smart contract on Etherscan. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md b/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md new file mode 100644 index 00000000..86c25331 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md @@ -0,0 +1,37 @@ +--- +title: Further Resources +id: further-resources +--- + +# Papers, Articles, Presentations + +## Writings + +- Feb 14, 2023, Whitepaper draft by [@hypercerts](http://twitter.com/hypercerts): [Hypercerts: A new primitive for impact funding systems (draft v0)](../static/pdf/hypercerts_whitepaper_v0.pdf) +- Aug 24, 2022, Blogpost by [@holkeb](https://twitter.com/holkeb): [Hypercerts: A new primitive for public goods funding](https://protocol.ai/blog/hypercert-new-primitive/) +- Jun 2022, Tech report (draft) by [@davidad](https://twitter.com/davidad): [Hypercerts; an Interoperable Datalayer for Impact-Funding Mechanisms](../static/pdf/hypercerts_Tech_Report_draft.pdf) + +## Talks + +#### Jun 24, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Hypercerts: on-chain primitives for impact markets](https://youtu.be/2hOhOdCbBlU) + + + +#### Jun 23, 2022, Conversation between [@emiyazono](http://twitter.com/emiyazono) and [@owocki](http://twitter.com/owocki) at GreenPill Podcast: [Impact Certificates | Evan Miyazono, Head of Research at Protocol Labs | Green Pill #21](https://youtu.be/kyo5SxtSJ9U) + + + +#### Mar 4, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Interoperable mechanisms for non-rival goods (Hypercerts)](https://youtu.be/acbBeGcevok) + + + +## Other resources + +Overview of some previous writings on impact certificates, retrospective funding and impact markets: + +- Christiano, Paul (2014) Certificates of impact, Rational Altruist, [https://rationalaltruist.com/2014/11/15/certificates-of-impact/](https://rationalaltruist.com/2014/11/15/certificates-of-impact/) +- Christiano, Paul & Katja Grace (2015) The Impact Purchase, [https://impactpurchase.org/why-certificates/](https://impactpurchase.org/why-certificates/) +- Optimism & Buterin, Vitalik (2021) Retroactive Public Goods Funding, [https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c) +- Cotton-Barratt, Owen (2021), Impact Certificates and Impact Markets, Funding the Commons November 2021, [https://youtu.be/ZiDV56o5M7Q](https://youtu.be/ZiDV56o5M7Q) +- Drescher, Denis (2022) Towards Impact Markets, [https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1](https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1) +- Ofer & Cotton-Barratt, Owen (2022) Impact markets may incentivize predictably net-negative projects, [https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6](https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md new file mode 100644 index 00000000..b2451310 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md @@ -0,0 +1,139 @@ +--- +title: Glossary +id: glossary +sidebar_position: 3 +--- + +# Glossary of Hypercerts Terms + +## Main Terms + +### Allowlist + +A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. + +### Claiming a fraction + +Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. + +### Contributor + +An individual or organization that performs some or all of the work described in a hypercert. + +### Creating a hypercert + +Synonymous to minting a hypercert. + +### Fraction + +A token that represents a quantified proportion of a hypercert denominated in units. + +### Funder + +Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. + +### Hypercert + +A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. + +### Hypercerts interface + +The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. + +### Hypercerts implementation + +An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. + +### Hypercerts standard + +A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Impact + +Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. + +### Impact evaluation + +A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. + +### Impact Funding System (IFS) + +A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. + +### Impact space + +A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Merging hypercerts + +An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. + +### Minting a hypercert + +Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. + +### Project + +Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. + +### Prospective funder + +Individual, organization, or algorithm that fund work before it is done. + +### Retrospective funder + +Individual, organization, or algorithm that fund work after it is done. + +### Rights + +An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. + +### Set of contributors + +An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of impact + +A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of work + +A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Splitting hypercerts + +An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. + +### Time of impact + +Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Time of work + +A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Unit + +The smallest possible fraction of a claim. Generally units are grouped in fractions. + +### Work + +Activities that produce impact. + +## Additional Impact Evaluation Terms + +### Auditor + +Individual, organization, or algorithm that evaluates the impact of work after it is done. + +### Beneficiaries + +People or objects that are impacted by work. + +### Evaluator + +Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. + +### Scout + +Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md new file mode 100644 index 00000000..08eb9fcb --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md @@ -0,0 +1,188 @@ +--- +title: Metadata Standard +id: metadata +sidebar_position: 2 +--- + +# Hypercert Metadata Structure + +Hypercerts are represented as [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) tokens. All token instances of a hypercert must share the same ERC-1155 metadata. For sites like OpenSea to pull in off-chain metadata for ERC-1155 assets, your hypercert contract will need to return an IPFS URI that contains all necessary hypercert metadata. + +The hypercert metadata schema follows the [Enjin recommendation](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema) for ERC-1155 metadata. It also includes **six required dimensions** that are necessary to clearly and unambiguously identify the hypercert's impact claim. + +The following are standard ERC-1155 metadata fields. + +## ERC-1155 fields + +| Property | Description | +| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `name` | Name or title of the hypercert. Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. | +| `description` | A human readable description of the hypercert. Markdown is supported. Additional external URLs can be added. | +| `image` | A URI pointing to a resource with mime type image/\* that represents the hypercert's artwork, i.e., `ipfs://`. We recommend images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. | +| `external_url` | [optional] A URL that can be displayed next to the hypercert on webpages like OpenSea and links users to a page that has more information about the project or impact claim. | +| `properties` | [optional] Additional properties (aka attributes) that may be helpful for discovery and curation of hypercerts. Marketplaces like OpenSea will display these properties in the same way as they display rarity traits of NFTs. | + +In order to perform hypercert-specific operations, including split and merge functions, and for your hypercert to robustly claim a set of coordinates in the impact space, there are six additional dimensions that must be included in your metadata. + +## Required Hypercert dimensions + +| Property | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `work_scope` | An _ordered list_ of work scope tags. Work scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any work scope that is explicitly excluded from the claim. | +| `work_timeframe` | Date range from the start to the end of the work in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). | +| `impact_scope` | An _ordered list_ of impact scope tags. Impact scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any impact scope that is explicitly excluded from the claim. The default claim is to "all" impact, giving the owner rights to claim all potential impact created by the work that is represented by the hypercert. | +| `impact_timeframe` | Date range from the start to the end of the impact in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). The default claim is from the start date of work until `indefinite` (i.e., the impact may occur at any point in time in the future). | +| `contributors` | An _ordered list_ of all contributors. Contributors should be itemized as wallet addresses or ENS names, but may be names / pseudonyms. The default claim is to the wallet address that created the hypercert contract. A multisig wallet can be used to represent a group of contributors. | +| `rights` | An _unordered list_ of usage rights tags. The default claim is solely to "public display" of the hypercert, i.e., all other rights remain with the contributors. | + +## Examples + +### Example 1: hypercert with minimal bounds + +Here is an example of hypercert dimensions for work on IPFS with minimal bounds: + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["IPFS"], + "excludes": [], + "display_value": "IPFS" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": [], + "display_value": "All" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1380585600, 1388534399], + "display_value": "2013-10-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1380585600, 0], + "display_value": "2013-10-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["Protocol Labs"], + "display_value": "Protocol Labs" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 2: hypercert with bounded impact claims + +This hypercert is for a carbon removal project that provides a bounded impact scope. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["CO2 in Atmosphere"], + "excludes": [], + "display_value": "CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 3: hypercert with excluded impact claims + +Here is an example that explicitly excludes an impact scope to generate a more fine-grained claim. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": ["CO2 in Atmosphere"], + "display_value": "All ∧ ¬CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Additional guidelines + +Here are some additional guidelines for defining hypercert dimensions. + +- For most hypercerts, the `work_scope` is best represented as the name of the project or activity. Other information contained in the hypercert, namely, the `contributors` and the `work_timeframe` should provide sufficient context to disambiguate multiple claims from the same project. +- Similarly, for most hypercerts, the `impact_scope` will be most clearly represented as "all" (with an indefinite upper bound on the `impact_timeframe` dimensions). This gives the hypercert creator and its owners the flexibility to make claims about impact that may not have been observable or well-understood when the hypercert was created. + +- It is recommended to browse the `impact_scope` and `work_scope` tags that have already been created and are in use by your or other projects. (We are building a catalog to be available at [hypercerts.org](https://hypercerts.org).) Picking established tags can make it easier for users to discover, curate, and interact with your hypercert. In the long-run, we expect different ontologies to emerge in domains like climate solutions, open source software, etc, and picking more established tags will help prevent overlapping or duplicate claims. +- Tags for work scopes and impact scopes are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. +- Scopes that are explicitly excluded from the hypercert claim are enumerated separately and displayed with the `¬` prefix in the tag. Excluded scopes are not currently displayed on hypercert artwork. +- The order of tags matters only for display purposes. The hypercert artwork will only display a limited number of tags in the `impact_scope` and `work_scope` arrays due to image size and stylistic constraints. +- A `contributor` can be identified using any human-readable string. The base case is to set the `contributors` to the wallet address used to create the hypercert. A multisig wallet can be used to represent a group of contributors. + +### Assigning `rights` + +In version 1.0 of the protocol, only one `rights` tag will be enabled: + +> **Public Display**: owners of the hypercert have the right to publicly display and receive social utility from their hypercert. + +This means that any other rights regarding the work described by the hypercert either remain with the original contributors or are governed by other agreements. + +Additional `rights` including the potential for certain types of transfers to be explicitly enabled will be released in subsequent versions. + +## Optional hidden properties + +Creators may wish to add other fields in their metadata that are not a part of the hypercert claim and are not for display on third-party marketplaces like OpenSea. These can be added by creating a `hidden_properties` field in the metadata. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md new file mode 100644 index 00000000..a767c670 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md @@ -0,0 +1,29 @@ +--- +title: Token Standard +id: token-standard +sidebar_position: 1 +--- + +### Hypercerts as a semi-fungible token + +In order to make the token identifiable, traceable, and transferable, hypercerts are represented as [ERC-1155 tokens](https://eips.ethereum.org/EIPS/eip-1155). The ERC-1155 standard enables a single deployed contract to store many hypercerts, facilitating simpler creation, transfers, as well as splitting and merging of hypercerts within a single namespace. As a semi-fungible token, each unique token represents a fraction of ownership of a hypercert. Hypercerts are then represented as a group of tokens, where the total ownership sums to 100%. In order to easily identify which hypercert a token belongs to, we utilize the upper 128 bits of a 256-bit token ID to identify the hypercert. All tokens within the same hypercert group should share the same [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). + +![hypercert id](../../static/img/hypercert_id.png) + +For illustrative purposes, let us assume that token IDs are just 2 bytes long, where the first byte represents the hypercert ID and the last byte represents which fraction of ownership. Alice could create a new hypercert token 0x2301, representing 100% of hypercert 0x23. If Alice wanted to transfer 20% to Bob, Alice could perform a split operation by minting token 0x2302 and transferring 20% of value to it, such that tokens 0x2301 and 0x2302 represent 80% and 20% ownership respectively of hypercert 0x23. Then Alice transfers token 0x2302 to Bob. Similarly, they could merge these 2 tokens together, back to form a token that represented 100% ownership. In this case, the value of 0x2301 would be transferred to 0x2302, and then 0x2301 is subsequently burned. + +Alice can also choose to split or merge hypercerts along some dimension of the impact space. For example, Alice may split hypercert 0x23 into two new hypercerts — 0x24 representing work done before the year 2000, and 0x25 representing work done after 2000. The original hypercert 0x23 is burned and the two new hypercerts store a reference to the previous hypercert. When the history of splits and merges are indexed, we can easily trace through the provenance of any individual hypercert. + +### Claim Data + +Hypercert claim data, such as scope of work and the contributor list, is encoded in JSON format into the [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). Claim data can be stored on-chain alongside the token, or in off-chain storage such as IPFS. For details on the JSON schema and how off-chain storage can be utilized, see the [hypercerts-sdk repository](https://github.com/hypercerts-org/hypercerts/tree/main/sdk). + +When considering whether to store hypercert metadata on-chain or off-chain, we can consider the different trade-offs to the user experience and cost, which may differ depending on which blockchain is being used. Storing data off-chain saves on costs, but could lead to on-chain claims without the metadata. Storing data on-chain adds additional security that the claims will not be forgotten but can lead to higher gas fees. + +Beyond the standard fields of hypercerts that locate the hypercert in the impact space, additional fields can be added. This allows for different templates in different impact areas, such as AI safety or biodiversity, as different additional information will be useful. Importantly, however, all hypercerts will be located in a single impact space – the additional fields do not change that. + +### Multi-chain support + +We expect hypercerts to exist in a multi-chain ecosystem, where the local deployment can be used to support the unique funding systems of that community. In order to visualize a single global impact space, we index the different contract deployments across chains and surface any potential hypercert claim conflicts. Because different blockchains support different subsets of programming languages, we do expect different implementations of the hypercert protocol to exist. However, they must adhere to the same hypercert data model to be indexed into the impact space. + +In order to decide which deployments to index into the hypercerts impact space, decentralized governance institutions will be used to govern the list of contract addresses used across all blockchains. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/intro.md new file mode 100644 index 00000000..0c4d7ca3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/intro.md @@ -0,0 +1,58 @@ +--- +title: What Are Hypercerts? +id: intro +--- + +# What are hypercerts? + +### Hypercerts are a new token standard for tracking and rewarding positive impact. + +Each hypercert represents a unique impact claim capturing the following information: + +- a scope of work and its corresponding scope of impact +- a set of time frames for both the work and its impact +- a set of contributors – the organization or people behind the work +- a set of rights you get by owning a hypercert + +The hypercert itself is an ERC-1155 semi-fungible token with the information above stored as metadata on IPFS. Here’s an example. + +### Hypercert example + +#### Graphic representation + +![hypercert design example](../static/img/hypercert_example.png) + +#### Supplementary information (metadata) + +- **Title of hypercert:** Invention of the InterPlanetary Filesystem (IPFS) +- **Description:** The InterPlanetary File System (IPFS) is a set of composable, peer-to-peer protocols for addressing, routing, and transferring content-addressed data in a decentralized file system. +- **Link:** ipns://ipfs.tech/ + +#### Hypercert dimensions (metadata) + +- **Set of contributors:** 0xb794f5ea0ba39494ce839613fffba74279579268 _(example Ethereum address)_ +- **Scope of work:** IPFS ∧ ¬ go-ipfs +- **Time of work:** 2013-01-01 --> 2013-12-31 +- **Scope of impact:** All +- **Time of impact:** 2013-01-01 --> indefinite +- **Rights:** Public display + +### Why should you care? + +We spend trillions of dollars every year on public goods via governmental agencies, foundations, private donations and corporate spendings; however, we don’t effectively track this work – leaving us in the dark, hoping that it actually has the intended positive impact. + +We believe we can do better: + +- We should start by tracking this work consistently – this is what hypercerts are for. +- We should evaluate how impactful that work was – this is what the open evaluation system of hypercerts supports. +- We should reward the work that was exceptionally impactful – this is what the public display of hypercerts and retrospective funding is for. + +Doing this would unfold powerful incentives. Retrospective funding 1) provides incentives for creators to take on public goods projects with a potentially high, but uncertain, impact, 2) enables feedback loops to learn from successes and failures, and 3) attracts more talent to the public goods sector by improving performance-based compensation. + +While we are excited about the prospects of retrospective funding, hypercerts do not impose any specific funding mechanisms, but start with tracking the work that is supposed to be impactful. As a database for many funding mechanisms this facilitates experimentation and interoperability between funding mechanisms. + +### Next + +Curious and want to learn more? Head over to the [whitepaper](whitepaper/whitepaper-intro.md) to dive deeper into the world of hypercerts. + +Or do you want to get started right away? Head to the [minting guide](minting-guide/minting-guide-start.md). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md new file mode 100644 index 00000000..1ad2310a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md @@ -0,0 +1,166 @@ +--- +title: Gitcoin Alpha Round Instructions +id: gitcoin-round +sidebar_position: 3 +--- + +# Gitcoin Alpha Round Instructions + +## Overview + +- all projects in the Gitcoin Alpha Round are invited to mint a hypercert for their work +- anyone who gave over $1 to a project is automatically allowlisted for that project’s hypercert +- 50% of each hypercert is distributed to the funders, 50% is kept by the project and can be transferred later +- each project has a custom URL to make minting super easy (the link is sent directly to each project) +- everything runs on Optimism (users only need to pay L2 gas costs) + +:::info +If your project participated in the Gitcoin Alpha Round, but you didn't get a message with a custom URL, please reach out to team[at]hypercert.org. +::: + +## Hypercerts x Gitcoin Alpha Round + +Now that Gitcoin’s Alpha Round has officially closed and the funding distribution is finalized, we are inviting all eligible projects that participated to mint a hypercert for their past work and to allocate fractions of their hypercert to a list of supporters. + +We’ve created a dApp that pulls all of the data required to mint your hypercert directly from Gitcoin’s Grant Protocol. You can fine-tune the properties, tweak your artwork, and review the distribution mechanism. Once you’re ready, hit the create button and your hypercert will be released into the ethers! + +Once your hypercert has been minted, the people who supported your project with a contribution of at least $1 DAI on Gitcoin’s Alpha Round will be able to connect and claim their fractions. + +A few important notes about the Alpha Round: + +- The total units of a hypercert is based on the total donations; each funder get awarded units proportional to their donations. +- Transfers will be restricted to one transfer from the project to the supporters. +- There will be no additional rights awarded to the funders except the right to "public display" their support for the project. + +## Instructions + +The following guidance is only for projects that receive a custom URL that pre-populates the hypercerts form based on their Gitcoin Grants' data. + +It explains the default settings in the form and recommends fields that the creator may choose to update or edit. + +:::note +Gitcoin Grant hypercerts are for retrospective work, i.e., they are intended to capture work that happened between Gitcoin Grants Round 15 (September 2022) and the Alpha Round (January 2023). Therefore, the work time period is always set to past dates. (You might need to adjust the name and description to also refer to past work only.) We are focusing solely on retrospective hypercerts for this round as part of broader efforts to promote retrospective funding; you can read more about it [in the whitepaper](whitepaper/retrospective-funding.md). +::: + +### General Fields + +#### Name of Hypercert + +This field is set by default to the name of your project on Gitcoin Grants. You can edit this to be more specific. Given that your project may create numerous hypercerts over time, consider giving each hypercert a name that represents a more discrete phase or output. + +#### Logo + +This field is set to the icon artwork provided for your project on Gitcoin Grants. If there was an error accessing your icon, you will see a generic icon. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +#### Background Banner Image + +This field is set to the banner artwork provided for your project on Gitcoin Grants. If there was an error accessing your banner, you will see a generic Gitcoin banner. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +#### Project Description + +This field is set by default to the description of your project on Gitcoin Grants. Review closely -- a long project description in your Gitcoin Grant description will be truncated. + +You may edit this to provide more details about your work and to remove information that is targeted solely at Gitcoin Grants users. This is also a good place to provide other links, such as Github repos or social media accounts, where the general public can learn more about the work. Please aim for a project description that is less than 500 characters. + +:::note +The project description should refer to **past work**, not future work that you would like to do with additional funding. +::: + +#### Link + +This field is set to the first external URL provided for your project on Gitcoin Grants. You can update this. + +### Hypercert Fields + +#### Work Scope + +This field is set by default to a **shortened version** of the name of your project on Gitcoin Grants. You may edit or add additional work scope tags. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +#### Work Start/End Dates + +The start date has been set by default to the `2022-09-22` for all projects on Gitcoin Grants. This date coincides with the end of Gitcoin Grants Round 15. + +The end date references the last update to your grant page on Gitcoin Grants. + +You may edit or update these fields, however, the end date may not extend beyond `2023-01-31` (the close of the funding round) as all hypercerts will be retrospective in this round. + +#### Set of Contributors + +This field is set by default to the wallet address that is set as the recipient address for receiving Gitcoin Grants funding. + +:::note +You should review this field closely and – if applicable – provide the addresses of additional contributors. +::: + +### Advanced Fields + +#### Impact Scope + +This field is set by default to `all`. + +Updates are currently disabled on the frontend because funding decisions on Gitcoin Grants were not specific to an impact scope or impact time period. + +#### Impact Start/End Dates + +This field is set by default to the work start date of `2022-09-22` (see above) and a work end date of `indefinite`. Updates are currently disabled on the frontend. + +#### Rights + +This field is set by default to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +Updates are currently disabled on the frontend. + +### Distribution + +#### Allowlist + +This field is set by default to a custom allowlist generated for each project based on the funding it received on the Gitcoin Grants Alpha Round. You should not need to update this field. If there is a problem with your allowlist, please contact us. + +50% of the hypercert will be allocated according to this allowlist. The other 50% will be kept by the project, i.e. it is allocated to the address that mints the hypercert. You will be able to transfer or sell these fractions later as long as they are owned by the minter. This means that they can only be transferred or sold once. + +The formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +The queries used to generate the allowlists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Donors who contributed to the matching pool for each round are also eligible to claim hypercerts. + +:::note +You are free to edit your allowlist. You can do this by following the step-by-step instructions [here](minting-guide/step-by-step.md). Just remember that you will need to upload the new allowlist in a CSV format to a storage site like [web3.storage](https://web3.storage) and then update the link in the allowlist field. Contact team[at]hypercerts.org if you need help. +::: + +### Confirmations + +#### Contributors' permission + +Every contributor needs to agree to have their contribution be represented by a hypercert. This is why the person minting the hypercert has to confirm to have the permission of all listed contributors. + +#### Terms & Conditions + +The terms & Conditions can be found [here](https://hypercerts.org/terms). + +### Final step: Click "Create" + +Make sure your Optimism wallet or multi-sig is connected. Click on "create" and wait for your hypercert to be created. Congratulations! diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md new file mode 100644 index 00000000..47e8ad7c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md @@ -0,0 +1,44 @@ +--- +title: Getting Started +id: minting-guide-start +sidebar_position: 1 +--- + +# Getting started + +### How to create a hypercert + +Creating a hypercert is similar to creating an NFT on sites like OpenSea or Zora. + +In this article, we’ll walk through the steps one by one and explain exactly what you need to do to create your first hypercert. + +There are typically two ways of creating a hypercert: + +1. As a project affiliated with a specific funding network (e.g., Gitcoin Grants): In this case, you should receive a custom URL from the funding network that pre-populates most of your hypercert fields. You will still be able to change most of these, so you should review and adjust them as needed to better describe your hypercert. Guidance on how to do so (for Gitcoin Grants projects) is provided at the end of this doc. +2. As a project not affiliated with a specific funding network: In this case, you will be creating a hypercert from scratch and filling in each field on your own. Read on below. + +### Who can create a hypercert? + +Anyone doing work that is intended to have a positive impact can create a hypercert. Your hypercert can be as simple as "I did X on this date and want to claim all future impact from it". + +It can also represent something more, such as a phase in an ongoing team project, an invention or discovery, a research publication, or an important software release. + +Critically, if the work was done by more than one person, then each person should be listed as a contributor to the hypercert and approve the creation of the hypercert. + +_Note: In the future, the approval of each contributor will be verified on-chain._ + +### What do I need to create a hypercert? + +You will need to prepare all of the information required in the form builder (see **Step-by-step instructions for creating a hypercert** below). This includes important metadata, such as a description of the project and the dimensions of your impact claim, as well as a project artwork. You may also want to include an allowlist of wallets that are approved to claim one or more fractions of the hypercert. + +In addition to the information regarding the hypercert itself, you’ll need a crypto wallet to mint your hypercert. “Minting” a hypercert is the process of writing an impact claim to the blockchain. This establishes its immutable record of authenticity and ownership. + +Next, choose a blockchain on which to mint your hypercert. The hypercerts protocol is available on Ethereum, Goerli (testnet), and Optimism. Each of these blockchains has different gas fees associated with transactions on their networks. To reduce gas fees we recommend Optimism for most projects. + +Finally, go ahead and create your hypercert. + +### How much does it cost to create a hypercert? + +You will need enough Ethereum in your wallet to cover gas fees. In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). + +The protocol currently does not offer gas-free or "lazy" minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md new file mode 100644 index 00000000..9f3b6303 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md @@ -0,0 +1,130 @@ +--- +title: Step-by-step Instructions +id: step-by-step +sidebar_position: 2 +--- + +# Step-by-step instructions + +First, go to the [Create Hypercert](https://hypercerts.org/app/create) site with a wallet-enabled browser or follow the custom URL you received to access a prepopulated form. + +Although the site works on mobile, it is easier to use on desktop because the browser will display a dynamic preview of the hypercert while you fill out the Create form. + +Next, connect your wallet. You will be prompted to switch to the Ethereum or Optimism network. + +Once you've connected, you will see an empty form for creating a hypercert. + +### General fields + +#### Name of Hypercert + +Enter the name or title of the hypercert. This is the place to be verbose and specific about what the project is doing. You'll see on the preview when your title becomes too long. + +Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. + +Names are restricted to 100 characters but may include emojis (:smile:), accents (é), non-Latin scripts (表情), and other Unicode characters. + +#### Project Description + +Enter a human readable description of the hypercert. This is the place to share more details about the work and the team or individual behind the work. + +The description field supports [Markdown syntax](https://www.markdownguide.org/cheat-sheet/) and has a limit of 10,000 characters. + +In addition to the main link (see next field) you can add further links in the markdown to help others to understand the work of the project. + +#### Link + +A valid URL for the project, beginning with https:// + +This will be displayed next to the hypercert on webpages like OpenSea and should link users to a page that has more information about the project or impact claim. + +#### Logo + +An icon for the top left part of the card. This could be your project logo. It will be automatically masked to the shape of a circle. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +#### Background Banner Image + +A background image that will extend across the upper half of the artwork. This could be your project masthead or a unique piece of art. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +Currently we don't support zoom / cropping, so you will need to test the look and feel on your own. + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +### Work Scope fields + +#### Work Scope + +One or multiple tags describe the work that the hypercert represents. This work scope will be used to identify the work that is included in the hypercerts and the work that is not included. + +Multiple tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +_Note: In the future, you will be able to specifically exclude work from the hypercert._ + +#### Start and End Date of Work + +The work time period defines when the work was done that the hypercert represents, i.e., only the work in this time period is included in the hypercert. + +The time period of work doesn't need to be the start and end date of a project, but it can be. One project can be split up into multiple hypercerts, e.g. all hypercerts can have the same `work scope`, but different time periods of work. Of course, the time periods are not allowed to overlap. + +### Impact scope fields + +#### Impact Scope + +The impact scope can be used to limit the impact that a hypercert represents, e.g. for the work scope `Planting trees` a hypercert can represent _only_ the impact on biodiversity by including the impact scope tag `Biodiversity`. This would exclude all other impacts, including the impact on CO2 in the atmosphere, which can be useful if that impact is already captured by a carbon credit. + +By default this is set to "`all`" and we strongly recommend keeping it that way. + +Just like the work scope, multiple impact scope tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction). + +#### Start and End Date of Impact + +The impact time period is another way to limit the impact that a hypercert represents, e.g. inventing a new medical treatment has a positive impact over many years, but we might want to capture the positive impact separately for each year. + +By default the `impact start date` is the same as the `work start date` and the `impact end date` is "`indefinite`", i.e., the impact is not restricted time-wise. We strongly recommend keeping it that way. + +### Set of Contributors + +Provide a list of contributors, one per line, or comma-separated. + +The list should include _all_ contributors that performed the described work. + +Contributors are generally itemized as wallet addresses or ENS names, but can also be names / pseudonyms. Groups of contributors can be represented by a multisig or name of an organization. + +### Owners + +#### Allowlist + +The allowlist allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions afterwards. For example, it can be used to allocate fractions to previous funders and contributors. + +The allowlist is implemented as a CSV file specifying `index,address,price,fractions` headers. + +| index | address | price | fractions | +| ----- | ------------------------------------------ | ----- | --------- | +| 0 | 0x5dee7b340764c49a827c60d2b8729e49405fbefc | 0.0 | 100 | +| 1 | 0x1e2dbb9ca3f6d48e085384a821b7259abfdc7d65 | 0.0 | 50 | +| ... | ... | ... | ... | +| 999 | 0x436bad18642f45d3fa5fcaad0a2d81764a9cba85 | 0.0 | 1 | + +The `price` field is denominated in ETH. This should remain at 0.0 for all hypercerts, as primary sales are not currently supported through the app and the secondary sale/transfer of hypercerts is currently not allowed. + +You can store your allowlists on IPFS using [web3.storage](https://web3.storage/). + +:::note +If your allowlist is not properly formatted, you will be unable to mint your hypercert. If you do not include an allowlist, then the creator of the hypercert will receive 100% of the hypercert (set to a default of 10,000 units), which you can then sell or transfer to another wallet a maximum of one time. +::: + +#### Rights + +This field defines the rights that owners of the hypercert have over the work being claimed by this hypercert. + +By default this is set to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +_Note: In the future, additional rights can be included for different hypercerts._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md new file mode 100644 index 00000000..87fb9194 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md @@ -0,0 +1,23 @@ +--- +title: Open Impact Evaluations +id: evaluation +sidebar_position: 5 +--- + +A key design element is that hypercerts themselves do not make a claim about the size of the impact, but only account for the work that is supposed to be impactful. The figure below shows this contrast in a simplified illustration of the example that we introduced above. The open evaluation system allows multiple evaluations to point at the same area of the impact space that a hypercert claims. The evaluations can include self-evaluation from the contributors themselves. Funders observe these and make their funding decisions based on this richer set of information. + +![hypercert evaluations](../../static/img/hypercert_evaluations.png) + +The open evaluation system is also used to provide additional information, e.g. an evaluator or the project itself provides information about the health of the trees. This information can then be used transparently by other evaluators to evaluate the impact on CO2 in the atmosphere. + +An important feature is that the evaluations do not directly point at a hypercert, but rather at an area in the impact space. In practice this area will mostly be the exact same area that a hypercert claims, such that it can be considered an evaluation of the hypercert, but it does not have to. This feature ensures that, if hypercerts are merged or split, previous evaluations will continue to be linked appropriately. + +The form of evaluations can be standardized to simplify handling and comparing multiple evaluations from multiple evaluators. The open evaluation system allows for templates to be created and used by any evaluators. Similar to the emerging ontologies, these are not enforced centrally, but should emerge as useful standards – potentially steered by decentralized governance institutions. + +Important characteristics of the open evaluation system are: + +- Evaluators can submit multiple evaluations of the same area in the impact space as more information becomes available +- Evaluations can challenge other evaluations +- Evaluation methodologies can evolve over time + +These features allow the whole evaluation system to be dynamically improved by each actor. The relevant incentives for this improvement will stem from the funders who will value the signals from some evaluators more than others and evaluators are able to build up reputation. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md new file mode 100644 index 00000000..8acc11d1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md @@ -0,0 +1,104 @@ +--- +title: "Hypercerts: a New Primitive for Impact Funding Systems" +id: hypercerts-intro +sidebar_position: 3 +--- + +### Defining hypercerts + +A hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and represents all or parts of that impact. A hypercert has the following fields (one for each dimension): + +1. **Set of contributors:** An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. **Scope of work:** A conjunction of potentially-negated work scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +3. **Time of work:** A date range, from the start to the end of the work being claimed by this hypercert. +4. **Scope of impact:** A conjunction of potentially-negated impact scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +5. **Time of impact:** Date ranges from the start to the end of the impact. +6. **Rights of the owners:** An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Implementing hypercerts as a semi-fungible token allows multiple contributors and funders to own parts of hypercerts. For instance the original contributors can award 10% of a hypercert to a funder, while keeping 90%, which they can award to other funders later. This is why hypercerts are fractionalizable. + +### Examples + +In the simplest cases of hypercerts, the scope of work and impact as well as the time of impact are not restricted and no rights are transferred to owners of the hypercerts, i.e. the hypercerts just define the who (set of contributors) and when (time of work) of the claimed work. Scope of work and impact would be set to all, time of impact to “indefinite” and the rights to only “public display of support”. The latter is always included as the hypercert is a public record, such that owners will always automatically display their support of the work. + +Take for example hypercert 1 below: It represents all work that contributor 1 has performed in 2013 with all the impact that the work had from the beginning of the work; the hypercert doesn’t give any additional rights to the owners of the hypercert. + +The other fields – except the rights field – can be used to limit the work or impact that is represented by the hypercert. Hypercert 2 limits this to the work on IPFS in 2013, i.e. any other work besides IPFS that contributor 1 performed is not included. Hypercert 3 limits it even further as it excludes a specific aspect of IPFS, the go-ipfs implementation. + +| | **Hypercert 1** | **Hypercert 2** | **Hypercert 3** | +| ----------------------- | ------------------------- | ------------------------- | ------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | all | IPFS | IPFS ∧ ¬ go-ipfs | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | all | all | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → 2013-12-31 | +| **Rights** | Public display of support | Public display of support | Public display of support | + +In the table below we illustrate a use case for limiting the scope of impact. Suppose contributor 1 protects trees in a certain area. This work has positive effects on the CO2 in the atmosphere and could turn into carbon credits; however, the trees have additional positive impacts, such as protecting biodiversity. Instead of including all positive impacts in one hypercert (hypercert 4), the impact can be split between the impact on CO2 in the atmosphere (hypercert 5) and all other positive impacts (hypercert 6). If funders are willing to pay for biodiversity, this would be a new income opportunity. And it would account for the additional positive impact that other methods of reducing CO2 might not have, like industrial carbon capture. Importantly, negative impacts can not be excluded from a hypercert. + +| | **Hypercert 4** | **Hypercert 5** | **Hypercert 6** | +| ----------------------- | -------------------------- | -------------------------- | -------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | Protecting trees in area X | Protecting trees in area X | Protecting trees in area X | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | CO2 in atmosphere | all ∧ ¬ CO2 in atmosphere | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → indefinite | +| **Rights** | Public display of support | Public display of support | Public display of support | + +Importantly a hypercert does not specify the “size” of the impact, e.g. a hypercert does not state “5 tons of CO2 removed from the atmosphere.” Instead the hypercert only defines the work, e.g. “200 trees protected” (scope of work) in 2022 (time of work). The size of the impact is then left to the evaluations of the “CO2 in the atmosphere” (scope of impact) in 2022 (time of impact) that point towards the covered region of the hypercert. For instance: This allows a self evaluation to claim that 5 tons of CO2 were removed in a given year as well as one or multiple evaluations from independent auditors to confirm or challenge how much CO2 has been removed. An evaluator could detect that some of the trees were not healthy and hence only 4 tons of CO2 were removed. Allowing for multiple evaluation is a defining characteristic of the open evaluation system. + +### Functions of hypercerts + +#### 1. Identifiability + +Hypercerts clearly define the work that is supposed to be impactful by creating a record of who (set of contributors) claims to do or have done what (scope of work) in what time period (time of work). They also allow the creation of multiple records of the same work to identify separate impacts that this work had or will have (scope of impact) over specified time periods (time of impact). + +#### 2. Traceability + +As these records are public and logically monotonic (immutable, except to split or merge hypercerts), records are durable and permanent. + +#### 3. Transferability + +The records are a digital object that can be owned and ownership can be transferred (under specific conditions). As hypercerts can be created as fractionalizable, it is also possible to transfer only a specified fraction of the hypercert. Each hypercert defines the rights over the defined work that owners have, such as rights to retrospective rewards, rights to public display of the support (“bragging rights”) or rights to passive income from intellectual property. + +:::note Transferability restrictions + +Hypercerts are generally transferable. However, there are use cases, in which minters of hypercerts want to restrict how their hypercerts can be transferred. The protocol allows the minter to restrict who can transfer the hypercert and/or to whom the hypercert can be transferred. For instance, by specifying that only the original owner can transfer the hypercert, any future owner is prohibited from selling it, i.e. a secondary market would not exist for this hypercert. + +::: + +### Merging hypercerts + +Besides the fungible dimension, hypercerts can be merged and split on any of the six dimensions as shown in box 1. Let us take the hypercert 1 from the section "Hypercerts definition" and focus only on two of the dimensions, scope of work and time of work. These two dimensions create a simplified impact space. The figure below shows how work on IPFS (InterPlanetary File System) could have been minted over time in separate hypercerts, one for each quarter of work. + +![minting hypercerts example](../../static/img/creating.png) + +We created five hypercerts, one for each quarter of work. As the resulting work of all of these together is IPFS 0.1, the merged hypercert in total is more meaningful and more valuable than just the five individual hypercerts. In this case the proverb is true, the whole is greater than the sum of its parts. Hence, we want to merge them as shown in the next figure. + +![merging hypercerts example](../../static/img/merging.png) + +### Splitting hypercerts + +Conversely, splitting can increase the meaningfulness and value of hypercerts as well. We can split the work on IPFS 0.1 into the conceptual work “invention of IPFS” and the implementation via “go-ipfs 0.1” as shown in the next figure. + +![splitting hypercerts examples](../../static/img/splitting.png) + +Other use cases are where multiple contributors want to combine their work on the same scope of work (merging) or disentangle their work (splitting). Ultimately, splitting and merging allows users to repackage the digital representation of their work and impact. + +Importantly, splitting and merging are the only operations that are permitted to change hypercerts. Once an area in the impact space is claimed, it can not be unclaimed. This ensures that claims are never forgotten. + +### Retiring hypercerts + +While a claim in the impact space can not be unclaimed, it can be retired. Retiring a hypercert means that owners can not transfer and sell it anymore. This way owners prove that they are the final buyers of the impact. Technically retiring hypercerts means that they are sent to a specific null address, which ensures that the retired hypercerts are recorded and traceable. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md new file mode 100644 index 00000000..6f71ac50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md @@ -0,0 +1,103 @@ +--- +title: The Need for Interoperable Impact Funding Systems (IFSs) +id: ifs +--- + +# The Need for Interoperable Impact Funding Systems (IFSs) + +### An IFS consists of + +- **Actors:** Contributors, funders, evaluators, and beneficiaries +- **Funding mechanisms:** Grants, bounties, retrospective funding, etc. +- **Coordination mechanisms:** Roadmapping, communication forums, etc. +- **A goal:** Maximize the domain-specific positive value created (impact) + +The goal will be specific to the impact area, e.g. prevent existential risks from artificial intelligence (AI) would be the goal for the impact area “AI safety.” To achieve these goals, skilled contributors must work with high effort on promising projects. Additionally, for those projects that create impact continuously, sufficient income streams are necessary to cover both their ongoing operating expenses and contributors’ upside incentives. + +#### Actors in IFSs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeSubtypeDescription
ContributorsPeople or organizations who do the work
FundersProspective fundersPeople or organizations who fund work before it is done
Retrospective fundersPeople or organizations who fund work after it is done
EvaluatorsScoutsPeople or organizations who evaluate the potential impact of work before it is done
AuditorsPeople or organizations who evaluate the impact of work after it is done
BeneficiariesPeople or objects that are impacted by the work
+ +### Guiding questions for designing IFSs + +1. **Projects:** How can we improve the chances that the most promising projects are worked on? +2. **Talent & resources:** How can we attract top talent to contribute to the most promising projects and provide them with the necessary resources? +3. **Effort:** How can we reward contributors for their impact on outcomes? +4. **Sustainable income:** How can we create recurring income streams and financial sustainability for impactful projects? + +Markets have been proven very powerful in answering these questions if they are directed towards maximizing profits. As we are directing systems towards maximizing impact, these answers become more challenging. In particular, in an IFS we are facing coordination and incentive problems in funding impact, such as the free-rider problem. + +### Example dynamics between actors in an IFS + +In order for impact funding systems to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources and (3) evaluations. In the diagram below you see a potential dynamic between the actors of an IFS. In that scenario hypercerts can account for the prospective funding (steps 2-3) as well as for the retrospective funding (steps 8-9) from different funders. Evaluations are made public and can be discovered through the hypercerts for all funders (steps 5-7). Retrospective funders can reward not only the contributors but also the prospective funders (steps 10-11). + +```mermaid +sequenceDiagram + autonumber + participant Beneficiaries + participant Contributors + participant Prospective funders + participant Retrospective funders + participant Evaluators + Contributors ->> Contributors: Mint hypercerts + Prospective funders ->> Contributors: Award funding + Contributors ->> Prospective funders: Award fractions of
the hypercert + Contributors ->> Beneficiaries: Create impact + Retrospective funders ->> Evaluators: Fund evaluation + Evaluators ->> Beneficiaries: Evaluate impact on beneficiaries + Evaluators ->> Retrospective funders: Make evaluations public,
esp. for retrospective
funders + Retrospective funders ->> Contributors: Award funding + Contributors ->> Retrospective funders: Award fractions of hypercerts + opt + Retrospective funders ->> Prospective funders: Award funding + Prospective funders ->> Retrospective funders: Transfer fractions
of hypercert + end +``` + +### Hypercerts as a data layer for IFSs + +By serving as a single, open, shared, decentralized database hypercerts lower the transaction costs to coordinate and fund impactful work together. This is important because the optimal funding decisions of a single funder depends on the funding decision of all other funders. For instance, some work is only impactful if a minimum funding is provided: The impact is non-linear in the funding amount, e.g. half a bridge is not half as impactful as a full bridge. Other work might be over-funded, i.e. the impact of an additional dollar is basically zero. Ultimately, funders want to find the highest impact for each additional dollar spend (cf. S-process as in Critch, 2021). Today multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Through hypercerts the funding becomes more transparent and the credits for funding impactful work can be easily shared. Coordinating funding becomes easier. + +Hypercerts don’t solve this coordination problem by themselves, but build the basis for different decision and funding mechanisms as shown below. Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. Hypercerts do not lock in any particular decision-making scheme for funders. + +![Hypercerts as a data layer for an IFS](../../static/img/hypercert_data_layer.png) + +Looking farther into the future: If a large majority of funding across an entire IFS ends up flowing through hypercerts, funders have created the transparency that enables each of them to make the best decisions given the funding decision of everyone else. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md new file mode 100644 index 00000000..f8fed762 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md @@ -0,0 +1,35 @@ +--- +title: A Consistent Impact Space +id: impact-space +sidebar_position: 4 +--- + +Every hypercert represents a claim in the impact space, which itself represents all possible claims. Above we illustrated the impact space with two dimensions, scope and time of work. The complete impact space is spanned by the six dimensions introduced in the definition of hypercerts. + +### Consistency of the impact space + +Every point in the impact space should either be claimed or not be claimed. No point must be claimed twice, or equivalently: + +- If the impact of some work is represented in one hypercert, it must not be part of any other hypercert. +- Hypercerts must not overlap with each other. + +The table below shows two hypercerts that were illustrated in the section on "Hypercerts operations", but now with all six fields. The two hypercerts can represent the exact same work by the same contributor, but they do not overlap because of the difference in the time of work. + +| | **Hypercert 7** | **Hypercert 8** | +| ----------------------- | ------------------------ | ------------------------ | +| **Set of contributors** | Contributor 1 | Contributor 1 | +| **Scope of work** | IPFS | IPFS | +| **Time of work** | 2013-10-01 to 2013-12-31 | 2014-01-01 to 2014-03-31 | +| **Scope of impact** | all | all | +| **Time of impact** | 2013-10-01 → indefinite | 2014-01-01 → indefinite | +| **Rights** | None | None | + +The consistency of the impact space is crucial as it ensures that no rights to an impact claim are sold twice. If for example someone owns the right to retrospective rewards for the impact of some work, the owners must be identifiable unambiguously. + +Because users can create hypercerts with arbitrary data on any chain, on which a hypercert contract is deployed, we provide ways to help users detect collisions in the impact space. For example, if one hypercert on Ethereum points to the work on “IPFS”, and another hypercert on Filecoin points to the work on “https://github.com/ipfs/go-ipfs” both with the same contributor and time of work, which of these overlapping hypercerts is the correct one to support? To surface such overlapping hypercerts, the hypercerts protocol and SDK will support mechanisms to index, search, and visualize neighbors in the impact space. With these tools evaluators can quickly detect potential conflicts and submit the results as evaluations to help disambiguate proper credit and attribution. + +### Emerging ontologies + +Common ontologies for the scope of work and scope of impact are useful to create transparency and improve discoverability. Such ontologies need to be created from the practices and should be adapted over time. They are like emerging norms, instead of fixed rules. However, some larger players or a group of smaller players could enforce certain ontologies, e.g. if multiple funders agree that they only fund projects that follow a specified ontology. + +As some ontologies might be more useful than others, we would ideally see a consensus emerge between participants and experts in each impact area. Decentralized governance institutions can help facilitate this; however, further details on the design are out of the scope of this paper and are left for future work. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md new file mode 100644 index 00000000..57444581 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md @@ -0,0 +1,42 @@ +--- +title: Retrospective Impact Funding +id: retrospective-funding +sidebar_position: 6 +--- + +### Introducing retrospective funding + +While hypercerts do not impose any specific funding mechanisms, they are especially useful for retrospective funding. The core idea, from the perspective of contributors building impactful goods, is this: if you can reasonably expect to get funded retrospectively for your work once you produce a positive impact, then you can work now, in expectation of a probabilistic future cash flow. In another conception, you are effectively “borrowing” money from this anticipated future cash flow to fund the work in the first place; the expectation of future funding “retro-causes” the impactful work. Retrospective funding may be able to 1) provide incentives for contributors to take on impactful goods projects with a potentially high, but uncertain, impact and 2) create a more efficient IFS by back-propagating signals on what outcomes were impactful post-hoc. + +In addition, contributors are able to receive fair compensation by providing outsized impact that will be highly valued. It incentivizes you to create a positive impact, beyond your intrinsic motivation. This does not mean that the most successful contributors to impactful goods automatically have potential upside comparable to some for-profit startup founders (or that they should), just that their potential upside does depend on how much funders later value their past work. This will attract more talent to the impact sector by improving performance-based compensation. + +The crucial aspect for this to work: funders need to retrospectively fund impact, and send credible signals that they will do so in the future. Based on these signals contributors form expectations about future retrospective rewards and can start working today to receive them in the future. + +Hypercerts facilitate retrospective funding as the impact claims are identifiable, traceable and transferable. Contributors can sell parts of their hypercerts to prospective funders to receive the necessary funding for their project (“activity” in the figure below). The project delivers impact to a larger group (“beneficiaries”), which retrospectively buys the hypercerts from the prospective funder, and from the contributors if they retained some fraction of their hypercerts (the latter is not represented in the figure). + +![Retrospective funding with hypercerts](../../static/img/retrospective_funding.png) + +### Increasing rewards + +Retrospective funding allows us to increase rewards as more impact is created because impact is easier to observe, measure and prove retrospectively. Increasing rewards – as shown in the next figure – incentivizes contributors to put in their highest effort to produce impact and enables contributors to be rewarded for their talent. Moreover, prospective funders are incentivized to select, fund and support the projects with the highest expected impact, if they also receive retrospective rewards. + +![Increasing rewards](../../static/img/increasing_rewards.png) + +Note that retrospective funding should not be used in cases where a significant negative impact is possible since a nongovernmental, permissionless framework can not impose retrospective penalties for negative externalities. See Ofer & Cotton-Barratt (2022) for a discussion of this limitation of retrospective funding. + +In some cases we do not expect the retrospective evaluation to be any different than the prospective evaluation, i.e. there is no uncertainty resolved over time as the impact of an activity is already “known” prospectively. In these cases retrospective funding would only complicate the funding mechanism and funding via grants or milestone bounties would be preferable. Retrospective funding is preferable only if uncertainty is resolved over time. + +### Impact evaluations + +The relevance of impact evaluations will depend on how much their signals influence the funding decisions of retrospective funders (see the potential dynamics in the section on "IFSs"). This is a critical difference to many impact reports today: If a project was funded by a grant, the funders as well as the project want to receive a positive evaluation. If, however, the funding decisions of the retrospective funders are outstanding, they are interested in truthful signals about the impact. Hence, funders value improvements in evaluation methodologies and can fund independent evaluators. Evaluators in turn would build up a reputation for their evaluation methodologies and improve the strength of their signals to retrospective funders. + +Impact evaluators can take on a range of forms ranging forms, such as + +- Voting by relevant communities or beneficiaries +- Expert panels +- Professional evaluators similar to financial rating agencies +- Automatic monitoring and data collection by sensors and oracles + +The most useful form or combinations thereof will depend on the specific requirements of the impact area. For a generalized framework on impact evaluators see Protocol Labs (2023). + +While retrospective funding makes impact evaluations financially relevant for funders and contributors, hypercerts enable to pre-commit funding for those evaluations: As impact claims are never forgotten, any actor can at any time commit funding to a future evaluation of these claims. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md new file mode 100644 index 00000000..4d4648ba --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md @@ -0,0 +1,24 @@ +--- +title: Introduction +id: whitepaper-intro +--- + +# Vision & Whitepaper + +:::note + +If you prefer to read the draft whitepaper (v0) as a pdf, you can find it [here](../../static/pdf/hypercerts_whitepaper_v0.pdf). The content is mostly identical to the following pages. + +::: + +#### The world faces unprecedented challenges, from climate change to safe artificial intelligence, that require billions to trillions of dollars of public goods funding. + +High-upside/high-uncertainty endeavors are often overlooked due to the absence of strong incentives to pursue them in the dominant public goods funding framework of at-cost grants or even a milestone-bounty framework (which directly exposes small contributors to aversive risk levels). Yet these should be pursued when the expected positive value is very high, as it often is. New impact funding mechanisms can address this. One such mechanism is retrospective funding, which rewards projects based on the impact they create after the impact is observable. If projects can reasonably expect such retrospective rewards, they are incentivized to maximize their impact and – together with prospective funders – take risky bets when the expected positive value is high. + +#### In order for Impact Funding Systems (IFSs) to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources, and (3) evaluations. + +Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. We do not wish to lock in any particular decision-making scheme for funders. Without mechanisms like these, multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Funders should be able to easily collaborate with other funders or to intentionally fund different projects to diversify the funded approaches. Evaluators should be able to evaluate the same impact with different methodologies – potentially with conflicting results, to foster rigor and progress of evaluation methodologies. + +#### Hypercerts create this interoperability by serving as a single, open, shared, decentralized database for impact funding mechanisms. + +A single hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and whose ownership is fractionizable and transferable (under specific conditions). Hypercerts do not impose any specific funding mechanisms but provide baseline invariant guarantees such that claims will not be forgotten as different mechanisms come into and out of fashion. This is also why hypercerts are especially useful for any retrospective funding mechanisms – funding can be applied to claims of the past. diff --git a/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json b/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json new file mode 100644 index 00000000..33a5ba79 --- /dev/null +++ b/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json @@ -0,0 +1,162 @@ +{ + "mySidebar": [ + { + "type": "doc", + "id": "intro" + }, + { + "type": "category", + "label": "Vision & Whitepaper", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "whitepaper/whitepaper-intro" + }, + { + "type": "doc", + "id": "whitepaper/ifs" + }, + { + "type": "doc", + "id": "whitepaper/hypercerts-intro" + }, + { + "type": "doc", + "id": "whitepaper/impact-space" + }, + { + "type": "doc", + "id": "whitepaper/evaluation" + }, + { + "type": "doc", + "id": "whitepaper/retrospective-funding" + } + ] + }, + { + "type": "category", + "label": "Developer Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "developer/quickstart-javascript" + }, + { + "type": "doc", + "id": "developer/quickstart-solidity" + }, + { + "type": "doc", + "id": "developer/minting" + }, + { + "type": "doc", + "id": "developer/allowlists" + }, + { + "type": "doc", + "id": "developer/querying" + }, + { + "type": "doc", + "id": "developer/split-merge" + }, + { + "type": "doc", + "id": "developer/evaluations" + }, + { + "type": "doc", + "id": "developer/burning" + }, + { + "type": "doc", + "id": "developer/supported-networks" + }, + { + "type": "doc", + "id": "devops/index" + }, + { + "type": "category", + "label": "API Reference", + "collapsed": true, + "items": [ + { + "type": "category", + "label": "Contracts", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "developer/api/contracts/HypercertMinter" + }, + { + "type": "doc", + "id": "developer/api/contracts/SemiFungible1155" + }, + { + "type": "doc", + "id": "developer/api/contracts/AllowlistMinter" + } + ] + }, + { + "type": "doc", + "id": "developer/api/sdk/modules" + } + ] + } + ] + }, + { + "type": "category", + "label": "Minting Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "minting-guide/minting-guide-start" + }, + { + "type": "doc", + "id": "minting-guide/step-by-step" + }, + { + "type": "doc", + "id": "minting-guide/gitcoin-round" + } + ] + }, + { + "type": "category", + "label": "Implementation", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "implementation/token-standard" + }, + { + "type": "doc", + "id": "implementation/metadata" + }, + { + "type": "doc", + "id": "implementation/glossary" + } + ] + }, + { + "type": "doc", + "id": "faq" + }, + { + "type": "doc", + "id": "further-resources" + } + ] +} diff --git a/docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json b/docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json new file mode 100644 index 00000000..91fbd94e --- /dev/null +++ b/docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json @@ -0,0 +1,165 @@ +{ + "mySidebar": [ + { + "type": "doc", + "id": "intro" + }, + { + "type": "category", + "label": "Vision & Whitepaper", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "whitepaper/whitepaper-intro" + }, + { + "type": "doc", + "id": "whitepaper/ifs" + }, + { + "type": "doc", + "id": "whitepaper/hypercerts-intro" + }, + { + "type": "doc", + "id": "whitepaper/impact-space" + }, + { + "type": "doc", + "id": "whitepaper/evaluation" + }, + { + "type": "doc", + "id": "whitepaper/retrospective-funding" + } + ] + }, + { + "type": "category", + "label": "Developer Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "developer/quickstart-javascript" + }, + { + "type": "doc", + "id": "developer/quickstart-solidity" + }, + { + "type": "doc", + "id": "developer/minting" + }, + { + "type": "doc", + "id": "developer/allowlists" + }, + { + "type": "doc", + "id": "developer/querying" + }, + { + "type": "doc", + "id": "developer/split-merge" + }, + { + "type": "doc", + "id": "developer/evaluations" + }, + { + "type": "doc", + "id": "developer/burning" + }, + { + "type": "doc", + "id": "developer/supported-networks" + }, + { + "type": "doc", + "id": "devops/index" + }, + { + "type": "category", + "label": "API Reference", + "collapsed": true, + "items": [ + { + "type": "category", + "label": "Protocol", + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "developer/api/contracts/protocol" + } + ] + }, + { + "type": "category", + "label": "Exchange", + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "developer/api/contracts/marketplace" + } + ] + }, + { + "type": "doc", + "id": "developer/api/sdk/modules" + } + ] + } + ] + }, + { + "type": "category", + "label": "Minting Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "minting-guide/minting-guide-start" + }, + { + "type": "doc", + "id": "minting-guide/step-by-step" + }, + { + "type": "doc", + "id": "minting-guide/gitcoin-round" + } + ] + }, + { + "type": "category", + "label": "Implementation", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "implementation/token-standard" + }, + { + "type": "doc", + "id": "implementation/metadata" + }, + { + "type": "doc", + "id": "implementation/glossary" + } + ] + }, + { + "type": "doc", + "id": "faq" + }, + { + "type": "doc", + "id": "further-resources" + } + ] +} diff --git a/docs/versions.json b/docs/versions.json index 1e3a80c1..df2daf73 100644 --- a/docs/versions.json +++ b/docs/versions.json @@ -1 +1,2 @@ -["0.3.0", "0.0.1"] +["1.0.0-alpha.1", "0.3.0", "0.0.1"] + diff --git a/frontend/components/hypercert-fetcher.tsx b/frontend/components/hypercert-fetcher.tsx index e826df7f..78f0da03 100644 --- a/frontend/components/hypercert-fetcher.tsx +++ b/frontend/components/hypercert-fetcher.tsx @@ -28,6 +28,7 @@ export interface HypercertFetcherProps { useQueryString?: boolean; // Forces us to try the query string first byClaimId?: string; // Fetch by claimId byMetadataUri?: string; // Fetch by metadataUri; If both are specified, byMetadataUri will override the URI in the claim + overrideChainId?: number; // Override the chainId } export function HypercertFetcher(props: HypercertFetcherProps) { @@ -40,9 +41,12 @@ export function HypercertFetcher(props: HypercertFetcherProps) { useQueryString, byClaimId, byMetadataUri, + overrideChainId, } = props; const [data, setData] = React.useState(); - const { client } = useHypercertClient(); + const { client } = useHypercertClient({ + overrideChainId, + }); React.useEffect(() => { if (!client) { diff --git a/frontend/components/transfer-fraction-button.tsx b/frontend/components/transfer-fraction-button.tsx new file mode 100644 index 00000000..12d0dfdf --- /dev/null +++ b/frontend/components/transfer-fraction-button.tsx @@ -0,0 +1,249 @@ +import { + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + IconButton, + Modal, + TextField, + Typography, +} from "@mui/material"; +import { Send } from "@mui/icons-material"; +import React, { useState } from "react"; +import { useTransferFraction } from "../hooks/transferFraction"; +import { Form, Formik } from "formik"; +import { isAddress } from "viem"; +import { useClaimById, useFractionById } from "../hooks/fractions"; +import { useAccountLowerCase } from "../hooks/account"; +import { formatAddress } from "../lib/formatting"; +import { TransferRestrictions } from "@hypercerts-org/sdk"; +import { useReadTransferRestrictions } from "../hooks/readTransferRestriction"; + +const style = { + position: "absolute", + top: "50%", + left: "50%", + transform: "translate(-50%, -50%)", + width: 400, + bgcolor: "background.paper", + boxShadow: 24, + pt: 2, + px: 4, + pb: 3, +}; + +interface Props { + fractionId: string; + text?: string; + disabled?: boolean; + className?: string; +} +export function TransferFractionButton({ + fractionId, + text, + className, + disabled, +}: Props) { + const [open, setOpen] = useState(false); + const handleOpen = () => setOpen(true); + const handleClose = () => setOpen(false); + const { address } = useAccountLowerCase(); + + const { write, readOnly, txPending } = useTransferFraction({ + onComplete: () => { + handleClose(); + }, + }); + + const [dialogOpen, setDialogOpen] = React.useState(false); + + const handleDialogOpen = () => { + setDialogOpen(true); + }; + + const handleDialogClose = () => { + setDialogOpen(false); + }; + + const { data: fractionData, isLoading: isLoadingFraction } = + useFractionById(fractionId); + + const { data: claim, isLoading: isLoadingClaim } = useClaimById( + fractionData?.claimToken?.claim.id, + ); + + const { + data: transferRestrictions, + isLoading: isLoadingTransferRestrictions, + } = useReadTransferRestrictions(claim?.claim?.tokenID); + + const determineCanTransfer = () => { + if (!address) { + return false; + } + + if (!transferRestrictions) { + return false; + } + + if (!(fractionData?.claimToken?.owner === address)) { + return false; + } + + if (!(transferRestrictions in TransferRestrictions)) { + return false; + } + + const transferRestrictionValue = + TransferRestrictions[ + transferRestrictions as keyof typeof TransferRestrictions + ]; + + if (transferRestrictionValue === TransferRestrictions.DisallowAll) { + return false; + } + + if (transferRestrictionValue === TransferRestrictions.AllowAll) { + return true; + } + + if (transferRestrictionValue === TransferRestrictions.FromCreatorOnly) { + return claim?.claim?.creator === address; + } + + return false; + }; + + const canTransfer = determineCanTransfer(); + + const tokenId = fractionId.split("-")[1]; + const _disabled = + txPending || + readOnly || + disabled || + isLoadingFraction || + isLoadingClaim || + isLoadingTransferRestrictions; + + if (!canTransfer) { + return null; + } + + return ( + <> + { + console.log({ + fractionId, + text, + className, + disabled, + }); + handleOpen(); + }} + > + + + + + { + if (!values.to || values.to === "") { + return { to: "Required" }; + } + + if (!isAddress(values.to)) { + return { to: "Invalid address" }; + } + }} + onSubmit={() => { + handleDialogOpen(); + }} + > + {({ isSubmitting, isValid, setFieldValue, errors, values }) => { + const isDisabled = _disabled || isSubmitting; + return ( + <> +
+ + Transfer this fraction + + { + setFieldValue("to", e.target.value); + }} + /> + + {" "} + + + Are you sure you want to transfer? + + + + Transferring to {formatAddress(values.to)}. This action + cannot be reversed. + + + + + + + + + ); + }} +
+
+
+ + ); +} diff --git a/frontend/hooks/fractions.ts b/frontend/hooks/fractions.ts index 66b20dde..5103e39b 100644 --- a/frontend/hooks/fractions.ts +++ b/frontend/hooks/fractions.ts @@ -39,3 +39,31 @@ export const useFractionById = (fractionId: string) => { { enabled: !!fractionId }, ); }; + +export const useClaimById = (claimId?: string | null) => { + const { client } = useHypercertClient(); + + return useQuery( + ["graph", "claims", claimId], + () => { + if (!client) return null; + if (!claimId) return null; + return client.indexer.claimById(claimId); + }, + { enabled: !!claimId && !!client }, + ); +}; + +export const useClaimMetadataByUri = (uri?: string | null) => { + const { client } = useHypercertClient(); + + return useQuery( + ["graph", "claim-metadata", uri], + () => { + if (!client) return null; + if (!uri) return null; + return client.storage.getMetadata(uri); + }, + { enabled: !!uri && !!client }, + ); +}; diff --git a/frontend/hooks/hypercerts-client.ts b/frontend/hooks/hypercerts-client.ts index 727b6747..4ca52dda 100644 --- a/frontend/hooks/hypercerts-client.ts +++ b/frontend/hooks/hypercerts-client.ts @@ -4,10 +4,14 @@ import { NFT_STORAGE_TOKEN, WEB3_STORAGE_TOKEN } from "../lib/config"; import { HypercertClient, HypercertClientConfig } from "@hypercerts-org/sdk"; import { useWalletClient, useNetwork } from "wagmi"; -export const useHypercertClient = () => { +export const useHypercertClient = ({ + overrideChainId, +}: { + overrideChainId?: number; +} = {}) => { const { chain } = useNetwork(); const clientConfig = { - chain, + chain: overrideChainId ? { id: overrideChainId } : chain, nftStorageToken: NFT_STORAGE_TOKEN, web3StorageToken: WEB3_STORAGE_TOKEN, }; @@ -26,13 +30,14 @@ export const useHypercertClient = () => { } = useWalletClient(); useEffect(() => { - if (chain?.id && !walletClientLoading && !isError && walletClient) { + const chainId = overrideChainId || chain?.id; + if (chainId && !walletClientLoading && !isError && walletClient) { setIsLoading(true); try { const config: Partial = { ...clientConfig, - chain: { id: chain.id }, + chain: { id: chainId }, walletClient, }; @@ -44,7 +49,7 @@ export const useHypercertClient = () => { } setIsLoading(false); - }, [chain?.id, walletClient, walletClientLoading]); + }, [chain?.id, overrideChainId, walletClient, walletClientLoading]); return { client, isLoading }; }; diff --git a/frontend/hooks/readTransferRestriction.ts b/frontend/hooks/readTransferRestriction.ts new file mode 100644 index 00000000..8133140c --- /dev/null +++ b/frontend/hooks/readTransferRestriction.ts @@ -0,0 +1,28 @@ +import { useHypercertClient } from "./hypercerts-client"; +import { useWalletClient } from "wagmi"; +import { useQuery } from "@tanstack/react-query"; +import { readContract } from "viem/actions"; + +export const useReadTransferRestrictions = (tokenId?: bigint) => { + const { client } = useHypercertClient(); + const { data: walletClient } = useWalletClient(); + + return useQuery( + ["read-transfer-restrictions", tokenId], + async () => { + if (!client) return null; + if (!tokenId) return null; + if (!walletClient) return null; + const contract = client.contract; + + if (!contract) return null; + + return (await readContract(walletClient, { + ...contract, + functionName: "readTransferRestriction", + args: [tokenId], + })) as string; + }, + { enabled: !!tokenId && !!client }, + ); +}; diff --git a/frontend/hooks/transferFraction.ts b/frontend/hooks/transferFraction.ts new file mode 100644 index 00000000..e8d1509a --- /dev/null +++ b/frontend/hooks/transferFraction.ts @@ -0,0 +1,102 @@ +import { useContractModal } from "../components/contract-interaction-dialog-context"; +import { useParseBlockchainError } from "../lib/parse-blockchain-error"; +import { toast } from "react-toastify"; +import { useHypercertClient } from "./hypercerts-client"; +import { useState } from "react"; +import { waitForTransactionReceipt, writeContract } from "viem/actions"; +import { useAccount, useWalletClient } from "wagmi"; + +export const useTransferFraction = ({ + onComplete, +}: { + onComplete?: () => void; +}) => { + const [txPending, setTxPending] = useState(false); + + const { client, isLoading } = useHypercertClient(); + const { data: walletClient } = useWalletClient(); + const { address } = useAccount(); + + const stepDescriptions = { + transferring: "Transferring", + waiting: "Awaiting confirmation", + complete: "Done splitting", + }; + + const { setStep, showModal, hideModal } = useContractModal(); + const parseError = useParseBlockchainError(); + + const initializeWrite = async (fractionId: bigint, to: string) => { + if (!client) { + toast("No client found", { + type: "error", + }); + return; + } + + if (!walletClient) { + toast("No wallet client found", { + type: "error", + }); + return; + } + + if (!address) { + toast("No address found", { + type: "error", + }); + return; + } + + const hypercertMinterContract = client.contract; + + showModal({ stepDescriptions }); + setStep("transferring"); + try { + setTxPending(true); + const tx = await writeContract(walletClient, { + ...hypercertMinterContract, + functionName: "safeTransferFrom", + args: [address, to, fractionId, 1, ""], + }); + setStep("waiting"); + const receipt = await waitForTransactionReceipt(walletClient, { + hash: tx, + }); + + if (receipt?.status === "reverted") { + toast("Splitting failed", { + type: "error", + }); + console.error(receipt); + } + if (receipt?.status === "success") { + toast("Fraction successfully sent", { type: "success" }); + + setStep("complete"); + onComplete?.(); + } + } catch (error) { + toast(parseError(error, "Fraction could not be sent"), { + type: "error", + }); + console.error(error); + } finally { + hideModal(); + setTxPending(false); + } + }; + + return { + write: async (id: bigint, to: string) => { + try { + await initializeWrite(id, to); + window.location.reload(); + } catch (e) { + console.error(e); + } + }, + txPending, + readOnly: isLoading || !client || client.readonly, + }; +}; diff --git a/frontend/package.json b/frontend/package.json index 93ceffe5..1d944407 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -33,7 +33,7 @@ "@observablehq/runtime": "5", "@openzeppelin/merkle-tree": "^1.0.2", "@plasmicapp/host": "^1.0.171", - "@plasmicapp/loader-nextjs": "^1.0.284", + "@plasmicapp/loader-nextjs": "^1.0.345", "@rainbow-me/rainbowkit": "1.2.0", "@sentry/nextjs": "^7.73.0", "@sentry/utils": "^7.73.0", @@ -54,7 +54,7 @@ "html2canvas": "^1.4.1", "js-confetti": "^0.11.0", "lodash": "^4.17.21", - "next": "latest", + "next": "^13.5.6", "papaparse": "^5.4.1", "primereact": "^9.6.0", "qs": "^6.11.0", @@ -66,7 +66,7 @@ "react-toastify": "^9.1.1", "react-use": "^17.4.0", "serve": "^14.0.1", - "viem": "1.18.9", + "viem": "1.19.9", "wagmi": "1.4.5", "yup": "^0.32.11" }, diff --git a/frontend/plasmic-init.ts b/frontend/plasmic-init.ts index bcd4bac1..4e22ee73 100644 --- a/frontend/plasmic-init.ts +++ b/frontend/plasmic-init.ts @@ -32,6 +32,7 @@ import "primereact/resources/primereact.min.css"; import "primereact/resources/themes/tailwind-light/theme.css"; import { MergeAllClaimFractionsButton } from "./components/merge-all-claim-fractions-button"; import { SplitFractionButton } from "./components/split-fraction-button"; +import { TransferFractionButton } from "./components/transfer-fraction-button"; export const PLASMIC = initPlasmicLoader({ projects: [ @@ -182,6 +183,12 @@ PLASMIC.registerComponent(HypercertFetcher, { name: "HypercertFetcher", description: "Client-side fetch metadata from IPFS", props: { + overrideChainId: { + type: "number", + helpText: "Override chainId", + editOnly: true, + defaultValue: 5, + }, variableName: { type: "string", helpText: "Name to use in Plasmic data picker", @@ -673,6 +680,22 @@ PLASMIC.registerComponent(ProjectsClientProvider, { }, }); +PLASMIC.registerComponent(TransferFractionButton, { + name: "TransferFractionButton", + description: "Button that will transfer the fraction currently selected", + props: { + text: { + type: "string", + defaultValue: "Transfer", + helpText: "Text to display on button", + }, + fractionId: "string", + disabled: "boolean", + className: "string", + }, + importPath: "./components/transfer-fraction-button", +}); + PLASMIC.registerComponent(MergeAllClaimFractionsButton, { name: "MergeAllClaimFractionsButton", description: diff --git a/package.json b/package.json index f6e15919..90eb0ffd 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "url": "git+https://github.com/hypercerts-org/hypercerts.git" }, "overrides": { - "graphql": "^16.6.0", + "graphql": "^16.8.1", "@hypercerts/contracts": { "ethers": "6.8.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c5797c44..298843ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -141,6 +141,9 @@ importers: rollup-plugin-auto-external: specifier: ^2.0.0 version: 2.0.0(rollup@4.1.4) + rollup-plugin-copy: + specifier: ^3.5.0 + version: 3.5.0 rollup-plugin-dts: specifier: ^6.1.0 version: 6.1.0(rollup@4.1.4)(typescript@4.9.5) @@ -313,7 +316,7 @@ importers: version: 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@celo/rainbowkit-celo': specifier: ^1.1.0 - version: 1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(wagmi@1.4.5)(zod@3.22.4) + version: 1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(wagmi@1.4.5)(zod@3.22.4) '@emotion/react': specifier: ^11.10.5 version: 11.11.1(@types/react@18.2.33)(react@18.2.0) @@ -322,10 +325,10 @@ importers: version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) '@graphprotocol/client-cli': specifier: ^2.2.16 - version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': specifier: 1.0.0-alpha.2 - version: 1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6) + version: 1.0.0-alpha.2(typescript@5.1.6) '@hypercerts-org/observabletreemap': specifier: 'workspace: *' version: link:../vendor/observabletreemap @@ -354,11 +357,11 @@ importers: specifier: ^1.0.171 version: 1.0.177(react-dom@18.2.0)(react@18.2.0) '@plasmicapp/loader-nextjs': - specifier: ^1.0.284 - version: 1.0.333(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.0.345 + version: 1.0.345(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) '@rainbow-me/rainbowkit': specifier: 1.2.0 - version: 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.9)(wagmi@1.4.5) + version: 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.5) '@sentry/nextjs': specifier: ^7.73.0 version: 7.75.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0) @@ -417,7 +420,7 @@ importers: specifier: ^4.17.21 version: 4.17.21 next: - specifier: latest + specifier: ^13.5.6 version: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) papaparse: specifier: ^5.4.1 @@ -453,11 +456,11 @@ importers: specifier: ^14.0.1 version: 14.2.1 viem: - specifier: 1.18.9 - version: 1.18.9(typescript@5.1.6)(zod@3.22.4) + specifier: 1.19.9 + version: 1.19.9(typescript@5.1.6)(zod@3.22.4) wagmi: specifier: 1.4.5 - version: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) + version: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) yup: specifier: ^0.32.11 version: 0.32.11 @@ -512,7 +515,7 @@ importers: version: 1.1.7 jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + version: 29.7.0(@types/node@18.18.7) jest-environment-jsdom: specifier: ^29.5.0 version: 29.7.0 @@ -545,43 +548,43 @@ importers: version: 5.7.0 '@graphprotocol/client-add-source-name': specifier: ^2.0.0 - version: 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) + version: 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) + '@graphprotocol/client-cli': + specifier: ^3.0.0 + version: 3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@graphprotocol/client-polling-live': specifier: ^2.0.0 version: 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) '@graphql-mesh/cache-localforage': specifier: ^0.96.0 - version: 0.96.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/cross-helpers': specifier: ^0.4.1 version: 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/graphql': specifier: ^0.96.0 - version: 0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) + version: 0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': specifier: ^0.96.13 - version: 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/runtime': specifier: ^0.96.12 - version: 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/store': specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': - specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': specifier: ^3.2.0 version: 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': - specifier: 1.0.0-alpha.2 - version: 1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6) + specifier: 1.0.0-alpha.6 + version: 1.0.0-alpha.6(ts-node@10.9.1)(typescript@5.1.6) '@openzeppelin/merkle-tree': specifier: ^1.0.5 version: 1.0.5 @@ -616,8 +619,8 @@ importers: specifier: ^7.1.1 version: 7.1.1(node-fetch@3.3.2) viem: - specifier: ^1.18.4 - version: 1.18.4(typescript@5.1.6)(zod@3.22.4) + specifier: ^1.19.9 + version: 1.19.9(typescript@5.1.6)(zod@3.22.4) web3.storage: specifier: ^4.5.5 version: 4.5.5(node-fetch@3.3.2) @@ -634,12 +637,6 @@ importers: '@faker-js/faker': specifier: ^8.0.2 version: 8.2.0 - '@graphprotocol/client-cli': - specifier: ^3.0.0 - version: 3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 '@rollup/plugin-commonjs': specifier: ^24.0.1 version: 24.1.0(rollup@3.29.4) @@ -673,9 +670,6 @@ importers: abitype: specifier: ^0.10.2 version: 0.10.2(typescript@5.1.6)(zod@3.22.4) - babel-jest: - specifier: ^29.7.0 - version: 29.7.0(@babel/core@7.23.2) chai: specifier: ^4.3.7 version: 4.3.10 @@ -691,21 +685,9 @@ importers: ethereum-waffle: specifier: ^4.0.10 version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.1.6) - fetch-mock: - specifier: ^9.11.0 - version: 9.11.0(node-fetch@3.3.2) it-all: specifier: ^2.0.0 version: 2.0.1 - jest: - specifier: ^29.3.1 - version: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) - jest-extended: - specifier: ^4.0.0 - version: 4.0.2(jest@29.7.0) - jest-fetch-mock: - specifier: ^3.0.3 - version: 3.0.3 json-schema-to-typescript: specifier: ^12.0.0 version: 12.0.0 @@ -733,12 +715,6 @@ importers: sinon: specifier: ^15.2.0 version: 15.2.0 - ts-jest: - specifier: ^29.0.3 - version: 29.1.1(@babel/core@7.23.2)(babel-jest@29.7.0)(esbuild@0.17.19)(jest@29.7.0)(typescript@5.1.6) - ts-jest-resolver: - specifier: ^2.0.0 - version: 2.0.1 ts-mocha: specifier: ^10.0.0 version: 10.0.0(mocha@10.2.0) @@ -763,6 +739,9 @@ importers: typescript: specifier: 5.1.6 version: 5.1.6 + vitest: + specifier: ^0.28.4 + version: 0.28.5 vendor/observabletreemap: dependencies: @@ -821,6 +800,7 @@ packages: /@adraffy/ens-normalize@1.9.4: resolution: {integrity: sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw==} + dev: true /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} @@ -1014,6 +994,7 @@ packages: ajv-formats: 2.1.1(ajv@8.12.0) fast-deep-equal: 3.1.3 rfdc: 1.3.0 + dev: false /@ardatan/relay-compiler@12.0.0(graphql@16.8.1): resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} @@ -1042,6 +1023,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@ardatan/sync-fetch@0.0.1: resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==} @@ -1050,6 +1032,7 @@ packages: node-fetch: 2.7.0 transitivePeerDependencies: - encoding + dev: false /@assemblyscript/loader@0.9.4: resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} @@ -1122,14 +1105,14 @@ packages: dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 - '@babel/generator': 7.17.7 + '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.17.8) '@babel/helpers': 7.23.2 - '@babel/parser': 7.18.9 + '@babel/parser': 7.23.0 '@babel/template': 7.22.15 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -1165,7 +1148,7 @@ packages: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.23.0 jsesc: 2.5.2 source-map: 0.5.7 dev: true @@ -1410,7 +1393,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.23.0 dev: true /@babel/parser@7.23.0: @@ -1452,6 +1435,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} @@ -1463,6 +1447,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-proposal-export-default-from@7.22.17(@babel/core@7.23.2): resolution: {integrity: sha512-cop/3quQBVvdz6X5SJC6AhUv3C9DrVTM06LUEXimEdWAhCSyOJIr9NiZDU9leHZ0/aiG0Sh7Zmvaku5TWYNgbA==} @@ -1473,6 +1458,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} @@ -1484,6 +1470,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} @@ -1495,6 +1482,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9): resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} @@ -1521,6 +1509,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} @@ -1532,6 +1521,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.2): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} @@ -1544,6 +1534,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} @@ -1603,6 +1594,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -1620,6 +1612,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} @@ -1932,6 +1925,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) + dev: false /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} @@ -2185,6 +2179,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} @@ -2204,6 +2199,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} @@ -2213,6 +2209,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} @@ -2226,6 +2223,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) '@babel/types': 7.23.0 + dev: false /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} @@ -2272,6 +2270,7 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} @@ -2470,6 +2469,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) + dev: false /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} @@ -2521,6 +2521,7 @@ packages: make-dir: 2.1.0 pirates: 4.0.6 source-map-support: 0.5.21 + dev: false /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} @@ -2551,13 +2552,13 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/generator': 7.17.7 + '@babel/generator': 7.23.0 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.18.9 - '@babel/types': 7.17.0 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: @@ -2615,7 +2616,7 @@ packages: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} dev: false - /@celo/rainbowkit-celo@1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(wagmi@1.4.5)(zod@3.22.4): + /@celo/rainbowkit-celo@1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(wagmi@1.4.5)(zod@3.22.4): resolution: {integrity: sha512-/G4HFhJNwUk6uU1yqGfQ/LIoNg9UAA4BUcEvFdd0M3DImnKlhodNLUdCmzqv96sjc/I7tMJqBeTnmbhwXdlsjQ==} peerDependencies: '@rainbow-me/rainbowkit': '>=1.0.2 && <=2.0.0' @@ -2623,10 +2624,10 @@ packages: wagmi: '>=1.0.0 && <=2.0.0' dependencies: '@metamask/providers': 11.1.2 - '@rainbow-me/rainbowkit': 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.9)(wagmi@1.4.5) - '@wagmi/connectors': 2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) + '@rainbow-me/rainbowkit': 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.5) + '@wagmi/connectors': 2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@wagmi/chains' @@ -4175,6 +4176,7 @@ packages: dependencies: '@envelop/types': 3.0.2 tslib: 2.6.2 + dev: false /@envelop/core@5.0.0: resolution: {integrity: sha512-aJdnH/ptv+cvwfvciCBe7TSvccBwo9g0S5f6u35TBVzRVqIGkK03lFlIL+x1cnfZgN9EfR2b1PH2galrT1CdCQ==} @@ -4194,6 +4196,7 @@ packages: '@graphql-tools/utils': 8.13.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@envelop/extended-validation@4.0.0(@envelop/core@5.0.0)(graphql@16.8.1): resolution: {integrity: sha512-pvJ/OL+C+lpNiiCXezHT+vP3PTq37MQicoOB1l5MdgOOZZWRAp0NDOgvEKcXUY7AWNpvNHgSE0QFSRfGwsfwFQ==} @@ -4226,6 +4229,7 @@ packages: resolution: {integrity: sha512-pOFea9ha0EkURWxJ/35axoH9fDGP5S2cUu/5Mmo9pb8zUf+TaEot8vB670XXihFEn/92759BMjLJNWBKmNhyng==} dependencies: tslib: 2.6.2 + dev: false /@envelop/types@5.0.0: resolution: {integrity: sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA==} @@ -4245,6 +4249,7 @@ packages: hash-it: 6.0.0 lru-cache: 6.0.0 tslib: 2.6.2 + dev: false /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): resolution: {integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==} @@ -5322,7 +5327,7 @@ packages: /@ethereumjs/tx@3.4.0: resolution: {integrity: sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==} dependencies: - '@ethereumjs/common': 2.6.0 + '@ethereumjs/common': 2.6.5 ethereumjs-util: 7.1.5 dev: true @@ -5347,8 +5352,8 @@ packages: dependencies: '@ethereumjs/block': 3.6.3 '@ethereumjs/blockchain': 5.5.3 - '@ethereumjs/common': 2.6.0 - '@ethereumjs/tx': 3.4.0 + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 async-eventemitter: 0.2.4 core-js-pure: 3.33.1 debug: 2.6.9 @@ -5671,6 +5676,7 @@ packages: /@fastify/deepmerge@1.3.0: resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + dev: false /@float-capital/float-subgraph-uncrashable@0.0.0-internal-testing.5: resolution: {integrity: sha512-yZ0H5e3EpAYKokX/AbtplzlvSxEJY7ZfpvQyDzyODkks0hakAAlDG6fQu1SlDJMWorY7bbq1j7fCiFeTWci6TA==} @@ -5777,6 +5783,24 @@ packages: '@trufflesuite/bigint-buffer': 1.1.9 dev: true + /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} + peerDependencies: + '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 + '@graphql-tools/delegate': ^9.0.32 + '@graphql-tools/utils': ^9.2.1 + '@graphql-tools/wrap': ^9.4.2 + graphql: ^15.2.0 || ^16.0.0 + dependencies: + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) + graphql: 16.8.1 + lodash: 4.17.21 + tslib: 2.6.2 + dev: false + /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} peerDependencies: @@ -5795,7 +5819,7 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-add-source-name@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): + /@graphprotocol/client-add-source-name@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): resolution: {integrity: sha512-3vX8mVPIEJFwAoRhjTPd9IjQrBuE+Gv+JB7IEf8/9222qiU9EzHVFUekKxVtcxQXD40CfageS41CxOreWQ1enA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5805,15 +5829,16 @@ packages: '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) graphql: 16.8.1 lodash: 4.17.21 tslib: 2.6.2 + dev: false - /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): + /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-p8eEyeBcqxCXLxC7CNgIhLSCd7bjiKToKnrwYPShVb26gIG2JdAmD3/mpjuR+QaMA4chN/EO5t+TGvq6KnFx9g==} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 @@ -5822,7 +5847,7 @@ packages: '@graphql-tools/wrap': ^9.4.2 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) @@ -5831,7 +5856,7 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-auto-pagination@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): + /@graphprotocol/client-auto-pagination@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): resolution: {integrity: sha512-TouHgs6rQLpZSgnMoPdes8/ZTtMMEoxWeUUCkfho/xfSi49prb5DcsI83pykln0OEAUnNPnaX0MhP+xA5LtFSg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5841,24 +5866,24 @@ packages: '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) graphql: 16.8.1 lodash: 4.17.21 tslib: 2.6.2 - dev: true + dev: false - /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): + /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-kpiX2s804mpP3EVL0EdJfxeHWBTdg6SglIyEvSZ5T1OWyGDeMhr19D+gVIAlo22/PiBUkBDd0JfqppLsliPZ1A==} peerDependencies: '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 '@graphql-tools/delegate': ^9.0.32 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -5866,7 +5891,7 @@ packages: - '@graphql-mesh/utils' dev: false - /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): + /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): resolution: {integrity: sha512-mxqXKHK2lO+k4r02Q44n3qhd5dufo+SSDduD8zGUDBsYcRQAtQD9PwmXRHyUoB9nw4A+NC+CtVh+76fueXCG1w==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5874,14 +5899,14 @@ packages: '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: - '@graphql-mesh/utils' - dev: true + dev: false /@graphprotocol/client-block-tracking@1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-Eim0fZ0AgukHt5770j/UYDxfrqJroOhDe8FfNKKN7mDVRoMBoCsNknH47i03fh4A/kE8R+J6Job/zEJZPTtKnQ==} @@ -5906,21 +5931,21 @@ packages: '@graphql-tools/utils': 10.0.7(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 - dev: true + dev: false - /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-PIi8rFibYZVup+0jb08399RmbGF1ZrqUe6RXzLtKZBT57OWIMWwsFvdJyUAdr8Y8f0rrMn6A+Oy4nP1lf3hc1g==} hasBin: true peerDependencies: graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) + '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-polling-live': 1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -5946,20 +5971,20 @@ packages: - utf-8-validate dev: false - /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-hTISbOzKavlDifBNsR6JqQMfdYwY7++hflPy+c3WHRrZ4OMoxFmW7ZuvaP6LvgKdJV77O8w9dnT/uxeHs6a90g==} engines: {node: '>=16.0.0'} hasBin: true peerDependencies: graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) - '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) + '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) + '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 2.0.0(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -5983,7 +6008,7 @@ packages: - react-native-windows - supports-color - utf-8-validate - dev: true + dev: false /@graphprotocol/client-polling-live@1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1): resolution: {integrity: sha512-/XKnXNTts1VCUqwN2TCuPzQBfMGusL8vtamACKUeX65WxVy/H/Wjpcxq+w/XbyqNsQdG5QOoxY+AS/vKMhUcDQ==} @@ -6027,6 +6052,7 @@ packages: '@repeaterjs/repeater': 3.0.4 graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphprotocol/graph-cli@0.60.0(@types/node@18.18.7)(node-fetch@3.3.2)(typescript@4.9.5): resolution: {integrity: sha512-8tGaQJ0EzAPtkDXCAijFGoVdJXM+pKFlGxjiU31TdG5bS4cIUoSB6yWojVsFFod0yETAwf+giel/0/8sudYsDw==} @@ -6089,6 +6115,7 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.5.3 + dev: false /@graphql-codegen/plugin-helpers@2.7.2(graphql@16.8.1): resolution: {integrity: sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==} @@ -6102,6 +6129,7 @@ packages: import-from: 4.0.0 lodash: 4.17.21 tslib: 2.4.1 + dev: false /@graphql-codegen/plugin-helpers@3.1.2(graphql@16.8.1): resolution: {integrity: sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==} @@ -6115,6 +6143,7 @@ packages: import-from: 4.0.0 lodash: 4.17.21 tslib: 2.4.1 + dev: false /@graphql-codegen/plugin-helpers@4.2.0(graphql@16.8.1): resolution: {integrity: sha512-THFTCfg+46PXlXobYJ/OoCX6pzjI+9woQqCjdyKtgoI0tn3Xq2HUUCiidndxUpEYVrXb5pRiRXb7b/ZbMQqD0A==} @@ -6128,6 +6157,7 @@ packages: import-from: 4.0.0 lodash: 4.17.21 tslib: 2.5.3 + dev: false /@graphql-codegen/schema-ast@3.0.1(graphql@16.8.1): resolution: {integrity: sha512-rTKTi4XiW4QFZnrEqetpiYEWVsOFNoiR/v3rY9mFSttXFbIwNXPme32EspTiGWmEEdHY8UuTDtZN3vEcs/31zw==} @@ -6138,6 +6168,7 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.5.3 + dev: false /@graphql-codegen/typed-document-node@4.0.1(graphql@16.8.1): resolution: {integrity: sha512-mQNYCd12JsFSaK6xLry4olY9TdYG7GxQPexU6qU4Om++eKhseGwk2eGmQDRG4Qp8jEDFLMXuHMVUKqMQ1M+F/A==} @@ -6153,6 +6184,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/typescript-generic-sdk@3.1.0(graphql-tag@2.12.6)(graphql@16.8.1): resolution: {integrity: sha512-nQZi/YGRI1+qCZZsh0V5nz6+hCHSN4OU9tKyOTDsEPyDFnGEukDuRdCH2IZasGn22a3Iu5TUDkgp5w9wEQwGmg==} @@ -6169,6 +6201,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/typescript-operations@3.0.4(graphql@16.8.1): resolution: {integrity: sha512-6yE2OL2+WJ1vd5MwFEGXpaxsFGzjAGUytPVHDML3Bi3TwP1F3lnQlIko4untwvHW0JhZEGQ7Ck30H9HjcxpdKA==} @@ -6184,6 +6217,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/typescript-resolvers@3.2.1(graphql@16.8.1): resolution: {integrity: sha512-2ZIHk5J6HTuylse5ZIxw+aega54prHxvj7vM8hiKJ6vejZ94kvVPAq4aWmSFOkZ5lqU3YnM/ZyWfnhT5CUDj1g==} @@ -6200,6 +6234,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/typescript@3.0.4(graphql@16.8.1): resolution: {integrity: sha512-x4O47447DZrWNtE/l5CU9QzzW4m1RbmCEdijlA3s2flG/y1Ckqdemob4CWfilSm5/tZ3w1junVDY616RDTSvZw==} @@ -6215,6 +6250,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/visitor-plugin-common@2.13.1(graphql@16.8.1): resolution: {integrity: sha512-mD9ufZhDGhyrSaWQGrU1Q1c5f01TeWtSWy/cDwXYjJcHIj1Y/DG2x0tOflEfCvh5WcnmHNIw4lzDsg1W7iFJEg==} @@ -6235,6 +6271,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-codegen/visitor-plugin-common@3.1.1(graphql@16.8.1): resolution: {integrity: sha512-uAfp+zu/009R3HUAuTK2AamR1bxIltM6rrYYI6EXSmkM3rFtFsLTuJhjUDj98HcUCszJZrADppz8KKLGRUVlNg==} @@ -6255,6 +6292,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-inspector/core@3.3.0(graphql@16.8.1): resolution: {integrity: sha512-LRtk9sHgj9qqVPIkkThAVq3iZ7QxgHCx6elEwd0eesZBCmaIYQxD/BFu+VT8jr10YfOURBZuAnVdyGu64vYpBg==} @@ -6265,6 +6303,7 @@ packages: graphql: 16.8.1 object-inspect: 1.10.3 tslib: 2.6.2 + dev: false /@graphql-inspector/core@5.0.1(graphql@16.8.1): resolution: {integrity: sha512-1CWfFYucnRdULGiN1NDSinlNlpucBT+0x4i4AIthKe5n5jD9RIVyJtkA8zBbujUFrP++YE3l+TQifwbN1yTQsw==} @@ -6276,6 +6315,7 @@ packages: graphql: 16.8.1 object-inspect: 1.12.3 tslib: 2.6.0 + dev: false /@graphql-mesh/cache-localforage@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-cY/LJ+XC8kiyPoLxqPAMlOAvaeB81CZafdadLNyNDFuu66qDiZqWTYPw/lnhp2nyeukC8o/P69oP7d2OqVaCZA==} @@ -6290,6 +6330,7 @@ packages: graphql: 16.8.1 localforage: 1.10.0 tslib: 2.6.2 + dev: false /@graphql-mesh/cache-localforage@0.95.8(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-PgCTHh1dLwjmusWEWAMQkglL7gR8VyyT9pzTcYBVFhGYNXysepCrl85QtaqtEMnR/YijgpCWaKGIYK+bosQZsg==} @@ -6307,7 +6348,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/cache-localforage@0.96.0(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/cache-localforage@0.96.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-/6t3pQD9on2coxbUU5cIcW0EKzgB18SaHy24jADngLg5epF6aFAsu65riH8xa7WghmifBqN5EPC+SpTaeojBrw==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6316,8 +6357,8 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 localforage: 1.10.0 tslib: 2.6.2 @@ -6375,6 +6416,7 @@ packages: - react-native-windows - supports-color - utf-8-validate + dev: false /@graphql-mesh/config@0.93.1(@babel/core@7.23.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-g4omjuBBVPtyhEDeEa6uwfSSvUehV3zcwZVNbk+UJuFJEYPO4yBLsxfEZBpoeO6EriiPX2WnQyn5kiHbC3YTRA==} @@ -6410,6 +6452,7 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color + dev: false /@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-jseNppSNEwNWjcjDDwsxmRBK+ub8tz2qc/ca2ZfCTebuCk/+D3dI3LJ95ceNFOIhInK0g2HVq8BO8lMMX1pQtg==} @@ -6425,6 +6468,7 @@ packages: transitivePeerDependencies: - react-native - react-native-windows + dev: false /@graphql-mesh/cross-helpers@0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1): resolution: {integrity: sha512-NkLzFuY72tmmKO7gKWoDzoYcRVf3lLoCdlw30fSNKFKEWDAV3Tyh4v0fPvU3SEmoTJio7v0TIYZqtVt3dBBDFw==} @@ -6436,8 +6480,9 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 path-browserify: 1.0.1 + dev: false - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6449,10 +6494,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6467,7 +6512,7 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6479,10 +6524,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6495,7 +6540,7 @@ packages: - bufferutil - encoding - utf-8-validate - dev: true + dev: false /@graphql-mesh/graphql@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): resolution: {integrity: sha512-mEbz2XYSgRTdNidUBWB7FT3QzLliJwxJIoqipSbZNputJqSbUZZ6QD/oI1IrdPXqVl/ELE2CuLiogkOSO24C1Q==} @@ -6532,7 +6577,7 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): + /@graphql-mesh/graphql@0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): resolution: {integrity: sha512-jdPIFV/FXkGyKm8Buv+vpHt1Af0lt6+gpumwIlGb+h5JUwLZRkysHiXiUIFbFHVUn/cuoUGleKeewE9cBLwqVQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6545,10 +6590,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/federation': 1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) @@ -6585,6 +6630,28 @@ packages: graphql: 16.8.1 graphql-yoga: 3.9.1(graphql@16.8.1) tslib: 2.6.2 + dev: false + + /@graphql-mesh/http@0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-38Mxw2K2RABBBO0IiXKZDu2o+jlM4vcUSEg+9h2Dz67oOJZHpKeId6z1PFb7uYMzAs29yoMcqXIEnews+HVhrQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.4.1 + '@graphql-mesh/runtime': ^0.96.13 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@whatwg-node/server': 0.9.16 + graphql: 16.8.1 + graphql-yoga: 5.0.0(graphql@16.8.1) + tslib: 2.6.2 + dev: false /@graphql-mesh/http@0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-38Mxw2K2RABBBO0IiXKZDu2o+jlM4vcUSEg+9h2Dz67oOJZHpKeId6z1PFb7uYMzAs29yoMcqXIEnews+HVhrQ==} @@ -6625,6 +6692,28 @@ packages: tslib: 2.6.2 transitivePeerDependencies: - '@graphql-mesh/store' + dev: false + + /@graphql-mesh/merger-bare@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-E5R8Sv5Dkp+eswYKEDHgu8puwSeolPX1j9IHwBVe1npRRCXc3CjMsQJ9+kcTln453vbSBcM1a3fQspIaKA1Tcg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/merger-stitching': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@graphql-mesh/store' + dev: false /@graphql-mesh/merger-bare@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-E5R8Sv5Dkp+eswYKEDHgu8puwSeolPX1j9IHwBVe1npRRCXc3CjMsQJ9+kcTln453vbSBcM1a3fQspIaKA1Tcg==} @@ -6667,6 +6756,29 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false + + /@graphql-mesh/merger-stitching@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-eAukU8AsjK8jIT3vFhalGoERh98xZgzKkTCQL7w2wPpFXveSDMn+9fVvCJ1EBKTsLa7SkNXqzAFkfYp21hW0ng==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@graphql-mesh/store': ^0.95.8 + '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/utils': ^0.95.8 + '@graphql-tools/utils': ^9.2.1 || ^10.0.0 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false /@graphql-mesh/merger-stitching@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eAukU8AsjK8jIT3vFhalGoERh98xZgzKkTCQL7w2wPpFXveSDMn+9fVvCJ1EBKTsLa7SkNXqzAFkfYp21hW0ng==} @@ -6714,8 +6826,9 @@ packages: '@whatwg-node/fetch': 0.8.8 graphql: 16.8.1 tslib: 2.6.2 + dev: false - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6729,10 +6842,10 @@ packages: '@envelop/core': 5.0.0 '@envelop/extended-validation': 4.0.0(@envelop/core@5.0.0)(graphql@16.8.1) '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -6790,8 +6903,9 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false - /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6803,9 +6917,9 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-inspector/core': 5.0.1(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -6829,6 +6943,7 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-mesh/string-interpolation@0.4.4(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-IotswBYZRaPswOebcr2wuOFuzD3dHIJxVEkPiiQubqjUIR8HhQI22XHJv0WNiQZ65z8NR9+GYWwEDIc2JRCNfQ==} @@ -6841,6 +6956,7 @@ packages: json-pointer: 0.6.2 lodash.get: 4.4.2 tslib: 2.6.2 + dev: false /@graphql-mesh/string-interpolation@0.5.3(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-/R4kj3M1uqUie/7RZ58zgRrT8RBrDsCCR6ii00s62DbLsl+jZYOZFyTqHGsFbP7L7aHnl0fo1dwhEJIs+rjCLg==} @@ -6854,8 +6970,9 @@ packages: json-pointer: 0.6.2 lodash.get: 4.4.2 tslib: 2.6.2 + dev: false - /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} peerDependencies: '@graphql-mesh/types': ^0.93.1 @@ -6863,12 +6980,29 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false + + /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} + peerDependencies: + '@graphql-mesh/types': ^0.93.1 + '@graphql-mesh/utils': ^0.93.1 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} @@ -6885,6 +7019,24 @@ packages: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false + + /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} + peerDependencies: + '@graphql-mesh/store': ^0.93.1 + '@graphql-tools/utils': ^9.2.1 + graphql: '*' + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/batch-delegate': 8.4.27(graphql@16.8.1) + '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false /@graphql-mesh/types@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-H2xh5KGc3+Ly3VdAPnRdKTibZpW9zEFgUzsozL9MQhCs6WLX+/kOADb0uIDqYFKX5c/2axmcy87BFNOausXYig==} @@ -6902,6 +7054,7 @@ packages: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-mesh/utils@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-U+VytfSoqPofH/pmYZHFY10SkIFtHKrvE7Isxv1d0DiweVjdH3Qtojw13DWFpu/EKtgJY5bqoVnlcsZJYlKQoA==} @@ -6924,8 +7077,9 @@ packages: lodash.topath: 4.5.2 tiny-lru: 8.0.2 tslib: 2.6.2 + dev: false - /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6935,9 +7089,9 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@whatwg-node/fetch': 0.9.14 @@ -6948,6 +7102,7 @@ packages: lodash.topath: 4.5.2 tiny-lru: 11.2.3 tslib: 2.6.2 + dev: false /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} @@ -6972,6 +7127,7 @@ packages: lodash.topath: 4.5.2 tiny-lru: 11.2.3 tslib: 2.6.2 + dev: false /@graphql-tools/batch-delegate@8.4.27(graphql@16.8.1): resolution: {integrity: sha512-efgDDJhljma9d3Ky/LswIu1xm/if2oS27XA1sOcxcShW+Ze+Qxi0hZZ6iyI4eQxVDX5Lyy/n+NvQEZAK1riqnQ==} @@ -6984,6 +7140,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/batch-delegate@9.0.0(graphql@16.8.1): resolution: {integrity: sha512-23NmxcHQeKcfhMQyrRPTZfW4/+bSpAyR/qAhRjx+/hikDIa1Uv2XVgV9jIitSgM0OEk/KGPB4VQv+LCOWvAYiw==} @@ -6997,6 +7154,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/batch-execute@8.5.22(graphql@16.8.1): resolution: {integrity: sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A==} @@ -7008,6 +7166,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/batch-execute@9.0.2(graphql@16.8.1): resolution: {integrity: sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ==} @@ -7020,6 +7179,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/code-file-loader@7.3.23(@babel/core@7.23.2)(graphql@16.8.1): resolution: {integrity: sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==} @@ -7035,6 +7195,7 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color + dev: false /@graphql-tools/delegate@10.0.3(graphql@16.8.1): resolution: {integrity: sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw==} @@ -7049,6 +7210,7 @@ packages: dataloader: 2.2.2 graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/delegate@9.0.35(graphql@16.8.1): resolution: {integrity: sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA==} @@ -7063,6 +7225,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/executor-graphql-ws@0.0.14(graphql@16.8.1): resolution: {integrity: sha512-P2nlkAsPZKLIXImFhj0YTtny5NQVGSsKnhi7PzXiaHSXc6KkzqbWZHKvikD4PObanqg+7IO58rKFpGXP7eeO+w==} @@ -7080,6 +7243,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /@graphql-tools/executor-graphql-ws@1.1.0(graphql@16.8.1): resolution: {integrity: sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg==} @@ -7115,6 +7279,7 @@ packages: value-or-promise: 1.0.12 transitivePeerDependencies: - '@types/node' + dev: false /@graphql-tools/executor-http@1.0.3(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-5WZIMBevRaxMabZ8U2Ty0dTUPy/PpeYSlMNEmC/YJjKKykgSfc/AwSejx2sE4FFKZ0I2kxRKRenyoWMHRAV49Q==} @@ -7148,6 +7313,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /@graphql-tools/executor-legacy-ws@1.0.4(graphql@16.8.1): resolution: {integrity: sha512-b7aGuRekZDS+m3af3BIvMKxu15bmVPMt5eGQVuP2v5pxmbaPTh+iv5mx9b3Plt32z5Ke5tycBnNm5urSFtW8ng==} @@ -7177,6 +7343,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/executor@0.0.20(graphql@16.8.1): resolution: {integrity: sha512-GdvNc4vszmfeGvUqlcaH1FjBoguvMYzxAfT6tDd4/LgwymepHhinqLNA5otqwVLW+JETcDaK7xGENzFomuE6TA==} @@ -7189,6 +7356,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/executor@1.2.0(graphql@16.8.1): resolution: {integrity: sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==} @@ -7202,6 +7370,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/federation@1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-H51qTYwbtfIYBO1uHXlImRWzo9tknSoIGBgJckDh+hdxJx43sZaMjJiLHc2DjRc/A8d2Bf0bi0HbH++HqOos/w==} @@ -7240,6 +7409,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 unixify: 1.0.0 + dev: false /@graphql-tools/graphql-tag-pluck@7.5.2(@babel/core@7.23.2)(graphql@16.8.1): resolution: {integrity: sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==} @@ -7256,6 +7426,7 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color + dev: false /@graphql-tools/import@6.7.18(graphql@16.8.1): resolution: {integrity: sha512-XQDdyZTp+FYmT7as3xRWH/x8dx0QZA2WZqfMF5EWb36a0PiH7WwlRQYIdyYXj8YCLpiWkeBXgBRHmMnwEYR8iQ==} @@ -7266,6 +7437,7 @@ packages: graphql: 16.8.1 resolve-from: 5.0.0 tslib: 2.6.2 + dev: false /@graphql-tools/load@7.8.14(graphql@16.8.1): resolution: {integrity: sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==} @@ -7277,6 +7449,7 @@ packages: graphql: 16.8.1 p-limit: 3.1.0 tslib: 2.6.2 + dev: false /@graphql-tools/merge@8.4.2(graphql@16.8.1): resolution: {integrity: sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==} @@ -7286,6 +7459,7 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/merge@9.0.0(graphql@16.8.1): resolution: {integrity: sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==} @@ -7296,6 +7470,7 @@ packages: '@graphql-tools/utils': 10.0.7(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/optimize@1.4.0(graphql@16.8.1): resolution: {integrity: sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==} @@ -7304,6 +7479,7 @@ packages: dependencies: graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/relay-operation-optimizer@6.5.18(graphql@16.8.1): resolution: {integrity: sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==} @@ -7317,6 +7493,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: false /@graphql-tools/schema@10.0.0(graphql@16.8.1): resolution: {integrity: sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg==} @@ -7329,6 +7506,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/schema@9.0.19(graphql@16.8.1): resolution: {integrity: sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==} @@ -7340,6 +7518,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/stitch@8.7.50(graphql@16.8.1): resolution: {integrity: sha512-VB1/uZyXjj1P5Wj0c4EKX3q8Q1Maj4dy6uNwodEPaO3EHMpaJU/DqyN0Bvnhxu0ol7RzdY3kgsvsdUjU2QMImw==} @@ -7356,6 +7535,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/stitch@9.0.3(graphql@16.8.1): resolution: {integrity: sha512-G03XahiHDu1pnaS8z2GNfsV/5BribMEUATT5dCHBAqj13Te5y1amZNQePrmw8DLtbf5qDbU6CO7kGHPxv0XO9A==} @@ -7384,6 +7564,7 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/url-loader@7.17.18(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-ear0CiyTj04jCVAxi7TvgbnGDIN2HgqzXzwsfcqiVg9cvjT40NcMlZ2P1lZDgqMkZ9oyLTV8Bw6j+SyG6A+xPw==} @@ -7409,6 +7590,7 @@ packages: - bufferutil - encoding - utf-8-validate + dev: false /@graphql-tools/url-loader@8.0.0(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA==} @@ -7447,6 +7629,7 @@ packages: dset: 3.1.3 graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/utils@8.13.1(graphql@16.8.1): resolution: {integrity: sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==} @@ -7455,6 +7638,7 @@ packages: dependencies: graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/utils@9.2.1(graphql@16.8.1): resolution: {integrity: sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==} @@ -7464,6 +7648,7 @@ packages: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: false /@graphql-tools/wrap@10.0.1(graphql@16.8.1): resolution: {integrity: sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg==} @@ -7477,6 +7662,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-tools/wrap@9.4.2(graphql@16.8.1): resolution: {integrity: sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA==} @@ -7489,6 +7675,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: false /@graphql-typed-document-node/core@3.2.0(graphql@16.8.1): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} @@ -7496,11 +7683,13 @@ packages: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: graphql: 16.8.1 + dev: false /@graphql-yoga/logger@0.0.1: resolution: {integrity: sha512-6npFz7eZz33mXgSm1waBLMjUNG0D5hTc/p5Hcs1mojkT3KsLpCOFokzTEKboNsBhKevYcaVa/xeA7WBj4UYMLg==} dependencies: tslib: 2.6.2 + dev: false /@graphql-yoga/logger@2.0.0: resolution: {integrity: sha512-Mg8psdkAp+YTG1OGmvU+xa6xpsAmSir0hhr3yFYPyLNwzUj95DdIwsMpKadDj9xDpYgJcH3Hp/4JMal9DhQimA==} @@ -7516,6 +7705,7 @@ packages: '@repeaterjs/repeater': 3.0.4 '@whatwg-node/events': 0.0.2 tslib: 2.6.2 + dev: false /@graphql-yoga/subscription@5.0.0: resolution: {integrity: sha512-Ri7sK8hmxd/kwaEa0YT8uqQUb2wOLsmBMxI90QDyf96lzOMJRgBuNYoEkU1pSgsgmW2glceZ96sRYfaXqwVxUw==} @@ -7532,6 +7722,7 @@ packages: dependencies: '@repeaterjs/repeater': 3.0.4 tslib: 2.6.2 + dev: false /@graphql-yoga/typed-event-target@3.0.0: resolution: {integrity: sha512-w+liuBySifrstuHbFrHoHAEyVnDFVib+073q8AeAJ/qqJfvFvAwUPLLtNohR/WDVRgSasfXtl3dcNuVJWN+rjg==} @@ -7585,7 +7776,7 @@ packages: resolution: {integrity: sha512-n6fwMsaoR50VITM2upR4OOi4EZJmZvU6vvXrHWCSakP9e1OeDuAOk+kHiK+egqDRYj6uKtg9VTUFKZBYvu3jRg==} dev: false - /@hypercerts-org/contracts@1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6): + /@hypercerts-org/contracts@1.0.0-alpha.2(typescript@5.1.6): resolution: {integrity: sha512-I9TMEyN4cKW3Gfv3Wysk9xoZzwpUjI+dgCECJVjBlInRiCxnaUdahBSqhVvKg1gViWaPMDvDGe5v9jVknZIN/A==} dependencies: hardhat: 2.18.3(ts-node@10.9.1)(typescript@5.1.6) @@ -7597,6 +7788,18 @@ packages: - utf-8-validate dev: false + /@hypercerts-org/contracts@1.0.0-alpha.6(ts-node@10.9.1)(typescript@5.1.6): + resolution: {integrity: sha512-8XV9jlj5P+WL+hFX56OP+cYpLDwicZoGteN3ZAPHc1Y07fy7I2tpx1/MU7Sg2GX2nVO46Xix1MblQxVzx0Xy8Q==} + dependencies: + hardhat: 2.18.3(ts-node@10.9.1)(typescript@5.1.6) + transitivePeerDependencies: + - bufferutil + - supports-color + - ts-node + - typescript + - utf-8-validate + dev: false + /@hypercerts-org/sdk@1.0.0-alpha.10(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4): resolution: {integrity: sha512-PEGKxzxhGZuz0cjYCCj90+bBmbfU4n1mP+q911Kx6jZ0g5sQyj+m685x0cq8OIL4JnYNPShZ2OWDjcX93KzbBA==} dependencies: @@ -7609,12 +7812,12 @@ packages: '@graphql-mesh/graphql': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@hypercerts-org/contracts': 1.0.0-alpha.2(ts-node@10.9.1)(typescript@5.1.6) + '@hypercerts-org/contracts': 1.0.0-alpha.2(typescript@5.1.6) '@openzeppelin/merkle-tree': 1.0.5 '@whatwg-node/fetch': 0.9.14 ajv: 8.12.0 @@ -7626,7 +7829,7 @@ packages: loglevel: 1.8.1 mime: 3.0.0 nft.storage: 7.1.1(node-fetch@3.3.2) - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) web3.storage: 4.5.5(node-fetch@3.3.2) transitivePeerDependencies: - '@envelop/core' @@ -7769,7 +7972,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core@29.7.0(ts-node@10.9.1): + /@jest/core@29.7.0: resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7790,7 +7993,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.7) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -7817,6 +8020,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 + dev: false /@jest/environment@29.7.0: resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} @@ -7981,6 +8185,7 @@ packages: '@types/node': 18.18.7 '@types/yargs': 16.0.7 chalk: 4.1.2 + dev: false /@jest/types@29.6.3: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} @@ -10286,15 +10491,6 @@ packages: - encoding dev: true - /@openzeppelin/defender-sdk-base-client@1.3.0: - resolution: {integrity: sha512-OMMt7NaAL8C95ralF9nMeKZpg96COLZT9FPpGpPsI7aB8fVZfCM8+6k99gTF44hMS6IsRdN2WthS3m7VzQeeoA==} - dependencies: - amazon-cognito-identity-js: 6.3.6 - async-retry: 1.3.3 - transitivePeerDependencies: - - encoding - dev: true - /@openzeppelin/defender-sdk-base-client@1.4.0: resolution: {integrity: sha512-aBDQpA4+ayFyx/2hQFRrBJqo6pKcF3eVbztjq49cHdg+cAQgM56Dy333Bp2z4bHzx1IbzmYcvhlhBH2LBnsdzg==} dependencies: @@ -10304,19 +10500,7 @@ packages: - encoding dev: true - /@openzeppelin/defender-sdk-deploy-client@1.3.0(debug@4.3.4): - resolution: {integrity: sha512-RTYM3HnVvD2d5NoYfTug8UwT41e0Jjwb13lk9v0Jl8z7mcclUVvAnKD4DHJ4b8RhKpg4B15oLQK/Igzjg1HHRA==} - dependencies: - '@ethersproject/abi': 5.7.0 - '@openzeppelin/defender-sdk-base-client': 1.3.0 - axios: 1.5.1(debug@4.3.4) - lodash: 4.17.21 - transitivePeerDependencies: - - debug - - encoding - dev: true - - /@openzeppelin/defender-sdk-deploy-client@1.4.0: + /@openzeppelin/defender-sdk-deploy-client@1.4.0(debug@4.3.4): resolution: {integrity: sha512-uXsGKXhH0P4xRBD0WvR8eo830sFd2jbES2Uf7nQnd8jGK5wxUgCLGgfrRXFznEzAbXA3xs+a5IGcmHwbL9MxyQ==} dependencies: '@ethersproject/abi': 5.7.0 @@ -10434,7 +10618,7 @@ packages: '@openzeppelin/defender-sdk-account-client': 1.4.0 '@openzeppelin/defender-sdk-action-client': 1.4.0 '@openzeppelin/defender-sdk-base-client': 1.4.0 - '@openzeppelin/defender-sdk-deploy-client': 1.4.0 + '@openzeppelin/defender-sdk-deploy-client': 1.4.0(debug@4.3.4) '@openzeppelin/defender-sdk-monitor-client': 1.4.0 '@openzeppelin/defender-sdk-network-client': 1.4.0 '@openzeppelin/defender-sdk-notification-channel-client': 1.4.0 @@ -10486,8 +10670,8 @@ packages: '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.18.3) '@openzeppelin/defender-admin-client': 1.50.0(debug@4.3.4) '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4) - '@openzeppelin/defender-sdk-base-client': 1.3.0 - '@openzeppelin/defender-sdk-deploy-client': 1.3.0(debug@4.3.4) + '@openzeppelin/defender-sdk-base-client': 1.4.0 + '@openzeppelin/defender-sdk-deploy-client': 1.4.0(debug@4.3.4) '@openzeppelin/upgrades-core': 1.31.0 chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) @@ -10555,8 +10739,8 @@ packages: requiresBuild: true optional: true - /@plasmicapp/data-sources-context@0.1.17(react@18.2.0): - resolution: {integrity: sha512-vCAcgcxT6+MOn+rGlVszGDHPqBTGszzNZ4FuwXkX5RjN4W7VG8Vep6qpZC2KUZI0KpjGmGq3uLkeK4BcvciRzA==} + /@plasmicapp/data-sources-context@0.1.20(react@18.2.0): + resolution: {integrity: sha512-r+156StkG37WSXTGQSoihYjGLyKu1re+/ziD7GcPpP0VIHXtiUYC4XBINQa9jVer4hYZ54GItOdvUAZsxgCP/g==} engines: {node: '>=10'} peerDependencies: react: '>=16.8.0' @@ -10577,46 +10761,59 @@ packages: window-or-global: 1.0.1 dev: false + /@plasmicapp/host@1.0.185(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Eka3J1gFID3d2E818asFp3PUizG3JQyaFc1y53BmhM0r+OGdlJUvKAof2zPXf6sDHdYJV77OhdBtbgE8ebBMqA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@plasmicapp/query': 0.1.77(react@18.2.0) + csstype: 3.1.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + window-or-global: 1.0.1 + dev: false + /@plasmicapp/isomorphic-unfetch@1.0.3: resolution: {integrity: sha512-cJtPOCf2/FWlFB42Q/n0MK/C47NSZr+YQJbCvQwvyjOrOgOQ4gJ/+gkr4avpMa7UPMa8qLovDAuaR+5k+hMlZQ==} dependencies: unfetch: 4.2.0 dev: false - /@plasmicapp/loader-core@1.0.115: - resolution: {integrity: sha512-Ip/I4kuBFnsOB7DrCTrkhOCfSCGYknDTH83qiWpbQdYwCxWCHUsCtY3P3j9K8U4NYjFgy3OL4d0EkAtOvoBCTw==} + /@plasmicapp/loader-core@1.0.121: + resolution: {integrity: sha512-BOJkCGYNQ8aKXSdHA7+SKTq0BfsIjdB86Xwi9ugEqwh/9PFGXdadlM758Pwo62FL2h4kkelkUqPBsOnYJvgBTA==} engines: {node: '>=10'} dependencies: '@plasmicapp/isomorphic-unfetch': 1.0.3 - '@plasmicapp/loader-fetcher': 1.0.37 + '@plasmicapp/loader-fetcher': 1.0.43 dev: false - /@plasmicapp/loader-edge@1.0.46: - resolution: {integrity: sha512-r3PA6ARF3EDWma5kwHOgPu/meed7hkKnkDp2aUWiHQKe7X0eRDWXpId/+2uYVzh8p1sjIxiINK6P9Bv1jVuXrQ==} + /@plasmicapp/loader-edge@1.0.52: + resolution: {integrity: sha512-YqC6zNIcgScNOE+cDrhR+9gPsUtEsgNVwnIMw+Z5Xmj8TeHQDIQOEKwOX8dzlXgrb6ahycqwdk4vkbww1j56nA==} engines: {node: '>=10'} dependencies: - '@plasmicapp/loader-splits': 1.0.43 + '@plasmicapp/loader-splits': 1.0.49 dev: false - /@plasmicapp/loader-fetcher@1.0.37: - resolution: {integrity: sha512-yLrOGklV8FNeyNteumzuE99zvPVGvNTT7TuLQISMvCkisY+pg4NY6gDxSUvDut65waBH0ie/ZdG6jUtkqb0kBg==} + /@plasmicapp/loader-fetcher@1.0.43: + resolution: {integrity: sha512-WKirusqEdRcCBwqdDaAYtfpQ3Qy6wnf/T5jyr5N0mmiTXTmTLSkTMjq/zCyAiOr+u2bWauHRF3GUs2H9Bd/6nw==} engines: {node: '>=10'} dependencies: '@plasmicapp/isomorphic-unfetch': 1.0.3 dev: false - /@plasmicapp/loader-nextjs@1.0.333(next@13.5.6)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Uhkeeig9UhZQqLgH5QPuV3bd1jE4Z5ZsJgvoxmsL96XrGEuxEO2wUPLq02HQ+EgJtXuNTgbb5bSPZsVCJ/nCKQ==} + /@plasmicapp/loader-nextjs@1.0.345(next@13.5.6)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-50CGunxpvkApK4o805EOKZbN0YLasHybH0hzkDtyQ9AcDi0MuhzSpZQ0MM4zSX4vVo+6uBJ/YfcTQ4Kriw25yQ==} engines: {node: '>=10'} peerDependencies: next: '>=10.1.0' react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@plasmicapp/loader-core': 1.0.115 - '@plasmicapp/loader-edge': 1.0.46 - '@plasmicapp/loader-react': 1.0.312(react-dom@18.2.0)(react@18.2.0) - '@plasmicapp/watcher': 1.0.78 + '@plasmicapp/loader-core': 1.0.121 + '@plasmicapp/loader-edge': 1.0.52 + '@plasmicapp/loader-react': 1.0.324(react-dom@18.2.0)(react@18.2.0) + '@plasmicapp/watcher': 1.0.81 next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -10627,40 +10824,41 @@ packages: - utf-8-validate dev: false - /@plasmicapp/loader-react@1.0.312(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nUu9TJrlu5/innWFTz1rvJx4NQgm/yLNZwK27cbLufQCYzec4FBdGEr4Ywr7IMHb4OHTzJOJG3ZsEDmFjTeJ3Q==} + /@plasmicapp/loader-react@1.0.324(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wikljq+9lTdKnRw53FRyc0Qj/sJCOZl+wBQvcGFisOWYqEYsIQVPYzBKKy6bcr+ZpTbUHlVQzkG4K3zErquzBg==} engines: {node: '>=12'} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@plasmicapp/data-sources-context': 0.1.17(react@18.2.0) - '@plasmicapp/host': 1.0.177(react-dom@18.2.0)(react@18.2.0) - '@plasmicapp/loader-core': 1.0.115 - '@plasmicapp/loader-splits': 1.0.43 - '@plasmicapp/prepass': 1.0.9(react-dom@18.2.0)(react@18.2.0) - '@plasmicapp/query': 0.1.74(react@18.2.0) + '@plasmicapp/data-sources-context': 0.1.20(react@18.2.0) + '@plasmicapp/host': 1.0.185(react-dom@18.2.0)(react@18.2.0) + '@plasmicapp/loader-core': 1.0.121 + '@plasmicapp/loader-fetcher': 1.0.43 + '@plasmicapp/loader-splits': 1.0.49 + '@plasmicapp/prepass': 1.0.13(react-dom@18.2.0)(react@18.2.0) + '@plasmicapp/query': 0.1.77(react@18.2.0) pascalcase: 1.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) server-only: 0.0.1 dev: false - /@plasmicapp/loader-splits@1.0.43: - resolution: {integrity: sha512-XdSiD/N9ddD/HTjsk6EUhU0SSLFzQl0G4vlapdcHIBI9vBZRLAJQLGPIS98OJJnEK3DsE7j4kMYzKevoE/bycQ==} + /@plasmicapp/loader-splits@1.0.49: + resolution: {integrity: sha512-1L+1esk/hHBEOJo5d18aPUZwoYZEO+X6z/hx9s5I1/MdKeTXj60k++fhVr6D7j6tToofaMDO30oWyXSy9HvYRQ==} engines: {node: '>=10'} dependencies: json-logic-js: 2.0.2 dev: false - /@plasmicapp/prepass@1.0.9(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-0iG7iCD/Kf0I1Qaxw/steVPm3p2ciBPeA8Xa4i/E34gEat5qRsGl6cMi4V2EaPLWOF4cL6B+PEdtHCmZBscOGw==} + /@plasmicapp/prepass@1.0.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Kh9lwlzQnOzKtHnDtzeSiupDvEYU9T6kq+XOQZ0+OR+r+IT60T1CMmFFWQP8ae/Z+m66U6ttonQrlw4vSP0rgw==} engines: {node: '>=12'} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@plasmicapp/query': 0.1.74(react@18.2.0) + '@plasmicapp/query': 0.1.77(react@18.2.0) '@plasmicapp/react-ssr-prepass': 2.0.3(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -10676,6 +10874,16 @@ packages: swr: 1.3.0(react@18.2.0) dev: false + /@plasmicapp/query@0.1.77(react@18.2.0): + resolution: {integrity: sha512-46yTL/y1ys9erE5yDKAX7x/VSq16gNYxpAGm1HF+h0TrFoWyctvFEFsZdAGkrcqPgrp5AYHW71khYkMD1ES/5A==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + swr: 1.3.0(react@18.2.0) + dev: false + /@plasmicapp/react-ssr-prepass@2.0.3(react@18.2.0): resolution: {integrity: sha512-jFde/wfL8NlJEr76Mshyju/3GvJD5Z9YijCG1/8DR+KOEv7m5uRvORjxtEEw2GKDXRp2GqpQqj97iWGLFUsOzA==} peerDependencies: @@ -10684,8 +10892,8 @@ packages: react: 18.2.0 dev: false - /@plasmicapp/watcher@1.0.78: - resolution: {integrity: sha512-YvBtGMkI6pvqgagwP72Rr5btZ3iJsIOyInH7XsT3vDopWaQfrEm2oB4sVwxUxnsxnUZPniH/LHCwn4QJsPmdfQ==} + /@plasmicapp/watcher@1.0.81: + resolution: {integrity: sha512-rkPHPFyafxoFZm/klub2mCo0pRIIjr24shuO6/LTjPwncz3w5XxrJ4Rv/H9F+paV0+wjo43t0tBYmUmu82yRjg==} engines: {node: '>=10'} dependencies: socket.io-client: 4.7.2 @@ -10754,7 +10962,7 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - /@rainbow-me/rainbowkit@1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.18.9)(wagmi@1.4.5): + /@rainbow-me/rainbowkit@1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.5): resolution: {integrity: sha512-XjdeX31GwFdRR/1rCRqPXiO94nbq2qOlnaox5P4K/KMRIUwyelKzak27uWw8Krmor/Hcrd5FisfepGDS0tUfEA==} engines: {node: '>=12.4'} peerDependencies: @@ -10773,8 +10981,8 @@ packages: react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.4(@types/react@18.2.33)(react@18.2.0) ua-parser-js: 1.0.36 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) transitivePeerDependencies: - '@types/react' dev: false @@ -10788,6 +10996,7 @@ packages: prompts: 2.4.2 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-config@11.3.7: resolution: {integrity: sha512-FDBLku9xskS+bx0YFJFLCmUJhEZ4/MMSC9qPYOGBollWYdgE7k/TWI0IeYFmMALAnbCdKQAYP5N29N55Tad8lg==} @@ -10800,6 +11009,7 @@ packages: joi: 17.11.0 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-debugger-ui@11.3.7: resolution: {integrity: sha512-aVmKuPKHZENR8SrflkMurZqeyLwbKieHdOvaZCh1Nn/0UC5CxWcyST2DB2XQboZwsvr3/WXKJkSUO+SZ1J9qTQ==} @@ -10807,6 +11017,7 @@ packages: serve-static: 1.15.0 transitivePeerDependencies: - supports-color + dev: false /@react-native-community/cli-doctor@11.3.7: resolution: {integrity: sha512-YEHUqWISOHnsl5+NM14KHelKh68Sr5/HeEZvvNdIcvcKtZic3FU7Xd1WcbNdo3gCq5JvzGFfufx02Tabh5zmrg==} @@ -10831,6 +11042,7 @@ packages: yaml: 2.3.3 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-hermes@11.3.7: resolution: {integrity: sha512-chkKd8n/xeZkinRvtH6QcYA8rjNOKU3S3Lw/3Psxgx+hAYV0Gyk95qJHTalx7iu+PwjOOqqvCkJo5jCkYLkoqw==} @@ -10842,6 +11054,7 @@ packages: ip: 1.1.8 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-platform-android@11.3.7: resolution: {integrity: sha512-WGtXI/Rm178UQb8bu1TAeFC/RJvYGnbHpULXvE20GkmeJ1HIrMjkagyk6kkY3Ej25JAP2R878gv+TJ/XiRhaEg==} @@ -10853,6 +11066,7 @@ packages: logkitty: 0.7.1 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-platform-ios@11.3.7: resolution: {integrity: sha512-Z/8rseBput49EldX7MogvN6zJlWzZ/4M97s2P+zjS09ZoBU7I0eOKLi0N9wx+95FNBvGQQ/0P62bB9UaFQH2jw==} @@ -10865,6 +11079,7 @@ packages: ora: 5.4.1 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-plugin-metro@11.3.7(@babel/core@7.23.2): resolution: {integrity: sha512-0WhgoBVGF1f9jXcuagQmtxpwpfP+2LbLZH4qMyo6OtYLWLG13n2uRep+8tdGzfNzl1bIuUTeE9yZSAdnf9LfYQ==} @@ -10886,6 +11101,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /@react-native-community/cli-server-api@11.3.7: resolution: {integrity: sha512-yoFyGdvR3HxCnU6i9vFqKmmSqFzCbnFSnJ29a+5dppgPRetN+d//O8ard/YHqHzToFnXutAFf2neONn23qcJAg==} @@ -10904,6 +11120,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /@react-native-community/cli-tools@11.3.7: resolution: {integrity: sha512-peyhP4TV6Ps1hk+MBHTFaIR1eI3u+OfGBvr5r0wPwo3FAJvldRinMgcB/TcCcOBXVORu7ba1XYjkubPeYcqAyA==} @@ -10919,11 +11136,13 @@ packages: shell-quote: 1.8.1 transitivePeerDependencies: - encoding + dev: false /@react-native-community/cli-types@11.3.7: resolution: {integrity: sha512-OhSr/TiDQkXjL5YOs8+hvGSB+HltLn5ZI0+A3DCiMsjUgTTsYh+Z63OtyMpNjrdCEFcg0MpfdU2uxstCS6Dc5g==} dependencies: joi: 17.11.0 + dev: false /@react-native-community/cli@11.3.7(@babel/core@7.23.2): resolution: {integrity: sha512-Ou8eDlF+yh2rzXeCTpMPYJ2fuqsusNOhmpYPYNQJQ2h6PvaF30kPomflgRILems+EBBuggRtcT+I+1YH4o/q6w==} @@ -10953,9 +11172,11 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /@react-native/assets-registry@0.72.0: resolution: {integrity: sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==} + dev: false /@react-native/codegen@0.72.7(@babel/preset-env@7.23.2): resolution: {integrity: sha512-O7xNcGeXGbY+VoqBGNlZ3O05gxfATlwE1Q1qQf5E38dK+tXn5BY4u0jaQ9DPjfE8pBba8g/BYI1N44lynidMtg==} @@ -10969,15 +11190,19 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color + dev: false /@react-native/gradle-plugin@0.72.11: resolution: {integrity: sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw==} + dev: false /@react-native/js-polyfills@0.72.1: resolution: {integrity: sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA==} + dev: false /@react-native/normalize-colors@0.72.0: resolution: {integrity: sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw==} + dev: false /@react-native/virtualized-lists@0.72.8(react-native@0.72.6): resolution: {integrity: sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==} @@ -10987,9 +11212,11 @@ packages: invariant: 2.2.4 nullthrows: 1.1.1 react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) + dev: false /@repeaterjs/repeater@3.0.4: resolution: {integrity: sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==} + dev: false /@rescript/std@9.0.0: resolution: {integrity: sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ==} @@ -11313,7 +11540,7 @@ packages: resolution: {integrity: sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.12.0 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -11325,7 +11552,7 @@ packages: resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.12.0 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -12577,6 +12804,12 @@ packages: '@types/node': 18.18.7 dev: true + /@types/fs-extra@8.1.5: + resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} + dependencies: + '@types/node': 18.18.7 + dev: true + /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: @@ -13027,6 +13260,7 @@ packages: resolution: {integrity: sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==} dependencies: '@types/yargs-parser': 21.0.2 + dev: false /@types/yargs@17.0.29: resolution: {integrity: sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==} @@ -13442,7 +13676,7 @@ packages: typescript: 5.1.6 dev: true - /@wagmi/connectors@2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): + /@wagmi/connectors@2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): resolution: {integrity: sha512-1KOL0HTJl5kzSC/YdKwFwiokr6poUQn1V/tcT0TpG3iH2x0lSM7FTkvCjVVY/6lKzTXrLlo9y2aE7AsOPnkvqg==} peerDependencies: '@wagmi/chains': '>=1.7.0' @@ -13465,7 +13699,7 @@ packages: abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - bufferutil @@ -13477,7 +13711,7 @@ packages: - zod dev: false - /@wagmi/connectors@3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): + /@wagmi/connectors@3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): resolution: {integrity: sha512-UgwsQKQDFObJVJMf9pDfFoXTv710o4zrTHyhIWKBTMMkLpCMsMxN5+ZaDhBYt/BgoRinfRYQo8uwuwLhxE6Log==} peerDependencies: typescript: '>=5.0.4' @@ -13497,7 +13731,7 @@ packages: abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@types/react' @@ -13510,7 +13744,7 @@ packages: - zod dev: false - /@wagmi/core@1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): + /@wagmi/core@1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): resolution: {integrity: sha512-N9luRb1Uk4tBN9kaYcQSWKE9AsRt/rvZaFt5IZech4JPzNN2sQlfhKd9GEjOXYRDqEPHdDvos7qyBKiDNTz4GA==} peerDependencies: typescript: '>=5.0.4' @@ -13519,11 +13753,11 @@ packages: typescript: optional: true dependencies: - '@wagmi/connectors': 3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) + '@wagmi/connectors': 3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: - '@react-native-async-storage/async-storage' @@ -14252,9 +14486,11 @@ packages: dependencies: '@whatwg-node/events': 0.0.3 tslib: 2.6.2 + dev: false /@whatwg-node/events@0.0.2: resolution: {integrity: sha512-WKj/lI4QjnLuPrim0cfO7i+HsDSXHxNv1y0CrJhdntuO3hxWZmnXCwNDnwOvry11OjRin6cgWNF+j/9Pn8TN4w==} + dev: false /@whatwg-node/events@0.0.3: resolution: {integrity: sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==} @@ -14262,6 +14498,7 @@ packages: /@whatwg-node/events@0.1.1: resolution: {integrity: sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==} engines: {node: '>=16.0.0'} + dev: false /@whatwg-node/fetch@0.8.8: resolution: {integrity: sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==} @@ -14278,6 +14515,7 @@ packages: dependencies: '@whatwg-node/node-fetch': 0.5.0 urlpattern-polyfill: 9.0.0 + dev: false /@whatwg-node/node-fetch@0.3.6: resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==} @@ -14297,12 +14535,14 @@ packages: fast-querystring: 1.1.2 fast-url-parser: 1.1.3 tslib: 2.6.2 + dev: false /@whatwg-node/server@0.7.7: resolution: {integrity: sha512-aHURgNDFm/48WVV3vhTMfnEKCYwYgdaRdRhZsQZx4UVFjGGkGay7Ys0+AYu9QT/jpoImv2oONkstoTMUprDofg==} dependencies: '@whatwg-node/fetch': 0.8.8 tslib: 2.6.2 + dev: false /@whatwg-node/server@0.9.16: resolution: {integrity: sha512-gktQkRyONEw2EGpx7UZaC6zNlUm21CGlqAHQXU3QC6W0zlLM5ZQNDCeD66q/nsPHDV08X2NTHlABsuAEk5rh/w==} @@ -14685,6 +14925,7 @@ packages: /anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + dev: false /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -14719,6 +14960,7 @@ packages: colorette: 1.4.0 slice-ansi: 2.1.0 strip-ansi: 5.2.0 + dev: false /ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} @@ -14828,6 +15070,7 @@ packages: /appdirsjs@1.2.7: resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} + dev: false /append-transform@2.0.0: resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} @@ -15080,10 +15323,12 @@ packages: engines: {node: '>=4'} dependencies: tslib: 2.6.2 + dev: false /astral-regex@1.0.0: resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} engines: {node: '>=4'} + dev: false /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} @@ -15149,6 +15394,7 @@ packages: /auto-bind@4.0.0: resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} engines: {node: '>=8'} + dev: false /autoprefixer@10.4.16(postcss@8.4.31): resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} @@ -15247,6 +15493,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 + dev: false /babel-jest@29.7.0(@babel/core@7.23.2): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} @@ -15391,6 +15638,7 @@ packages: /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} + dev: false /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.2): resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} @@ -15398,6 +15646,7 @@ packages: '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) transitivePeerDependencies: - '@babel/core' + dev: false /babel-plugin-transform-react-qa-classes@1.6.0: resolution: {integrity: sha512-r7G9s+j6CiatnTMP+32fbPrfrSSPWJ3LBoESNlCdXWb8oAO2Ubcrgk0TSbpHVMoDpBiyn+zfm2rxdxwdTt3FpQ==} @@ -15473,6 +15722,7 @@ packages: '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 + dev: false /babel-preset-jest@29.6.3(@babel/core@7.23.2): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} @@ -15514,6 +15764,7 @@ packages: /base-64@0.1.0: resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} + dev: false /base-x@3.0.9: resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} @@ -15793,7 +16044,7 @@ packages: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 - chalk: 5.0.1 + chalk: 5.3.0 cli-boxes: 3.0.0 string-width: 5.1.2 type-fest: 2.19.0 @@ -15859,13 +16110,6 @@ packages: node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - /bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} dependencies: @@ -16090,16 +16334,19 @@ packages: engines: {node: '>=4'} dependencies: callsites: 2.0.0 + dev: false /caller-path@2.0.0: resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} engines: {node: '>=4'} dependencies: caller-callsite: 2.0.0 + dev: false /callsites@2.0.0: resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} engines: {node: '>=4'} + dev: false /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -16160,6 +16407,7 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 + dev: false /carbites@1.0.6: resolution: {integrity: sha512-dS9IQvnrb5VIRvSTNz5Ff+mB9d2MFfi5mojtJi7Rlss79VeF190jr0sZdA7eW0CGHotvHkZaWuM6wgfD9PEFRg==} @@ -16289,7 +16537,6 @@ packages: /chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true /chance@1.1.11: resolution: {integrity: sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA==} @@ -16308,6 +16555,7 @@ packages: title-case: 3.0.3 upper-case: 2.0.2 upper-case-first: 2.0.2 + dev: false /change-case-all@1.0.15: resolution: {integrity: sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==} @@ -16322,6 +16570,7 @@ packages: title-case: 3.0.3 upper-case: 2.0.2 upper-case-first: 2.0.2 + dev: false /change-case@4.1.2: resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} @@ -16338,6 +16587,7 @@ packages: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.6.2 + dev: false /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} @@ -16775,6 +17025,7 @@ packages: /commander@2.13.0: resolution: {integrity: sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==} + dev: false /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -16808,6 +17059,7 @@ packages: /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + dev: false /commitizen@4.3.0(typescript@4.9.5): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} @@ -16913,6 +17165,7 @@ packages: utils-merge: 1.0.1 transitivePeerDependencies: - supports-color + dev: false /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} @@ -16924,6 +17177,7 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case: 2.0.2 + dev: false /content-disposition@0.5.2: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} @@ -17112,6 +17366,7 @@ packages: is-directory: 0.3.1 js-yaml: 3.14.1 parse-json: 4.0.0 + dev: false /cosmiconfig@6.0.0: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} @@ -17175,6 +17430,7 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 typescript: 5.1.6 + dev: false /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} @@ -17200,7 +17456,7 @@ packages: safe-buffer: 5.2.1 sha.js: 2.4.11 - /create-jest@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@18.18.7): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -17209,7 +17465,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.7) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -17240,6 +17496,7 @@ packages: node-fetch: 2.7.0 transitivePeerDependencies: - encoding + dev: false /cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} @@ -17889,6 +18146,7 @@ packages: /dataloader@2.2.2: resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} + dev: false /datastore-core@8.0.4: resolution: {integrity: sha512-oBA6a024NFXJOTu+w9nLAimfy4wCYUhdE/5XQGtdKt1BmCVtPYW10GORvVT3pdZBcse6k/mVcBl+hjkXIlm65A==} @@ -17963,6 +18221,7 @@ packages: /dayjs@1.11.7: resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + dev: false /death@1.1.0: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} @@ -18263,6 +18522,7 @@ packages: /denodeify@1.2.1: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} + dev: false /denque@1.5.1: resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==} @@ -18280,6 +18540,7 @@ packages: /dependency-graph@0.11.0: resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} engines: {node: '>= 0.6.0'} + dev: false /deprecated-react-native-prop-types@4.1.0: resolution: {integrity: sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw==} @@ -18287,6 +18548,7 @@ packages: '@react-native/normalize-colors': 0.72.0 invariant: 2.2.4 prop-types: 15.8.1 + dev: false /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -18426,6 +18688,7 @@ packages: dependencies: asap: 2.0.6 lodash.clone: 4.5.0 + dev: false /docker-compose@0.23.19: resolution: {integrity: sha512-v5vNLIdUqwj4my80wxFDkNH+4S85zsRuH29SO7dCWVWPCMt/ohZBsGN6g6KXWifT0pzQ7uOxqEKCYCDPJ8Vz4g==} @@ -18612,6 +18875,7 @@ packages: /dset@3.1.3: resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} + dev: false /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} @@ -18812,6 +19076,7 @@ packages: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} dependencies: stackframe: 1.3.4 + dev: false /errorhandler@1.5.1: resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} @@ -18819,6 +19084,7 @@ packages: dependencies: accepts: 1.3.8 escape-html: 1.0.3 + dev: false /es-abstract@1.22.3: resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} @@ -20031,6 +20297,7 @@ packages: /extract-files@11.0.0: resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} engines: {node: ^12.20 || >= 14.13} + dev: false /extract-zip@2.0.1(supports-color@8.1.1): resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} @@ -20141,6 +20408,7 @@ packages: hasBin: true dependencies: strnum: 1.0.5 + dev: false /fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} @@ -20176,6 +20444,7 @@ packages: /fbjs-css-vars@1.0.2: resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + dev: false /fbjs@3.0.5: resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} @@ -20189,6 +20458,7 @@ packages: ua-parser-js: 1.0.36 transitivePeerDependencies: - encoding + dev: false /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -20210,30 +20480,6 @@ packages: node-domexception: 1.0.0 web-streams-polyfill: 3.2.1 - /fetch-mock@9.11.0(node-fetch@3.3.2): - resolution: {integrity: sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==} - engines: {node: '>=4.0.0'} - peerDependencies: - node-fetch: '*' - peerDependenciesMeta: - node-fetch: - optional: true - dependencies: - '@babel/core': 7.23.2 - '@babel/runtime': 7.23.2 - core-js: 3.33.1 - debug: 4.3.4(supports-color@8.1.1) - glob-to-regexp: 0.4.1 - is-subset: 0.1.1 - lodash.isequal: 4.5.0 - node-fetch: 3.3.2 - path-to-regexp: 2.2.1 - querystring: 0.2.1 - whatwg-url: 6.5.0 - transitivePeerDependencies: - - supports-color - dev: true - /fets@0.1.5: resolution: {integrity: sha512-mL/ya591WOgCP1yBBPbp8E37nynj8QQF6iQCUVl0aHDL80BZ9SOL4BcKBy0dnKdC+clnnAkMm05KB9hsj4m4jQ==} dependencies: @@ -20249,6 +20495,7 @@ packages: tslib: 2.6.2 zod: 3.22.4 zod-to-json-schema: 3.21.4(zod@3.22.4) + dev: false /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} @@ -20377,6 +20624,7 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color + dev: false /finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} @@ -20399,6 +20647,7 @@ packages: commondir: 1.0.1 make-dir: 2.1.0 pkg-dir: 3.0.0 + dev: false /find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} @@ -20459,6 +20708,7 @@ packages: engines: {node: '>=6'} dependencies: locate-path: 3.0.0 + dev: false /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -20509,10 +20759,12 @@ packages: /flow-enums-runtime@0.0.5: resolution: {integrity: sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ==} + dev: false /flow-parser@0.206.0: resolution: {integrity: sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==} engines: {node: '>=0.4.0'} + dev: false /flux@4.0.4(react@18.2.0): resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} @@ -20554,6 +20806,7 @@ packages: /foreach@2.0.6: resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} + dev: false /foreground-child@2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} @@ -21210,6 +21463,20 @@ packages: define-properties: 1.2.1 dev: true + /globby@10.0.1: + resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} + engines: {node: '>=8'} + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + glob: 7.2.3 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + /globby@10.0.2: resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} engines: {node: '>=8'} @@ -21428,6 +21695,7 @@ packages: dependencies: graphql: 16.8.1 tslib: 2.6.2 + dev: false /graphql-ws@5.12.1(graphql@16.8.1): resolution: {integrity: sha512-umt4f5NnMK46ChM2coO36PTFhHouBrK9stWWBczERguwYrGnPNxJ9dimU6IyOBfOkC6Izhkg4H8+F51W/8CYDg==} @@ -21436,6 +21704,7 @@ packages: graphql: '>=0.11 <=16' dependencies: graphql: 16.8.1 + dev: false /graphql-ws@5.14.2(graphql@16.8.1): resolution: {integrity: sha512-LycmCwhZ+Op2GlHz4BZDsUYHKRiiUz+3r9wbhBATMETNlORQJAaFlAgTFoeRh6xQoQegwYwIylVD1Qns9/DA3w==} @@ -21444,6 +21713,7 @@ packages: graphql: '>=0.11 <=16' dependencies: graphql: 16.8.1 + dev: false /graphql-yoga@3.9.1(graphql@16.8.1): resolution: {integrity: sha512-BB6EkN64VBTXWmf9Kym2OsVZFzBC0mAsQNo9eNB5xIr3t+x7qepQ34xW5A353NWol3Js3xpzxwIKFVF6l9VsPg==} @@ -21463,6 +21733,7 @@ packages: graphql: 16.8.1 lru-cache: 7.18.3 tslib: 2.6.2 + dev: false /graphql-yoga@5.0.0(graphql@16.8.1): resolution: {integrity: sha512-ZvZlO8MHMDWuLRoDhvJQnXg8SOJD0iDaCA+M/zWuD26AlhEugOEbpnhw/645oqXTYtvHsM91WyxtV7p5XJWYMg==} @@ -21865,6 +22136,7 @@ packages: /hash-it@6.0.0: resolution: {integrity: sha512-KHzmSFx1KwyMPw0kXeeUD752q/Kfbzhy6dAZrjXV9kAIXGqzGvv8vhkUqj+2MGZldTo0IBpw6v7iWE7uxsvH0w==} + dev: false /hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} @@ -21965,23 +22237,27 @@ packages: dependencies: capital-case: 1.0.4 tslib: 2.6.2 + dev: false /heap@0.2.7: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} /hermes-estree@0.12.0: resolution: {integrity: sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw==} + dev: false /hermes-parser@0.12.0: resolution: {integrity: sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw==} dependencies: hermes-estree: 0.12.0 + dev: false /hermes-profile-transformer@0.0.6: resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} engines: {node: '>=8'} dependencies: source-map: 0.7.4 + dev: false /hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} @@ -22030,6 +22306,7 @@ packages: /hotscript@1.0.13: resolution: {integrity: sha512-C++tTF1GqkGYecL+2S1wJTfoH6APGAsbb7PAWQ3iVIwgG/EFseAfEVOKFgAFq4yK3+6j1EjUD4UQ9dRJHX/sSQ==} + dev: false /hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -22375,6 +22652,7 @@ packages: hasBin: true dependencies: queue: 6.0.2 + dev: false /immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -22394,6 +22672,7 @@ packages: /immutable@3.7.6: resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} engines: {node: '>=0.8.0'} + dev: false /immutable@4.2.1: resolution: {integrity: sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==} @@ -22408,6 +22687,7 @@ packages: dependencies: caller-path: 2.0.0 resolve-from: 3.0.0 + dev: false /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -22419,6 +22699,7 @@ packages: /import-from@4.0.0: resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} engines: {node: '>=12.2'} + dev: false /import-lazy@2.1.0: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} @@ -22613,6 +22894,7 @@ packages: /ip@1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} + dev: false /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -23249,6 +23531,7 @@ packages: dependencies: is-relative: 1.0.0 is-windows: 1.0.2 + dev: false /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} @@ -23354,6 +23637,7 @@ packages: /is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} + dev: false /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} @@ -23469,6 +23753,7 @@ packages: resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} dependencies: tslib: 2.6.2 + dev: false /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -23548,6 +23833,11 @@ packages: dependencies: isobject: 3.0.1 + /is-plain-object@3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} + dev: true + /is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -23593,6 +23883,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-unc-path: 1.0.0 + dev: false /is-retry-allowed@1.2.0: resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} @@ -23645,10 +23936,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-subset@0.1.1: - resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} - dev: true - /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} @@ -23677,6 +23964,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: unc-path-regex: 0.1.2 + dev: false /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -23686,6 +23974,7 @@ packages: resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} dependencies: tslib: 2.6.2 + dev: false /is-url@1.2.4: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} @@ -23732,6 +24021,7 @@ packages: /is-wsl@1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} + dev: false /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} @@ -23811,6 +24101,7 @@ packages: ws: '*' dependencies: ws: 8.13.0 + dev: false /isomorphic-ws@5.0.0(ws@8.14.2): resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} @@ -23818,6 +24109,7 @@ packages: ws: '*' dependencies: ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + dev: false /isows@1.0.3(ws@8.13.0): resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} @@ -24341,7 +24633,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@18.18.7): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -24351,14 +24643,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@18.18.7) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.18.7) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -24369,7 +24661,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@18.18.7): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -24404,7 +24696,6 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.1.6) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -24472,29 +24763,6 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /jest-extended@4.0.2(jest@29.7.0): - resolution: {integrity: sha512-FH7aaPgtGYHc9mRjriS0ZEHYM5/W69tLrFTIdzm+yJgeoCmmrSB/luSfMSqWP9O29QWHPEmJ4qmU6EwsZideog==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - jest: '>=27.2.5' - peerDependenciesMeta: - jest: - optional: true - dependencies: - jest: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - dev: true - - /jest-fetch-mock@3.0.3: - resolution: {integrity: sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==} - dependencies: - cross-fetch: 3.1.8 - promise-polyfill: 8.3.0 - transitivePeerDependencies: - - encoding - dev: true - /jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -24573,6 +24841,7 @@ packages: /jest-regex-util@27.5.1: resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: false /jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} @@ -24701,6 +24970,7 @@ packages: ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 + dev: false /jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} @@ -24755,7 +25025,7 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@29.7.0(@types/node@18.18.7)(ts-node@10.9.1): + /jest@29.7.0(@types/node@18.18.7): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -24765,10 +25035,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@18.18.7) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -24841,9 +25111,11 @@ packages: /jsc-android@250231.0.0: resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} + dev: false /jsc-safe-url@0.2.4: resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + dev: false /jscodeshift@0.14.0(@babel/preset-env@7.23.2): resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} @@ -24873,6 +25145,7 @@ packages: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color + dev: false /jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} @@ -24926,6 +25199,7 @@ packages: /json-bigint-patch@0.0.8: resolution: {integrity: sha512-xa0LTQsyaq8awYyZyuUsporWisZFiyqzxGW8CKM3t7oouf0GFAKYJnqAm6e9NLNBQOCtOLvy614DEiRX/rPbnA==} + dev: false /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -24953,6 +25227,7 @@ packages: resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} dependencies: foreach: 2.0.6 + dev: false /json-rpc-engine@6.1.0: resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} @@ -24982,6 +25257,7 @@ packages: '@babel/runtime': 7.23.2 '@types/json-schema': 7.0.14 ts-algebra: 1.2.2 + dev: false /json-schema-to-typescript@12.0.0: resolution: {integrity: sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==} @@ -25465,6 +25741,7 @@ packages: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} dependencies: immediate: 3.0.6 + dev: false /lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -25627,6 +25904,7 @@ packages: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} dependencies: lie: 3.1.1 + dev: false /locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} @@ -25641,6 +25919,7 @@ packages: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 + dev: false /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} @@ -25675,6 +25954,7 @@ packages: /lodash.clone@4.5.0: resolution: {integrity: sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==} + dev: false /lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} @@ -25778,19 +26058,17 @@ packages: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true - /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true /lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: false /lodash.topath@4.5.2: resolution: {integrity: sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==} + dev: false /lodash.trim@4.5.1: resolution: {integrity: sha512-nJAlRl/K+eiOehWKDzoBVrSMhK0K3A3YQsUNXHQa5yIrKBAhsZgSu3KoAFoFT+mEgiyBHddZ0pRk1ITpIp90Wg==} @@ -25868,6 +26146,7 @@ packages: ansi-fragments: 0.2.1 dayjs: 1.11.10 yargs: 15.4.1 + dev: false /loglevel@1.8.1: resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} @@ -25909,6 +26188,7 @@ packages: resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} dependencies: tslib: 2.6.2 + dev: false /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -25951,6 +26231,7 @@ packages: /lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + dev: false /lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} @@ -26035,6 +26316,7 @@ packages: /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} + dev: false /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} @@ -26200,6 +26482,7 @@ packages: /memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + dev: false /memoizee@0.4.15: resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} @@ -26323,6 +26606,7 @@ packages: optional: true dependencies: '@types/node': 18.18.7 + dev: false /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -26337,10 +26621,12 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color + dev: false /metro-cache-key@0.76.8: resolution: {integrity: sha512-buKQ5xentPig9G6T37Ww/R/bC+/V1MA5xU/D8zjnhlelsrPG6w6LtHUS61ID3zZcMZqYaELWk5UIadIdDsaaLw==} engines: {node: '>=16'} + dev: false /metro-cache@0.76.8: resolution: {integrity: sha512-QBJSJIVNH7Hc/Yo6br/U/qQDUpiUdRgZ2ZBJmvAbmAKp2XDzsapnMwK/3BGj8JNWJF7OLrqrYHsRsukSbUBpvQ==} @@ -26348,6 +26634,7 @@ packages: dependencies: metro-core: 0.76.8 rimraf: 3.0.2 + dev: false /metro-config@0.76.8: resolution: {integrity: sha512-SL1lfKB0qGHALcAk2zBqVgQZpazDYvYFGwCK1ikz0S6Y/CM2i2/HwuZN31kpX6z3mqjv/6KvlzaKoTb1otuSAA==} @@ -26365,6 +26652,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /metro-core@0.76.8: resolution: {integrity: sha512-sl2QLFI3d1b1XUUGxwzw/KbaXXU/bvFYrSKz6Sg19AdYGWFyzsgZ1VISRIDf+HWm4R/TJXluhWMEkEtZuqi3qA==} @@ -26372,6 +26660,7 @@ packages: dependencies: lodash.throttle: 4.1.1 metro-resolver: 0.76.8 + dev: false /metro-file-map@0.76.8: resolution: {integrity: sha512-A/xP1YNEVwO1SUV9/YYo6/Y1MmzhL4ZnVgcJC3VmHp/BYVOXVStzgVbWv2wILe56IIMkfXU+jpXrGKKYhFyHVw==} @@ -26393,6 +26682,7 @@ packages: fsevents: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /metro-inspector-proxy@0.76.8: resolution: {integrity: sha512-Us5o5UEd4Smgn1+TfHX4LvVPoWVo9VsVMn4Ldbk0g5CQx3Gu0ygc/ei2AKPGTwsOZmKxJeACj7yMH2kgxQP/iw==} @@ -26409,18 +26699,21 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /metro-minify-terser@0.76.8: resolution: {integrity: sha512-Orbvg18qXHCrSj1KbaeSDVYRy/gkro2PC7Fy2tDSH1c9RB4aH8tuMOIXnKJE+1SXxBtjWmQ5Yirwkth2DyyEZA==} engines: {node: '>=16'} dependencies: terser: 5.22.0 + dev: false /metro-minify-uglify@0.76.8: resolution: {integrity: sha512-6l8/bEvtVaTSuhG1FqS0+Mc8lZ3Bl4RI8SeRIifVLC21eeSDp4CEBUWSGjpFyUDfi6R5dXzYaFnSgMNyfxADiQ==} engines: {node: '>=16'} dependencies: uglify-es: 3.3.9 + dev: false /metro-react-native-babel-preset@0.76.8(@babel/core@7.23.2): resolution: {integrity: sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==} @@ -26469,6 +26762,7 @@ packages: react-refresh: 0.4.3 transitivePeerDependencies: - supports-color + dev: false /metro-react-native-babel-transformer@0.76.8(@babel/core@7.23.2): resolution: {integrity: sha512-3h+LfS1WG1PAzhq8QF0kfXjxuXetbY/lgz8vYMQhgrMMp17WM1DNJD0gjx8tOGYbpbBC1qesJ45KMS4o5TA73A==} @@ -26483,10 +26777,12 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color + dev: false /metro-resolver@0.76.8: resolution: {integrity: sha512-KccOqc10vrzS7ZhG2NSnL2dh3uVydarB7nOhjreQ7C4zyWuiW9XpLC4h47KtGQv3Rnv/NDLJYeDqaJ4/+140HQ==} engines: {node: '>=16'} + dev: false /metro-runtime@0.76.8: resolution: {integrity: sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==} @@ -26494,6 +26790,7 @@ packages: dependencies: '@babel/runtime': 7.23.2 react-refresh: 0.4.3 + dev: false /metro-source-map@0.76.8: resolution: {integrity: sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==} @@ -26509,6 +26806,7 @@ packages: vlq: 1.0.1 transitivePeerDependencies: - supports-color + dev: false /metro-symbolicate@0.76.8: resolution: {integrity: sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w==} @@ -26523,6 +26821,7 @@ packages: vlq: 1.0.1 transitivePeerDependencies: - supports-color + dev: false /metro-transform-plugins@0.76.8: resolution: {integrity: sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA==} @@ -26535,6 +26834,7 @@ packages: nullthrows: 1.1.1 transitivePeerDependencies: - supports-color + dev: false /metro-transform-worker@0.76.8: resolution: {integrity: sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ==} @@ -26557,6 +26857,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /metro@0.76.8: resolution: {integrity: sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg==} @@ -26616,6 +26917,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} @@ -26842,6 +27144,7 @@ packages: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true + dev: false /mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} @@ -27453,9 +27756,11 @@ packages: /nocache@3.0.4: resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} engines: {node: '>=12.0.0'} + dev: false /node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: false /node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} @@ -27465,6 +27770,7 @@ packages: engines: {node: '>= 0.10.5'} dependencies: minimatch: 3.1.2 + dev: false /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} @@ -27530,6 +27836,7 @@ packages: /node-stream-zip@1.15.0: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} engines: {node: '>=0.12.0'} + dev: false /nofilter@3.1.0: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} @@ -27569,6 +27876,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: remove-trailing-separator: 1.1.0 + dev: false /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -27629,6 +27937,7 @@ packages: /nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + dev: false /number-is-nan@1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} @@ -27690,6 +27999,7 @@ packages: /ob1@0.76.8: resolution: {integrity: sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==} engines: {node: '>=16'} + dev: false /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -27697,9 +28007,11 @@ packages: /object-inspect@1.10.3: resolution: {integrity: sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==} + dev: false /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -27810,6 +28122,7 @@ packages: engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 + dev: false /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -27843,6 +28156,7 @@ packages: engines: {node: '>=8'} dependencies: is-wsl: 1.1.0 + dev: false /open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} @@ -27850,6 +28164,7 @@ packages: dependencies: is-docker: 2.2.1 is-wsl: 2.2.0 + dev: false /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} @@ -27861,6 +28176,7 @@ packages: /openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + dev: false /opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} @@ -28048,6 +28364,7 @@ packages: engines: {node: '>=6'} dependencies: p-limit: 2.3.0 + dev: false /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} @@ -28210,6 +28527,7 @@ packages: is-absolute: 1.0.0 map-cache: 0.2.2 path-root: 0.1.1 + dev: false /parse-headers@2.0.5: resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} @@ -28301,6 +28619,7 @@ packages: dependencies: dot-case: 3.0.4 tslib: 2.6.2 + dev: false /path-exists@2.1.0: resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} @@ -28344,12 +28663,14 @@ packages: /path-root-regex@0.1.2: resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} engines: {node: '>=0.10.0'} + dev: false /path-root@0.1.1: resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} engines: {node: '>=0.10.0'} dependencies: path-root-regex: 0.1.2 + dev: false /path-scurry@1.10.1: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} @@ -28373,6 +28694,7 @@ packages: /path-to-regexp@2.2.1: resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} + dev: false /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} @@ -28515,6 +28837,7 @@ packages: engines: {node: '>=6'} dependencies: find-up: 3.0.0 + dev: false /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} @@ -29158,14 +29481,11 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - /promise-polyfill@8.3.0: - resolution: {integrity: sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==} - dev: true - /promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} dependencies: asap: 2.0.6 + dev: false /promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} @@ -29429,6 +29749,7 @@ packages: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} dependencies: inherits: 2.0.4 + dev: false /quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -29578,6 +29899,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} @@ -29712,9 +30034,11 @@ packages: base-64: 0.1.0 react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) utf8: 3.0.0 + dev: false /react-native-path@0.0.5: resolution: {integrity: sha512-WJr256xBquk7X2O83QYWKqgLg43Zg3SrgjPc/kr0gCD2LoXA+2L72BW4cmstH12GbGeutqs/eXk3jgDQ2iCSvQ==} + dev: false /react-native@0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0): resolution: {integrity: sha512-RafPY2gM7mcrFySS8TL8x+TIO3q7oAlHpzEmC7Im6pmXni6n1AuufGaVh0Narbr1daxstw7yW7T9BKW5dpVc2A==} @@ -29767,10 +30091,12 @@ packages: - encoding - supports-color - utf-8-validate + dev: false /react-refresh@0.4.3: resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} engines: {node: '>=0.10.0'} + dev: false /react-remove-scroll-bar@2.3.4(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} @@ -29858,6 +30184,7 @@ packages: object-assign: 4.1.1 react: 18.2.0 react-is: 18.2.0 + dev: false /react-style-singleton@2.2.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} @@ -30049,6 +30376,7 @@ packages: /readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} + dev: false /real-require@0.1.0: resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} @@ -30063,6 +30391,7 @@ packages: esprima: 4.0.1 source-map: 0.6.1 tslib: 2.6.2 + dev: false /receptacle@1.3.2: resolution: {integrity: sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==} @@ -30132,6 +30461,7 @@ packages: /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} @@ -30212,6 +30542,7 @@ packages: invariant: 2.2.4 transitivePeerDependencies: - encoding + dev: false /release-zalgo@1.0.0: resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} @@ -30299,6 +30630,7 @@ packages: /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: false /renderkid@2.0.7: resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} @@ -30545,6 +30877,7 @@ packages: hasBin: true dependencies: glob: 7.2.3 + dev: false /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} @@ -30614,6 +30947,17 @@ packages: semver: 5.7.2 dev: true + /rollup-plugin-copy@3.5.0: + resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} + engines: {node: '>=8.3'} + dependencies: + '@types/fs-extra': 8.1.5 + colorette: 1.4.0 + fs-extra: 8.1.0 + globby: 10.0.1 + is-plain-object: 3.0.1 + dev: true + /rollup-plugin-dts@5.3.1(rollup@3.29.4)(typescript@5.1.6): resolution: {integrity: sha512-gusMi+Z4gY/JaEQeXnB0RUdU82h1kF0WYzCWgVmV4p3hWXqelaKuCvcJawfeg+EKn2T1Ie+YWF2OiN1/L8bTVg==} engines: {node: '>=v14.21.3'} @@ -30893,6 +31237,7 @@ packages: resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} dependencies: loose-envify: 1.4.0 + dev: false /schema-utils@2.7.0: resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} @@ -31051,10 +31396,12 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 + dev: false /serialize-error@2.1.0: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} + dev: false /serialize-javascript@6.0.0: resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} @@ -31267,6 +31614,7 @@ packages: /signedsource@1.0.0: resolution: {integrity: sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==} + dev: false /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -31331,6 +31679,7 @@ packages: ansi-styles: 3.2.1 astral-regex: 1.0.0 is-fullwidth-code-point: 2.0.0 + dev: false /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} @@ -31363,6 +31712,7 @@ packages: dependencies: dot-case: 3.0.4 tslib: 2.6.2 + dev: false /socket.io-client@4.7.2: resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} @@ -31708,6 +32058,7 @@ packages: resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} dependencies: tslib: 2.6.2 + dev: false /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -31764,6 +32115,7 @@ packages: /stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + dev: false /stacktrace-gps@3.1.2: resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} @@ -32063,6 +32415,7 @@ packages: /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false /style-to-object@0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} @@ -32115,6 +32468,7 @@ packages: /sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} + dev: false /superjson@1.13.3: resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} @@ -32191,6 +32545,7 @@ packages: resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} dependencies: tslib: 2.6.2 + dev: false /swarm-js@0.1.42: resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} @@ -32326,6 +32681,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: rimraf: 2.6.3 + dev: false /terser-webpack-plugin@5.3.9(webpack@5.89.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} @@ -32441,6 +32797,7 @@ packages: /throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + dev: false /throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} @@ -32460,6 +32817,7 @@ packages: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 + dev: false /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} @@ -32518,10 +32876,12 @@ packages: /tiny-lru@11.2.3: resolution: {integrity: sha512-mF9jPTrvN7UHk0bekOk3RlFdFwfyS4CJYVsGc7nInL3pVgUCYj5r9X6GpZBFQgLr0TKJo8Dp+F3oRvYzxU9xiA==} engines: {node: '>=12'} + dev: false /tiny-lru@8.0.2: resolution: {integrity: sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg==} engines: {node: '>=6'} + dev: false /tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} @@ -32545,6 +32905,7 @@ packages: resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} dependencies: tslib: 2.6.2 + dev: false /tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} @@ -32630,12 +32991,6 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - dependencies: - punycode: 2.3.0 - dev: true - /tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} @@ -32683,6 +33038,7 @@ packages: /ts-algebra@1.2.2: resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} + dev: false /ts-command-line-args@2.5.1: resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} @@ -32731,48 +33087,6 @@ packages: tslib: 2.6.2 dev: false - /ts-jest-resolver@2.0.1: - resolution: {integrity: sha512-FolE73BqVZCs8/RbLKxC67iaAtKpBWx7PeLKFW2zJQlOf9j851I7JRxSDenri2NFvVH3QP7v3S8q1AmL24Zb9Q==} - dependencies: - jest-resolve: 29.7.0 - dev: true - - /ts-jest@29.1.1(@babel/core@7.23.2)(babel-jest@29.7.0)(esbuild@0.17.19)(jest@29.7.0)(typescript@5.1.6): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.23.2 - babel-jest: 29.7.0(@babel/core@7.23.2) - bs-logger: 0.2.6 - esbuild: 0.17.19 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.18.7)(ts-node@10.9.1) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.1.6 - yargs-parser: 21.1.1 - dev: true - /ts-loader@9.5.0(typescript@4.9.5)(webpack@5.89.0): resolution: {integrity: sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==} engines: {node: '>=12.0.0'} @@ -32925,6 +33239,7 @@ packages: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 + dev: false /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -32934,12 +33249,15 @@ packages: /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} + dev: false /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + dev: false /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} + dev: false /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -33260,6 +33578,7 @@ packages: /ua-parser-js@1.0.36: resolution: {integrity: sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==} + dev: false /ufo@1.3.1: resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} @@ -33273,6 +33592,7 @@ packages: dependencies: commander: 2.13.0 source-map: 0.6.1 + dev: false /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} @@ -33339,6 +33659,7 @@ packages: /unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} + dev: false /underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} @@ -33534,6 +33855,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: normalize-path: 2.1.1 + dev: false /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} @@ -33585,11 +33907,13 @@ packages: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} dependencies: tslib: 2.6.2 + dev: false /upper-case@2.0.2: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} dependencies: tslib: 2.6.2 + dev: false /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -33651,6 +33975,7 @@ packages: /urlpattern-polyfill@9.0.0: resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} + dev: false /use-callback-ref@1.3.0(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} @@ -33722,6 +34047,7 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 18.2.0 + dev: false /user-home@2.0.0: resolution: {integrity: sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==} @@ -33882,6 +34208,7 @@ packages: /value-or-promise@1.0.12: resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} engines: {node: '>=12'} + dev: false /varint-decoder@1.0.0: resolution: {integrity: sha512-JkOvdztASWGUAsXshCFHrB9f6AgR2Q8W08CEyJ+43b1qtFocmI8Sp1R/M0E/hDOY2FzVIqk63tOYLgDYWuJ7IQ==} @@ -33964,29 +34291,6 @@ packages: - zod dev: true - /viem@1.18.4(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-im+y30k+IGT6VtfD/q1V0RX5PaiHPsFTHkKqvTjTqV+ZT8RgJXzOGPXr5E0uPIm2cbJAJp6A9nR9BCHY7BKR2Q==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@adraffy/ens-normalize': 1.9.4 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.1.6)(zod@3.22.4) - isows: 1.0.3(ws@8.13.0) - typescript: 5.1.6 - ws: 8.13.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - dev: false - /viem@1.18.9(typescript@4.9.5): resolution: {integrity: sha512-eAXtoTwAFA3YEgjTYMb5ZTQrDC0UPx5qyZ4sv90TirVKepcM9mBPksTkC1SSWya0UdxhBmhEBL/CiYMjmGCTWg==} peerDependencies: @@ -34010,15 +34314,15 @@ packages: - zod dev: true - /viem@1.18.9(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-eAXtoTwAFA3YEgjTYMb5ZTQrDC0UPx5qyZ4sv90TirVKepcM9mBPksTkC1SSWya0UdxhBmhEBL/CiYMjmGCTWg==} + /viem@1.19.9(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-Sf9U2x4jU0S/FALqYypcspWOGene0NZyD470oUripNhE0Ta6uOE/OgE4toTDVfRxov8qw0JFinr/wPGxYE3+HQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true dependencies: - '@adraffy/ens-normalize': 1.9.4 + '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 @@ -34151,6 +34455,7 @@ packages: /vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + dev: false /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} @@ -34186,7 +34491,7 @@ packages: hasBin: true dev: true - /wagmi@1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4): + /wagmi@1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): resolution: {integrity: sha512-Ph62E6cO5n2Z8Z5LTyZrkaNprxTsbC4w0qZJT4OJdXrEELziI8z/b4FO6amVFXdu2rDp/wpvF56e4mhKC8/Kdw==} peerDependencies: react: '>=17.0.0' @@ -34199,12 +34504,12 @@ packages: '@tanstack/query-sync-storage-persister': 4.36.1 '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0) '@tanstack/react-query-persist-client': 4.36.1(@tanstack/react-query@4.36.1) - '@wagmi/core': 1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.18.9)(zod@3.22.4) + '@wagmi/core': 1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) react: 18.2.0 typescript: 5.1.6 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 1.18.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@types/react' @@ -34624,10 +34929,6 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true - /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -34854,6 +35155,7 @@ packages: /whatwg-fetch@3.6.19: resolution: {integrity: sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==} + dev: false /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} @@ -34874,14 +35176,6 @@ packages: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url@6.5.0: - resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - dev: true - /wherearewe@2.0.1: resolution: {integrity: sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -35082,6 +35376,7 @@ packages: graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 + dev: false /write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} @@ -35127,6 +35422,7 @@ packages: optional: true dependencies: async-limiter: 1.0.1 + dev: false /ws@7.4.6: resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} @@ -35341,6 +35637,7 @@ packages: /yaml@2.3.3: resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} engines: {node: '>= 14'} + dev: false /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} @@ -35500,6 +35797,7 @@ packages: zod: ^3.21.4 dependencies: zod: 3.22.4 + dev: false /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} diff --git a/sdk/.eslintrc.yml b/sdk/.eslintrc.yml index d4bd79ab..da11d20d 100644 --- a/sdk/.eslintrc.yml +++ b/sdk/.eslintrc.yml @@ -9,7 +9,7 @@ parserOptions: plugins: - "@typescript-eslint" root: true -ignorePatterns: ["rollup.config.js", "jest.config.ts", "dist/"] +ignorePatterns: ["rollup.config.js", "vitest.config.ts", "dist/"] rules: "@typescript-eslint/semi": - warn diff --git a/sdk/.graphclientrc.yml b/sdk/.graphclientrc.yml index 2d6deecf..79b1fc24 100644 --- a/sdk/.graphclientrc.yml +++ b/sdk/.graphclientrc.yml @@ -15,10 +15,10 @@ additionalTypeDefs: | } additionalResolvers: - - ./src/utils/resolvers.ts + - src/utils/resolvers.ts documents: - - ./src/indexer/queries/*.graphql + - src/indexer/queries/*.graphql codegen: contextType: "MeshContext & { graphName: string }" diff --git a/sdk/global.d.ts b/sdk/global.d.ts deleted file mode 100644 index 3b47093f..00000000 --- a/sdk/global.d.ts +++ /dev/null @@ -1 +0,0 @@ -import "jest-extended"; diff --git a/sdk/jest.config.ts b/sdk/jest.config.ts deleted file mode 100644 index 7d3d6afb..00000000 --- a/sdk/jest.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Config } from "jest"; - -const config: Config = { - extensionsToTreatAsEsm: [".ts", ".tsx"], - preset: "ts-jest/presets/js-with-ts-esm", // or other ESM presets, - setupFiles: ["./test/setup-env.ts"], - setupFilesAfterEnv: ["jest-extended/all"], - rootDir: ".", - moduleNameMapper: { - "^(\\.{1,2}/.*)\\.js$": "$1", - "^@hypercerts-org/contracts$": require.resolve("@hypercerts-org/contracts"), // this is the trick! - }, - verbose: false, - resolver: "ts-jest-resolver", - moduleFileExtensions: ["js", "jsx", "json", "ts"], - transform: {}, - workerThreads: true, -}; - -export default config; diff --git a/sdk/package.json b/sdk/package.json index fef2c88d..e8b55be6 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.0.0-alpha.10", + "version": "1.0.0-alpha.14", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -11,11 +11,9 @@ "module": "./dist/esm/index.js", "types": "./dist/index.d.ts", "exports": { - ".": { - "require": "./dist/cjs/index.js", - "import": "./dist/esm/index.js", - "types": "./dist/index.d.ts" - } + "require": "./dist/cjs/index.js", + "import": "./dist/esm/index.js", + "types": "./dist/index.d.ts" }, "files": [ "dist", @@ -26,6 +24,7 @@ "@ethereum-attestation-service/eas-sdk": "1.2.2-beta.0", "@ethersproject/abstract-signer": "^5.7.0", "@graphprotocol/client-add-source-name": "^2.0.0", + "@graphprotocol/client-cli": "^3.0.0", "@graphprotocol/client-polling-live": "^2.0.0", "@graphql-mesh/cache-localforage": "^0.96.0", "@graphql-mesh/cross-helpers": "^0.4.1", @@ -34,10 +33,9 @@ "@graphql-mesh/merger-bare": "^0.95.7", "@graphql-mesh/runtime": "^0.96.12", "@graphql-mesh/store": "^0.95.7", - "@graphql-mesh/types": "^0.95.7", "@graphql-mesh/utils": "^0.95.7", "@graphql-typed-document-node/core": "^3.2.0", - "@hypercerts-org/contracts": "1.0.0-alpha.2", + "@hypercerts-org/contracts": "1.0.0-alpha.6", "@openzeppelin/merkle-tree": "^1.0.5", "@whatwg-node/fetch": "^0.9.13", "ajv": "^8.11.2", @@ -49,7 +47,7 @@ "loglevel": "^1.8.1", "mime": "^3.0.0", "nft.storage": "^7.1.1", - "viem": "^1.18.4", + "viem": "^1.19.9", "web3.storage": "^4.5.5" }, "devDependencies": { @@ -57,8 +55,6 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.23.2", "@faker-js/faker": "^8.0.2", - "@graphprotocol/client-cli": "^3.0.0", - "@jest/globals": "^29.7.0", "@rollup/plugin-commonjs": "^24.0.1", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", @@ -70,17 +66,12 @@ "@types/sinon": "^10.0.15", "@viem/anvil": "^0.0.6", "abitype": "^0.10.2", - "babel-jest": "^29.7.0", "chai": "^4.3.7", "chai-assertions-count": "^1.0.2", "chai-subset": "^1.6.0", "esbuild": "^0.17.10", "ethereum-waffle": "^4.0.10", - "fetch-mock": "^9.11.0", "it-all": "^2.0.0", - "jest": "^29.3.1", - "jest-extended": "^4.0.0", - "jest-fetch-mock": "^3.0.3", "json-schema-to-typescript": "^12.0.0", "nyc": "^15.1.0", "rollup": "^3.17.2", @@ -90,8 +81,6 @@ "rollup-plugin-node-polyfills": "^0.2.1", "shx": "^0.3.4", "sinon": "^15.2.0", - "ts-jest": "^29.0.3", - "ts-jest-resolver": "^2.0.0", "ts-mocha": "^10.0.0", "ts-node": "^10.9.1", "tslib": "^2.5.0", @@ -99,19 +88,21 @@ "typedoc": "^0.23.25", "typedoc-plugin-markdown": "^3.14.0", "typedoc-plugin-missing-exports": "^2.0.0", - "typescript": "5.1.6" + "typescript": "5.1.6", + "vitest": "^0.28.4" }, "scripts": { - "build": "pnpm types:json && pnpm graph:build:esm && rollup -c", + "build": "pnpm types:json && pnpm graph:build && rollup -c", "docs": "typedoc", "graph:compile": "graphql-codegen", "graph:serve": "graphclient serve-dev", "graph:watch": "graphql-codegen -w", + "graph:build": "rm -rf ./src/.graphclient && graphclient build --throwOnInvalidConfig", "graph:build:esm": "rm -rf ./src/.graphclient && NODE_OPTIONS='--loader ts-node/esm' graphclient build --throwOnInvalidConfig", "clean": "rm -rf ./dist", "prebuild": "pnpm clean", "prepack": "pnpm build", - "test": "NODE_OPTIONS=\"--no-warnings --experimental-vm-modules\" jest --detectOpenHandles --forceExit", + "test": "vitest", "types:json": "pnpm json2ts -i './src/resources/schema/' -o 'src/types' --cwd './src/resources/schema'" } } diff --git a/sdk/src/client.ts b/sdk/src/client.ts index aeef85cc..e0ce6877 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -1,9 +1,9 @@ import { HypercertMinterAbi } from "@hypercerts-org/contracts"; import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; -import { ByteArray, GetContractReturnType, Hex, PublicClient, WalletClient, getContract, parseAbi } from "viem"; -import HypercertEvaluator from "./evaluations"; -import HypercertIndexer from "./indexer"; -import HypercertsStorage from "./storage"; +import { ByteArray, GetContractReturnType, Hex, PublicClient, WalletClient, getContract } from "viem"; +import { HypercertEvaluator } from "./evaluations"; +import { HypercertIndexer } from "./indexer"; +import { HypercertsStorage } from "./storage"; import { AllowlistEntry, ClientError, @@ -16,7 +16,7 @@ import { TransferRestrictions, } from "./types"; import { getConfig } from "./utils/config"; -import logger from "./utils/logger"; +import { logger } from "./utils"; import { validateAllowlist, validateMetaData, verifyMerkleProof, verifyMerkleProofs } from "./validator"; /** @@ -33,7 +33,7 @@ import { validateAllowlist, validateMetaData, verifyMerkleProof, verifyMerklePro * * @param {Partial} config - The configuration options for the client. */ -export default class HypercertClient implements HypercertClientInterface { +export class HypercertClient implements HypercertClientInterface { readonly _config; private _storage: HypercertsStorage; // TODO better handling readonly. For now not needed since we don't use this class; @@ -99,10 +99,10 @@ export default class HypercertClient implements HypercertClientInterface { * Gets the HypercertMinter contract used by the client. * @returns The contract. */ - get contract(): GetContractReturnType { + get contract(): GetContractReturnType { return getContract({ address: this._config.contractAddress as `0x${string}`, - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, publicClient: this._publicClient, walletClient: this._walletClient, }); @@ -296,6 +296,8 @@ export default class HypercertClient implements HypercertClientInterface { ...this.getCleanedOverrides(overrides), }); + console.log(request); + return this.submitRequest(request); }; @@ -432,7 +434,7 @@ export default class HypercertClient implements HypercertClientInterface { return getContract({ address: this.config.contractAddress as `0x${string}`, - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, }); }; diff --git a/sdk/src/evaluations/index.ts b/sdk/src/evaluations/index.ts index 44f13c23..9d14b72a 100644 --- a/sdk/src/evaluations/index.ts +++ b/sdk/src/evaluations/index.ts @@ -3,7 +3,7 @@ import { isAddress } from "viem"; // @ts-ignore import { CIDString } from "nft.storage"; -import HypercertsStorage from "../storage"; +import { HypercertsStorage } from "../storage"; import { HypercertClientConfig, HypercertEvaluationSchema, MalformedDataError } from "../types"; export interface EvaluatorInterface { @@ -15,7 +15,7 @@ export interface EvaluatorInterface { submitEvaluation: (evaluation: HypercertEvaluationSchema) => Promise; } -export default class HypercertEvaluator implements EvaluatorInterface { +export class HypercertEvaluator implements EvaluatorInterface { storage: HypercertsStorage; readonly = true; diff --git a/sdk/src/index.ts b/sdk/src/index.ts index 6836893a..58cc06ef 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -1,8 +1,8 @@ import { HypercertMinterAbi, HypercertExchangeAbi } from "@hypercerts-org/contracts"; import { execute } from "../.graphclient"; -import HypercertClient from "./client"; -import HypercertsStorage from "./storage"; +import { HypercertClient } from "./client"; +import { HypercertsStorage } from "./storage"; import { DEPLOYMENTS } from "./constants"; /** diff --git a/sdk/src/indexer.ts b/sdk/src/indexer.ts index 9ffe5eff..331beb93 100644 --- a/sdk/src/indexer.ts +++ b/sdk/src/indexer.ts @@ -1,5 +1,27 @@ -import { logger } from "ethers"; -import { getBuiltGraphSDK, Sdk as GraphClient } from "../.graphclient"; +import { logger } from "./utils"; +import { + getBuiltGraphSDK, + Sdk as GraphClient, + execute, + ClaimsByOwnerDocument, + ClaimsByOwnerQuery, + ClaimByIdDocument, + ClaimByIdQuery, + RecentClaimsDocument, + RecentClaimsQuery, + ClaimsByOwnerQueryVariables, + ClaimByIdQueryVariables, + RecentClaimsQueryVariables, + ClaimTokensByOwnerDocument, + ClaimTokensByOwnerQuery, + ClaimTokensByOwnerQueryVariables, + ClaimTokensByClaimDocument, + ClaimTokensByClaimQueryVariables, + ClaimTokensByClaimQuery, + ClaimTokenByIdDocument, + ClaimTokenByIdQueryVariables, + ClaimTokenByIdQuery, +} from "../.graphclient"; import { defaultQueryParams } from "./indexer/utils"; import { HypercertClientConfig, HypercertIndexerInterface, QueryParams } from "./types"; @@ -15,19 +37,18 @@ import { HypercertClientConfig, HypercertIndexerInterface, QueryParams } from ". * const indexer = new HypercertIndexer({ graphUrl: 'your-graph-url', graphName: 'your-graph-name' }); * const claims = await indexer.claimsByOwner('your-address'); */ -export default class HypercertIndexer implements HypercertIndexerInterface { +export class HypercertIndexer implements HypercertIndexerInterface { /** The Graph client used by the indexer. */ - private _graphClient: GraphClient; + private _graphName: string; /** * Creates a new instance of the `HypercertIndexer` class. * @param options The configuration options for the indexer. */ constructor(options: Partial) { - logger.info("Creating HypercertIndexer", "constructor", options); - this._graphClient = getBuiltGraphSDK({ - graphName: options.graphName, - }); + logger.info("Creating HypercertIndexer", "constructor", { name: options.graphName, url: options.graphUrl }); + if (!options.graphName) throw new Error("Missing graphName"); + this._graphName = options.graphName; } /** @@ -35,7 +56,9 @@ export default class HypercertIndexer implements HypercertIndexerInterface { * @returns The Graph client. */ get graphClient(): GraphClient { - return this._graphClient; + return getBuiltGraphSDK({ + graphName: this._graphName, + }); } /** @@ -44,31 +67,39 @@ export default class HypercertIndexer implements HypercertIndexerInterface { * @param params The query parameters. * @returns A Promise that resolves to the claims. */ - claimsByOwner = async (owner: string, params: QueryParams = defaultQueryParams) => - this.graphClient.ClaimsByOwner({ + claimsByOwner = async (owner: string, params: QueryParams = defaultQueryParams) => { + const query = ClaimsByOwnerDocument; + const variables: ClaimsByOwnerQueryVariables = { owner, ...params, - }); + }; + return (await execute(query, variables, { graphName: this._graphName })) as ClaimsByOwnerQuery; + }; /** * Gets a claim by its ID. * @param id The ID of the claim. * @returns A Promise that resolves to the claim. */ - claimById = async (id: string) => - this.graphClient.ClaimById({ + claimById = async (id: string) => { + const query = ClaimByIdDocument; + const variables: ClaimByIdQueryVariables = { id, - }); - + }; + return (await execute(query, variables, { graphName: this._graphName })) as ClaimByIdQuery; + }; /** * Gets the most recent claims. * @param params The query parameters. * @returns A Promise that resolves to the claims. */ - firstClaims = async (params: QueryParams = defaultQueryParams) => - this.graphClient.RecentClaims({ + firstClaims = async (params: QueryParams = defaultQueryParams) => { + const query = RecentClaimsDocument; + const variables: RecentClaimsQueryVariables = { ...params, - }); + }; + return (await execute(query, variables, { graphName: this._graphName })) as RecentClaimsQuery; + }; /** * Gets the claim tokens owned by a given address. @@ -76,11 +107,14 @@ export default class HypercertIndexer implements HypercertIndexerInterface { * @param params The query parameters. * @returns A Promise that resolves to the claim tokens. */ - fractionsByOwner = async (owner: string, params: QueryParams = defaultQueryParams) => - this.graphClient.ClaimTokensByOwner({ + fractionsByOwner = async (owner: string, params: QueryParams = defaultQueryParams) => { + const query = ClaimTokensByOwnerDocument; + const variables: ClaimTokensByOwnerQueryVariables = { owner, ...params, - }); + }; + return (await execute(query, variables, { graphName: this._graphName })) as ClaimTokensByOwnerQuery; + }; /** * Gets the claim tokens for a given claim. @@ -88,19 +122,25 @@ export default class HypercertIndexer implements HypercertIndexerInterface { * @param params The query parameters. * @returns A Promise that resolves to the claim tokens. */ - fractionsByClaim = async (claimId: string, params: QueryParams = defaultQueryParams) => - this.graphClient.ClaimTokensByClaim({ + fractionsByClaim = async (claimId: string, params: QueryParams = defaultQueryParams) => { + const query = ClaimTokensByClaimDocument; + const variables: ClaimTokensByClaimQueryVariables = { claimId, ...params, - }); + }; + return (await execute(query, variables, { graphName: this._graphName })) as ClaimTokensByClaimQuery; + }; /** * Gets a claim token by its ID. * @param fractionId The ID of the claim token. * @returns A Promise that resolves to the claim token. */ - fractionById = async (fractionId: string) => - this.graphClient.ClaimTokenById({ + fractionById = async (fractionId: string) => { + const query = ClaimTokenByIdDocument; + const variables: ClaimTokenByIdQueryVariables = { claimTokenId: fractionId, - }); + }; + return (await execute(query, variables, { graphName: this._graphName })) as ClaimTokenByIdQuery; + }; } diff --git a/sdk/src/storage.ts b/sdk/src/storage.ts index fb2606e2..3bf2fdbe 100644 --- a/sdk/src/storage.ts +++ b/sdk/src/storage.ts @@ -13,9 +13,8 @@ import { MalformedDataError, StorageError, } from "./types"; -import logger from "./utils/logger"; +import { logger, getFromIPFS } from "./utils"; import { getNftStorageToken, getWeb3StorageToken } from "./utils/config"; -import fetchers from "./utils/fetchers"; /** * A class that provides storage functionality for Hypercerts. @@ -30,7 +29,7 @@ import fetchers from "./utils/fetchers"; * const storage = new HypercertsStorage({ nftStorageToken: 'your-nft-storage-token', web3StorageToken: 'your-web3-storage-token' }); * const metadata = await storage.getMetadata('your-hypercert-id'); */ -export default class HypercertsStorage implements HypercertStorageInterface { +export class HypercertsStorage implements HypercertStorageInterface { /** Whether the storage is read-only. */ readonly: boolean = true; /** The NFT storage client. */ @@ -113,7 +112,7 @@ export default class HypercertsStorage implements HypercertStorageInterface { * @throws {MalformedDataError} Will throw a `MalformedDataError` if the retrieved data is invalid. */ public async getMetadata(cidOrIpfsUri: string): Promise { - const res = await fetchers.getFromIPFS(cidOrIpfsUri); + const res = await getFromIPFS(cidOrIpfsUri); const validation = validateMetaData(res); if (!validation.valid) { @@ -193,6 +192,6 @@ export default class HypercertsStorage implements HypercertStorageInterface { */ // TODO: replace current temporary fix of just using NFT.Storage IPFS gateway - return await fetchers.getFromIPFS(cidOrIpfsUri); + return await getFromIPFS(cidOrIpfsUri); } } diff --git a/sdk/src/types/client.ts b/sdk/src/types/client.ts index 0dd1082d..e5ba5c5e 100644 --- a/sdk/src/types/client.ts +++ b/sdk/src/types/client.ts @@ -3,11 +3,12 @@ import { PartialTypedDataConfig } from "@ethereum-attestation-service/eas-sdk"; // @ts-ignore import { CIDString } from "nft.storage"; -import HypercertIndexer from "../indexer"; +import { HypercertIndexer } from "../indexer"; import { AllowlistEntry, TransferRestrictions } from "./hypercerts"; import { HypercertMetadata } from "./metadata"; -import { ByteArray, Chain, Hex, PublicClient, WalletClient, Abi } from "viem"; +import { ByteArray, Chain, Hex, PublicClient, WalletClient, GetContractReturnType } from "viem"; +import { HypercertMinterAbi } from "@hypercerts-org/contracts"; export type SupportedChainIds = 5 | 10 | 42220 | 11155111; export type SupportedOverrides = { @@ -120,7 +121,7 @@ export interface HypercertClientState { storage: HypercertStorageInterface; /** The indexer used by the client. */ indexer: HypercertIndexer; - contract: { abi: Abi; address?: `0x${string}` }; + contract: GetContractReturnType; } /** diff --git a/sdk/src/utils/adapters.ts b/sdk/src/utils/adapters.ts index 6108b01a..89f25fe3 100644 --- a/sdk/src/utils/adapters.ts +++ b/sdk/src/utils/adapters.ts @@ -1,6 +1,6 @@ import { providers } from "ethers"; import { PublicClient, HttpTransport, WalletClient } from "viem"; -import logger from "./logger"; +import { logger } from "./logger"; import { Signer, TypedDataSigner } from "@ethersproject/abstract-signer"; /** diff --git a/sdk/src/utils/allowlist.ts b/sdk/src/utils/allowlist.ts index 634c5eab..a0f840e2 100644 --- a/sdk/src/utils/allowlist.ts +++ b/sdk/src/utils/allowlist.ts @@ -1,9 +1,9 @@ import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; -import fetchers from "./fetchers"; -import logger from "./logger"; +import { getFromIPFS } from "./fetchers"; +import { logger } from "./logger"; const getMerkleTreeFromIPFS = async (cidOrIpfsUri: string) => { - const data = await fetchers.getFromIPFS(cidOrIpfsUri); + const data = await getFromIPFS(cidOrIpfsUri); const allowlist = typeof data === "string" ? data : undefined; if (!allowlist) { @@ -43,4 +43,4 @@ const getProofsFromAllowlist = async (cidOrIpfsUri: string, account: `0x${string } }; -export default { getProofsFromAllowlist }; +export { getProofsFromAllowlist }; diff --git a/sdk/src/utils/config.ts b/sdk/src/utils/config.ts index cbc9c70a..5d873cc7 100644 --- a/sdk/src/utils/config.ts +++ b/sdk/src/utils/config.ts @@ -9,7 +9,7 @@ import { SupportedChainIds, UnsupportedChainError, } from "../types"; -import logger from "./logger"; +import { logger } from "./logger"; import { createPublicClient, http, isAddress } from "viem"; import { deployments } from "../../src"; diff --git a/sdk/src/utils/fetchers.ts b/sdk/src/utils/fetchers.ts index 41d9003a..6b0144a6 100644 --- a/sdk/src/utils/fetchers.ts +++ b/sdk/src/utils/fetchers.ts @@ -1,5 +1,5 @@ import { StorageError } from "../types/errors"; -import logger from "./logger"; +import { logger } from "./logger"; import axios from "axios"; /** @@ -44,4 +44,4 @@ const getWeb3StorageGatewayUri = (cidOrIpfsUri: string) => { return WEB3_STORAGE_IPFS_GATEWAY.replace("{cid}", getCid(cidOrIpfsUri)); }; -export default { getFromIPFS }; +export { getFromIPFS }; diff --git a/sdk/src/utils/index.ts b/sdk/src/utils/index.ts index d4dccf7b..23ae4c46 100644 --- a/sdk/src/utils/index.ts +++ b/sdk/src/utils/index.ts @@ -1,7 +1,15 @@ import { walletClientToSigner, publicClientToProvider } from "./adapters"; -import allowlist from "./allowlist"; -import fetchers from "./fetchers"; +import { getProofsFromAllowlist } from "./allowlist"; +import { getFromIPFS } from "./fetchers"; import { formatHypercertData } from "./formatter"; +import { logger } from "./logger"; -export { walletClientToSigner, publicClientToProvider, allowlist, fetchers, formatHypercertData }; +export { + walletClientToSigner, + publicClientToProvider, + getProofsFromAllowlist, + logger, + getFromIPFS, + formatHypercertData, +}; diff --git a/sdk/src/utils/logger.ts b/sdk/src/utils/logger.ts index e2615697..2e4680ff 100644 --- a/sdk/src/utils/logger.ts +++ b/sdk/src/utils/logger.ts @@ -49,4 +49,4 @@ const logger = { }, }; -export default logger; +export { logger }; diff --git a/sdk/src/utils/resolvers.ts b/sdk/src/utils/resolvers.ts index c00838ee..7e096e05 100644 --- a/sdk/src/utils/resolvers.ts +++ b/sdk/src/utils/resolvers.ts @@ -1,6 +1,6 @@ import { Resolvers } from "../../.graphclient"; -export const resolvers: Resolvers = { +const resolvers: Resolvers = { Claim: { graphName: (root, args, context) => root.graphName || context.graphName || "hypercerts-testnet", // The value we provide in the config }, @@ -8,3 +8,5 @@ export const resolvers: Resolvers = { graphName: (root, args, context) => root.graphName || context.graphName || "hypercerts-testnet", // The value we provide in the config }, }; + +export { resolvers }; diff --git a/sdk/test/client.test.ts b/sdk/test/client.test.ts index 6f9e124e..260791f6 100644 --- a/sdk/test/client.test.ts +++ b/sdk/test/client.test.ts @@ -1,3 +1,5 @@ +import { describe, it, afterAll } from "vitest"; + import { expect } from "chai"; import sinon from "sinon"; diff --git a/sdk/test/client/allowlist.minting.test.ts b/sdk/test/client/allowlist.minting.test.ts index fdd398ec..c9cbce48 100644 --- a/sdk/test/client/allowlist.minting.test.ts +++ b/sdk/test/client/allowlist.minting.test.ts @@ -1,12 +1,16 @@ +import { describe, it, beforeEach, afterAll } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; + import sinon from "sinon"; -import { expect } from "@jest/globals"; -import { HypercertClient } from "../../src"; -import HypercertsStorage from "../../src/storage"; +import { HypercertClient, HypercertsStorage } from "../../src"; import { MalformedDataError, MintingError, TransferRestrictions } from "../../src/types"; import { getAllowlist, getFormattedMetadata, publicClient, walletClient, mockDataSets } from "../helpers"; import { HypercertMinterAbi } from "@hypercerts-org/contracts"; -import { encodeFunctionResult, isHex, parseAbi, stringToHex } from "viem"; +import { encodeFunctionResult, isHex, stringToHex } from "viem"; + +chai.use(assertionsCount); describe("Allows for minting claims from an allowlist", () => { const { hypercertData, hypercertMetadata } = mockDataSets; @@ -26,24 +30,26 @@ describe("Allows for minting claims from an allowlist", () => { let writeSpy = sinon.stub(walletClient, "writeContract"); const mintClaimFromAllowlistResult = encodeFunctionResult({ - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, functionName: "mintClaimFromAllowlist", result: [], }); const batchMintClaimFromAllowlistResult = encodeFunctionResult({ - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, functionName: "batchMintClaimsFromAllowlists", result: [], }); const mintClaimResult = encodeFunctionResult({ - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, functionName: "createAllowlist", result: [], }); beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); + readSpy.resetBehavior(); readSpy.resetHistory(); @@ -67,14 +73,15 @@ describe("Allows for minting claims from an allowlist", () => { const hash = await client.createAllowlist(allowlist, metaData, totalUnits, TransferRestrictions.FromCreatorOnly); - expect(isHex(hash)).toBeTruthy(); - expect(metaDataStub.callCount).toBe(1); - expect(dataStub.callCount).toBe(1); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(1); + expect(isHex(hash)).to.be.true; + expect(metaDataStub.callCount).to.eq(1); + expect(dataStub.callCount).to.eq(1); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(1); }); it("should not create an allowlist if the total units mismatch", async () => { + chai.Assertion.expectAssertions(8); const { allowlist, totalUnits } = getAllowlist(); const metaData = getFormattedMetadata(); @@ -82,24 +89,24 @@ describe("Allows for minting claims from an allowlist", () => { try { hash = await client.createAllowlist(allowlist, metaData, totalUnits + 1n, TransferRestrictions.FromCreatorOnly); } catch (e) { - expect(e instanceof MalformedDataError).toBeTruthy(); + expect(e).to.be.instanceOf(MalformedDataError); const error = e as MalformedDataError; - expect(error.message).toBe("Allowlist validation failed"); - expect(error.payload).toEqual({ + expect(error.message).to.be.eq("Allowlist validation failed"); + expect(error.payload).to.deep.eq({ units: "Total units in allowlist must match total units [expected: 11, got: 10]", }); } - expect(hash).toBeUndefined(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(0); - expect.assertions(8); + expect(hash).to.be.undefined; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(0); }); it("should not create an allowlist if the allowlist is empty", async () => { + chai.Assertion.expectAssertions(8); const { allowlist, totalUnits } = getAllowlist(); const metaData = getFormattedMetadata(); @@ -110,26 +117,26 @@ describe("Allows for minting claims from an allowlist", () => { try { hash = await client.createAllowlist(allowlist, metaData, totalUnits, TransferRestrictions.FromCreatorOnly); } catch (e) { - expect(e instanceof MalformedDataError).toBeTruthy(); + expect(e).to.be.instanceOf(MalformedDataError); const error = e as MalformedDataError; - expect(error.message).toBe("Allowlist validation failed"); - expect(error.payload).toEqual({ + expect(error.message).to.be.eq("Allowlist validation failed"); + expect(error.payload).to.deep.eq({ units: "Total units in allowlist must match total units [expected: 10, got: 9]", }); } - expect(hash).toBeUndefined(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(0); - expect.assertions(8); + expect(hash).to.be.undefined; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(0); }); }); describe("Mint single fraction", () => { it("should allow to mint a claim from an allowlist without the root", async () => { + chai.Assertion.expectAssertions(5); const { allowlist, merkleTree } = getAllowlist({ size: 1 }); writeSpy = writeSpy.resolves(mintClaimFromAllowlistResult); @@ -140,15 +147,15 @@ describe("Allows for minting claims from an allowlist", () => { merkleTree.getProof([allowlist[0].address, allowlist[0].units.toString()]) as `0x${string}`[], ); - expect(isHex(hash)).toBeTruthy(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(1); - expect.assertions(5); + expect(isHex(hash)).to.be.true; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(1); }); it("should allow to mint a claim from an allowlist with a correct root", async () => { + chai.Assertion.expectAssertions(5); const { allowlist, merkleTree } = getAllowlist({ size: 1, address: userAddress }); writeSpy = writeSpy.resolves(mintClaimFromAllowlistResult); @@ -160,15 +167,15 @@ describe("Allows for minting claims from an allowlist", () => { merkleTree.root as `0x${string}`, ); - expect(isHex(hash)).toBeTruthy(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(1); - expect.assertions(5); + expect(isHex(hash)).to.be.true; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(1); }); it("should not allow to mint a claim from an allowlist with an incorrect root", async () => { + chai.Assertion.expectAssertions(8); const { allowlist, merkleTree } = getAllowlist({ size: 1, address: userAddress }); const mockRoot = stringToHex("MOCK_ROOT", { size: 32 }); @@ -182,27 +189,27 @@ describe("Allows for minting claims from an allowlist", () => { mockRoot, ); } catch (e) { - expect(e instanceof MintingError).toBeTruthy(); + expect(e instanceof MintingError).to.be.true; const error = e as MintingError; - expect(error.message).toBe("Merkle proof verification failed"); - expect(error.payload).toEqual({ + expect(error.message).to.eq("Merkle proof verification failed"); + expect(error.payload).to.deep.eq({ root: mockRoot, proof: merkleTree.getProof([allowlist[0].address, allowlist[0].units.toString()]), }); } - expect(hash).toBeUndefined(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(0); - expect.assertions(8); + expect(hash).to.be.undefined; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(0); }); }); describe("Batch mint fractions", () => { it("should allow to batch mint a claim from an allowlist without the root", async () => { + chai.Assertion.expectAssertions(5); const firstList = getAllowlist({ size: 1 }); const secondList = getAllowlist({ size: 1, units: 42n }); @@ -222,15 +229,15 @@ describe("Allows for minting claims from an allowlist", () => { [firstProofs, secondProofs] as `0x${string}`[][], ); - expect(isHex(hash)).toBeTruthy(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(1); - expect.assertions(5); + expect(isHex(hash)).to.be.true; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(1); }); it("should allow to mint a claim from an allowlist with a correct root", async () => { + chai.Assertion.expectAssertions(5); const firstList = getAllowlist({ size: 1, address: userAddress }); const secondList = getAllowlist({ size: 1, units: 42n, address: userAddress }); @@ -251,15 +258,15 @@ describe("Allows for minting claims from an allowlist", () => { [firstList.merkleTree.root, secondList.merkleTree.root] as `0x${string}`[], ); - expect(isHex(hash)).toBeTruthy(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(1); - expect.assertions(5); + expect(isHex(hash)).to.be.true; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(1); }); it("should not allow to mint a claim from an allowlist with an incorrect root", async () => { + chai.Assertion.expectAssertions(8); const firstList = getAllowlist({ size: 1, address: userAddress }); const secondList = getAllowlist({ size: 1, units: 42n, address: userAddress }); @@ -284,22 +291,21 @@ describe("Allows for minting claims from an allowlist", () => { [firstList.merkleTree.root as `0x${string}`, mockRoot], ); } catch (e) { - expect(e instanceof MintingError).toBeTruthy(); + expect(e instanceof MintingError).to.be.true; const error = e as MintingError; - expect(error.message).toBe("Merkle proof verification failed"); - expect(error.payload).toEqual({ + expect(error.message).to.eq("Merkle proof verification failed"); + expect(error.payload).to.deep.eq({ root: mockRoot, proof: secondProofs, }); } - expect(hash).toBeUndefined(); - expect(metaDataStub.callCount).toBe(0); - expect(dataStub.callCount).toBe(0); - expect(readSpy.callCount).toBe(0); - expect(writeSpy.callCount).toBe(0); - expect.assertions(8); + expect(hash).to.be.undefined; + expect(metaDataStub.callCount).to.eq(0); + expect(dataStub.callCount).to.eq(0); + expect(readSpy.callCount).to.eq(0); + expect(writeSpy.callCount).to.eq(0); }); }); }); diff --git a/sdk/test/client/burn.test.ts b/sdk/test/client/burn.test.ts index 64b2d877..06c1b1f7 100644 --- a/sdk/test/client/burn.test.ts +++ b/sdk/test/client/burn.test.ts @@ -1,10 +1,16 @@ -import HypercertClient from "../../src/client"; +import { describe, it, beforeEach, afterAll } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; + +import { HypercertClient } from "../../src/client"; import { walletClient, publicClient } from "../helpers"; import { ContractFunctionExecutionError, isHex, toHex } from "viem"; import sinon from "sinon"; import { faker } from "@faker-js/faker"; import { ClientError } from "../../src"; +chai.use(assertionsCount); + describe("burn fraction tokens in HypercertClient", () => { const wallet = walletClient; const userAddress = wallet.account?.address; @@ -22,6 +28,8 @@ describe("burn fraction tokens in HypercertClient", () => { let writeSpy = sinon.stub(walletClient, "writeContract"); beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); + readSpy.resetBehavior(); readSpy.resetHistory(); @@ -38,45 +46,45 @@ describe("burn fraction tokens in HypercertClient", () => { writeSpy = writeSpy.resolves(toHex(420)); - expect(client.readonly).toBe(false); + expect(client.readonly).to.be.false; const hash = await client.burnClaimFraction(fractionId); - console.log(hash); //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(isHex(hash)).toBeTruthy(); - expect(readSpy.callCount).toBe(1); - expect(writeSpy.callCount).toBe(1); + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(1); + expect(writeSpy.callCount).to.eq(1); }); it("throws on burning fraction not owned by signer", async () => { + chai.Assertion.expectAssertions(6); readSpy = readSpy.resolves(faker.finance.ethereumAddress()); - expect(client.readonly).toBe(false); + expect(client.readonly).to.be.false; let hash; try { hash = await client.burnClaimFraction(fractionId); } catch (e) { - expect(e instanceof ClientError).toBeTruthy(); + expect(e).to.be.instanceOf(ClientError); const error = e as ClientError; - expect(error.message).toBe("Claim is not owned by the signer"); + expect(error.message).to.eq("Claim is not owned by the signer"); } //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(hash).toBeUndefined(); - expect(readSpy.callCount).toBe(1); - expect(writeSpy.callCount).toBe(0); - expect.assertions(6); + expect(hash).to.be.undefined; + expect(readSpy.callCount).to.eq(1); + expect(writeSpy.callCount).to.eq(0); }); it("allows for a hypercert fraction to be burned with override params", async () => { + chai.Assertion.expectAssertions(6); readSpy = readSpy.resolves(userAddress); writeSpy = writeSpy.resolves(toHex(420)); - expect(client.readonly).toBe(false); + expect(client.readonly).to.be.false; let noHash; @@ -84,17 +92,15 @@ describe("burn fraction tokens in HypercertClient", () => { noHash = await client.burnClaimFraction(fractionId, { gasLimit: "FALSE_VALUE" as unknown as bigint }); expect.fail("should have thrown on incorrect gasLimit value"); } catch (e) { - expect(e instanceof ContractFunctionExecutionError).toBeTruthy(); + expect(e).to.be.instanceOf(ContractFunctionExecutionError); } const hash = await client.burnClaimFraction(fractionId, { gasLimit: 12300000n }); //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(noHash).toBeUndefined(); - - expect(isHex(hash)).toBeTrue(); - expect(readSpy.callCount).toBe(2); - expect(writeSpy.callCount).toBe(1); - expect.assertions(6); + expect(noHash).to.be.undefined; + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(1); }); }); diff --git a/sdk/test/client/minting.test.ts b/sdk/test/client/minting.test.ts index 1136704d..4fbd29fa 100644 --- a/sdk/test/client/minting.test.ts +++ b/sdk/test/client/minting.test.ts @@ -1,18 +1,22 @@ -import { expect } from "chai"; +import { describe, it, beforeEach, afterAll, beforeAll } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; import sinon from "sinon"; -import { ContractFunctionExecutionError, encodeFunctionResult, isHex, parseAbi } from "viem"; +import { ContractFunctionExecutionError, encodeFunctionResult, isHex, parseEther } from "viem"; -import HypercertClient from "../../src/client"; +import { HypercertClient } from "../../src/client"; import { HypercertMetadata, formatHypercertData } from "../../src"; import { MalformedDataError } from "../../src/types/errors"; import { TransferRestrictions } from "../../src/types/hypercerts"; -import { getRawInputData, publicClient, walletClient } from "../helpers"; +import { getRawInputData, publicClient, walletClient, testClient } from "../helpers"; import { HypercertMinterAbi } from "@hypercerts-org/contracts"; //eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { CIDString, NFTStorage } from "nft.storage"; +chai.use(assertionsCount); + describe("mintClaim in HypercertClient", () => { const mockCorrectMetadataCid = "testCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u" as CIDString; @@ -30,12 +34,18 @@ describe("mintClaim in HypercertClient", () => { let writeSpy = sinon.stub(walletClient, "writeContract"); const mintClaimResult = encodeFunctionResult({ - abi: parseAbi(HypercertMinterAbi), + abi: HypercertMinterAbi, functionName: "mintClaim", result: [], }); + beforeAll(async () => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await testClient.setBalance({ address: walletClient.account!.address, value: parseEther("1") }); + }); + beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); writeSpy.resetBehavior(); writeSpy.resetHistory(); diff --git a/sdk/test/client/split.merge.test.ts b/sdk/test/client/split.merge.test.ts index 57d19762..27498047 100644 --- a/sdk/test/client/split.merge.test.ts +++ b/sdk/test/client/split.merge.test.ts @@ -1,11 +1,19 @@ +import { describe, it, beforeEach, afterAll } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; + import sinon from "sinon"; -import HypercertClient from "../../src/client"; +import { HypercertClient } from "../../src/client"; import { publicClient, walletClient } from "../helpers"; import { ContractFunctionExecutionError, isHex, toHex } from "viem"; +import { ClientError } from "src"; +import { faker } from "@faker-js/faker"; + +chai.use(assertionsCount); -describe("splitClaimUnits in HypercertClient", () => { +describe("split and merge", () => { const wallet = walletClient; const userAddress = wallet.account?.address; @@ -22,197 +30,203 @@ describe("splitClaimUnits in HypercertClient", () => { const fractionId = 9868188640707215440437863615521278132232n; - beforeEach(async () => { - readSpy.resetBehavior(); - readSpy.resetHistory(); - - writeSpy.resetBehavior(); - writeSpy.resetHistory(); - }); - afterAll(() => { sinon.restore(); }); - it("allows for a hypercert fractions to be splitted over value", async () => { - readSpy = readSpy.onFirstCall().resolves(userAddress).onSecondCall().resolves(300n); - writeSpy = writeSpy.resolves(toHex(420)); + describe("splitFractionUnits in HypercertClient", () => { + beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); + readSpy.resetBehavior(); + readSpy.resetHistory(); + + writeSpy.resetBehavior(); + writeSpy.resetHistory(); + }); + + it("allows for a hypercert fractions to be splitted over value", async () => { + chai.Assertion.expectExpects(4); + readSpy = readSpy.onFirstCall().resolves(userAddress).onSecondCall().resolves(300n); + writeSpy = writeSpy.resolves(toHex(420)); + + expect(client.readonly).to.be.false; + + const hash = await client.splitFractionUnits(fractionId, [100n, 200n]); + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(1); + }); + + it("allows for a hypercert fractions to be splitted over value with override params", async () => { + chai.Assertion.expectExpects(5); + readSpy = readSpy + .onFirstCall() + .resolves(userAddress) + .onSecondCall() + .resolves(300n) + .onThirdCall() + .resolves(userAddress) + .onCall(3) + .resolves(300n); + + writeSpy = writeSpy.resolves(toHex(420)); + + expect(client.readonly).to.be.false; + + try { + await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: "FALSE_VALUE" as unknown as bigint }); + } catch (e) { + expect(e instanceof ContractFunctionExecutionError).to.be.true; + } + + const hash = await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: 12300000n }); + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(4); + expect(writeSpy.callCount).to.eq(1); + }); + + it("throws on splitting with incorrect new total value", async () => { + chai.Assertion.expectExpects(4); + readSpy = readSpy + .onFirstCall() + .resolves(userAddress) // ownerOf + .onSecondCall() + .resolves(300n) // unitsOf + .onThirdCall() + .resolves(userAddress) + .onCall(3) + .resolves(300n); + + expect(client.readonly).to.be.false; + + try { + await client.splitFractionUnits(fractionId, [100n, 777n]); + } catch (e) { + expect(e instanceof ClientError).to.be.true; + + const error = e as ClientError; + expect(error.message).to.be.eq("Sum of fractions is not equal to the total units"); + } + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + // Owner + // UnitsOf + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(0); + }); + + it("throws on splitting fractions not owned by signer", async () => { + chai.Assertion.expectExpects(4); + readSpy = readSpy.onFirstCall().resolves(faker.finance.ethereumAddress()).onSecondCall().resolves(300n); // unitsOf; // ownerOf + + expect(client.readonly).to.be.false; + + try { + await client.splitFractionUnits(fractionId, [100n, 200n]); + } catch (e) { + expect(e instanceof ClientError).to.be.true; + + const error = e as ClientError; + expect(error.message).to.be.eq("Claim is not owned by the signer"); + } + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + // Owner + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(0); + }); + }); - expect(client.readonly).toBe(false); + describe("mergeFractionUnits in HypercertClient", () => { + beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); + readSpy.resetBehavior(); + readSpy.resetHistory(); - const hash = await client.splitFractionUnits(fractionId, [100n, 200n]); + writeSpy.resetBehavior(); + writeSpy.resetHistory(); + }); - //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(isHex(hash)).toBeTruthy(); - expect(readSpy.callCount).toBe(2); - expect(writeSpy.callCount).toBe(1); - expect.assertions(4); - }); + it("allows for hypercert fractions to merge value", async () => { + chai.Assertion.expectExpects(3); + readSpy = readSpy + .onFirstCall() + .resolves(userAddress) // ownerOf + .onSecondCall() + .resolves(userAddress) // unitsOf + .onThirdCall() + .resolves(userAddress); - it("allows for a hypercert fractions to be splitted over value with override params", async () => { - readSpy = readSpy - .onFirstCall() - .resolves(userAddress) - .onSecondCall() - .resolves(300n) - .onThirdCall() - .resolves(userAddress) - .onCall(3) - .resolves(300n); - - writeSpy = writeSpy.resolves(toHex(420)); - - expect(client.readonly).toBe(false); - - try { - await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: "FALSE_VALUE" as unknown as bigint }); - } catch (e) { - expect(e instanceof ContractFunctionExecutionError).toBeTruthy(); - } - - const hash = await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: 12300000n }); - - //TODO determine underlying calls and mock those out. Some are provider simulation calls - expect(isHex(hash)).toBeTruthy(); - expect(readSpy.callCount).toBe(4); - expect(writeSpy.callCount).toBe(1); - expect.assertions(5); - }); + writeSpy = writeSpy.resolves(toHex(420)); - // it("throws on splitting with incorrect new total value", async () => { - // const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); - // await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); - // await mockMinter.mock["unitsOf(uint256)"].withArgs(fractionId).returns(42); - - // const client = new HypercertClient({ - // chainId: 5, - // operator: walletClient, - // contractAddress: mockMinter.address, - // }); - // expect(client.readonly).toBe(false); - - // try { - // await client.splitClaimUnits(fractionId, [100n, 200n]); - // } catch (e) { - // expect(e instanceof ClientError).toBeTruthy(); - - // const error = e as ClientError; - // expect(error.message).toBe("Sum of fractions is not equal to the total units"); - // } - - // //TODO determine underlying calls and mock those out. Some are provider simulation calls - // // Owner - // // UnitsOf - // expect(provider.callHistory.length).toBe(5); - // expect.assertions(4); - // }); - - // it("throws on splitting fractions not owned by signer", async () => { - // const otherUser = await provider.getWallets()[1].getAddress(); - // const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); - // await mockMinter.mock.ownerOf.withArgs(fractionId).returns(otherUser); - - // const client = new HypercertClient({ - // chainId: 5, - // operator: walletClient, - // contractAddress: mockMinter.address, - // }); - // expect(client.readonly).toBe(false); - - // try { - // await client.splitClaimUnits(fractionId, [100n, 200n]); - // } catch (e) { - // expect(e instanceof ClientError).toBeTruthy(); - - // const error = e as ClientError; - // expect(error.message).toBe("Claim is not owned by the signer"); - // } - - // //TODO determine underlying calls and mock those out. Some are provider simulation calls - // // Owner - // expect(provider.callHistory.length).toBe(3); - // expect.assertions(4); - // }); -}); + expect(client.readonly).to.be.false; + + const hash = await client.mergeFractionUnits([fractionId, fractionId + 1n]); + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(1); + }); + + it("allows for hypercert fractions to merge value with override params", async () => { + chai.Assertion.expectExpects(7); + + readSpy = readSpy.resolves(userAddress); // ownerOf + + writeSpy = writeSpy.resolves(toHex(420)); -// describe("mergeClaimUnits in HypercertClient", () => { -// const provider = testClient; -// const wallet = walletClient; -// const fractionId = 9868188640707215440437863615521278132232n; -// const userAddress = wallet.account.address; - -// it("allows for hypercert fractions to merge value", async () => { -// const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); -// await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); -// await mockMinter.mock.ownerOf.withArgs(fractionId + 1n).returns(userAddress); -// await mockMinter.mock["mergeFractions(address,uint256[])"] -// .withArgs(userAddress, [fractionId, fractionId + 1n]) -// .returns(); - -// const client = new HypercertClient({ -// chainId: 5, -// operator: walletClient, -// contractAddress: mockMinter.address, -// }); -// expect(client.readonly).toBe(false); - -// await client.mergeClaimUnits([fractionId, fractionId + 1n]); - -// //TODO determine underlying calls and mock those out. Some are provider simulation calls -// expect(provider.callHistory.length).toBe(7); -// }, 10000); - -// it("allows for hypercert fractions to merge value with override params", async () => { -// const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); -// await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); -// await mockMinter.mock.ownerOf.withArgs(fractionId + 1n).returns(userAddress); -// await mockMinter.mock["mergeFractions(address,uint256[])"] -// .withArgs(userAddress, [fractionId, fractionId + 1n]) -// .returns(); - -// const client = new HypercertClient({ -// chainId: 5, -// operator: walletClient, -// contractAddress: mockMinter.address, -// }); -// expect(client.readonly).toBe(false); - -// try { -// await client.mergeClaimUnits([fractionId, fractionId + 1n], { gasLimit: "FALSE_VALUE" as unknown as bigint }); -// } catch (e) { -// expect((e as Error).message).toMatch(/invalid BigNumber string/); -// } - -// await client.mergeClaimUnits([fractionId, fractionId + 1n], { gasLimit: 12300000n }); - -// //TODO determine underlying calls and mock those out. Some are provider simulation calls -// expect(provider.callHistory.length).toBe(9); -// }, 10000); - -// it("throws on splitting fractions not owned by signer", async () => { -// const otherUser = await provider.getWallets()[1].getAddress(); - -// const mockMinter = await deployMockContract(wallet, HypercertMinterAbi); -// await mockMinter.mock.ownerOf.withArgs(fractionId).returns(userAddress); -// await mockMinter.mock.ownerOf.withArgs(fractionId + 1n).returns(otherUser); - -// const client = new HypercertClient({ -// chainId: 5, -// operator: walletClient, -// contractAddress: mockMinter.address, -// }); -// expect(client.readonly).toBe(false); - -// try { -// await client.mergeClaimUnits([fractionId, fractionId + 1n]); -// } catch (e) { -// expect(e instanceof ClientError).toBeTruthy(); - -// const error = e as ClientError; -// expect(error.message).toBe("One or more claims are not owned by the signer"); -// } - -// //TODO determine underlying calls and mock those out. Some are provider simulation calls -// expect(provider.callHistory.length).toBe(5); -// }); -// }); + expect(client.readonly).to.be.false; + + let hash; + + try { + hash = await client.mergeFractionUnits([fractionId, fractionId + 1n], { + gasLimit: "FALSE_VALUE" as unknown as bigint, + }); + } catch (e) { + console.log(e); + // https://github.com/wevm/viem/issues/1275 + expect(e instanceof Error).to.be.true; + + // const error = e as ClientError; + // expect(error.message).to.be.eq(/invalid BigNumber string/); + expect(isHex(hash)).to.be.false; + } + + hash = await client.mergeFractionUnits([fractionId, fractionId + 1n], { gasLimit: 12300000n }); + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + + expect(isHex(hash)).to.be.true; + expect(readSpy.callCount).to.eq(4); + expect(writeSpy.callCount).to.eq(1); + }); + + it("throws on splitting fractions not owned by signer", async () => { + chai.Assertion.expectExpects(3); + readSpy = readSpy.onFirstCall().resolves(userAddress).onSecondCall().resolves(faker.finance.ethereumAddress()); // ownerOf + + expect(client.readonly).to.be.false; + + let hash; + try { + hash = await client.mergeFractionUnits([fractionId, fractionId + 1n]); + } catch (e) { + expect(e instanceof ClientError).to.be.true; + + const error = e as ClientError; + expect(error.message).to.be.eq("One or more fractions are not owned by the signer"); + } + + //TODO determine underlying calls and mock those out. Some are provider simulation calls + expect(isHex(hash)).to.be.false; + expect(readSpy.callCount).to.eq(2); + expect(writeSpy.callCount).to.eq(0); + }); + }); +}); diff --git a/sdk/test/evaluations/evaluator.test.ts b/sdk/test/evaluations/evaluator.test.ts index d79d531f..5e7c3864 100644 --- a/sdk/test/evaluations/evaluator.test.ts +++ b/sdk/test/evaluations/evaluator.test.ts @@ -1,11 +1,15 @@ -import { expect } from "@jest/globals"; +import { describe, it, afterAll, beforeEach } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; import sinon from "sinon"; -import HypercertEvaluator from "../../src/evaluations"; +import { HypercertEvaluator } from "../../src/evaluations"; import { MalformedDataError, StorageError } from "../../src/types/errors"; import { HypercertEvaluationSchema } from "../../src/types/evaluation"; import { getEvaluationData, publicClient, walletClient } from "../helpers"; +chai.use(assertionsCount); + describe("HypercertEvaluator", () => { const signer = walletClient.account; const evaluator = new HypercertEvaluator({ @@ -24,6 +28,8 @@ describe("HypercertEvaluator", () => { describe("submitEvaluation", () => { it("should throw an error for unexpected evaluation source", async () => { + chai.Assertion.expectAssertions(2); + const evaluation = { creator: signer?.address, evaluationSource: { @@ -38,15 +44,15 @@ describe("HypercertEvaluator", () => { try { await evaluator.submitEvaluation(evaluation as HypercertEvaluationSchema); } catch (e) { - expect(e).toBeInstanceOf(Error); + expect(e).to.be.instanceOf(Error); const error = e as StorageError; - expect(error.message).toEqual(`Unexpected evaluation source: ${evaluation.evaluationSource.toString()}`); + expect(error.message).to.eq(`Unexpected evaluation source: ${evaluation.evaluationSource.toString()}`); } - - expect.assertions(2); }); it("should throw an error for invalid creator address", async () => { + chai.Assertion.expectAssertions(2); + const evaluation = { creator: "bob", }; @@ -54,15 +60,15 @@ describe("HypercertEvaluator", () => { try { await evaluator.submitEvaluation(evaluation as HypercertEvaluationSchema); } catch (e) { - expect(e).toBeInstanceOf(MalformedDataError); + expect(e).to.be.instanceOf(MalformedDataError); const error = e as MalformedDataError; - expect(error.message).toEqual(`Invalid creator address: ${evaluation.creator.toString()}`); + expect(error.message).to.be.eq(`Invalid creator address: ${evaluation.creator.toString()}`); } - - expect.assertions(2); }); it("should throw an error for readonly storage", async () => { + chai.Assertion.expectAssertions(2); + const evaluation: HypercertEvaluationSchema = getEvaluationData({ creator: signer?.address }); const readonlyEvaluator = new HypercertEvaluator({ @@ -75,11 +81,10 @@ describe("HypercertEvaluator", () => { await readonlyEvaluator.submitEvaluation(evaluation); } catch (e) { const error = e as Error; - expect(error).toBeInstanceOf(Error); - expect(error.message).toMatch(/Unexpected evaluation source/); + expect(error).to.be.instanceOf(Error); + expect(error.message).to.match(/Unexpected evaluation source/); } - expect.assertions(2); sinon.restore(); }); }); diff --git a/sdk/test/indexer.test.ts b/sdk/test/indexer.test.ts index 71c12b13..1d6b3f24 100644 --- a/sdk/test/indexer.test.ts +++ b/sdk/test/indexer.test.ts @@ -1,17 +1,22 @@ +import { describe, it } from "vitest"; + import { expect } from "chai"; -import HypercertsIndexer from "../src/indexer"; +import { HypercertIndexer } from "../src/indexer"; describe("HypercertsIndexer", () => { it("should be able to create a new instance without valid graphName", () => { - const indexer = new HypercertsIndexer({}); + const indexer = new HypercertIndexer({ graphName: "hypercerts-testnet" }); - expect(indexer).to.be.an.instanceOf(HypercertsIndexer); + expect(indexer).to.be.an.instanceOf(HypercertIndexer); }); it("should be able to create a new instance with valid graphName", () => { - const indexer = new HypercertsIndexer({ graphUrl: "https://api.thegraph.com/subgraphs/name/hypercerts-testnet" }); + const indexer = new HypercertIndexer({ + graphName: "hypercerts-testnet", + graphUrl: "https://api.thegraph.com/subgraphs/name/hypercerts-testnet", + }); - expect(indexer).to.be.an.instanceOf(HypercertsIndexer); + expect(indexer).to.be.an.instanceOf(HypercertIndexer); }); }); diff --git a/sdk/test/indexer/queries.test.ts b/sdk/test/indexer/queries.test.ts index 01a9340b..27096d01 100644 --- a/sdk/test/indexer/queries.test.ts +++ b/sdk/test/indexer/queries.test.ts @@ -1,37 +1,32 @@ -import { jest } from "@jest/globals"; - -import { - ClaimByIdQuery, - ClaimTokenByIdQuery, - ClaimTokensByClaimQuery, - ClaimTokensByOwnerQuery, - ClaimsByOwnerQuery, - RecentClaimsQuery, -} from "../../.graphclient/index.js"; -import HypercertIndexer from "../../src/indexer.js"; -import { defaultQueryParams } from "../../src/indexer/utils.js"; +import { describe, it, beforeEach, afterEach, afterAll, vi, expect } from "vitest"; + +import { HypercertIndexer } from "../../src/indexer"; +import { defaultQueryParams } from "../../src/indexer/utils"; describe("HypercertIndexer", () => { let indexer: HypercertIndexer; beforeEach(() => { - indexer = new HypercertIndexer({ graphUrl: "https://api.thegraph.com/subgraphs/name/hypercerts-testnet" }); + indexer = new HypercertIndexer({ + graphName: "hypercerts-testnet", + graphUrl: "https://api.thegraph.com/subgraphs/name/hypercerts-testnet", + }); }); afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); afterAll(() => { - jest.resetAllMocks(); + vi.resetAllMocks(); }); it("should call graphClient.ClaimsByOwner with the correct parameters", async () => { const owner = "0x1234567890123456789012345678901234567890"; const params = defaultQueryParams; - const mockResponse: ClaimsByOwnerQuery = { claims: [] }; + const mockResponse = { claims: [] }; - const spy = jest.spyOn(indexer, "claimsByOwner").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "claimsByOwner").mockResolvedValue(mockResponse); const result = await indexer.claimsByOwner(owner, params); @@ -42,9 +37,9 @@ describe("HypercertIndexer", () => { it("should call graphClient.ClaimById with the correct parameters", async () => { const id = "0x1234567890123456789012345678901234567890123456789012345678901234"; - const mockResponse: ClaimByIdQuery = { claim: null }; + const mockResponse = { claim: null }; - const spy = jest.spyOn(indexer, "claimById").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "claimById").mockResolvedValue(mockResponse); const result = await indexer.claimById(id); @@ -55,9 +50,9 @@ describe("HypercertIndexer", () => { it("should call graphClient.RecentClaims with the correct parameters", async () => { const params = defaultQueryParams; - const mockResponse: RecentClaimsQuery = { claims: [] }; + const mockResponse = { claims: [] }; - const spy = jest.spyOn(indexer, "firstClaims").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "firstClaims").mockResolvedValue(mockResponse); const result = await indexer.firstClaims(params); @@ -69,9 +64,9 @@ describe("HypercertIndexer", () => { it("should call graphClient.ClaimTokensByOwner with the correct parameters", async () => { const owner = "0x1234567890123456789012345678901234567890"; const params = defaultQueryParams; - const mockResponse: ClaimTokensByOwnerQuery = { claimTokens: [] }; + const mockResponse = { claimTokens: [] }; - const spy = jest.spyOn(indexer, "fractionsByOwner").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "fractionsByOwner").mockResolvedValue(mockResponse); const result = await indexer.fractionsByOwner(owner, params); @@ -83,9 +78,9 @@ describe("HypercertIndexer", () => { it("should call graphClient.ClaimTokensByClaim with the correct parameters", async () => { const claimId = "0x1234567890123456789012345678901234567890123456789012345678901234"; const params = defaultQueryParams; - const mockResponse: ClaimTokensByClaimQuery = { claimTokens: [] }; + const mockResponse = { claimTokens: [] }; - const spy = jest.spyOn(indexer, "fractionsByClaim").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "fractionsByClaim").mockResolvedValue(mockResponse); const result = await indexer.fractionsByClaim(claimId, params); @@ -96,9 +91,9 @@ describe("HypercertIndexer", () => { it("should call graphClient.ClaimTokenById with the correct parameters", async () => { const fractionId = "0x1234567890123456789012345678901234567890123456789012345678901234"; - const mockResponse: ClaimTokenByIdQuery = { claimToken: null }; + const mockResponse = { claimToken: null }; - const spy = jest.spyOn(indexer, "fractionById").mockResolvedValue(mockResponse); + const spy = vi.spyOn(indexer, "fractionById").mockResolvedValue(mockResponse); const result = await indexer.fractionById(fractionId); expect(spy).toHaveBeenCalledWith(fractionId); diff --git a/sdk/test/setup-env.ts b/sdk/test/setup-env.ts index 49d24ea3..aa5bf440 100644 --- a/sdk/test/setup-env.ts +++ b/sdk/test/setup-env.ts @@ -1,10 +1,9 @@ import dotenv from "dotenv"; import { startProxy } from "@viem/anvil"; -import fetchMock from "jest-fetch-mock"; +// import fetchMock from "jest-fetch-mock"; -fetchMock.enableMocks(); +// fetchMock.enableMocks(); -fetchMock.enableMocks(); dotenv.config({ path: "./.env" }); const reloadEnv = () => { diff --git a/sdk/test/storage.test.ts b/sdk/test/storage.test.ts index 110da473..f79d0f2c 100644 --- a/sdk/test/storage.test.ts +++ b/sdk/test/storage.test.ts @@ -1,7 +1,9 @@ +import { describe, it, afterAll } from "vitest"; + import { expect } from "chai"; import { HypercertMetadata } from "../src"; -import HypercertsStorage from "../src/storage"; +import { HypercertsStorage } from "../src/storage"; import { StorageError } from "../src/types/errors"; import { reloadEnv } from "./setup-env"; diff --git a/sdk/test/storage/nft.storage.test.ts b/sdk/test/storage/nft.storage.test.ts index c78d96a5..60b9ec86 100644 --- a/sdk/test/storage/nft.storage.test.ts +++ b/sdk/test/storage/nft.storage.test.ts @@ -1,23 +1,24 @@ -import { jest } from "@jest/globals"; +import { describe, it, afterEach, afterAll, vi } from "vitest"; +import chai, { expect } from "chai"; +import assertionsCount from "chai-assertions-count"; + //eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { NFTStorage } from "nft.storage"; -import HypercertsStorage from "../../src/storage"; +import { HypercertsStorage } from "../../src/storage"; import { MalformedDataError } from "../../src/types/errors"; import { HypercertMetadata } from "../../src/types/metadata"; import { getFormattedMetadata, mockDataSets } from "../helpers"; -import fetchers from "../../src/utils/fetchers"; import sinon from "sinon"; +import axios from "axios"; + +chai.use(assertionsCount); describe("NFT.Storage Client", () => { const { hypercertMetadata } = mockDataSets; - const storeBlobMock = jest.spyOn(NFTStorage.prototype, "storeBlob").mockImplementation((_: unknown, __?: unknown) => { - return Promise.resolve(hypercertMetadata.cid); - }); - - const ipfsFetcherMock = sinon.stub(fetchers, "getFromIPFS"); + const storeBlobMock = sinon.stub(NFTStorage.prototype, "storeBlob").resolves(hypercertMetadata.cid); const storage = new HypercertsStorage({ nftStorageToken: process.env.NFT_STORAGE_TOKEN, @@ -25,11 +26,13 @@ describe("NFT.Storage Client", () => { }); afterEach(() => { - jest.clearAllMocks(); + chai.Assertion.resetAssertsCheck(); + vi.clearAllMocks(); + sinon.restore(); }); afterAll(() => { - jest.resetAllMocks(); + vi.resetAllMocks(); sinon.resetBehavior(); }); @@ -38,44 +41,42 @@ describe("NFT.Storage Client", () => { */ it("Smoke test - add metadata", async () => { await storage.storeMetadata(getFormattedMetadata()); - expect(storeBlobMock).toHaveBeenCalledTimes(1); + expect(storeBlobMock.callCount).to.eq(1); }); it("Smoke test - get metadata", async () => { - ipfsFetcherMock.returns(Promise.resolve(hypercertMetadata.data)); + sinon.stub(axios, "get").resolves(Promise.resolve({ data: hypercertMetadata.data })); const res = await storage.getMetadata(hypercertMetadata.cid); - expect(res).toMatchObject(hypercertMetadata.data); + expect(res).to.deep.eq(hypercertMetadata.data); }); it("Throws when trying to store incorrect metadata", async () => { + chai.Assertion.expectAssertions(2); // storeData try { await storage.storeMetadata({ data: "false" } as unknown as HypercertMetadata); } catch (e) { - expect(e instanceof MalformedDataError).toBeTruthy(); + expect(e).to.be.an.instanceOf(MalformedDataError); const error = e as MalformedDataError; - expect(error.message).toBe("Invalid metadata."); + expect(error.message).to.eq("Invalid metadata."); } - - expect.assertions(2); }); it("Throws when trying to fetch incorrect metadata", async () => { + chai.Assertion.expectAssertions(2); const incorrectCID = "incorrect-cid"; + sinon.stub(axios, "get").resolves(Promise.resolve({ data: "false" })); - ipfsFetcherMock.resolves({ data: "false" }); // storeData try { await storage.getMetadata(incorrectCID); } catch (e) { - expect(e instanceof MalformedDataError).toBeTruthy(); + expect(e).to.be.an.instanceOf(MalformedDataError); const error = e as MalformedDataError; - expect(error.message).toBe(`Invalid metadata at ${incorrectCID}`); + expect(error.message).to.be.eq(`Invalid metadata at ${incorrectCID}`); } - - expect.assertions(2); }); }); diff --git a/sdk/test/storage/web3.storage.test.ts b/sdk/test/storage/web3.storage.test.ts index a3d5af8e..4210cd5c 100644 --- a/sdk/test/storage/web3.storage.test.ts +++ b/sdk/test/storage/web3.storage.test.ts @@ -1,21 +1,18 @@ -import { jest } from "@jest/globals"; +import { describe, it, afterEach, afterAll } from "vitest"; +import { expect } from "chai"; //eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { Web3Storage } from "web3.storage"; -import HypercertsStorage from "../../src/storage"; +import { HypercertsStorage } from "../../src/storage"; import { mockDataSets } from "../helpers"; -import fetchers from "../../src/utils/fetchers"; +import axios from "axios"; import sinon from "sinon"; describe("Web3.Storage Client", () => { const { hypercertData, hypercertMetadata } = mockDataSets; - const storeBlobMock = jest.spyOn(Web3Storage.prototype, "put").mockImplementation((_: unknown, __?: unknown) => { - return Promise.resolve(hypercertMetadata.cid); - }); - - const ipfsFetcherMock = sinon.stub(fetchers, "getFromIPFS"); + const storeBlobMock = sinon.stub(Web3Storage.prototype, "put").resolves(hypercertMetadata.cid); const storage = new HypercertsStorage({ nftStorageToken: process.env.NFT_STORAGE_TOKEN, @@ -23,11 +20,10 @@ describe("Web3.Storage Client", () => { }); afterEach(() => { - jest.clearAllMocks(); + sinon.restore(); }); afterAll(() => { - jest.resetAllMocks(); sinon.resetBehavior(); }); @@ -36,13 +32,13 @@ describe("Web3.Storage Client", () => { */ it("Smoke test - add data", async () => { await storage.storeData(hypercertData.data); - expect(storeBlobMock).toHaveBeenCalledTimes(1); + expect(storeBlobMock.callCount).to.eq(1); }); it("Smoke test - get data", async () => { - ipfsFetcherMock.returns(Promise.resolve(hypercertData.data)); + sinon.stub(axios, "get").resolves(Promise.resolve({ data: hypercertData.data })); const res = await storage.getData(hypercertData.cid); - expect(res).toMatchObject(hypercertData.data); + expect(res).to.deep.eq(hypercertData.data); }); }); diff --git a/sdk/test/types/errors.test.ts b/sdk/test/types/errors.test.ts index de5e66c5..a5538bb2 100644 --- a/sdk/test/types/errors.test.ts +++ b/sdk/test/types/errors.test.ts @@ -1,3 +1,5 @@ +import { describe, it } from "vitest"; + import { expect } from "chai"; import { @@ -10,7 +12,7 @@ import { UnsupportedChainError, } from "../../src/types/errors"; -describe.only("Error types", () => { +describe("Error types", () => { it("has ClientError", () => { const error = new ClientError("Client error", { foo: "bar" }); error.message = "Client error"; diff --git a/sdk/test/utils/allowlist.test.ts b/sdk/test/utils/allowlist.test.ts index 61fa4f90..444422e4 100644 --- a/sdk/test/utils/allowlist.test.ts +++ b/sdk/test/utils/allowlist.test.ts @@ -1,11 +1,13 @@ +import { describe, it, afterEach, afterAll } from "vitest"; + import chai, { expect } from "chai"; import chaiSubset from "chai-subset"; import sinon from "sinon"; import { faker } from "@faker-js/faker"; import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; -import fetchers from "../../src/utils/fetchers"; -import allowlistUtils from "../../src/utils/allowlist"; +import { getProofsFromAllowlist } from "../../src/utils"; +import axios from "axios"; chai.use(chaiSubset); @@ -23,18 +25,20 @@ const createAllowlist = async () => { }; describe("Fetchers", () => { - const ipfsFetcherMock = sinon.stub(fetchers, "getFromIPFS"); - afterEach(() => { sinon.restore(); }); + afterAll(() => { + sinon.resetBehavior(); + }); + it("Proof: should return valid proof and root", async () => { const { allowlist, tree } = await createAllowlist(); - const stub = ipfsFetcherMock.resolves(Promise.resolve(JSON.stringify(tree.dump()))); + const stub = sinon.stub(axios, "get").resolves(Promise.resolve({ data: JSON.stringify(tree.dump()) })); - const res = await allowlistUtils.getProofsFromAllowlist("test", allowlist[0].address); + const res = await getProofsFromAllowlist("test", allowlist[0].address); expect(res).to.containSubset({ proof: tree.getProof(0), diff --git a/sdk/test/utils/config.test.ts b/sdk/test/utils/config.test.ts index f27c44e5..b3e7d32f 100644 --- a/sdk/test/utils/config.test.ts +++ b/sdk/test/utils/config.test.ts @@ -1,3 +1,5 @@ +import { describe, it, afterEach } from "vitest"; + import chai, { expect } from "chai"; import chaiSubset from "chai-subset"; import sinon from "sinon"; diff --git a/sdk/test/utils/errors.test.ts b/sdk/test/utils/errors.test.ts index 46f07a1b..a4509d23 100644 --- a/sdk/test/utils/errors.test.ts +++ b/sdk/test/utils/errors.test.ts @@ -1,3 +1,5 @@ +import { describe, it } from "vitest"; + import { expect } from "chai"; import { FetchError, MalformedDataError, UnsupportedChainError } from "../../src/types/errors"; diff --git a/sdk/test/utils/fetchers.test.ts b/sdk/test/utils/fetchers.test.ts index cd868b6b..a3586444 100644 --- a/sdk/test/utils/fetchers.test.ts +++ b/sdk/test/utils/fetchers.test.ts @@ -1,8 +1,10 @@ +import { describe, it, afterEach } from "vitest"; + import chai, { expect } from "chai"; import chaiSubset from "chai-subset"; import sinon from "sinon"; -import fetchers from "../../src/utils/fetchers"; +import { getFromIPFS } from "../../src/utils/fetchers"; import axios from "axios"; chai.use(chaiSubset); @@ -16,7 +18,7 @@ describe("Fetchers", () => { const validResponse = { data: "TEST_PASSED" }; const axiosStub = sinon.stub(axios, "get").resolves(Promise.resolve(validResponse)); - const res = await fetchers.getFromIPFS("test"); + const res = await getFromIPFS("test"); expect(res).to.equal(validResponse.data); expect(axiosStub.calledOnce).to.be.true; }); @@ -30,7 +32,7 @@ describe("Fetchers", () => { .onSecondCall() .resolves(Promise.resolve(validResponse)); - const res = await fetchers.getFromIPFS("test"); + const res = await getFromIPFS("test"); expect(res).to.equal(validResponse.data); expect(axiosStub.calledTwice).to.be.true; }); diff --git a/sdk/test/utils/formatter.test.ts b/sdk/test/utils/formatter.test.ts index 15cd6c5e..f492d5cc 100644 --- a/sdk/test/utils/formatter.test.ts +++ b/sdk/test/utils/formatter.test.ts @@ -1,3 +1,4 @@ +import { describe, it } from "vitest"; import { expect } from "chai"; import { formatHypercertData } from "../../src"; diff --git a/sdk/test/utils/logger.test.ts b/sdk/test/utils/logger.test.ts index 06fe768f..55a5caca 100644 --- a/sdk/test/utils/logger.test.ts +++ b/sdk/test/utils/logger.test.ts @@ -1,6 +1,7 @@ +import { describe, it, beforeEach, afterEach, beforeAll, afterAll } from "vitest"; import sinon from "sinon"; -import logger from "../../src/utils/logger.js"; +import { logger } from "../../src/utils"; describe("logger", () => { const stubError = sinon.stub(console, "error"); diff --git a/sdk/test/validator.test.ts b/sdk/test/validator.test.ts index 210fdd1e..8ae0f44f 100644 --- a/sdk/test/validator.test.ts +++ b/sdk/test/validator.test.ts @@ -1,3 +1,5 @@ +import { describe, it } from "vitest"; + import { expect } from "chai"; import { validateClaimData, validateMetaData } from "../src"; @@ -20,7 +22,6 @@ describe("Validate claim test", () => { it("checking default claimdata", () => { const result = validateClaimData(hypercertData.data); - console.log(result); expect(result.valid).to.be.true; const invalidResult = validateClaimData({} as HypercertClaimdata); diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index 2c208243..942fa312 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -22,5 +22,5 @@ "skipLibCheck": true }, "exclude": ["node_modules"], - "include": ["./src/*.ts", "./src/**/*", "./test/*.ts", "./test/**/*.ts", "global.d.ts"] + "include": ["./src/*.ts", "./src/**/*", "./test/*.ts", "./test/**/*.ts"] } diff --git a/sdk/vitest.config.ts b/sdk/vitest.config.ts new file mode 100644 index 00000000..8e1d367d --- /dev/null +++ b/sdk/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + globalSetup: "./test/setup-env.ts", + }, +}); From 1cc481fe5b3ffa3625c85c2940bb837e4d9625bf Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Wed, 6 Dec 2023 23:42:41 +0100 Subject: [PATCH 039/118] Feat/add batch transfer method to client methods (#1215) * feat(transfer): add method to client and type * feat(err): simulation and tx error handlers * feat(err): error handling test * chore(pack): dep cleanup and updates --- pnpm-lock.yaml | 4552 +++++++++++-------- sdk/.graphclient/index.ts | 3 +- sdk/package.json | 67 +- sdk/src/client.ts | 204 +- sdk/src/types/client.ts | 61 +- sdk/src/types/errors.ts | 22 + sdk/src/utils/errors.ts | 45 +- sdk/src/utils/index.ts | 3 + sdk/test/client/burn.test.ts | 7 +- sdk/test/client/minting.test.ts | 8 +- sdk/test/client/split.merge.test.ts | 6 +- sdk/test/utils/errors.test.ts | 92 +- sdk/tsconfig.json | 4 +- sdk/{vitest.config.ts => vitest.config.mts} | 0 14 files changed, 3082 insertions(+), 1992 deletions(-) rename sdk/{vitest.config.ts => vitest.config.mts} (100%) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 298843ec..6d5ff8b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 1.39.0 '@synthetixio/synpress': specifier: ^3.7.1 - version: 3.7.1(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(webpack@5.89.0) + version: 3.7.1(@babel/core@7.23.5)(@babel/preset-env@7.23.5)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(webpack@5.89.0) husky: specifier: ^8.0.3 version: 8.0.3 @@ -56,7 +56,7 @@ importers: version: 3.0.4(ethers@6.8.0)(hardhat@2.18.3) '@nomicfoundation/hardhat-toolbox': specifier: ^3.0.0 - version: 3.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.2)(@nomicfoundation/hardhat-ethers@3.0.4)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomicfoundation/hardhat-verify@1.1.1)(@typechain/ethers-v6@0.4.3)(@typechain/hardhat@8.0.3)(@types/chai@4.3.9)(@types/mocha@9.1.0)(@types/node@18.18.7)(chai@4.3.10)(ethers@6.8.0)(hardhat-gas-reporter@1.0.9)(hardhat@2.18.3)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.2)(typescript@4.9.5) + version: 3.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.2)(@nomicfoundation/hardhat-ethers@3.0.4)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomicfoundation/hardhat-verify@1.1.1)(@typechain/ethers-v6@0.4.3)(@typechain/hardhat@8.0.3)(@types/chai@4.3.11)(@types/mocha@9.1.0)(@types/node@18.18.7)(chai@4.3.10)(ethers@6.8.0)(hardhat-gas-reporter@1.0.9)(hardhat@2.18.3)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.2)(typescript@4.9.5) '@nomicfoundation/hardhat-viem': specifier: ^1.0.0 version: 1.0.0(hardhat@2.18.3)(typescript@4.9.5)(viem@1.18.9) @@ -149,7 +149,7 @@ importers: version: 6.1.0(rollup@4.1.4)(typescript@4.9.5) rollup-plugin-esbuild: specifier: ^6.1.0 - version: 6.1.0(esbuild@0.19.5)(rollup@4.1.4) + version: 6.1.0(esbuild@0.19.8)(rollup@4.1.4) rollup-plugin-node-polyfills: specifier: ^0.2.1 version: 0.2.1 @@ -325,7 +325,7 @@ importers: version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.33)(react@18.2.0) '@graphprotocol/client-cli': specifier: ^2.2.16 - version: 2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + version: 2.2.22(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': specifier: 1.0.0-alpha.2 version: 1.0.0-alpha.2(typescript@5.1.6) @@ -421,7 +421,7 @@ importers: version: 4.17.21 next: specifier: ^13.5.6 - version: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + version: 13.5.6(@babel/core@7.23.5)(react-dom@18.2.0)(react@18.2.0) papaparse: specifier: ^5.4.1 version: 5.4.1 @@ -541,8 +541,8 @@ importers: sdk: dependencies: '@ethereum-attestation-service/eas-sdk': - specifier: 1.2.2-beta.0 - version: 1.2.2-beta.0(ts-node@10.9.1)(typescript@5.1.6) + specifier: 1.3.7 + version: 1.3.7(ts-node@10.9.1)(typescript@5.3.2) '@ethersproject/abstract-signer': specifier: ^5.7.0 version: 5.7.0 @@ -551,40 +551,40 @@ importers: version: 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) '@graphprotocol/client-cli': specifier: ^3.0.0 - version: 3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + version: 3.0.0(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.1)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@graphprotocol/client-polling-live': specifier: ^2.0.0 - version: 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) + version: 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.1)(graphql@16.8.1) '@graphql-mesh/cache-localforage': - specifier: ^0.96.0 - version: 0.96.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + specifier: ^0.96.1 + version: 0.96.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/cross-helpers': specifier: ^0.4.1 version: 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/graphql': - specifier: ^0.96.0 - version: 0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) + specifier: ^0.96.1 + version: 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': - specifier: ^0.96.13 - version: 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) + specifier: ^0.97.2 + version: 0.97.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.97.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': - specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + specifier: ^0.96.1 + version: 0.96.1(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/runtime': - specifier: ^0.96.12 - version: 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + specifier: ^0.97.2 + version: 0.97.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/store': - specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + specifier: ^0.96.1 + version: 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': - specifier: ^0.95.7 - version: 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + specifier: ^0.96.1 + version: 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': specifier: ^3.2.0 version: 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': specifier: 1.0.0-alpha.6 - version: 1.0.0-alpha.6(ts-node@10.9.1)(typescript@5.1.6) + version: 1.0.0-alpha.6(ts-node@10.9.1)(typescript@5.3.2) '@openzeppelin/merkle-tree': specifier: ^1.0.5 version: 1.0.5 @@ -595,8 +595,8 @@ importers: specifier: ^8.11.2 version: 8.12.0 axios: - specifier: ^1.2.2 - version: 1.5.1(debug@4.3.4) + specifier: ^1.6.2 + version: 1.6.2(debug@4.3.4) dotenv: specifier: ^16.0.3 version: 16.3.1 @@ -606,37 +606,31 @@ importers: graphql: specifier: ^16.6.0 version: 16.8.1 - ipfs-core: - specifier: ^0.17.0 - version: 0.17.0(uint8arraylist@2.4.3) loglevel: specifier: ^1.8.1 version: 1.8.1 - mime: - specifier: ^3.0.0 - version: 3.0.0 nft.storage: specifier: ^7.1.1 version: 7.1.1(node-fetch@3.3.2) viem: specifier: ^1.19.9 - version: 1.19.9(typescript@5.1.6)(zod@3.22.4) + version: 1.19.9(typescript@5.3.2)(zod@3.22.4) web3.storage: specifier: ^4.5.5 version: 4.5.5(node-fetch@3.3.2) devDependencies: '@babel/core': - specifier: ^7.23.2 - version: 7.23.2 + specifier: ^7.23.5 + version: 7.23.5 '@babel/preset-env': - specifier: ^7.23.2 - version: 7.23.2(@babel/core@7.23.2) + specifier: ^7.23.5 + version: 7.23.5(@babel/core@7.23.5) '@babel/preset-typescript': - specifier: ^7.23.2 - version: 7.23.2(@babel/core@7.23.2) + specifier: ^7.23.3 + version: 7.23.3(@babel/core@7.23.5) '@faker-js/faker': - specifier: ^8.0.2 - version: 8.2.0 + specifier: ^8.3.1 + version: 8.3.1 '@rollup/plugin-commonjs': specifier: ^24.0.1 version: 24.1.0(rollup@3.29.4) @@ -647,29 +641,23 @@ importers: specifier: ^15.0.1 version: 15.2.3(rollup@3.29.4) '@types/chai': - specifier: ^4.3.4 - version: 4.3.9 + specifier: ^4.3.11 + version: 4.3.11 '@types/chai-subset': - specifier: ^1.3.3 - version: 1.3.4 - '@types/jest': - specifier: ^29.2.5 - version: 29.5.6 - '@types/mocha': - specifier: 9.1.0 - version: 9.1.0 + specifier: ^1.3.5 + version: 1.3.5 '@types/node': specifier: ^18.11.17 version: 18.18.7 '@types/sinon': - specifier: ^10.0.15 - version: 10.0.20 + specifier: ^17.0.2 + version: 17.0.2 '@viem/anvil': specifier: ^0.0.6 version: 0.0.6 abitype: - specifier: ^0.10.2 - version: 0.10.2(typescript@5.1.6)(zod@3.22.4) + specifier: ^0.10.3 + version: 0.10.3(typescript@5.3.2)(zod@3.22.4) chai: specifier: ^4.3.7 version: 4.3.10 @@ -680,17 +668,14 @@ importers: specifier: ^1.6.0 version: 1.6.0 esbuild: - specifier: ^0.17.10 - version: 0.17.19 - ethereum-waffle: - specifier: ^4.0.10 - version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.1.6) + specifier: ^0.19.8 + version: 0.19.8 it-all: - specifier: ^2.0.0 - version: 2.0.1 + specifier: ^3.0.4 + version: 3.0.4 json-schema-to-typescript: - specifier: ^12.0.0 - version: 12.0.0 + specifier: ^13.1.1 + version: 13.1.1 nyc: specifier: ^15.1.0 version: 15.1.0 @@ -701,47 +686,38 @@ importers: specifier: ^2.0.0 version: 2.0.0(rollup@3.29.4) rollup-plugin-dts: - specifier: ^5.2.0 - version: 5.3.1(rollup@3.29.4)(typescript@5.1.6) + specifier: ^6.1.0 + version: 6.1.0(rollup@3.29.4)(typescript@5.3.2) rollup-plugin-esbuild: - specifier: ^5.0.0 - version: 5.0.0(esbuild@0.17.19)(rollup@3.29.4) + specifier: ^6.1.0 + version: 6.1.0(esbuild@0.19.8)(rollup@3.29.4) rollup-plugin-node-polyfills: specifier: ^0.2.1 version: 0.2.1 - shx: - specifier: ^0.3.4 - version: 0.3.4 sinon: - specifier: ^15.2.0 - version: 15.2.0 - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@10.2.0) + specifier: ^17.0.1 + version: 17.0.1 + sinon-chai: + specifier: ^3.7.0 + version: 3.7.0(chai@4.3.10)(sinon@17.0.1) ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@18.18.7)(typescript@5.1.6) - tslib: - specifier: ^2.5.0 - version: 2.6.2 - tsx: - specifier: ^3.14.0 - version: 3.14.0 + version: 10.9.1(@types/node@18.18.7)(typescript@5.3.2) typedoc: - specifier: ^0.23.25 - version: 0.23.28(typescript@5.1.6) + specifier: ^0.25.4 + version: 0.25.4(typescript@5.3.2) typedoc-plugin-markdown: - specifier: ^3.14.0 - version: 3.17.0(typedoc@0.23.28) + specifier: ^3.17.1 + version: 3.17.1(typedoc@0.25.4) typedoc-plugin-missing-exports: specifier: ^2.0.0 - version: 2.1.0(typedoc@0.23.28) + version: 2.1.0(typedoc@0.25.4) typescript: - specifier: 5.1.6 - version: 5.1.6 + specifier: 5.3.2 + version: 5.3.2 vitest: - specifier: ^0.28.4 - version: 0.28.5 + specifier: ^1.0.1 + version: 1.0.1(@types/node@18.18.7) vendor/observabletreemap: dependencies: @@ -1002,13 +978,13 @@ packages: peerDependencies: graphql: '*' dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/generator': 7.23.0 '@babel/parser': 7.23.0 '@babel/runtime': 7.23.2 '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 - babel-preset-fbjs: 3.4.0(@babel/core@7.23.2) + babel-preset-fbjs: 3.4.0(@babel/core@7.23.5) chalk: 4.1.2 fb-watchman: 2.0.2 fbjs: 3.0.5 @@ -1068,18 +1044,30 @@ packages: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.20 + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 chalk: 2.4.2 /@babel/compat-data@7.23.2: resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} engines: {node: '>=6.9.0'} + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + /@babel/core@7.12.9: resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.0 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.12.9) '@babel/helpers': 7.23.2 @@ -1127,7 +1115,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) @@ -1143,6 +1131,29 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: false + + /@babel/core@7.23.5: + resolution: {integrity: sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) + '@babel/helpers': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color /@babel/generator@7.17.7: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} @@ -1162,6 +1173,15 @@ packages: '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 + /@babel/generator@7.23.5: + resolution: {integrity: sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -1200,6 +1220,41 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 + dev: false + + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.5): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin@7.23.5(@babel/core@7.23.5): + resolution: {integrity: sha512-QELlRWxSpgdwdJzSJn4WAhKC+hvw/AtHbbrIoncKHkhKKR/luAlKkgBDcri1EzWAo8f8VvYVryEHN4tax/V67A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} @@ -1211,6 +1266,18 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 + dev: false + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.5): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2): resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} @@ -1225,6 +1292,21 @@ packages: resolve: 1.22.8 transitivePeerDependencies: - supports-color + dev: false + + /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.5): + resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} @@ -1295,6 +1377,34 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 + dev: false + + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.5): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: false + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} @@ -1320,6 +1430,18 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 + dev: false + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.5): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} @@ -1331,6 +1453,18 @@ packages: '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 + dev: false + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.5): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} @@ -1354,6 +1488,10 @@ packages: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} @@ -1362,6 +1500,10 @@ packages: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + /@babel/helper-wrap-function@7.22.20: resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} @@ -1380,8 +1522,18 @@ packages: transitivePeerDependencies: - supports-color - /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + /@babel/helpers@7.23.5: + resolution: {integrity: sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 @@ -1403,6 +1555,13 @@ packages: dependencies: '@babel/types': 7.23.0 + /@babel/parser@7.23.5: + resolution: {integrity: sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.5 + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} engines: {node: '>=6.9.0'} @@ -1411,6 +1570,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} @@ -1422,66 +1591,88 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) + dev: false - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.2): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.5) + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.5): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.5) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.5) dev: false - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.2): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.5): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/core': 7.23.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-proposal-export-default-from@7.22.17(@babel/core@7.23.2): + /@babel/plugin-proposal-export-default-from@7.22.17(@babel/core@7.23.5): resolution: {integrity: sha512-cop/3quQBVvdz6X5SJC6AhUv3C9DrVTM06LUEXimEdWAhCSyOJIr9NiZDU9leHZ0/aiG0Sh7Zmvaku5TWYNgbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.23.5) dev: false - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.2): + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.5): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.5) dev: false - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.2): + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.5): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.5) dev: false /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9): @@ -1496,7 +1687,7 @@ packages: '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.12.9) dev: false - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.2): + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.5): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. @@ -1504,36 +1695,36 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.23.2 - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.5) dev: false - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.2): + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.5): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.5) dev: false - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.2): + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.5): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.5) dev: false /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): @@ -1543,6 +1734,15 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 + dev: false + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.5): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -1551,13 +1751,22 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.2): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.5): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.5): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1568,6 +1777,15 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.5): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -1577,6 +1795,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.5): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} @@ -1585,14 +1813,23 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false - /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.23.2): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.5): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -1603,14 +1840,23 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.5): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.23.2): + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -1622,6 +1868,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} @@ -1631,6 +1897,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} @@ -1639,6 +1915,15 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.5): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -1647,6 +1932,15 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.5): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-jsx@7.12.1(@babel/core@7.12.9): resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} @@ -1665,6 +1959,25 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -1673,6 +1986,15 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.5): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -1681,6 +2003,15 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.5): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -1689,6 +2020,15 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.5): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.12.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -1706,6 +2046,15 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.5): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -1714,6 +2063,15 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.5): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -1722,6 +2080,15 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.5): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -1731,6 +2098,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.5): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -1740,6 +2117,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.5): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} @@ -1749,6 +2136,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} @@ -1759,6 +2166,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.5): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} @@ -1768,6 +2186,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} @@ -1780,6 +2218,19 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.5) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.5) /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} @@ -1791,6 +2242,18 @@ packages: '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.5) /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} @@ -1800,6 +2263,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} @@ -1809,6 +2292,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.5): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} @@ -1819,6 +2322,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} @@ -1830,6 +2344,18 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.5) /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} @@ -1847,6 +2373,42 @@ packages: '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 + dev: false + + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.5): + resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: false + + /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.5): + resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} @@ -1857,6 +2419,28 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.15 + dev: false + + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: false + + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} @@ -1866,6 +2450,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.5): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} @@ -1876,6 +2480,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} @@ -1885,6 +2500,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} @@ -1895,6 +2520,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.5) /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} @@ -1905,6 +2541,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} @@ -1915,16 +2562,27 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) + dev: false - /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.5) + + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.5) dev: false /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): @@ -1935,6 +2593,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.5): + resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-for-of@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} @@ -1946,6 +2624,30 @@ packages: '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} @@ -1956,6 +2658,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.5) /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} @@ -1965,6 +2678,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} @@ -1975,6 +2708,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.5) /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} @@ -1984,6 +2728,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} @@ -1994,6 +2758,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} @@ -2005,16 +2780,53 @@ packages: '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.5): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: false - /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} + /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 @@ -2027,6 +2839,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} @@ -2037,6 +2860,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} @@ -2046,6 +2880,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} @@ -2056,6 +2900,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.5) /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} @@ -2066,6 +2921,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.5) /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} @@ -2079,6 +2945,20 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.5) /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} @@ -2089,6 +2969,28 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) + dev: false + + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} @@ -2099,6 +3001,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.5) /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} @@ -2110,6 +3023,18 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.5) /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.12.9): resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} @@ -2129,6 +3054,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.5): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} @@ -2139,6 +3084,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} @@ -2151,6 +3107,19 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.5): + resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.5) /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} @@ -2160,14 +3129,34 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -2181,6 +3170,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} @@ -2191,23 +3190,33 @@ packages: '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) dev: false - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.5) + dev: false + + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -2225,6 +3234,20 @@ packages: '@babel/types': 7.23.0 dev: false + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.5): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.5) + '@babel/types': 7.23.0 + dev: false + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} engines: {node: '>=6.9.0'} @@ -2236,6 +3259,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.2): resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} engines: {node: '>=6.9.0'} @@ -2245,6 +3279,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 + dev: false + + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} @@ -2254,6 +3299,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} @@ -2272,6 +3327,23 @@ packages: - supports-color dev: false + /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.23.5): + resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.5) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.5) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} engines: {node: '>=6.9.0'} @@ -2280,6 +3352,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} @@ -2290,6 +3382,28 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: false + + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: false + + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} @@ -2299,6 +3413,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} @@ -2308,6 +3432,26 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.5): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} @@ -2317,6 +3461,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} @@ -2329,6 +3483,19 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-typescript@7.23.5(@babel/core@7.23.5): + resolution: {integrity: sha512-2fMkXEJkrmwgu2Bsv1Saxgj30IXZdJ+84lQcKKI7sm719oXs0BBw2ZENKdJdR1PjWndgLCEBNXJOri0fk7RYQA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.5(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.5) /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.2): resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} @@ -2338,6 +3505,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} @@ -2348,6 +3525,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} @@ -2358,6 +3546,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} @@ -2368,6 +3567,17 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.22.5 /@babel/preset-env@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} @@ -2458,17 +3668,108 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: false + + /@babel/preset-env@7.23.5(@babel/core@7.23.5): + resolution: {integrity: sha512-0d/uxVD6tFGWXGDSfyMD1p2otoaKmu6+GD+NfAx0tMaH+dxORnp7T9TaVQ6mKyya7iBtCIVxHjWT7MuzzM9z+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.5) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.5) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.5) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-async-generator-functions': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.23.5) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-for-of': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.5) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.5) + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.5) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.5) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.5) + core-js-compat: 3.33.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - /@babel/preset-flow@7.22.15(@babel/core@7.23.2): + /@babel/preset-flow@7.22.15(@babel/core@7.23.5): resolution: {integrity: sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.5) dev: false /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): @@ -2480,6 +3781,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/types': 7.23.0 esutils: 2.0.3 + dev: false + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.5): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.0 + esutils: 2.0.3 /@babel/preset-react@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} @@ -2496,6 +3808,21 @@ packages: '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.2) dev: false + /@babel/preset-react@7.22.15(@babel/core@7.23.5): + resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.5) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.5) + dev: false + /@babel/preset-typescript@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==} engines: {node: '>=6.9.0'} @@ -2508,14 +3835,28 @@ packages: '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.2) + dev: false + + /@babel/preset-typescript@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-typescript': 7.23.5(@babel/core@7.23.5) - /@babel/register@7.22.15(@babel/core@7.23.2): + /@babel/register@7.22.15(@babel/core@7.23.5): resolution: {integrity: sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -2543,9 +3884,9 @@ packages: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 /@babel/traverse@7.17.3: resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} @@ -2569,7 +3910,7 @@ packages: resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.0 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 @@ -2582,6 +3923,23 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse@7.23.5: + resolution: {integrity: sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + /@babel/types@7.17.0: resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} engines: {node: '>=6.9.0'} @@ -2598,6 +3956,14 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@babel/types@7.23.5: + resolution: {integrity: sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + /@bcherny/json-schema-ref-parser@10.0.5-fork: resolution: {integrity: sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==} engines: {node: '>= 16'} @@ -3028,7 +4394,7 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@cypress/code-coverage@3.12.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0): + /@cypress/code-coverage@3.12.6(@babel/core@7.23.5)(@babel/preset-env@7.23.5)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0): resolution: {integrity: sha512-QeOB54dkxee8LKdbK9NqMinlMtzy60K2DexSvx4XZdrU52gut9Ukc7sUvRe44gK1yJFYno977Kx9miNIeYWVtA==} peerDependencies: '@babel/core': ^7.0.1 @@ -3037,10 +4403,10 @@ packages: cypress: '*' webpack: ^4 || ^5 dependencies: - '@babel/core': 7.23.2 - '@babel/preset-env': 7.23.2(@babel/core@7.23.2) - '@cypress/webpack-preprocessor': 6.0.0(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(webpack@5.89.0) - babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.89.0) + '@babel/core': 7.23.5 + '@babel/preset-env': 7.23.5(@babel/core@7.23.5) + '@cypress/webpack-preprocessor': 6.0.0(@babel/core@7.23.5)(@babel/preset-env@7.23.5)(babel-loader@9.1.3)(webpack@5.89.0) + babel-loader: 9.1.3(@babel/core@7.23.5)(webpack@5.89.0) chalk: 4.1.2 cypress: 12.17.4 dayjs: 1.11.10 @@ -3101,7 +4467,7 @@ packages: - webpack-cli dev: true - /@cypress/webpack-preprocessor@6.0.0(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(webpack@5.89.0): + /@cypress/webpack-preprocessor@6.0.0(@babel/core@7.23.5)(@babel/preset-env@7.23.5)(babel-loader@9.1.3)(webpack@5.89.0): resolution: {integrity: sha512-1AS1Et5CNPJii0+DdBZBS8e0hlM2BkBNmYRdZO4/16A3KS3em1sjPZtFw7jJF00m6DYAdB9iy6QW/lLZ2bN0gg==} peerDependencies: '@babel/core': ^7.0.1 @@ -3109,9 +4475,9 @@ packages: babel-loader: ^8.3 || ^9 webpack: ^4 || ^5 dependencies: - '@babel/core': 7.23.2 - '@babel/preset-env': 7.23.2(@babel/core@7.23.2) - babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.89.0) + '@babel/core': 7.23.5 + '@babel/preset-env': 7.23.5(@babel/core@7.23.5) + babel-loader: 9.1.3(@babel/core@7.23.5)(webpack@5.89.0) bluebird: 3.7.1 debug: 4.3.4(supports-color@8.1.1) lodash: 4.17.21 @@ -4155,22 +5521,6 @@ packages: resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} dev: false - /@ensdomains/ens@0.4.5: - resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} - deprecated: Please use @ensdomains/ens-contracts - dependencies: - bluebird: 3.7.2 - eth-ens-namehash: 2.0.8 - solc: 0.4.26 - testrpc: 0.0.1 - web3-utils: 1.10.3 - dev: true - - /@ensdomains/resolver@0.2.4: - resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} - deprecated: Please use @ensdomains/ens-contracts - dev: true - /@envelop/core@3.0.6: resolution: {integrity: sha512-06t1xCPXq6QFN7W1JUEf68aCwYN0OUDNAIoJe7bAqhaoa2vn7NCcuX1VHkJ/OWpmElUgCsRO6RiBbIru1in0Ig==} dependencies: @@ -4278,15 +5628,6 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -4296,8 +5637,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.5: - resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==} + /@esbuild/android-arm64@0.19.8: + resolution: {integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -4314,15 +5655,6 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.18.20: resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -4332,8 +5664,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.5: - resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==} + /@esbuild/android-arm@0.19.8: + resolution: {integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -4350,15 +5682,6 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.18.20: resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -4368,8 +5691,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.5: - resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==} + /@esbuild/android-x64@0.19.8: + resolution: {integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -4386,15 +5709,6 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.18.20: resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -4404,8 +5718,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.5: - resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==} + /@esbuild/darwin-arm64@0.19.8: + resolution: {integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -4422,15 +5736,6 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.18.20: resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -4440,8 +5745,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.5: - resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==} + /@esbuild/darwin-x64@0.19.8: + resolution: {integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -4458,15 +5763,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.18.20: resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -4476,8 +5772,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.5: - resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==} + /@esbuild/freebsd-arm64@0.19.8: + resolution: {integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -4494,15 +5790,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.18.20: resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -4512,8 +5799,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.5: - resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==} + /@esbuild/freebsd-x64@0.19.8: + resolution: {integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -4530,15 +5817,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.18.20: resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -4548,8 +5826,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.5: - resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==} + /@esbuild/linux-arm64@0.19.8: + resolution: {integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -4566,15 +5844,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.18.20: resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -4584,8 +5853,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.5: - resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==} + /@esbuild/linux-arm@0.19.8: + resolution: {integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -4602,15 +5871,6 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.18.20: resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -4620,8 +5880,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.5: - resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==} + /@esbuild/linux-ia32@0.19.8: + resolution: {integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -4638,15 +5898,6 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.17.19: - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.18.20: resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -4656,8 +5907,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.5: - resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==} + /@esbuild/linux-loong64@0.19.8: + resolution: {integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -4674,15 +5925,6 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.18.20: resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -4692,8 +5934,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.5: - resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==} + /@esbuild/linux-mips64el@0.19.8: + resolution: {integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -4710,15 +5952,6 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.18.20: resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -4728,8 +5961,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.5: - resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==} + /@esbuild/linux-ppc64@0.19.8: + resolution: {integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -4746,15 +5979,6 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.18.20: resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -4764,8 +5988,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.5: - resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==} + /@esbuild/linux-riscv64@0.19.8: + resolution: {integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -4782,15 +6006,6 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.18.20: resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -4800,8 +6015,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.5: - resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==} + /@esbuild/linux-s390x@0.19.8: + resolution: {integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -4818,15 +6033,6 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.18.20: resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -4836,8 +6042,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.5: - resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==} + /@esbuild/linux-x64@0.19.8: + resolution: {integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -4854,15 +6060,6 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.18.20: resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -4872,8 +6069,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.5: - resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==} + /@esbuild/netbsd-x64@0.19.8: + resolution: {integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -4890,15 +6087,6 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.18.20: resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -4908,8 +6096,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.5: - resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==} + /@esbuild/openbsd-x64@0.19.8: + resolution: {integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -4926,15 +6114,6 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.18.20: resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -4944,8 +6123,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.5: - resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==} + /@esbuild/sunos-x64@0.19.8: + resolution: {integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -4962,15 +6141,6 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.18.20: resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -4980,8 +6150,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.5: - resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==} + /@esbuild/win32-arm64@0.19.8: + resolution: {integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -4998,15 +6168,6 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.19: - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.18.20: resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -5016,8 +6177,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.5: - resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==} + /@esbuild/win32-ia32@0.19.8: + resolution: {integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -5034,15 +6195,6 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.18.20: resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -5052,8 +6204,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.5: - resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==} + /@esbuild/win32-x64@0.19.8: + resolution: {integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -5159,10 +6311,10 @@ packages: - utf-8-validate dev: true - /@ethereum-attestation-service/eas-contracts@1.2.0-beta.1(ts-node@10.9.1)(typescript@5.1.6): + /@ethereum-attestation-service/eas-contracts@1.2.0-beta.1(typescript@5.1.6): resolution: {integrity: sha512-NOicVFjm3UOY6HHmMPIpFTZJ7ieuETl7GRJyceW/CPPXxMMBBu9tf9eDVbVrDn6D7fYX3NMDIR39RoK5BhpWYA==} dependencies: - hardhat: 2.18.2(ts-node@10.9.1)(typescript@5.1.6) + hardhat: 2.18.2(typescript@5.1.6) transitivePeerDependencies: - bufferutil - supports-color @@ -5171,10 +6323,22 @@ packages: - utf-8-validate dev: false - /@ethereum-attestation-service/eas-sdk@1.2.2-beta.0(ts-node@10.9.1)(typescript@5.1.6): + /@ethereum-attestation-service/eas-contracts@1.3.7(ts-node@10.9.1)(typescript@5.3.2): + resolution: {integrity: sha512-msCKGDhqSjfkx0lbs0PPkf/Z6bWxaYT9ze/uLoRh1tM7W8N27mobX4g6AsjATqGC+eWHRfliK9eCwJQj7TU8WA==} + dependencies: + hardhat: 2.19.1(ts-node@10.9.1)(typescript@5.3.2) + transitivePeerDependencies: + - bufferutil + - supports-color + - ts-node + - typescript + - utf-8-validate + dev: false + + /@ethereum-attestation-service/eas-sdk@1.2.2-beta.0(typescript@5.1.6): resolution: {integrity: sha512-penkXiCKvHY8jN9UVV3B9IX001YnwWCNjbrBNE5e8Wy1rAzcPv7tqTBuvqXzjqmHfcASv7UFOIbfPEc5hd9mpA==} dependencies: - '@ethereum-attestation-service/eas-contracts': 1.2.0-beta.1(ts-node@10.9.1)(typescript@5.1.6) + '@ethereum-attestation-service/eas-contracts': 1.2.0-beta.1(typescript@5.1.6) ethers: 6.8.0 js-base64: 3.7.5 lodash: 4.17.21 @@ -5189,117 +6353,23 @@ packages: - utf-8-validate dev: false - /@ethereum-waffle/chai@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2): - resolution: {integrity: sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==} - engines: {node: '>=10.0'} - peerDependencies: - ethers: '*' + /@ethereum-attestation-service/eas-sdk@1.3.7(ts-node@10.9.1)(typescript@5.3.2): + resolution: {integrity: sha512-7dmy3w/hIeUYGTvkoFIo/JSviiTK8qhjr0BKf7qK+xSPYt9rW9Qksw1njqC5G3OXyp5teaXCH05v75NOASYoSQ==} dependencies: - '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) - debug: 4.3.4(supports-color@8.1.1) - ethers: 5.7.2 - json-bigint: 1.0.0 - transitivePeerDependencies: - - '@ensdomains/ens' - - '@ensdomains/resolver' - - supports-color - dev: true - - /@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@5.1.6): - resolution: {integrity: sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==} - engines: {node: '>=10.0'} - peerDependencies: - ethers: '*' - solc: '*' - typechain: ^8.0.0 - dependencies: - '@resolver-engine/imports': 0.3.3 - '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.1.6) - '@types/mkdirp': 0.5.2 - '@types/node-fetch': 2.6.8 - ethers: 5.7.2 - mkdirp: 0.5.6 - node-fetch: 2.7.0 - solc: 0.8.15 - typechain: 8.3.2(typescript@5.1.6) + '@ethereum-attestation-service/eas-contracts': 1.3.7(ts-node@10.9.1)(typescript@5.3.2) + ethers: 6.9.0 + js-base64: 3.7.5 + lodash: 4.17.21 + multiformats: 9.9.0 + pako: 2.1.0 + semver: 7.5.4 transitivePeerDependencies: - - '@ethersproject/abi' - - '@ethersproject/providers' - - encoding + - bufferutil - supports-color + - ts-node - typescript - dev: true - - /@ethereum-waffle/ens@4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2): - resolution: {integrity: sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==} - engines: {node: '>=10.0'} - peerDependencies: - '@ensdomains/ens': ^0.4.4 - '@ensdomains/resolver': ^0.2.4 - ethers: '*' - dependencies: - '@ensdomains/ens': 0.4.5 - '@ensdomains/resolver': 0.2.4 - ethers: 5.7.2 - dev: true - - /@ethereum-waffle/mock-contract@4.0.4(ethers@5.7.2): - resolution: {integrity: sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==} - engines: {node: '>=10.0'} - peerDependencies: - ethers: '*' - dependencies: - ethers: 5.7.2 - dev: true - - /@ethereum-waffle/provider@4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2): - resolution: {integrity: sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==} - engines: {node: '>=10.0'} - peerDependencies: - ethers: '*' - dependencies: - '@ethereum-waffle/ens': 4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) - '@ganache/ethereum-options': 0.1.4 - debug: 4.3.4(supports-color@8.1.1) - ethers: 5.7.2 - ganache: 7.4.3 - transitivePeerDependencies: - - '@ensdomains/ens' - - '@ensdomains/resolver' - - supports-color - dev: true - - /@ethereumjs/block@3.6.3: - resolution: {integrity: sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==} - dependencies: - '@ethereumjs/common': 2.6.5 - '@ethereumjs/tx': 3.5.2 - ethereumjs-util: 7.1.5 - merkle-patricia-tree: 4.2.4 - dev: true - - /@ethereumjs/blockchain@5.5.3: - resolution: {integrity: sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==} - dependencies: - '@ethereumjs/block': 3.6.3 - '@ethereumjs/common': 2.6.5 - '@ethereumjs/ethash': 1.1.0 - debug: 4.3.4(supports-color@8.1.1) - ethereumjs-util: 7.1.5 - level-mem: 5.0.1 - lru-cache: 5.1.1 - semaphore-async-await: 1.5.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@ethereumjs/common@2.6.0: - resolution: {integrity: sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==} - dependencies: - crc-32: 1.2.2 - ethereumjs-util: 7.1.5 - dev: true + - utf-8-validate + dev: false /@ethereumjs/common@2.6.5: resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} @@ -5308,29 +6378,12 @@ packages: ethereumjs-util: 7.1.5 dev: true - /@ethereumjs/ethash@1.1.0: - resolution: {integrity: sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==} - dependencies: - '@ethereumjs/block': 3.6.3 - '@types/levelup': 4.3.3 - buffer-xor: 2.0.2 - ethereumjs-util: 7.1.5 - miller-rabin: 4.0.1 - dev: true - /@ethereumjs/rlp@4.0.1: resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} engines: {node: '>=14'} hasBin: true dev: true - /@ethereumjs/tx@3.4.0: - resolution: {integrity: sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==} - dependencies: - '@ethereumjs/common': 2.6.5 - ethereumjs-util: 7.1.5 - dev: true - /@ethereumjs/tx@3.5.2: resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} dependencies: @@ -5347,25 +6400,6 @@ packages: micro-ftch: 0.3.1 dev: true - /@ethereumjs/vm@5.6.0: - resolution: {integrity: sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==} - dependencies: - '@ethereumjs/block': 3.6.3 - '@ethereumjs/blockchain': 5.5.3 - '@ethereumjs/common': 2.6.5 - '@ethereumjs/tx': 3.5.2 - async-eventemitter: 0.2.4 - core-js-pure: 3.33.1 - debug: 2.6.9 - ethereumjs-util: 7.1.5 - functional-red-black-tree: 1.0.1 - mcl-wasm: 0.7.9 - merkle-patricia-tree: 4.2.4 - rustbn.js: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - /@ethersproject/abi@5.0.7: resolution: {integrity: sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==} dependencies: @@ -5665,8 +6699,8 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@faker-js/faker@8.2.0: - resolution: {integrity: sha512-VacmzZqVxdWdf9y64lDOMZNDMM/FQdtM9IsaOPKOm2suYwEatb8VkdHqOzXcDnZbk7YDE2BmsJmy/2Hmkn563g==} + /@faker-js/faker@8.3.1: + resolution: {integrity: sha512-FdgpFxY6V6rLZE9mmIBb9hM0xpfvQOSNOLnzolzKwsE1DH+gC7lEKV1p1IbR0lAYyvYd5a4u3qWJzowUkw1bIw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} dev: true @@ -5723,66 +6757,6 @@ packages: ts-interface-checker: 0.1.13 dev: true - /@ganache/ethereum-address@0.1.4: - resolution: {integrity: sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==} - dependencies: - '@ganache/utils': 0.1.4 - dev: true - - /@ganache/ethereum-options@0.1.4: - resolution: {integrity: sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==} - dependencies: - '@ganache/ethereum-address': 0.1.4 - '@ganache/ethereum-utils': 0.1.4 - '@ganache/options': 0.1.4 - '@ganache/utils': 0.1.4 - bip39: 3.0.4 - seedrandom: 3.0.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@ganache/ethereum-utils@0.1.4: - resolution: {integrity: sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==} - dependencies: - '@ethereumjs/common': 2.6.0 - '@ethereumjs/tx': 3.4.0 - '@ethereumjs/vm': 5.6.0 - '@ganache/ethereum-address': 0.1.4 - '@ganache/rlp': 0.1.4 - '@ganache/utils': 0.1.4 - emittery: 0.10.0 - ethereumjs-abi: 0.6.8 - ethereumjs-util: 7.1.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@ganache/options@0.1.4: - resolution: {integrity: sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==} - dependencies: - '@ganache/utils': 0.1.4 - bip39: 3.0.4 - seedrandom: 3.0.5 - dev: true - - /@ganache/rlp@0.1.4: - resolution: {integrity: sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==} - dependencies: - '@ganache/utils': 0.1.4 - rlp: 2.2.6 - dev: true - - /@ganache/utils@0.1.4: - resolution: {integrity: sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==} - dependencies: - emittery: 0.10.0 - keccak: 3.0.1 - seedrandom: 3.0.5 - optionalDependencies: - '@trufflesuite/bigint-buffer': 1.1.9 - dev: true - /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} peerDependencies: @@ -5829,7 +6803,7 @@ packages: '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) @@ -5866,7 +6840,7 @@ packages: '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) @@ -5891,7 +6865,7 @@ packages: - '@graphql-mesh/utils' dev: false - /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): + /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): resolution: {integrity: sha512-mxqXKHK2lO+k4r02Q44n3qhd5dufo+SSDduD8zGUDBsYcRQAtQD9PwmXRHyUoB9nw4A+NC+CtVh+76fueXCG1w==} engines: {node: '>=16.0.0'} peerDependencies: @@ -5899,8 +6873,8 @@ packages: '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -5933,7 +6907,7 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-PIi8rFibYZVup+0jb08399RmbGF1ZrqUe6RXzLtKZBT57OWIMWwsFvdJyUAdr8Y8f0rrMn6A+Oy4nP1lf3hc1g==} hasBin: true peerDependencies: @@ -5944,7 +6918,7 @@ packages: '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1) '@graphprotocol/client-polling-live': 1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) - '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.5)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 @@ -5971,7 +6945,7 @@ packages: - utf-8-validate dev: false - /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.2)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.1)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-hTISbOzKavlDifBNsR6JqQMfdYwY7++hflPy+c3WHRrZ4OMoxFmW7ZuvaP6LvgKdJV77O8w9dnT/uxeHs6a90g==} engines: {node: '>=16.0.0'} hasBin: true @@ -5980,11 +6954,11 @@ packages: dependencies: '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 2.0.0(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) - '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1) - '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.1)(graphql@16.8.1) + '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.5)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -6039,7 +7013,7 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-polling-live@2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.0)(graphql@16.8.1): + /@graphprotocol/client-polling-live@2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.1)(graphql@16.8.1): resolution: {integrity: sha512-JQ0sKiFCX+ErR0fynBNUg/WDiVaaEndlS12fkgrFZrQA2vVpSyow9pW0nKMGVZJa4cN+VDskgwqK5BWXMvdeRA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6048,7 +7022,7 @@ packages: graphql: ^15.2.0 || ^16.0.0 dependencies: '@envelop/core': 3.0.6 - '@graphql-tools/merge': 9.0.0(graphql@16.8.1) + '@graphql-tools/merge': 9.0.1(graphql@16.8.1) '@repeaterjs/repeater': 3.0.4 graphql: 16.8.1 tslib: 2.6.2 @@ -6317,6 +7291,18 @@ packages: tslib: 2.6.0 dev: false + /@graphql-inspector/core@5.0.2(graphql@16.8.1): + resolution: {integrity: sha512-pXHPCggwLmgi5NACPPV4qyf2xW/sQONnu6ZqCAid3k/S2APmVYN4Z3OvxvLA12NFhzby5Sz5K4fRsId43cK8ww==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + dependency-graph: 0.11.0 + graphql: 16.8.1 + object-inspect: 1.12.3 + tslib: 2.6.2 + dev: false + /@graphql-mesh/cache-localforage@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-cY/LJ+XC8kiyPoLxqPAMlOAvaeB81CZafdadLNyNDFuu66qDiZqWTYPw/lnhp2nyeukC8o/P69oP7d2OqVaCZA==} peerDependencies: @@ -6348,23 +7334,23 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/cache-localforage@0.96.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-/6t3pQD9on2coxbUU5cIcW0EKzgB18SaHy24jADngLg5epF6aFAsu65riH8xa7WghmifBqN5EPC+SpTaeojBrw==} + /@graphql-mesh/cache-localforage@0.96.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-APpCFqFKyieyyUJ1gEmMvPmbjjiLAsw78S3NBhwfXXIu7UimlZoNQXx4LYtfkAeIcZaHY4nVBpc7W5qdha4biQ==} engines: {node: '>=16.0.0'} peerDependencies: - '@graphql-mesh/types': ^0.96.0 - '@graphql-mesh/utils': ^0.96.0 + '@graphql-mesh/types': ^0.96.1 + '@graphql-mesh/utils': ^0.96.1 graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 localforage: 1.10.0 tslib: 2.6.2 dev: false - /@graphql-mesh/cli@0.82.35(@babel/core@7.23.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphql-mesh/cli@0.82.35(@babel/core@7.23.5)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-5IuXpk+Zpg05u6qNPX19VzC5/HCiLdDRF6EPZ3ze57FIRgGA3YsB1CUGga6Ky3inalURYwx0kWqmdjbdKZYx1w==} hasBin: true peerDependencies: @@ -6376,7 +7362,7 @@ packages: '@graphql-codegen/typescript-generic-sdk': 3.1.0(graphql-tag@2.12.6)(graphql@16.8.1) '@graphql-codegen/typescript-operations': 3.0.4(graphql@16.8.1) '@graphql-codegen/typescript-resolvers': 3.2.1(graphql@16.8.1) - '@graphql-mesh/config': 0.93.1(@babel/core@7.23.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/config': 0.93.1(@babel/core@7.23.5)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/http': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -6386,7 +7372,7 @@ packages: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) ajv: 8.12.0 change-case: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.1.6) + cosmiconfig: 8.3.6(typescript@5.3.2) dnscache: 1.0.2 dotenv: 16.3.1 graphql: 16.8.1 @@ -6398,10 +7384,10 @@ packages: open: 7.4.2 pascal-case: 3.1.2 rimraf: 5.0.5 - ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.1.6) + ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.3.2) tsconfig-paths: 4.2.0 tslib: 2.6.2 - typescript: 5.1.6 + typescript: 5.3.2 ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: @@ -6418,7 +7404,7 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/config@0.93.1(@babel/core@7.23.2)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/config@0.93.1(@babel/core@7.23.5)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-g4omjuBBVPtyhEDeEa6uwfSSvUehV3zcwZVNbk+UJuFJEYPO4yBLsxfEZBpoeO6EriiPX2WnQyn5kiHbC3YTRA==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6439,7 +7425,7 @@ packages: '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/code-file-loader': 7.3.23(@babel/core@7.23.2)(graphql@16.8.1) + '@graphql-tools/code-file-loader': 7.3.23(@babel/core@7.23.5)(graphql@16.8.1) '@graphql-tools/graphql-file-loader': 7.5.17(graphql@16.8.1) '@graphql-tools/load': 7.8.14(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6512,7 +7498,7 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -6524,10 +7510,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -6577,23 +7563,23 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.96.0(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): - resolution: {integrity: sha512-jdPIFV/FXkGyKm8Buv+vpHt1Af0lt6+gpumwIlGb+h5JUwLZRkysHiXiUIFbFHVUn/cuoUGleKeewE9cBLwqVQ==} + /@graphql-mesh/graphql@0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): + resolution: {integrity: sha512-k4fIzduPcHlxEM0UpNkhfWZkWszHFgrpAoKVqp6wCqyw0AhcZ+LZXwI2TAc2nNPzWDlOTfEF1gqLaXOKfRgoUQ==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/store': ^0.96.0 - '@graphql-mesh/types': ^0.96.0 - '@graphql-mesh/utils': ^0.96.0 + '@graphql-mesh/store': ^0.96.1 + '@graphql-mesh/types': ^0.96.1 + '@graphql-mesh/utils': ^0.96.1 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/federation': 1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) @@ -6632,7 +7618,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/http@0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/http@0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-38Mxw2K2RABBBO0IiXKZDu2o+jlM4vcUSEg+9h2Dz67oOJZHpKeId6z1PFb7uYMzAs29yoMcqXIEnews+HVhrQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6644,30 +7630,30 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@whatwg-node/server': 0.9.16 graphql: 16.8.1 graphql-yoga: 5.0.0(graphql@16.8.1) tslib: 2.6.2 dev: false - /@graphql-mesh/http@0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-38Mxw2K2RABBBO0IiXKZDu2o+jlM4vcUSEg+9h2Dz67oOJZHpKeId6z1PFb7uYMzAs29yoMcqXIEnews+HVhrQ==} + /@graphql-mesh/http@0.97.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.97.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-F7x6f1otnxFeCARrKs/fOBG6zXVrFbW7Zf2h1ti/szjqJF3nkGCuex91l/s9ruJ+70lMTZ5SVFCzKufkeR5MLw==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/runtime': ^0.96.13 - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 + '@graphql-mesh/runtime': ^0.97.2 + '@graphql-mesh/types': ^0.96.1 + '@graphql-mesh/utils': ^0.96.1 graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.97.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@whatwg-node/server': 0.9.16 graphql: 16.8.1 graphql-yoga: 5.0.0(graphql@16.8.1) @@ -6694,7 +7680,7 @@ packages: - '@graphql-mesh/store' dev: false - /@graphql-mesh/merger-bare@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/merger-bare@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-E5R8Sv5Dkp+eswYKEDHgu8puwSeolPX1j9IHwBVe1npRRCXc3CjMsQJ9+kcTln453vbSBcM1a3fQspIaKA1Tcg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6704,9 +7690,9 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/merger-stitching': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/merger-stitching': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/schema': 10.0.0(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 @@ -6715,20 +7701,20 @@ packages: - '@graphql-mesh/store' dev: false - /@graphql-mesh/merger-bare@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-E5R8Sv5Dkp+eswYKEDHgu8puwSeolPX1j9IHwBVe1npRRCXc3CjMsQJ9+kcTln453vbSBcM1a3fQspIaKA1Tcg==} + /@graphql-mesh/merger-bare@0.96.1(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-ThY/gsLkonLuTgJvy39yits3CzwWf3oltkO5Ryz3hQBr0m3ZD6u59tftW6wqqBFMupc80BKL9Kfx4XL2ogRCug==} engines: {node: '>=16.0.0'} peerDependencies: - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 + '@graphql-mesh/types': ^0.96.1 + '@graphql-mesh/utils': ^0.96.1 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/merger-stitching': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-mesh/merger-stitching': 0.96.1(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-tools/schema': 10.0.2(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -6758,7 +7744,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/merger-stitching@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/merger-stitching@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eAukU8AsjK8jIT3vFhalGoERh98xZgzKkTCQL7w2wPpFXveSDMn+9fVvCJ1EBKTsLa7SkNXqzAFkfYp21hW0ng==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6769,9 +7755,9 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/schema': 10.0.0(graphql@16.8.1) '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) @@ -6780,22 +7766,22 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/merger-stitching@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-eAukU8AsjK8jIT3vFhalGoERh98xZgzKkTCQL7w2wPpFXveSDMn+9fVvCJ1EBKTsLa7SkNXqzAFkfYp21hW0ng==} + /@graphql-mesh/merger-stitching@0.96.1(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-xyQwh9/oaeI9qK+Q2vov4/3bmnXSQLZ+7jWPuFJVYeOt3O3mtApFzlaADON0jmfoefelwswELKH6TyWBmZaVew==} engines: {node: '>=16.0.0'} peerDependencies: - '@graphql-mesh/store': ^0.95.8 - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 + '@graphql-mesh/store': ^0.96.1 + '@graphql-mesh/types': ^0.96.1 + '@graphql-mesh/utils': ^0.96.1 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/schema': 10.0.0(graphql@16.8.1) + '@graphql-tools/schema': 10.0.2(graphql@16.8.1) '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 @@ -6828,7 +7814,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6842,10 +7828,10 @@ packages: '@envelop/core': 5.0.0 '@envelop/extended-validation': 4.0.0(@envelop/core@5.0.0)(graphql@16.8.1) '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -6857,13 +7843,13 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} + /@graphql-mesh/runtime@0.97.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-MvXmWFjB3tMAo3REFI4X5jURtUj997aVEgMfJqXorKZYHDHYnSpAtx6sCIrQLjW42aGYKokJfQUlC8uvtPbJTQ==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 + '@graphql-mesh/types': ^0.96.1 + '@graphql-mesh/utils': ^0.96.1 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 @@ -6873,8 +7859,8 @@ packages: '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -6905,7 +7891,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6918,28 +7904,28 @@ packages: dependencies: '@graphql-inspector/core': 5.0.1(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 dev: false - /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} + /@graphql-mesh/store@0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-ImtsvRb7WlmkSTIsN6Y/htGtCq1+0C/gjRE55QRcHq4O+o/jXCvOJZD/YoTegze/iXCj0uMb/29OIzWAe0G7sw==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 + '@graphql-mesh/types': ^0.96.1 + '@graphql-mesh/utils': ^0.96.1 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-inspector/core': 5.0.1(graphql@16.8.1) + '@graphql-inspector/core': 5.0.2(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -6988,7 +7974,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} peerDependencies: '@graphql-mesh/types': ^0.93.1 @@ -6996,8 +7982,8 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) graphql: 16.8.1 @@ -7021,7 +8007,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} peerDependencies: '@graphql-mesh/store': ^0.93.1 @@ -7029,7 +8015,7 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 8.4.27(graphql@16.8.1) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -7079,7 +8065,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -7091,7 +8077,7 @@ packages: dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@whatwg-node/fetch': 0.9.14 @@ -7104,19 +8090,19 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} + /@graphql-mesh/utils@0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-YpzseHzSE43FaQMoKRp0grWrrqfx2mUpJ070iuv8jNHIzmGOojY2cVotzdZ4YWe8EGOzY179N2B3Yby1s6gCig==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.8 + '@graphql-mesh/types': ^0.96.1 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@whatwg-node/fetch': 0.9.14 @@ -7181,12 +8167,12 @@ packages: value-or-promise: 1.0.12 dev: false - /@graphql-tools/code-file-loader@7.3.23(@babel/core@7.23.2)(graphql@16.8.1): + /@graphql-tools/code-file-loader@7.3.23(@babel/core@7.23.5)(graphql@16.8.1): resolution: {integrity: sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/graphql-tag-pluck': 7.5.2(@babel/core@7.23.2)(graphql@16.8.1) + '@graphql-tools/graphql-tag-pluck': 7.5.2(@babel/core@7.23.5)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) globby: 11.1.0 graphql: 16.8.1 @@ -7411,13 +8397,13 @@ packages: unixify: 1.0.0 dev: false - /@graphql-tools/graphql-tag-pluck@7.5.2(@babel/core@7.23.2)(graphql@16.8.1): + /@graphql-tools/graphql-tag-pluck@7.5.2(@babel/core@7.23.5)(graphql@16.8.1): resolution: {integrity: sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@babel/parser': 7.23.0 - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.5) '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -7472,6 +8458,17 @@ packages: tslib: 2.6.2 dev: false + /@graphql-tools/merge@9.0.1(graphql@16.8.1): + resolution: {integrity: sha512-hIEExWO9fjA6vzsVjJ3s0cCQ+Q/BEeMVJZtMXd7nbaVefVy0YDyYlEkeoYYNV3NVVvu1G9lr6DM1Qd0DGo9Caw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + /@graphql-tools/optimize@1.4.0(graphql@16.8.1): resolution: {integrity: sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==} peerDependencies: @@ -7508,6 +8505,19 @@ packages: value-or-promise: 1.0.12 dev: false + /@graphql-tools/schema@10.0.2(graphql@16.8.1): + resolution: {integrity: sha512-TbPsIZnWyDCLhgPGnDjt4hosiNU2mF/rNtSk5BVaXWnZqvKJ6gzJV4fcHcvhRIwtscDMW2/YTnK6dLVnk8pc4w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/merge': 9.0.1(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + dev: false + /@graphql-tools/schema@9.0.19(graphql@16.8.1): resolution: {integrity: sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==} peerDependencies: @@ -7619,6 +8629,19 @@ packages: - utf-8-validate dev: false + /@graphql-tools/utils@10.0.11(graphql@16.8.1): + resolution: {integrity: sha512-vVjXgKn6zjXIlYBd7yJxCVMYGb5j18gE3hx3Qw3mNsSEsYQXbJbPdlwb7Fc9FogsJei5AaqiQerqH4kAosp1nQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + cross-inspect: 1.0.0 + dset: 3.1.3 + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + /@graphql-tools/utils@10.0.7(graphql@16.8.1): resolution: {integrity: sha512-KOdeMj6Hd/MENDaqPbws3YJl3wVy0DeYnL7PyUms5Skyf7uzI9INynDwPMhLXfSb0/ph6BXTwMd5zBtWbF8tBQ==} engines: {node: '>=16.0.0'} @@ -7779,7 +8802,7 @@ packages: /@hypercerts-org/contracts@1.0.0-alpha.2(typescript@5.1.6): resolution: {integrity: sha512-I9TMEyN4cKW3Gfv3Wysk9xoZzwpUjI+dgCECJVjBlInRiCxnaUdahBSqhVvKg1gViWaPMDvDGe5v9jVknZIN/A==} dependencies: - hardhat: 2.18.3(ts-node@10.9.1)(typescript@5.1.6) + hardhat: 2.18.3(typescript@5.1.6) transitivePeerDependencies: - bufferutil - supports-color @@ -7788,10 +8811,10 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/contracts@1.0.0-alpha.6(ts-node@10.9.1)(typescript@5.1.6): + /@hypercerts-org/contracts@1.0.0-alpha.6(ts-node@10.9.1)(typescript@5.3.2): resolution: {integrity: sha512-8XV9jlj5P+WL+hFX56OP+cYpLDwicZoGteN3ZAPHc1Y07fy7I2tpx1/MU7Sg2GX2nVO46Xix1MblQxVzx0Xy8Q==} dependencies: - hardhat: 2.18.3(ts-node@10.9.1)(typescript@5.1.6) + hardhat: 2.18.3(ts-node@10.9.1)(typescript@5.3.2) transitivePeerDependencies: - bufferutil - supports-color @@ -7803,7 +8826,7 @@ packages: /@hypercerts-org/sdk@1.0.0-alpha.10(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4): resolution: {integrity: sha512-PEGKxzxhGZuz0cjYCCj90+bBmbfU4n1mP+q911Kx6jZ0g5sQyj+m685x0cq8OIL4JnYNPShZ2OWDjcX93KzbBA==} dependencies: - '@ethereum-attestation-service/eas-sdk': 1.2.2-beta.0(ts-node@10.9.1)(typescript@5.1.6) + '@ethereum-attestation-service/eas-sdk': 1.2.2-beta.0(typescript@5.1.6) '@ethersproject/abstract-signer': 5.7.0 '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) @@ -7812,7 +8835,7 @@ packages: '@graphql-mesh/graphql': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -8147,7 +9170,7 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.20 babel-plugin-istanbul: 6.1.1 @@ -10092,7 +11115,7 @@ packages: hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) dev: true - /@nomicfoundation/hardhat-toolbox@3.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.2)(@nomicfoundation/hardhat-ethers@3.0.4)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomicfoundation/hardhat-verify@1.1.1)(@typechain/ethers-v6@0.4.3)(@typechain/hardhat@8.0.3)(@types/chai@4.3.9)(@types/mocha@9.1.0)(@types/node@18.18.7)(chai@4.3.10)(ethers@6.8.0)(hardhat-gas-reporter@1.0.9)(hardhat@2.18.3)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.2)(typescript@4.9.5): + /@nomicfoundation/hardhat-toolbox@3.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.2)(@nomicfoundation/hardhat-ethers@3.0.4)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomicfoundation/hardhat-verify@1.1.1)(@typechain/ethers-v6@0.4.3)(@typechain/hardhat@8.0.3)(@types/chai@4.3.11)(@types/mocha@9.1.0)(@types/node@18.18.7)(chai@4.3.10)(ethers@6.8.0)(hardhat-gas-reporter@1.0.9)(hardhat@2.18.3)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.2)(typescript@4.9.5): resolution: {integrity: sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==} peerDependencies: '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 @@ -10119,7 +11142,7 @@ packages: '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.18.3) '@typechain/ethers-v6': 0.4.3(ethers@6.8.0)(typechain@8.3.2)(typescript@4.9.5) '@typechain/hardhat': 8.0.3(@typechain/ethers-v6@0.4.3)(ethers@6.8.0)(hardhat@2.18.3)(typechain@8.3.2) - '@types/chai': 4.3.9 + '@types/chai': 4.3.11 '@types/mocha': 9.1.0 '@types/node': 18.18.7 chai: 4.3.10 @@ -10412,7 +11435,7 @@ packages: resolution: {integrity: sha512-JxeA111ifCIzXho2gFymhepufB0ElI1UMvFIMEfJLvRL7g7V69wSiN8v+OqZyqZTahiY32Rb+TwdhVjKF5Zu+A==} dependencies: '@openzeppelin/defender-base-client': 1.50.0(debug@4.3.4) - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) ethers: 5.7.2 lodash: 4.17.21 node-fetch: 2.7.0 @@ -10460,7 +11483,7 @@ packages: dependencies: amazon-cognito-identity-js: 6.3.6 async-retry: 1.3.3 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) lodash: 4.17.21 node-fetch: 2.7.0 transitivePeerDependencies: @@ -10471,7 +11494,7 @@ packages: resolution: {integrity: sha512-R3jJOh/Wirp+UtD/YYHzC1LYqdXsIPl77z7ZlJLdQDdWHZbIHpHCUlTrj1zZ/0+XovJ23ItiZqivnkVLqV62LQ==} dependencies: '@openzeppelin/defender-sdk-base-client': 1.4.0 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) lodash: 4.17.21 transitivePeerDependencies: - debug @@ -10482,7 +11505,7 @@ packages: resolution: {integrity: sha512-kLwO5sVC2KUt+jyHe5GZr7+BEeKgkX4ZcZCqyg+ykRtqVjQOmufwjdVRpwaqKsetEJdqobwmDu0D5gZnjC9ZwQ==} dependencies: '@openzeppelin/defender-sdk-base-client': 1.4.0 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) glob: 7.2.3 jszip: 3.10.1 lodash: 4.17.21 @@ -10505,7 +11528,7 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 '@openzeppelin/defender-sdk-base-client': 1.4.0 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) lodash: 4.17.21 transitivePeerDependencies: - debug @@ -10517,7 +11540,7 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 '@openzeppelin/defender-sdk-base-client': 1.4.0 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) lodash: 4.17.21 transitivePeerDependencies: - debug @@ -10529,7 +11552,7 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 '@openzeppelin/defender-sdk-base-client': 1.4.0 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) lodash: 4.17.21 transitivePeerDependencies: - debug @@ -10541,7 +11564,7 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 '@openzeppelin/defender-sdk-base-client': 1.4.0 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) lodash: 4.17.21 transitivePeerDependencies: - debug @@ -10552,7 +11575,7 @@ packages: resolution: {integrity: sha512-jhvVZOt9AlvsOzJZiU0nO61ew+AT25d6kVPMT3GeyoFo8v3P62U19w3RtTrozxvxppMadUsIm53mu8Y4JWL/Zg==} dependencies: '@openzeppelin/defender-sdk-base-client': 1.4.0 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) ethers: 5.7.2 lodash: 4.17.21 transitivePeerDependencies: @@ -10566,7 +11589,7 @@ packages: resolution: {integrity: sha512-j6XmTTkfShN2VbR82aw/NiSD8ee6vMEmQDFtnNG3NIsl/FYygpIksGVef3gFsYPBCspQPQ0SdeKlwM0pU/+Sag==} dependencies: '@openzeppelin/defender-sdk-base-client': 1.4.0 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) lodash: 4.17.21 transitivePeerDependencies: - debug @@ -10601,7 +11624,7 @@ packages: '@ethersproject/transactions': 5.7.0 '@openzeppelin/defender-sdk-base-client': 1.4.0 amazon-cognito-identity-js: 6.3.6 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) lodash: 4.17.21 web3: 1.10.3 web3-core: 1.10.3 @@ -10814,7 +11837,7 @@ packages: '@plasmicapp/loader-edge': 1.0.52 '@plasmicapp/loader-react': 1.0.324(react-dom@18.2.0)(react@18.2.0) '@plasmicapp/watcher': 1.0.81 - next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + next: 13.5.6(@babel/core@7.23.5)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) server-only: 0.0.1 @@ -11081,7 +12104,7 @@ packages: - encoding dev: false - /@react-native-community/cli-plugin-metro@11.3.7(@babel/core@7.23.2): + /@react-native-community/cli-plugin-metro@11.3.7(@babel/core@7.23.5): resolution: {integrity: sha512-0WhgoBVGF1f9jXcuagQmtxpwpfP+2LbLZH4qMyo6OtYLWLG13n2uRep+8tdGzfNzl1bIuUTeE9yZSAdnf9LfYQ==} dependencies: '@react-native-community/cli-server-api': 11.3.7 @@ -11091,7 +12114,7 @@ packages: metro: 0.76.8 metro-config: 0.76.8 metro-core: 0.76.8 - metro-react-native-babel-transformer: 0.76.8(@babel/core@7.23.2) + metro-react-native-babel-transformer: 0.76.8(@babel/core@7.23.5) metro-resolver: 0.76.8 metro-runtime: 0.76.8 readline: 1.3.0 @@ -11144,7 +12167,7 @@ packages: joi: 17.11.0 dev: false - /@react-native-community/cli@11.3.7(@babel/core@7.23.2): + /@react-native-community/cli@11.3.7(@babel/core@7.23.5): resolution: {integrity: sha512-Ou8eDlF+yh2rzXeCTpMPYJ2fuqsusNOhmpYPYNQJQ2h6PvaF30kPomflgRILems+EBBuggRtcT+I+1YH4o/q6w==} engines: {node: '>=16'} hasBin: true @@ -11154,7 +12177,7 @@ packages: '@react-native-community/cli-debugger-ui': 11.3.7 '@react-native-community/cli-doctor': 11.3.7 '@react-native-community/cli-hermes': 11.3.7 - '@react-native-community/cli-plugin-metro': 11.3.7(@babel/core@7.23.2) + '@react-native-community/cli-plugin-metro': 11.3.7(@babel/core@7.23.5) '@react-native-community/cli-server-api': 11.3.7 '@react-native-community/cli-tools': 11.3.7 '@react-native-community/cli-types': 11.3.7 @@ -11178,15 +12201,15 @@ packages: resolution: {integrity: sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==} dev: false - /@react-native/codegen@0.72.7(@babel/preset-env@7.23.2): + /@react-native/codegen@0.72.7(@babel/preset-env@7.23.5): resolution: {integrity: sha512-O7xNcGeXGbY+VoqBGNlZ3O05gxfATlwE1Q1qQf5E38dK+tXn5BY4u0jaQ9DPjfE8pBba8g/BYI1N44lynidMtg==} peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/parser': 7.23.0 - '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/parser': 7.23.5 + '@babel/preset-env': 7.23.5(@babel/core@7.23.5) flow-parser: 0.206.0 - jscodeshift: 0.14.0(@babel/preset-env@7.23.2) + jscodeshift: 0.14.0(@babel/preset-env@7.23.5) nullthrows: 1.1.1 transitivePeerDependencies: - supports-color @@ -11211,7 +12234,7 @@ packages: dependencies: invariant: 2.2.4 nullthrows: 1.1.1 - react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) + react-native: 0.72.6(@babel/core@7.23.5)(@babel/preset-env@7.23.5)(react@18.2.0) dev: false /@repeaterjs/repeater@3.0.4: @@ -11222,47 +12245,6 @@ packages: resolution: {integrity: sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ==} dev: true - /@resolver-engine/core@0.3.3: - resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==} - dependencies: - debug: 3.2.7(supports-color@8.1.1) - is-url: 1.2.4 - request: 2.88.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@resolver-engine/fs@0.3.3: - resolution: {integrity: sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==} - dependencies: - '@resolver-engine/core': 0.3.3 - debug: 3.2.7(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /@resolver-engine/imports-fs@0.3.3: - resolution: {integrity: sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==} - dependencies: - '@resolver-engine/fs': 0.3.3 - '@resolver-engine/imports': 0.3.3 - debug: 3.2.7(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /@resolver-engine/imports@0.3.3: - resolution: {integrity: sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==} - dependencies: - '@resolver-engine/core': 0.3.3 - debug: 3.2.7(supports-color@8.1.1) - hosted-git-info: 2.8.9 - path-browserify: 1.0.1 - url: 0.11.3 - transitivePeerDependencies: - - supports-color - dev: true - /@rollup/plugin-commonjs@24.0.0(rollup@2.78.0): resolution: {integrity: sha512-0w0wyykzdyRRPHOb0cQt14mIBLujfAv6GgP6g8nvg/iBxEm112t3YPPq+Buqe2+imvElTka+bjNlJ/gB56TD8g==} engines: {node: '>=14.0.0'} @@ -11432,6 +12414,14 @@ packages: dev: true optional: true + /@rollup/rollup-android-arm-eabi@4.6.1: + resolution: {integrity: sha512-0WQ0ouLejaUCRsL93GD4uft3rOmB8qoQMU05Kb8CmMtMBe7XUDLAltxVZI1q6byNqEtU7N1ZX1Vw5lIpgulLQA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-android-arm64@4.1.4: resolution: {integrity: sha512-D1e+ABe56T9Pq2fD+R3ybe1ylCDzu3tY4Qm2Mj24R9wXNCq35+JbFbOpc2yrroO2/tGhTobmEl2Bm5xfE/n8RA==} cpu: [arm64] @@ -11440,6 +12430,14 @@ packages: dev: true optional: true + /@rollup/rollup-android-arm64@4.6.1: + resolution: {integrity: sha512-1TKm25Rn20vr5aTGGZqo6E4mzPicCUD79k17EgTLAsXc1zysyi4xXKACfUbwyANEPAEIxkzwue6JZ+stYzWUTA==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-darwin-arm64@4.1.4: resolution: {integrity: sha512-7vTYrgEiOrjxnjsgdPB+4i7EMxbVp7XXtS+50GJYj695xYTTEMn3HZVEvgtwjOUkAP/Q4HDejm4fIAjLeAfhtg==} cpu: [arm64] @@ -11448,6 +12446,14 @@ packages: dev: true optional: true + /@rollup/rollup-darwin-arm64@4.6.1: + resolution: {integrity: sha512-cEXJQY/ZqMACb+nxzDeX9IPLAg7S94xouJJCNVE5BJM8JUEP4HeTF+ti3cmxWeSJo+5D+o8Tc0UAWUkfENdeyw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-darwin-x64@4.1.4: resolution: {integrity: sha512-eGJVZScKSLZkYjhTAESCtbyTBq9SXeW9+TX36ki5gVhDqJtnQ5k0f9F44jNK5RhAMgIj0Ht9+n6HAgH0gUUyWQ==} cpu: [x64] @@ -11456,6 +12462,14 @@ packages: dev: true optional: true + /@rollup/rollup-darwin-x64@4.6.1: + resolution: {integrity: sha512-LoSU9Xu56isrkV2jLldcKspJ7sSXmZWkAxg7sW/RfF7GS4F5/v4EiqKSMCFbZtDu2Nc1gxxFdQdKwkKS4rwxNg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-arm-gnueabihf@4.1.4: resolution: {integrity: sha512-HnigYSEg2hOdX1meROecbk++z1nVJDpEofw9V2oWKqOWzTJlJf1UXVbDE6Hg30CapJxZu5ga4fdAQc/gODDkKg==} cpu: [arm] @@ -11464,6 +12478,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-arm-gnueabihf@4.6.1: + resolution: {integrity: sha512-EfI3hzYAy5vFNDqpXsNxXcgRDcFHUWSx5nnRSCKwXuQlI5J9dD84g2Usw81n3FLBNsGCegKGwwTVsSKK9cooSQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-arm64-gnu@4.1.4: resolution: {integrity: sha512-TzJ+N2EoTLWkaClV2CUhBlj6ljXofaYzF/R9HXqQ3JCMnCHQZmQnbnZllw7yTDp0OG5whP4gIPozR4QiX+00MQ==} cpu: [arm64] @@ -11472,6 +12494,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-arm64-gnu@4.6.1: + resolution: {integrity: sha512-9lhc4UZstsegbNLhH0Zu6TqvDfmhGzuCWtcTFXY10VjLLUe4Mr0Ye2L3rrtHaDd/J5+tFMEuo5LTCSCMXWfUKw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-arm64-musl@4.1.4: resolution: {integrity: sha512-aVPmNMdp6Dlo2tWkAduAD/5TL/NT5uor290YvjvFvCv0Q3L7tVdlD8MOGDL+oRSw5XKXKAsDzHhUOPUNPRHVTQ==} cpu: [arm64] @@ -11480,6 +12510,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-arm64-musl@4.6.1: + resolution: {integrity: sha512-FfoOK1yP5ksX3wwZ4Zk1NgyGHZyuRhf99j64I5oEmirV8EFT7+OhUZEnP+x17lcP/QHJNWGsoJwrz4PJ9fBEXw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-x64-gnu@4.1.4: resolution: {integrity: sha512-77Fb79ayiDad0grvVsz4/OB55wJRyw9Ao+GdOBA9XywtHpuq5iRbVyHToGxWquYWlEf6WHFQQnFEttsAzboyKg==} cpu: [x64] @@ -11488,6 +12526,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-x64-gnu@4.6.1: + resolution: {integrity: sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-x64-musl@4.1.4: resolution: {integrity: sha512-/t6C6niEQTqmQTVTD9TDwUzxG91Mlk69/v0qodIPUnjjB3wR4UA3klg+orR2SU3Ux2Cgf2pWPL9utK80/1ek8g==} cpu: [x64] @@ -11496,6 +12542,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-x64-musl@4.6.1: + resolution: {integrity: sha512-RkJVNVRM+piYy87HrKmhbexCHg3A6Z6MU0W9GHnJwBQNBeyhCJG9KDce4SAMdicQnpURggSvtbGo9xAWOfSvIQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-win32-arm64-msvc@4.1.4: resolution: {integrity: sha512-ZY5BHHrOPkMbCuGWFNpJH0t18D2LU6GMYKGaqaWTQ3CQOL57Fem4zE941/Ek5pIsVt70HyDXssVEFQXlITI5Gg==} cpu: [arm64] @@ -11504,6 +12558,14 @@ packages: dev: true optional: true + /@rollup/rollup-win32-arm64-msvc@4.6.1: + resolution: {integrity: sha512-v2FVT6xfnnmTe3W9bJXl6r5KwJglMK/iRlkKiIFfO6ysKs0rDgz7Cwwf3tjldxQUrHL9INT/1r4VA0n9L/F1vQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-win32-ia32-msvc@4.1.4: resolution: {integrity: sha512-XG2mcRfFrJvYyYaQmvCIvgfkaGinfXrpkBuIbJrTl9SaIQ8HumheWTIwkNz2mktCKwZfXHQNpO7RgXLIGQ7HXA==} cpu: [ia32] @@ -11512,6 +12574,14 @@ packages: dev: true optional: true + /@rollup/rollup-win32-ia32-msvc@4.6.1: + resolution: {integrity: sha512-YEeOjxRyEjqcWphH9dyLbzgkF8wZSKAKUkldRY6dgNR5oKs2LZazqGB41cWJ4Iqqcy9/zqYgmzBkRoVz3Q9MLw==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-win32-x64-msvc@4.1.4: resolution: {integrity: sha512-ANFqWYPwkhIqPmXw8vm0GpBEHiPpqcm99jiiAp71DbCSqLDhrtr019C5vhD0Bw4My+LmMvciZq6IsWHqQpl2ZQ==} cpu: [x64] @@ -11520,6 +12590,14 @@ packages: dev: true optional: true + /@rollup/rollup-win32-x64-msvc@4.6.1: + resolution: {integrity: sha512-0zfTlFAIhgz8V2G8STq8toAjsYYA6eci1hnXuyOTUFnymrtJwnS6uGKiv3v5UrPZkBlamLvrLV2iiaeqCKzb0A==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@rushstack/eslint-patch@1.5.1: resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==} dev: true @@ -11735,7 +12813,7 @@ packages: '@sentry/vercel-edge': 7.75.1 '@sentry/webpack-plugin': 1.20.0 chalk: 3.0.0 - next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) + next: 13.5.6(@babel/core@7.23.5)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 resolve: 1.22.8 rollup: 2.78.0 @@ -11896,6 +12974,12 @@ packages: dependencies: '@sinonjs/commons': 3.0.0 + /@sinonjs/fake-timers@11.2.2: + resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} + dependencies: + '@sinonjs/commons': 3.0.0 + dev: true + /@sinonjs/samsam@8.0.0: resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} dependencies: @@ -12141,101 +13225,101 @@ packages: - supports-color dev: false - /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.5): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 dev: false - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.2): + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.5): resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 dev: false - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.2): + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.5): resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 dev: false - /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.5): resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 dev: false - /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.5): resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 dev: false - /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.5): resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 dev: false - /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.5): resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 dev: false - /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.5): resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 dev: false - /@svgr/babel-preset@6.5.1(@babel/core@7.23.2): + /@svgr/babel-preset@6.5.1(@babel/core@7.23.5): resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.2) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.2) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.2) - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.2) - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.2) - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.2) - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.2) - '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.2) + '@babel/core': 7.23.5 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.5) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.5) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.5) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.5) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.5) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.5) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.5) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.5) dev: false /@svgr/core@6.5.1: resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.2 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.2) + '@babel/core': 7.23.5 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.5) '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.1.0 @@ -12257,8 +13341,8 @@ packages: peerDependencies: '@svgr/core': ^6.0.0 dependencies: - '@babel/core': 7.23.2 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.2) + '@babel/core': 7.23.5 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.5) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -12282,11 +13366,11 @@ packages: resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.2 - '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.23.2) - '@babel/preset-env': 7.23.2(@babel/core@7.23.2) - '@babel/preset-react': 7.22.15(@babel/core@7.23.2) - '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) + '@babel/core': 7.23.5 + '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.23.5) + '@babel/preset-env': 7.23.5(@babel/core@7.23.5) + '@babel/preset-react': 7.22.15(@babel/core@7.23.5) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.5) '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) @@ -12300,12 +13384,12 @@ packages: tslib: 2.6.2 dev: false - /@synthetixio/synpress@3.7.1(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(webpack@5.89.0): + /@synthetixio/synpress@3.7.1(@babel/core@7.23.5)(@babel/preset-env@7.23.5)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(webpack@5.89.0): resolution: {integrity: sha512-fU2+niaDgDvR/7NJwTvMA5WPbAt4fu8c4EMhQH1Lgk8OKSmaovL9xXgOscd90KZyHu6FbW8DNnocJKyiZmELEA==} engines: {node: '>=14'} hasBin: true dependencies: - '@cypress/code-coverage': 3.12.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0) + '@cypress/code-coverage': 3.12.6(@babel/core@7.23.5)(@babel/preset-env@7.23.5)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0) '@cypress/webpack-dev-server': 3.6.1(debug@4.3.4)(webpack@5.89.0) '@drptbl/gremlins.js': 2.2.1 '@foundry-rs/easy-foundryup': 0.1.3 @@ -12315,7 +13399,7 @@ packages: '@types/testing-library__cypress': 5.0.12 '@viem/anvil': 0.0.5(debug@4.3.4) app-root-path: 3.1.0 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) babel-plugin-istanbul: 6.1.1 babel-plugin-react-generate-property: 1.1.2 babel-plugin-react-remove-properties: 0.3.0 @@ -12335,7 +13419,7 @@ packages: get-port: 6.1.2 node-fetch: 2.7.0 underscore: 1.13.6 - viem: 0.3.50(typescript@5.1.6) + viem: 0.3.50(typescript@5.3.2) wait-on: 7.0.1(debug@4.3.4) transitivePeerDependencies: - '@babel/core' @@ -12436,7 +13520,7 @@ packages: '@tanstack/query-core': 4.36.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) + react-native: 0.72.6(@babel/core@7.23.5)(@babel/preset-env@7.23.5)(react@18.2.0) use-sync-external-store: 1.2.0(react@18.2.0) dev: false @@ -12455,7 +13539,7 @@ packages: resolution: {integrity: sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==} engines: {node: '>=10'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 '@babel/runtime': 7.23.2 '@types/aria-query': 4.2.2 aria-query: 4.2.2 @@ -12469,7 +13553,7 @@ packages: resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} engines: {node: '>=12'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 '@babel/runtime': 7.23.2 '@types/aria-query': 5.0.3 aria-query: 5.1.3 @@ -12483,7 +13567,7 @@ packages: resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} engines: {node: '>=14'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 '@babel/runtime': 7.23.2 '@types/aria-query': 5.0.3 aria-query: 5.1.3 @@ -12554,23 +13638,6 @@ packages: - supports-color dev: true - /@trufflesuite/bigint-buffer@1.1.10: - resolution: {integrity: sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==} - engines: {node: '>= 14.0.0'} - requiresBuild: true - dependencies: - node-gyp-build: 4.4.0 - dev: true - - /@trufflesuite/bigint-buffer@1.1.9: - resolution: {integrity: sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==} - engines: {node: '>= 10.0.0'} - requiresBuild: true - dependencies: - node-gyp-build: 4.3.0 - dev: true - optional: true - /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -12592,24 +13659,6 @@ packages: /@tsconfig/node16@1.0.4: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.1.6): - resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} - peerDependencies: - '@ethersproject/abi': ^5.0.0 - '@ethersproject/providers': ^5.0.0 - ethers: ^5.1.3 - typechain: ^8.1.1 - typescript: '>=4.3.0' - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - ethers: 5.7.2 - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.1.6) - typechain: 8.3.2(typescript@5.1.6) - typescript: 5.1.6 - dev: true - /@typechain/ethers-v6@0.4.3(ethers@6.8.0)(typechain@8.3.2)(typescript@4.9.5): resolution: {integrity: sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==} peerDependencies: @@ -12639,10 +13688,6 @@ packages: typechain: 8.3.2(typescript@4.9.5) dev: true - /@types/abstract-leveldown@7.2.4: - resolution: {integrity: sha512-ygy0hYyHdKnAtvCGUFEFvr3YV7Y6Q4akyRkZpM3RSUMYGSr35ZGRCT9Div+la4DpRUiwYUhJ6l75JBz6EORmpg==} - dev: true - /@types/aria-query@4.2.2: resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} dev: true @@ -12719,13 +13764,23 @@ packages: /@types/chai-as-promised@7.1.7: resolution: {integrity: sha512-APucaP5rlmTRYKtRA6FE5QPP87x76ejw5t5guRJ4y5OgMnwtsvigw7HHhKZlx2MGXLeZd6R/GNZR/IqDHcbtQw==} dependencies: - '@types/chai': 4.3.9 + '@types/chai': 4.3.11 dev: true /@types/chai-subset@1.3.4: resolution: {integrity: sha512-CCWNXrJYSUIojZ1149ksLl3AN9cmZ5djf+yUoVVV+NuYrtydItQVlL2ZDqyC6M6O9LWRnVf8yYDxbXHO2TfQZg==} dependencies: - '@types/chai': 4.3.9 + '@types/chai': 4.3.11 + dev: true + + /@types/chai-subset@1.3.5: + resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} + dependencies: + '@types/chai': 4.3.11 + dev: true + + /@types/chai@4.3.11: + resolution: {integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==} dev: true /@types/chai@4.3.9: @@ -12903,18 +13958,6 @@ packages: dependencies: '@types/node': 18.18.7 - /@types/level-errors@3.0.1: - resolution: {integrity: sha512-eFJZWaOUhgjSqgEsPKJZrqXS9aEDUQh/5F9saFhhkR5uEVKlYb4GSG8XyoVC7APklcQKPGDVenTointTZBGIQg==} - dev: true - - /@types/levelup@4.3.3: - resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} - dependencies: - '@types/abstract-leveldown': 7.2.4 - '@types/level-errors': 3.0.1 - '@types/node': 18.18.7 - dev: true - /@types/lodash@4.14.200: resolution: {integrity: sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==} @@ -12946,12 +13989,6 @@ packages: /@types/minimist@1.2.4: resolution: {integrity: sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==} - /@types/mkdirp@0.5.2: - resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} - dependencies: - '@types/node': 18.18.7 - dev: true - /@types/mocha@9.1.0: resolution: {integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==} dev: true @@ -12967,21 +14004,10 @@ packages: '@types/node': 18.18.7 dev: false - /@types/node-fetch@2.6.8: - resolution: {integrity: sha512-nnH5lV9QCMPsbEVdTb5Y+F3GQxLSw1xQgIydrb2gSfEavRPs50FnMr+KUaa+LoPSqibm2N+ZZxH7lavZlAT4GA==} - dependencies: - '@types/node': 18.18.7 - form-data: 4.0.0 - dev: true - /@types/node@10.17.60: resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} dev: true - /@types/node@11.11.6: - resolution: {integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==} - dev: true - /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -13122,10 +14148,6 @@ packages: dependencies: '@types/node': 18.18.7 - /@types/seedrandom@3.0.1: - resolution: {integrity: sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==} - dev: true - /@types/semver@7.5.4: resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} dev: true @@ -13148,8 +14170,8 @@ packages: '@types/mime': 3.0.3 '@types/node': 18.18.7 - /@types/sinon@10.0.20: - resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} + /@types/sinon@17.0.2: + resolution: {integrity: sha512-Zt6heIGsdqERkxctIpvN5Pv3edgBrhoeb3yHyxffd4InN0AX2SVNKSrhdDZKGQICVOxWP/q4DyhpfPNMSrpIiA==} dependencies: '@types/sinonjs__fake-timers': 8.1.1 dev: true @@ -13589,6 +14611,14 @@ packages: chai: 4.3.10 dev: true + /@vitest/expect@1.0.1: + resolution: {integrity: sha512-3cdrb/eKD/0tygDX75YscuHEHMUJ70u3UoLSq2eqhWks57AyzvsDQbyn53IhZ0tBN7gA8Jj2VhXiOV2lef7thw==} + dependencies: + '@vitest/spy': 1.0.1 + '@vitest/utils': 1.0.1 + chai: 4.3.10 + dev: true + /@vitest/runner@0.28.5: resolution: {integrity: sha512-NKkHtLB+FGjpp5KmneQjTcPLWPTDfB7ie+MmF1PnUBf/tGe2OjGxWyB62ySYZ25EYp9krR5Bw0YPLS/VWh1QiA==} dependencies: @@ -13597,12 +14627,34 @@ packages: pathe: 1.1.1 dev: true + /@vitest/runner@1.0.1: + resolution: {integrity: sha512-/+z0vhJ0MfRPT3AyTvAK6m57rzlew/ct8B2a4LMv7NhpPaiI2QLGyOBMB3lcioWdJHjRuLi9aYppfOv0B5aRQA==} + dependencies: + '@vitest/utils': 1.0.1 + p-limit: 5.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/snapshot@1.0.1: + resolution: {integrity: sha512-wIPtPDGSxEZ+DpNMc94AsybX6LV6uN6sosf5TojyP1m2QbKwiRuLV/5RSsjt1oWViHsTj8mlcwrQQ1zHGO0fMw==} + dependencies: + magic-string: 0.30.5 + pathe: 1.1.1 + pretty-format: 29.7.0 + dev: true + /@vitest/spy@0.28.5: resolution: {integrity: sha512-7if6rsHQr9zbmvxN7h+gGh2L9eIIErgf8nSKYDlg07HHimCxp4H6I/X/DPXktVPPLQfiZ1Cw2cbDIx9fSqDjGw==} dependencies: tinyspy: 1.1.1 dev: true + /@vitest/spy@1.0.1: + resolution: {integrity: sha512-yXwm1uKhBVr/5MhVeSmtNqK+0q2RXIchJt8kokEKdrWLtkPeDgdbZ6SjR1VQGZuNdWL6sSBnLayIyVvcS0qLfA==} + dependencies: + tinyspy: 2.2.0 + dev: true + /@vitest/utils@0.28.5: resolution: {integrity: sha512-UyZdYwdULlOa4LTUSwZ+Paz7nBHGTT72jKwdFSV4IjHF1xsokp+CabMdhjvVhYwkLfO88ylJT46YMilnkSARZA==} dependencies: @@ -13613,6 +14665,14 @@ packages: pretty-format: 27.5.1 dev: true + /@vitest/utils@1.0.1: + resolution: {integrity: sha512-MGPCHkzXbbAyscrhwGzh8uP1HPrTYLWaj1WTDtWSGrpe2yJWLRN9mF9ooKawr6NMOg9vTBtg2JqWLfuLC7Dknw==} + dependencies: + diff-sequences: 29.6.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + /@vue/compiler-core@3.3.7: resolution: {integrity: sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==} dependencies: @@ -13665,7 +14725,7 @@ packages: resolution: {integrity: sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==} dev: true - /@wagmi/chains@1.0.0(typescript@5.1.6): + /@wagmi/chains@1.0.0(typescript@5.3.2): resolution: {integrity: sha512-eNbqRWyHbivcMNq5tbXJks4NaOzVLHnNQauHPeE/EDT9AlpqzcrMc+v2T1/2Iw8zN4zgqB86NCsxeJHJs7+xng==} peerDependencies: typescript: '>=5.0.4' @@ -13673,7 +14733,7 @@ packages: typescript: optional: true dependencies: - typescript: 5.1.6 + typescript: 5.3.2 dev: true /@wagmi/connectors@2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): @@ -14619,8 +15679,8 @@ packages: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} dev: true - /abitype@0.10.2(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-1XndI+RKFWK4+TXCNv1683MRyX5NGmlHXCvqzjOqhSS3PQrxT2QYRZq1bMPPRNjn89B3eVaM2w7y3jVj/OIUzA==} + /abitype@0.10.3(typescript@5.3.2)(zod@3.22.4): + resolution: {integrity: sha512-tRN+7XIa7J9xugdbRzFv/95ka5ivR/sRe01eiWvM0HWWjHuigSZEACgKa0sj4wGuekTDtghCx+5Izk/cOi78pQ==} peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.22.0 @@ -14630,7 +15690,7 @@ packages: zod: optional: true dependencies: - typescript: 5.1.6 + typescript: 5.3.2 zod: 3.22.4 dev: true @@ -14645,6 +15705,19 @@ packages: dependencies: typescript: 5.1.6 zod: 3.22.4 + dev: false + + /abitype@0.8.7(typescript@5.3.2): + resolution: {integrity: sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + dependencies: + typescript: 5.3.2 + dev: true /abitype@0.9.8(typescript@4.9.5): resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} @@ -14675,6 +15748,21 @@ packages: zod: 3.22.4 dev: false + /abitype@0.9.8(typescript@5.3.2)(zod@3.22.4): + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.3.2 + zod: 3.22.4 + dev: false + /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -14712,40 +15800,6 @@ packages: module-error: 1.0.2 queue-microtask: 1.2.3 - /abstract-leveldown@6.2.3: - resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==} - engines: {node: '>=6'} - dependencies: - buffer: 5.7.1 - immediate: 3.3.0 - level-concat-iterator: 2.0.1 - level-supports: 1.0.1 - xtend: 4.0.2 - dev: true - - /abstract-leveldown@6.3.0: - resolution: {integrity: sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==} - engines: {node: '>=6'} - dependencies: - buffer: 5.7.1 - immediate: 3.3.0 - level-concat-iterator: 2.0.1 - level-supports: 1.0.1 - xtend: 4.0.2 - dev: true - - /abstract-leveldown@7.2.0: - resolution: {integrity: sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==} - engines: {node: '>=10'} - dependencies: - buffer: 6.0.3 - catering: 2.1.1 - is-buffer: 2.0.5 - level-concat-iterator: 3.1.0 - level-supports: 2.1.0 - queue-microtask: 1.2.3 - dev: true - /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -14778,6 +15832,11 @@ packages: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + engines: {node: '>=0.4.0'} + dev: true + /acorn@8.10.0: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} @@ -15335,12 +16394,6 @@ packages: engines: {node: '>=8'} dev: true - /async-eventemitter@0.2.4: - resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} - dependencies: - async: 2.6.4 - dev: true - /async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} @@ -15481,31 +16534,40 @@ packages: transitivePeerDependencies: - debug + /axios@1.6.2(debug@4.3.4): + resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} + dependencies: + follow-redirects: 1.15.3(debug@4.3.4) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: dequal: 2.0.3 dev: true - /babel-core@7.0.0-bridge.0(@babel/core@7.23.2): + /babel-core@7.0.0-bridge.0(@babel/core@7.23.5): resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 dev: false - /babel-jest@29.7.0(@babel/core@7.23.2): + /babel-jest@29.7.0(@babel/core@7.23.5): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.3 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.23.2) + babel-preset-jest: 29.6.3(@babel/core@7.23.5) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -15528,14 +16590,14 @@ packages: webpack: 5.89.0(webpack-cli@5.1.4) dev: false - /babel-loader@9.1.3(@babel/core@7.23.2)(webpack@5.89.0): + /babel-loader@9.1.3(@babel/core@7.23.5)(webpack@5.89.0): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} peerDependencies: '@babel/core': ^7.12.0 webpack: '>=5' dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 find-cache-dir: 4.0.0 schema-utils: 4.2.0 webpack: 5.89.0(webpack-cli@5.1.4) @@ -15606,6 +16668,19 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: false + + /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.5): + resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.5 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color /babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.23.2): resolution: {integrity: sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==} @@ -15617,6 +16692,18 @@ packages: core-js-compat: 3.33.1 transitivePeerDependencies: - supports-color + dev: false + + /babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.23.5): + resolution: {integrity: sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.5) + core-js-compat: 3.33.1 + transitivePeerDependencies: + - supports-color /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2): resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} @@ -15627,6 +16714,17 @@ packages: '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) transitivePeerDependencies: - supports-color + dev: false + + /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.5): + resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.5) + transitivePeerDependencies: + - supports-color /babel-plugin-react-generate-property@1.1.2: resolution: {integrity: sha512-Wm1OfCfv7juukTZEZHNSYIMxeQEcIhnQQeGlFbML1BesMGZValuCCnEaayg6KyAlT9Y07I5Tz6XmH9YirUfkFQ==} @@ -15640,10 +16738,10 @@ packages: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} dev: false - /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.2): + /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.5): resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} dependencies: - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.5) transitivePeerDependencies: - '@babel/core' dev: false @@ -15669,70 +16767,70 @@ packages: lodash.upperfirst: 4.3.1 dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.2): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.5): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.2 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) - dev: true - - /babel-preset-fbjs@3.4.0(@babel/core@7.23.2): + '@babel/core': 7.23.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.5) + dev: true + + /babel-preset-fbjs@3.4.0(@babel/core@7.23.5): resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.2 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2) + '@babel/core': 7.23.5 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.5) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.5) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.5) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.5) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.5) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.5) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.5) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.5) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.5) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.5) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 dev: false - /babel-preset-jest@29.6.3(@babel/core@7.23.2): + /babel-preset-jest@29.6.3(@babel/core@7.23.5): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.5) dev: true /babel-runtime@6.26.0: @@ -15855,15 +16953,6 @@ packages: file-uri-to-path: 1.0.0 dev: false - /bip39@3.0.4: - resolution: {integrity: sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==} - dependencies: - '@types/node': 11.11.6 - create-hash: 1.2.0 - pbkdf2: 3.1.2 - randombytes: 2.1.0 - dev: true - /bl@1.2.3: resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} dependencies: @@ -16156,12 +17245,6 @@ packages: /buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - /buffer-xor@2.0.2: - resolution: {integrity: sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - /buffer@4.9.2: resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} dependencies: @@ -16181,15 +17264,6 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 - /bufferutil@4.0.5: - resolution: {integrity: sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.6.1 - dev: true - optional: true - /bufferutil@4.0.8: resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} engines: {node: '>=6.14.2'} @@ -16371,11 +17445,6 @@ packages: map-obj: 4.3.0 quick-lru: 4.0.1 - /camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - dev: true - /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -16854,14 +17923,6 @@ packages: is-wsl: 2.2.0 dev: false - /cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - wrap-ansi: 2.1.0 - dev: true - /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} dependencies: @@ -16927,11 +17988,6 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - dev: true - /collapse-white-space@1.0.6: resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} dev: false @@ -17416,7 +18472,7 @@ packages: path-type: 4.0.0 typescript: 4.9.5 - /cosmiconfig@8.3.6(typescript@5.1.6): + /cosmiconfig@8.3.6(typescript@5.3.2): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: @@ -17429,7 +18485,7 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.1.6 + typescript: 5.3.2 dev: false /crc-32@1.2.2: @@ -17506,6 +18562,13 @@ packages: - encoding dev: true + /cross-inspect@1.0.0: + resolution: {integrity: sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -18453,14 +19516,6 @@ packages: engines: {node: '>=10'} dev: true - /deferred-leveldown@5.3.0: - resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==} - engines: {node: '>=6'} - dependencies: - abstract-leveldown: 6.2.3 - inherits: 2.0.4 - dev: true - /define-data-property@1.1.1: resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} @@ -18615,11 +19670,6 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - dev: true - /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -18950,11 +20000,6 @@ packages: resolution: {integrity: sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==} dev: true - /emittery@0.10.0: - resolution: {integrity: sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==} - engines: {node: '>=12'} - dev: true - /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -18981,16 +20026,6 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - /encoding-down@6.3.0: - resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==} - engines: {node: '>=6'} - dependencies: - abstract-leveldown: 6.3.0 - inherits: 2.0.4 - level-codec: 9.0.2 - level-errors: 2.0.1 - dev: true - /encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} dependencies: @@ -19060,13 +20095,6 @@ packages: /err-code@3.0.1: resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - dependencies: - prr: 1.0.1 - dev: true - /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -19268,36 +20296,6 @@ packages: '@esbuild/win32-x64': 0.16.3 dev: true - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 - dev: true - /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -19328,34 +20326,34 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: true - /esbuild@0.19.5: - resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} + /esbuild@0.19.8: + resolution: {integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.19.5 - '@esbuild/android-arm64': 0.19.5 - '@esbuild/android-x64': 0.19.5 - '@esbuild/darwin-arm64': 0.19.5 - '@esbuild/darwin-x64': 0.19.5 - '@esbuild/freebsd-arm64': 0.19.5 - '@esbuild/freebsd-x64': 0.19.5 - '@esbuild/linux-arm': 0.19.5 - '@esbuild/linux-arm64': 0.19.5 - '@esbuild/linux-ia32': 0.19.5 - '@esbuild/linux-loong64': 0.19.5 - '@esbuild/linux-mips64el': 0.19.5 - '@esbuild/linux-ppc64': 0.19.5 - '@esbuild/linux-riscv64': 0.19.5 - '@esbuild/linux-s390x': 0.19.5 - '@esbuild/linux-x64': 0.19.5 - '@esbuild/netbsd-x64': 0.19.5 - '@esbuild/openbsd-x64': 0.19.5 - '@esbuild/sunos-x64': 0.19.5 - '@esbuild/win32-arm64': 0.19.5 - '@esbuild/win32-ia32': 0.19.5 - '@esbuild/win32-x64': 0.19.5 + '@esbuild/android-arm': 0.19.8 + '@esbuild/android-arm64': 0.19.8 + '@esbuild/android-x64': 0.19.8 + '@esbuild/darwin-arm64': 0.19.8 + '@esbuild/darwin-x64': 0.19.8 + '@esbuild/freebsd-arm64': 0.19.8 + '@esbuild/freebsd-x64': 0.19.8 + '@esbuild/linux-arm': 0.19.8 + '@esbuild/linux-arm64': 0.19.8 + '@esbuild/linux-ia32': 0.19.8 + '@esbuild/linux-loong64': 0.19.8 + '@esbuild/linux-mips64el': 0.19.8 + '@esbuild/linux-ppc64': 0.19.8 + '@esbuild/linux-riscv64': 0.19.8 + '@esbuild/linux-s390x': 0.19.8 + '@esbuild/linux-x64': 0.19.8 + '@esbuild/netbsd-x64': 0.19.8 + '@esbuild/openbsd-x64': 0.19.8 + '@esbuild/sunos-x64': 0.19.8 + '@esbuild/win32-arm64': 0.19.8 + '@esbuild/win32-ia32': 0.19.8 + '@esbuild/win32-x64': 0.19.8 dev: true /escalade@3.1.1: @@ -19821,7 +20819,7 @@ packages: optional: true dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -19934,31 +20932,6 @@ packages: '@scure/bip39': 1.2.1 dev: true - /ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.1.6): - resolution: {integrity: sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==} - engines: {node: '>=10.0'} - hasBin: true - peerDependencies: - ethers: '*' - dependencies: - '@ethereum-waffle/chai': 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) - '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@5.1.6) - '@ethereum-waffle/mock-contract': 4.0.4(ethers@5.7.2) - '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) - ethers: 5.7.2 - solc: 0.8.15 - typechain: 8.3.2(typescript@5.1.6) - transitivePeerDependencies: - - '@ensdomains/ens' - - '@ensdomains/resolver' - - '@ethersproject/abi' - - '@ethersproject/providers' - - debug - - encoding - - supports-color - - typescript - dev: true - /ethereumjs-abi@0.6.8: resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} dependencies: @@ -19976,17 +20949,6 @@ packages: ethjs-util: 0.1.6 rlp: 2.2.7 - /ethereumjs-util@7.1.3: - resolution: {integrity: sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==} - engines: {node: '>=10.0.0'} - dependencies: - '@types/bn.js': 5.1.3 - bn.js: 5.2.1 - create-hash: 1.2.0 - ethereum-cryptography: 0.1.3 - rlp: 2.2.7 - dev: true - /ethereumjs-util@7.1.5: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} @@ -20050,6 +21012,22 @@ packages: - bufferutil - utf-8-validate + /ethers@6.9.0: + resolution: {integrity: sha512-pmfNyQzc2mseLe91FnT2vmNaTt8dDzhxZ/xItAV7uGsF4dI4ek2ufMu3rAkgQETL/TIs0GS5A+U05g9QyWnv3Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.5.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /etherscan-api@10.3.0(debug@4.3.4): resolution: {integrity: sha512-XH+E7J2c6Wq750stvFuIIMdiLv5v65nTRftQojXuQXNfEsQaZOOgeY11WHdrGh6yh90ekDJQldgf033tIS1rCw==} dependencies: @@ -20180,6 +21158,21 @@ packages: signal-exit: 3.0.7 strip-final-newline: 3.0.0 + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + /executable@4.1.1: resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} engines: {node: '>=4'} @@ -20689,14 +21682,6 @@ packages: /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - /find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - dev: true - /find-up@2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} @@ -20841,7 +21826,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 '@types/json-schema': 7.0.14 chalk: 4.1.2 chokidar: 3.5.3 @@ -21111,32 +22096,6 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /ganache@7.4.3: - resolution: {integrity: sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==} - hasBin: true - dependencies: - '@trufflesuite/bigint-buffer': 1.1.10 - '@types/bn.js': 5.1.3 - '@types/lru-cache': 5.1.1 - '@types/seedrandom': 3.0.1 - emittery: 0.10.0 - keccak: 3.0.2 - leveldown: 6.1.0 - secp256k1: 4.0.3 - optionalDependencies: - bufferutil: 4.0.5 - utf-8-validate: 5.0.7 - dev: true - bundledDependencies: - - '@trufflesuite/bigint-buffer' - - emittery - - keccak - - leveldown - - secp256k1 - - '@types/bn.js' - - '@types/lru-cache' - - '@types/seedrandom' - /generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} dependencies: @@ -21147,10 +22106,6 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - /get-caller-file@1.0.3: - resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} - dev: true - /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -21232,6 +22187,11 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -21867,7 +22827,7 @@ packages: murmur-128: 0.2.1 dev: true - /hardhat@2.18.2(ts-node@10.9.1)(typescript@5.1.6): + /hardhat@2.18.2(typescript@5.1.6): resolution: {integrity: sha512-lUVmJg7DsKcUCDpqv57CJl6vHqo/1PeHSfM3+WIa8UtRKmXyVTj1qQK01TDiuetkZBVg9Dn52qU+ZwaJQynaKA==} hasBin: true peerDependencies: @@ -21923,7 +22883,6 @@ packages: solc: 0.7.3(debug@4.3.4) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.1.6) tsort: 0.0.1 typescript: 5.1.6 undici: 5.26.5 @@ -22002,7 +22961,75 @@ packages: - supports-color - utf-8-validate - /hardhat@2.18.3(ts-node@10.9.1)(typescript@5.1.6): + /hardhat@2.18.3(ts-node@10.9.1)(typescript@5.3.2): + resolution: {integrity: sha512-JuYaTG+4ZHVjEHCW5Hn6jCHH3LpO75dtgznZpM/dLv12RcSlw/xHbeQh3FAsGahQr1epKryZcZEMHvztVZHe0g==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-blockchain': 7.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-evm': 2.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-statemanager': 2.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + '@nomicfoundation/ethereumjs-vm': 7.0.2 + '@nomicfoundation/solidity-analyzer': 0.1.1 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.3 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + chalk: 2.4.2 + chokidar: 3.5.3 + ci-info: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 2.1.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + glob: 7.2.0 + immutable: 4.3.4 + io-ts: 1.10.4 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.2.0 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.7.3(debug@4.3.4) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.3.2) + tsort: 0.0.1 + typescript: 5.3.2 + undici: 5.26.5 + uuid: 8.3.2 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /hardhat@2.18.3(typescript@5.1.6): resolution: {integrity: sha512-JuYaTG+4ZHVjEHCW5Hn6jCHH3LpO75dtgznZpM/dLv12RcSlw/xHbeQh3FAsGahQr1epKryZcZEMHvztVZHe0g==} hasBin: true peerDependencies: @@ -22058,7 +23085,6 @@ packages: solc: 0.7.3(debug@4.3.4) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.1.6) tsort: 0.0.1 typescript: 5.1.6 undici: 5.26.5 @@ -22070,6 +23096,74 @@ packages: - utf-8-validate dev: false + /hardhat@2.19.1(ts-node@10.9.1)(typescript@5.3.2): + resolution: {integrity: sha512-bsWa63g1GB78ZyMN08WLhFElLPA+J+pShuKD1BFO2+88g3l+BL3R07vj9deIi9dMbssxgE714Gof1dBEDGqnCw==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-blockchain': 7.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-evm': 2.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-statemanager': 2.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + '@nomicfoundation/ethereumjs-vm': 7.0.2 + '@nomicfoundation/solidity-analyzer': 0.1.1 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.3 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + chalk: 2.4.2 + chokidar: 3.5.3 + ci-info: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 2.1.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + glob: 7.2.0 + immutable: 4.3.4 + io-ts: 1.10.4 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.2.0 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.7.3(debug@4.3.4) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.3.2) + tsort: 0.0.1 + typescript: 5.3.2 + undici: 5.26.5 + uuid: 8.3.2 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true @@ -22578,6 +23672,11 @@ packages: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + /humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: @@ -22657,14 +23756,6 @@ packages: /immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - /immediate@3.2.3: - resolution: {integrity: sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==} - dev: true - - /immediate@3.3.0: - resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} - dev: true - /immer@9.0.21: resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} dev: false @@ -22873,11 +23964,6 @@ packages: dependencies: loose-envify: 1.4.0 - /invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} - dev: true - /io-ts@1.10.4: resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} dependencies: @@ -23666,13 +24752,6 @@ packages: call-bind: 1.0.5 dev: true - /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - dependencies: - number-is-nan: 1.0.1 - dev: true - /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} @@ -23976,10 +25055,6 @@ packages: tslib: 2.6.2 dev: false - /is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - dev: true - /is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true @@ -24143,7 +25218,7 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.1 @@ -24155,7 +25230,7 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/parser': 7.23.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -24168,7 +25243,7 @@ packages: resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/parser': 7.23.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -24231,6 +25306,11 @@ packages: /it-all@2.0.1: resolution: {integrity: sha512-9UuJcCRZsboz+HBQTNOau80Dw+ryGaHYFP/cPYzFBJBFcfDathMYnhHk4t52en9+fcyDGPTdLB+lFc1wzQIroA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /it-all@3.0.4: + resolution: {integrity: sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==} + dev: true /it-batch@1.0.9: resolution: {integrity: sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA==} @@ -24673,11 +25753,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 18.18.7 - babel-jest: 29.7.0(@babel/core@7.23.2) + babel-jest: 29.7.0(@babel/core@7.23.5) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -24808,7 +25888,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.2 chalk: 4.1.2 @@ -24936,15 +26016,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 '@babel/generator': 7.23.0 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.5) '@babel/types': 7.23.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.5) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -25059,11 +26139,6 @@ packages: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: true - /js-base64@3.7.5: resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} dev: false @@ -25117,23 +26192,23 @@ packages: resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} dev: false - /jscodeshift@0.14.0(@babel/preset-env@7.23.2): + /jscodeshift@0.14.0(@babel/preset-env@7.23.5): resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} hasBin: true peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/core': 7.23.2 - '@babel/parser': 7.23.0 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.2) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.2) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) - '@babel/preset-env': 7.23.2(@babel/core@7.23.2) - '@babel/preset-flow': 7.22.15(@babel/core@7.23.2) - '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) - '@babel/register': 7.22.15(@babel/core@7.23.2) - babel-core: 7.0.0-bridge.0(@babel/core@7.23.2) + '@babel/core': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.5) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.5) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.5) + '@babel/preset-env': 7.23.5(@babel/core@7.23.5) + '@babel/preset-flow': 7.22.15(@babel/core@7.23.5) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.5) + '@babel/register': 7.22.15(@babel/core@7.23.5) + babel-core: 7.0.0-bridge.0(@babel/core@7.23.5) chalk: 4.1.2 flow-parser: 0.206.0 graceful-fs: 4.2.11 @@ -25201,12 +26276,6 @@ packages: resolution: {integrity: sha512-xa0LTQsyaq8awYyZyuUsporWisZFiyqzxGW8CKM3t7oouf0GFAKYJnqAm6e9NLNBQOCtOLvy614DEiRX/rPbnA==} dev: false - /json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - dependencies: - bignumber.js: 9.1.2 - dev: true - /json-buffer@3.0.0: resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} @@ -25259,8 +26328,8 @@ packages: ts-algebra: 1.2.2 dev: false - /json-schema-to-typescript@12.0.0: - resolution: {integrity: sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==} + /json-schema-to-typescript@13.1.1: + resolution: {integrity: sha512-F3CYhtA7F3yPbb8vF7sFchk/2dnr1/yTKf8RcvoNpjnh67ZS/ZMH1ElLt5KHAtf2/bymiejLQQszszPWEeTdSw==} engines: {node: '>=12.0.0'} hasBin: true dependencies: @@ -25403,25 +26472,6 @@ packages: randombytes: 2.1.0 dev: false - /keccak@3.0.1: - resolution: {integrity: sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==} - engines: {node: '>=10.0.0'} - requiresBuild: true - dependencies: - node-addon-api: 2.0.2 - node-gyp-build: 4.6.1 - dev: true - - /keccak@3.0.2: - resolution: {integrity: sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==} - engines: {node: '>=10.0.0'} - requiresBuild: true - dependencies: - node-addon-api: 2.0.2 - node-gyp-build: 4.6.1 - readable-stream: 3.6.2 - dev: true - /keccak@3.0.4: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} @@ -25509,76 +26559,6 @@ packages: engines: {node: '> 0.8'} dev: true - /lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} - dependencies: - invert-kv: 1.0.0 - dev: true - - /level-codec@9.0.2: - resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==} - engines: {node: '>=6'} - dependencies: - buffer: 5.7.1 - dev: true - - /level-concat-iterator@2.0.1: - resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==} - engines: {node: '>=6'} - dev: true - - /level-concat-iterator@3.1.0: - resolution: {integrity: sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==} - engines: {node: '>=10'} - dependencies: - catering: 2.1.1 - dev: true - - /level-errors@2.0.1: - resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==} - engines: {node: '>=6'} - dependencies: - errno: 0.1.8 - dev: true - - /level-iterator-stream@4.0.2: - resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==} - engines: {node: '>=6'} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - xtend: 4.0.2 - dev: true - - /level-mem@5.0.1: - resolution: {integrity: sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==} - engines: {node: '>=6'} - dependencies: - level-packager: 5.1.1 - memdown: 5.1.0 - dev: true - - /level-packager@5.1.1: - resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==} - engines: {node: '>=6'} - dependencies: - encoding-down: 6.3.0 - levelup: 4.4.0 - dev: true - - /level-supports@1.0.1: - resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==} - engines: {node: '>=6'} - dependencies: - xtend: 4.0.2 - dev: true - - /level-supports@2.1.0: - resolution: {integrity: sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==} - engines: {node: '>=10'} - dev: true - /level-supports@4.0.1: resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} engines: {node: '>=12'} @@ -25590,15 +26570,6 @@ packages: buffer: 6.0.3 module-error: 1.0.2 - /level-ws@2.0.0: - resolution: {integrity: sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==} - engines: {node: '>=6'} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - xtend: 4.0.2 - dev: true - /level@8.0.0: resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} engines: {node: '>=12'} @@ -25606,27 +26577,6 @@ packages: browser-level: 1.0.1 classic-level: 1.3.0 - /leveldown@6.1.0: - resolution: {integrity: sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==} - engines: {node: '>=10.12.0'} - requiresBuild: true - dependencies: - abstract-leveldown: 7.2.0 - napi-macros: 2.0.0 - node-gyp-build: 4.6.1 - dev: true - - /levelup@4.4.0: - resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==} - engines: {node: '>=6'} - dependencies: - deferred-leveldown: 5.3.0 - level-errors: 2.0.1 - level-iterator-stream: 4.0.2 - level-supports: 1.0.1 - xtend: 4.0.2 - dev: true - /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -25842,17 +26792,6 @@ packages: lit-html: 2.8.0 dev: false - /load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 2.2.0 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 - dev: true - /load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} @@ -25900,6 +26839,14 @@ packages: engines: {node: '>=14'} dev: true + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.4.2 + pkg-types: 1.0.3 + dev: true + /localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} dependencies: @@ -25944,10 +26891,6 @@ packages: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} dev: false - /lodash.assign@4.2.0: - resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} - dev: true - /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true @@ -26242,10 +27185,6 @@ packages: /lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - /ltgt@2.2.1: - resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} - dev: true - /lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} dev: true @@ -26462,18 +27401,6 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - /memdown@5.1.0: - resolution: {integrity: sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==} - engines: {node: '>=6'} - dependencies: - abstract-leveldown: 6.2.3 - functional-red-black-tree: 1.0.1 - immediate: 3.2.3 - inherits: 2.0.4 - ltgt: 2.2.1 - safe-buffer: 5.2.1 - dev: true - /memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} @@ -26564,17 +27491,6 @@ packages: resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} dev: true - /merkle-patricia-tree@4.2.4: - resolution: {integrity: sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==} - dependencies: - '@types/levelup': 4.3.3 - ethereumjs-util: 7.1.5 - level-mem: 5.0.1 - level-ws: 2.0.0 - readable-stream: 3.6.2 - semaphore-async-await: 1.5.1 - dev: true - /mermaid@9.4.3: resolution: {integrity: sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw==} dependencies: @@ -26616,7 +27532,7 @@ packages: resolution: {integrity: sha512-Hh6PW34Ug/nShlBGxkwQJSgPGAzSJ9FwQXhUImkzdsDgVu6zj5bx258J8cJVSandjNoQ8nbaHK6CaHlnbZKbyA==} engines: {node: '>=16'} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 hermes-parser: 0.12.0 nullthrows: 1.1.1 transitivePeerDependencies: @@ -26715,65 +27631,65 @@ packages: uglify-es: 3.3.9 dev: false - /metro-react-native-babel-preset@0.76.8(@babel/core@7.23.2): + /metro-react-native-babel-preset@0.76.8(@babel/core@7.23.5): resolution: {integrity: sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==} engines: {node: '>=16'} peerDependencies: '@babel/core': '*' dependencies: - '@babel/core': 7.23.2 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.23.2) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) - '@babel/plugin-proposal-export-default-from': 7.22.17(@babel/core@7.23.2) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.2) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.2) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.2) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.23.2) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.2) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.2) + '@babel/core': 7.23.5 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.23.5) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.5) + '@babel/plugin-proposal-export-default-from': 7.22.17(@babel/core@7.23.5) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.5) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.5) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.5) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.23.5) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.23.5) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.5) + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.5) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-typescript': 7.23.5(@babel/core@7.23.5) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.5) '@babel/template': 7.22.15 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.23.2) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.23.5) react-refresh: 0.4.3 transitivePeerDependencies: - supports-color dev: false - /metro-react-native-babel-transformer@0.76.8(@babel/core@7.23.2): + /metro-react-native-babel-transformer@0.76.8(@babel/core@7.23.5): resolution: {integrity: sha512-3h+LfS1WG1PAzhq8QF0kfXjxuXetbY/lgz8vYMQhgrMMp17WM1DNJD0gjx8tOGYbpbBC1qesJ45KMS4o5TA73A==} engines: {node: '>=16'} peerDependencies: '@babel/core': '*' dependencies: - '@babel/core': 7.23.2 - babel-preset-fbjs: 3.4.0(@babel/core@7.23.2) + '@babel/core': 7.23.5 + babel-preset-fbjs: 3.4.0(@babel/core@7.23.5) hermes-parser: 0.12.0 - metro-react-native-babel-preset: 0.76.8(@babel/core@7.23.2) + metro-react-native-babel-preset: 0.76.8(@babel/core@7.23.5) nullthrows: 1.1.1 transitivePeerDependencies: - supports-color @@ -26796,8 +27712,8 @@ packages: resolution: {integrity: sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==} engines: {node: '>=16'} dependencies: - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 invariant: 2.2.4 metro-symbolicate: 0.76.8 nullthrows: 1.1.1 @@ -26827,10 +27743,10 @@ packages: resolution: {integrity: sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA==} engines: {node: '>=16'} dependencies: - '@babel/core': 7.23.2 - '@babel/generator': 7.23.0 + '@babel/core': 7.23.5 + '@babel/generator': 7.23.5 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 + '@babel/traverse': 7.23.5 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color @@ -26840,11 +27756,11 @@ packages: resolution: {integrity: sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ==} engines: {node: '>=16'} dependencies: - '@babel/core': 7.23.2 - '@babel/generator': 7.23.0 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - babel-preset-fbjs: 3.4.0(@babel/core@7.23.2) + '@babel/core': 7.23.5 + '@babel/generator': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 + babel-preset-fbjs: 3.4.0(@babel/core@7.23.5) metro: 0.76.8 metro-babel-transformer: 0.76.8 metro-cache: 0.76.8 @@ -26864,13 +27780,13 @@ packages: engines: {node: '>=16'} hasBin: true dependencies: - '@babel/code-frame': 7.22.13 - '@babel/core': 7.23.2 - '@babel/generator': 7.23.0 - '@babel/parser': 7.23.0 + '@babel/code-frame': 7.23.5 + '@babel/core': 7.23.5 + '@babel/generator': 7.23.5 + '@babel/parser': 7.23.5 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 accepts: 1.3.8 async: 3.2.4 chalk: 4.1.2 @@ -26895,7 +27811,7 @@ packages: metro-inspector-proxy: 0.76.8 metro-minify-terser: 0.76.8 metro-minify-uglify: 0.76.8 - metro-react-native-babel-preset: 0.76.8(@babel/core@7.23.2) + metro-react-native-babel-preset: 0.76.8(@babel/core@7.23.5) metro-resolver: 0.76.8 metro-runtime: 0.76.8 metro-source-map: 0.76.8 @@ -27105,14 +28021,6 @@ packages: braces: 3.0.2 picomatch: 2.3.1 - /miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} - hasBin: true - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - dev: true - /mime-db@1.33.0: resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} engines: {node: '>= 0.6'} @@ -27253,13 +28161,6 @@ packages: dependencies: brace-expansion: 2.0.1 - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} @@ -27608,16 +28509,18 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /nanoid@4.0.2: resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} engines: {node: ^14 || ^16 || >=18} hasBin: true dev: false - /napi-macros@2.0.0: - resolution: {integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==} - dev: true - /napi-macros@2.2.2: resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} @@ -27676,7 +28579,7 @@ packages: /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - /next@13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0): + /next@13.5.6(@babel/core@7.23.5)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==} engines: {node: '>=16.14.0'} hasBin: true @@ -27698,7 +28601,7 @@ packages: postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.23.2)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.23.5)(react@18.2.0) watchpack: 2.4.0 optionalDependencies: '@next/swc-darwin-arm64': 13.5.6 @@ -27804,18 +28707,6 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - /node-gyp-build@4.3.0: - resolution: {integrity: sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /node-gyp-build@4.4.0: - resolution: {integrity: sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==} - hasBin: true - dev: true - /node-gyp-build@4.6.1: resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} hasBin: true @@ -27939,11 +28830,6 @@ packages: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} dev: false - /number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - dev: true - /number-to-bn@1.7.0: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -28251,13 +29137,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} - dependencies: - lcid: 1.0.0 - dev: true - /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -28353,6 +29232,13 @@ packages: dependencies: yocto-queue: 1.0.0 + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} @@ -28533,13 +29419,6 @@ packages: resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} dev: true - /parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - dependencies: - error-ex: 1.3.2 - dev: true - /parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -28551,7 +29430,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -28613,6 +29492,7 @@ packages: /path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: false /path-case@3.0.4: resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} @@ -28621,13 +29501,6 @@ packages: tslib: 2.6.2 dev: false - /path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie-promise: 2.0.1 - dev: true - /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -28700,15 +29573,6 @@ packages: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: true - /path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - pinkie-promise: 2.0.1 - dev: true - /path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -29306,6 +30170,15 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /postcss@8.4.32: + resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /preact@10.18.1: resolution: {integrity: sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==} dev: false @@ -29600,10 +30473,6 @@ packages: /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - dev: true - /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true @@ -29859,7 +30728,7 @@ packages: typescript: optional: true dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 address: 1.2.2 browserslist: 4.22.1 chalk: 4.1.2 @@ -30032,7 +30901,7 @@ packages: optional: true dependencies: base-64: 0.1.0 - react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) + react-native: 0.72.6(@babel/core@7.23.5)(@babel/preset-env@7.23.5)(react@18.2.0) utf8: 3.0.0 dev: false @@ -30040,7 +30909,7 @@ packages: resolution: {integrity: sha512-WJr256xBquk7X2O83QYWKqgLg43Zg3SrgjPc/kr0gCD2LoXA+2L72BW4cmstH12GbGeutqs/eXk3jgDQ2iCSvQ==} dev: false - /react-native@0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0): + /react-native@0.72.6(@babel/core@7.23.5)(@babel/preset-env@7.23.5)(react@18.2.0): resolution: {integrity: sha512-RafPY2gM7mcrFySS8TL8x+TIO3q7oAlHpzEmC7Im6pmXni6n1AuufGaVh0Narbr1daxstw7yW7T9BKW5dpVc2A==} engines: {node: '>=16'} hasBin: true @@ -30048,11 +30917,11 @@ packages: react: 18.2.0 dependencies: '@jest/create-cache-key-function': 29.7.0 - '@react-native-community/cli': 11.3.7(@babel/core@7.23.2) + '@react-native-community/cli': 11.3.7(@babel/core@7.23.5) '@react-native-community/cli-platform-android': 11.3.7 '@react-native-community/cli-platform-ios': 11.3.7 '@react-native/assets-registry': 0.72.0 - '@react-native/codegen': 0.72.7(@babel/preset-env@7.23.2) + '@react-native/codegen': 0.72.7(@babel/preset-env@7.23.5) '@react-native/gradle-plugin': 0.72.11 '@react-native/js-polyfills': 0.72.1 '@react-native/normalize-colors': 0.72.0 @@ -30282,14 +31151,6 @@ packages: dependencies: loose-envify: 1.4.0 - /read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} - dependencies: - find-up: 1.1.2 - read-pkg: 1.1.0 - dev: true - /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -30298,15 +31159,6 @@ packages: read-pkg: 5.2.0 type-fest: 0.8.1 - /read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.5.0 - path-type: 1.1.0 - dev: true - /read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} @@ -30707,11 +31559,6 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - /require-from-string@1.2.1: - resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} - engines: {node: '>=0.10.0'} - dev: true - /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -30720,10 +31567,6 @@ packages: resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} dev: false - /require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - dev: true - /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -30904,13 +31747,6 @@ packages: hash-base: 3.1.0 inherits: 2.0.4 - /rlp@2.2.6: - resolution: {integrity: sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==} - hasBin: true - dependencies: - bn.js: 4.12.0 - dev: true - /rlp@2.2.7: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true @@ -30958,18 +31794,18 @@ packages: is-plain-object: 3.0.1 dev: true - /rollup-plugin-dts@5.3.1(rollup@3.29.4)(typescript@5.1.6): - resolution: {integrity: sha512-gusMi+Z4gY/JaEQeXnB0RUdU82h1kF0WYzCWgVmV4p3hWXqelaKuCvcJawfeg+EKn2T1Ie+YWF2OiN1/L8bTVg==} - engines: {node: '>=v14.21.3'} + /rollup-plugin-dts@6.1.0(rollup@3.29.4)(typescript@5.3.2): + resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==} + engines: {node: '>=16'} peerDependencies: - rollup: ^3.0 - typescript: ^4.1 || ^5.0 + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 dependencies: magic-string: 0.30.5 rollup: 3.29.4 - typescript: 5.1.6 + typescript: 5.3.2 optionalDependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 dev: true /rollup-plugin-dts@6.1.0(rollup@4.1.4)(typescript@4.9.5): @@ -30983,28 +31819,27 @@ packages: rollup: 4.1.4 typescript: 4.9.5 optionalDependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 dev: true - /rollup-plugin-esbuild@5.0.0(esbuild@0.17.19)(rollup@3.29.4): - resolution: {integrity: sha512-1cRIOHAPh8WQgdQQyyvFdeOdxuiyk+zB5zJ5+YOwrZP4cJ0MT3Fs48pQxrZeyZHcn+klFherytILVfE4aYrneg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} + /rollup-plugin-esbuild@6.1.0(esbuild@0.19.8)(rollup@3.29.4): + resolution: {integrity: sha512-HPpXU65V8bSpW8eSYPahtUJaJHmbxJGybuf/M8B3bz/6i11YaYHlNNJIQ38gSEV0FyohQOgVxJ2YMEEZtEmwvA==} + engines: {node: '>=14.18.0'} peerDependencies: - esbuild: '>=0.10.1' - rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 + esbuild: '>=0.18.0' + rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 dependencies: '@rollup/pluginutils': 5.0.5(rollup@3.29.4) debug: 4.3.4(supports-color@8.1.1) es-module-lexer: 1.3.1 - esbuild: 0.17.19 - joycon: 3.1.1 - jsonc-parser: 3.2.0 + esbuild: 0.19.8 + get-tsconfig: 4.7.2 rollup: 3.29.4 transitivePeerDependencies: - supports-color dev: true - /rollup-plugin-esbuild@6.1.0(esbuild@0.19.5)(rollup@4.1.4): + /rollup-plugin-esbuild@6.1.0(esbuild@0.19.8)(rollup@4.1.4): resolution: {integrity: sha512-HPpXU65V8bSpW8eSYPahtUJaJHmbxJGybuf/M8B3bz/6i11YaYHlNNJIQ38gSEV0FyohQOgVxJ2YMEEZtEmwvA==} engines: {node: '>=14.18.0'} peerDependencies: @@ -31014,7 +31849,7 @@ packages: '@rollup/pluginutils': 5.0.5(rollup@4.1.4) debug: 4.3.4(supports-color@8.1.1) es-module-lexer: 1.3.1 - esbuild: 0.19.5 + esbuild: 0.19.8 get-tsconfig: 4.7.2 rollup: 4.1.4 transitivePeerDependencies: @@ -31078,6 +31913,26 @@ packages: fsevents: 2.3.3 dev: true + /rollup@4.6.1: + resolution: {integrity: sha512-jZHaZotEHQaHLgKr8JnQiDT1rmatjgKlMekyksz+yk9jt/8z9quNjnKNRoaM0wd9DC2QKXjmWWuDYtM3jfF8pQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.6.1 + '@rollup/rollup-android-arm64': 4.6.1 + '@rollup/rollup-darwin-arm64': 4.6.1 + '@rollup/rollup-darwin-x64': 4.6.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.6.1 + '@rollup/rollup-linux-arm64-gnu': 4.6.1 + '@rollup/rollup-linux-arm64-musl': 4.6.1 + '@rollup/rollup-linux-x64-gnu': 4.6.1 + '@rollup/rollup-linux-x64-musl': 4.6.1 + '@rollup/rollup-win32-arm64-msvc': 4.6.1 + '@rollup/rollup-win32-ia32-msvc': 4.6.1 + '@rollup/rollup-win32-x64-msvc': 4.6.1 + fsevents: 2.3.3 + dev: true + /rpc-websockets@7.6.1: resolution: {integrity: sha512-MmRGaJJvxTHSRxYPjJJqcj2zWnCetw7YbYbKlD0Yc7qVw6PsZhRJg1MI3mpWlpBs+4zO+urlNfLl9zLsdOD/gA==} dependencies: @@ -31305,6 +32160,7 @@ packages: /seedrandom@3.0.5: resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + dev: false /seek-bzip@1.0.6: resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} @@ -31322,11 +32178,6 @@ packages: dependencies: node-forge: 1.3.1 - /semaphore-async-await@1.5.1: - resolution: {integrity: sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==} - engines: {node: '>=4.1'} - dev: true - /semiver@1.1.0: resolution: {integrity: sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==} engines: {node: '>=6'} @@ -31628,12 +32479,21 @@ packages: simple-concat: 1.0.1 dev: true - /sinon@15.2.0: - resolution: {integrity: sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==} - deprecated: 16.1.1 + /sinon-chai@3.7.0(chai@4.3.10)(sinon@17.0.1): + resolution: {integrity: sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==} + peerDependencies: + chai: ^4.0.0 + sinon: '>=4.0.0' + dependencies: + chai: 4.3.10 + sinon: 17.0.1 + dev: true + + /sinon@17.0.1: + resolution: {integrity: sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==} dependencies: '@sinonjs/commons': 3.0.0 - '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/fake-timers': 11.2.2 '@sinonjs/samsam': 8.0.0 diff: 5.1.0 nise: 5.1.5 @@ -31745,17 +32605,6 @@ packages: uuid: 8.3.2 websocket-driver: 0.7.4 - /solc@0.4.26: - resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} - hasBin: true - dependencies: - fs-extra: 0.30.0 - memorystream: 0.3.1 - require-from-string: 1.2.1 - semver: 5.7.2 - yargs: 4.8.1 - dev: true - /solc@0.7.3(debug@4.3.4): resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} engines: {node: '>=8.0.0'} @@ -31773,22 +32622,6 @@ packages: transitivePeerDependencies: - debug - /solc@0.8.15: - resolution: {integrity: sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==} - engines: {node: '>=10.0.0'} - hasBin: true - dependencies: - command-exists: 1.2.9 - commander: 8.3.0 - follow-redirects: 1.15.3(debug@4.3.4) - js-sha3: 0.8.0 - memorystream: 0.3.1 - semver: 5.7.2 - tmp: 0.0.33 - transitivePeerDependencies: - - debug - dev: true - /solhint-plugin-prettier@0.0.5(prettier-plugin-solidity@1.1.3)(prettier@2.8.8): resolution: {integrity: sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA==} peerDependencies: @@ -32153,6 +32986,10 @@ packages: /std-env@3.4.3: resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} + /std-env@3.6.0: + resolution: {integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==} + dev: true + /stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} @@ -32217,15 +33054,6 @@ packages: deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dev: false - /string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - dev: true - /string-width@2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} @@ -32349,13 +33177,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} - dependencies: - is-utf8: 0.2.1 - dev: true - /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -32429,7 +33250,7 @@ packages: inline-style-parser: 0.1.1 dev: false - /styled-jsx@5.1.1(@babel/core@7.23.2)(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.23.5)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -32442,7 +33263,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.5 client-only: 0.0.1 react: 18.2.0 dev: false @@ -32736,11 +33557,6 @@ packages: minimatch: 3.1.2 dev: true - /testrpc@0.0.1: - resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} - deprecated: testrpc has been renamed to ganache-cli, please use this package from now on. - dev: true - /text-encoding-utf-8@1.0.2: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} dev: false @@ -32896,11 +33712,21 @@ packages: engines: {node: '>=14.0.0'} dev: true + /tinypool@0.8.1: + resolution: {integrity: sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==} + engines: {node: '>=14.0.0'} + dev: true + /tinyspy@1.1.1: resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} engines: {node: '>=14.0.0'} dev: true + /tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + engines: {node: '>=14.0.0'} + dev: true + /title-case@3.0.3: resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} dependencies: @@ -33067,14 +33893,6 @@ packages: typescript: 4.9.5 dev: true - /ts-essentials@7.0.3(typescript@5.1.6): - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} - peerDependencies: - typescript: '>=3.7.0' - dependencies: - typescript: 5.1.6 - dev: true - /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true @@ -33103,19 +33921,6 @@ packages: webpack: 5.89.0(webpack-cli@5.1.4) dev: true - /ts-mocha@10.0.0(mocha@10.2.0): - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - dependencies: - mocha: 10.2.0 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.14.2 - dev: true - /ts-node@10.9.1(@types/node@18.18.7)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -33146,7 +33951,7 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-node@10.9.1(@types/node@18.18.7)(typescript@5.1.6): + /ts-node@10.9.1(@types/node@18.18.7)(typescript@5.3.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -33172,7 +33977,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.1.6 + typescript: 5.3.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -33207,21 +34012,6 @@ packages: yn: 3.1.1 dev: true - /ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - dev: true - /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} requiresBuild: true @@ -33457,27 +34247,6 @@ packages: - supports-color dev: true - /typechain@8.3.2(typescript@5.1.6): - resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} - hasBin: true - peerDependencies: - typescript: '>=4.3.0' - dependencies: - '@types/prettier': 2.7.3 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 7.0.1 - glob: 7.1.7 - js-sha3: 0.8.0 - lodash: 4.17.21 - mkdirp: 1.0.4 - prettier: 2.8.8 - ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} @@ -33525,35 +34294,35 @@ packages: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true - /typedoc-plugin-markdown@3.17.0(typedoc@0.23.28): - resolution: {integrity: sha512-+uh5fHNfNSGdUxae0FWOuJ8Xu9Sl08jkdshOg6dilAqN/ZXmYsUFFDKw70fYfiGxdCLvpUuyr9FYO+WAa2lHeA==} + /typedoc-plugin-markdown@3.17.1(typedoc@0.25.4): + resolution: {integrity: sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw==} peerDependencies: typedoc: '>=0.24.0' dependencies: handlebars: 4.7.8 - typedoc: 0.23.28(typescript@5.1.6) + typedoc: 0.25.4(typescript@5.3.2) dev: true - /typedoc-plugin-missing-exports@2.1.0(typedoc@0.23.28): + /typedoc-plugin-missing-exports@2.1.0(typedoc@0.25.4): resolution: {integrity: sha512-+1DhqZCEu7Vu5APnrqpPwl31D+hXpt1fV0Le9ycCRL1eLVdatdl6KVt4SEVwPxnEpKwgOn2dNX6I9+0F1aO2aA==} peerDependencies: typedoc: 0.24.x || 0.25.x dependencies: - typedoc: 0.23.28(typescript@5.1.6) + typedoc: 0.25.4(typescript@5.3.2) dev: true - /typedoc@0.23.28(typescript@5.1.6): - resolution: {integrity: sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==} - engines: {node: '>= 14.14'} + /typedoc@0.25.4(typescript@5.3.2): + resolution: {integrity: sha512-Du9ImmpBCw54bX275yJrxPVnjdIyJO/84co0/L9mwe0R3G4FSR6rQ09AlXVRvZEGMUg09+z/usc8mgygQ1aidA==} + engines: {node: '>= 16'} hasBin: true peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x dependencies: lunr: 2.3.9 marked: 4.3.0 - minimatch: 7.4.6 + minimatch: 9.0.3 shiki: 0.14.5 - typescript: 5.1.6 + typescript: 5.3.2 dev: true /typescript@4.9.5: @@ -33566,6 +34335,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + /typescript@5.3.2: + resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} + engines: {node: '>=14.17'} + hasBin: true + /typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} @@ -33959,13 +34733,6 @@ packages: engines: {node: '>= 4'} dev: true - /url@0.11.3: - resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} - dependencies: - punycode: 1.4.1 - qs: 6.11.2 - dev: true - /urlpattern-polyfill@4.0.3: resolution: {integrity: sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ==} dev: true @@ -34063,15 +34830,6 @@ packages: dependencies: node-gyp-build: 4.6.1 - /utf-8-validate@5.0.7: - resolution: {integrity: sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.6.1 - dev: true - optional: true - /utf8-byte-length@1.0.4: resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} dev: false @@ -34272,7 +35030,7 @@ packages: vfile-message: 3.1.4 dev: false - /viem@0.3.50(typescript@5.1.6): + /viem@0.3.50(typescript@5.3.2): resolution: {integrity: sha512-s+LxCYZTR9F/qPk1/n1YDVAX9vSeVz7GraqBZWGrDuenCJxo9ArCoIceJ6ksI0WwSeNzcZ0VVbD/kWRzTxkipw==} dependencies: '@adraffy/ens-normalize': 1.9.0 @@ -34280,8 +35038,8 @@ packages: '@noble/hashes': 1.3.0 '@scure/bip32': 1.3.0 '@scure/bip39': 1.2.0 - '@wagmi/chains': 1.0.0(typescript@5.1.6) - abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) + '@wagmi/chains': 1.0.0(typescript@5.3.2) + abitype: 0.8.7(typescript@5.3.2) isomorphic-ws: 5.0.0(ws@8.12.0) ws: 8.12.0 transitivePeerDependencies: @@ -34337,6 +35095,29 @@ packages: - zod dev: false + /viem@1.19.9(typescript@5.3.2)(zod@3.22.4): + resolution: {integrity: sha512-Sf9U2x4jU0S/FALqYypcspWOGene0NZyD470oUripNhE0Ta6uOE/OgE4toTDVfRxov8qw0JFinr/wPGxYE3+HQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 0.9.8(typescript@5.3.2)(zod@3.22.4) + isows: 1.0.3(ws@8.13.0) + typescript: 5.3.2 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + /vite-node@0.28.5(@types/node@18.18.7): resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} engines: {node: '>=v14.16.0'} @@ -34361,6 +35142,27 @@ packages: - terser dev: true + /vite-node@1.0.1(@types/node@18.18.7): + resolution: {integrity: sha512-Y2Jnz4cr2azsOMMYuVPrQkp3KMnS/0WV8ezZjCy4hU7O5mUHCAVOnFmoEvs1nvix/4mYm74Len8bYRWZJMNP6g==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4(supports-color@8.1.1) + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 5.0.5(@types/node@18.18.7) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite@4.5.0(@types/node@18.18.7): resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -34397,6 +35199,42 @@ packages: fsevents: 2.3.3 dev: true + /vite@5.0.5(@types/node@18.18.7): + resolution: {integrity: sha512-OekeWqR9Ls56f3zd4CaxzbbS11gqYkEiBtnWFFgYR2WV8oPJRRKq0mpskYy/XaoCL3L7VINDhqqOMNDiYdGvGg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.18.7 + esbuild: 0.19.8 + postcss: 8.4.32 + rollup: 4.6.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /vitest@0.28.5: resolution: {integrity: sha512-pyCQ+wcAOX7mKMcBNkzDwEHRGqQvHUl0XnoHR+3Pb1hytAHISgSxv9h0gUiSiYtISXUU3rMrKiKzFYDrI6ZIHA==} engines: {node: '>=v14.16.0'} @@ -34453,6 +35291,63 @@ packages: - terser dev: true + /vitest@1.0.1(@types/node@18.18.7): + resolution: {integrity: sha512-MHsOj079S28hDsvdDvyD1pRj4dcS51EC5Vbe0xvOYX+WryP8soiK2dm8oULi+oA/8Xa/h6GoJEMTmcmBy5YM+Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': ^1.0.0 + '@vitest/ui': ^1.0.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 18.18.7 + '@vitest/expect': 1.0.1 + '@vitest/runner': 1.0.1 + '@vitest/snapshot': 1.0.1 + '@vitest/spy': 1.0.1 + '@vitest/utils': 1.0.1 + acorn-walk: 8.3.0 + cac: 6.7.14 + chai: 4.3.10 + debug: 4.3.4(supports-color@8.1.1) + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.5 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.6.0 + strip-literal: 1.3.0 + tinybench: 2.5.1 + tinypool: 0.8.1 + vite: 5.0.5(@types/node@18.18.7) + vite-node: 1.0.1(@types/node@18.18.7) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} dev: false @@ -35220,10 +36115,6 @@ packages: is-weakset: 2.0.2 dev: true - /which-module@1.0.0: - resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} - dev: true - /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -35279,12 +36170,6 @@ packages: resolution: {integrity: sha512-tE12J/NenOv4xdVobD+AD3fT06T4KNqnzRhkv5nBIu7K+pvOH2oLCEgYP+i+5mF2jtI6FEADheOdZkA8YWET9w==} dev: false - /window-size@0.2.0: - resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} - engines: {node: '>= 0.10.0'} - hasBin: true - dev: true - /word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -35335,14 +36220,6 @@ packages: - utf-8-validate dev: true - /wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - dev: true - /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -35604,10 +36481,6 @@ packages: resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} dev: true - /y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - dev: true - /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -35646,13 +36519,6 @@ packages: camelcase: 5.3.1 decamelize: 1.2.0 - /yargs-parser@2.4.1: - resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} - dependencies: - camelcase: 3.0.0 - lodash.assign: 4.2.0 - dev: true - /yargs-parser@20.2.4: resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} engines: {node: '>=10'} @@ -35714,25 +36580,6 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yargs@4.8.1: - resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} - dependencies: - cliui: 3.2.0 - decamelize: 1.2.0 - get-caller-file: 1.0.3 - lodash.assign: 4.2.0 - os-locale: 1.4.0 - read-pkg-up: 1.0.1 - require-directory: 2.1.1 - require-main-filename: 1.0.1 - set-blocking: 2.0.0 - string-width: 1.0.2 - which-module: 1.0.0 - window-size: 0.2.0 - y18n: 3.2.2 - yargs-parser: 2.4.1 - dev: true - /yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} dependencies: @@ -35740,11 +36587,6 @@ packages: fd-slicer: 1.1.0 dev: true - /yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - dev: true - /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} diff --git a/sdk/.graphclient/index.ts b/sdk/.graphclient/index.ts index 7c3feb4a..9e48bf89 100644 --- a/sdk/.graphclient/index.ts +++ b/sdk/.graphclient/index.ts @@ -1481,7 +1481,8 @@ export type DirectiveResolvers(moduleId: string) => { const relativeModuleId = (pathModule.isAbsolute(moduleId) ? pathModule.relative(baseDir, moduleId) : moduleId).split('\\').join('/').replace(baseDir + '/', ''); diff --git a/sdk/package.json b/sdk/package.json index e8b55be6..575dd9a4 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.0.0-alpha.14", + "version": "1.0.0-alpha.15", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -21,75 +21,67 @@ "package.json" ], "dependencies": { - "@ethereum-attestation-service/eas-sdk": "1.2.2-beta.0", + "@ethereum-attestation-service/eas-sdk": "1.3.7", "@ethersproject/abstract-signer": "^5.7.0", "@graphprotocol/client-add-source-name": "^2.0.0", "@graphprotocol/client-cli": "^3.0.0", "@graphprotocol/client-polling-live": "^2.0.0", - "@graphql-mesh/cache-localforage": "^0.96.0", + "@graphql-mesh/cache-localforage": "^0.96.1", "@graphql-mesh/cross-helpers": "^0.4.1", - "@graphql-mesh/graphql": "^0.96.0", - "@graphql-mesh/http": "^0.96.13", - "@graphql-mesh/merger-bare": "^0.95.7", - "@graphql-mesh/runtime": "^0.96.12", - "@graphql-mesh/store": "^0.95.7", - "@graphql-mesh/utils": "^0.95.7", + "@graphql-mesh/graphql": "^0.96.1", + "@graphql-mesh/http": "^0.97.2", + "@graphql-mesh/merger-bare": "^0.96.1", + "@graphql-mesh/runtime": "^0.97.2", + "@graphql-mesh/store": "^0.96.1", + "@graphql-mesh/utils": "^0.96.1", "@graphql-typed-document-node/core": "^3.2.0", "@hypercerts-org/contracts": "1.0.0-alpha.6", "@openzeppelin/merkle-tree": "^1.0.5", "@whatwg-node/fetch": "^0.9.13", "ajv": "^8.11.2", - "axios": "^1.2.2", + "axios": "^1.6.2", "dotenv": "^16.0.3", "ethers": "5.7.2", "graphql": "^16.6.0", - "ipfs-core": "^0.17.0", "loglevel": "^1.8.1", - "mime": "^3.0.0", "nft.storage": "^7.1.1", "viem": "^1.19.9", "web3.storage": "^4.5.5" }, "devDependencies": { - "@babel/core": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.23.2", - "@faker-js/faker": "^8.0.2", + "@babel/core": "^7.23.5", + "@babel/preset-env": "^7.23.5", + "@babel/preset-typescript": "^7.23.3", + "@faker-js/faker": "^8.3.1", "@rollup/plugin-commonjs": "^24.0.1", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", - "@types/chai": "^4.3.4", - "@types/chai-subset": "^1.3.3", - "@types/jest": "^29.2.5", - "@types/mocha": "9.1.0", + "@types/chai": "^4.3.11", + "@types/chai-subset": "^1.3.5", "@types/node": "^18.11.17", - "@types/sinon": "^10.0.15", + "@types/sinon": "^17.0.2", "@viem/anvil": "^0.0.6", - "abitype": "^0.10.2", + "abitype": "^0.10.3", "chai": "^4.3.7", "chai-assertions-count": "^1.0.2", "chai-subset": "^1.6.0", - "esbuild": "^0.17.10", - "ethereum-waffle": "^4.0.10", - "it-all": "^2.0.0", - "json-schema-to-typescript": "^12.0.0", + "esbuild": "^0.19.8", + "it-all": "^3.0.4", + "json-schema-to-typescript": "^13.1.1", "nyc": "^15.1.0", "rollup": "^3.17.2", "rollup-plugin-auto-external": "^2.0.0", - "rollup-plugin-dts": "^5.2.0", - "rollup-plugin-esbuild": "^5.0.0", + "rollup-plugin-dts": "^6.1.0", + "rollup-plugin-esbuild": "^6.1.0", "rollup-plugin-node-polyfills": "^0.2.1", - "shx": "^0.3.4", - "sinon": "^15.2.0", - "ts-mocha": "^10.0.0", + "sinon": "^17.0.1", + "sinon-chai": "^3.7.0", "ts-node": "^10.9.1", - "tslib": "^2.5.0", - "tsx": "^3.14.0", - "typedoc": "^0.23.25", - "typedoc-plugin-markdown": "^3.14.0", + "typedoc": "^0.25.4", + "typedoc-plugin-markdown": "^3.17.1", "typedoc-plugin-missing-exports": "^2.0.0", - "typescript": "5.1.6", - "vitest": "^0.28.4" + "typescript": "5.3.2", + "vitest": "^1.0.1" }, "scripts": { "build": "pnpm types:json && pnpm graph:build && rollup -c", @@ -98,7 +90,6 @@ "graph:serve": "graphclient serve-dev", "graph:watch": "graphql-codegen -w", "graph:build": "rm -rf ./src/.graphclient && graphclient build --throwOnInvalidConfig", - "graph:build:esm": "rm -rf ./src/.graphclient && NODE_OPTIONS='--loader ts-node/esm' graphclient build --throwOnInvalidConfig", "clean": "rm -rf ./dist", "prebuild": "pnpm clean", "prepack": "pnpm build", diff --git a/sdk/src/client.ts b/sdk/src/client.ts index e0ce6877..6f8c14e9 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -1,6 +1,6 @@ import { HypercertMinterAbi } from "@hypercerts-org/contracts"; import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; -import { ByteArray, GetContractReturnType, Hex, PublicClient, WalletClient, getContract } from "viem"; +import { Account, ByteArray, GetContractReturnType, Hex, PublicClient, WalletClient, getContract } from "viem"; import { HypercertEvaluator } from "./evaluations"; import { HypercertIndexer } from "./indexer"; import { HypercertsStorage } from "./storage"; @@ -16,8 +16,9 @@ import { TransferRestrictions, } from "./types"; import { getConfig } from "./utils/config"; -import { logger } from "./utils"; import { validateAllowlist, validateMetaData, verifyMerkleProof, verifyMerkleProofs } from "./validator"; +import { handleSimulatedContractError } from "./utils/errors"; +import { logger } from "./utils"; /** * The `HypercertClient` is a core class in the hypercerts SDK, providing a high-level interface to interact with the hypercerts system. @@ -120,7 +121,7 @@ export class HypercertClient implements HypercertClientInterface { * @param {bigint} totalUnits - The total units for the claim. * @param {TransferRestrictions} transferRestriction - The transfer restrictions for the claim. * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. - * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @returns {Promise<`0x${string}` | undefined>} A promise that resolves to the transaction hash. * @throws {MalformedDataError} Will throw a `MalformedDataError` if the provided metadata is invalid. */ mintClaim = async ( @@ -128,7 +129,7 @@ export class HypercertClient implements HypercertClientInterface { totalUnits: bigint, transferRestriction: TransferRestrictions, overrides?: SupportedOverrides, - ): Promise<`0x${string}`> => { + ): Promise<`0x${string}` | undefined> => { const { account } = this.getWallet(); // validate metadata @@ -140,14 +141,86 @@ export class HypercertClient implements HypercertClientInterface { // store metadata on IPFS const cid = await this.storage.storeMetadata(metaData); - const { request } = await this._publicClient.simulateContract({ - functionName: "mintClaim", + const request = await this.simulateRequest( account, - args: [account?.address, totalUnits, cid, transferRestriction], + "mintClaim", + [account?.address, totalUnits, cid, transferRestriction], + overrides, + ); + + return this.submitRequest(request); + }; + + /** + * Gets the TransferRestrictions for a claim. + * + * This method first retrieves the read contract using the `getContract` method. It then simulates a contract call to the `readTransferRestriction` function with the provided fraction ID. + * + * @param fractionId + * @returns a Promise that resolves to the applicable transfer restrictions. + */ + getTransferRestrictions = async (fractionId: bigint): Promise => { + const readContract = getContract({ ...this.getContractConfig(), - ...this.getCleanedOverrides(overrides), + publicClient: this._publicClient, }); + return readContract.read.readTransferRestriction([fractionId]) as Promise; + }; + + /** + * Transfers a claim fraction to a new owner. + * + * This method first retrieves the wallet client and account using the `getWallet` method. + * It then simulates a contract call to the `safeTransferFrom` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + * + * @param fractionId + * @param to + * @param overrides + * @returns {Promise<`0x${string}` | undefined>} A promise that resolves to the transaction hash. + */ + transferFraction = async ( + fractionId: bigint, + to: string, + overrides?: SupportedOverrides | undefined, + ): Promise<`0x${string}` | undefined> => { + const { account } = this.getWallet(); + + const request = await this.simulateRequest( + account, + "safeTransferFrom", + [account?.address, to, fractionId, 1, "0x"], + overrides, + ); + + return this.submitRequest(request); + }; + + /** + * Transfers multiple claim fractions to a new owner. + * + * This method first retrieves the wallet client and account using the `getWallet` method. + * It then simulates a contract call to the `safeBatchTransferFrom` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + * + * @param fractionIds + * @param to + * @param overrides + * @returns {Promise<`0x${string}` | undefined>} A promise that resolves to the transaction hash. + */ + batchTransferFractions = async ( + fractionIds: bigint[], + to: `0x${string}`, + overrides?: SupportedOverrides | undefined, + ): Promise<`0x${string}` | undefined> => { + const { account } = this.getWallet(); + + const request = await this.simulateRequest( + account, + "safeBatchTransferFrom", + [account?.address, to, fractionIds, fractionIds.map(() => 1n), "0x"], + overrides, + ); + return this.submitRequest(request); }; @@ -164,7 +237,7 @@ export class HypercertClient implements HypercertClientInterface { * @param {bigint} totalUnits - The total units for the claim. * @param {TransferRestrictions} transferRestriction - The transfer restrictions for the claim. * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. - * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @returns {Promise<`0x${string}` | undefined>} A promise that resolves to the transaction hash. * @throws {MalformedDataError} Will throw a `MalformedDataError` if the provided allowlist or metadata is invalid. */ createAllowlist = async ( @@ -173,7 +246,7 @@ export class HypercertClient implements HypercertClientInterface { totalUnits: bigint, transferRestriction: TransferRestrictions, overrides?: SupportedOverrides, - ): Promise<`0x${string}`> => { + ): Promise<`0x${string}` | undefined> => { const { account } = this.getWallet(); // validate allowlist @@ -196,13 +269,12 @@ export class HypercertClient implements HypercertClientInterface { // store metadata on IPFS const cid = await this.storage.storeMetadata({ ...metaData, allowList: cidMerkle }); - const { request } = await this._publicClient.simulateContract({ - functionName: "createAllowlist", + const request = await this.simulateRequest( account, - args: [account?.address, totalUnits, tree.root, cid, transferRestriction], - ...this.getContractConfig(), - ...this.getCleanedOverrides(overrides), - }); + "createAllowlist", + [account?.address, totalUnits, tree.root, cid, transferRestriction], + overrides, + ); return this.submitRequest(request); }; @@ -218,14 +290,14 @@ export class HypercertClient implements HypercertClientInterface { * @param {bigint} fractionId - The ID of the fraction to split. * @param {bigint[]} fractions - The fractions to split the fraction into. * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. - * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @returns {Promise<`0x${string}` | undefined>} A promise that resolves to the transaction hash. * @throws {ClientError} Will throw a `ClientError` if the fraction is not owned by the account or if the sum of the fractions is not equal to the total units of the fraction. */ splitFractionUnits = async ( fractionId: bigint, fractions: bigint[], overrides?: SupportedOverrides, - ): Promise<`0x${string}`> => { + ): Promise<`0x${string}` | undefined> => { const { account } = this.getWallet(); const readContract = getContract({ @@ -244,13 +316,12 @@ export class HypercertClient implements HypercertClientInterface { if (sumFractions != totalUnits) throw new ClientError("Sum of fractions is not equal to the total units", { totalUnits, sumFractions }); - const { request } = await this._publicClient.simulateContract({ - functionName: "splitFraction", + const request = await this.simulateRequest( account, - args: [account.address, fractionId, fractions], - ...this.getContractConfig(), - ...this.getCleanedOverrides(overrides), - }); + "splitFraction", + [account?.address, fractionId, fractions], + overrides, + ); return this.submitRequest(request); }; @@ -264,10 +335,13 @@ export class HypercertClient implements HypercertClientInterface { * * @param {bigint[]} fractionIds - The IDs of the fractions to merge. * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. - * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @returns {Promise<`0x${string}` | undefined>} A promise that resolves to the transaction hash. * @throws {ClientError} Will throw a `ClientError` if any of the fractions are not owned by the account. */ - mergeFractionUnits = async (fractionIds: bigint[], overrides?: SupportedOverrides): Promise<`0x${string}`> => { + mergeFractionUnits = async ( + fractionIds: bigint[], + overrides?: SupportedOverrides, + ): Promise<`0x${string}` | undefined> => { const { account } = this.getWallet(); const readContract = getContract({ @@ -288,15 +362,7 @@ export class HypercertClient implements HypercertClientInterface { }); } - const { request } = await this._publicClient.simulateContract({ - functionName: "mergeFractions", - account, - args: [account?.address, fractionIds], - ...this.getContractConfig(), - ...this.getCleanedOverrides(overrides), - }); - - console.log(request); + const request = await this.simulateRequest(account, "mergeFractions", [account?.address, fractionIds], overrides); return this.submitRequest(request); }; @@ -310,10 +376,10 @@ export class HypercertClient implements HypercertClientInterface { * * @param {bigint} claimId - The ID of the claim to burn. * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. - * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @returns {Promise<`0x${string}` | undefined>} A promise that resolves to the transaction hash. * @throws {ClientError} Will throw a `ClientError` if the claim is not owned by the account. */ - burnClaimFraction = async (claimId: bigint, overrides?: SupportedOverrides): Promise<`0x${string}`> => { + burnClaimFraction = async (claimId: bigint, overrides?: SupportedOverrides): Promise<`0x${string}` | undefined> => { const { account } = this.getWallet(); const readContract = getContract({ @@ -327,13 +393,7 @@ export class HypercertClient implements HypercertClientInterface { throw new ClientError("Claim is not owned by the signer", { signer: account?.address, claimOwner }); } - const { request } = await this._publicClient.simulateContract({ - functionName: "burnFraction", - account, - args: [account?.address, claimId], - ...this.getContractConfig(), - ...this.getCleanedOverrides(overrides), - }); + const request = await this.simulateRequest(account, "burnFraction", [account?.address, claimId], overrides); return this.submitRequest(request); }; @@ -349,7 +409,7 @@ export class HypercertClient implements HypercertClientInterface { * @param {(Hex | ByteArray)[]} proof - The proof for the claim. * @param {Hex | ByteArray} [root] - The root of the proof. If provided, it is used to verify the proof. * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. - * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @returns {Promise<`0x${string}` | undefined>} A promise that resolves to the transaction hash. * @throws {InvalidOrMissingError} Will throw an `InvalidOrMissingError` if the proof is invalid. */ mintClaimFractionFromAllowlist = async ( @@ -358,7 +418,7 @@ export class HypercertClient implements HypercertClientInterface { proof: (Hex | ByteArray)[], root?: Hex | ByteArray, overrides?: SupportedOverrides, - ): Promise<`0x${string}`> => { + ): Promise<`0x${string}` | undefined> => { const { account } = this.getWallet(); //verify the proof using the OZ merkle tree library @@ -372,13 +432,12 @@ export class HypercertClient implements HypercertClientInterface { ); } - const { request } = await this._publicClient.simulateContract({ - functionName: "mintClaimFromAllowlist", + const request = await this.simulateRequest( account, - args: [account?.address, proof, claimId, units], - ...this.getContractConfig(), - ...this.getCleanedOverrides(overrides), - }); + "mintClaimFromAllowlist", + [account?.address, proof, claimId, units], + overrides, + ); return this.submitRequest(request); }; @@ -394,7 +453,7 @@ export class HypercertClient implements HypercertClientInterface { * @param {(Hex | ByteArray)[][]} proofs - The proofs for each claim. * @param {(Hex | ByteArray)[]} [roots] - The roots of each proof. If provided, they are used to verify the proofs. * @param {SupportedOverrides} [overrides] - Optional overrides for the contract call. - * @returns {Promise<`0x${string}`>} A promise that resolves to the transaction hash. + * @returns {Promise<`0x${string}` | undefined>} A promise that resolves to the transaction hash. * @throws {InvalidOrMissingError} Will throw an `InvalidOrMissingError` if any of the proofs are invalid. */ batchMintClaimFractionsFromAllowlists = async ( @@ -403,7 +462,7 @@ export class HypercertClient implements HypercertClientInterface { proofs: (Hex | ByteArray)[][], roots?: (Hex | ByteArray)[], overrides?: SupportedOverrides, - ): Promise<`0x${string}`> => { + ): Promise<`0x${string}` | undefined> => { const { account } = this.getWallet(); //verify the proof using the OZ merkle tree library @@ -418,13 +477,12 @@ export class HypercertClient implements HypercertClientInterface { ); } - const { request } = await this._publicClient.simulateContract({ - functionName: "batchMintClaimsFromAllowlists", + const request = await this.simulateRequest( account, - args: [account?.address, proofs, claimIds, units], - ...this.getContractConfig(), - ...this.getCleanedOverrides(overrides), - }); + "batchMintClaimsFromAllowlists", + [account?.address, proofs, claimIds, units], + overrides, + ); return this.submitRequest(request); }; @@ -453,10 +511,32 @@ export class HypercertClient implements HypercertClientInterface { throw new ClientError("Could not connect to wallet; sending transactions not allowed.", { client: this }); } if (this.readonly) throw new ClientError("Client is readonly", { client: this }); + if (!this._walletClient.account) throw new ClientError("No account found", { client: this }); return { walletClient: this._walletClient, account: this._walletClient.account }; }; + private simulateRequest = async ( + account: Account, + functionName: string, + args: unknown[], + overrides?: SupportedOverrides, + ) => { + try { + const { request } = await this._publicClient.simulateContract({ + functionName, + account, + args, + ...this.getContractConfig(), + ...this.getCleanedOverrides(overrides), + }); + + return request; + } catch (err) { + throw handleSimulatedContractError(err); + } + }; + /** * Submits a contract request. * @@ -467,8 +547,8 @@ export class HypercertClient implements HypercertClientInterface { * @throws {ClientError} Will throw a `ClientError` if the request fails. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any - private submitRequest = async (request: any): Promise<`0x${string}`> => { - const hash = this._walletClient?.writeContract(request); + private submitRequest = async (request: any) => { + const hash = await this._walletClient?.writeContract(request); if (!hash) { throw new ClientError("Something went wrong when executing request", { request, hash }); diff --git a/sdk/src/types/client.ts b/sdk/src/types/client.ts index e5ba5c5e..37d5100c 100644 --- a/sdk/src/types/client.ts +++ b/sdk/src/types/client.ts @@ -133,13 +133,46 @@ export interface HypercertClientMethods { * @param metaData The metadata for the claim. * @param totalUnits The total number of units for the claim. * @param transferRestriction The transfer restriction for the claim. - * @returns A Promise that resolves to the transaction receipt + * @returns A Promise that resolves to the transaction hash */ mintClaim: ( metaData: HypercertMetadata, totalUnits: bigint, transferRestriction: TransferRestrictions, - ) => Promise<`0x${string}`>; + ) => Promise<`0x${string}` | undefined>; + + /** + * Retrieves the TransferRestrictions for a claim. + * @param fractionId The ID of the claim to retrieve. + * @returns A Promise that resolves to the applicable transfer restrictions. + */ + getTransferRestrictions: (fractionId: bigint) => Promise; + + /** + * Transfers a claim fraction to a new owner. + * @param fractionId + * @param to + * @param overrides + * @returns A Promise that resolves to the transaction hash + */ + transferFraction: ( + fractionId: bigint, + to: `0x${string}`, + overrides?: SupportedOverrides, + ) => Promise<`0x${string}` | undefined>; + + /** + * Transfers multiple claim fractions to a new owner. + * @param fractionIds + * @param to + * @param overrides + * @returns A Promise that resolves to the transaction hash + */ + batchTransferFractions: ( + fractionIds: bigint[], + to: `0x${string}`, + overrides?: SupportedOverrides, + ) => Promise<`0x${string}` | undefined>; /** * Creates a new allowlist and mints a new claim with the allowlist. @@ -147,49 +180,49 @@ export interface HypercertClientMethods { * @param metaData The metadata for the claim. * @param totalUnits The total number of units for the claim. * @param transferRestriction The transfer restriction for the claim. - * @returns A Promise that resolves to the transaction receipt + * @returns A Promise that resolves to the transaction hash */ createAllowlist: ( allowList: AllowlistEntry[], metaData: HypercertMetadata, totalUnits: bigint, transferRestriction: TransferRestrictions, - ) => Promise<`0x${string}`>; + ) => Promise<`0x${string}` | undefined>; /** * Splits a claim into multiple fractions. * @param fractionId The ID of the claim to split. * @param newFractions The number of units for each fraction. - * @returns A Promise that resolves to the transaction receipt + * @returns A Promise that resolves to the transaction hash */ - splitFractionUnits: (fractionId: bigint, fractions: bigint[]) => Promise<`0x${string}`>; + splitFractionUnits: (fractionId: bigint, fractions: bigint[]) => Promise<`0x${string}` | undefined>; /** * Merges multiple claim fractions into a single claim. * @param fractionIds The IDs of the claim fractions to merge. - * @returns A Promise that resolves to the transaction receipt + * @returns A Promise that resolves to the transaction hash */ - mergeFractionUnits: (fractionIds: bigint[]) => Promise<`0x${string}`>; + mergeFractionUnits: (fractionIds: bigint[]) => Promise<`0x${string}` | undefined>; /** * Burns a claim fraction. * @param fractionId The ID of the claim fraction to burn. - * @returns A Promise that resolves to the transaction receipt + * @returns A Promise that resolves to the transaction hash */ - burnClaimFraction: (fractionId: bigint) => Promise<`0x${string}`>; + burnClaimFraction: (fractionId: bigint) => Promise<`0x${string}` | undefined>; /** * Mints a claim fraction from an allowlist. * @param claimId The ID of the claim to mint a fraction for. * @param units The number of units for the fraction. * @param proof The Merkle proof for the allowlist. - * @returns A Promise that resolves to the transaction receipt + * @returns A Promise that resolves to the transaction hash */ mintClaimFractionFromAllowlist: ( claimId: bigint, units: bigint, proof: (Hex | ByteArray)[], - ) => Promise<`0x${string}`>; + ) => Promise<`0x${string}` | undefined>; /** * Batch mints a claim fraction from an allowlist @@ -199,11 +232,11 @@ export interface HypercertClientMethods { * @returns A Promise that resolves to the transaction receipt * @note The length of the arrays must be equal. * @note The order of the arrays must be equal. - * @returns A Promise that resolves to the transaction receipt + * @returns A Promise that resolves to the transaction hash */ batchMintClaimFractionsFromAllowlists: ( claimIds: bigint[], units: bigint[], proofs: (Hex | ByteArray)[][], - ) => Promise<`0x${string}`>; + ) => Promise<`0x${string}` | undefined>; } diff --git a/sdk/src/types/errors.ts b/sdk/src/types/errors.ts index 89640bf6..5da11836 100644 --- a/sdk/src/types/errors.ts +++ b/sdk/src/types/errors.ts @@ -1,3 +1,5 @@ +import { BaseError, Hex } from "viem"; + /** * An interface for errors that have a specific type. */ @@ -29,6 +31,26 @@ export class ClientError extends Error implements CustomError { } } +/** + * An error that is returned by the contract + */ +export class ContractError extends Error implements CustomError { + /** + * Additional error payload. + */ + payload?: { [key: string]: unknown }; + + constructor(errorName?: string, payload?: { data: BaseError | Hex; [key: string]: unknown }) { + const message = errorName + ? `Contract reverted: ${errorName}` + : "Contract returned unparsable error. Inspect payload for returned data."; + + super(message); + this.message = message; + this.payload = payload; + } +} + /** * Fails fetching a remote resource */ diff --git a/sdk/src/utils/errors.ts b/sdk/src/utils/errors.ts index 29bd9c12..31df99da 100644 --- a/sdk/src/utils/errors.ts +++ b/sdk/src/utils/errors.ts @@ -1,5 +1,6 @@ import { ClientError, + ContractError, FetchError, HypercertsSdkError, InvalidOrMissingError, @@ -10,12 +11,15 @@ import { UnsupportedChainError, } from "../types/errors"; +import { BaseError, ContractFunctionRevertedError, Hex, decodeErrorResult } from "viem"; +import { HypercertMinterAbi } from "@hypercerts-org/contracts"; + /** * * Method to catch errors and log them * @param err Error to handle defined in HypercertsSdkError */ -const handleError = (err: HypercertsSdkError) => { +const handleSdkError = (err: HypercertsSdkError) => { switch (err.constructor) { case ClientError: case FetchError: @@ -32,4 +36,41 @@ const handleError = (err: HypercertsSdkError) => { } }; -export { handleError }; +const handleContractError = (data: Hex) => { + try { + const value = decodeErrorResult({ + abi: HypercertMinterAbi, + data, + }); + + return new ContractError(value.errorName, { + data, + args: value.args, + }); + } catch (err) { + return new ContractError(undefined, { + data, + }); + } +}; + +const handleSimulatedContractError = (err: unknown) => { + if (err instanceof BaseError) { + const revertError = err.walk((err) => err instanceof ContractFunctionRevertedError); + if (revertError instanceof ContractFunctionRevertedError) { + const errorName = revertError.data?.errorName; + + return new ContractError(errorName, { + data: revertError.signature ?? err, + args: revertError.data?.args, + error: revertError, + }); + } else { + return new ContractError(undefined, { data: err }); + } + } + + return err; +}; + +export { handleSdkError, handleContractError, handleSimulatedContractError }; diff --git a/sdk/src/utils/index.ts b/sdk/src/utils/index.ts index 23ae4c46..53113f75 100644 --- a/sdk/src/utils/index.ts +++ b/sdk/src/utils/index.ts @@ -4,6 +4,7 @@ import { getProofsFromAllowlist } from "./allowlist"; import { getFromIPFS } from "./fetchers"; import { formatHypercertData } from "./formatter"; import { logger } from "./logger"; +import { handleSdkError, handleContractError } from "./errors"; export { walletClientToSigner, @@ -12,4 +13,6 @@ export { logger, getFromIPFS, formatHypercertData, + handleSdkError, + handleContractError, }; diff --git a/sdk/test/client/burn.test.ts b/sdk/test/client/burn.test.ts index 06c1b1f7..9c097aa7 100644 --- a/sdk/test/client/burn.test.ts +++ b/sdk/test/client/burn.test.ts @@ -4,10 +4,10 @@ import assertionsCount from "chai-assertions-count"; import { HypercertClient } from "../../src/client"; import { walletClient, publicClient } from "../helpers"; -import { ContractFunctionExecutionError, isHex, toHex } from "viem"; +import { isHex, toHex } from "viem"; import sinon from "sinon"; import { faker } from "@faker-js/faker"; -import { ClientError } from "../../src"; +import { ClientError, ContractError } from "../../src"; chai.use(assertionsCount); @@ -92,7 +92,8 @@ describe("burn fraction tokens in HypercertClient", () => { noHash = await client.burnClaimFraction(fractionId, { gasLimit: "FALSE_VALUE" as unknown as bigint }); expect.fail("should have thrown on incorrect gasLimit value"); } catch (e) { - expect(e).to.be.instanceOf(ContractFunctionExecutionError); + console.log(e); + expect(e).to.be.instanceOf(ContractError); } const hash = await client.burnClaimFraction(fractionId, { gasLimit: 12300000n }); diff --git a/sdk/test/client/minting.test.ts b/sdk/test/client/minting.test.ts index 4fbd29fa..fa4e3f00 100644 --- a/sdk/test/client/minting.test.ts +++ b/sdk/test/client/minting.test.ts @@ -2,11 +2,11 @@ import { describe, it, beforeEach, afterAll, beforeAll } from "vitest"; import chai, { expect } from "chai"; import assertionsCount from "chai-assertions-count"; import sinon from "sinon"; -import { ContractFunctionExecutionError, encodeFunctionResult, isHex, parseEther } from "viem"; +import { encodeFunctionResult, isHex, parseEther } from "viem"; import { HypercertClient } from "../../src/client"; import { HypercertMetadata, formatHypercertData } from "../../src"; -import { MalformedDataError } from "../../src/types/errors"; +import { ContractError, MalformedDataError } from "../../src/types/errors"; import { TransferRestrictions } from "../../src/types/hypercerts"; import { getRawInputData, publicClient, walletClient, testClient } from "../helpers"; import { HypercertMinterAbi } from "@hypercerts-org/contracts"; @@ -101,7 +101,9 @@ describe("mintClaim in HypercertClient", () => { }); expect.fail("Should throw Error"); } catch (e) { - expect(e).to.be.instanceOf(ContractFunctionExecutionError); + expect(e).to.be.instanceOf(ContractError); + const error = e as ContractError; + expect(error.message).to.equal("Contract returned unparsable error. Inspect payload for returned data."); } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion diff --git a/sdk/test/client/split.merge.test.ts b/sdk/test/client/split.merge.test.ts index 27498047..bfd3cf54 100644 --- a/sdk/test/client/split.merge.test.ts +++ b/sdk/test/client/split.merge.test.ts @@ -7,8 +7,8 @@ import sinon from "sinon"; import { HypercertClient } from "../../src/client"; import { publicClient, walletClient } from "../helpers"; -import { ContractFunctionExecutionError, isHex, toHex } from "viem"; -import { ClientError } from "src"; +import { isHex, toHex } from "viem"; +import { ClientError, ContractError } from "src"; import { faker } from "@faker-js/faker"; chai.use(assertionsCount); @@ -78,7 +78,7 @@ describe("split and merge", () => { try { await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: "FALSE_VALUE" as unknown as bigint }); } catch (e) { - expect(e instanceof ContractFunctionExecutionError).to.be.true; + expect(e instanceof ContractError).to.be.true; } const hash = await client.splitFractionUnits(fractionId, [100n, 200n], { gasLimit: 12300000n }); diff --git a/sdk/test/utils/errors.test.ts b/sdk/test/utils/errors.test.ts index a4509d23..15ac9281 100644 --- a/sdk/test/utils/errors.test.ts +++ b/sdk/test/utils/errors.test.ts @@ -1,14 +1,88 @@ -import { describe, it } from "vitest"; +import { describe, it, beforeEach, afterAll, beforeAll } from "vitest"; +import chai from "chai"; +import assertionsCount from "chai-assertions-count"; +import sinon from "sinon"; +import sinonChai from "sinon-chai"; -import { expect } from "chai"; +import { ContractError, FetchError, MalformedDataError, UnsupportedChainError } from "../../src/types/errors"; +import { handleSdkError } from "../../src/utils/errors"; -import { FetchError, MalformedDataError, UnsupportedChainError } from "../../src/types/errors"; -import { handleError } from "../../src/utils/errors"; +import { getRawInputData, publicClient, walletClient, testClient } from "../helpers"; -describe("Error handler test", () => { - it("checking error handler", () => { - expect(handleError(new FetchError("testing FetchError", { url: "http://badexample.com" }))).to.be.undefined; - expect(handleError(new MalformedDataError("testing MalformedDataError", { data: { foo: "bar" } }))).to.be.undefined; - expect(handleError(new UnsupportedChainError("testing UnsupportedChainError", { chainID: 1337 }))).to.be.undefined; +//eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import { CIDString, NFTStorage } from "nft.storage"; +import { HypercertClient, HypercertMinterAbi, TransferRestrictions, formatHypercertData } from "src"; +import { parseEther, encodeErrorResult } from "viem"; + +chai.use(assertionsCount); + +const expect = chai.expect; +chai.use(sinonChai); + +describe("SDK Error handler", () => { + it("handles SDK errors", () => { + expect(handleSdkError(new FetchError("testing FetchError", { url: "http://badexample.com" }))).to.be.undefined; + expect(handleSdkError(new MalformedDataError("testing MalformedDataError", { data: { foo: "bar" } }))).to.be + .undefined; + expect(handleSdkError(new UnsupportedChainError("testing UnsupportedChainError", { chainID: 1337 }))).to.be + .undefined; + }); +}); + +describe("Contract Error handler", () => { + const mockCorrectMetadataCid = "testCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u" as CIDString; + + const storeBlobMock = sinon.stub(NFTStorage, "storeBlob").resolves(mockCorrectMetadataCid); + + const client = new HypercertClient({ + chain: { id: 5 }, + walletClient, + publicClient, + nftStorageToken: "test", + web3StorageToken: "test", + }); + + const readSpy = sinon.stub(publicClient, "readContract"); + const writeSpy = sinon.stub(walletClient, "writeContract"); + + beforeAll(async () => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await testClient.setBalance({ address: walletClient.account!.address, value: parseEther("1") }); + }); + + beforeEach(async () => { + chai.Assertion.resetAssertsCheck(); + writeSpy.resetBehavior(); + writeSpy.resetHistory(); + + storeBlobMock.resetHistory(); + }); + + afterAll(() => { + sinon.restore(); + }); + + it("handles throw on mintClaim", async () => { + expect(client.readonly).to.be.false; + + const rawData = getRawInputData(); + const { data: formattedData } = formatHypercertData(rawData); + readSpy.resolves(walletClient.account!.address); + + const value = encodeErrorResult({ + abi: HypercertMinterAbi, + errorName: "NotAllowed", + }); + writeSpy.resolves(value); + + try { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await client.mintClaim(formattedData!, 0n, TransferRestrictions.DisallowAll); + } catch (e) { + expect(e).to.be.instanceOf(ContractError); + const err = e as ContractError; + expect(err.message).to.equal("Contract returned NotAllowed"); + } }); }); diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index 942fa312..04d83b83 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -2,8 +2,8 @@ "compilerOptions": { "lib": ["ES6", "DOM", "ESNext"], "target": "ESNext", - "module": "NodeNext", - "moduleResolution": "NodeNext", + "module": "ESNext", + "moduleResolution": "node", "baseUrl": ".", "outDir": "dist", "allowJs": true, diff --git a/sdk/vitest.config.ts b/sdk/vitest.config.mts similarity index 100% rename from sdk/vitest.config.ts rename to sdk/vitest.config.mts From 0c249aa3a18ecab6e8af74753dcfbfd54fd93c8c Mon Sep 17 00:00:00 2001 From: Jip Stavenuiter Date: Thu, 7 Dec 2023 18:49:14 +0100 Subject: [PATCH 040/118] Chore/lets merge together (#1220) * [Prod]:Deployed to Celo, updated Defender, version bumps for everyone (#1137) * Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop * Feat/deploy to celo (#1135) * Add HC contracts to OpenZeppelin Defender (#1134) * Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop * feat(defender): use hc packages in oz defender * feat(celo): graph deploy, sdk and defender config * chore(bump): SDK 0.8.14 Celo deployment * feat(celo): add celo support to frontend * chore(graph): fix turbo test flow * chore(graph): add comment to p.json * fix(gha): use pnpm cache in graph gha (#1138) * chore: add wrapper components for split and merge functionality (#1148) * format external url in case it is a direct ipfs link (#1181) * merge fixes --------- Co-authored-by: bitbeckers --- contracts/contracts/AllowlistMinter.sol | 70 +++ contracts/contracts/HypercertMinter.sol | 230 ++++++++++ contracts/contracts/SemiFungible1155.sol | 434 ++++++++++++++++++ contracts/contracts/interfaces/IAllowlist.sol | 13 + .../contracts/interfaces/IHypercertToken.sol | 62 +++ contracts/contracts/libs/Errors.sol | 15 + .../StrategyHypercertFractionOffer.md | 2 +- graph/tests/.latest.json | 2 +- pnpm-lock.yaml | 218 ++++----- 9 files changed, 935 insertions(+), 111 deletions(-) create mode 100644 contracts/contracts/AllowlistMinter.sol create mode 100644 contracts/contracts/HypercertMinter.sol create mode 100644 contracts/contracts/SemiFungible1155.sol create mode 100644 contracts/contracts/interfaces/IAllowlist.sol create mode 100644 contracts/contracts/interfaces/IHypercertToken.sol create mode 100644 contracts/contracts/libs/Errors.sol diff --git a/contracts/contracts/AllowlistMinter.sol b/contracts/contracts/AllowlistMinter.sol new file mode 100644 index 00000000..599831cb --- /dev/null +++ b/contracts/contracts/AllowlistMinter.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.16; + +import {MerkleProofUpgradeable} from "oz-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; +import {IAllowlist} from "./interfaces/IAllowlist.sol"; + +import {Errors} from "./libs/Errors.sol"; + +/// @title Interface for hypercert token interactions +/// @author bitbeckers +/// @notice This interface declares the required functionality for a hypercert token +/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) +contract AllowlistMinter is IAllowlist { + event AllowlistCreated(uint256 tokenID, bytes32 root); + event LeafClaimed(uint256 tokenID, bytes32 leaf); + + mapping(uint256 => bytes32) internal merkleRoots; + mapping(uint256 => mapping(bytes32 => bool)) public hasBeenClaimed; + mapping(uint256 => uint256) internal maxUnits; + mapping(uint256 => uint256) internal minted; + + function isAllowedToClaim(bytes32[] calldata proof, uint256 claimID, bytes32 leaf) + external + view + returns (bool isAllowed) + { + if (merkleRoots[claimID].length == 0) revert Errors.DoesNotExist(); + isAllowed = MerkleProofUpgradeable.verifyCalldata(proof, merkleRoots[claimID], leaf); + } + + function _createAllowlist(uint256 claimID, bytes32 merkleRoot, uint256 units) internal { + if (merkleRoot == "" || units == 0) revert Errors.Invalid(); + if (merkleRoots[claimID] != "") revert Errors.DuplicateEntry(); + + merkleRoots[claimID] = merkleRoot; + maxUnits[claimID] = units; + emit AllowlistCreated(claimID, merkleRoot); + } + + function _processClaim(bytes32[] calldata proof, uint256 claimID, uint256 amount) internal { + if (merkleRoots[claimID].length == 0) revert Errors.DoesNotExist(); + + bytes32 leaf = _calculateLeaf(msg.sender, amount); + + if (hasBeenClaimed[claimID][leaf]) revert Errors.AlreadyClaimed(); + if ( + !MerkleProofUpgradeable.verifyCalldata(proof, merkleRoots[claimID], leaf) + || (minted[claimID] + amount) > maxUnits[claimID] + ) revert Errors.Invalid(); + hasBeenClaimed[claimID][leaf] = true; + + emit LeafClaimed(claimID, leaf); + } + + function _calculateLeaf(address account, uint256 amount) internal pure returns (bytes32 leaf) { + leaf = keccak256(bytes.concat(keccak256(abi.encode(account, amount)))); + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + * Assuming 30 available slots (slots cost space, cost gas) + * 1. merkleRoots + * 2. hasBeenClaimed + * 3. maxUnits + * 4. minted + */ + uint256[26] private __gap; +} diff --git a/contracts/contracts/HypercertMinter.sol b/contracts/contracts/HypercertMinter.sol new file mode 100644 index 00000000..4679ddb3 --- /dev/null +++ b/contracts/contracts/HypercertMinter.sol @@ -0,0 +1,230 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.16; + +import {IHypercertToken} from "./interfaces/IHypercertToken.sol"; +import {SemiFungible1155} from "./SemiFungible1155.sol"; +import {AllowlistMinter} from "./AllowlistMinter.sol"; +import {PausableUpgradeable} from "oz-upgradeable/security/PausableUpgradeable.sol"; + +import {Errors} from "./libs/Errors.sol"; + +/// @title Contract for managing hypercert claims and whitelists +/// @author bitbeckers +/// @notice Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token. +/// @notice This contract supports whitelisted minting via { AllowlistMinter }. +/// @dev Wrapper contract to expose and chain functions. +contract HypercertMinter is IHypercertToken, SemiFungible1155, AllowlistMinter, PausableUpgradeable { + // solhint-disable-next-line const-name-snakecase + string public constant name = "HypercertMinter"; + /// @dev from typeID to a transfer policy + mapping(uint256 => TransferRestrictions) internal typeRestrictions; + + /// INIT + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } + function initialize() public virtual initializer { + __SemiFungible1155_init(); + __Pausable_init(); + } + + /// EXTERNAL + + /// @notice Mint a semi-fungible token for the impact claim referenced via `uri` + /// @dev see {IHypercertToken} + function mintClaim(address account, uint256 units, string memory _uri, TransferRestrictions restrictions) + external + override + whenNotPaused + { + // This enables us to release this restriction in the future + if (msg.sender != account) revert Errors.NotAllowed(); + uint256 claimID = _mintNewTypeWithToken(account, units, _uri); + typeRestrictions[claimID] = restrictions; + emit ClaimStored(claimID, _uri, units); + } + + /// @notice Mint semi-fungible tokens for the impact claim referenced via `uri` + /// @dev see {IHypercertToken} + function mintClaimWithFractions( + address account, + uint256 units, + uint256[] calldata fractions, + string memory _uri, + TransferRestrictions restrictions + ) external override whenNotPaused { + // This enables us to release this restriction in the future + if (msg.sender != account) revert Errors.NotAllowed(); + //Using sum to compare units and fractions (sanity check) + if (_getSum(fractions) != units) revert Errors.Invalid(); + + uint256 claimID = _mintNewTypeWithTokens(account, fractions, _uri); + typeRestrictions[claimID] = restrictions; + emit ClaimStored(claimID, _uri, units); + } + + /// @notice Mint a semi-fungible token representing a fraction of the claim + /// @dev Calls AllowlistMinter to verify `proof`. + /// @dev Mints the `amount` of units for the hypercert stored under `claimID` + function mintClaimFromAllowlist(address account, bytes32[] calldata proof, uint256 claimID, uint256 units) + external + whenNotPaused + { + _processClaim(proof, claimID, units); + _mintToken(account, claimID, units); + } + + /// @notice Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + /// @dev Calls AllowlistMinter to verify `proofs`. + /// @dev Mints the `amount` of units for the hypercert stored under `claimIDs` + function batchMintClaimsFromAllowlists( + address account, + bytes32[][] calldata proofs, + uint256[] calldata claimIDs, + uint256[] calldata units + ) external whenNotPaused { + uint256 len = claimIDs.length; + for (uint256 i; i < len;) { + _processClaim(proofs[i], claimIDs[i], units[i]); + unchecked { + ++i; + } + } + _batchMintTokens(account, claimIDs, units); + } + + /// @notice Register a claim and the whitelist for minting token(s) belonging to that claim + /// @dev Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units` + /// @dev Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims + function createAllowlist( + address account, + uint256 units, + bytes32 merkleRoot, + string memory _uri, + TransferRestrictions restrictions + ) external whenNotPaused { + uint256 claimID = _createTokenType(account, units, _uri); + _createAllowlist(claimID, merkleRoot, units); + typeRestrictions[claimID] = restrictions; + emit ClaimStored(claimID, _uri, units); + } + + /// @notice Split a claimtokens value into parts with summed value equal to the original + /// @dev see {IHypercertToken} + function splitFraction(address _account, uint256 _tokenID, uint256[] calldata _newFractions) + external + whenNotPaused + { + _splitTokenUnits(_account, _tokenID, _newFractions); + } + + /// @notice Merge the value of tokens belonging to the same claim + /// @dev see {IHypercertToken} + function mergeFractions(address _account, uint256[] calldata _fractionIDs) external whenNotPaused { + _mergeTokensUnits(_account, _fractionIDs); + } + + /// @notice Burn a claimtoken + /// @dev see {IHypercertToken} + function burnFraction(address _account, uint256 _tokenID) external whenNotPaused { + _burnToken(_account, _tokenID); + } + + /// @dev see {IHypercertToken} + function unitsOf(uint256 tokenID) external view override returns (uint256 units) { + units = _unitsOf(tokenID); + } + + /// @dev see {IHypercertToken} + function unitsOf(address account, uint256 tokenID) external view override returns (uint256 units) { + units = _unitsOf(account, tokenID); + } + + /// PAUSABLE + + function pause() external onlyOwner { + _pause(); + } + + function unpause() external onlyOwner { + _unpause(); + } + + /// METADATA + + /// @dev see { IHypercertMetadata} + function uri(uint256 tokenID) + public + view + override(IHypercertToken, SemiFungible1155) + returns (string memory _uri) + { + _uri = SemiFungible1155.uri(tokenID); + } + + /// TRANSFER RESTRICTIONS + + function readTransferRestriction(uint256 tokenID) external view returns (string memory) { + TransferRestrictions temp = typeRestrictions[getBaseType(tokenID)]; + if (temp == TransferRestrictions.AllowAll) return "AllowAll"; + if (temp == TransferRestrictions.DisallowAll) return "DisallowAll"; + if (temp == TransferRestrictions.FromCreatorOnly) return "FromCreatorOnly"; + return ""; + } + + /// INTERNAL + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol } + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { + // solhint-disable-previous-line no-empty-blocks + } + + function _beforeTokenTransfer( + address operator, + address from, + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) internal virtual override { + super._beforeTokenTransfer(operator, from, to, ids, amounts, data); + + // By-pass transfer restrictions for minting and burning + if (from == address(0)) { + // Minting + return; + } else if (to == address(0)) { + // Burning + return; + } + + // Transfer case, where to and from are non-zero + uint256 len = ids.length; + for (uint256 i; i < len;) { + uint256 typeID = getBaseType(ids[i]); + TransferRestrictions policy = typeRestrictions[typeID]; + if (policy == TransferRestrictions.DisallowAll) { + revert Errors.TransfersNotAllowed(); + } else if (policy == TransferRestrictions.FromCreatorOnly && from != creators[typeID]) { + revert Errors.TransfersNotAllowed(); + } + unchecked { + ++i; + } + } + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + * Assuming 30 available slots (slots cost space, cost gas) + * 1. typeRestrictions + */ + uint256[29] private __gap; +} diff --git a/contracts/contracts/SemiFungible1155.sol b/contracts/contracts/SemiFungible1155.sol new file mode 100644 index 00000000..1add3178 --- /dev/null +++ b/contracts/contracts/SemiFungible1155.sol @@ -0,0 +1,434 @@ +// SPDX-License-Identifier: MIT +// Used components of Enjin example implementation for mixed fungibility +// https://github.com/enjin/erc-1155/blob/master/contracts/ERC1155MixedFungibleMintable.sol +pragma solidity 0.8.16; + +import {ERC1155Upgradeable} from "oz-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; +import {ERC1155BurnableUpgradeable} from "oz-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol"; +import {ERC1155URIStorageUpgradeable} from "oz-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol"; +import {OwnableUpgradeable} from "oz-upgradeable/access/OwnableUpgradeable.sol"; +import {Initializable} from "oz-upgradeable/proxy/utils/Initializable.sol"; +import {UUPSUpgradeable} from "oz-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {Errors} from "./libs/Errors.sol"; + +/// @title Contract for minting semi-fungible EIP1155 tokens +/// @author bitbeckers +/// @notice Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` +/// @dev Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens) +contract SemiFungible1155 is + Initializable, + ERC1155Upgradeable, + ERC1155BurnableUpgradeable, + ERC1155URIStorageUpgradeable, + OwnableUpgradeable, + UUPSUpgradeable +{ + /// @dev Counter used to generate next typeID. + uint256 internal typeCounter; + + /// @dev Bitmask used to expose only upper 128 bits of uint256 + uint256 internal constant TYPE_MASK = type(uint256).max << 128; + + /// @dev Bitmask used to expose only lower 128 bits of uint256 + uint256 internal constant NF_INDEX_MASK = type(uint256).max >> 128; + + uint256 internal constant FRACTION_LIMIT = 253; + + /// @dev Mapping of `tokenID` to address of `owner` + mapping(uint256 => address) internal owners; + + /// @dev Mapping of `tokenID` to address of `creator` + mapping(uint256 => address) internal creators; + + /// @dev Used to determine amount of `units` stored in token at `tokenID` + mapping(uint256 => uint256) internal tokenValues; + + /// @dev Used to find highest index of token belonging to token at `typeID` + mapping(uint256 => uint256) internal maxIndex; + + /// @dev Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID` + event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value); + + /// @dev Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs` + event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values); + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol } + // solhint-disable-next-line func-name-mixedcase + function __SemiFungible1155_init() public virtual onlyInitializing { + __ERC1155_init(""); + __ERC1155Burnable_init(); + __ERC1155URIStorage_init(); + __Ownable_init(); + __UUPSUpgradeable_init(); + } + + /// @dev Get index of fractional token at `_id` by returning lower 128 bit values + /// @dev Returns 0 if `_id` is a baseType + function getItemIndex(uint256 tokenID) internal pure returns (uint256) { + return tokenID & NF_INDEX_MASK; + } + + /// @dev Get base type ID for token at `_id` by returning upper 128 bit values + function getBaseType(uint256 tokenID) internal pure returns (uint256) { + return tokenID & TYPE_MASK; + } + + /// @dev Identify that token at `_id` is base type. + /// @dev Upper 128 bits identify base type ID, lower bits should be 0 + function isBaseType(uint256 tokenID) internal pure returns (bool) { + return (tokenID & TYPE_MASK == tokenID) && (tokenID & NF_INDEX_MASK == 0); + } + + /// @dev Identify that token at `_id` is fraction of a claim. + /// @dev Upper 128 bits identify base type ID, lower bits should be > 0 + function isTypedItem(uint256 tokenID) internal pure returns (bool) { + return (tokenID & TYPE_MASK != 0) && (tokenID & NF_INDEX_MASK != 0); + } + + /// READ + function ownerOf(uint256 tokenID) public view returns (address _owner) { + _owner = owners[tokenID]; + } + + /// @dev see {IHypercertToken} + function _unitsOf(uint256 tokenID) internal view returns (uint256 units) { + units = tokenValues[tokenID]; + } + + /// @dev see {IHypercertToken} + function _unitsOf(address account, uint256 tokenID) internal view returns (uint256 units) { + // Check if fraction token and accounts owns it + if (ownerOf(tokenID) == account) { + units = tokenValues[tokenID]; + } + } + + /// MUTATE + + /// @dev create token type ID based of token counter + + function _createTokenType(address _account, uint256 units, string memory _uri) internal returns (uint256 typeID) { + _notMaxType(typeCounter); + typeID = ++typeCounter << 128; + + creators[typeID] = _account; + tokenValues[typeID] = units; + + _setURI(typeID, _uri); + + //Event emitted for indexing purposes + emit TransferSingle(_account, address(0), address(0), typeID, 0); + } + + /// @dev Mint a new token type and the initial units + function _mintNewTypeWithToken(address _account, uint256 _units, string memory _uri) + internal + returns (uint256 typeID) + { + if (_units == 0) { + revert Errors.NotAllowed(); + } + typeID = _createTokenType(_account, _units, _uri); + + uint256 tokenID = typeID + ++maxIndex[typeID]; //1 based indexing, 0 holds type data + + tokenValues[tokenID] = _units; + + _mint(_account, tokenID, 1, ""); + emit ValueTransfer(typeID, 0, tokenID, _units); + } + + /// @dev Mint a new token type and the initial fractions + function _mintNewTypeWithTokens(address _account, uint256[] calldata _fractions, string memory _uri) + internal + returns (uint256 typeID) + { + typeID = _mintNewTypeWithToken(_account, _getSum(_fractions), _uri); + _splitTokenUnits(_account, typeID + maxIndex[typeID], _fractions); + } + + /// @dev Mint a new token for an existing type + function _mintToken(address _account, uint256 _typeID, uint256 _units) internal returns (uint256 tokenID) { + if (!isBaseType(_typeID)) revert Errors.NotAllowed(); + + _notMaxItem(maxIndex[_typeID]); + + unchecked { + tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data + } + + tokenValues[tokenID] = _units; + + _mint(_account, tokenID, 1, ""); + emit ValueTransfer(_typeID, 0, tokenID, _units); + } + + /// @dev Mint new tokens for existing types + /// @notice Enables batch claiming from multiple allowlists + function _batchMintTokens(address _account, uint256[] calldata _typeIDs, uint256[] calldata _units) + internal + returns (uint256[] memory tokenIDs) + { + uint256 len = _typeIDs.length; + + tokenIDs = new uint256[](len); + uint256[] memory amounts = new uint256[](len); + uint256[] memory zeroes = new uint256[](len); + + for (uint256 i; i < len;) { + uint256 _typeID = _typeIDs[i]; + if (!isBaseType(_typeID)) revert Errors.NotAllowed(); + _notMaxItem(maxIndex[_typeID]); + + unchecked { + uint256 tokenID = _typeID + ++maxIndex[_typeID]; //1 based indexing, 0 holds type data + tokenValues[tokenID] = _units[i]; + tokenIDs[i] = tokenID; + amounts[i] = 1; + ++i; + } + } + + _mintBatch(_account, tokenIDs, amounts, ""); + emit BatchValueTransfer(_typeIDs, zeroes, tokenIDs, _units); + } + + /// @dev Split the units of `_tokenID` owned by `account` across `_values` + /// @dev `_values` must sum to total `units` held at `_tokenID` + function _splitTokenUnits(address _account, uint256 _tokenID, uint256[] calldata _values) internal { + if (_values.length > FRACTION_LIMIT || _values.length < 2) revert Errors.ArraySize(); + if (tokenValues[_tokenID] != _getSum(_values)) revert Errors.NotAllowed(); + + // Current token + uint256 _typeID = getBaseType(_tokenID); + uint256 valueLeft = tokenValues[_tokenID]; + + // Prepare batch processing, we want to skip the first entry + uint256 len = _values.length - 1; + + uint256[] memory typeIDs = new uint256[](len); + uint256[] memory fromIDs = new uint256[](len); + uint256[] memory toIDs = new uint256[](len); + uint256[] memory amounts = new uint256[](len); + uint256[] memory values = new uint256[](len); + + { + uint256[] memory _valuesCache = _values; + uint256 swapValue = _valuesCache[len]; + _valuesCache[len] = _valuesCache[0]; + _valuesCache[0] = swapValue; + + for (uint256 i; i < len;) { + _notMaxItem(maxIndex[_typeID]); + + typeIDs[i] = _typeID; + fromIDs[i] = _tokenID; + toIDs[i] = _typeID + ++maxIndex[_typeID]; + amounts[i] = 1; + values[i] = _valuesCache[i]; + + unchecked { + ++i; + } + } + } + + _beforeUnitTransfer(_msgSender(), _account, fromIDs, toIDs, values, ""); + + for (uint256 i; i < len;) { + valueLeft -= values[i]; + + tokenValues[toIDs[i]] = values[i]; + + unchecked { + ++i; + } + } + + tokenValues[_tokenID] = valueLeft; + + _mintBatch(_account, toIDs, amounts, ""); + + emit BatchValueTransfer(typeIDs, fromIDs, toIDs, values); + } + + /// @dev Merge the units of `_fractionIDs`. + /// @dev Base type of `_fractionIDs` must be identical for all tokens. + function _mergeTokensUnits(address _account, uint256[] memory _fractionIDs) internal { + if (_fractionIDs.length > FRACTION_LIMIT || _fractionIDs.length < 2) { + revert Errors.ArraySize(); + } + uint256 len = _fractionIDs.length - 1; + + uint256 target = _fractionIDs[len]; + + uint256 _totalValue; + uint256[] memory fromIDs = new uint256[](len); + uint256[] memory toIDs = new uint256[](len); + uint256[] memory values = new uint256[](len); + uint256[] memory amounts = new uint256[](len); + + { + for (uint256 i; i < len;) { + uint256 _fractionID = _fractionIDs[i]; + fromIDs[i] = _fractionID; + toIDs[i] = target; + amounts[i] = 1; + values[i] = tokenValues[_fractionID]; + + unchecked { + ++i; + } + } + } + + _beforeUnitTransfer(_msgSender(), _account, fromIDs, toIDs, values, ""); + + for (uint256 i; i < len;) { + _totalValue += values[i]; + + delete tokenValues[fromIDs[i]]; + unchecked { + ++i; + } + } + + tokenValues[target] += _totalValue; + + _burnBatch(_account, fromIDs, amounts); + } + + /// @dev Burn the token at `_tokenID` owned by `_account` + /// @dev Not allowed to burn base type. + /// @dev `_tokenID` must hold all value declared at base type + function _burnToken(address _account, uint256 _tokenID) internal { + if (_account != _msgSender() && !isApprovedForAll(_account, _msgSender())) revert Errors.NotApprovedOrOwner(); + + uint256 value = tokenValues[_tokenID]; + + delete tokenValues[_tokenID]; + + _burn(_account, _tokenID, 1); + emit ValueTransfer(getBaseType(_tokenID), _tokenID, 0, value); + } + + /// TRANSFERS + + // The following functions are overrides required by Solidity. + function _afterTokenTransfer( + address operator, + address from, + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) internal virtual override { + super._afterTokenTransfer(operator, from, to, ids, amounts, data); + + uint256 len = ids.length; + + for (uint256 i; i < len;) { + owners[ids[i]] = to; + unchecked { + ++i; + } + } + } + + function _beforeUnitTransfer( + address operator, + address from, + uint256[] memory fromIDs, + uint256[] memory toIDs, + uint256[] memory values, + bytes memory data + ) internal virtual { + uint256 len = fromIDs.length; + + for (uint256 i; i < len;) { + uint256 _from = fromIDs[i]; + uint256 _to = toIDs[i]; + + if (isBaseType(_from)) revert Errors.NotAllowed(); + if (getBaseType(_from) != getBaseType(_to)) revert Errors.TypeMismatch(); + if (from != _msgSender() && !isApprovedForAll(from, _msgSender())) revert Errors.NotApprovedOrOwner(); + unchecked { + ++i; + } + } + } + + /// METADATA + + /// @dev see { openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol } + /// @dev Always returns the URI for the basetype so that it's managed in one place. + function uri(uint256 tokenID) + public + view + virtual + override(ERC1155Upgradeable, ERC1155URIStorageUpgradeable) + returns (string memory _uri) + { + // All tokens share the same metadata at the moment + _uri = ERC1155URIStorageUpgradeable.uri(getBaseType(tokenID)); + } + + /// UTILS + + /** + * @dev Check if value is below max item index + */ + function _notMaxItem(uint256 tokenID) private pure { + uint128 _count = uint128(tokenID); + ++_count; + } + + /** + * @dev Check if value is below max type index + */ + function _notMaxType(uint256 tokenID) private pure { + uint128 _count = uint128(tokenID >> 128); + ++_count; + } + + /** + * @dev calculate the sum of the elements of an array + */ + function _getSum(uint256[] memory array) internal pure returns (uint256 sum) { + uint256 len = array.length; + for (uint256 i; i < len;) { + if (array[i] == 0) revert Errors.NotAllowed(); + sum += array[i]; + unchecked { + ++i; + } + } + } + + function _getSingletonArray(uint256 element) private pure returns (uint256[] memory) { + uint256[] memory array = new uint256[](1); + array[0] = element; + + return array; + } + + // UUPS PROXY + + /// @dev see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol } + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { + // solhint-disable-previous-line no-empty-blocks + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + * Assuming 30 available slots (slots cost space, cost gas) + * 1. typeCounter + * 2. owners + * 3. creators + * 4. tokenValues + * 5. maxIndex + */ + uint256[25] private __gap; +} diff --git a/contracts/contracts/interfaces/IAllowlist.sol b/contracts/contracts/interfaces/IAllowlist.sol new file mode 100644 index 00000000..2ce9a044 --- /dev/null +++ b/contracts/contracts/interfaces/IAllowlist.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.16; + +/// @title Interface for allowlist +/// @author bitbeckers +/// @notice This interface declares the required functionality for a hypercert token +/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) +interface IAllowlist { + function isAllowedToClaim(bytes32[] calldata proof, uint256 tokenID, bytes32 leaf) + external + view + returns (bool isAllowed); +} diff --git a/contracts/contracts/interfaces/IHypercertToken.sol b/contracts/contracts/interfaces/IHypercertToken.sol new file mode 100644 index 00000000..1ed1e34e --- /dev/null +++ b/contracts/contracts/interfaces/IHypercertToken.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.16; + +/// @title Interface for hypercert token interactions +/// @author bitbeckers +/// @notice This interface declares the required functionality for a hypercert token +/// @notice This interface does not specify the underlying token type (e.g. 721 or 1155) +interface IHypercertToken { + /** + * AllowAll = Unrestricted + * DisallowAll = Transfers disabled after minting + * FromCreatorOnly = Only the original creator can transfer + */ + /// @dev Transfer restriction policies on hypercerts + enum TransferRestrictions { + AllowAll, + DisallowAll, + FromCreatorOnly + } + + /// @dev Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`. + event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits); + + /// @dev Function called to store a claim referenced via `uri` with a maximum number of fractions `units`. + function mintClaim(address account, uint256 units, string memory uri, TransferRestrictions restrictions) external; + + /// @dev Function called to store a claim referenced via `uri` with a set of `fractions`. + /// @dev Fractions are internally summed to total units. + function mintClaimWithFractions( + address account, + uint256 units, + uint256[] memory fractions, + string memory uri, + TransferRestrictions restrictions + ) external; + + /// @dev Function called to split `tokenID` owned by `account` into units declared in `values`. + /// @notice The sum of `values` must equal the current value of `_tokenID`. + function splitFraction(address account, uint256 tokenID, uint256[] memory _values) external; + + /// @dev Function called to merge tokens within `tokenIDs`. + /// @notice Tokens that have been merged are burned. + function mergeFractions(address account, uint256[] memory tokenIDs) external; + + /// @dev Function to burn the token at `tokenID` for `account` + /// @notice Operator must be allowed by `creator` and the token must represent the total amount of available units. + function burnFraction(address account, uint256 tokenID) external; + + /// @dev Returns the `units` held by a (fractional) token at `claimID` + /// @dev If `tokenID` is a base type, the total amount of `units` for the claim is returned. + /// @dev If `tokenID` is a fractional token, the `units` held by the token is returned + function unitsOf(uint256 tokenID) external view returns (uint256 units); + + /// @dev Returns the `units` held by `account` of a (fractional) token at `claimID` + /// @dev If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned. + /// @dev If `tokenID` is a fractional token, the `units` held by `account` the token is returned + function unitsOf(address account, uint256 tokenID) external view returns (uint256 units); + + /// @dev Returns the `uri` for metadata of the claim represented by `tokenID` + /// @dev Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata) + function uri(uint256 tokenID) external view returns (string memory metadata); +} diff --git a/contracts/contracts/libs/Errors.sol b/contracts/contracts/libs/Errors.sol new file mode 100644 index 00000000..e19d6b5c --- /dev/null +++ b/contracts/contracts/libs/Errors.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.16; + +/// @author bitbeckers +library Errors { + error AlreadyClaimed(); + error ArraySize(); + error DoesNotExist(); + error DuplicateEntry(); + error Invalid(); + error NotAllowed(); + error NotApprovedOrOwner(); + error TransfersNotAllowed(); + error TypeMismatch(); +} diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md index daa427e4..43f14059 100644 --- a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -4,7 +4,7 @@ _LooksRare protocol team (👀,💎); bitbeckers;_ > StrategyHypercertFractionOffer -This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. +This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10000 // Total amount for sale; in `amounts` array - minUnitAmount: 100 // Minimum amount to buy; in `additionalParameters` - maxUnitAmount: 1000 // Maximum amount to buy; in `additionalParameters` - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. _Use cases can include tiered pricing; think early bird tickets._ diff --git a/graph/tests/.latest.json b/graph/tests/.latest.json index 39dc3ab6..5afb1807 100644 --- a/graph/tests/.latest.json +++ b/graph/tests/.latest.json @@ -1,4 +1,4 @@ { "version": "0.6.0", - "timestamp": 1699545675983 + "timestamp": 1701971111457 } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6d5ff8b7..c75202e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -551,34 +551,34 @@ importers: version: 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) '@graphprotocol/client-cli': specifier: ^3.0.0 - version: 3.0.0(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.1)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) + version: 3.0.0(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.1)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@graphprotocol/client-polling-live': specifier: ^2.0.0 version: 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.1)(graphql@16.8.1) '@graphql-mesh/cache-localforage': specifier: ^0.96.1 - version: 0.96.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.2(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/cross-helpers': specifier: ^0.4.1 version: 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/graphql': specifier: ^0.96.1 - version: 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) + version: 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': specifier: ^0.97.2 - version: 0.97.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.97.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.97.3(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.97.3)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': specifier: ^0.96.1 - version: 0.96.1(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.2(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/runtime': specifier: ^0.97.2 - version: 0.97.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.97.3(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/store': specifier: ^0.96.1 - version: 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': specifier: ^0.96.1 - version: 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + version: 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': specifier: ^3.2.0 version: 3.2.0(graphql@16.8.1) @@ -717,7 +717,7 @@ importers: version: 5.3.2 vitest: specifier: ^1.0.1 - version: 1.0.1(@types/node@18.18.7) + version: 1.0.2(@types/node@18.18.7) vendor/observabletreemap: dependencies: @@ -6803,7 +6803,7 @@ packages: '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) @@ -6840,7 +6840,7 @@ packages: '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) @@ -6865,7 +6865,7 @@ packages: - '@graphql-mesh/utils' dev: false - /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): + /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): resolution: {integrity: sha512-mxqXKHK2lO+k4r02Q44n3qhd5dufo+SSDduD8zGUDBsYcRQAtQD9PwmXRHyUoB9nw4A+NC+CtVh+76fueXCG1w==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6873,8 +6873,8 @@ packages: '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -6945,7 +6945,7 @@ packages: - utf-8-validate dev: false - /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.1)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): + /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.1)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-hTISbOzKavlDifBNsR6JqQMfdYwY7++hflPy+c3WHRrZ4OMoxFmW7ZuvaP6LvgKdJV77O8w9dnT/uxeHs6a90g==} engines: {node: '>=16.0.0'} hasBin: true @@ -6954,11 +6954,11 @@ packages: dependencies: '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) + '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) '@graphprotocol/client-block-tracking': 2.0.0(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.1)(graphql@16.8.1) '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.5)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -7334,17 +7334,17 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/cache-localforage@0.96.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-APpCFqFKyieyyUJ1gEmMvPmbjjiLAsw78S3NBhwfXXIu7UimlZoNQXx4LYtfkAeIcZaHY4nVBpc7W5qdha4biQ==} + /@graphql-mesh/cache-localforage@0.96.2(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-1l8KJzYF/hYQszoOQ4R6E05nz6TkcNnW7Wu99kseCE/4rA/z0HuYtdpG/mxBvEXSbodOZ6Ly5hWlq3fdx2a3eA==} engines: {node: '>=16.0.0'} peerDependencies: - '@graphql-mesh/types': ^0.96.1 - '@graphql-mesh/utils': ^0.96.1 + '@graphql-mesh/types': ^0.96.2 + '@graphql-mesh/utils': ^0.96.2 graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) graphql: 16.8.1 localforage: 1.10.0 tslib: 2.6.2 @@ -7498,7 +7498,7 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: '@graphql-mesh/cross-helpers': ^0.3.4 @@ -7510,10 +7510,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -7563,23 +7563,23 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): - resolution: {integrity: sha512-k4fIzduPcHlxEM0UpNkhfWZkWszHFgrpAoKVqp6wCqyw0AhcZ+LZXwI2TAc2nNPzWDlOTfEF1gqLaXOKfRgoUQ==} + /@graphql-mesh/graphql@0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): + resolution: {integrity: sha512-lXNRJV+AVh/8l9PMOnYPTV5mEEebR5W8uHMC7NMToJoGylXemT/8E6AAglzszUt/fv7Wlbzpwi4g7dXToX25mg==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/store': ^0.96.1 - '@graphql-mesh/types': ^0.96.1 - '@graphql-mesh/utils': ^0.96.1 + '@graphql-mesh/store': ^0.96.2 + '@graphql-mesh/types': ^0.96.2 + '@graphql-mesh/utils': ^0.96.2 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/federation': 1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) @@ -7639,21 +7639,21 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/http@0.97.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.97.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-F7x6f1otnxFeCARrKs/fOBG6zXVrFbW7Zf2h1ti/szjqJF3nkGCuex91l/s9ruJ+70lMTZ5SVFCzKufkeR5MLw==} + /@graphql-mesh/http@0.97.3(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.97.3)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-J/8ipMTRh+Fi4+zqz9+gymr/tZaR2N4//hoVOdNHCvpxe1L2pBmO1dwSBDCbbKH52MVtB8EY4poOwAMPmDGyiQ==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/runtime': ^0.97.2 - '@graphql-mesh/types': ^0.96.1 - '@graphql-mesh/utils': ^0.96.1 + '@graphql-mesh/runtime': ^0.97.3 + '@graphql-mesh/types': ^0.96.2 + '@graphql-mesh/utils': ^0.96.2 graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/runtime': 0.97.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.97.3(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@whatwg-node/server': 0.9.16 graphql: 16.8.1 graphql-yoga: 5.0.0(graphql@16.8.1) @@ -7701,19 +7701,19 @@ packages: - '@graphql-mesh/store' dev: false - /@graphql-mesh/merger-bare@0.96.1(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-ThY/gsLkonLuTgJvy39yits3CzwWf3oltkO5Ryz3hQBr0m3ZD6u59tftW6wqqBFMupc80BKL9Kfx4XL2ogRCug==} + /@graphql-mesh/merger-bare@0.96.2(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-2sOt1dyNPUrJoXD203n5gBSGXR+9plj0Ybgjv1VjXbZKVRL0Bao6COqf+ZYS2e3FJgI/9CUR85tGhoGyEc4EGA==} engines: {node: '>=16.0.0'} peerDependencies: - '@graphql-mesh/types': ^0.96.1 - '@graphql-mesh/utils': ^0.96.1 + '@graphql-mesh/types': ^0.96.2 + '@graphql-mesh/utils': ^0.96.2 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/merger-stitching': 0.96.1(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/merger-stitching': 0.96.2(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/schema': 10.0.2(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 @@ -7766,20 +7766,20 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/merger-stitching@0.96.1(@graphql-mesh/store@0.96.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-xyQwh9/oaeI9qK+Q2vov4/3bmnXSQLZ+7jWPuFJVYeOt3O3mtApFzlaADON0jmfoefelwswELKH6TyWBmZaVew==} + /@graphql-mesh/merger-stitching@0.96.2(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-pljjW7+wx/t5N4f3NRgk7+FPt3KCsR+Hhuquigwefn9y9vLn4k7LI03lzhD0ZVZNSrNk0bymw34uzU2jR/vV5w==} engines: {node: '>=16.0.0'} peerDependencies: - '@graphql-mesh/store': ^0.96.1 - '@graphql-mesh/types': ^0.96.1 - '@graphql-mesh/utils': ^0.96.1 + '@graphql-mesh/store': ^0.96.2 + '@graphql-mesh/types': ^0.96.2 + '@graphql-mesh/utils': ^0.96.2 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/store': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/schema': 10.0.2(graphql@16.8.1) '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) @@ -7843,13 +7843,13 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.97.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-MvXmWFjB3tMAo3REFI4X5jURtUj997aVEgMfJqXorKZYHDHYnSpAtx6sCIrQLjW42aGYKokJfQUlC8uvtPbJTQ==} + /@graphql-mesh/runtime@0.97.3(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-XvheLgxrjCE86G9vxJCRSw7pZZM7wC3F9iTwBfaG5ynfjO3paO53Q03kEZ1n+KLdZE0RVZltGMDi6Xx9rTdPmA==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.96.1 - '@graphql-mesh/utils': ^0.96.1 + '@graphql-mesh/types': ^0.96.2 + '@graphql-mesh/utils': ^0.96.2 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 @@ -7859,8 +7859,8 @@ packages: '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -7911,21 +7911,21 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/store@0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-ImtsvRb7WlmkSTIsN6Y/htGtCq1+0C/gjRE55QRcHq4O+o/jXCvOJZD/YoTegze/iXCj0uMb/29OIzWAe0G7sw==} + /@graphql-mesh/store@0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-nryLBuR5pVs2axi3Lw7ZvAp/9KBirCHTKFO7aygf+C1hqh8xq8AOyc88ButFFk7YHlfkrAJ+RF850tHBPq/0nA==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.96.1 - '@graphql-mesh/utils': ^0.96.1 + '@graphql-mesh/types': ^0.96.2 + '@graphql-mesh/utils': ^0.96.2 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-inspector/core': 5.0.2(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -7974,7 +7974,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} peerDependencies: '@graphql-mesh/types': ^0.93.1 @@ -7982,8 +7982,8 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) graphql: 16.8.1 @@ -8007,7 +8007,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} peerDependencies: '@graphql-mesh/store': ^0.93.1 @@ -8015,7 +8015,7 @@ packages: graphql: '*' tslib: ^2.4.0 dependencies: - '@graphql-mesh/store': 0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/store': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 8.4.27(graphql@16.8.1) '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) @@ -8090,19 +8090,19 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/utils@0.96.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-YpzseHzSE43FaQMoKRp0grWrrqfx2mUpJ070iuv8jNHIzmGOojY2cVotzdZ4YWe8EGOzY179N2B3Yby1s6gCig==} + /@graphql-mesh/utils@0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + resolution: {integrity: sha512-ZlICYDHKnurIK27xtGT0gg4p/P2V8IonzEjLbRhlcEnbnC1cnqmZkqWCQqAJm4jh3q6qJwIa3CNgabNrn6k+fw==} engines: {node: '>=16.0.0'} peerDependencies: '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.96.1 + '@graphql-mesh/types': ^0.96.2 '@graphql-tools/utils': ^9.2.1 || ^10.0.0 graphql: '*' tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@whatwg-node/fetch': 0.9.14 @@ -14611,11 +14611,11 @@ packages: chai: 4.3.10 dev: true - /@vitest/expect@1.0.1: - resolution: {integrity: sha512-3cdrb/eKD/0tygDX75YscuHEHMUJ70u3UoLSq2eqhWks57AyzvsDQbyn53IhZ0tBN7gA8Jj2VhXiOV2lef7thw==} + /@vitest/expect@1.0.2: + resolution: {integrity: sha512-mAIo/8uddSWkjQMLFcjqZP3WmkwvvN0OtlyZIu33jFnwme3vZds8m8EDMxtj+Uzni2DwtPfHNjJcTM8zTV1f4A==} dependencies: - '@vitest/spy': 1.0.1 - '@vitest/utils': 1.0.1 + '@vitest/spy': 1.0.2 + '@vitest/utils': 1.0.2 chai: 4.3.10 dev: true @@ -14627,16 +14627,16 @@ packages: pathe: 1.1.1 dev: true - /@vitest/runner@1.0.1: - resolution: {integrity: sha512-/+z0vhJ0MfRPT3AyTvAK6m57rzlew/ct8B2a4LMv7NhpPaiI2QLGyOBMB3lcioWdJHjRuLi9aYppfOv0B5aRQA==} + /@vitest/runner@1.0.2: + resolution: {integrity: sha512-ZcHJXPT2kg/9Hc4fNkCbItlsgZSs3m4vQbxB8LCSdzpbG85bExCmSvu6K9lWpMNdoKfAr1Jn0BwS9SWUcGnbTQ==} dependencies: - '@vitest/utils': 1.0.1 + '@vitest/utils': 1.0.2 p-limit: 5.0.0 pathe: 1.1.1 dev: true - /@vitest/snapshot@1.0.1: - resolution: {integrity: sha512-wIPtPDGSxEZ+DpNMc94AsybX6LV6uN6sosf5TojyP1m2QbKwiRuLV/5RSsjt1oWViHsTj8mlcwrQQ1zHGO0fMw==} + /@vitest/snapshot@1.0.2: + resolution: {integrity: sha512-9ClDz2/aV5TfWA4reV7XR9p+hE0e7bifhwxlURugj3Fw0YXeTFzHmKCNEHd6wOIFMfthbGGwhlq7TOJ2jDO4/g==} dependencies: magic-string: 0.30.5 pathe: 1.1.1 @@ -14649,8 +14649,8 @@ packages: tinyspy: 1.1.1 dev: true - /@vitest/spy@1.0.1: - resolution: {integrity: sha512-yXwm1uKhBVr/5MhVeSmtNqK+0q2RXIchJt8kokEKdrWLtkPeDgdbZ6SjR1VQGZuNdWL6sSBnLayIyVvcS0qLfA==} + /@vitest/spy@1.0.2: + resolution: {integrity: sha512-YlnHmDntp+zNV3QoTVFI5EVHV0AXpiThd7+xnDEbWnD6fw0TH/J4/+3GFPClLimR39h6nA5m0W4Bjm5Edg4A/A==} dependencies: tinyspy: 2.2.0 dev: true @@ -14665,8 +14665,8 @@ packages: pretty-format: 27.5.1 dev: true - /@vitest/utils@1.0.1: - resolution: {integrity: sha512-MGPCHkzXbbAyscrhwGzh8uP1HPrTYLWaj1WTDtWSGrpe2yJWLRN9mF9ooKawr6NMOg9vTBtg2JqWLfuLC7Dknw==} + /@vitest/utils@1.0.2: + resolution: {integrity: sha512-GPQkGHAnFAP/+seSbB9pCsj339yRrMgILoI5H2sPevTLCYgBq0VRjF8QSllmnQyvf0EontF6KUIt2t5s2SmqoQ==} dependencies: diff-sequences: 29.6.3 loupe: 2.3.7 @@ -15832,8 +15832,8 @@ packages: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} - /acorn-walk@8.3.0: - resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + /acorn-walk@8.3.1: + resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} engines: {node: '>=0.4.0'} dev: true @@ -35142,8 +35142,8 @@ packages: - terser dev: true - /vite-node@1.0.1(@types/node@18.18.7): - resolution: {integrity: sha512-Y2Jnz4cr2azsOMMYuVPrQkp3KMnS/0WV8ezZjCy4hU7O5mUHCAVOnFmoEvs1nvix/4mYm74Len8bYRWZJMNP6g==} + /vite-node@1.0.2(@types/node@18.18.7): + resolution: {integrity: sha512-h7BbMJf46fLvFW/9Ygo3snkIBEHFh6fHpB4lge98H5quYrDhPFeI3S0LREz328uqPWSnii2yeJXktQ+Pmqk5BQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: @@ -35151,7 +35151,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) pathe: 1.1.1 picocolors: 1.0.0 - vite: 5.0.5(@types/node@18.18.7) + vite: 5.0.6(@types/node@18.18.7) transitivePeerDependencies: - '@types/node' - less @@ -35199,8 +35199,8 @@ packages: fsevents: 2.3.3 dev: true - /vite@5.0.5(@types/node@18.18.7): - resolution: {integrity: sha512-OekeWqR9Ls56f3zd4CaxzbbS11gqYkEiBtnWFFgYR2WV8oPJRRKq0mpskYy/XaoCL3L7VINDhqqOMNDiYdGvGg==} + /vite@5.0.6(@types/node@18.18.7): + resolution: {integrity: sha512-MD3joyAEBtV7QZPl2JVVUai6zHms3YOmLR+BpMzLlX2Yzjfcc4gTgNi09d/Rua3F4EtC8zdwPU8eQYyib4vVMQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -35291,8 +35291,8 @@ packages: - terser dev: true - /vitest@1.0.1(@types/node@18.18.7): - resolution: {integrity: sha512-MHsOj079S28hDsvdDvyD1pRj4dcS51EC5Vbe0xvOYX+WryP8soiK2dm8oULi+oA/8Xa/h6GoJEMTmcmBy5YM+Q==} + /vitest@1.0.2(@types/node@18.18.7): + resolution: {integrity: sha512-F3NVwwpXfRSDnJmyv+ALPwSRVt0zDkRRE18pwUHSUPXAlWQ47rY1dc99ziMW5bBHyqwK2ERjMisLNoef64qk9w==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -35317,12 +35317,12 @@ packages: optional: true dependencies: '@types/node': 18.18.7 - '@vitest/expect': 1.0.1 - '@vitest/runner': 1.0.1 - '@vitest/snapshot': 1.0.1 - '@vitest/spy': 1.0.1 - '@vitest/utils': 1.0.1 - acorn-walk: 8.3.0 + '@vitest/expect': 1.0.2 + '@vitest/runner': 1.0.2 + '@vitest/snapshot': 1.0.2 + '@vitest/spy': 1.0.2 + '@vitest/utils': 1.0.2 + acorn-walk: 8.3.1 cac: 6.7.14 chai: 4.3.10 debug: 4.3.4(supports-color@8.1.1) @@ -35335,8 +35335,8 @@ packages: strip-literal: 1.3.0 tinybench: 2.5.1 tinypool: 0.8.1 - vite: 5.0.5(@types/node@18.18.7) - vite-node: 1.0.1(@types/node@18.18.7) + vite: 5.0.6(@types/node@18.18.7) + vite-node: 1.0.2(@types/node@18.18.7) why-is-node-running: 2.2.2 transitivePeerDependencies: - less From 435db09dc9669c223529b421eda7d91a5bd45df6 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Fri, 8 Dec 2023 11:44:07 +0100 Subject: [PATCH 041/118] feat(urql): refactored to urql and own codegen (#1223) * feat(urql): refactored to urql and own codegen * chore(graph): cleanup schema * fix(build): graph build and test --- graph/generated/schema.ts | 413 - graph/schema.graphql | 40 - graph/src/utils.ts | 114 +- pnpm-lock.yaml | 1179 +- sdk/.graphclient/index.ts | 1839 -- sdk/.graphclient/schema.graphql | 1190 -- .../sources/Hypercerts/introspectionSchema.ts | 14463 ---------------- .../sources/Hypercerts/schema.graphql | 1188 -- sdk/.graphclient/sources/Hypercerts/types.ts | 1194 -- sdk/.graphclientrc.yml | 28 - sdk/codegen.yml | 12 + sdk/package.json | 26 +- sdk/src/index.ts | 6 - sdk/src/indexer.ts | 84 +- sdk/src/indexer/gql/fragment-masking.ts | 66 + sdk/src/indexer/gql/gql.ts | 58 + sdk/src/indexer/gql/graphql.ts | 1642 ++ sdk/src/indexer/gql/index.ts | 2 + sdk/src/indexer/queries/claims.graphql | 3 - sdk/src/indexer/queries/fractions.graphql | 3 - sdk/src/types/global.d.ts | 3 - sdk/src/types/index.ts | 1 - sdk/src/types/indexer.ts | 19 +- sdk/test/indexer.test.ts | 4 +- sdk/test/setup-env.ts | 3 - sdk/vitest.config.mts | 1 + 26 files changed, 2499 insertions(+), 21082 deletions(-) delete mode 100644 sdk/.graphclient/index.ts delete mode 100644 sdk/.graphclient/schema.graphql delete mode 100644 sdk/.graphclient/sources/Hypercerts/introspectionSchema.ts delete mode 100644 sdk/.graphclient/sources/Hypercerts/schema.graphql delete mode 100644 sdk/.graphclient/sources/Hypercerts/types.ts delete mode 100644 sdk/.graphclientrc.yml create mode 100644 sdk/codegen.yml create mode 100644 sdk/src/indexer/gql/fragment-masking.ts create mode 100644 sdk/src/indexer/gql/gql.ts create mode 100644 sdk/src/indexer/gql/graphql.ts create mode 100644 sdk/src/indexer/gql/index.ts delete mode 100644 sdk/src/types/global.d.ts diff --git a/graph/generated/schema.ts b/graph/generated/schema.ts index cf492abf..a1ae231d 100644 --- a/graph/generated/schema.ts +++ b/graph/generated/schema.ts @@ -331,417 +331,4 @@ export class ClaimToken extends Entity { set units(value: BigInt) { this.set("units", Value.fromBigInt(value)); } - - get offers(): OfferLoader { - return new OfferLoader("ClaimToken", this.get("id")!.toString(), "offers"); - } -} - -export class Token extends Entity { - constructor(id: string) { - super(); - this.set("id", Value.fromString(id)); - } - - save(): void { - let id = this.get("id"); - assert(id != null, "Cannot save Token entity without an ID"); - if (id) { - assert( - id.kind == ValueKind.STRING, - `Entities of type Token must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, - ); - store.set("Token", id.toString(), this); - } - } - - static loadInBlock(id: string): Token | null { - return changetype(store.get_in_block("Token", id)); - } - - static load(id: string): Token | null { - return changetype(store.get("Token", id)); - } - - get id(): string { - let value = this.get("id"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toString(); - } - } - - set id(value: string) { - this.set("id", Value.fromString(value)); - } - - get name(): string { - let value = this.get("name"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toString(); - } - } - - set name(value: string) { - this.set("name", Value.fromString(value)); - } - - get symbol(): string | null { - let value = this.get("symbol"); - if (!value || value.kind == ValueKind.NULL) { - return null; - } else { - return value.toString(); - } - } - - set symbol(value: string | null) { - if (!value) { - this.unset("symbol"); - } else { - this.set("symbol", Value.fromString(value)); - } - } - - get decimals(): BigInt | null { - let value = this.get("decimals"); - if (!value || value.kind == ValueKind.NULL) { - return null; - } else { - return value.toBigInt(); - } - } - - set decimals(value: BigInt | null) { - if (!value) { - this.unset("decimals"); - } else { - this.set("decimals", Value.fromBigInt(value)); - } - } -} - -export class AcceptedToken extends Entity { - constructor(id: string) { - super(); - this.set("id", Value.fromString(id)); - } - - save(): void { - let id = this.get("id"); - assert(id != null, "Cannot save AcceptedToken entity without an ID"); - if (id) { - assert( - id.kind == ValueKind.STRING, - `Entities of type AcceptedToken must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, - ); - store.set("AcceptedToken", id.toString(), this); - } - } - - static loadInBlock(id: string): AcceptedToken | null { - return changetype( - store.get_in_block("AcceptedToken", id), - ); - } - - static load(id: string): AcceptedToken | null { - return changetype(store.get("AcceptedToken", id)); - } - - get id(): string { - let value = this.get("id"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toString(); - } - } - - set id(value: string) { - this.set("id", Value.fromString(value)); - } - - get token(): string { - let value = this.get("token"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toString(); - } - } - - set token(value: string) { - this.set("token", Value.fromString(value)); - } - - get minimumAmountPerUnit(): BigInt { - let value = this.get("minimumAmountPerUnit"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toBigInt(); - } - } - - set minimumAmountPerUnit(value: BigInt) { - this.set("minimumAmountPerUnit", Value.fromBigInt(value)); - } - - get accepted(): boolean { - let value = this.get("accepted"); - if (!value || value.kind == ValueKind.NULL) { - return false; - } else { - return value.toBoolean(); - } - } - - set accepted(value: boolean) { - this.set("accepted", Value.fromBoolean(value)); - } -} - -export class Offer extends Entity { - constructor(id: string) { - super(); - this.set("id", Value.fromString(id)); - } - - save(): void { - let id = this.get("id"); - assert(id != null, "Cannot save Offer entity without an ID"); - if (id) { - assert( - id.kind == ValueKind.STRING, - `Entities of type Offer must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, - ); - store.set("Offer", id.toString(), this); - } - } - - static loadInBlock(id: string): Offer | null { - return changetype(store.get_in_block("Offer", id)); - } - - static load(id: string): Offer | null { - return changetype(store.get("Offer", id)); - } - - get id(): string { - let value = this.get("id"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toString(); - } - } - - set id(value: string) { - this.set("id", Value.fromString(value)); - } - - get fractionID(): string { - let value = this.get("fractionID"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toString(); - } - } - - set fractionID(value: string) { - this.set("fractionID", Value.fromString(value)); - } - - get unitsAvailable(): BigInt { - let value = this.get("unitsAvailable"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toBigInt(); - } - } - - set unitsAvailable(value: BigInt) { - this.set("unitsAvailable", Value.fromBigInt(value)); - } - - get minUnitsPerTrade(): BigInt { - let value = this.get("minUnitsPerTrade"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toBigInt(); - } - } - - set minUnitsPerTrade(value: BigInt) { - this.set("minUnitsPerTrade", Value.fromBigInt(value)); - } - - get maxUnitsPerTrade(): BigInt { - let value = this.get("maxUnitsPerTrade"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toBigInt(); - } - } - - set maxUnitsPerTrade(value: BigInt) { - this.set("maxUnitsPerTrade", Value.fromBigInt(value)); - } - - get status(): string { - let value = this.get("status"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toString(); - } - } - - set status(value: string) { - this.set("status", Value.fromString(value)); - } - - get acceptedTokens(): Array { - let value = this.get("acceptedTokens"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toStringArray(); - } - } - - set acceptedTokens(value: Array) { - this.set("acceptedTokens", Value.fromStringArray(value)); - } -} - -export class Trade extends Entity { - constructor(id: string) { - super(); - this.set("id", Value.fromString(id)); - } - - save(): void { - let id = this.get("id"); - assert(id != null, "Cannot save Trade entity without an ID"); - if (id) { - assert( - id.kind == ValueKind.STRING, - `Entities of type Trade must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, - ); - store.set("Trade", id.toString(), this); - } - } - - static loadInBlock(id: string): Trade | null { - return changetype(store.get_in_block("Trade", id)); - } - - static load(id: string): Trade | null { - return changetype(store.get("Trade", id)); - } - - get id(): string { - let value = this.get("id"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toString(); - } - } - - set id(value: string) { - this.set("id", Value.fromString(value)); - } - - get buyer(): Bytes { - let value = this.get("buyer"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toBytes(); - } - } - - set buyer(value: Bytes) { - this.set("buyer", Value.fromBytes(value)); - } - - get offerID(): string { - let value = this.get("offerID"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toString(); - } - } - - set offerID(value: string) { - this.set("offerID", Value.fromString(value)); - } - - get unitsSold(): BigInt { - let value = this.get("unitsSold"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toBigInt(); - } - } - - set unitsSold(value: BigInt) { - this.set("unitsSold", Value.fromBigInt(value)); - } - - get token(): string { - let value = this.get("token"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toString(); - } - } - - set token(value: string) { - this.set("token", Value.fromString(value)); - } - - get amountPerUnit(): BigInt { - let value = this.get("amountPerUnit"); - if (!value || value.kind == ValueKind.NULL) { - throw new Error("Cannot return null for a required field."); - } else { - return value.toBigInt(); - } - } - - set amountPerUnit(value: BigInt) { - this.set("amountPerUnit", Value.fromBigInt(value)); - } -} - -export class OfferLoader extends Entity { - _entity: string; - _field: string; - _id: string; - - constructor(entity: string, id: string, field: string) { - super(); - this._entity = entity; - this._id = id; - this._field = field; - } - - load(): Offer[] { - let value = store.loadRelated(this._entity, this._id, this._field); - return changetype(value); - } } diff --git a/graph/schema.graphql b/graph/schema.graphql index d6ec32ef..c2c8b8d5 100644 --- a/graph/schema.graphql +++ b/graph/schema.graphql @@ -22,44 +22,4 @@ type ClaimToken @entity { claim: Claim! owner: Bytes! units: BigInt! - offers: [Offer!] @derivedFrom(field: "fractionID") -} - -type Token @entity { - id: String! - name: String! - symbol: String - decimals: BigInt -} - -type AcceptedToken @entity { - id: String! - token: Token! - minimumAmountPerUnit: BigInt! - accepted: Boolean! -} - -enum OfferStatus { - Open - Fulfilled - Cancelled -} - -type Offer @entity { - id: String! - fractionID: ClaimToken! - unitsAvailable: BigInt! - minUnitsPerTrade: BigInt! - maxUnitsPerTrade: BigInt! - status: OfferStatus! - acceptedTokens: [AcceptedToken!]! -} - -type Trade @entity { - id: String! - buyer: Bytes! - offerID: Offer! - unitsSold: BigInt! - token: Token! - amountPerUnit: BigInt! } diff --git a/graph/src/utils.ts b/graph/src/utils.ts index 2828cc15..592ded27 100644 --- a/graph/src/utils.ts +++ b/graph/src/utils.ts @@ -1,12 +1,5 @@ import { HypercertMinter } from "../generated/HypercertMinter/HypercertMinter"; -import { - AcceptedToken, - Allowlist, - Claim, - ClaimToken, - Offer, - Token, -} from "../generated/schema"; +import { Allowlist, Claim, ClaimToken } from "../generated/schema"; import { Address, BigInt, Bytes, log } from "@graphprotocol/graph-ts"; export const ZERO_ADDRESS = Address.fromString( @@ -91,108 +84,3 @@ export function getOrCreateClaimToken( return fraction; } - -export function getOrCreateToken(token: Address): Token { - const _tokenID = token.toHexString(); - let _token = Token.load(_tokenID); - - if (_token == null) { - _token = new Token(_tokenID); - log.debug("Created Token: {}", [_tokenID]); - _token.name = "Native"; - _token.save(); - } - - log.debug("Returning Token: {}", [_tokenID]); - - return _token; -} - -export function getOrCreateAcceptedToken( - offerID: BigInt, - token: Address, - minimumAmountPerUnit: BigInt, -): AcceptedToken { - const _acceptedTokenID = offerID - .toHexString() - .concat("-".concat(token.toHexString())); - let acceptedToken = AcceptedToken.load(_acceptedTokenID); - - if (acceptedToken == null) { - acceptedToken = new AcceptedToken(_acceptedTokenID); - log.debug("Created acceptedToken: {}", [_acceptedTokenID]); - - acceptedToken.token = getOrCreateToken(token).id; - acceptedToken.minimumAmountPerUnit = minimumAmountPerUnit; - acceptedToken.accepted = true; - acceptedToken.save(); - } - - log.debug("Returning acceptedToken: {}", [_acceptedTokenID]); - return acceptedToken; -} - -export function getOrCreateOffer( - hypercertContract: Address, - traderContract: Address, - fractionID: BigInt, - offerID: BigInt, -): Offer { - const _traderContract = HypercertTrader.bind(traderContract); - - const _fractionID = getID(fractionID, hypercertContract); - const _offerID = fractionID - .toHexString() - .concat("-".concat(offerID.toString())); - let offer = Offer.load(_offerID); - - if (offer == null) { - const offerOnChain = _traderContract.getOffer(offerID); - offer = new Offer(_offerID); - log.debug("Created offer: {}", [_offerID]); - - offer.fractionID = _fractionID; - offer.unitsAvailable = offerOnChain.unitsAvailable; - offer.minUnitsPerTrade = offerOnChain.minUnitsPerTrade; - offer.maxUnitsPerTrade = offerOnChain.maxUnitsPerTrade; - offer.acceptedTokens = []; - offer.status = "Open"; - - for (let i = 0; i < offerOnChain.acceptedTokens.length; i++) { - const _acceptedToken = offerOnChain.acceptedTokens[i]; - const parsedToken = getOrCreateAcceptedToken( - offerID, - _acceptedToken.token, - _acceptedToken.minimumAmountPerUnit, - ); - offer.acceptedTokens.push(parsedToken.id.toString()); - log.debug("Added accepted token to offer {} at place {}", [ - _offerID, - _acceptedToken.length.toString(), - ]); - } - - log.debug("Created offerID: {}", [_offerID]); - offer.save(); - } - - log.debug("Returning offer: {}", [_offerID]); - - return offer; -} - -export function getOrCreateOfferByID( - hypercertContract: Address, - fractionID: BigInt, - offerID: BigInt, -): Offer | null { - const _fractionID = getID(fractionID, hypercertContract); - const _offerID = _fractionID.concat("-".concat(offerID.toString())); - const offer = Offer.load(_offerID); - - if (offer == null) { - log.error("Offer with ID {} does not exist", [_offerID]); - } - - return offer; -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c75202e8..5bb52755 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -546,39 +546,6 @@ importers: '@ethersproject/abstract-signer': specifier: ^5.7.0 version: 5.7.0 - '@graphprotocol/client-add-source-name': - specifier: ^2.0.0 - version: 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) - '@graphprotocol/client-cli': - specifier: ^3.0.0 - version: 3.0.0(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.1)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphprotocol/client-polling-live': - specifier: ^2.0.0 - version: 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.1)(graphql@16.8.1) - '@graphql-mesh/cache-localforage': - specifier: ^0.96.1 - version: 0.96.2(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/cross-helpers': - specifier: ^0.4.1 - version: 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/graphql': - specifier: ^0.96.1 - version: 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) - '@graphql-mesh/http': - specifier: ^0.97.2 - version: 0.97.3(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.97.3)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/merger-bare': - specifier: ^0.96.1 - version: 0.96.2(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/runtime': - specifier: ^0.97.2 - version: 0.97.3(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/store': - specifier: ^0.96.1 - version: 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': - specifier: ^0.96.1 - version: 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': specifier: ^3.2.0 version: 3.2.0(graphql@16.8.1) @@ -588,6 +555,9 @@ importers: '@openzeppelin/merkle-tree': specifier: ^1.0.5 version: 1.0.5 + '@urql/core': + specifier: ^4.2.0 + version: 4.2.0(graphql@16.8.1) '@whatwg-node/fetch': specifier: ^0.9.13 version: 0.9.14 @@ -604,7 +574,7 @@ importers: specifier: 5.7.2 version: 5.7.2 graphql: - specifier: ^16.6.0 + specifier: ^16.8.1 version: 16.8.1 loglevel: specifier: ^1.8.1 @@ -612,9 +582,12 @@ importers: nft.storage: specifier: ^7.1.1 version: 7.1.1(node-fetch@3.3.2) + urql: + specifier: ^4.0.6 + version: 4.0.6(graphql@16.8.1)(react@18.2.0) viem: specifier: ^1.19.9 - version: 1.19.9(typescript@5.3.2)(zod@3.22.4) + version: 1.19.9(typescript@5.3.2) web3.storage: specifier: ^4.5.5 version: 4.5.5(node-fetch@3.3.2) @@ -631,6 +604,12 @@ importers: '@faker-js/faker': specifier: ^8.3.1 version: 8.3.1 + '@graphql-codegen/cli': + specifier: ^5.0.0 + version: 5.0.0(@types/node@18.18.7)(graphql@16.8.1)(typescript@5.3.2) + '@graphql-codegen/client-preset': + specifier: ^4.1.0 + version: 4.1.0(graphql@16.8.1) '@rollup/plugin-commonjs': specifier: ^24.0.1 version: 24.1.0(rollup@3.29.4) @@ -657,7 +636,7 @@ importers: version: 0.0.6 abitype: specifier: ^0.10.3 - version: 0.10.3(typescript@5.3.2)(zod@3.22.4) + version: 0.10.3(typescript@5.3.2) chai: specifier: ^4.3.7 version: 4.3.10 @@ -727,6 +706,17 @@ importers: packages: + /@0no-co/graphql.web@1.0.4(graphql@16.8.1): + resolution: {integrity: sha512-W3ezhHGfO0MS1PtGloaTpg0PbaT8aZSmmaerL7idtU5F7oCI+uu25k+MsMS31BVFlp4aMkHSrNRxiD72IlK8TA==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + dependencies: + graphql: 16.8.1 + dev: false + /@aashutoshrathi/word-wrap@1.2.6: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} @@ -999,7 +989,6 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false /@ardatan/sync-fetch@0.0.1: resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==} @@ -1008,7 +997,6 @@ packages: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: false /@assemblyscript/loader@0.9.4: resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} @@ -1391,7 +1379,6 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - dev: false /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} @@ -1638,7 +1625,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-proposal-export-default-from@7.22.17(@babel/core@7.23.5): resolution: {integrity: sha512-cop/3quQBVvdz6X5SJC6AhUv3C9DrVTM06LUEXimEdWAhCSyOJIr9NiZDU9leHZ0/aiG0Sh7Zmvaku5TWYNgbA==} @@ -1700,7 +1686,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.5) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.5) - dev: false /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.5): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} @@ -1858,7 +1843,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} @@ -2196,7 +2180,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} @@ -2273,7 +2256,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} @@ -2302,7 +2284,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} @@ -2391,7 +2372,6 @@ packages: '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - dev: false /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.5): resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} @@ -2430,7 +2410,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.15 - dev: false /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} @@ -2460,7 +2439,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} @@ -2583,7 +2561,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.5) - dev: false /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} @@ -2603,7 +2580,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-for-of@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==} @@ -2636,7 +2612,6 @@ packages: '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} @@ -2688,7 +2663,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} @@ -2738,7 +2712,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} @@ -2792,7 +2765,6 @@ packages: '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - dev: false /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} @@ -2980,7 +2952,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) - dev: false /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} @@ -3064,7 +3035,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} @@ -3139,7 +3109,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} @@ -3178,7 +3147,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} @@ -3246,7 +3214,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.5) '@babel/types': 7.23.0 - dev: false /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} @@ -3362,7 +3329,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} @@ -3393,7 +3359,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: false /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} @@ -3442,7 +3407,6 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} @@ -6793,25 +6757,6 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-add-source-name@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): - resolution: {integrity: sha512-3vX8mVPIEJFwAoRhjTPd9IjQrBuE+Gv+JB7IEf8/9222qiU9EzHVFUekKxVtcxQXD40CfageS41CxOreWQ1enA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 - '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 - graphql: ^15.2.0 || ^16.0.0 - dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) - graphql: 16.8.1 - lodash: 4.17.21 - tslib: 2.6.2 - dev: false - /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-p8eEyeBcqxCXLxC7CNgIhLSCd7bjiKToKnrwYPShVb26gIG2JdAmD3/mpjuR+QaMA4chN/EO5t+TGvq6KnFx9g==} peerDependencies: @@ -6830,25 +6775,6 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-auto-pagination@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1): - resolution: {integrity: sha512-TouHgs6rQLpZSgnMoPdes8/ZTtMMEoxWeUUCkfho/xfSi49prb5DcsI83pykln0OEAUnNPnaX0MhP+xA5LtFSg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 - '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 - graphql: ^15.2.0 || ^16.0.0 - dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) - graphql: 16.8.1 - lodash: 4.17.21 - tslib: 2.6.2 - dev: false - /@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-kpiX2s804mpP3EVL0EdJfxeHWBTdg6SglIyEvSZ5T1OWyGDeMhr19D+gVIAlo22/PiBUkBDd0JfqppLsliPZ1A==} peerDependencies: @@ -6865,23 +6791,6 @@ packages: - '@graphql-mesh/utils' dev: false - /@graphprotocol/client-auto-type-merging@2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): - resolution: {integrity: sha512-mxqXKHK2lO+k4r02Q44n3qhd5dufo+SSDduD8zGUDBsYcRQAtQD9PwmXRHyUoB9nw4A+NC+CtVh+76fueXCG1w==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 - '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 - graphql: ^15.2.0 || ^16.0.0 - dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - transitivePeerDependencies: - - '@graphql-mesh/utils' - dev: false - /@graphprotocol/client-block-tracking@1.0.14(@graphql-tools/delegate@9.0.35)(graphql@16.8.1): resolution: {integrity: sha512-Eim0fZ0AgukHt5770j/UYDxfrqJroOhDe8FfNKKN7mDVRoMBoCsNknH47i03fh4A/kE8R+J6Job/zEJZPTtKnQ==} peerDependencies: @@ -6894,19 +6803,6 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-block-tracking@2.0.0(@graphql-tools/delegate@10.0.3)(graphql@16.8.1): - resolution: {integrity: sha512-mpr0JAlefFGhxeb25ndeRKZ+t9cDHcUKGfRKIsoDzCclUEh5tBVTiQCDVGt6Eu+pxnrHPF2v/NQWktaB3+6twQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-tools/delegate': ^9.0.32 || ^10.0.0 - graphql: ^15.2.0 || ^16.0.0 - dependencies: - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphprotocol/client-cli@2.2.22(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-PIi8rFibYZVup+0jb08399RmbGF1ZrqUe6RXzLtKZBT57OWIMWwsFvdJyUAdr8Y8f0rrMn6A+Oy4nP1lf3hc1g==} hasBin: true @@ -6945,45 +6841,6 @@ packages: - utf-8-validate dev: false - /@graphprotocol/client-cli@3.0.0(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/merge@9.0.1)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): - resolution: {integrity: sha512-hTISbOzKavlDifBNsR6JqQMfdYwY7++hflPy+c3WHRrZ4OMoxFmW7ZuvaP6LvgKdJV77O8w9dnT/uxeHs6a90g==} - engines: {node: '>=16.0.0'} - hasBin: true - peerDependencies: - graphql: ^15.2.0 || ^16.0.0 - dependencies: - '@graphprotocol/client-add-source-name': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) - '@graphprotocol/client-auto-pagination': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@10.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.1)(graphql@16.8.1) - '@graphprotocol/client-auto-type-merging': 2.0.0(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) - '@graphprotocol/client-block-tracking': 2.0.0(@graphql-tools/delegate@10.0.3)(graphql@16.8.1) - '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.1)(graphql@16.8.1) - '@graphql-mesh/cli': 0.82.35(@babel/core@7.23.5)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2) - graphql: 16.8.1 - tslib: 2.6.2 - transitivePeerDependencies: - - '@babel/core' - - '@envelop/core' - - '@graphql-mesh/cross-helpers' - - '@graphql-mesh/store' - - '@graphql-mesh/types' - - '@graphql-mesh/utils' - - '@graphql-tools/delegate' - - '@graphql-tools/merge' - - '@graphql-tools/utils' - - '@graphql-tools/wrap' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - bufferutil - - encoding - - graphql-tag - - react-native - - react-native-windows - - supports-color - - utf-8-validate - dev: false - /@graphprotocol/client-polling-live@1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1): resolution: {integrity: sha512-/XKnXNTts1VCUqwN2TCuPzQBfMGusL8vtamACKUeX65WxVy/H/Wjpcxq+w/XbyqNsQdG5QOoxY+AS/vKMhUcDQ==} peerDependencies: @@ -7013,21 +6870,6 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-polling-live@2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.1)(graphql@16.8.1): - resolution: {integrity: sha512-JQ0sKiFCX+ErR0fynBNUg/WDiVaaEndlS12fkgrFZrQA2vVpSyow9pW0nKMGVZJa4cN+VDskgwqK5BWXMvdeRA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@envelop/core': ^2.4.2 || ^3.0.0 || ^4.0.0 - '@graphql-tools/merge': ^8.3.14 || ^9.0.0 - graphql: ^15.2.0 || ^16.0.0 - dependencies: - '@envelop/core': 3.0.6 - '@graphql-tools/merge': 9.0.1(graphql@16.8.1) - '@repeaterjs/repeater': 3.0.4 - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphprotocol/graph-cli@0.60.0(@types/node@18.18.7)(node-fetch@3.3.2)(typescript@4.9.5): resolution: {integrity: sha512-8tGaQJ0EzAPtkDXCAijFGoVdJXM+pKFlGxjiU31TdG5bS4cIUoSB6yWojVsFFod0yETAwf+giel/0/8sudYsDw==} engines: {node: '>=14'} @@ -7079,6 +6921,96 @@ packages: assemblyscript: 0.19.10 dev: true + /@graphql-codegen/add@5.0.0(graphql@16.8.1): + resolution: {integrity: sha512-ynWDOsK2yxtFHwcJTB9shoSkUd7YXd6ZE57f0nk7W5cu/nAgxZZpEsnTPEpZB/Mjf14YRGe2uJHQ7AfElHjqUQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.5.3 + dev: true + + /@graphql-codegen/cli@5.0.0(@types/node@18.18.7)(graphql@16.8.1)(typescript@5.3.2): + resolution: {integrity: sha512-A7J7+be/a6e+/ul2KI5sfJlpoqeqwX8EzktaKCeduyVKgOLA6W5t+NUGf6QumBDXU8PEOqXk3o3F+RAwCWOiqA==} + hasBin: true + peerDependencies: + '@parcel/watcher': ^2.1.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + '@parcel/watcher': + optional: true + dependencies: + '@babel/generator': 7.23.5 + '@babel/template': 7.22.15 + '@babel/types': 7.23.5 + '@graphql-codegen/core': 4.0.0(graphql@16.8.1) + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-tools/apollo-engine-loader': 8.0.0(graphql@16.8.1) + '@graphql-tools/code-file-loader': 8.0.3(graphql@16.8.1) + '@graphql-tools/git-loader': 8.0.3(graphql@16.8.1) + '@graphql-tools/github-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) + '@graphql-tools/graphql-file-loader': 8.0.0(graphql@16.8.1) + '@graphql-tools/json-file-loader': 8.0.0(graphql@16.8.1) + '@graphql-tools/load': 8.0.1(graphql@16.8.1) + '@graphql-tools/prisma-loader': 8.0.2(@types/node@18.18.7)(graphql@16.8.1) + '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + '@whatwg-node/fetch': 0.8.8 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.3.2) + debounce: 1.2.1 + detect-indent: 6.1.0 + graphql: 16.8.1 + graphql-config: 5.0.3(@types/node@18.18.7)(graphql@16.8.1)(typescript@5.3.2) + inquirer: 8.2.5 + is-glob: 4.0.3 + jiti: 1.20.0 + json-to-pretty-yaml: 1.2.2 + listr2: 4.0.5 + log-symbols: 4.1.0 + micromatch: 4.0.5 + shell-quote: 1.8.1 + string-env-interpolation: 1.0.1 + ts-log: 2.2.5 + tslib: 2.6.2 + yaml: 2.3.3 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - cosmiconfig-toml-loader + - encoding + - enquirer + - supports-color + - typescript + - utf-8-validate + dev: true + + /@graphql-codegen/client-preset@4.1.0(graphql@16.8.1): + resolution: {integrity: sha512-/3Ymb/fjxIF1+HGmaI1YwSZbWsrZAWMSQjh3dU425eBjctjsVQ6gzGRr+l/gE5F1mtmCf+vlbTAT03heAc/QIw==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + '@graphql-codegen/add': 5.0.0(graphql@16.8.1) + '@graphql-codegen/gql-tag-operations': 4.0.1(graphql@16.8.1) + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-codegen/typed-document-node': 5.0.1(graphql@16.8.1) + '@graphql-codegen/typescript': 4.0.1(graphql@16.8.1) + '@graphql-codegen/typescript-operations': 4.0.1(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.8.1) + '@graphql-tools/documents': 1.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.5.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@graphql-codegen/core@3.1.0(graphql@16.8.1): resolution: {integrity: sha512-DH1/yaR7oJE6/B+c6ZF2Tbdh7LixF1K8L+8BoSubjNyQ8pNwR4a70mvc1sv6H7qgp6y1bPQ9tKE+aazRRshysw==} peerDependencies: @@ -7091,6 +7023,34 @@ packages: tslib: 2.5.3 dev: false + /@graphql-codegen/core@4.0.0(graphql@16.8.1): + resolution: {integrity: sha512-JAGRn49lEtSsZVxeIlFVIRxts2lWObR+OQo7V2LHDJ7ohYYw3ilv7nJ8pf8P4GTg/w6ptcYdSdVVdkI8kUHB/Q==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-tools/schema': 10.0.2(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.5.3 + dev: true + + /@graphql-codegen/gql-tag-operations@4.0.1(graphql@16.8.1): + resolution: {integrity: sha512-qF6wIbBzW8BNT+wiVsBxrYOs2oYcsxQ7mRvCpfEI3HnNZMAST/uX76W8MqFEJvj4mw7NIDv7xYJAcAZIWM5LWw==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + auto-bind: 4.0.0 + graphql: 16.8.1 + tslib: 2.5.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@graphql-codegen/plugin-helpers@2.7.2(graphql@16.8.1): resolution: {integrity: sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==} peerDependencies: @@ -7133,6 +7093,20 @@ packages: tslib: 2.5.3 dev: false + /@graphql-codegen/plugin-helpers@5.0.1(graphql@16.8.1): + resolution: {integrity: sha512-6L5sb9D8wptZhnhLLBcheSPU7Tg//DGWgc5tQBWX46KYTOTQHGqDpv50FxAJJOyFVJrveN9otWk9UT9/yfY4ww==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + change-case-all: 1.0.15 + common-tags: 1.8.2 + graphql: 16.8.1 + import-from: 4.0.0 + lodash: 4.17.21 + tslib: 2.5.3 + dev: true + /@graphql-codegen/schema-ast@3.0.1(graphql@16.8.1): resolution: {integrity: sha512-rTKTi4XiW4QFZnrEqetpiYEWVsOFNoiR/v3rY9mFSttXFbIwNXPme32EspTiGWmEEdHY8UuTDtZN3vEcs/31zw==} peerDependencies: @@ -7144,6 +7118,17 @@ packages: tslib: 2.5.3 dev: false + /@graphql-codegen/schema-ast@4.0.0(graphql@16.8.1): + resolution: {integrity: sha512-WIzkJFa9Gz28FITAPILbt+7A8+yzOyd1NxgwFh7ie+EmO9a5zQK6UQ3U/BviirguXCYnn+AR4dXsoDrSrtRA1g==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.5.3 + dev: true + /@graphql-codegen/typed-document-node@4.0.1(graphql@16.8.1): resolution: {integrity: sha512-mQNYCd12JsFSaK6xLry4olY9TdYG7GxQPexU6qU4Om++eKhseGwk2eGmQDRG4Qp8jEDFLMXuHMVUKqMQ1M+F/A==} peerDependencies: @@ -7160,6 +7145,22 @@ packages: - supports-color dev: false + /@graphql-codegen/typed-document-node@5.0.1(graphql@16.8.1): + resolution: {integrity: sha512-VFkhCuJnkgtbbgzoCAwTdJe2G1H6sd3LfCrDqWUrQe53y2ukfSb5Ov1PhAIkCBStKCMQBUY9YgGz9GKR40qQ8g==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.8.1) + auto-bind: 4.0.0 + change-case-all: 1.0.15 + graphql: 16.8.1 + tslib: 2.5.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@graphql-codegen/typescript-generic-sdk@3.1.0(graphql-tag@2.12.6)(graphql@16.8.1): resolution: {integrity: sha512-nQZi/YGRI1+qCZZsh0V5nz6+hCHSN4OU9tKyOTDsEPyDFnGEukDuRdCH2IZasGn22a3Iu5TUDkgp5w9wEQwGmg==} peerDependencies: @@ -7193,6 +7194,22 @@ packages: - supports-color dev: false + /@graphql-codegen/typescript-operations@4.0.1(graphql@16.8.1): + resolution: {integrity: sha512-GpUWWdBVUec/Zqo23aFLBMrXYxN2irypHqDcKjN78JclDPdreasAEPcIpMfqf4MClvpmvDLy4ql+djVAwmkjbw==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-codegen/typescript': 4.0.1(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.8.1) + auto-bind: 4.0.0 + graphql: 16.8.1 + tslib: 2.5.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@graphql-codegen/typescript-resolvers@3.2.1(graphql@16.8.1): resolution: {integrity: sha512-2ZIHk5J6HTuylse5ZIxw+aega54prHxvj7vM8hiKJ6vejZ94kvVPAq4aWmSFOkZ5lqU3YnM/ZyWfnhT5CUDj1g==} peerDependencies: @@ -7226,6 +7243,22 @@ packages: - supports-color dev: false + /@graphql-codegen/typescript@4.0.1(graphql@16.8.1): + resolution: {integrity: sha512-3YziQ21dCVdnHb+Us1uDb3pA6eG5Chjv0uTK+bt9dXeMlwYBU8MbtzvQTo4qvzWVC1AxSOKj0rgfNu1xCXqJyA==} + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-codegen/schema-ast': 4.0.0(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.8.1) + auto-bind: 4.0.0 + graphql: 16.8.1 + tslib: 2.5.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@graphql-codegen/visitor-plugin-common@2.13.1(graphql@16.8.1): resolution: {integrity: sha512-mD9ufZhDGhyrSaWQGrU1Q1c5f01TeWtSWy/cDwXYjJcHIj1Y/DG2x0tOflEfCvh5WcnmHNIw4lzDsg1W7iFJEg==} peerDependencies: @@ -7268,6 +7301,27 @@ packages: - supports-color dev: false + /@graphql-codegen/visitor-plugin-common@4.0.1(graphql@16.8.1): + resolution: {integrity: sha512-Bi/1z0nHg4QMsAqAJhds+ForyLtk7A3HQOlkrZNm3xEkY7lcBzPtiOTLBtvziwopBsXUxqeSwVjOOFPLS5Yw1Q==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-tools/optimize': 2.0.0(graphql@16.8.1) + '@graphql-tools/relay-operation-optimizer': 7.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + auto-bind: 4.0.0 + change-case-all: 1.0.15 + dependency-graph: 0.11.0 + graphql: 16.8.1 + graphql-tag: 2.12.6(graphql@16.8.1) + parse-filepath: 1.0.2 + tslib: 2.5.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@graphql-inspector/core@3.3.0(graphql@16.8.1): resolution: {integrity: sha512-LRtk9sHgj9qqVPIkkThAVq3iZ7QxgHCx6elEwd0eesZBCmaIYQxD/BFu+VT8jr10YfOURBZuAnVdyGu64vYpBg==} peerDependencies: @@ -7291,18 +7345,6 @@ packages: tslib: 2.6.0 dev: false - /@graphql-inspector/core@5.0.2(graphql@16.8.1): - resolution: {integrity: sha512-pXHPCggwLmgi5NACPPV4qyf2xW/sQONnu6ZqCAid3k/S2APmVYN4Z3OvxvLA12NFhzby5Sz5K4fRsId43cK8ww==} - engines: {node: '>=16.0.0'} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - dependency-graph: 0.11.0 - graphql: 16.8.1 - object-inspect: 1.12.3 - tslib: 2.6.2 - dev: false - /@graphql-mesh/cache-localforage@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-cY/LJ+XC8kiyPoLxqPAMlOAvaeB81CZafdadLNyNDFuu66qDiZqWTYPw/lnhp2nyeukC8o/P69oP7d2OqVaCZA==} peerDependencies: @@ -7334,22 +7376,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/cache-localforage@0.96.2(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-1l8KJzYF/hYQszoOQ4R6E05nz6TkcNnW7Wu99kseCE/4rA/z0HuYtdpG/mxBvEXSbodOZ6Ly5hWlq3fdx2a3eA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/types': ^0.96.2 - '@graphql-mesh/utils': ^0.96.2 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - graphql: 16.8.1 - localforage: 1.10.0 - tslib: 2.6.2 - dev: false - /@graphql-mesh/cli@0.82.35(@babel/core@7.23.5)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-5IuXpk+Zpg05u6qNPX19VzC5/HCiLdDRF6EPZ3ze57FIRgGA3YsB1CUGga6Ky3inalURYwx0kWqmdjbdKZYx1w==} hasBin: true @@ -7498,36 +7524,6 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.3.4 - '@graphql-mesh/store': ^0.93.1 - '@graphql-mesh/types': ^0.93.1 - '@graphql-mesh/utils': ^0.93.1 - '@graphql-tools/utils': ^9.2.1 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) - '@graphql-tools/url-loader': 7.17.18(@types/node@18.18.7)(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) - graphql: 16.8.1 - lodash.get: 4.4.2 - tslib: 2.6.2 - transitivePeerDependencies: - - '@types/node' - - bufferutil - - encoding - - utf-8-validate - dev: false - /@graphql-mesh/graphql@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): resolution: {integrity: sha512-mEbz2XYSgRTdNidUBWB7FT3QzLliJwxJIoqipSbZNputJqSbUZZ6QD/oI1IrdPXqVl/ELE2CuLiogkOSO24C1Q==} engines: {node: '>=16.0.0'} @@ -7563,41 +7559,6 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): - resolution: {integrity: sha512-lXNRJV+AVh/8l9PMOnYPTV5mEEebR5W8uHMC7NMToJoGylXemT/8E6AAglzszUt/fv7Wlbzpwi4g7dXToX25mg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/store': ^0.96.2 - '@graphql-mesh/types': ^0.96.2 - '@graphql-mesh/utils': ^0.96.2 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/federation': 1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) - '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - lodash.get: 4.4.2 - tslib: 2.6.2 - transitivePeerDependencies: - - '@types/node' - - bufferutil - - encoding - - graphql-ws - - react - - react-dom - - subscriptions-transport-ws - - utf-8-validate - dev: false - /@graphql-mesh/http@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-tdGEvijb3w2YJsncoh59ZobWLWpYPDmTd07XOYroJTg3m95zloFRJr/IzklKOsAa57zVIuRLCOfDju5m1m47CQ==} peerDependencies: @@ -7639,27 +7600,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/http@0.97.3(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.97.3)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-J/8ipMTRh+Fi4+zqz9+gymr/tZaR2N4//hoVOdNHCvpxe1L2pBmO1dwSBDCbbKH52MVtB8EY4poOwAMPmDGyiQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/runtime': ^0.97.3 - '@graphql-mesh/types': ^0.96.2 - '@graphql-mesh/utils': ^0.96.2 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/runtime': 0.97.3(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@whatwg-node/server': 0.9.16 - graphql: 16.8.1 - graphql-yoga: 5.0.0(graphql@16.8.1) - tslib: 2.6.2 - dev: false - /@graphql-mesh/merger-bare@0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-S/G3WSSa4+9YT320iRL/tODK4hTvepkQNUSzmddf3oz10xeyQD7hPJyOAnB6D+2dGVhaOTwmXJIueqevcAcP6Q==} peerDependencies: @@ -7701,27 +7641,6 @@ packages: - '@graphql-mesh/store' dev: false - /@graphql-mesh/merger-bare@0.96.2(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-2sOt1dyNPUrJoXD203n5gBSGXR+9plj0Ybgjv1VjXbZKVRL0Bao6COqf+ZYS2e3FJgI/9CUR85tGhoGyEc4EGA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/types': ^0.96.2 - '@graphql-mesh/utils': ^0.96.2 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/merger-stitching': 0.96.2(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/schema': 10.0.2(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - transitivePeerDependencies: - - '@graphql-mesh/store' - dev: false - /@graphql-mesh/merger-stitching@0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-8km5UFhKQGd0XY8bTBpHoBhVx/7qCkflPHLoTAguIWN8nJrcXJoqPamodci/U+2hudLAtRqhWosHu/8z7ctZpg==} peerDependencies: @@ -7766,28 +7685,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/merger-stitching@0.96.2(@graphql-mesh/store@0.96.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-pljjW7+wx/t5N4f3NRgk7+FPt3KCsR+Hhuquigwefn9y9vLn4k7LI03lzhD0ZVZNSrNk0bymw34uzU2jR/vV5w==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/store': ^0.96.2 - '@graphql-mesh/types': ^0.96.2 - '@graphql-mesh/utils': ^0.96.2 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/store': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/schema': 10.0.2(graphql@16.8.1) - '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-8z9ag3jZLmkzawMzF6+i/+P1nQai+HmSZzNeJJen6fRkwprSM1Z7B4lfYBYhdiCbK11HHubDfw4LYwRuBcISMQ==} peerDependencies: @@ -7843,35 +7740,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.97.3(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-XvheLgxrjCE86G9vxJCRSw7pZZM7wC3F9iTwBfaG5ynfjO3paO53Q03kEZ1n+KLdZE0RVZltGMDi6Xx9rTdPmA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.96.2 - '@graphql-mesh/utils': ^0.96.2 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@envelop/core': 5.0.0 - '@envelop/extended-validation': 4.0.0(@envelop/core@5.0.0)(graphql@16.8.1) - '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/executor': 1.2.0(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) - '@whatwg-node/fetch': 0.9.14 - graphql: 16.8.1 - graphql-jit: 0.8.2(graphql@16.8.1) - tslib: 2.6.2 - dev: false - /@graphql-mesh/store@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-OEljVuaZn2htU1rt4Yll/aJmynw3/Kvhd6eE8V0/del0u9iuLJqiKkzFJl8HUSMh0IkO10OnficJnTM0tCmxRw==} peerDependencies: @@ -7911,26 +7779,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/store@0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-nryLBuR5pVs2axi3Lw7ZvAp/9KBirCHTKFO7aygf+C1hqh8xq8AOyc88ButFFk7YHlfkrAJ+RF850tHBPq/0nA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.96.2 - '@graphql-mesh/utils': ^0.96.2 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-inspector/core': 5.0.2(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphql-mesh/string-interpolation@0.4.4(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-IotswBYZRaPswOebcr2wuOFuzD3dHIJxVEkPiiQubqjUIR8HhQI22XHJv0WNiQZ65z8NR9+GYWwEDIc2JRCNfQ==} peerDependencies: @@ -7974,22 +7822,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} - peerDependencies: - '@graphql-mesh/types': ^0.93.1 - '@graphql-mesh/utils': ^0.93.1 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) - '@graphql-tools/stitching-directives': 2.3.34(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} peerDependencies: @@ -8007,23 +7839,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} - peerDependencies: - '@graphql-mesh/store': ^0.93.1 - '@graphql-tools/utils': ^9.2.1 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/store': 0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/batch-delegate': 8.4.27(graphql@16.8.1) - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphql-mesh/types@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-H2xh5KGc3+Ly3VdAPnRdKTibZpW9zEFgUzsozL9MQhCs6WLX+/kOADb0uIDqYFKX5c/2axmcy87BFNOausXYig==} engines: {node: '>=16.0.0'} @@ -8090,30 +7905,20 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/utils@0.96.2(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-ZlICYDHKnurIK27xtGT0gg4p/P2V8IonzEjLbRhlcEnbnC1cnqmZkqWCQqAJm4jh3q6qJwIa3CNgabNrn6k+fw==} + /@graphql-tools/apollo-engine-loader@8.0.0(graphql@16.8.1): + resolution: {integrity: sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg==} engines: {node: '>=16.0.0'} peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.96.2 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.96.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@ardatan/sync-fetch': 0.0.1 + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) '@whatwg-node/fetch': 0.9.14 - dset: 3.1.3 graphql: 16.8.1 - js-yaml: 4.1.0 - lodash.get: 4.4.2 - lodash.topath: 4.5.2 - tiny-lru: 11.2.3 tslib: 2.6.2 - dev: false + transitivePeerDependencies: + - encoding + dev: true /@graphql-tools/batch-delegate@8.4.27(graphql@16.8.1): resolution: {integrity: sha512-efgDDJhljma9d3Ky/LswIu1xm/if2oS27XA1sOcxcShW+Ze+Qxi0hZZ6iyI4eQxVDX5Lyy/n+NvQEZAK1riqnQ==} @@ -8160,12 +7965,11 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) dataloader: 2.2.2 graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false /@graphql-tools/code-file-loader@7.3.23(@babel/core@7.23.5)(graphql@16.8.1): resolution: {integrity: sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==} @@ -8183,6 +7987,22 @@ packages: - supports-color dev: false + /@graphql-tools/code-file-loader@8.0.3(graphql@16.8.1): + resolution: {integrity: sha512-gVnnlWs0Ua+5FkuHHEriFUOI3OIbHv6DS1utxf28n6NkfGMJldC4j0xlJRY0LS6dWK34IGYgD4HelKYz2l8KiA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + globby: 11.1.0 + graphql: 16.8.1 + tslib: 2.6.2 + unixify: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /@graphql-tools/delegate@10.0.3(graphql@16.8.1): resolution: {integrity: sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw==} engines: {node: '>=16.0.0'} @@ -8196,7 +8016,6 @@ packages: dataloader: 2.2.2 graphql: 16.8.1 tslib: 2.6.2 - dev: false /@graphql-tools/delegate@9.0.35(graphql@16.8.1): resolution: {integrity: sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA==} @@ -8213,6 +8032,17 @@ packages: value-or-promise: 1.0.12 dev: false + /@graphql-tools/documents@1.0.0(graphql@16.8.1): + resolution: {integrity: sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + graphql: 16.8.1 + lodash.sortby: 4.7.0 + tslib: 2.6.2 + dev: true + /@graphql-tools/executor-graphql-ws@0.0.14(graphql@16.8.1): resolution: {integrity: sha512-P2nlkAsPZKLIXImFhj0YTtny5NQVGSsKnhi7PzXiaHSXc6KkzqbWZHKvikD4PObanqg+7IO58rKFpGXP7eeO+w==} peerDependencies: @@ -8237,7 +8067,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) '@types/ws': 8.5.8 graphql: 16.8.1 graphql-ws: 5.14.2(graphql@16.8.1) @@ -8247,7 +8077,6 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false /@graphql-tools/executor-http@0.1.10(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-hnAfbKv0/lb9s31LhWzawQ5hghBfHS+gYWtqxME6Rl0Aufq9GltiiLBcl7OVVOnkLF0KhwgbYP1mB5VKmgTGpg==} @@ -8273,7 +8102,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) '@repeaterjs/repeater': 3.0.4 '@whatwg-node/fetch': 0.9.14 extract-files: 11.0.0 @@ -8283,7 +8112,6 @@ packages: value-or-promise: 1.0.12 transitivePeerDependencies: - '@types/node' - dev: false /@graphql-tools/executor-legacy-ws@0.0.11(graphql@16.8.1): resolution: {integrity: sha512-4ai+NnxlNfvIQ4c70hWFvOZlSUN8lt7yc+ZsrwtNFbFPH/EroIzFMapAxM9zwyv9bH38AdO3TQxZ5zNxgBdvUw==} @@ -8307,7 +8135,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) '@types/ws': 8.5.8 graphql: 16.8.1 isomorphic-ws: 5.0.0(ws@8.14.2) @@ -8316,7 +8144,6 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false /@graphql-tools/executor@0.0.18(graphql@16.8.1): resolution: {integrity: sha512-xZC0C+/npXoSHBB5bsJdwxDLgtl1Gu4fL9J2TPQmXoZC3L2N506KJoppf9LgWdHU/xK04luJrhP6WjhfkIN0pQ==} @@ -8356,7 +8183,6 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false /@graphql-tools/federation@1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-H51qTYwbtfIYBO1uHXlImRWzo9tknSoIGBgJckDh+hdxJx43sZaMjJiLHc2DjRc/A8d2Bf0bi0HbH++HqOos/w==} @@ -8366,10 +8192,10 @@ packages: dependencies: '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor-http': 1.0.3(@types/node@18.18.7)(graphql@16.8.1) - '@graphql-tools/merge': 9.0.0(graphql@16.8.1) + '@graphql-tools/merge': 9.0.1(graphql@16.8.1) '@graphql-tools/schema': 10.0.0(graphql@16.8.1) '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -8384,6 +8210,43 @@ packages: - subscriptions-transport-ws dev: false + /@graphql-tools/git-loader@8.0.3(graphql@16.8.1): + resolution: {integrity: sha512-Iz9KbRUAkuOe8JGTS0qssyJ+D5Snle17W+z9anwWrLFrkBhHrRFUy5AdjZqgJuhls0x30QkZBnnCtnHDBdQ4nA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + graphql: 16.8.1 + is-glob: 4.0.3 + micromatch: 4.0.5 + tslib: 2.6.2 + unixify: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@graphql-tools/github-loader@8.0.0(@types/node@18.18.7)(graphql@16.8.1): + resolution: {integrity: sha512-VuroArWKcG4yaOWzV0r19ElVIV6iH6UKDQn1MXemND0xu5TzrFme0kf3U9o0YwNo0kUYEk9CyFM0BYg4he17FA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@ardatan/sync-fetch': 0.0.1 + '@graphql-tools/executor-http': 1.0.3(@types/node@18.18.7)(graphql@16.8.1) + '@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + '@whatwg-node/fetch': 0.9.14 + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + transitivePeerDependencies: + - '@types/node' + - encoding + - supports-color + dev: true + /@graphql-tools/graphql-file-loader@7.5.17(graphql@16.8.1): resolution: {integrity: sha512-hVwwxPf41zOYgm4gdaZILCYnKB9Zap7Ys9OhY1hbwuAuC4MMNY9GpUjoTU3CQc3zUiPoYStyRtUGkHSJZ3HxBw==} peerDependencies: @@ -8397,6 +8260,20 @@ packages: unixify: 1.0.0 dev: false + /@graphql-tools/graphql-file-loader@8.0.0(graphql@16.8.1): + resolution: {integrity: sha512-wRXj9Z1IFL3+zJG1HWEY0S4TXal7+s1vVhbZva96MSp0kbb/3JBF7j0cnJ44Eq0ClccMgGCDFqPFXty4JlpaPg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/import': 7.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + globby: 11.1.0 + graphql: 16.8.1 + tslib: 2.6.2 + unixify: 1.0.0 + dev: true + /@graphql-tools/graphql-tag-pluck@7.5.2(@babel/core@7.23.5)(graphql@16.8.1): resolution: {integrity: sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==} peerDependencies: @@ -8414,6 +8291,24 @@ packages: - supports-color dev: false + /@graphql-tools/graphql-tag-pluck@8.1.0(graphql@16.8.1): + resolution: {integrity: sha512-kt5l6H/7QxQcIaewInTcune6NpATojdFEW98/8xWcgmy7dgXx5vU9e0AicFZIH+ewGyZzTpwFqO2RI03roxj2w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.5) + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + /@graphql-tools/import@6.7.18(graphql@16.8.1): resolution: {integrity: sha512-XQDdyZTp+FYmT7as3xRWH/x8dx0QZA2WZqfMF5EWb36a0PiH7WwlRQYIdyYXj8YCLpiWkeBXgBRHmMnwEYR8iQ==} peerDependencies: @@ -8425,6 +8320,31 @@ packages: tslib: 2.6.2 dev: false + /@graphql-tools/import@7.0.0(graphql@16.8.1): + resolution: {integrity: sha512-NVZiTO8o1GZs6OXzNfjB+5CtQtqsZZpQOq+Uu0w57kdUkT4RlQKlwhT8T81arEsbV55KpzkpFsOZP7J1wdmhBw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + graphql: 16.8.1 + resolve-from: 5.0.0 + tslib: 2.6.2 + dev: true + + /@graphql-tools/json-file-loader@8.0.0(graphql@16.8.1): + resolution: {integrity: sha512-ki6EF/mobBWJjAAC84xNrFMhNfnUFD6Y0rQMGXekrUgY0NdeYXHU0ZUgHzC9O5+55FslqUmAUHABePDHTyZsLg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + globby: 11.1.0 + graphql: 16.8.1 + tslib: 2.6.2 + unixify: 1.0.0 + dev: true + /@graphql-tools/load@7.8.14(graphql@16.8.1): resolution: {integrity: sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==} peerDependencies: @@ -8437,23 +8357,25 @@ packages: tslib: 2.6.2 dev: false - /@graphql-tools/merge@8.4.2(graphql@16.8.1): - resolution: {integrity: sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==} + /@graphql-tools/load@8.0.1(graphql@16.8.1): + resolution: {integrity: sha512-qSMsKngJhDqRbuWyo3NvakEFqFL6+eSjy8ooJ1o5qYD26N7dqXkKzIMycQsX7rBK19hOuINAUSaRcVWH6hTccw==} + engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + '@graphql-tools/schema': 10.0.2(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) graphql: 16.8.1 + p-limit: 3.1.0 tslib: 2.6.2 - dev: false + dev: true - /@graphql-tools/merge@9.0.0(graphql@16.8.1): - resolution: {integrity: sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==} - engines: {node: '>=16.0.0'} + /@graphql-tools/merge@8.4.2(graphql@16.8.1): + resolution: {integrity: sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 dev: false @@ -8467,7 +8389,6 @@ packages: '@graphql-tools/utils': 10.0.11(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 - dev: false /@graphql-tools/optimize@1.4.0(graphql@16.8.1): resolution: {integrity: sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==} @@ -8478,6 +8399,49 @@ packages: tslib: 2.6.2 dev: false + /@graphql-tools/optimize@2.0.0(graphql@16.8.1): + resolution: {integrity: sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + graphql: 16.8.1 + tslib: 2.6.2 + dev: true + + /@graphql-tools/prisma-loader@8.0.2(@types/node@18.18.7)(graphql@16.8.1): + resolution: {integrity: sha512-8d28bIB0bZ9Bj0UOz9sHagVPW+6AHeqvGljjERtwCnWl8OCQw2c2pNboYXISLYUG5ub76r4lDciLLTU+Ks7Q0w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + '@types/js-yaml': 4.0.9 + '@types/json-stable-stringify': 1.0.36 + '@whatwg-node/fetch': 0.9.14 + chalk: 4.1.2 + debug: 4.3.4(supports-color@8.1.1) + dotenv: 16.3.1 + graphql: 16.8.1 + graphql-request: 6.1.0(graphql@16.8.1) + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + jose: 5.1.3 + js-yaml: 4.1.0 + json-stable-stringify: 1.1.0 + lodash: 4.17.21 + scuid: 1.1.0 + tslib: 2.6.2 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + /@graphql-tools/relay-operation-optimizer@6.5.18(graphql@16.8.1): resolution: {integrity: sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==} peerDependencies: @@ -8492,18 +8456,32 @@ packages: - supports-color dev: false + /@graphql-tools/relay-operation-optimizer@7.0.0(graphql@16.8.1): + resolution: {integrity: sha512-UNlJi5y3JylhVWU4MBpL0Hun4Q7IoJwv9xYtmAz+CgRa066szzY7dcuPfxrA7cIGgG/Q6TVsKsYaiF4OHPs1Fw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@ardatan/relay-compiler': 12.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@graphql-tools/schema@10.0.0(graphql@16.8.1): resolution: {integrity: sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/merge': 9.0.0(graphql@16.8.1) - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/merge': 9.0.1(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false /@graphql-tools/schema@10.0.2(graphql@16.8.1): resolution: {integrity: sha512-TbPsIZnWyDCLhgPGnDjt4hosiNU2mF/rNtSk5BVaXWnZqvKJ6gzJV4fcHcvhRIwtscDMW2/YTnK6dLVnk8pc4w==} @@ -8516,7 +8494,6 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false /@graphql-tools/schema@9.0.19(graphql@16.8.1): resolution: {integrity: sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==} @@ -8556,9 +8533,9 @@ packages: '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) - '@graphql-tools/merge': 9.0.0(graphql@16.8.1) - '@graphql-tools/schema': 10.0.0(graphql@16.8.1) - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/merge': 9.0.1(graphql@16.8.1) + '@graphql-tools/schema': 10.0.2(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -8613,7 +8590,7 @@ packages: '@graphql-tools/executor-graphql-ws': 1.1.0(graphql@16.8.1) '@graphql-tools/executor-http': 1.0.3(@types/node@18.18.7)(graphql@16.8.1) '@graphql-tools/executor-legacy-ws': 1.0.4(graphql@16.8.1) - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) '@types/ws': 8.5.8 '@whatwg-node/fetch': 0.9.14 @@ -8627,7 +8604,6 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false /@graphql-tools/utils@10.0.11(graphql@16.8.1): resolution: {integrity: sha512-vVjXgKn6zjXIlYBd7yJxCVMYGb5j18gE3hx3Qw3mNsSEsYQXbJbPdlwb7Fc9FogsJei5AaqiQerqH4kAosp1nQ==} @@ -8640,7 +8616,6 @@ packages: dset: 3.1.3 graphql: 16.8.1 tslib: 2.6.2 - dev: false /@graphql-tools/utils@10.0.7(graphql@16.8.1): resolution: {integrity: sha512-KOdeMj6Hd/MENDaqPbws3YJl3wVy0DeYnL7PyUms5Skyf7uzI9INynDwPMhLXfSb0/ph6BXTwMd5zBtWbF8tBQ==} @@ -8652,7 +8627,6 @@ packages: dset: 3.1.3 graphql: 16.8.1 tslib: 2.6.2 - dev: false /@graphql-tools/utils@8.13.1(graphql@16.8.1): resolution: {integrity: sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==} @@ -8685,7 +8659,6 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - dev: false /@graphql-tools/wrap@9.4.2(graphql@16.8.1): resolution: {integrity: sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA==} @@ -8706,7 +8679,6 @@ packages: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: graphql: 16.8.1 - dev: false /@graphql-yoga/logger@0.0.1: resolution: {integrity: sha512-6npFz7eZz33mXgSm1waBLMjUNG0D5hTc/p5Hcs1mojkT3KsLpCOFokzTEKboNsBhKevYcaVa/xeA7WBj4UYMLg==} @@ -12239,7 +12211,6 @@ packages: /@repeaterjs/repeater@3.0.4: resolution: {integrity: sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==} - dev: false /@rescript/std@9.0.0: resolution: {integrity: sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ==} @@ -13937,6 +13908,10 @@ packages: resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} dev: false + /@types/js-yaml@4.0.9: + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + dev: true + /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: @@ -13948,6 +13923,10 @@ packages: /@types/json-schema@7.0.14: resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} + /@types/json-stable-stringify@1.0.36: + resolution: {integrity: sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==} + dev: true + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} requiresBuild: true @@ -14539,6 +14518,15 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + /@urql/core@4.2.0(graphql@16.8.1): + resolution: {integrity: sha512-GRkZ4kECR9UohWAjiSk2UYUetco6/PqSrvyC4AH6g16tyqEShA63M232cfbE1J9XJPaGNjia14Gi+oOqzp144w==} + dependencies: + '@0no-co/graphql.web': 1.0.4(graphql@16.8.1) + wonka: 6.3.4 + transitivePeerDependencies: + - graphql + dev: false + /@vanilla-extract/css@1.9.1: resolution: {integrity: sha512-pu2SFiff5jRhPwvGoj8cM5l/qIyLvigOmy22ss5DGjwV5pJYezRjDLxWumi2luIwioMWvh9EozCjyfH8nq+7fQ==} dependencies: @@ -15558,7 +15546,6 @@ packages: /@whatwg-node/events@0.1.1: resolution: {integrity: sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==} engines: {node: '>=16.0.0'} - dev: false /@whatwg-node/fetch@0.8.8: resolution: {integrity: sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==} @@ -15575,7 +15562,6 @@ packages: dependencies: '@whatwg-node/node-fetch': 0.5.0 urlpattern-polyfill: 9.0.0 - dev: false /@whatwg-node/node-fetch@0.3.6: resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==} @@ -15595,7 +15581,6 @@ packages: fast-querystring: 1.1.2 fast-url-parser: 1.1.3 tslib: 2.6.2 - dev: false /@whatwg-node/server@0.7.7: resolution: {integrity: sha512-aHURgNDFm/48WVV3vhTMfnEKCYwYgdaRdRhZsQZx4UVFjGGkGay7Ys0+AYu9QT/jpoImv2oONkstoTMUprDofg==} @@ -15679,7 +15664,7 @@ packages: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} dev: true - /abitype@0.10.3(typescript@5.3.2)(zod@3.22.4): + /abitype@0.10.3(typescript@5.3.2): resolution: {integrity: sha512-tRN+7XIa7J9xugdbRzFv/95ka5ivR/sRe01eiWvM0HWWjHuigSZEACgKa0sj4wGuekTDtghCx+5Izk/cOi78pQ==} peerDependencies: typescript: '>=5.0.4' @@ -15691,7 +15676,6 @@ packages: optional: true dependencies: typescript: 5.3.2 - zod: 3.22.4 dev: true /abitype@0.8.7(typescript@5.1.6)(zod@3.22.4): @@ -15748,7 +15732,7 @@ packages: zod: 3.22.4 dev: false - /abitype@0.9.8(typescript@5.3.2)(zod@3.22.4): + /abitype@0.9.8(typescript@5.3.2): resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: typescript: '>=5.0.4' @@ -15760,7 +15744,6 @@ packages: optional: true dependencies: typescript: 5.3.2 - zod: 3.22.4 dev: false /abort-controller@3.0.0: @@ -15868,6 +15851,15 @@ packages: transitivePeerDependencies: - supports-color + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + /agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} @@ -16447,7 +16439,6 @@ packages: /auto-bind@4.0.0: resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} engines: {node: '>=8'} - dev: false /autoprefixer@10.4.16(postcss@8.4.31): resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} @@ -16736,7 +16727,6 @@ packages: /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} - dev: false /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.5): resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} @@ -16820,7 +16810,6 @@ packages: '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.5) '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.5) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 - dev: false /babel-preset-jest@29.6.3(@babel/core@7.23.5): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} @@ -17476,7 +17465,6 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false /carbites@1.0.6: resolution: {integrity: sha512-dS9IQvnrb5VIRvSTNz5Ff+mB9d2MFfi5mojtJi7Rlss79VeF190jr0sZdA7eW0CGHotvHkZaWuM6wgfD9PEFRg==} @@ -17639,7 +17627,6 @@ packages: title-case: 3.0.3 upper-case: 2.0.2 upper-case-first: 2.0.2 - dev: false /change-case@4.1.2: resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} @@ -17656,7 +17643,6 @@ packages: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.6.2 - dev: false /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} @@ -18233,7 +18219,6 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case: 2.0.2 - dev: false /content-disposition@0.5.2: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} @@ -18486,7 +18471,6 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 typescript: 5.3.2 - dev: false /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} @@ -18552,7 +18536,6 @@ packages: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: false /cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} @@ -18567,7 +18550,6 @@ packages: engines: {node: '>=16.0.0'} dependencies: tslib: 2.6.2 - dev: false /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -19209,7 +19191,6 @@ packages: /dataloader@2.2.2: resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} - dev: false /datastore-core@8.0.4: resolution: {integrity: sha512-oBA6a024NFXJOTu+w9nLAimfy4wCYUhdE/5XQGtdKt1BmCVtPYW10GORvVT3pdZBcse6k/mVcBl+hjkXIlm65A==} @@ -19290,6 +19271,10 @@ packages: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} dev: true + /debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + dev: true + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -19595,7 +19580,6 @@ packages: /dependency-graph@0.11.0: resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} engines: {node: '>= 0.6.0'} - dev: false /deprecated-react-native-prop-types@4.1.0: resolution: {integrity: sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw==} @@ -19925,7 +19909,6 @@ packages: /dset@3.1.3: resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} - dev: false /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} @@ -21290,7 +21273,6 @@ packages: /extract-files@11.0.0: resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} engines: {node: ^12.20 || >= 14.13} - dev: false /extract-zip@2.0.1(supports-color@8.1.1): resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} @@ -21437,7 +21419,6 @@ packages: /fbjs-css-vars@1.0.2: resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} - dev: false /fbjs@3.0.5: resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} @@ -21451,7 +21432,6 @@ packages: ua-parser-js: 1.0.36 transitivePeerDependencies: - encoding - dev: false /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -22625,6 +22605,36 @@ packages: /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + /graphql-config@5.0.3(@types/node@18.18.7)(graphql@16.8.1)(typescript@5.3.2): + resolution: {integrity: sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==} + engines: {node: '>= 16.0.0'} + peerDependencies: + cosmiconfig-toml-loader: ^1.0.0 + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + cosmiconfig-toml-loader: + optional: true + dependencies: + '@graphql-tools/graphql-file-loader': 8.0.0(graphql@16.8.1) + '@graphql-tools/json-file-loader': 8.0.0(graphql@16.8.1) + '@graphql-tools/load': 8.0.1(graphql@16.8.1) + '@graphql-tools/merge': 9.0.1(graphql@16.8.1) + '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + cosmiconfig: 8.3.6(typescript@5.3.2) + graphql: 16.8.1 + jiti: 1.20.0 + minimatch: 4.2.3 + string-env-interpolation: 1.0.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - typescript + - utf-8-validate + dev: true + /graphql-import-node@0.0.5(graphql@16.8.1): resolution: {integrity: sha512-OXbou9fqh9/Lm7vwXT0XoRN9J5+WCYKnbiTalgFDvkQERITRmcfncZs6aVABedd5B85yQU5EULS4a5pnbpuI0Q==} peerDependencies: @@ -22647,6 +22657,18 @@ packages: lodash.mergewith: 4.6.2 dev: false + /graphql-request@6.1.0(graphql@16.8.1): + resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} + peerDependencies: + graphql: 14 - 16 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + cross-fetch: 3.1.8 + graphql: 16.8.1 + transitivePeerDependencies: + - encoding + dev: true + /graphql-tag@2.12.6(graphql@16.8.1): resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} @@ -22655,7 +22677,6 @@ packages: dependencies: graphql: 16.8.1 tslib: 2.6.2 - dev: false /graphql-ws@5.12.1(graphql@16.8.1): resolution: {integrity: sha512-umt4f5NnMK46ChM2coO36PTFhHouBrK9stWWBczERguwYrGnPNxJ9dimU6IyOBfOkC6Izhkg4H8+F51W/8CYDg==} @@ -22673,7 +22694,6 @@ packages: graphql: '>=0.11 <=16' dependencies: graphql: 16.8.1 - dev: false /graphql-yoga@3.9.1(graphql@16.8.1): resolution: {integrity: sha512-BB6EkN64VBTXWmf9Kym2OsVZFzBC0mAsQNo9eNB5xIr3t+x7qepQ34xW5A353NWol3Js3xpzxwIKFVF6l9VsPg==} @@ -22704,7 +22724,7 @@ packages: '@envelop/core': 5.0.0 '@graphql-tools/executor': 1.2.0(graphql@16.8.1) '@graphql-tools/schema': 10.0.0(graphql@16.8.1) - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) '@graphql-yoga/logger': 2.0.0 '@graphql-yoga/subscription': 5.0.0 '@whatwg-node/fetch': 0.9.14 @@ -23331,7 +23351,6 @@ packages: dependencies: capital-case: 1.0.4 tslib: 2.6.2 - dev: false /heap@0.2.7: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} @@ -23577,6 +23596,16 @@ packages: - supports-color dev: true + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + /http-proxy-middleware@2.0.6(@types/express@4.17.20)(debug@4.3.4): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} @@ -23654,6 +23683,16 @@ packages: transitivePeerDependencies: - supports-color + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + /human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} @@ -23763,7 +23802,6 @@ packages: /immutable@3.7.6: resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} engines: {node: '>=0.8.0'} - dev: false /immutable@4.2.1: resolution: {integrity: sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==} @@ -23790,7 +23828,6 @@ packages: /import-from@4.0.0: resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} engines: {node: '>=12.2'} - dev: false /import-lazy@2.1.0: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} @@ -24617,7 +24654,6 @@ packages: dependencies: is-relative: 1.0.0 is-windows: 1.0.2 - dev: false /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} @@ -24832,7 +24868,6 @@ packages: resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} dependencies: tslib: 2.6.2 - dev: false /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -24962,7 +24997,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-unc-path: 1.0.0 - dev: false /is-retry-allowed@1.2.0: resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} @@ -25043,7 +25077,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: unc-path-regex: 0.1.2 - dev: false /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -25053,7 +25086,6 @@ packages: resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} dependencies: tslib: 2.6.2 - dev: false /is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} @@ -25184,7 +25216,6 @@ packages: ws: '*' dependencies: ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - dev: false /isows@1.0.3(ws@8.13.0): resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} @@ -26139,6 +26170,10 @@ packages: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 + /jose@5.1.3: + resolution: {integrity: sha512-GPExOkcMsCLBTi1YetY2LmkoY559fss0+0KVa6kOfb2YFe84nAM7Nm/XzuZozah4iHgmBGrCOHL5/cy670SBRw==} + dev: true + /js-base64@3.7.5: resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} dev: false @@ -26361,9 +26396,27 @@ packages: /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + /json-stable-stringify@1.1.0: + resolution: {integrity: sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + dev: true + /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + /json-to-pretty-yaml@1.2.2: + resolution: {integrity: sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==} + engines: {node: '>= 0.2.0'} + dependencies: + remedial: 1.0.8 + remove-trailing-spaces: 1.0.8 + dev: true + /json2md@2.0.0: resolution: {integrity: sha512-4PIMtD0zTfQZWcUId1EyHY2BQ2EG/imHWHkGFbXYPlczW8G6wPJA/BRVN3e5v6NPwFUCcoFvUsCeo6rzV2CWww==} dependencies: @@ -26404,6 +26457,10 @@ packages: optionalDependencies: graceful-fs: 4.2.11 + /jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + dev: true + /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} @@ -26745,6 +26802,25 @@ packages: wrap-ansi: 7.0.0 dev: true + /listr2@4.0.5: + resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} + engines: {node: '>=12'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + /listr2@6.6.1: resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} engines: {node: '>=16.0.0'} @@ -27001,6 +27077,10 @@ packages: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true @@ -27131,7 +27211,6 @@ packages: resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} dependencies: tslib: 2.6.2 - dev: false /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -27255,7 +27334,6 @@ packages: /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} - dev: false /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} @@ -27522,7 +27600,6 @@ packages: optional: true dependencies: '@types/node': 18.18.7 - dev: false /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -28149,6 +28226,13 @@ packages: dependencies: brace-expansion: 1.1.11 + /minimatch@4.2.3: + resolution: {integrity: sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 1.1.11 + dev: true + /minimatch@5.0.1: resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} engines: {node: '>=10'} @@ -28767,7 +28851,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: remove-trailing-separator: 1.1.0 - dev: false /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -28828,7 +28911,6 @@ packages: /nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - dev: false /number-to-bn@1.7.0: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} @@ -29413,7 +29495,6 @@ packages: is-absolute: 1.0.0 map-cache: 0.2.2 path-root: 0.1.1 - dev: false /parse-headers@2.0.5: resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} @@ -29499,7 +29580,6 @@ packages: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} @@ -29536,14 +29616,12 @@ packages: /path-root-regex@0.1.2: resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} engines: {node: '>=0.10.0'} - dev: false /path-root@0.1.1: resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} engines: {node: '>=0.10.0'} dependencies: path-root-regex: 0.1.2 - dev: false /path-scurry@1.10.1: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} @@ -30358,7 +30436,6 @@ packages: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} dependencies: asap: 2.0.6 - dev: false /promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} @@ -31394,7 +31471,6 @@ packages: invariant: 2.2.4 transitivePeerDependencies: - encoding - dev: false /release-zalgo@1.0.0: resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} @@ -31476,13 +31552,20 @@ packages: mdast-squeeze-paragraphs: 4.0.0 dev: false + /remedial@1.0.8: + resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} + dev: true + /remove-accents@0.4.2: resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} dev: false /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - dev: false + + /remove-trailing-spaces@1.0.8: + resolution: {integrity: sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==} + dev: true /renderkid@2.0.7: resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} @@ -32137,6 +32220,10 @@ packages: /scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + /scuid@1.1.0: + resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==} + dev: true + /search-insights@2.9.0: resolution: {integrity: sha512-bkWW9nIHOFkLwjQ1xqVaMbjjO5vhP26ERsH9Y3pKr8imthofEFIxlnOabkmGcw6ksRj9jWidcI65vvjJH/nTGg==} dev: false @@ -32247,7 +32334,6 @@ packages: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false /serialize-error@2.1.0: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} @@ -32465,7 +32551,6 @@ packages: /signedsource@1.0.0: resolution: {integrity: sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==} - dev: false /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -32572,7 +32657,6 @@ packages: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false /socket.io-client@4.7.2: resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} @@ -32891,7 +32975,6 @@ packages: resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} dependencies: tslib: 2.6.2 - dev: false /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -33037,6 +33120,10 @@ packages: engines: {node: '>=0.6.19'} dev: true + /string-env-interpolation@1.0.1: + resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} + dev: true + /string-format@2.0.0: resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} dev: true @@ -33366,7 +33453,6 @@ packages: resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} dependencies: tslib: 2.6.2 - dev: false /swarm-js@0.1.42: resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} @@ -33731,7 +33817,6 @@ packages: resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} dependencies: tslib: 2.6.2 - dev: false /tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} @@ -33921,6 +34006,10 @@ packages: webpack: 5.89.0(webpack-cli@5.1.4) dev: true + /ts-log@2.2.5: + resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==} + dev: true + /ts-node@10.9.1(@types/node@18.18.7)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -34043,7 +34132,6 @@ packages: /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - dev: false /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} @@ -34352,7 +34440,6 @@ packages: /ua-parser-js@1.0.36: resolution: {integrity: sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==} - dev: false /ufo@1.3.1: resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} @@ -34433,7 +34520,6 @@ packages: /unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} - dev: false /underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} @@ -34629,7 +34715,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: normalize-path: 2.1.1 - dev: false /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} @@ -34681,13 +34766,11 @@ packages: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} dependencies: tslib: 2.6.2 - dev: false /upper-case@2.0.2: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} dependencies: tslib: 2.6.2 - dev: false /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -34742,6 +34825,17 @@ packages: /urlpattern-polyfill@9.0.0: resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} + + /urql@4.0.6(graphql@16.8.1)(react@18.2.0): + resolution: {integrity: sha512-meXJ2puOd64uCGKh7Fse2R7gPa8+ZpBOoA62jN7CPXXUt7SVZSdeXWSpB3HvlfzLUkEqsWbvshwrgeWRYNNGaQ==} + peerDependencies: + react: '>= 16.8.0' + dependencies: + '@urql/core': 4.2.0(graphql@16.8.1) + react: 18.2.0 + wonka: 6.3.4 + transitivePeerDependencies: + - graphql dev: false /use-callback-ref@1.3.0(@types/react@18.2.33)(react@18.2.0): @@ -34966,7 +35060,6 @@ packages: /value-or-promise@1.0.12: resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} engines: {node: '>=12'} - dev: false /varint-decoder@1.0.0: resolution: {integrity: sha512-JkOvdztASWGUAsXshCFHrB9f6AgR2Q8W08CEyJ+43b1qtFocmI8Sp1R/M0E/hDOY2FzVIqk63tOYLgDYWuJ7IQ==} @@ -35095,7 +35188,7 @@ packages: - zod dev: false - /viem@1.19.9(typescript@5.3.2)(zod@3.22.4): + /viem@1.19.9(typescript@5.3.2): resolution: {integrity: sha512-Sf9U2x4jU0S/FALqYypcspWOGene0NZyD470oUripNhE0Ta6uOE/OgE4toTDVfRxov8qw0JFinr/wPGxYE3+HQ==} peerDependencies: typescript: '>=5.0.4' @@ -35108,7 +35201,7 @@ packages: '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.3.2)(zod@3.22.4) + abitype: 0.9.8(typescript@5.3.2) isows: 1.0.3(ws@8.13.0) typescript: 5.3.2 ws: 8.13.0 @@ -36170,6 +36263,10 @@ packages: resolution: {integrity: sha512-tE12J/NenOv4xdVobD+AD3fT06T4KNqnzRhkv5nBIu7K+pvOH2oLCEgYP+i+5mF2jtI6FEADheOdZkA8YWET9w==} dev: false + /wonka@6.3.4: + resolution: {integrity: sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg==} + dev: false + /word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -36498,6 +36595,10 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + dev: true + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -36510,7 +36611,6 @@ packages: /yaml@2.3.3: resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} engines: {node: '>= 14'} - dev: false /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} @@ -36643,6 +36743,7 @@ packages: /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false /zustand@4.4.4(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-5UTUIAiHMNf5+mFp7/AnzJXS7+XxktULFN0+D1sCiZWyX7ZG+AQpqs2qpYrynRij4QvoDdCD+U+bmg/cG3Ucxw==} diff --git a/sdk/.graphclient/index.ts b/sdk/.graphclient/index.ts deleted file mode 100644 index 9e48bf89..00000000 --- a/sdk/.graphclient/index.ts +++ /dev/null @@ -1,1839 +0,0 @@ -// @ts-nocheck -import { GraphQLResolveInfo, SelectionSetNode, FieldNode, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; -import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; -import { gql } from '@graphql-mesh/utils'; - -import type { GetMeshOptions } from '@graphql-mesh/runtime'; -import type { YamlConfig } from '@graphql-mesh/types'; -import { PubSub } from '@graphql-mesh/utils'; -import { DefaultLogger } from '@graphql-mesh/utils'; -import MeshCache from "@graphql-mesh/cache-localforage"; -import { fetch as fetchFn } from '@whatwg-node/fetch'; - -import { MeshResolvedSource } from '@graphql-mesh/runtime'; -import { MeshTransform, MeshPlugin } from '@graphql-mesh/types'; -import GraphqlHandler from "@graphql-mesh/graphql" -import { parse } from 'graphql'; -import UsePollingLive from "@graphprotocol/client-polling-live"; -import BareMerger from "@graphql-mesh/merger-bare"; -import { printWithCache } from '@graphql-mesh/utils'; -import { createMeshHTTPHandler, MeshHTTPHandler } from '@graphql-mesh/http'; -import { getMesh, ExecuteMeshFn, SubscribeMeshFn, MeshContext as BaseMeshContext, MeshInstance } from '@graphql-mesh/runtime'; -import { MeshStore, FsStoreStorageAdapter } from '@graphql-mesh/store'; -import { path as pathModule } from '@graphql-mesh/cross-helpers'; -import { ImportFn } from '@graphql-mesh/types'; -import type { HypercertsTypes } from './sources/Hypercerts/types'; -import * as importedModule$0 from "./sources/Hypercerts/introspectionSchema"; -export type Maybe = T | null; -export type InputMaybe = Maybe; -export type Exact = { [K in keyof T]: T[K] }; -export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; -export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; -export type RequireFields = Omit & { [P in K]-?: NonNullable }; - - - -/** All built-in and custom scalars, mapped to their actual values */ -export type Scalars = { - ID: string; - String: string; - Boolean: boolean; - Int: number; - Float: number; - BigDecimal: any; - BigInt: any; - Bytes: any; - Int8: any; -}; - -export type Query = { - allowlist?: Maybe; - allowlists: Array; - claim?: Maybe; - claims: Array; - claimToken?: Maybe; - claimTokens: Array; - token?: Maybe; - tokens: Array; - acceptedToken?: Maybe; - acceptedTokens: Array; - offer?: Maybe; - offers: Array; - trade?: Maybe; - trades: Array; - /** Access to subgraph metadata */ - _meta?: Maybe<_Meta_>; -}; - - -export type QueryallowlistArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryallowlistsArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryclaimArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryclaimsArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryclaimTokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryclaimTokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QuerytokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QuerytokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryacceptedTokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryacceptedTokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryofferArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryoffersArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QuerytradeArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QuerytradesArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type Query_metaArgs = { - block?: InputMaybe; -}; - -export type Subscription = { - allowlist?: Maybe; - allowlists: Array; - claim?: Maybe; - claims: Array; - claimToken?: Maybe; - claimTokens: Array; - token?: Maybe; - tokens: Array; - acceptedToken?: Maybe; - acceptedTokens: Array; - offer?: Maybe; - offers: Array; - trade?: Maybe; - trades: Array; - /** Access to subgraph metadata */ - _meta?: Maybe<_Meta_>; -}; - - -export type SubscriptionallowlistArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionallowlistsArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionclaimArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionclaimsArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionclaimTokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionclaimTokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptiontokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptiontokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionacceptedTokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionacceptedTokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionofferArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionoffersArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptiontradeArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptiontradesArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type Subscription_metaArgs = { - block?: InputMaybe; -}; - -export type AcceptedToken = { - id: Scalars['String']; - token: Token; - minimumAmountPerUnit: Scalars['BigInt']; - accepted: Scalars['Boolean']; -}; - -export type AcceptedToken_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - token?: InputMaybe; - token_not?: InputMaybe; - token_gt?: InputMaybe; - token_lt?: InputMaybe; - token_gte?: InputMaybe; - token_lte?: InputMaybe; - token_in?: InputMaybe>; - token_not_in?: InputMaybe>; - token_contains?: InputMaybe; - token_contains_nocase?: InputMaybe; - token_not_contains?: InputMaybe; - token_not_contains_nocase?: InputMaybe; - token_starts_with?: InputMaybe; - token_starts_with_nocase?: InputMaybe; - token_not_starts_with?: InputMaybe; - token_not_starts_with_nocase?: InputMaybe; - token_ends_with?: InputMaybe; - token_ends_with_nocase?: InputMaybe; - token_not_ends_with?: InputMaybe; - token_not_ends_with_nocase?: InputMaybe; - token_?: InputMaybe; - minimumAmountPerUnit?: InputMaybe; - minimumAmountPerUnit_not?: InputMaybe; - minimumAmountPerUnit_gt?: InputMaybe; - minimumAmountPerUnit_lt?: InputMaybe; - minimumAmountPerUnit_gte?: InputMaybe; - minimumAmountPerUnit_lte?: InputMaybe; - minimumAmountPerUnit_in?: InputMaybe>; - minimumAmountPerUnit_not_in?: InputMaybe>; - accepted?: InputMaybe; - accepted_not?: InputMaybe; - accepted_in?: InputMaybe>; - accepted_not_in?: InputMaybe>; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type AcceptedToken_orderBy = - | 'id' - | 'token' - | 'token__id' - | 'token__name' - | 'token__symbol' - | 'token__decimals' - | 'minimumAmountPerUnit' - | 'accepted'; - -export type Allowlist = { - id: Scalars['String']; - root: Scalars['Bytes']; - claim: Claim; -}; - -export type Allowlist_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - root?: InputMaybe; - root_not?: InputMaybe; - root_gt?: InputMaybe; - root_lt?: InputMaybe; - root_gte?: InputMaybe; - root_lte?: InputMaybe; - root_in?: InputMaybe>; - root_not_in?: InputMaybe>; - root_contains?: InputMaybe; - root_not_contains?: InputMaybe; - claim?: InputMaybe; - claim_not?: InputMaybe; - claim_gt?: InputMaybe; - claim_lt?: InputMaybe; - claim_gte?: InputMaybe; - claim_lte?: InputMaybe; - claim_in?: InputMaybe>; - claim_not_in?: InputMaybe>; - claim_contains?: InputMaybe; - claim_contains_nocase?: InputMaybe; - claim_not_contains?: InputMaybe; - claim_not_contains_nocase?: InputMaybe; - claim_starts_with?: InputMaybe; - claim_starts_with_nocase?: InputMaybe; - claim_not_starts_with?: InputMaybe; - claim_not_starts_with_nocase?: InputMaybe; - claim_ends_with?: InputMaybe; - claim_ends_with_nocase?: InputMaybe; - claim_not_ends_with?: InputMaybe; - claim_not_ends_with_nocase?: InputMaybe; - claim_?: InputMaybe; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type Allowlist_orderBy = - | 'id' - | 'root' - | 'claim' - | 'claim__id' - | 'claim__creation' - | 'claim__tokenID' - | 'claim__contract' - | 'claim__uri' - | 'claim__creator' - | 'claim__owner' - | 'claim__totalUnits'; - -export type BlockChangedFilter = { - number_gte: Scalars['Int']; -}; - -export type Block_height = { - hash?: InputMaybe; - number?: InputMaybe; - number_gte?: InputMaybe; -}; - -export type Claim = { - id: Scalars['String']; - creation: Scalars['BigInt']; - tokenID: Scalars['BigInt']; - contract: Scalars['String']; - uri?: Maybe; - creator?: Maybe; - owner?: Maybe; - totalUnits?: Maybe; - allowlist?: Maybe; - graphName: Scalars['String']; -}; - -export type ClaimToken = { - id: Scalars['String']; - tokenID: Scalars['BigInt']; - claim: Claim; - owner: Scalars['Bytes']; - units: Scalars['BigInt']; - offers?: Maybe>; - graphName: Scalars['String']; -}; - - -export type ClaimTokenoffersArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; -}; - -export type ClaimToken_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - tokenID?: InputMaybe; - tokenID_not?: InputMaybe; - tokenID_gt?: InputMaybe; - tokenID_lt?: InputMaybe; - tokenID_gte?: InputMaybe; - tokenID_lte?: InputMaybe; - tokenID_in?: InputMaybe>; - tokenID_not_in?: InputMaybe>; - claim?: InputMaybe; - claim_not?: InputMaybe; - claim_gt?: InputMaybe; - claim_lt?: InputMaybe; - claim_gte?: InputMaybe; - claim_lte?: InputMaybe; - claim_in?: InputMaybe>; - claim_not_in?: InputMaybe>; - claim_contains?: InputMaybe; - claim_contains_nocase?: InputMaybe; - claim_not_contains?: InputMaybe; - claim_not_contains_nocase?: InputMaybe; - claim_starts_with?: InputMaybe; - claim_starts_with_nocase?: InputMaybe; - claim_not_starts_with?: InputMaybe; - claim_not_starts_with_nocase?: InputMaybe; - claim_ends_with?: InputMaybe; - claim_ends_with_nocase?: InputMaybe; - claim_not_ends_with?: InputMaybe; - claim_not_ends_with_nocase?: InputMaybe; - claim_?: InputMaybe; - owner?: InputMaybe; - owner_not?: InputMaybe; - owner_gt?: InputMaybe; - owner_lt?: InputMaybe; - owner_gte?: InputMaybe; - owner_lte?: InputMaybe; - owner_in?: InputMaybe>; - owner_not_in?: InputMaybe>; - owner_contains?: InputMaybe; - owner_not_contains?: InputMaybe; - units?: InputMaybe; - units_not?: InputMaybe; - units_gt?: InputMaybe; - units_lt?: InputMaybe; - units_gte?: InputMaybe; - units_lte?: InputMaybe; - units_in?: InputMaybe>; - units_not_in?: InputMaybe>; - offers_?: InputMaybe; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type ClaimToken_orderBy = - | 'id' - | 'tokenID' - | 'claim' - | 'claim__id' - | 'claim__creation' - | 'claim__tokenID' - | 'claim__contract' - | 'claim__uri' - | 'claim__creator' - | 'claim__owner' - | 'claim__totalUnits' - | 'owner' - | 'units' - | 'offers'; - -export type Claim_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - creation?: InputMaybe; - creation_not?: InputMaybe; - creation_gt?: InputMaybe; - creation_lt?: InputMaybe; - creation_gte?: InputMaybe; - creation_lte?: InputMaybe; - creation_in?: InputMaybe>; - creation_not_in?: InputMaybe>; - tokenID?: InputMaybe; - tokenID_not?: InputMaybe; - tokenID_gt?: InputMaybe; - tokenID_lt?: InputMaybe; - tokenID_gte?: InputMaybe; - tokenID_lte?: InputMaybe; - tokenID_in?: InputMaybe>; - tokenID_not_in?: InputMaybe>; - contract?: InputMaybe; - contract_not?: InputMaybe; - contract_gt?: InputMaybe; - contract_lt?: InputMaybe; - contract_gte?: InputMaybe; - contract_lte?: InputMaybe; - contract_in?: InputMaybe>; - contract_not_in?: InputMaybe>; - contract_contains?: InputMaybe; - contract_contains_nocase?: InputMaybe; - contract_not_contains?: InputMaybe; - contract_not_contains_nocase?: InputMaybe; - contract_starts_with?: InputMaybe; - contract_starts_with_nocase?: InputMaybe; - contract_not_starts_with?: InputMaybe; - contract_not_starts_with_nocase?: InputMaybe; - contract_ends_with?: InputMaybe; - contract_ends_with_nocase?: InputMaybe; - contract_not_ends_with?: InputMaybe; - contract_not_ends_with_nocase?: InputMaybe; - uri?: InputMaybe; - uri_not?: InputMaybe; - uri_gt?: InputMaybe; - uri_lt?: InputMaybe; - uri_gte?: InputMaybe; - uri_lte?: InputMaybe; - uri_in?: InputMaybe>; - uri_not_in?: InputMaybe>; - uri_contains?: InputMaybe; - uri_contains_nocase?: InputMaybe; - uri_not_contains?: InputMaybe; - uri_not_contains_nocase?: InputMaybe; - uri_starts_with?: InputMaybe; - uri_starts_with_nocase?: InputMaybe; - uri_not_starts_with?: InputMaybe; - uri_not_starts_with_nocase?: InputMaybe; - uri_ends_with?: InputMaybe; - uri_ends_with_nocase?: InputMaybe; - uri_not_ends_with?: InputMaybe; - uri_not_ends_with_nocase?: InputMaybe; - creator?: InputMaybe; - creator_not?: InputMaybe; - creator_gt?: InputMaybe; - creator_lt?: InputMaybe; - creator_gte?: InputMaybe; - creator_lte?: InputMaybe; - creator_in?: InputMaybe>; - creator_not_in?: InputMaybe>; - creator_contains?: InputMaybe; - creator_not_contains?: InputMaybe; - owner?: InputMaybe; - owner_not?: InputMaybe; - owner_gt?: InputMaybe; - owner_lt?: InputMaybe; - owner_gte?: InputMaybe; - owner_lte?: InputMaybe; - owner_in?: InputMaybe>; - owner_not_in?: InputMaybe>; - owner_contains?: InputMaybe; - owner_not_contains?: InputMaybe; - totalUnits?: InputMaybe; - totalUnits_not?: InputMaybe; - totalUnits_gt?: InputMaybe; - totalUnits_lt?: InputMaybe; - totalUnits_gte?: InputMaybe; - totalUnits_lte?: InputMaybe; - totalUnits_in?: InputMaybe>; - totalUnits_not_in?: InputMaybe>; - allowlist?: InputMaybe; - allowlist_not?: InputMaybe; - allowlist_gt?: InputMaybe; - allowlist_lt?: InputMaybe; - allowlist_gte?: InputMaybe; - allowlist_lte?: InputMaybe; - allowlist_in?: InputMaybe>; - allowlist_not_in?: InputMaybe>; - allowlist_contains?: InputMaybe; - allowlist_contains_nocase?: InputMaybe; - allowlist_not_contains?: InputMaybe; - allowlist_not_contains_nocase?: InputMaybe; - allowlist_starts_with?: InputMaybe; - allowlist_starts_with_nocase?: InputMaybe; - allowlist_not_starts_with?: InputMaybe; - allowlist_not_starts_with_nocase?: InputMaybe; - allowlist_ends_with?: InputMaybe; - allowlist_ends_with_nocase?: InputMaybe; - allowlist_not_ends_with?: InputMaybe; - allowlist_not_ends_with_nocase?: InputMaybe; - allowlist_?: InputMaybe; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type Claim_orderBy = - | 'id' - | 'creation' - | 'tokenID' - | 'contract' - | 'uri' - | 'creator' - | 'owner' - | 'totalUnits' - | 'allowlist' - | 'allowlist__id' - | 'allowlist__root'; - -export type Offer = { - id: Scalars['String']; - fractionID: ClaimToken; - unitsAvailable: Scalars['BigInt']; - minUnitsPerTrade: Scalars['BigInt']; - maxUnitsPerTrade: Scalars['BigInt']; - status: OfferStatus; - acceptedTokens: Array; -}; - - -export type OfferacceptedTokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; -}; - -export type OfferStatus = - | 'Open' - | 'Fulfilled' - | 'Cancelled'; - -export type Offer_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - fractionID?: InputMaybe; - fractionID_not?: InputMaybe; - fractionID_gt?: InputMaybe; - fractionID_lt?: InputMaybe; - fractionID_gte?: InputMaybe; - fractionID_lte?: InputMaybe; - fractionID_in?: InputMaybe>; - fractionID_not_in?: InputMaybe>; - fractionID_contains?: InputMaybe; - fractionID_contains_nocase?: InputMaybe; - fractionID_not_contains?: InputMaybe; - fractionID_not_contains_nocase?: InputMaybe; - fractionID_starts_with?: InputMaybe; - fractionID_starts_with_nocase?: InputMaybe; - fractionID_not_starts_with?: InputMaybe; - fractionID_not_starts_with_nocase?: InputMaybe; - fractionID_ends_with?: InputMaybe; - fractionID_ends_with_nocase?: InputMaybe; - fractionID_not_ends_with?: InputMaybe; - fractionID_not_ends_with_nocase?: InputMaybe; - fractionID_?: InputMaybe; - unitsAvailable?: InputMaybe; - unitsAvailable_not?: InputMaybe; - unitsAvailable_gt?: InputMaybe; - unitsAvailable_lt?: InputMaybe; - unitsAvailable_gte?: InputMaybe; - unitsAvailable_lte?: InputMaybe; - unitsAvailable_in?: InputMaybe>; - unitsAvailable_not_in?: InputMaybe>; - minUnitsPerTrade?: InputMaybe; - minUnitsPerTrade_not?: InputMaybe; - minUnitsPerTrade_gt?: InputMaybe; - minUnitsPerTrade_lt?: InputMaybe; - minUnitsPerTrade_gte?: InputMaybe; - minUnitsPerTrade_lte?: InputMaybe; - minUnitsPerTrade_in?: InputMaybe>; - minUnitsPerTrade_not_in?: InputMaybe>; - maxUnitsPerTrade?: InputMaybe; - maxUnitsPerTrade_not?: InputMaybe; - maxUnitsPerTrade_gt?: InputMaybe; - maxUnitsPerTrade_lt?: InputMaybe; - maxUnitsPerTrade_gte?: InputMaybe; - maxUnitsPerTrade_lte?: InputMaybe; - maxUnitsPerTrade_in?: InputMaybe>; - maxUnitsPerTrade_not_in?: InputMaybe>; - status?: InputMaybe; - status_not?: InputMaybe; - status_in?: InputMaybe>; - status_not_in?: InputMaybe>; - acceptedTokens?: InputMaybe>; - acceptedTokens_not?: InputMaybe>; - acceptedTokens_contains?: InputMaybe>; - acceptedTokens_contains_nocase?: InputMaybe>; - acceptedTokens_not_contains?: InputMaybe>; - acceptedTokens_not_contains_nocase?: InputMaybe>; - acceptedTokens_?: InputMaybe; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type Offer_orderBy = - | 'id' - | 'fractionID' - | 'fractionID__id' - | 'fractionID__tokenID' - | 'fractionID__owner' - | 'fractionID__units' - | 'unitsAvailable' - | 'minUnitsPerTrade' - | 'maxUnitsPerTrade' - | 'status' - | 'acceptedTokens'; - -/** Defines the order direction, either ascending or descending */ -export type OrderDirection = - | 'asc' - | 'desc'; - -export type Token = { - id: Scalars['String']; - name: Scalars['String']; - symbol?: Maybe; - decimals?: Maybe; -}; - -export type Token_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - name?: InputMaybe; - name_not?: InputMaybe; - name_gt?: InputMaybe; - name_lt?: InputMaybe; - name_gte?: InputMaybe; - name_lte?: InputMaybe; - name_in?: InputMaybe>; - name_not_in?: InputMaybe>; - name_contains?: InputMaybe; - name_contains_nocase?: InputMaybe; - name_not_contains?: InputMaybe; - name_not_contains_nocase?: InputMaybe; - name_starts_with?: InputMaybe; - name_starts_with_nocase?: InputMaybe; - name_not_starts_with?: InputMaybe; - name_not_starts_with_nocase?: InputMaybe; - name_ends_with?: InputMaybe; - name_ends_with_nocase?: InputMaybe; - name_not_ends_with?: InputMaybe; - name_not_ends_with_nocase?: InputMaybe; - symbol?: InputMaybe; - symbol_not?: InputMaybe; - symbol_gt?: InputMaybe; - symbol_lt?: InputMaybe; - symbol_gte?: InputMaybe; - symbol_lte?: InputMaybe; - symbol_in?: InputMaybe>; - symbol_not_in?: InputMaybe>; - symbol_contains?: InputMaybe; - symbol_contains_nocase?: InputMaybe; - symbol_not_contains?: InputMaybe; - symbol_not_contains_nocase?: InputMaybe; - symbol_starts_with?: InputMaybe; - symbol_starts_with_nocase?: InputMaybe; - symbol_not_starts_with?: InputMaybe; - symbol_not_starts_with_nocase?: InputMaybe; - symbol_ends_with?: InputMaybe; - symbol_ends_with_nocase?: InputMaybe; - symbol_not_ends_with?: InputMaybe; - symbol_not_ends_with_nocase?: InputMaybe; - decimals?: InputMaybe; - decimals_not?: InputMaybe; - decimals_gt?: InputMaybe; - decimals_lt?: InputMaybe; - decimals_gte?: InputMaybe; - decimals_lte?: InputMaybe; - decimals_in?: InputMaybe>; - decimals_not_in?: InputMaybe>; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type Token_orderBy = - | 'id' - | 'name' - | 'symbol' - | 'decimals'; - -export type Trade = { - id: Scalars['String']; - buyer: Scalars['Bytes']; - offerID: Offer; - unitsSold: Scalars['BigInt']; - token: Token; - amountPerUnit: Scalars['BigInt']; -}; - -export type Trade_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - buyer?: InputMaybe; - buyer_not?: InputMaybe; - buyer_gt?: InputMaybe; - buyer_lt?: InputMaybe; - buyer_gte?: InputMaybe; - buyer_lte?: InputMaybe; - buyer_in?: InputMaybe>; - buyer_not_in?: InputMaybe>; - buyer_contains?: InputMaybe; - buyer_not_contains?: InputMaybe; - offerID?: InputMaybe; - offerID_not?: InputMaybe; - offerID_gt?: InputMaybe; - offerID_lt?: InputMaybe; - offerID_gte?: InputMaybe; - offerID_lte?: InputMaybe; - offerID_in?: InputMaybe>; - offerID_not_in?: InputMaybe>; - offerID_contains?: InputMaybe; - offerID_contains_nocase?: InputMaybe; - offerID_not_contains?: InputMaybe; - offerID_not_contains_nocase?: InputMaybe; - offerID_starts_with?: InputMaybe; - offerID_starts_with_nocase?: InputMaybe; - offerID_not_starts_with?: InputMaybe; - offerID_not_starts_with_nocase?: InputMaybe; - offerID_ends_with?: InputMaybe; - offerID_ends_with_nocase?: InputMaybe; - offerID_not_ends_with?: InputMaybe; - offerID_not_ends_with_nocase?: InputMaybe; - offerID_?: InputMaybe; - unitsSold?: InputMaybe; - unitsSold_not?: InputMaybe; - unitsSold_gt?: InputMaybe; - unitsSold_lt?: InputMaybe; - unitsSold_gte?: InputMaybe; - unitsSold_lte?: InputMaybe; - unitsSold_in?: InputMaybe>; - unitsSold_not_in?: InputMaybe>; - token?: InputMaybe; - token_not?: InputMaybe; - token_gt?: InputMaybe; - token_lt?: InputMaybe; - token_gte?: InputMaybe; - token_lte?: InputMaybe; - token_in?: InputMaybe>; - token_not_in?: InputMaybe>; - token_contains?: InputMaybe; - token_contains_nocase?: InputMaybe; - token_not_contains?: InputMaybe; - token_not_contains_nocase?: InputMaybe; - token_starts_with?: InputMaybe; - token_starts_with_nocase?: InputMaybe; - token_not_starts_with?: InputMaybe; - token_not_starts_with_nocase?: InputMaybe; - token_ends_with?: InputMaybe; - token_ends_with_nocase?: InputMaybe; - token_not_ends_with?: InputMaybe; - token_not_ends_with_nocase?: InputMaybe; - token_?: InputMaybe; - amountPerUnit?: InputMaybe; - amountPerUnit_not?: InputMaybe; - amountPerUnit_gt?: InputMaybe; - amountPerUnit_lt?: InputMaybe; - amountPerUnit_gte?: InputMaybe; - amountPerUnit_lte?: InputMaybe; - amountPerUnit_in?: InputMaybe>; - amountPerUnit_not_in?: InputMaybe>; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type Trade_orderBy = - | 'id' - | 'buyer' - | 'offerID' - | 'offerID__id' - | 'offerID__unitsAvailable' - | 'offerID__minUnitsPerTrade' - | 'offerID__maxUnitsPerTrade' - | 'offerID__status' - | 'unitsSold' - | 'token' - | 'token__id' - | 'token__name' - | 'token__symbol' - | 'token__decimals' - | 'amountPerUnit'; - -export type _Block_ = { - /** The hash of the block */ - hash?: Maybe; - /** The block number */ - number: Scalars['Int']; - /** Integer representation of the timestamp stored in blocks for the chain */ - timestamp?: Maybe; -}; - -/** The type for the top-level _meta field */ -export type _Meta_ = { - /** - * Information about a specific subgraph block. The hash of the block - * will be null if the _meta field has a block constraint that asks for - * a block number. It will be filled if the _meta field has no block constraint - * and therefore asks for the latest block - * - */ - block: _Block_; - /** The deployment ID */ - deployment: Scalars['String']; - /** If `true`, the subgraph encountered indexing errors at some past block */ - hasIndexingErrors: Scalars['Boolean']; -}; - -export type _SubgraphErrorPolicy_ = - /** Data will be returned even if the subgraph has indexing errors */ - | 'allow' - /** If the subgraph has indexing errors, data will be omitted. The default. */ - | 'deny'; - -export type WithIndex = TObject & Record; -export type ResolversObject = WithIndex; - -export type ResolverTypeWrapper = Promise | T; - - -export type ResolverWithResolve = { - resolve: ResolverFn; -}; - -export type LegacyStitchingResolver = { - fragment: string; - resolve: ResolverFn; -}; - -export type NewStitchingResolver = { - selectionSet: string | ((fieldNode: FieldNode) => SelectionSetNode); - resolve: ResolverFn; -}; -export type StitchingResolver = LegacyStitchingResolver | NewStitchingResolver; -export type Resolver = - | ResolverFn - | ResolverWithResolve - | StitchingResolver; - -export type ResolverFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo -) => Promise | TResult; - -export type SubscriptionSubscribeFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo -) => AsyncIterable | Promise>; - -export type SubscriptionResolveFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo -) => TResult | Promise; - -export interface SubscriptionSubscriberObject { - subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>; - resolve?: SubscriptionResolveFn; -} - -export interface SubscriptionResolverObject { - subscribe: SubscriptionSubscribeFn; - resolve: SubscriptionResolveFn; -} - -export type SubscriptionObject = - | SubscriptionSubscriberObject - | SubscriptionResolverObject; - -export type SubscriptionResolver = - | ((...args: any[]) => SubscriptionObject) - | SubscriptionObject; - -export type TypeResolveFn = ( - parent: TParent, - context: TContext, - info: GraphQLResolveInfo -) => Maybe | Promise>; - -export type IsTypeOfResolverFn = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise; - -export type NextResolverFn = () => Promise; - -export type DirectiveResolverFn = ( - next: NextResolverFn, - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo -) => TResult | Promise; - - - -/** Mapping between all available schema types and the resolvers types */ -export type ResolversTypes = ResolversObject<{ - Query: ResolverTypeWrapper<{}>; - Subscription: ResolverTypeWrapper<{}>; - AcceptedToken: ResolverTypeWrapper; - AcceptedToken_filter: AcceptedToken_filter; - AcceptedToken_orderBy: AcceptedToken_orderBy; - Allowlist: ResolverTypeWrapper; - Allowlist_filter: Allowlist_filter; - Allowlist_orderBy: Allowlist_orderBy; - BigDecimal: ResolverTypeWrapper; - BigInt: ResolverTypeWrapper; - BlockChangedFilter: BlockChangedFilter; - Block_height: Block_height; - Boolean: ResolverTypeWrapper; - Bytes: ResolverTypeWrapper; - Claim: ResolverTypeWrapper; - ClaimToken: ResolverTypeWrapper; - ClaimToken_filter: ClaimToken_filter; - ClaimToken_orderBy: ClaimToken_orderBy; - Claim_filter: Claim_filter; - Claim_orderBy: Claim_orderBy; - Float: ResolverTypeWrapper; - ID: ResolverTypeWrapper; - Int: ResolverTypeWrapper; - Int8: ResolverTypeWrapper; - Offer: ResolverTypeWrapper; - OfferStatus: OfferStatus; - Offer_filter: Offer_filter; - Offer_orderBy: Offer_orderBy; - OrderDirection: OrderDirection; - String: ResolverTypeWrapper; - Token: ResolverTypeWrapper; - Token_filter: Token_filter; - Token_orderBy: Token_orderBy; - Trade: ResolverTypeWrapper; - Trade_filter: Trade_filter; - Trade_orderBy: Trade_orderBy; - _Block_: ResolverTypeWrapper<_Block_>; - _Meta_: ResolverTypeWrapper<_Meta_>; - _SubgraphErrorPolicy_: _SubgraphErrorPolicy_; -}>; - -/** Mapping between all available schema types and the resolvers parents */ -export type ResolversParentTypes = ResolversObject<{ - Query: {}; - Subscription: {}; - AcceptedToken: AcceptedToken; - AcceptedToken_filter: AcceptedToken_filter; - Allowlist: Allowlist; - Allowlist_filter: Allowlist_filter; - BigDecimal: Scalars['BigDecimal']; - BigInt: Scalars['BigInt']; - BlockChangedFilter: BlockChangedFilter; - Block_height: Block_height; - Boolean: Scalars['Boolean']; - Bytes: Scalars['Bytes']; - Claim: Claim; - ClaimToken: ClaimToken; - ClaimToken_filter: ClaimToken_filter; - Claim_filter: Claim_filter; - Float: Scalars['Float']; - ID: Scalars['ID']; - Int: Scalars['Int']; - Int8: Scalars['Int8']; - Offer: Offer; - Offer_filter: Offer_filter; - String: Scalars['String']; - Token: Token; - Token_filter: Token_filter; - Trade: Trade; - Trade_filter: Trade_filter; - _Block_: _Block_; - _Meta_: _Meta_; -}>; - -export type entityDirectiveArgs = { }; - -export type entityDirectiveResolver = DirectiveResolverFn; - -export type subgraphIdDirectiveArgs = { - id: Scalars['String']; -}; - -export type subgraphIdDirectiveResolver = DirectiveResolverFn; - -export type derivedFromDirectiveArgs = { - field: Scalars['String']; -}; - -export type derivedFromDirectiveResolver = DirectiveResolverFn; - -export type QueryResolvers = ResolversObject<{ - allowlist?: Resolver, ParentType, ContextType, RequireFields>; - allowlists?: Resolver, ParentType, ContextType, RequireFields>; - claim?: Resolver, ParentType, ContextType, RequireFields>; - claims?: Resolver, ParentType, ContextType, RequireFields>; - claimToken?: Resolver, ParentType, ContextType, RequireFields>; - claimTokens?: Resolver, ParentType, ContextType, RequireFields>; - token?: Resolver, ParentType, ContextType, RequireFields>; - tokens?: Resolver, ParentType, ContextType, RequireFields>; - acceptedToken?: Resolver, ParentType, ContextType, RequireFields>; - acceptedTokens?: Resolver, ParentType, ContextType, RequireFields>; - offer?: Resolver, ParentType, ContextType, RequireFields>; - offers?: Resolver, ParentType, ContextType, RequireFields>; - trade?: Resolver, ParentType, ContextType, RequireFields>; - trades?: Resolver, ParentType, ContextType, RequireFields>; - _meta?: Resolver, ParentType, ContextType, Partial>; -}>; - -export type SubscriptionResolvers = ResolversObject<{ - allowlist?: SubscriptionResolver, "allowlist", ParentType, ContextType, RequireFields>; - allowlists?: SubscriptionResolver, "allowlists", ParentType, ContextType, RequireFields>; - claim?: SubscriptionResolver, "claim", ParentType, ContextType, RequireFields>; - claims?: SubscriptionResolver, "claims", ParentType, ContextType, RequireFields>; - claimToken?: SubscriptionResolver, "claimToken", ParentType, ContextType, RequireFields>; - claimTokens?: SubscriptionResolver, "claimTokens", ParentType, ContextType, RequireFields>; - token?: SubscriptionResolver, "token", ParentType, ContextType, RequireFields>; - tokens?: SubscriptionResolver, "tokens", ParentType, ContextType, RequireFields>; - acceptedToken?: SubscriptionResolver, "acceptedToken", ParentType, ContextType, RequireFields>; - acceptedTokens?: SubscriptionResolver, "acceptedTokens", ParentType, ContextType, RequireFields>; - offer?: SubscriptionResolver, "offer", ParentType, ContextType, RequireFields>; - offers?: SubscriptionResolver, "offers", ParentType, ContextType, RequireFields>; - trade?: SubscriptionResolver, "trade", ParentType, ContextType, RequireFields>; - trades?: SubscriptionResolver, "trades", ParentType, ContextType, RequireFields>; - _meta?: SubscriptionResolver, "_meta", ParentType, ContextType, Partial>; -}>; - -export type AcceptedTokenResolvers = ResolversObject<{ - id?: Resolver; - token?: Resolver; - minimumAmountPerUnit?: Resolver; - accepted?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}>; - -export type AllowlistResolvers = ResolversObject<{ - id?: Resolver; - root?: Resolver; - claim?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}>; - -export interface BigDecimalScalarConfig extends GraphQLScalarTypeConfig { - name: 'BigDecimal'; -} - -export interface BigIntScalarConfig extends GraphQLScalarTypeConfig { - name: 'BigInt'; -} - -export interface BytesScalarConfig extends GraphQLScalarTypeConfig { - name: 'Bytes'; -} - -export type ClaimResolvers = ResolversObject<{ - id?: Resolver; - creation?: Resolver; - tokenID?: Resolver; - contract?: Resolver; - uri?: Resolver, ParentType, ContextType>; - creator?: Resolver, ParentType, ContextType>; - owner?: Resolver, ParentType, ContextType>; - totalUnits?: Resolver, ParentType, ContextType>; - allowlist?: Resolver, ParentType, ContextType>; - graphName?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}>; - -export type ClaimTokenResolvers = ResolversObject<{ - id?: Resolver; - tokenID?: Resolver; - claim?: Resolver; - owner?: Resolver; - units?: Resolver; - offers?: Resolver>, ParentType, ContextType, RequireFields>; - graphName?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}>; - -export interface Int8ScalarConfig extends GraphQLScalarTypeConfig { - name: 'Int8'; -} - -export type OfferResolvers = ResolversObject<{ - id?: Resolver; - fractionID?: Resolver; - unitsAvailable?: Resolver; - minUnitsPerTrade?: Resolver; - maxUnitsPerTrade?: Resolver; - status?: Resolver; - acceptedTokens?: Resolver, ParentType, ContextType, RequireFields>; - __isTypeOf?: IsTypeOfResolverFn; -}>; - -export type TokenResolvers = ResolversObject<{ - id?: Resolver; - name?: Resolver; - symbol?: Resolver, ParentType, ContextType>; - decimals?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}>; - -export type TradeResolvers = ResolversObject<{ - id?: Resolver; - buyer?: Resolver; - offerID?: Resolver; - unitsSold?: Resolver; - token?: Resolver; - amountPerUnit?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}>; - -export type _Block_Resolvers = ResolversObject<{ - hash?: Resolver, ParentType, ContextType>; - number?: Resolver; - timestamp?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}>; - -export type _Meta_Resolvers = ResolversObject<{ - block?: Resolver; - deployment?: Resolver; - hasIndexingErrors?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}>; - -export type Resolvers = ResolversObject<{ - Query?: QueryResolvers; - Subscription?: SubscriptionResolvers; - AcceptedToken?: AcceptedTokenResolvers; - Allowlist?: AllowlistResolvers; - BigDecimal?: GraphQLScalarType; - BigInt?: GraphQLScalarType; - Bytes?: GraphQLScalarType; - Claim?: ClaimResolvers; - ClaimToken?: ClaimTokenResolvers; - Int8?: GraphQLScalarType; - Offer?: OfferResolvers; - Token?: TokenResolvers; - Trade?: TradeResolvers; - _Block_?: _Block_Resolvers; - _Meta_?: _Meta_Resolvers; -}>; - -export type DirectiveResolvers = ResolversObject<{ - entity?: entityDirectiveResolver; - subgraphId?: subgraphIdDirectiveResolver; - derivedFrom?: derivedFromDirectiveResolver; -}>; - -export type MeshContext = HypercertsTypes.Context & BaseMeshContext; - - -import { fileURLToPath } from '@graphql-mesh/utils'; -const baseDir = pathModule.join(pathModule.dirname(fileURLToPath(import.meta.url)), '..'); - -const importFn: ImportFn = (moduleId: string) => { - const relativeModuleId = (pathModule.isAbsolute(moduleId) ? pathModule.relative(baseDir, moduleId) : moduleId).split('\\').join('/').replace(baseDir + '/', ''); - switch(relativeModuleId) { - case ".graphclient/sources/Hypercerts/introspectionSchema": - return Promise.resolve(importedModule$0) as T; - - default: - return Promise.reject(new Error(`Cannot find module '${relativeModuleId}'.`)); - } -}; - -const rootStore = new MeshStore('.graphclient', new FsStoreStorageAdapter({ - cwd: baseDir, - importFn, - fileType: "ts", -}), { - readonly: true, - validate: false -}); - -export const rawServeConfig: YamlConfig.Config['serve'] = undefined as any -export async function getMeshOptions(): Promise { -const pubsub = new PubSub(); -const sourcesStore = rootStore.child('sources'); -const logger = new DefaultLogger("GraphClient"); -const cache = new (MeshCache as any)({ - ...({} as any), - importFn, - store: rootStore.child('cache'), - pubsub, - logger, - } as any) - -const sources: MeshResolvedSource[] = []; -const transforms: MeshTransform[] = []; -const additionalEnvelopPlugins: MeshPlugin[] = []; -const hypercertsTransforms = []; -const hypercertsHandler = new GraphqlHandler({ - name: "Hypercerts", - config: {"endpoint":"https://api.thegraph.com/subgraphs/name/hypercerts-admin/{context.graphName:hypercerts-testnet}"}, - baseDir, - cache, - pubsub, - store: sourcesStore.child("Hypercerts"), - logger: logger.child("Hypercerts"), - importFn, - }); -sources[0] = { - name: 'Hypercerts', - handler: hypercertsHandler, - transforms: hypercertsTransforms - } -const additionalTypeDefs = [parse("extend type Claim {\n graphName: String!\n}\n\nextend type ClaimToken {\n graphName: String!\n}"),] as any[]; -additionalEnvelopPlugins[0] = await UsePollingLive({ - ...({ - "defaultInterval": 5000 -}), - logger: logger.child("pollingLive"), - cache, - pubsub, - baseDir, - importFn, - }) -const additionalResolvers = await Promise.all([ - import("../src/utils/resolvers.ts") - .then(m => m.resolvers || m.default || m) - ]); -const merger = new(BareMerger as any)({ - cache, - pubsub, - logger: logger.child('bareMerger'), - store: rootStore.child('bareMerger') - }) - - return { - sources, - transforms, - additionalTypeDefs, - additionalResolvers, - cache, - pubsub, - merger, - logger, - additionalEnvelopPlugins, - get documents() { - return [ - { - document: ClaimsByOwnerDocument, - get rawSDL() { - return printWithCache(ClaimsByOwnerDocument); - }, - location: 'ClaimsByOwnerDocument.graphql' - },{ - document: RecentClaimsDocument, - get rawSDL() { - return printWithCache(RecentClaimsDocument); - }, - location: 'RecentClaimsDocument.graphql' - },{ - document: ClaimByIdDocument, - get rawSDL() { - return printWithCache(ClaimByIdDocument); - }, - location: 'ClaimByIdDocument.graphql' - },{ - document: ClaimTokensByOwnerDocument, - get rawSDL() { - return printWithCache(ClaimTokensByOwnerDocument); - }, - location: 'ClaimTokensByOwnerDocument.graphql' - },{ - document: ClaimTokensByClaimDocument, - get rawSDL() { - return printWithCache(ClaimTokensByClaimDocument); - }, - location: 'ClaimTokensByClaimDocument.graphql' - },{ - document: ClaimTokenByIdDocument, - get rawSDL() { - return printWithCache(ClaimTokenByIdDocument); - }, - location: 'ClaimTokenByIdDocument.graphql' - } - ]; - }, - fetchFn, - }; -} - -export function createBuiltMeshHTTPHandler(): MeshHTTPHandler { - return createMeshHTTPHandler({ - baseDir, - getBuiltMesh: getBuiltGraphClient, - rawServeConfig: undefined, - }) -} - - -let meshInstance$: Promise | undefined; - -export function getBuiltGraphClient(): Promise { - if (meshInstance$ == null) { - meshInstance$ = getMeshOptions().then(meshOptions => getMesh(meshOptions)).then(mesh => { - const id = mesh.pubsub.subscribe('destroy', () => { - meshInstance$ = undefined; - mesh.pubsub.unsubscribe(id); - }); - return mesh; - }); - } - return meshInstance$; -} - -export const execute: ExecuteMeshFn = (...args) => getBuiltGraphClient().then(({ execute }) => execute(...args)); - -export const subscribe: SubscribeMeshFn = (...args) => getBuiltGraphClient().then(({ subscribe }) => subscribe(...args)); -export function getBuiltGraphSDK(globalContext?: TGlobalContext) { - const sdkRequester$ = getBuiltGraphClient().then(({ sdkRequesterFactory }) => sdkRequesterFactory(globalContext)); - return getSdk((...args) => sdkRequester$.then(sdkRequester => sdkRequester(...args))); -} -export type ClaimsByOwnerQueryVariables = Exact<{ - owner?: InputMaybe; - orderDirection?: InputMaybe; - first?: InputMaybe; - skip?: InputMaybe; -}>; - - -export type ClaimsByOwnerQuery = { claims: Array> }; - -export type RecentClaimsQueryVariables = Exact<{ - orderDirection?: InputMaybe; - first?: InputMaybe; - skip?: InputMaybe; -}>; - - -export type RecentClaimsQuery = { claims: Array> }; - -export type ClaimByIdQueryVariables = Exact<{ - id: Scalars['ID']; -}>; - - -export type ClaimByIdQuery = { claim?: Maybe> }; - -export type ClaimTokensByOwnerQueryVariables = Exact<{ - owner?: InputMaybe; - orderDirection?: InputMaybe; - first?: InputMaybe; - skip?: InputMaybe; -}>; - - -export type ClaimTokensByOwnerQuery = { claimTokens: Array<( - Pick - & { claim: Pick } - )> }; - -export type ClaimTokensByClaimQueryVariables = Exact<{ - claimId: Scalars['String']; - orderDirection?: InputMaybe; - first?: InputMaybe; - skip?: InputMaybe; -}>; - - -export type ClaimTokensByClaimQuery = { claimTokens: Array> }; - -export type ClaimTokenByIdQueryVariables = Exact<{ - claimTokenId: Scalars['ID']; -}>; - - -export type ClaimTokenByIdQuery = { claimToken?: Maybe<( - Pick - & { claim: Pick } - )> }; - - -export const ClaimsByOwnerDocument = gql` - query ClaimsByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) { - claims( - where: {owner: $owner} - skip: $skip - first: $first - orderDirection: $orderDirection - ) { - graphName - contract - tokenID - creator - id - owner - totalUnits - uri - } -} - ` as unknown as DocumentNode; -export const RecentClaimsDocument = gql` - query RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) { - claims(orderDirection: $orderDirection, orderBy: creation, first: $first) { - graphName - contract - tokenID - creator - id - owner - totalUnits - uri - } -} - ` as unknown as DocumentNode; -export const ClaimByIdDocument = gql` - query ClaimById($id: ID!) { - claim(id: $id) { - graphName - contract - tokenID - creator - id - owner - totalUnits - uri - } -} - ` as unknown as DocumentNode; -export const ClaimTokensByOwnerDocument = gql` - query ClaimTokensByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) { - claimTokens( - where: {owner: $owner} - skip: $skip - first: $first - orderDirection: $orderDirection - ) { - graphName - id - owner - tokenID - units - claim { - id - creation - uri - totalUnits - } - } -} - ` as unknown as DocumentNode; -export const ClaimTokensByClaimDocument = gql` - query ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) { - claimTokens( - where: {claim: $claimId} - skip: $skip - first: $first - orderDirection: $orderDirection - ) { - graphName - id - owner - tokenID - units - } -} - ` as unknown as DocumentNode; -export const ClaimTokenByIdDocument = gql` - query ClaimTokenById($claimTokenId: ID!) { - claimToken(id: $claimTokenId) { - graphName - id - owner - tokenID - units - claim { - id - creation - uri - totalUnits - } - } -} - ` as unknown as DocumentNode; - - - - - - - -export type Requester = (doc: DocumentNode, vars?: V, options?: C) => Promise | AsyncIterable -export function getSdk(requester: Requester) { - return { - ClaimsByOwner(variables?: ClaimsByOwnerQueryVariables, options?: C): Promise { - return requester(ClaimsByOwnerDocument, variables, options) as Promise; - }, - RecentClaims(variables?: RecentClaimsQueryVariables, options?: C): Promise { - return requester(RecentClaimsDocument, variables, options) as Promise; - }, - ClaimById(variables: ClaimByIdQueryVariables, options?: C): Promise { - return requester(ClaimByIdDocument, variables, options) as Promise; - }, - ClaimTokensByOwner(variables?: ClaimTokensByOwnerQueryVariables, options?: C): Promise { - return requester(ClaimTokensByOwnerDocument, variables, options) as Promise; - }, - ClaimTokensByClaim(variables: ClaimTokensByClaimQueryVariables, options?: C): Promise { - return requester(ClaimTokensByClaimDocument, variables, options) as Promise; - }, - ClaimTokenById(variables: ClaimTokenByIdQueryVariables, options?: C): Promise { - return requester(ClaimTokenByIdDocument, variables, options) as Promise; - } - }; -} -export type Sdk = ReturnType; \ No newline at end of file diff --git a/sdk/.graphclient/schema.graphql b/sdk/.graphclient/schema.graphql deleted file mode 100644 index 8eb86ef5..00000000 --- a/sdk/.graphclient/schema.graphql +++ /dev/null @@ -1,1190 +0,0 @@ -schema { - query: Query - subscription: Subscription -} - -"Marks the GraphQL type as indexable entity. Each type that should be an entity is required to be annotated with this directive." -directive @entity on OBJECT - -"Defined a Subgraph ID for an object type" -directive @subgraphId(id: String!) on OBJECT - -"creates a virtual field on the entity that may be queried but cannot be set manually through the mappings API." -directive @derivedFrom(field: String!) on FIELD_DEFINITION - -type Query { - allowlist( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Allowlist - allowlists( - skip: Int = 0 - first: Int = 100 - orderBy: Allowlist_orderBy - orderDirection: OrderDirection - where: Allowlist_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Allowlist!]! - claim( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Claim - claims( - skip: Int = 0 - first: Int = 100 - orderBy: Claim_orderBy - orderDirection: OrderDirection - where: Claim_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Claim!]! - claimToken( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): ClaimToken - claimTokens( - skip: Int = 0 - first: Int = 100 - orderBy: ClaimToken_orderBy - orderDirection: OrderDirection - where: ClaimToken_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [ClaimToken!]! - token( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Token - tokens( - skip: Int = 0 - first: Int = 100 - orderBy: Token_orderBy - orderDirection: OrderDirection - where: Token_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Token!]! - acceptedToken( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): AcceptedToken - acceptedTokens( - skip: Int = 0 - first: Int = 100 - orderBy: AcceptedToken_orderBy - orderDirection: OrderDirection - where: AcceptedToken_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [AcceptedToken!]! - offer( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Offer - offers( - skip: Int = 0 - first: Int = 100 - orderBy: Offer_orderBy - orderDirection: OrderDirection - where: Offer_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Offer!]! - trade( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Trade - trades( - skip: Int = 0 - first: Int = 100 - orderBy: Trade_orderBy - orderDirection: OrderDirection - where: Trade_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Trade!]! - """Access to subgraph metadata""" - _meta(block: Block_height): _Meta_ -} - -type Subscription { - allowlist( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Allowlist - allowlists( - skip: Int = 0 - first: Int = 100 - orderBy: Allowlist_orderBy - orderDirection: OrderDirection - where: Allowlist_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Allowlist!]! - claim( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Claim - claims( - skip: Int = 0 - first: Int = 100 - orderBy: Claim_orderBy - orderDirection: OrderDirection - where: Claim_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Claim!]! - claimToken( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): ClaimToken - claimTokens( - skip: Int = 0 - first: Int = 100 - orderBy: ClaimToken_orderBy - orderDirection: OrderDirection - where: ClaimToken_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [ClaimToken!]! - token( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Token - tokens( - skip: Int = 0 - first: Int = 100 - orderBy: Token_orderBy - orderDirection: OrderDirection - where: Token_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Token!]! - acceptedToken( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): AcceptedToken - acceptedTokens( - skip: Int = 0 - first: Int = 100 - orderBy: AcceptedToken_orderBy - orderDirection: OrderDirection - where: AcceptedToken_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [AcceptedToken!]! - offer( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Offer - offers( - skip: Int = 0 - first: Int = 100 - orderBy: Offer_orderBy - orderDirection: OrderDirection - where: Offer_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Offer!]! - trade( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Trade - trades( - skip: Int = 0 - first: Int = 100 - orderBy: Trade_orderBy - orderDirection: OrderDirection - where: Trade_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Trade!]! - """Access to subgraph metadata""" - _meta(block: Block_height): _Meta_ -} - -type AcceptedToken { - id: String! - token: Token! - minimumAmountPerUnit: BigInt! - accepted: Boolean! -} - -input AcceptedToken_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - token: String - token_not: String - token_gt: String - token_lt: String - token_gte: String - token_lte: String - token_in: [String!] - token_not_in: [String!] - token_contains: String - token_contains_nocase: String - token_not_contains: String - token_not_contains_nocase: String - token_starts_with: String - token_starts_with_nocase: String - token_not_starts_with: String - token_not_starts_with_nocase: String - token_ends_with: String - token_ends_with_nocase: String - token_not_ends_with: String - token_not_ends_with_nocase: String - token_: Token_filter - minimumAmountPerUnit: BigInt - minimumAmountPerUnit_not: BigInt - minimumAmountPerUnit_gt: BigInt - minimumAmountPerUnit_lt: BigInt - minimumAmountPerUnit_gte: BigInt - minimumAmountPerUnit_lte: BigInt - minimumAmountPerUnit_in: [BigInt!] - minimumAmountPerUnit_not_in: [BigInt!] - accepted: Boolean - accepted_not: Boolean - accepted_in: [Boolean!] - accepted_not_in: [Boolean!] - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [AcceptedToken_filter] - or: [AcceptedToken_filter] -} - -enum AcceptedToken_orderBy { - id - token - token__id - token__name - token__symbol - token__decimals - minimumAmountPerUnit - accepted -} - -type Allowlist { - id: String! - root: Bytes! - claim: Claim! -} - -input Allowlist_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - root: Bytes - root_not: Bytes - root_gt: Bytes - root_lt: Bytes - root_gte: Bytes - root_lte: Bytes - root_in: [Bytes!] - root_not_in: [Bytes!] - root_contains: Bytes - root_not_contains: Bytes - claim: String - claim_not: String - claim_gt: String - claim_lt: String - claim_gte: String - claim_lte: String - claim_in: [String!] - claim_not_in: [String!] - claim_contains: String - claim_contains_nocase: String - claim_not_contains: String - claim_not_contains_nocase: String - claim_starts_with: String - claim_starts_with_nocase: String - claim_not_starts_with: String - claim_not_starts_with_nocase: String - claim_ends_with: String - claim_ends_with_nocase: String - claim_not_ends_with: String - claim_not_ends_with_nocase: String - claim_: Claim_filter - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [Allowlist_filter] - or: [Allowlist_filter] -} - -enum Allowlist_orderBy { - id - root - claim - claim__id - claim__creation - claim__tokenID - claim__contract - claim__uri - claim__creator - claim__owner - claim__totalUnits -} - -scalar BigDecimal - -scalar BigInt - -input BlockChangedFilter { - number_gte: Int! -} - -input Block_height { - hash: Bytes - number: Int - number_gte: Int -} - -scalar Bytes - -type Claim { - id: String! - creation: BigInt! - tokenID: BigInt! - contract: String! - uri: String - creator: Bytes - owner: Bytes - totalUnits: BigInt - allowlist: Allowlist - graphName: String! -} - -type ClaimToken { - id: String! - tokenID: BigInt! - claim: Claim! - owner: Bytes! - units: BigInt! - offers(skip: Int = 0, first: Int = 100, orderBy: Offer_orderBy, orderDirection: OrderDirection, where: Offer_filter): [Offer!] - graphName: String! -} - -input ClaimToken_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - tokenID: BigInt - tokenID_not: BigInt - tokenID_gt: BigInt - tokenID_lt: BigInt - tokenID_gte: BigInt - tokenID_lte: BigInt - tokenID_in: [BigInt!] - tokenID_not_in: [BigInt!] - claim: String - claim_not: String - claim_gt: String - claim_lt: String - claim_gte: String - claim_lte: String - claim_in: [String!] - claim_not_in: [String!] - claim_contains: String - claim_contains_nocase: String - claim_not_contains: String - claim_not_contains_nocase: String - claim_starts_with: String - claim_starts_with_nocase: String - claim_not_starts_with: String - claim_not_starts_with_nocase: String - claim_ends_with: String - claim_ends_with_nocase: String - claim_not_ends_with: String - claim_not_ends_with_nocase: String - claim_: Claim_filter - owner: Bytes - owner_not: Bytes - owner_gt: Bytes - owner_lt: Bytes - owner_gte: Bytes - owner_lte: Bytes - owner_in: [Bytes!] - owner_not_in: [Bytes!] - owner_contains: Bytes - owner_not_contains: Bytes - units: BigInt - units_not: BigInt - units_gt: BigInt - units_lt: BigInt - units_gte: BigInt - units_lte: BigInt - units_in: [BigInt!] - units_not_in: [BigInt!] - offers_: Offer_filter - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [ClaimToken_filter] - or: [ClaimToken_filter] -} - -enum ClaimToken_orderBy { - id - tokenID - claim - claim__id - claim__creation - claim__tokenID - claim__contract - claim__uri - claim__creator - claim__owner - claim__totalUnits - owner - units - offers -} - -input Claim_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - creation: BigInt - creation_not: BigInt - creation_gt: BigInt - creation_lt: BigInt - creation_gte: BigInt - creation_lte: BigInt - creation_in: [BigInt!] - creation_not_in: [BigInt!] - tokenID: BigInt - tokenID_not: BigInt - tokenID_gt: BigInt - tokenID_lt: BigInt - tokenID_gte: BigInt - tokenID_lte: BigInt - tokenID_in: [BigInt!] - tokenID_not_in: [BigInt!] - contract: String - contract_not: String - contract_gt: String - contract_lt: String - contract_gte: String - contract_lte: String - contract_in: [String!] - contract_not_in: [String!] - contract_contains: String - contract_contains_nocase: String - contract_not_contains: String - contract_not_contains_nocase: String - contract_starts_with: String - contract_starts_with_nocase: String - contract_not_starts_with: String - contract_not_starts_with_nocase: String - contract_ends_with: String - contract_ends_with_nocase: String - contract_not_ends_with: String - contract_not_ends_with_nocase: String - uri: String - uri_not: String - uri_gt: String - uri_lt: String - uri_gte: String - uri_lte: String - uri_in: [String!] - uri_not_in: [String!] - uri_contains: String - uri_contains_nocase: String - uri_not_contains: String - uri_not_contains_nocase: String - uri_starts_with: String - uri_starts_with_nocase: String - uri_not_starts_with: String - uri_not_starts_with_nocase: String - uri_ends_with: String - uri_ends_with_nocase: String - uri_not_ends_with: String - uri_not_ends_with_nocase: String - creator: Bytes - creator_not: Bytes - creator_gt: Bytes - creator_lt: Bytes - creator_gte: Bytes - creator_lte: Bytes - creator_in: [Bytes!] - creator_not_in: [Bytes!] - creator_contains: Bytes - creator_not_contains: Bytes - owner: Bytes - owner_not: Bytes - owner_gt: Bytes - owner_lt: Bytes - owner_gte: Bytes - owner_lte: Bytes - owner_in: [Bytes!] - owner_not_in: [Bytes!] - owner_contains: Bytes - owner_not_contains: Bytes - totalUnits: BigInt - totalUnits_not: BigInt - totalUnits_gt: BigInt - totalUnits_lt: BigInt - totalUnits_gte: BigInt - totalUnits_lte: BigInt - totalUnits_in: [BigInt!] - totalUnits_not_in: [BigInt!] - allowlist: String - allowlist_not: String - allowlist_gt: String - allowlist_lt: String - allowlist_gte: String - allowlist_lte: String - allowlist_in: [String!] - allowlist_not_in: [String!] - allowlist_contains: String - allowlist_contains_nocase: String - allowlist_not_contains: String - allowlist_not_contains_nocase: String - allowlist_starts_with: String - allowlist_starts_with_nocase: String - allowlist_not_starts_with: String - allowlist_not_starts_with_nocase: String - allowlist_ends_with: String - allowlist_ends_with_nocase: String - allowlist_not_ends_with: String - allowlist_not_ends_with_nocase: String - allowlist_: Allowlist_filter - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [Claim_filter] - or: [Claim_filter] -} - -enum Claim_orderBy { - id - creation - tokenID - contract - uri - creator - owner - totalUnits - allowlist - allowlist__id - allowlist__root -} - -""" -8 bytes signed integer - -""" -scalar Int8 - -type Offer { - id: String! - fractionID: ClaimToken! - unitsAvailable: BigInt! - minUnitsPerTrade: BigInt! - maxUnitsPerTrade: BigInt! - status: OfferStatus! - acceptedTokens(skip: Int = 0, first: Int = 100, orderBy: AcceptedToken_orderBy, orderDirection: OrderDirection, where: AcceptedToken_filter): [AcceptedToken!]! -} - -enum OfferStatus { - Open - Fulfilled - Cancelled -} - -input Offer_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - fractionID: String - fractionID_not: String - fractionID_gt: String - fractionID_lt: String - fractionID_gte: String - fractionID_lte: String - fractionID_in: [String!] - fractionID_not_in: [String!] - fractionID_contains: String - fractionID_contains_nocase: String - fractionID_not_contains: String - fractionID_not_contains_nocase: String - fractionID_starts_with: String - fractionID_starts_with_nocase: String - fractionID_not_starts_with: String - fractionID_not_starts_with_nocase: String - fractionID_ends_with: String - fractionID_ends_with_nocase: String - fractionID_not_ends_with: String - fractionID_not_ends_with_nocase: String - fractionID_: ClaimToken_filter - unitsAvailable: BigInt - unitsAvailable_not: BigInt - unitsAvailable_gt: BigInt - unitsAvailable_lt: BigInt - unitsAvailable_gte: BigInt - unitsAvailable_lte: BigInt - unitsAvailable_in: [BigInt!] - unitsAvailable_not_in: [BigInt!] - minUnitsPerTrade: BigInt - minUnitsPerTrade_not: BigInt - minUnitsPerTrade_gt: BigInt - minUnitsPerTrade_lt: BigInt - minUnitsPerTrade_gte: BigInt - minUnitsPerTrade_lte: BigInt - minUnitsPerTrade_in: [BigInt!] - minUnitsPerTrade_not_in: [BigInt!] - maxUnitsPerTrade: BigInt - maxUnitsPerTrade_not: BigInt - maxUnitsPerTrade_gt: BigInt - maxUnitsPerTrade_lt: BigInt - maxUnitsPerTrade_gte: BigInt - maxUnitsPerTrade_lte: BigInt - maxUnitsPerTrade_in: [BigInt!] - maxUnitsPerTrade_not_in: [BigInt!] - status: OfferStatus - status_not: OfferStatus - status_in: [OfferStatus!] - status_not_in: [OfferStatus!] - acceptedTokens: [String!] - acceptedTokens_not: [String!] - acceptedTokens_contains: [String!] - acceptedTokens_contains_nocase: [String!] - acceptedTokens_not_contains: [String!] - acceptedTokens_not_contains_nocase: [String!] - acceptedTokens_: AcceptedToken_filter - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [Offer_filter] - or: [Offer_filter] -} - -enum Offer_orderBy { - id - fractionID - fractionID__id - fractionID__tokenID - fractionID__owner - fractionID__units - unitsAvailable - minUnitsPerTrade - maxUnitsPerTrade - status - acceptedTokens -} - -"""Defines the order direction, either ascending or descending""" -enum OrderDirection { - asc - desc -} - -type Token { - id: String! - name: String! - symbol: String - decimals: BigInt -} - -input Token_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - name: String - name_not: String - name_gt: String - name_lt: String - name_gte: String - name_lte: String - name_in: [String!] - name_not_in: [String!] - name_contains: String - name_contains_nocase: String - name_not_contains: String - name_not_contains_nocase: String - name_starts_with: String - name_starts_with_nocase: String - name_not_starts_with: String - name_not_starts_with_nocase: String - name_ends_with: String - name_ends_with_nocase: String - name_not_ends_with: String - name_not_ends_with_nocase: String - symbol: String - symbol_not: String - symbol_gt: String - symbol_lt: String - symbol_gte: String - symbol_lte: String - symbol_in: [String!] - symbol_not_in: [String!] - symbol_contains: String - symbol_contains_nocase: String - symbol_not_contains: String - symbol_not_contains_nocase: String - symbol_starts_with: String - symbol_starts_with_nocase: String - symbol_not_starts_with: String - symbol_not_starts_with_nocase: String - symbol_ends_with: String - symbol_ends_with_nocase: String - symbol_not_ends_with: String - symbol_not_ends_with_nocase: String - decimals: BigInt - decimals_not: BigInt - decimals_gt: BigInt - decimals_lt: BigInt - decimals_gte: BigInt - decimals_lte: BigInt - decimals_in: [BigInt!] - decimals_not_in: [BigInt!] - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [Token_filter] - or: [Token_filter] -} - -enum Token_orderBy { - id - name - symbol - decimals -} - -type Trade { - id: String! - buyer: Bytes! - offerID: Offer! - unitsSold: BigInt! - token: Token! - amountPerUnit: BigInt! -} - -input Trade_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - buyer: Bytes - buyer_not: Bytes - buyer_gt: Bytes - buyer_lt: Bytes - buyer_gte: Bytes - buyer_lte: Bytes - buyer_in: [Bytes!] - buyer_not_in: [Bytes!] - buyer_contains: Bytes - buyer_not_contains: Bytes - offerID: String - offerID_not: String - offerID_gt: String - offerID_lt: String - offerID_gte: String - offerID_lte: String - offerID_in: [String!] - offerID_not_in: [String!] - offerID_contains: String - offerID_contains_nocase: String - offerID_not_contains: String - offerID_not_contains_nocase: String - offerID_starts_with: String - offerID_starts_with_nocase: String - offerID_not_starts_with: String - offerID_not_starts_with_nocase: String - offerID_ends_with: String - offerID_ends_with_nocase: String - offerID_not_ends_with: String - offerID_not_ends_with_nocase: String - offerID_: Offer_filter - unitsSold: BigInt - unitsSold_not: BigInt - unitsSold_gt: BigInt - unitsSold_lt: BigInt - unitsSold_gte: BigInt - unitsSold_lte: BigInt - unitsSold_in: [BigInt!] - unitsSold_not_in: [BigInt!] - token: String - token_not: String - token_gt: String - token_lt: String - token_gte: String - token_lte: String - token_in: [String!] - token_not_in: [String!] - token_contains: String - token_contains_nocase: String - token_not_contains: String - token_not_contains_nocase: String - token_starts_with: String - token_starts_with_nocase: String - token_not_starts_with: String - token_not_starts_with_nocase: String - token_ends_with: String - token_ends_with_nocase: String - token_not_ends_with: String - token_not_ends_with_nocase: String - token_: Token_filter - amountPerUnit: BigInt - amountPerUnit_not: BigInt - amountPerUnit_gt: BigInt - amountPerUnit_lt: BigInt - amountPerUnit_gte: BigInt - amountPerUnit_lte: BigInt - amountPerUnit_in: [BigInt!] - amountPerUnit_not_in: [BigInt!] - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [Trade_filter] - or: [Trade_filter] -} - -enum Trade_orderBy { - id - buyer - offerID - offerID__id - offerID__unitsAvailable - offerID__minUnitsPerTrade - offerID__maxUnitsPerTrade - offerID__status - unitsSold - token - token__id - token__name - token__symbol - token__decimals - amountPerUnit -} - -type _Block_ { - """The hash of the block""" - hash: Bytes - """The block number""" - number: Int! - """Integer representation of the timestamp stored in blocks for the chain""" - timestamp: Int -} - -"""The type for the top-level _meta field""" -type _Meta_ { - """ - Information about a specific subgraph block. The hash of the block - will be null if the _meta field has a block constraint that asks for - a block number. It will be filled if the _meta field has no block constraint - and therefore asks for the latest block - - """ - block: _Block_! - """The deployment ID""" - deployment: String! - """If `true`, the subgraph encountered indexing errors at some past block""" - hasIndexingErrors: Boolean! -} - -enum _SubgraphErrorPolicy_ { - """Data will be returned even if the subgraph has indexing errors""" - allow - """ - If the subgraph has indexing errors, data will be omitted. The default. - """ - deny -} \ No newline at end of file diff --git a/sdk/.graphclient/sources/Hypercerts/introspectionSchema.ts b/sdk/.graphclient/sources/Hypercerts/introspectionSchema.ts deleted file mode 100644 index 0078e3f1..00000000 --- a/sdk/.graphclient/sources/Hypercerts/introspectionSchema.ts +++ /dev/null @@ -1,14463 +0,0 @@ -// @ts-nocheck -import { buildASTSchema } from 'graphql'; - -const schemaAST = { - "kind": "Document", - "definitions": [ - { - "kind": "SchemaDefinition", - "operationTypes": [ - { - "kind": "OperationTypeDefinition", - "operation": "query", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Query" - } - } - }, - { - "kind": "OperationTypeDefinition", - "operation": "subscription", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Subscription" - } - } - } - ], - "directives": [] - }, - { - "kind": "DirectiveDefinition", - "description": { - "kind": "StringValue", - "value": "Marks the GraphQL type as indexable entity. Each type that should be an entity is required to be annotated with this directive." - }, - "name": { - "kind": "Name", - "value": "entity" - }, - "arguments": [], - "repeatable": false, - "locations": [ - { - "kind": "Name", - "value": "OBJECT" - } - ] - }, - { - "kind": "DirectiveDefinition", - "description": { - "kind": "StringValue", - "value": "Defined a Subgraph ID for an object type" - }, - "name": { - "kind": "Name", - "value": "subgraphId" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - } - ], - "repeatable": false, - "locations": [ - { - "kind": "Name", - "value": "OBJECT" - } - ] - }, - { - "kind": "DirectiveDefinition", - "description": { - "kind": "StringValue", - "value": "creates a virtual field on the entity that may be queried but cannot be set manually through the mappings API." - }, - "name": { - "kind": "Name", - "value": "derivedFrom" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "field" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - } - ], - "repeatable": false, - "locations": [ - { - "kind": "Name", - "value": "FIELD_DEFINITION" - } - ] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "AcceptedToken" - }, - "fields": [ - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "token" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "minimumAmountPerUnit" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "accepted" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Boolean" - } - } - }, - "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "AcceptedToken_filter" - }, - "fields": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minimumAmountPerUnit" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minimumAmountPerUnit_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minimumAmountPerUnit_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minimumAmountPerUnit_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minimumAmountPerUnit_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minimumAmountPerUnit_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minimumAmountPerUnit_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minimumAmountPerUnit_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "accepted" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Boolean" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "accepted_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Boolean" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "accepted_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Boolean" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "accepted_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Boolean" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Filter for the block changed event.", - "block": true - }, - "name": { - "kind": "Name", - "value": "_change_block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BlockChangedFilter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "and" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken_filter" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "or" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken_filter" - } - } - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "AcceptedToken_orderBy" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "token" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "token__id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "token__name" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "token__symbol" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "token__decimals" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "minimumAmountPerUnit" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "accepted" - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Allowlist" - }, - "fields": [ - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "root" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "claim" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim" - } - } - }, - "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Allowlist_filter" - }, - "fields": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "root" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "root_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "root_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "root_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "root_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "root_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "root_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "root_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "root_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "root_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Filter for the block changed event.", - "block": true - }, - "name": { - "kind": "Name", - "value": "_change_block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BlockChangedFilter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "and" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist_filter" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "or" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist_filter" - } - } - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "Allowlist_orderBy" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "root" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__creation" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__tokenID" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__contract" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__uri" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__creator" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__owner" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__totalUnits" - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "ScalarTypeDefinition", - "name": { - "kind": "Name", - "value": "BigDecimal" - }, - "directives": [] - }, - { - "kind": "ScalarTypeDefinition", - "name": { - "kind": "Name", - "value": "BigInt" - }, - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "BlockChangedFilter" - }, - "fields": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "number_gte" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - } - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Block_height" - }, - "fields": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "hash" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "number" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "number_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "ScalarTypeDefinition", - "name": { - "kind": "Name", - "value": "Bytes" - }, - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Claim" - }, - "fields": [ - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "creation" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "tokenID" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "contract" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "uri" - }, - "arguments": [], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "creator" - }, - "arguments": [], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "owner" - }, - "arguments": [], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "totalUnits" - }, - "arguments": [], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "allowlist" - }, - "arguments": [], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist" - } - }, - "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "ClaimToken" - }, - "fields": [ - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "tokenID" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "claim" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "owner" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "units" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "offers" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer_filter" - } - }, - "directives": [] - } - ], - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer" - } - } - } - }, - "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "ClaimToken_filter" - }, - "fields": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "claim_" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "units" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "units_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "units_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "units_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "units_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "units_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "units_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "units_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offers_" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Filter for the block changed event.", - "block": true - }, - "name": { - "kind": "Name", - "value": "_change_block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BlockChangedFilter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "and" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken_filter" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "or" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken_filter" - } - } - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "ClaimToken_orderBy" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__creation" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__tokenID" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__contract" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__uri" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__creator" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__owner" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "claim__totalUnits" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "owner" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "units" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "offers" - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Claim_filter" - }, - "fields": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creation" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creation_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creation_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creation_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creation_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creation_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creation_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creation_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "contract_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "uri_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creator" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creator_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creator_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creator_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creator_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creator_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creator_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creator_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creator_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "creator_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "owner_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "totalUnits" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "totalUnits_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "totalUnits_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "totalUnits_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "totalUnits_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "totalUnits_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "totalUnits_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "totalUnits_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist_" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Filter for the block changed event.", - "block": true - }, - "name": { - "kind": "Name", - "value": "_change_block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BlockChangedFilter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "and" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_filter" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "or" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_filter" - } - } - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "Claim_orderBy" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "creation" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "tokenID" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "contract" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "uri" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "creator" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "owner" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "totalUnits" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist__id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "allowlist__root" - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "ScalarTypeDefinition", - "description": { - "kind": "StringValue", - "value": "8 bytes signed integer\n", - "block": true - }, - "name": { - "kind": "Name", - "value": "Int8" - }, - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Offer" - }, - "fields": [ - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "fractionID" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "unitsAvailable" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "minUnitsPerTrade" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "maxUnitsPerTrade" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "status" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OfferStatus" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "acceptedTokens" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken_filter" - } - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken" - } - } - } - } - }, - "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "OfferStatus" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "Open" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "Fulfilled" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "Cancelled" - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Offer_filter" - }, - "fields": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID_" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsAvailable" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsAvailable_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsAvailable_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsAvailable_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsAvailable_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsAvailable_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsAvailable_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsAvailable_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minUnitsPerTrade" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minUnitsPerTrade_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minUnitsPerTrade_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minUnitsPerTrade_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minUnitsPerTrade_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minUnitsPerTrade_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minUnitsPerTrade_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "minUnitsPerTrade_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "maxUnitsPerTrade" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "maxUnitsPerTrade_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "maxUnitsPerTrade_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "maxUnitsPerTrade_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "maxUnitsPerTrade_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "maxUnitsPerTrade_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "maxUnitsPerTrade_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "maxUnitsPerTrade_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "status" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OfferStatus" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "status_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OfferStatus" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "status_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OfferStatus" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "status_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OfferStatus" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "acceptedTokens" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "acceptedTokens_not" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "acceptedTokens_contains" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "acceptedTokens_contains_nocase" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "acceptedTokens_not_contains" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "acceptedTokens_not_contains_nocase" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "acceptedTokens_" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Filter for the block changed event.", - "block": true - }, - "name": { - "kind": "Name", - "value": "_change_block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BlockChangedFilter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "and" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer_filter" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "or" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer_filter" - } - } - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "Offer_orderBy" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID__id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID__tokenID" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID__owner" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "fractionID__units" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "unitsAvailable" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "minUnitsPerTrade" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "maxUnitsPerTrade" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "status" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "acceptedTokens" - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "description": { - "kind": "StringValue", - "value": "Defines the order direction, either ascending or descending", - "block": true - }, - "name": { - "kind": "Name", - "value": "OrderDirection" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "asc" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "desc" - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Query" - }, - "fields": [ - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "allowlist" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "allowlists" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "claim" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "claims" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "claimToken" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "claimTokens" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "token" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "tokens" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "acceptedToken" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "acceptedTokens" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "offer" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "offers" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "trade" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Trade" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "trades" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Trade_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Trade_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Trade" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "description": { - "kind": "StringValue", - "value": "Access to subgraph metadata", - "block": true - }, - "name": { - "kind": "Name", - "value": "_meta" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_Meta_" - } - }, - "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Subscription" - }, - "fields": [ - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "allowlist" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "allowlists" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Allowlist" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "claim" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "claims" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Claim" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "claimToken" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "claimTokens" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ClaimToken" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "token" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "tokens" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "acceptedToken" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "acceptedTokens" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "AcceptedToken" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "offer" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "offers" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "trade" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "ID" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Trade" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "trades" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "skip" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "0" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "first" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "defaultValue": { - "kind": "IntValue", - "value": "100" - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderBy" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Trade_orderBy" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "orderDirection" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "OrderDirection" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "where" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Trade_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", - "block": true - }, - "name": { - "kind": "Name", - "value": "subgraphError" - }, - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - } - } - }, - "defaultValue": { - "kind": "EnumValue", - "value": "deny" - }, - "directives": [] - } - ], - "type": { - "kind": "NonNullType", - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Trade" - } - } - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "description": { - "kind": "StringValue", - "value": "Access to subgraph metadata", - "block": true - }, - "name": { - "kind": "Name", - "value": "_meta" - }, - "arguments": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Block_height" - } - }, - "directives": [] - } - ], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_Meta_" - } - }, - "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Token" - }, - "fields": [ - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "name" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "symbol" - }, - "arguments": [], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "decimals" - }, - "arguments": [], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Token_filter" - }, - "fields": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "name_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "symbol_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "decimals" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "decimals_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "decimals_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "decimals_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "decimals_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "decimals_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "decimals_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "decimals_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Filter for the block changed event.", - "block": true - }, - "name": { - "kind": "Name", - "value": "_change_block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BlockChangedFilter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "and" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token_filter" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "or" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token_filter" - } - } - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "Token_orderBy" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "name" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "symbol" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "decimals" - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Trade" - }, - "fields": [ - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "buyer" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "offerID" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "unitsSold" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "token" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "name": { - "kind": "Name", - "value": "amountPerUnit" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - }, - "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "InputObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Trade_filter" - }, - "fields": [ - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "id_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "buyer" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "buyer_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "buyer_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "buyer_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "buyer_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "buyer_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "buyer_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "buyer_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "buyer_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "buyer_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "offerID_" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Offer_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsSold" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsSold_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsSold_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsSold_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsSold_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsSold_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsSold_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "unitsSold_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_contains_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_starts_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_starts_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_ends_with" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_not_ends_with_nocase" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "token_" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Token_filter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "amountPerUnit" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "amountPerUnit_not" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "amountPerUnit_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "amountPerUnit_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "amountPerUnit_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "amountPerUnit_lte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "amountPerUnit_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "amountPerUnit_not_in" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BigInt" - } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Filter for the block changed event.", - "block": true - }, - "name": { - "kind": "Name", - "value": "_change_block" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "BlockChangedFilter" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "and" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Trade_filter" - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "or" - }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Trade_filter" - } - } - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "Trade_orderBy" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "buyer" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "offerID" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "offerID__id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "offerID__unitsAvailable" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "offerID__minUnitsPerTrade" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "offerID__maxUnitsPerTrade" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "offerID__status" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "unitsSold" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "token" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "token__id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "token__name" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "token__symbol" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "token__decimals" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "amountPerUnit" - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "_Block_" - }, - "fields": [ - { - "kind": "FieldDefinition", - "description": { - "kind": "StringValue", - "value": "The hash of the block", - "block": true - }, - "name": { - "kind": "Name", - "value": "hash" - }, - "arguments": [], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "description": { - "kind": "StringValue", - "value": "The block number", - "block": true - }, - "name": { - "kind": "Name", - "value": "number" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "description": { - "kind": "StringValue", - "value": "Integer representation of the timestamp stored in blocks for the chain", - "block": true - }, - "name": { - "kind": "Name", - "value": "timestamp" - }, - "arguments": [], - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Int" - } - }, - "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "description": { - "kind": "StringValue", - "value": "The type for the top-level _meta field", - "block": true - }, - "name": { - "kind": "Name", - "value": "_Meta_" - }, - "fields": [ - { - "kind": "FieldDefinition", - "description": { - "kind": "StringValue", - "value": "Information about a specific subgraph block. The hash of the block\nwill be null if the _meta field has a block constraint that asks for\na block number. It will be filled if the _meta field has no block constraint\nand therefore asks for the latest block\n", - "block": true - }, - "name": { - "kind": "Name", - "value": "block" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "_Block_" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "description": { - "kind": "StringValue", - "value": "The deployment ID", - "block": true - }, - "name": { - "kind": "Name", - "value": "deployment" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "String" - } - } - }, - "directives": [] - }, - { - "kind": "FieldDefinition", - "description": { - "kind": "StringValue", - "value": "If `true`, the subgraph encountered indexing errors at some past block", - "block": true - }, - "name": { - "kind": "Name", - "value": "hasIndexingErrors" - }, - "arguments": [], - "type": { - "kind": "NonNullType", - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Boolean" - } - } - }, - "directives": [] - } - ], - "interfaces": [], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "_SubgraphErrorPolicy_" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "description": { - "kind": "StringValue", - "value": "Data will be returned even if the subgraph has indexing errors", - "block": true - }, - "name": { - "kind": "Name", - "value": "allow" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "description": { - "kind": "StringValue", - "value": "If the subgraph has indexing errors, data will be omitted. The default.", - "block": true - }, - "name": { - "kind": "Name", - "value": "deny" - }, - "directives": [] - } - ], - "directives": [] - } - ] -}; - -export default buildASTSchema(schemaAST, { - assumeValid: true, - assumeValidSDL: true -}); \ No newline at end of file diff --git a/sdk/.graphclient/sources/Hypercerts/schema.graphql b/sdk/.graphclient/sources/Hypercerts/schema.graphql deleted file mode 100644 index b44cef4d..00000000 --- a/sdk/.graphclient/sources/Hypercerts/schema.graphql +++ /dev/null @@ -1,1188 +0,0 @@ -schema { - query: Query - subscription: Subscription -} - -"Marks the GraphQL type as indexable entity. Each type that should be an entity is required to be annotated with this directive." -directive @entity on OBJECT - -"Defined a Subgraph ID for an object type" -directive @subgraphId(id: String!) on OBJECT - -"creates a virtual field on the entity that may be queried but cannot be set manually through the mappings API." -directive @derivedFrom(field: String!) on FIELD_DEFINITION - -type AcceptedToken { - id: String! - token: Token! - minimumAmountPerUnit: BigInt! - accepted: Boolean! -} - -input AcceptedToken_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - token: String - token_not: String - token_gt: String - token_lt: String - token_gte: String - token_lte: String - token_in: [String!] - token_not_in: [String!] - token_contains: String - token_contains_nocase: String - token_not_contains: String - token_not_contains_nocase: String - token_starts_with: String - token_starts_with_nocase: String - token_not_starts_with: String - token_not_starts_with_nocase: String - token_ends_with: String - token_ends_with_nocase: String - token_not_ends_with: String - token_not_ends_with_nocase: String - token_: Token_filter - minimumAmountPerUnit: BigInt - minimumAmountPerUnit_not: BigInt - minimumAmountPerUnit_gt: BigInt - minimumAmountPerUnit_lt: BigInt - minimumAmountPerUnit_gte: BigInt - minimumAmountPerUnit_lte: BigInt - minimumAmountPerUnit_in: [BigInt!] - minimumAmountPerUnit_not_in: [BigInt!] - accepted: Boolean - accepted_not: Boolean - accepted_in: [Boolean!] - accepted_not_in: [Boolean!] - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [AcceptedToken_filter] - or: [AcceptedToken_filter] -} - -enum AcceptedToken_orderBy { - id - token - token__id - token__name - token__symbol - token__decimals - minimumAmountPerUnit - accepted -} - -type Allowlist { - id: String! - root: Bytes! - claim: Claim! -} - -input Allowlist_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - root: Bytes - root_not: Bytes - root_gt: Bytes - root_lt: Bytes - root_gte: Bytes - root_lte: Bytes - root_in: [Bytes!] - root_not_in: [Bytes!] - root_contains: Bytes - root_not_contains: Bytes - claim: String - claim_not: String - claim_gt: String - claim_lt: String - claim_gte: String - claim_lte: String - claim_in: [String!] - claim_not_in: [String!] - claim_contains: String - claim_contains_nocase: String - claim_not_contains: String - claim_not_contains_nocase: String - claim_starts_with: String - claim_starts_with_nocase: String - claim_not_starts_with: String - claim_not_starts_with_nocase: String - claim_ends_with: String - claim_ends_with_nocase: String - claim_not_ends_with: String - claim_not_ends_with_nocase: String - claim_: Claim_filter - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [Allowlist_filter] - or: [Allowlist_filter] -} - -enum Allowlist_orderBy { - id - root - claim - claim__id - claim__creation - claim__tokenID - claim__contract - claim__uri - claim__creator - claim__owner - claim__totalUnits -} - -scalar BigDecimal - -scalar BigInt - -input BlockChangedFilter { - number_gte: Int! -} - -input Block_height { - hash: Bytes - number: Int - number_gte: Int -} - -scalar Bytes - -type Claim { - id: String! - creation: BigInt! - tokenID: BigInt! - contract: String! - uri: String - creator: Bytes - owner: Bytes - totalUnits: BigInt - allowlist: Allowlist -} - -type ClaimToken { - id: String! - tokenID: BigInt! - claim: Claim! - owner: Bytes! - units: BigInt! - offers(skip: Int = 0, first: Int = 100, orderBy: Offer_orderBy, orderDirection: OrderDirection, where: Offer_filter): [Offer!] -} - -input ClaimToken_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - tokenID: BigInt - tokenID_not: BigInt - tokenID_gt: BigInt - tokenID_lt: BigInt - tokenID_gte: BigInt - tokenID_lte: BigInt - tokenID_in: [BigInt!] - tokenID_not_in: [BigInt!] - claim: String - claim_not: String - claim_gt: String - claim_lt: String - claim_gte: String - claim_lte: String - claim_in: [String!] - claim_not_in: [String!] - claim_contains: String - claim_contains_nocase: String - claim_not_contains: String - claim_not_contains_nocase: String - claim_starts_with: String - claim_starts_with_nocase: String - claim_not_starts_with: String - claim_not_starts_with_nocase: String - claim_ends_with: String - claim_ends_with_nocase: String - claim_not_ends_with: String - claim_not_ends_with_nocase: String - claim_: Claim_filter - owner: Bytes - owner_not: Bytes - owner_gt: Bytes - owner_lt: Bytes - owner_gte: Bytes - owner_lte: Bytes - owner_in: [Bytes!] - owner_not_in: [Bytes!] - owner_contains: Bytes - owner_not_contains: Bytes - units: BigInt - units_not: BigInt - units_gt: BigInt - units_lt: BigInt - units_gte: BigInt - units_lte: BigInt - units_in: [BigInt!] - units_not_in: [BigInt!] - offers_: Offer_filter - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [ClaimToken_filter] - or: [ClaimToken_filter] -} - -enum ClaimToken_orderBy { - id - tokenID - claim - claim__id - claim__creation - claim__tokenID - claim__contract - claim__uri - claim__creator - claim__owner - claim__totalUnits - owner - units - offers -} - -input Claim_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - creation: BigInt - creation_not: BigInt - creation_gt: BigInt - creation_lt: BigInt - creation_gte: BigInt - creation_lte: BigInt - creation_in: [BigInt!] - creation_not_in: [BigInt!] - tokenID: BigInt - tokenID_not: BigInt - tokenID_gt: BigInt - tokenID_lt: BigInt - tokenID_gte: BigInt - tokenID_lte: BigInt - tokenID_in: [BigInt!] - tokenID_not_in: [BigInt!] - contract: String - contract_not: String - contract_gt: String - contract_lt: String - contract_gte: String - contract_lte: String - contract_in: [String!] - contract_not_in: [String!] - contract_contains: String - contract_contains_nocase: String - contract_not_contains: String - contract_not_contains_nocase: String - contract_starts_with: String - contract_starts_with_nocase: String - contract_not_starts_with: String - contract_not_starts_with_nocase: String - contract_ends_with: String - contract_ends_with_nocase: String - contract_not_ends_with: String - contract_not_ends_with_nocase: String - uri: String - uri_not: String - uri_gt: String - uri_lt: String - uri_gte: String - uri_lte: String - uri_in: [String!] - uri_not_in: [String!] - uri_contains: String - uri_contains_nocase: String - uri_not_contains: String - uri_not_contains_nocase: String - uri_starts_with: String - uri_starts_with_nocase: String - uri_not_starts_with: String - uri_not_starts_with_nocase: String - uri_ends_with: String - uri_ends_with_nocase: String - uri_not_ends_with: String - uri_not_ends_with_nocase: String - creator: Bytes - creator_not: Bytes - creator_gt: Bytes - creator_lt: Bytes - creator_gte: Bytes - creator_lte: Bytes - creator_in: [Bytes!] - creator_not_in: [Bytes!] - creator_contains: Bytes - creator_not_contains: Bytes - owner: Bytes - owner_not: Bytes - owner_gt: Bytes - owner_lt: Bytes - owner_gte: Bytes - owner_lte: Bytes - owner_in: [Bytes!] - owner_not_in: [Bytes!] - owner_contains: Bytes - owner_not_contains: Bytes - totalUnits: BigInt - totalUnits_not: BigInt - totalUnits_gt: BigInt - totalUnits_lt: BigInt - totalUnits_gte: BigInt - totalUnits_lte: BigInt - totalUnits_in: [BigInt!] - totalUnits_not_in: [BigInt!] - allowlist: String - allowlist_not: String - allowlist_gt: String - allowlist_lt: String - allowlist_gte: String - allowlist_lte: String - allowlist_in: [String!] - allowlist_not_in: [String!] - allowlist_contains: String - allowlist_contains_nocase: String - allowlist_not_contains: String - allowlist_not_contains_nocase: String - allowlist_starts_with: String - allowlist_starts_with_nocase: String - allowlist_not_starts_with: String - allowlist_not_starts_with_nocase: String - allowlist_ends_with: String - allowlist_ends_with_nocase: String - allowlist_not_ends_with: String - allowlist_not_ends_with_nocase: String - allowlist_: Allowlist_filter - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [Claim_filter] - or: [Claim_filter] -} - -enum Claim_orderBy { - id - creation - tokenID - contract - uri - creator - owner - totalUnits - allowlist - allowlist__id - allowlist__root -} - -""" -8 bytes signed integer - -""" -scalar Int8 - -type Offer { - id: String! - fractionID: ClaimToken! - unitsAvailable: BigInt! - minUnitsPerTrade: BigInt! - maxUnitsPerTrade: BigInt! - status: OfferStatus! - acceptedTokens(skip: Int = 0, first: Int = 100, orderBy: AcceptedToken_orderBy, orderDirection: OrderDirection, where: AcceptedToken_filter): [AcceptedToken!]! -} - -enum OfferStatus { - Open - Fulfilled - Cancelled -} - -input Offer_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - fractionID: String - fractionID_not: String - fractionID_gt: String - fractionID_lt: String - fractionID_gte: String - fractionID_lte: String - fractionID_in: [String!] - fractionID_not_in: [String!] - fractionID_contains: String - fractionID_contains_nocase: String - fractionID_not_contains: String - fractionID_not_contains_nocase: String - fractionID_starts_with: String - fractionID_starts_with_nocase: String - fractionID_not_starts_with: String - fractionID_not_starts_with_nocase: String - fractionID_ends_with: String - fractionID_ends_with_nocase: String - fractionID_not_ends_with: String - fractionID_not_ends_with_nocase: String - fractionID_: ClaimToken_filter - unitsAvailable: BigInt - unitsAvailable_not: BigInt - unitsAvailable_gt: BigInt - unitsAvailable_lt: BigInt - unitsAvailable_gte: BigInt - unitsAvailable_lte: BigInt - unitsAvailable_in: [BigInt!] - unitsAvailable_not_in: [BigInt!] - minUnitsPerTrade: BigInt - minUnitsPerTrade_not: BigInt - minUnitsPerTrade_gt: BigInt - minUnitsPerTrade_lt: BigInt - minUnitsPerTrade_gte: BigInt - minUnitsPerTrade_lte: BigInt - minUnitsPerTrade_in: [BigInt!] - minUnitsPerTrade_not_in: [BigInt!] - maxUnitsPerTrade: BigInt - maxUnitsPerTrade_not: BigInt - maxUnitsPerTrade_gt: BigInt - maxUnitsPerTrade_lt: BigInt - maxUnitsPerTrade_gte: BigInt - maxUnitsPerTrade_lte: BigInt - maxUnitsPerTrade_in: [BigInt!] - maxUnitsPerTrade_not_in: [BigInt!] - status: OfferStatus - status_not: OfferStatus - status_in: [OfferStatus!] - status_not_in: [OfferStatus!] - acceptedTokens: [String!] - acceptedTokens_not: [String!] - acceptedTokens_contains: [String!] - acceptedTokens_contains_nocase: [String!] - acceptedTokens_not_contains: [String!] - acceptedTokens_not_contains_nocase: [String!] - acceptedTokens_: AcceptedToken_filter - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [Offer_filter] - or: [Offer_filter] -} - -enum Offer_orderBy { - id - fractionID - fractionID__id - fractionID__tokenID - fractionID__owner - fractionID__units - unitsAvailable - minUnitsPerTrade - maxUnitsPerTrade - status - acceptedTokens -} - -"""Defines the order direction, either ascending or descending""" -enum OrderDirection { - asc - desc -} - -type Query { - allowlist( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Allowlist - allowlists( - skip: Int = 0 - first: Int = 100 - orderBy: Allowlist_orderBy - orderDirection: OrderDirection - where: Allowlist_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Allowlist!]! - claim( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Claim - claims( - skip: Int = 0 - first: Int = 100 - orderBy: Claim_orderBy - orderDirection: OrderDirection - where: Claim_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Claim!]! - claimToken( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): ClaimToken - claimTokens( - skip: Int = 0 - first: Int = 100 - orderBy: ClaimToken_orderBy - orderDirection: OrderDirection - where: ClaimToken_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [ClaimToken!]! - token( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Token - tokens( - skip: Int = 0 - first: Int = 100 - orderBy: Token_orderBy - orderDirection: OrderDirection - where: Token_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Token!]! - acceptedToken( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): AcceptedToken - acceptedTokens( - skip: Int = 0 - first: Int = 100 - orderBy: AcceptedToken_orderBy - orderDirection: OrderDirection - where: AcceptedToken_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [AcceptedToken!]! - offer( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Offer - offers( - skip: Int = 0 - first: Int = 100 - orderBy: Offer_orderBy - orderDirection: OrderDirection - where: Offer_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Offer!]! - trade( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Trade - trades( - skip: Int = 0 - first: Int = 100 - orderBy: Trade_orderBy - orderDirection: OrderDirection - where: Trade_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Trade!]! - """Access to subgraph metadata""" - _meta(block: Block_height): _Meta_ -} - -type Subscription { - allowlist( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Allowlist - allowlists( - skip: Int = 0 - first: Int = 100 - orderBy: Allowlist_orderBy - orderDirection: OrderDirection - where: Allowlist_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Allowlist!]! - claim( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Claim - claims( - skip: Int = 0 - first: Int = 100 - orderBy: Claim_orderBy - orderDirection: OrderDirection - where: Claim_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Claim!]! - claimToken( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): ClaimToken - claimTokens( - skip: Int = 0 - first: Int = 100 - orderBy: ClaimToken_orderBy - orderDirection: OrderDirection - where: ClaimToken_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [ClaimToken!]! - token( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Token - tokens( - skip: Int = 0 - first: Int = 100 - orderBy: Token_orderBy - orderDirection: OrderDirection - where: Token_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Token!]! - acceptedToken( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): AcceptedToken - acceptedTokens( - skip: Int = 0 - first: Int = 100 - orderBy: AcceptedToken_orderBy - orderDirection: OrderDirection - where: AcceptedToken_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [AcceptedToken!]! - offer( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Offer - offers( - skip: Int = 0 - first: Int = 100 - orderBy: Offer_orderBy - orderDirection: OrderDirection - where: Offer_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Offer!]! - trade( - id: ID! - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): Trade - trades( - skip: Int = 0 - first: Int = 100 - orderBy: Trade_orderBy - orderDirection: OrderDirection - where: Trade_filter - """ - The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. - """ - block: Block_height - """ - Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. - """ - subgraphError: _SubgraphErrorPolicy_! = deny - ): [Trade!]! - """Access to subgraph metadata""" - _meta(block: Block_height): _Meta_ -} - -type Token { - id: String! - name: String! - symbol: String - decimals: BigInt -} - -input Token_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - name: String - name_not: String - name_gt: String - name_lt: String - name_gte: String - name_lte: String - name_in: [String!] - name_not_in: [String!] - name_contains: String - name_contains_nocase: String - name_not_contains: String - name_not_contains_nocase: String - name_starts_with: String - name_starts_with_nocase: String - name_not_starts_with: String - name_not_starts_with_nocase: String - name_ends_with: String - name_ends_with_nocase: String - name_not_ends_with: String - name_not_ends_with_nocase: String - symbol: String - symbol_not: String - symbol_gt: String - symbol_lt: String - symbol_gte: String - symbol_lte: String - symbol_in: [String!] - symbol_not_in: [String!] - symbol_contains: String - symbol_contains_nocase: String - symbol_not_contains: String - symbol_not_contains_nocase: String - symbol_starts_with: String - symbol_starts_with_nocase: String - symbol_not_starts_with: String - symbol_not_starts_with_nocase: String - symbol_ends_with: String - symbol_ends_with_nocase: String - symbol_not_ends_with: String - symbol_not_ends_with_nocase: String - decimals: BigInt - decimals_not: BigInt - decimals_gt: BigInt - decimals_lt: BigInt - decimals_gte: BigInt - decimals_lte: BigInt - decimals_in: [BigInt!] - decimals_not_in: [BigInt!] - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [Token_filter] - or: [Token_filter] -} - -enum Token_orderBy { - id - name - symbol - decimals -} - -type Trade { - id: String! - buyer: Bytes! - offerID: Offer! - unitsSold: BigInt! - token: Token! - amountPerUnit: BigInt! -} - -input Trade_filter { - id: String - id_not: String - id_gt: String - id_lt: String - id_gte: String - id_lte: String - id_in: [String!] - id_not_in: [String!] - id_contains: String - id_contains_nocase: String - id_not_contains: String - id_not_contains_nocase: String - id_starts_with: String - id_starts_with_nocase: String - id_not_starts_with: String - id_not_starts_with_nocase: String - id_ends_with: String - id_ends_with_nocase: String - id_not_ends_with: String - id_not_ends_with_nocase: String - buyer: Bytes - buyer_not: Bytes - buyer_gt: Bytes - buyer_lt: Bytes - buyer_gte: Bytes - buyer_lte: Bytes - buyer_in: [Bytes!] - buyer_not_in: [Bytes!] - buyer_contains: Bytes - buyer_not_contains: Bytes - offerID: String - offerID_not: String - offerID_gt: String - offerID_lt: String - offerID_gte: String - offerID_lte: String - offerID_in: [String!] - offerID_not_in: [String!] - offerID_contains: String - offerID_contains_nocase: String - offerID_not_contains: String - offerID_not_contains_nocase: String - offerID_starts_with: String - offerID_starts_with_nocase: String - offerID_not_starts_with: String - offerID_not_starts_with_nocase: String - offerID_ends_with: String - offerID_ends_with_nocase: String - offerID_not_ends_with: String - offerID_not_ends_with_nocase: String - offerID_: Offer_filter - unitsSold: BigInt - unitsSold_not: BigInt - unitsSold_gt: BigInt - unitsSold_lt: BigInt - unitsSold_gte: BigInt - unitsSold_lte: BigInt - unitsSold_in: [BigInt!] - unitsSold_not_in: [BigInt!] - token: String - token_not: String - token_gt: String - token_lt: String - token_gte: String - token_lte: String - token_in: [String!] - token_not_in: [String!] - token_contains: String - token_contains_nocase: String - token_not_contains: String - token_not_contains_nocase: String - token_starts_with: String - token_starts_with_nocase: String - token_not_starts_with: String - token_not_starts_with_nocase: String - token_ends_with: String - token_ends_with_nocase: String - token_not_ends_with: String - token_not_ends_with_nocase: String - token_: Token_filter - amountPerUnit: BigInt - amountPerUnit_not: BigInt - amountPerUnit_gt: BigInt - amountPerUnit_lt: BigInt - amountPerUnit_gte: BigInt - amountPerUnit_lte: BigInt - amountPerUnit_in: [BigInt!] - amountPerUnit_not_in: [BigInt!] - """Filter for the block changed event.""" - _change_block: BlockChangedFilter - and: [Trade_filter] - or: [Trade_filter] -} - -enum Trade_orderBy { - id - buyer - offerID - offerID__id - offerID__unitsAvailable - offerID__minUnitsPerTrade - offerID__maxUnitsPerTrade - offerID__status - unitsSold - token - token__id - token__name - token__symbol - token__decimals - amountPerUnit -} - -type _Block_ { - """The hash of the block""" - hash: Bytes - """The block number""" - number: Int! - """Integer representation of the timestamp stored in blocks for the chain""" - timestamp: Int -} - -"""The type for the top-level _meta field""" -type _Meta_ { - """ - Information about a specific subgraph block. The hash of the block - will be null if the _meta field has a block constraint that asks for - a block number. It will be filled if the _meta field has no block constraint - and therefore asks for the latest block - - """ - block: _Block_! - """The deployment ID""" - deployment: String! - """If `true`, the subgraph encountered indexing errors at some past block""" - hasIndexingErrors: Boolean! -} - -enum _SubgraphErrorPolicy_ { - """Data will be returned even if the subgraph has indexing errors""" - allow - """ - If the subgraph has indexing errors, data will be omitted. The default. - """ - deny -} \ No newline at end of file diff --git a/sdk/.graphclient/sources/Hypercerts/types.ts b/sdk/.graphclient/sources/Hypercerts/types.ts deleted file mode 100644 index 70815082..00000000 --- a/sdk/.graphclient/sources/Hypercerts/types.ts +++ /dev/null @@ -1,1194 +0,0 @@ -// @ts-nocheck - -import { InContextSdkMethod } from '@graphql-mesh/types'; -import { MeshContext } from '@graphql-mesh/runtime'; - -export namespace HypercertsTypes { - export type Maybe = T | null; -export type InputMaybe = Maybe; -export type Exact = { [K in keyof T]: T[K] }; -export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; -export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; -/** All built-in and custom scalars, mapped to their actual values */ -export type Scalars = { - ID: string; - String: string; - Boolean: boolean; - Int: number; - Float: number; - BigDecimal: any; - BigInt: any; - Bytes: any; - Int8: any; -}; - -export type AcceptedToken = { - id: Scalars['String']; - token: Token; - minimumAmountPerUnit: Scalars['BigInt']; - accepted: Scalars['Boolean']; -}; - -export type AcceptedToken_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - token?: InputMaybe; - token_not?: InputMaybe; - token_gt?: InputMaybe; - token_lt?: InputMaybe; - token_gte?: InputMaybe; - token_lte?: InputMaybe; - token_in?: InputMaybe>; - token_not_in?: InputMaybe>; - token_contains?: InputMaybe; - token_contains_nocase?: InputMaybe; - token_not_contains?: InputMaybe; - token_not_contains_nocase?: InputMaybe; - token_starts_with?: InputMaybe; - token_starts_with_nocase?: InputMaybe; - token_not_starts_with?: InputMaybe; - token_not_starts_with_nocase?: InputMaybe; - token_ends_with?: InputMaybe; - token_ends_with_nocase?: InputMaybe; - token_not_ends_with?: InputMaybe; - token_not_ends_with_nocase?: InputMaybe; - token_?: InputMaybe; - minimumAmountPerUnit?: InputMaybe; - minimumAmountPerUnit_not?: InputMaybe; - minimumAmountPerUnit_gt?: InputMaybe; - minimumAmountPerUnit_lt?: InputMaybe; - minimumAmountPerUnit_gte?: InputMaybe; - minimumAmountPerUnit_lte?: InputMaybe; - minimumAmountPerUnit_in?: InputMaybe>; - minimumAmountPerUnit_not_in?: InputMaybe>; - accepted?: InputMaybe; - accepted_not?: InputMaybe; - accepted_in?: InputMaybe>; - accepted_not_in?: InputMaybe>; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type AcceptedToken_orderBy = - | 'id' - | 'token' - | 'token__id' - | 'token__name' - | 'token__symbol' - | 'token__decimals' - | 'minimumAmountPerUnit' - | 'accepted'; - -export type Allowlist = { - id: Scalars['String']; - root: Scalars['Bytes']; - claim: Claim; -}; - -export type Allowlist_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - root?: InputMaybe; - root_not?: InputMaybe; - root_gt?: InputMaybe; - root_lt?: InputMaybe; - root_gte?: InputMaybe; - root_lte?: InputMaybe; - root_in?: InputMaybe>; - root_not_in?: InputMaybe>; - root_contains?: InputMaybe; - root_not_contains?: InputMaybe; - claim?: InputMaybe; - claim_not?: InputMaybe; - claim_gt?: InputMaybe; - claim_lt?: InputMaybe; - claim_gte?: InputMaybe; - claim_lte?: InputMaybe; - claim_in?: InputMaybe>; - claim_not_in?: InputMaybe>; - claim_contains?: InputMaybe; - claim_contains_nocase?: InputMaybe; - claim_not_contains?: InputMaybe; - claim_not_contains_nocase?: InputMaybe; - claim_starts_with?: InputMaybe; - claim_starts_with_nocase?: InputMaybe; - claim_not_starts_with?: InputMaybe; - claim_not_starts_with_nocase?: InputMaybe; - claim_ends_with?: InputMaybe; - claim_ends_with_nocase?: InputMaybe; - claim_not_ends_with?: InputMaybe; - claim_not_ends_with_nocase?: InputMaybe; - claim_?: InputMaybe; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type Allowlist_orderBy = - | 'id' - | 'root' - | 'claim' - | 'claim__id' - | 'claim__creation' - | 'claim__tokenID' - | 'claim__contract' - | 'claim__uri' - | 'claim__creator' - | 'claim__owner' - | 'claim__totalUnits'; - -export type BlockChangedFilter = { - number_gte: Scalars['Int']; -}; - -export type Block_height = { - hash?: InputMaybe; - number?: InputMaybe; - number_gte?: InputMaybe; -}; - -export type Claim = { - id: Scalars['String']; - creation: Scalars['BigInt']; - tokenID: Scalars['BigInt']; - contract: Scalars['String']; - uri?: Maybe; - creator?: Maybe; - owner?: Maybe; - totalUnits?: Maybe; - allowlist?: Maybe; -}; - -export type ClaimToken = { - id: Scalars['String']; - tokenID: Scalars['BigInt']; - claim: Claim; - owner: Scalars['Bytes']; - units: Scalars['BigInt']; - offers?: Maybe>; -}; - - -export type ClaimTokenoffersArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; -}; - -export type ClaimToken_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - tokenID?: InputMaybe; - tokenID_not?: InputMaybe; - tokenID_gt?: InputMaybe; - tokenID_lt?: InputMaybe; - tokenID_gte?: InputMaybe; - tokenID_lte?: InputMaybe; - tokenID_in?: InputMaybe>; - tokenID_not_in?: InputMaybe>; - claim?: InputMaybe; - claim_not?: InputMaybe; - claim_gt?: InputMaybe; - claim_lt?: InputMaybe; - claim_gte?: InputMaybe; - claim_lte?: InputMaybe; - claim_in?: InputMaybe>; - claim_not_in?: InputMaybe>; - claim_contains?: InputMaybe; - claim_contains_nocase?: InputMaybe; - claim_not_contains?: InputMaybe; - claim_not_contains_nocase?: InputMaybe; - claim_starts_with?: InputMaybe; - claim_starts_with_nocase?: InputMaybe; - claim_not_starts_with?: InputMaybe; - claim_not_starts_with_nocase?: InputMaybe; - claim_ends_with?: InputMaybe; - claim_ends_with_nocase?: InputMaybe; - claim_not_ends_with?: InputMaybe; - claim_not_ends_with_nocase?: InputMaybe; - claim_?: InputMaybe; - owner?: InputMaybe; - owner_not?: InputMaybe; - owner_gt?: InputMaybe; - owner_lt?: InputMaybe; - owner_gte?: InputMaybe; - owner_lte?: InputMaybe; - owner_in?: InputMaybe>; - owner_not_in?: InputMaybe>; - owner_contains?: InputMaybe; - owner_not_contains?: InputMaybe; - units?: InputMaybe; - units_not?: InputMaybe; - units_gt?: InputMaybe; - units_lt?: InputMaybe; - units_gte?: InputMaybe; - units_lte?: InputMaybe; - units_in?: InputMaybe>; - units_not_in?: InputMaybe>; - offers_?: InputMaybe; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type ClaimToken_orderBy = - | 'id' - | 'tokenID' - | 'claim' - | 'claim__id' - | 'claim__creation' - | 'claim__tokenID' - | 'claim__contract' - | 'claim__uri' - | 'claim__creator' - | 'claim__owner' - | 'claim__totalUnits' - | 'owner' - | 'units' - | 'offers'; - -export type Claim_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - creation?: InputMaybe; - creation_not?: InputMaybe; - creation_gt?: InputMaybe; - creation_lt?: InputMaybe; - creation_gte?: InputMaybe; - creation_lte?: InputMaybe; - creation_in?: InputMaybe>; - creation_not_in?: InputMaybe>; - tokenID?: InputMaybe; - tokenID_not?: InputMaybe; - tokenID_gt?: InputMaybe; - tokenID_lt?: InputMaybe; - tokenID_gte?: InputMaybe; - tokenID_lte?: InputMaybe; - tokenID_in?: InputMaybe>; - tokenID_not_in?: InputMaybe>; - contract?: InputMaybe; - contract_not?: InputMaybe; - contract_gt?: InputMaybe; - contract_lt?: InputMaybe; - contract_gte?: InputMaybe; - contract_lte?: InputMaybe; - contract_in?: InputMaybe>; - contract_not_in?: InputMaybe>; - contract_contains?: InputMaybe; - contract_contains_nocase?: InputMaybe; - contract_not_contains?: InputMaybe; - contract_not_contains_nocase?: InputMaybe; - contract_starts_with?: InputMaybe; - contract_starts_with_nocase?: InputMaybe; - contract_not_starts_with?: InputMaybe; - contract_not_starts_with_nocase?: InputMaybe; - contract_ends_with?: InputMaybe; - contract_ends_with_nocase?: InputMaybe; - contract_not_ends_with?: InputMaybe; - contract_not_ends_with_nocase?: InputMaybe; - uri?: InputMaybe; - uri_not?: InputMaybe; - uri_gt?: InputMaybe; - uri_lt?: InputMaybe; - uri_gte?: InputMaybe; - uri_lte?: InputMaybe; - uri_in?: InputMaybe>; - uri_not_in?: InputMaybe>; - uri_contains?: InputMaybe; - uri_contains_nocase?: InputMaybe; - uri_not_contains?: InputMaybe; - uri_not_contains_nocase?: InputMaybe; - uri_starts_with?: InputMaybe; - uri_starts_with_nocase?: InputMaybe; - uri_not_starts_with?: InputMaybe; - uri_not_starts_with_nocase?: InputMaybe; - uri_ends_with?: InputMaybe; - uri_ends_with_nocase?: InputMaybe; - uri_not_ends_with?: InputMaybe; - uri_not_ends_with_nocase?: InputMaybe; - creator?: InputMaybe; - creator_not?: InputMaybe; - creator_gt?: InputMaybe; - creator_lt?: InputMaybe; - creator_gte?: InputMaybe; - creator_lte?: InputMaybe; - creator_in?: InputMaybe>; - creator_not_in?: InputMaybe>; - creator_contains?: InputMaybe; - creator_not_contains?: InputMaybe; - owner?: InputMaybe; - owner_not?: InputMaybe; - owner_gt?: InputMaybe; - owner_lt?: InputMaybe; - owner_gte?: InputMaybe; - owner_lte?: InputMaybe; - owner_in?: InputMaybe>; - owner_not_in?: InputMaybe>; - owner_contains?: InputMaybe; - owner_not_contains?: InputMaybe; - totalUnits?: InputMaybe; - totalUnits_not?: InputMaybe; - totalUnits_gt?: InputMaybe; - totalUnits_lt?: InputMaybe; - totalUnits_gte?: InputMaybe; - totalUnits_lte?: InputMaybe; - totalUnits_in?: InputMaybe>; - totalUnits_not_in?: InputMaybe>; - allowlist?: InputMaybe; - allowlist_not?: InputMaybe; - allowlist_gt?: InputMaybe; - allowlist_lt?: InputMaybe; - allowlist_gte?: InputMaybe; - allowlist_lte?: InputMaybe; - allowlist_in?: InputMaybe>; - allowlist_not_in?: InputMaybe>; - allowlist_contains?: InputMaybe; - allowlist_contains_nocase?: InputMaybe; - allowlist_not_contains?: InputMaybe; - allowlist_not_contains_nocase?: InputMaybe; - allowlist_starts_with?: InputMaybe; - allowlist_starts_with_nocase?: InputMaybe; - allowlist_not_starts_with?: InputMaybe; - allowlist_not_starts_with_nocase?: InputMaybe; - allowlist_ends_with?: InputMaybe; - allowlist_ends_with_nocase?: InputMaybe; - allowlist_not_ends_with?: InputMaybe; - allowlist_not_ends_with_nocase?: InputMaybe; - allowlist_?: InputMaybe; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type Claim_orderBy = - | 'id' - | 'creation' - | 'tokenID' - | 'contract' - | 'uri' - | 'creator' - | 'owner' - | 'totalUnits' - | 'allowlist' - | 'allowlist__id' - | 'allowlist__root'; - -export type Offer = { - id: Scalars['String']; - fractionID: ClaimToken; - unitsAvailable: Scalars['BigInt']; - minUnitsPerTrade: Scalars['BigInt']; - maxUnitsPerTrade: Scalars['BigInt']; - status: OfferStatus; - acceptedTokens: Array; -}; - - -export type OfferacceptedTokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; -}; - -export type OfferStatus = - | 'Open' - | 'Fulfilled' - | 'Cancelled'; - -export type Offer_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - fractionID?: InputMaybe; - fractionID_not?: InputMaybe; - fractionID_gt?: InputMaybe; - fractionID_lt?: InputMaybe; - fractionID_gte?: InputMaybe; - fractionID_lte?: InputMaybe; - fractionID_in?: InputMaybe>; - fractionID_not_in?: InputMaybe>; - fractionID_contains?: InputMaybe; - fractionID_contains_nocase?: InputMaybe; - fractionID_not_contains?: InputMaybe; - fractionID_not_contains_nocase?: InputMaybe; - fractionID_starts_with?: InputMaybe; - fractionID_starts_with_nocase?: InputMaybe; - fractionID_not_starts_with?: InputMaybe; - fractionID_not_starts_with_nocase?: InputMaybe; - fractionID_ends_with?: InputMaybe; - fractionID_ends_with_nocase?: InputMaybe; - fractionID_not_ends_with?: InputMaybe; - fractionID_not_ends_with_nocase?: InputMaybe; - fractionID_?: InputMaybe; - unitsAvailable?: InputMaybe; - unitsAvailable_not?: InputMaybe; - unitsAvailable_gt?: InputMaybe; - unitsAvailable_lt?: InputMaybe; - unitsAvailable_gte?: InputMaybe; - unitsAvailable_lte?: InputMaybe; - unitsAvailable_in?: InputMaybe>; - unitsAvailable_not_in?: InputMaybe>; - minUnitsPerTrade?: InputMaybe; - minUnitsPerTrade_not?: InputMaybe; - minUnitsPerTrade_gt?: InputMaybe; - minUnitsPerTrade_lt?: InputMaybe; - minUnitsPerTrade_gte?: InputMaybe; - minUnitsPerTrade_lte?: InputMaybe; - minUnitsPerTrade_in?: InputMaybe>; - minUnitsPerTrade_not_in?: InputMaybe>; - maxUnitsPerTrade?: InputMaybe; - maxUnitsPerTrade_not?: InputMaybe; - maxUnitsPerTrade_gt?: InputMaybe; - maxUnitsPerTrade_lt?: InputMaybe; - maxUnitsPerTrade_gte?: InputMaybe; - maxUnitsPerTrade_lte?: InputMaybe; - maxUnitsPerTrade_in?: InputMaybe>; - maxUnitsPerTrade_not_in?: InputMaybe>; - status?: InputMaybe; - status_not?: InputMaybe; - status_in?: InputMaybe>; - status_not_in?: InputMaybe>; - acceptedTokens?: InputMaybe>; - acceptedTokens_not?: InputMaybe>; - acceptedTokens_contains?: InputMaybe>; - acceptedTokens_contains_nocase?: InputMaybe>; - acceptedTokens_not_contains?: InputMaybe>; - acceptedTokens_not_contains_nocase?: InputMaybe>; - acceptedTokens_?: InputMaybe; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type Offer_orderBy = - | 'id' - | 'fractionID' - | 'fractionID__id' - | 'fractionID__tokenID' - | 'fractionID__owner' - | 'fractionID__units' - | 'unitsAvailable' - | 'minUnitsPerTrade' - | 'maxUnitsPerTrade' - | 'status' - | 'acceptedTokens'; - -/** Defines the order direction, either ascending or descending */ -export type OrderDirection = - | 'asc' - | 'desc'; - -export type Query = { - allowlist?: Maybe; - allowlists: Array; - claim?: Maybe; - claims: Array; - claimToken?: Maybe; - claimTokens: Array; - token?: Maybe; - tokens: Array; - acceptedToken?: Maybe; - acceptedTokens: Array; - offer?: Maybe; - offers: Array; - trade?: Maybe; - trades: Array; - /** Access to subgraph metadata */ - _meta?: Maybe<_Meta_>; -}; - - -export type QueryallowlistArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryallowlistsArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryclaimArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryclaimsArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryclaimTokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryclaimTokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QuerytokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QuerytokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryacceptedTokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryacceptedTokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryofferArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QueryoffersArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QuerytradeArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type QuerytradesArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type Query_metaArgs = { - block?: InputMaybe; -}; - -export type Subscription = { - allowlist?: Maybe; - allowlists: Array; - claim?: Maybe; - claims: Array; - claimToken?: Maybe; - claimTokens: Array; - token?: Maybe; - tokens: Array; - acceptedToken?: Maybe; - acceptedTokens: Array; - offer?: Maybe; - offers: Array; - trade?: Maybe; - trades: Array; - /** Access to subgraph metadata */ - _meta?: Maybe<_Meta_>; -}; - - -export type SubscriptionallowlistArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionallowlistsArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionclaimArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionclaimsArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionclaimTokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionclaimTokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptiontokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptiontokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionacceptedTokenArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionacceptedTokensArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionofferArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptionoffersArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptiontradeArgs = { - id: Scalars['ID']; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type SubscriptiontradesArgs = { - skip?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - where?: InputMaybe; - block?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; -}; - - -export type Subscription_metaArgs = { - block?: InputMaybe; -}; - -export type Token = { - id: Scalars['String']; - name: Scalars['String']; - symbol?: Maybe; - decimals?: Maybe; -}; - -export type Token_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - name?: InputMaybe; - name_not?: InputMaybe; - name_gt?: InputMaybe; - name_lt?: InputMaybe; - name_gte?: InputMaybe; - name_lte?: InputMaybe; - name_in?: InputMaybe>; - name_not_in?: InputMaybe>; - name_contains?: InputMaybe; - name_contains_nocase?: InputMaybe; - name_not_contains?: InputMaybe; - name_not_contains_nocase?: InputMaybe; - name_starts_with?: InputMaybe; - name_starts_with_nocase?: InputMaybe; - name_not_starts_with?: InputMaybe; - name_not_starts_with_nocase?: InputMaybe; - name_ends_with?: InputMaybe; - name_ends_with_nocase?: InputMaybe; - name_not_ends_with?: InputMaybe; - name_not_ends_with_nocase?: InputMaybe; - symbol?: InputMaybe; - symbol_not?: InputMaybe; - symbol_gt?: InputMaybe; - symbol_lt?: InputMaybe; - symbol_gte?: InputMaybe; - symbol_lte?: InputMaybe; - symbol_in?: InputMaybe>; - symbol_not_in?: InputMaybe>; - symbol_contains?: InputMaybe; - symbol_contains_nocase?: InputMaybe; - symbol_not_contains?: InputMaybe; - symbol_not_contains_nocase?: InputMaybe; - symbol_starts_with?: InputMaybe; - symbol_starts_with_nocase?: InputMaybe; - symbol_not_starts_with?: InputMaybe; - symbol_not_starts_with_nocase?: InputMaybe; - symbol_ends_with?: InputMaybe; - symbol_ends_with_nocase?: InputMaybe; - symbol_not_ends_with?: InputMaybe; - symbol_not_ends_with_nocase?: InputMaybe; - decimals?: InputMaybe; - decimals_not?: InputMaybe; - decimals_gt?: InputMaybe; - decimals_lt?: InputMaybe; - decimals_gte?: InputMaybe; - decimals_lte?: InputMaybe; - decimals_in?: InputMaybe>; - decimals_not_in?: InputMaybe>; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type Token_orderBy = - | 'id' - | 'name' - | 'symbol' - | 'decimals'; - -export type Trade = { - id: Scalars['String']; - buyer: Scalars['Bytes']; - offerID: Offer; - unitsSold: Scalars['BigInt']; - token: Token; - amountPerUnit: Scalars['BigInt']; -}; - -export type Trade_filter = { - id?: InputMaybe; - id_not?: InputMaybe; - id_gt?: InputMaybe; - id_lt?: InputMaybe; - id_gte?: InputMaybe; - id_lte?: InputMaybe; - id_in?: InputMaybe>; - id_not_in?: InputMaybe>; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - buyer?: InputMaybe; - buyer_not?: InputMaybe; - buyer_gt?: InputMaybe; - buyer_lt?: InputMaybe; - buyer_gte?: InputMaybe; - buyer_lte?: InputMaybe; - buyer_in?: InputMaybe>; - buyer_not_in?: InputMaybe>; - buyer_contains?: InputMaybe; - buyer_not_contains?: InputMaybe; - offerID?: InputMaybe; - offerID_not?: InputMaybe; - offerID_gt?: InputMaybe; - offerID_lt?: InputMaybe; - offerID_gte?: InputMaybe; - offerID_lte?: InputMaybe; - offerID_in?: InputMaybe>; - offerID_not_in?: InputMaybe>; - offerID_contains?: InputMaybe; - offerID_contains_nocase?: InputMaybe; - offerID_not_contains?: InputMaybe; - offerID_not_contains_nocase?: InputMaybe; - offerID_starts_with?: InputMaybe; - offerID_starts_with_nocase?: InputMaybe; - offerID_not_starts_with?: InputMaybe; - offerID_not_starts_with_nocase?: InputMaybe; - offerID_ends_with?: InputMaybe; - offerID_ends_with_nocase?: InputMaybe; - offerID_not_ends_with?: InputMaybe; - offerID_not_ends_with_nocase?: InputMaybe; - offerID_?: InputMaybe; - unitsSold?: InputMaybe; - unitsSold_not?: InputMaybe; - unitsSold_gt?: InputMaybe; - unitsSold_lt?: InputMaybe; - unitsSold_gte?: InputMaybe; - unitsSold_lte?: InputMaybe; - unitsSold_in?: InputMaybe>; - unitsSold_not_in?: InputMaybe>; - token?: InputMaybe; - token_not?: InputMaybe; - token_gt?: InputMaybe; - token_lt?: InputMaybe; - token_gte?: InputMaybe; - token_lte?: InputMaybe; - token_in?: InputMaybe>; - token_not_in?: InputMaybe>; - token_contains?: InputMaybe; - token_contains_nocase?: InputMaybe; - token_not_contains?: InputMaybe; - token_not_contains_nocase?: InputMaybe; - token_starts_with?: InputMaybe; - token_starts_with_nocase?: InputMaybe; - token_not_starts_with?: InputMaybe; - token_not_starts_with_nocase?: InputMaybe; - token_ends_with?: InputMaybe; - token_ends_with_nocase?: InputMaybe; - token_not_ends_with?: InputMaybe; - token_not_ends_with_nocase?: InputMaybe; - token_?: InputMaybe; - amountPerUnit?: InputMaybe; - amountPerUnit_not?: InputMaybe; - amountPerUnit_gt?: InputMaybe; - amountPerUnit_lt?: InputMaybe; - amountPerUnit_gte?: InputMaybe; - amountPerUnit_lte?: InputMaybe; - amountPerUnit_in?: InputMaybe>; - amountPerUnit_not_in?: InputMaybe>; - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; -}; - -export type Trade_orderBy = - | 'id' - | 'buyer' - | 'offerID' - | 'offerID__id' - | 'offerID__unitsAvailable' - | 'offerID__minUnitsPerTrade' - | 'offerID__maxUnitsPerTrade' - | 'offerID__status' - | 'unitsSold' - | 'token' - | 'token__id' - | 'token__name' - | 'token__symbol' - | 'token__decimals' - | 'amountPerUnit'; - -export type _Block_ = { - /** The hash of the block */ - hash?: Maybe; - /** The block number */ - number: Scalars['Int']; - /** Integer representation of the timestamp stored in blocks for the chain */ - timestamp?: Maybe; -}; - -/** The type for the top-level _meta field */ -export type _Meta_ = { - /** - * Information about a specific subgraph block. The hash of the block - * will be null if the _meta field has a block constraint that asks for - * a block number. It will be filled if the _meta field has no block constraint - * and therefore asks for the latest block - * - */ - block: _Block_; - /** The deployment ID */ - deployment: Scalars['String']; - /** If `true`, the subgraph encountered indexing errors at some past block */ - hasIndexingErrors: Scalars['Boolean']; -}; - -export type _SubgraphErrorPolicy_ = - /** Data will be returned even if the subgraph has indexing errors */ - | 'allow' - /** If the subgraph has indexing errors, data will be omitted. The default. */ - | 'deny'; - - export type QuerySdk = { - /** null **/ - allowlist: InContextSdkMethod, - /** null **/ - allowlists: InContextSdkMethod, - /** null **/ - claim: InContextSdkMethod, - /** null **/ - claims: InContextSdkMethod, - /** null **/ - claimToken: InContextSdkMethod, - /** null **/ - claimTokens: InContextSdkMethod, - /** null **/ - token: InContextSdkMethod, - /** null **/ - tokens: InContextSdkMethod, - /** null **/ - acceptedToken: InContextSdkMethod, - /** null **/ - acceptedTokens: InContextSdkMethod, - /** null **/ - offer: InContextSdkMethod, - /** null **/ - offers: InContextSdkMethod, - /** null **/ - trade: InContextSdkMethod, - /** null **/ - trades: InContextSdkMethod, - /** Access to subgraph metadata **/ - _meta: InContextSdkMethod - }; - - export type MutationSdk = { - - }; - - export type SubscriptionSdk = { - /** null **/ - allowlist: InContextSdkMethod, - /** null **/ - allowlists: InContextSdkMethod, - /** null **/ - claim: InContextSdkMethod, - /** null **/ - claims: InContextSdkMethod, - /** null **/ - claimToken: InContextSdkMethod, - /** null **/ - claimTokens: InContextSdkMethod, - /** null **/ - token: InContextSdkMethod, - /** null **/ - tokens: InContextSdkMethod, - /** null **/ - acceptedToken: InContextSdkMethod, - /** null **/ - acceptedTokens: InContextSdkMethod, - /** null **/ - offer: InContextSdkMethod, - /** null **/ - offers: InContextSdkMethod, - /** null **/ - trade: InContextSdkMethod, - /** null **/ - trades: InContextSdkMethod, - /** Access to subgraph metadata **/ - _meta: InContextSdkMethod - }; - - export type Context = { - ["Hypercerts"]: { Query: QuerySdk, Mutation: MutationSdk, Subscription: SubscriptionSdk }, - ["graphName"]: Scalars['ID'] - }; -} diff --git a/sdk/.graphclientrc.yml b/sdk/.graphclientrc.yml deleted file mode 100644 index 79b1fc24..00000000 --- a/sdk/.graphclientrc.yml +++ /dev/null @@ -1,28 +0,0 @@ -sources: - - name: Hypercerts - handler: - graphql: - # Default value is hypercerts-testnet - # This is needed for the initial introspection on buildtime - endpoint: https://api.thegraph.com/subgraphs/name/hypercerts-admin/{context.graphName:hypercerts-testnet} - -additionalTypeDefs: | - extend type Claim { - graphName: String! - } - extend type ClaimToken { - graphName: String! - } - -additionalResolvers: - - src/utils/resolvers.ts - -documents: - - src/indexer/queries/*.graphql - -codegen: - contextType: "MeshContext & { graphName: string }" - -plugins: - - pollingLive: - defaultInterval: 5000 diff --git a/sdk/codegen.yml b/sdk/codegen.yml new file mode 100644 index 00000000..6852106b --- /dev/null +++ b/sdk/codegen.yml @@ -0,0 +1,12 @@ +generates: + ./src/indexer/gql/: + documents: + - ./src/indexer/**/*.graphql + schema: https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet + preset: client + presetConfig: + typesPrefix: I + dedupeOperationSuffix: true + skipTypename: true + namingConvention: change-case#pascalCase + useTypeImports: true diff --git a/sdk/package.json b/sdk/package.json index 575dd9a4..9e88d3fd 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.0.0-alpha.15", + "version": "1.0.0-alpha.19", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -23,28 +23,19 @@ "dependencies": { "@ethereum-attestation-service/eas-sdk": "1.3.7", "@ethersproject/abstract-signer": "^5.7.0", - "@graphprotocol/client-add-source-name": "^2.0.0", - "@graphprotocol/client-cli": "^3.0.0", - "@graphprotocol/client-polling-live": "^2.0.0", - "@graphql-mesh/cache-localforage": "^0.96.1", - "@graphql-mesh/cross-helpers": "^0.4.1", - "@graphql-mesh/graphql": "^0.96.1", - "@graphql-mesh/http": "^0.97.2", - "@graphql-mesh/merger-bare": "^0.96.1", - "@graphql-mesh/runtime": "^0.97.2", - "@graphql-mesh/store": "^0.96.1", - "@graphql-mesh/utils": "^0.96.1", "@graphql-typed-document-node/core": "^3.2.0", "@hypercerts-org/contracts": "1.0.0-alpha.6", "@openzeppelin/merkle-tree": "^1.0.5", + "@urql/core": "^4.2.0", "@whatwg-node/fetch": "^0.9.13", "ajv": "^8.11.2", "axios": "^1.6.2", "dotenv": "^16.0.3", "ethers": "5.7.2", - "graphql": "^16.6.0", + "graphql": "^16.8.1", "loglevel": "^1.8.1", "nft.storage": "^7.1.1", + "urql": "^4.0.6", "viem": "^1.19.9", "web3.storage": "^4.5.5" }, @@ -53,6 +44,8 @@ "@babel/preset-env": "^7.23.5", "@babel/preset-typescript": "^7.23.3", "@faker-js/faker": "^8.3.1", + "@graphql-codegen/cli": "^5.0.0", + "@graphql-codegen/client-preset": "^4.1.0", "@rollup/plugin-commonjs": "^24.0.1", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", @@ -84,12 +77,9 @@ "vitest": "^1.0.1" }, "scripts": { - "build": "pnpm types:json && pnpm graph:build && rollup -c", + "build": "pnpm types:json && pnpm codegen && rollup -c", + "codegen": "graphql-codegen", "docs": "typedoc", - "graph:compile": "graphql-codegen", - "graph:serve": "graphclient serve-dev", - "graph:watch": "graphql-codegen -w", - "graph:build": "rm -rf ./src/.graphclient && graphclient build --throwOnInvalidConfig", "clean": "rm -rf ./dist", "prebuild": "pnpm clean", "prepack": "pnpm build", diff --git a/sdk/src/index.ts b/sdk/src/index.ts index 58cc06ef..fbe0bacd 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -1,6 +1,5 @@ import { HypercertMinterAbi, HypercertExchangeAbi } from "@hypercerts-org/contracts"; -import { execute } from "../.graphclient"; import { HypercertClient } from "./client"; import { HypercertsStorage } from "./storage"; import { DEPLOYMENTS } from "./constants"; @@ -35,8 +34,3 @@ export * from "./validator"; * Utils */ export * from "./utils"; - -/** - * Graph - */ -export { execute }; diff --git a/sdk/src/indexer.ts b/sdk/src/indexer.ts index 331beb93..e83776ba 100644 --- a/sdk/src/indexer.ts +++ b/sdk/src/indexer.ts @@ -1,30 +1,22 @@ import { logger } from "./utils"; + +import { defaultQueryParams } from "./indexer/utils"; +import { HypercertClientConfig, HypercertIndexerInterface, QueryParams } from "./types"; +import { Client, cacheExchange, fetchExchange } from "@urql/core"; import { - getBuiltGraphSDK, - Sdk as GraphClient, - execute, ClaimsByOwnerDocument, - ClaimsByOwnerQuery, - ClaimByIdDocument, - ClaimByIdQuery, - RecentClaimsDocument, - RecentClaimsQuery, ClaimsByOwnerQueryVariables, + ClaimByIdDocument, ClaimByIdQueryVariables, + RecentClaimsDocument, RecentClaimsQueryVariables, ClaimTokensByOwnerDocument, - ClaimTokensByOwnerQuery, ClaimTokensByOwnerQueryVariables, ClaimTokensByClaimDocument, ClaimTokensByClaimQueryVariables, - ClaimTokensByClaimQuery, ClaimTokenByIdDocument, ClaimTokenByIdQueryVariables, - ClaimTokenByIdQuery, -} from "../.graphclient"; -import { defaultQueryParams } from "./indexer/utils"; -import { HypercertClientConfig, HypercertIndexerInterface, QueryParams } from "./types"; - +} from "./indexer/gql/graphql"; /** * A class that provides indexing functionality for Hypercerts. * @@ -39,7 +31,8 @@ import { HypercertClientConfig, HypercertIndexerInterface, QueryParams } from ". */ export class HypercertIndexer implements HypercertIndexerInterface { /** The Graph client used by the indexer. */ - private _graphName: string; + private _graphName?: string; + private _graphUrl: string; /** * Creates a new instance of the `HypercertIndexer` class. @@ -47,17 +40,19 @@ export class HypercertIndexer implements HypercertIndexerInterface { */ constructor(options: Partial) { logger.info("Creating HypercertIndexer", "constructor", { name: options.graphName, url: options.graphUrl }); - if (!options.graphName) throw new Error("Missing graphName"); + if (!options.graphUrl) throw new Error("Missing graphUrl"); this._graphName = options.graphName; + this._graphUrl = options.graphUrl; } /** * Gets the Graph client used by the indexer. * @returns The Graph client. */ - get graphClient(): GraphClient { - return getBuiltGraphSDK({ - graphName: this._graphName, + get graphClient(): Client { + return new Client({ + url: this._graphUrl, + exchanges: [cacheExchange, fetchExchange], }); } @@ -73,7 +68,14 @@ export class HypercertIndexer implements HypercertIndexerInterface { owner, ...params, }; - return (await execute(query, variables, { graphName: this._graphName })) as ClaimsByOwnerQuery; + + const result = await this.graphClient.query(query, variables); + + if (result.error) { + throw result.error; + } + + return result.data; }; /** @@ -86,7 +88,13 @@ export class HypercertIndexer implements HypercertIndexerInterface { const variables: ClaimByIdQueryVariables = { id, }; - return (await execute(query, variables, { graphName: this._graphName })) as ClaimByIdQuery; + const result = await this.graphClient.query(query, variables); + + if (result.error) { + throw result.error; + } + + return result.data; }; /** * Gets the most recent claims. @@ -98,7 +106,13 @@ export class HypercertIndexer implements HypercertIndexerInterface { const variables: RecentClaimsQueryVariables = { ...params, }; - return (await execute(query, variables, { graphName: this._graphName })) as RecentClaimsQuery; + const result = await this.graphClient.query(query, variables); + + if (result.error) { + throw result.error; + } + + return result.data; }; /** @@ -113,7 +127,13 @@ export class HypercertIndexer implements HypercertIndexerInterface { owner, ...params, }; - return (await execute(query, variables, { graphName: this._graphName })) as ClaimTokensByOwnerQuery; + const result = await this.graphClient.query(query, variables); + + if (result.error) { + throw result.error; + } + + return result.data; }; /** @@ -128,7 +148,13 @@ export class HypercertIndexer implements HypercertIndexerInterface { claimId, ...params, }; - return (await execute(query, variables, { graphName: this._graphName })) as ClaimTokensByClaimQuery; + const result = await this.graphClient.query(query, variables); + + if (result.error) { + throw result.error; + } + + return result.data; }; /** @@ -141,6 +167,12 @@ export class HypercertIndexer implements HypercertIndexerInterface { const variables: ClaimTokenByIdQueryVariables = { claimTokenId: fractionId, }; - return (await execute(query, variables, { graphName: this._graphName })) as ClaimTokenByIdQuery; + const result = await this.graphClient.query(query, variables); + + if (result.error) { + throw result.error; + } + + return result.data; }; } diff --git a/sdk/src/indexer/gql/fragment-masking.ts b/sdk/src/indexer/gql/fragment-masking.ts new file mode 100644 index 00000000..71bfb909 --- /dev/null +++ b/sdk/src/indexer/gql/fragment-masking.ts @@ -0,0 +1,66 @@ +import { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from "@graphql-typed-document-node/core"; +import { FragmentDefinitionNode } from "graphql"; +import { Incremental } from "./graphql"; + +export type FragmentType> = + TDocumentType extends DocumentTypeDecoration + ? [TType] extends [{ " $fragmentName"?: infer TKey }] + ? TKey extends string + ? { " $fragmentRefs"?: { [key in TKey]: TType } } + : never + : never + : never; + +// return non-nullable if `fragmentType` is non-nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType>, +): TType; +// return nullable if `fragmentType` is nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> | null | undefined, +): TType | null | undefined; +// return array of non-nullable if `fragmentType` is array of non-nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: ReadonlyArray>>, +): ReadonlyArray; +// return array of nullable if `fragmentType` is array of nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: ReadonlyArray>> | null | undefined, +): ReadonlyArray | null | undefined; +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: + | FragmentType> + | ReadonlyArray>> + | null + | undefined, +): TType | ReadonlyArray | null | undefined { + return fragmentType as any; +} + +export function makeFragmentData, FT extends ResultOf>( + data: FT, + _fragment: F, +): FragmentType { + return data as FragmentType; +} +export function isFragmentReady( + queryNode: DocumentTypeDecoration, + fragmentNode: TypedDocumentNode, + data: FragmentType, any>> | null | undefined, +): data is FragmentType { + const deferredFields = (queryNode as { __meta__?: { deferredFields: Record } }).__meta__ + ?.deferredFields; + + if (!deferredFields) return true; + + const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined; + const fragName = fragDef?.name?.value; + + const fields = (fragName && deferredFields[fragName]) || []; + return fields.length > 0 && fields.every((field) => data && field in data); +} diff --git a/sdk/src/indexer/gql/gql.ts b/sdk/src/indexer/gql/gql.ts new file mode 100644 index 00000000..9a5d6c61 --- /dev/null +++ b/sdk/src/indexer/gql/gql.ts @@ -0,0 +1,58 @@ +/* eslint-disable */ +import * as types from "./graphql"; +import { TypedDocumentNode as DocumentNode } from "@graphql-typed-document-node/core"; + +/** + * Map of all GraphQL operations in the project. + * + * This map has several performance disadvantages: + * 1. It is not tree-shakeable, so it will include all operations in the project. + * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. + * 3. It does not support dead code elimination, so it will add unused operations. + * + * Therefore it is highly recommended to use the babel or swc plugin for production. + */ +const documents = { + 'query ClaimsByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}': + types.ClaimsByOwnerDocument, + 'query ClaimTokensByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}': + types.ClaimTokensByOwnerDocument, +}; + +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + * + * + * @example + * ```ts + * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`); + * ``` + * + * The query argument is unknown! + * Please regenerate the types. + */ +export function graphql(source: string): unknown; + +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql( + source: 'query ClaimsByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}', +): (typeof documents)['query ClaimsByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}']; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql( + source: 'query ClaimTokensByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}', +): (typeof documents)['query ClaimTokensByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}']; + +export function graphql(source: string) { + return (documents as any)[source] ?? {}; +} + +export type DocumentType> = TDocumentNode extends DocumentNode< + infer TType, + any +> + ? TType + : never; diff --git a/sdk/src/indexer/gql/graphql.ts b/sdk/src/indexer/gql/graphql.ts new file mode 100644 index 00000000..26091837 --- /dev/null +++ b/sdk/src/indexer/gql/graphql.ts @@ -0,0 +1,1642 @@ +/* eslint-disable */ +import { TypedDocumentNode as DocumentNode } from "@graphql-typed-document-node/core"; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type MakeEmpty = { [_ in K]?: never }; +export type Incremental = T | { [P in keyof T]?: P extends " $fragmentName" | "__typename" ? T[P] : never }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string }; + String: { input: string; output: string }; + Boolean: { input: boolean; output: boolean }; + Int: { input: number; output: number }; + Float: { input: number; output: number }; + BigDecimal: { input: any; output: any }; + BigInt: { input: any; output: any }; + Bytes: { input: any; output: any }; + /** + * 8 bytes signed integer + * + */ + Int8: { input: any; output: any }; +}; + +export type AcceptedToken = { + __typename?: "AcceptedToken"; + accepted: Scalars["Boolean"]["output"]; + id: Scalars["String"]["output"]; + minimumAmountPerUnit: Scalars["BigInt"]["output"]; + token: Token; +}; + +export type AcceptedToken_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + accepted?: InputMaybe; + accepted_in?: InputMaybe>; + accepted_not?: InputMaybe; + accepted_not_in?: InputMaybe>; + and?: InputMaybe>>; + id?: InputMaybe; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + id_not_in?: InputMaybe>; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + minimumAmountPerUnit?: InputMaybe; + minimumAmountPerUnit_gt?: InputMaybe; + minimumAmountPerUnit_gte?: InputMaybe; + minimumAmountPerUnit_in?: InputMaybe>; + minimumAmountPerUnit_lt?: InputMaybe; + minimumAmountPerUnit_lte?: InputMaybe; + minimumAmountPerUnit_not?: InputMaybe; + minimumAmountPerUnit_not_in?: InputMaybe>; + or?: InputMaybe>>; + token?: InputMaybe; + token_?: InputMaybe; + token_contains?: InputMaybe; + token_contains_nocase?: InputMaybe; + token_ends_with?: InputMaybe; + token_ends_with_nocase?: InputMaybe; + token_gt?: InputMaybe; + token_gte?: InputMaybe; + token_in?: InputMaybe>; + token_lt?: InputMaybe; + token_lte?: InputMaybe; + token_not?: InputMaybe; + token_not_contains?: InputMaybe; + token_not_contains_nocase?: InputMaybe; + token_not_ends_with?: InputMaybe; + token_not_ends_with_nocase?: InputMaybe; + token_not_in?: InputMaybe>; + token_not_starts_with?: InputMaybe; + token_not_starts_with_nocase?: InputMaybe; + token_starts_with?: InputMaybe; + token_starts_with_nocase?: InputMaybe; +}; + +export enum AcceptedToken_OrderBy { + Accepted = "accepted", + Id = "id", + MinimumAmountPerUnit = "minimumAmountPerUnit", + Token = "token", + TokenDecimals = "token__decimals", + TokenId = "token__id", + TokenName = "token__name", + TokenSymbol = "token__symbol", +} + +export type Allowlist = { + __typename?: "Allowlist"; + claim: Claim; + id: Scalars["String"]["output"]; + root: Scalars["Bytes"]["output"]; +}; + +export type Allowlist_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + claim?: InputMaybe; + claim_?: InputMaybe; + claim_contains?: InputMaybe; + claim_contains_nocase?: InputMaybe; + claim_ends_with?: InputMaybe; + claim_ends_with_nocase?: InputMaybe; + claim_gt?: InputMaybe; + claim_gte?: InputMaybe; + claim_in?: InputMaybe>; + claim_lt?: InputMaybe; + claim_lte?: InputMaybe; + claim_not?: InputMaybe; + claim_not_contains?: InputMaybe; + claim_not_contains_nocase?: InputMaybe; + claim_not_ends_with?: InputMaybe; + claim_not_ends_with_nocase?: InputMaybe; + claim_not_in?: InputMaybe>; + claim_not_starts_with?: InputMaybe; + claim_not_starts_with_nocase?: InputMaybe; + claim_starts_with?: InputMaybe; + claim_starts_with_nocase?: InputMaybe; + id?: InputMaybe; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + id_not_in?: InputMaybe>; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + or?: InputMaybe>>; + root?: InputMaybe; + root_contains?: InputMaybe; + root_gt?: InputMaybe; + root_gte?: InputMaybe; + root_in?: InputMaybe>; + root_lt?: InputMaybe; + root_lte?: InputMaybe; + root_not?: InputMaybe; + root_not_contains?: InputMaybe; + root_not_in?: InputMaybe>; +}; + +export enum Allowlist_OrderBy { + Claim = "claim", + ClaimContract = "claim__contract", + ClaimCreation = "claim__creation", + ClaimCreator = "claim__creator", + ClaimId = "claim__id", + ClaimOwner = "claim__owner", + ClaimTokenId = "claim__tokenID", + ClaimTotalUnits = "claim__totalUnits", + ClaimUri = "claim__uri", + Id = "id", + Root = "root", +} + +export type BlockChangedFilter = { + number_gte: Scalars["Int"]["input"]; +}; + +export type Block_Height = { + hash?: InputMaybe; + number?: InputMaybe; + number_gte?: InputMaybe; +}; + +export type Claim = { + __typename?: "Claim"; + allowlist?: Maybe; + contract: Scalars["String"]["output"]; + creation: Scalars["BigInt"]["output"]; + creator?: Maybe; + id: Scalars["String"]["output"]; + owner?: Maybe; + tokenID: Scalars["BigInt"]["output"]; + totalUnits?: Maybe; + uri?: Maybe; +}; + +export type ClaimToken = { + __typename?: "ClaimToken"; + claim: Claim; + id: Scalars["String"]["output"]; + offers?: Maybe>; + owner: Scalars["Bytes"]["output"]; + tokenID: Scalars["BigInt"]["output"]; + units: Scalars["BigInt"]["output"]; +}; + +export type ClaimTokenOffersArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + +export type ClaimToken_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + claim?: InputMaybe; + claim_?: InputMaybe; + claim_contains?: InputMaybe; + claim_contains_nocase?: InputMaybe; + claim_ends_with?: InputMaybe; + claim_ends_with_nocase?: InputMaybe; + claim_gt?: InputMaybe; + claim_gte?: InputMaybe; + claim_in?: InputMaybe>; + claim_lt?: InputMaybe; + claim_lte?: InputMaybe; + claim_not?: InputMaybe; + claim_not_contains?: InputMaybe; + claim_not_contains_nocase?: InputMaybe; + claim_not_ends_with?: InputMaybe; + claim_not_ends_with_nocase?: InputMaybe; + claim_not_in?: InputMaybe>; + claim_not_starts_with?: InputMaybe; + claim_not_starts_with_nocase?: InputMaybe; + claim_starts_with?: InputMaybe; + claim_starts_with_nocase?: InputMaybe; + id?: InputMaybe; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + id_not_in?: InputMaybe>; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + offers_?: InputMaybe; + or?: InputMaybe>>; + owner?: InputMaybe; + owner_contains?: InputMaybe; + owner_gt?: InputMaybe; + owner_gte?: InputMaybe; + owner_in?: InputMaybe>; + owner_lt?: InputMaybe; + owner_lte?: InputMaybe; + owner_not?: InputMaybe; + owner_not_contains?: InputMaybe; + owner_not_in?: InputMaybe>; + tokenID?: InputMaybe; + tokenID_gt?: InputMaybe; + tokenID_gte?: InputMaybe; + tokenID_in?: InputMaybe>; + tokenID_lt?: InputMaybe; + tokenID_lte?: InputMaybe; + tokenID_not?: InputMaybe; + tokenID_not_in?: InputMaybe>; + units?: InputMaybe; + units_gt?: InputMaybe; + units_gte?: InputMaybe; + units_in?: InputMaybe>; + units_lt?: InputMaybe; + units_lte?: InputMaybe; + units_not?: InputMaybe; + units_not_in?: InputMaybe>; +}; + +export enum ClaimToken_OrderBy { + Claim = "claim", + ClaimContract = "claim__contract", + ClaimCreation = "claim__creation", + ClaimCreator = "claim__creator", + ClaimId = "claim__id", + ClaimOwner = "claim__owner", + ClaimTokenId = "claim__tokenID", + ClaimTotalUnits = "claim__totalUnits", + ClaimUri = "claim__uri", + Id = "id", + Offers = "offers", + Owner = "owner", + TokenId = "tokenID", + Units = "units", +} + +export type Claim_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + allowlist?: InputMaybe; + allowlist_?: InputMaybe; + allowlist_contains?: InputMaybe; + allowlist_contains_nocase?: InputMaybe; + allowlist_ends_with?: InputMaybe; + allowlist_ends_with_nocase?: InputMaybe; + allowlist_gt?: InputMaybe; + allowlist_gte?: InputMaybe; + allowlist_in?: InputMaybe>; + allowlist_lt?: InputMaybe; + allowlist_lte?: InputMaybe; + allowlist_not?: InputMaybe; + allowlist_not_contains?: InputMaybe; + allowlist_not_contains_nocase?: InputMaybe; + allowlist_not_ends_with?: InputMaybe; + allowlist_not_ends_with_nocase?: InputMaybe; + allowlist_not_in?: InputMaybe>; + allowlist_not_starts_with?: InputMaybe; + allowlist_not_starts_with_nocase?: InputMaybe; + allowlist_starts_with?: InputMaybe; + allowlist_starts_with_nocase?: InputMaybe; + and?: InputMaybe>>; + contract?: InputMaybe; + contract_contains?: InputMaybe; + contract_contains_nocase?: InputMaybe; + contract_ends_with?: InputMaybe; + contract_ends_with_nocase?: InputMaybe; + contract_gt?: InputMaybe; + contract_gte?: InputMaybe; + contract_in?: InputMaybe>; + contract_lt?: InputMaybe; + contract_lte?: InputMaybe; + contract_not?: InputMaybe; + contract_not_contains?: InputMaybe; + contract_not_contains_nocase?: InputMaybe; + contract_not_ends_with?: InputMaybe; + contract_not_ends_with_nocase?: InputMaybe; + contract_not_in?: InputMaybe>; + contract_not_starts_with?: InputMaybe; + contract_not_starts_with_nocase?: InputMaybe; + contract_starts_with?: InputMaybe; + contract_starts_with_nocase?: InputMaybe; + creation?: InputMaybe; + creation_gt?: InputMaybe; + creation_gte?: InputMaybe; + creation_in?: InputMaybe>; + creation_lt?: InputMaybe; + creation_lte?: InputMaybe; + creation_not?: InputMaybe; + creation_not_in?: InputMaybe>; + creator?: InputMaybe; + creator_contains?: InputMaybe; + creator_gt?: InputMaybe; + creator_gte?: InputMaybe; + creator_in?: InputMaybe>; + creator_lt?: InputMaybe; + creator_lte?: InputMaybe; + creator_not?: InputMaybe; + creator_not_contains?: InputMaybe; + creator_not_in?: InputMaybe>; + id?: InputMaybe; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + id_not_in?: InputMaybe>; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + or?: InputMaybe>>; + owner?: InputMaybe; + owner_contains?: InputMaybe; + owner_gt?: InputMaybe; + owner_gte?: InputMaybe; + owner_in?: InputMaybe>; + owner_lt?: InputMaybe; + owner_lte?: InputMaybe; + owner_not?: InputMaybe; + owner_not_contains?: InputMaybe; + owner_not_in?: InputMaybe>; + tokenID?: InputMaybe; + tokenID_gt?: InputMaybe; + tokenID_gte?: InputMaybe; + tokenID_in?: InputMaybe>; + tokenID_lt?: InputMaybe; + tokenID_lte?: InputMaybe; + tokenID_not?: InputMaybe; + tokenID_not_in?: InputMaybe>; + totalUnits?: InputMaybe; + totalUnits_gt?: InputMaybe; + totalUnits_gte?: InputMaybe; + totalUnits_in?: InputMaybe>; + totalUnits_lt?: InputMaybe; + totalUnits_lte?: InputMaybe; + totalUnits_not?: InputMaybe; + totalUnits_not_in?: InputMaybe>; + uri?: InputMaybe; + uri_contains?: InputMaybe; + uri_contains_nocase?: InputMaybe; + uri_ends_with?: InputMaybe; + uri_ends_with_nocase?: InputMaybe; + uri_gt?: InputMaybe; + uri_gte?: InputMaybe; + uri_in?: InputMaybe>; + uri_lt?: InputMaybe; + uri_lte?: InputMaybe; + uri_not?: InputMaybe; + uri_not_contains?: InputMaybe; + uri_not_contains_nocase?: InputMaybe; + uri_not_ends_with?: InputMaybe; + uri_not_ends_with_nocase?: InputMaybe; + uri_not_in?: InputMaybe>; + uri_not_starts_with?: InputMaybe; + uri_not_starts_with_nocase?: InputMaybe; + uri_starts_with?: InputMaybe; + uri_starts_with_nocase?: InputMaybe; +}; + +export enum Claim_OrderBy { + Allowlist = "allowlist", + AllowlistId = "allowlist__id", + AllowlistRoot = "allowlist__root", + Contract = "contract", + Creation = "creation", + Creator = "creator", + Id = "id", + Owner = "owner", + TokenId = "tokenID", + TotalUnits = "totalUnits", + Uri = "uri", +} + +export type Offer = { + __typename?: "Offer"; + acceptedTokens: Array; + fractionID: ClaimToken; + id: Scalars["String"]["output"]; + maxUnitsPerTrade: Scalars["BigInt"]["output"]; + minUnitsPerTrade: Scalars["BigInt"]["output"]; + status: OfferStatus; + unitsAvailable: Scalars["BigInt"]["output"]; +}; + +export type OfferAcceptedTokensArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + +export enum OfferStatus { + Cancelled = "Cancelled", + Fulfilled = "Fulfilled", + Open = "Open", +} + +export type Offer_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + acceptedTokens?: InputMaybe>; + acceptedTokens_?: InputMaybe; + acceptedTokens_contains?: InputMaybe>; + acceptedTokens_contains_nocase?: InputMaybe>; + acceptedTokens_not?: InputMaybe>; + acceptedTokens_not_contains?: InputMaybe>; + acceptedTokens_not_contains_nocase?: InputMaybe>; + and?: InputMaybe>>; + fractionID?: InputMaybe; + fractionID_?: InputMaybe; + fractionID_contains?: InputMaybe; + fractionID_contains_nocase?: InputMaybe; + fractionID_ends_with?: InputMaybe; + fractionID_ends_with_nocase?: InputMaybe; + fractionID_gt?: InputMaybe; + fractionID_gte?: InputMaybe; + fractionID_in?: InputMaybe>; + fractionID_lt?: InputMaybe; + fractionID_lte?: InputMaybe; + fractionID_not?: InputMaybe; + fractionID_not_contains?: InputMaybe; + fractionID_not_contains_nocase?: InputMaybe; + fractionID_not_ends_with?: InputMaybe; + fractionID_not_ends_with_nocase?: InputMaybe; + fractionID_not_in?: InputMaybe>; + fractionID_not_starts_with?: InputMaybe; + fractionID_not_starts_with_nocase?: InputMaybe; + fractionID_starts_with?: InputMaybe; + fractionID_starts_with_nocase?: InputMaybe; + id?: InputMaybe; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + id_not_in?: InputMaybe>; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + maxUnitsPerTrade?: InputMaybe; + maxUnitsPerTrade_gt?: InputMaybe; + maxUnitsPerTrade_gte?: InputMaybe; + maxUnitsPerTrade_in?: InputMaybe>; + maxUnitsPerTrade_lt?: InputMaybe; + maxUnitsPerTrade_lte?: InputMaybe; + maxUnitsPerTrade_not?: InputMaybe; + maxUnitsPerTrade_not_in?: InputMaybe>; + minUnitsPerTrade?: InputMaybe; + minUnitsPerTrade_gt?: InputMaybe; + minUnitsPerTrade_gte?: InputMaybe; + minUnitsPerTrade_in?: InputMaybe>; + minUnitsPerTrade_lt?: InputMaybe; + minUnitsPerTrade_lte?: InputMaybe; + minUnitsPerTrade_not?: InputMaybe; + minUnitsPerTrade_not_in?: InputMaybe>; + or?: InputMaybe>>; + status?: InputMaybe; + status_in?: InputMaybe>; + status_not?: InputMaybe; + status_not_in?: InputMaybe>; + unitsAvailable?: InputMaybe; + unitsAvailable_gt?: InputMaybe; + unitsAvailable_gte?: InputMaybe; + unitsAvailable_in?: InputMaybe>; + unitsAvailable_lt?: InputMaybe; + unitsAvailable_lte?: InputMaybe; + unitsAvailable_not?: InputMaybe; + unitsAvailable_not_in?: InputMaybe>; +}; + +export enum Offer_OrderBy { + AcceptedTokens = "acceptedTokens", + FractionId = "fractionID", + FractionIdId = "fractionID__id", + FractionIdOwner = "fractionID__owner", + FractionIdTokenId = "fractionID__tokenID", + FractionIdUnits = "fractionID__units", + Id = "id", + MaxUnitsPerTrade = "maxUnitsPerTrade", + MinUnitsPerTrade = "minUnitsPerTrade", + Status = "status", + UnitsAvailable = "unitsAvailable", +} + +/** Defines the order direction, either ascending or descending */ +export enum OrderDirection { + Asc = "asc", + Desc = "desc", +} + +export type Query = { + __typename?: "Query"; + /** Access to subgraph metadata */ + _meta?: Maybe<_Meta_>; + acceptedToken?: Maybe; + acceptedTokens: Array; + allowlist?: Maybe; + allowlists: Array; + claim?: Maybe; + claimToken?: Maybe; + claimTokens: Array; + claims: Array; + offer?: Maybe; + offers: Array; + token?: Maybe; + tokens: Array; + trade?: Maybe; + trades: Array; +}; + +export type Query_MetaArgs = { + block?: InputMaybe; +}; + +export type QueryAcceptedTokenArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type QueryAcceptedTokensArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type QueryAllowlistArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type QueryAllowlistsArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type QueryClaimArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type QueryClaimTokenArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type QueryClaimTokensArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type QueryClaimsArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type QueryOfferArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type QueryOffersArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type QueryTokenArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type QueryTokensArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type QueryTradeArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type QueryTradesArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type Subscription = { + __typename?: "Subscription"; + /** Access to subgraph metadata */ + _meta?: Maybe<_Meta_>; + acceptedToken?: Maybe; + acceptedTokens: Array; + allowlist?: Maybe; + allowlists: Array; + claim?: Maybe; + claimToken?: Maybe; + claimTokens: Array; + claims: Array; + offer?: Maybe; + offers: Array; + token?: Maybe; + tokens: Array; + trade?: Maybe; + trades: Array; +}; + +export type Subscription_MetaArgs = { + block?: InputMaybe; +}; + +export type SubscriptionAcceptedTokenArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type SubscriptionAcceptedTokensArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type SubscriptionAllowlistArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type SubscriptionAllowlistsArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type SubscriptionClaimArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type SubscriptionClaimTokenArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type SubscriptionClaimTokensArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type SubscriptionClaimsArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type SubscriptionOfferArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type SubscriptionOffersArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type SubscriptionTokenArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type SubscriptionTokensArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type SubscriptionTradeArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type SubscriptionTradesArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type Token = { + __typename?: "Token"; + decimals?: Maybe; + id: Scalars["String"]["output"]; + name: Scalars["String"]["output"]; + symbol?: Maybe; +}; + +export type Token_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + decimals?: InputMaybe; + decimals_gt?: InputMaybe; + decimals_gte?: InputMaybe; + decimals_in?: InputMaybe>; + decimals_lt?: InputMaybe; + decimals_lte?: InputMaybe; + decimals_not?: InputMaybe; + decimals_not_in?: InputMaybe>; + id?: InputMaybe; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + id_not_in?: InputMaybe>; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + name?: InputMaybe; + name_contains?: InputMaybe; + name_contains_nocase?: InputMaybe; + name_ends_with?: InputMaybe; + name_ends_with_nocase?: InputMaybe; + name_gt?: InputMaybe; + name_gte?: InputMaybe; + name_in?: InputMaybe>; + name_lt?: InputMaybe; + name_lte?: InputMaybe; + name_not?: InputMaybe; + name_not_contains?: InputMaybe; + name_not_contains_nocase?: InputMaybe; + name_not_ends_with?: InputMaybe; + name_not_ends_with_nocase?: InputMaybe; + name_not_in?: InputMaybe>; + name_not_starts_with?: InputMaybe; + name_not_starts_with_nocase?: InputMaybe; + name_starts_with?: InputMaybe; + name_starts_with_nocase?: InputMaybe; + or?: InputMaybe>>; + symbol?: InputMaybe; + symbol_contains?: InputMaybe; + symbol_contains_nocase?: InputMaybe; + symbol_ends_with?: InputMaybe; + symbol_ends_with_nocase?: InputMaybe; + symbol_gt?: InputMaybe; + symbol_gte?: InputMaybe; + symbol_in?: InputMaybe>; + symbol_lt?: InputMaybe; + symbol_lte?: InputMaybe; + symbol_not?: InputMaybe; + symbol_not_contains?: InputMaybe; + symbol_not_contains_nocase?: InputMaybe; + symbol_not_ends_with?: InputMaybe; + symbol_not_ends_with_nocase?: InputMaybe; + symbol_not_in?: InputMaybe>; + symbol_not_starts_with?: InputMaybe; + symbol_not_starts_with_nocase?: InputMaybe; + symbol_starts_with?: InputMaybe; + symbol_starts_with_nocase?: InputMaybe; +}; + +export enum Token_OrderBy { + Decimals = "decimals", + Id = "id", + Name = "name", + Symbol = "symbol", +} + +export type Trade = { + __typename?: "Trade"; + amountPerUnit: Scalars["BigInt"]["output"]; + buyer: Scalars["Bytes"]["output"]; + id: Scalars["String"]["output"]; + offerID: Offer; + token: Token; + unitsSold: Scalars["BigInt"]["output"]; +}; + +export type Trade_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + amountPerUnit?: InputMaybe; + amountPerUnit_gt?: InputMaybe; + amountPerUnit_gte?: InputMaybe; + amountPerUnit_in?: InputMaybe>; + amountPerUnit_lt?: InputMaybe; + amountPerUnit_lte?: InputMaybe; + amountPerUnit_not?: InputMaybe; + amountPerUnit_not_in?: InputMaybe>; + and?: InputMaybe>>; + buyer?: InputMaybe; + buyer_contains?: InputMaybe; + buyer_gt?: InputMaybe; + buyer_gte?: InputMaybe; + buyer_in?: InputMaybe>; + buyer_lt?: InputMaybe; + buyer_lte?: InputMaybe; + buyer_not?: InputMaybe; + buyer_not_contains?: InputMaybe; + buyer_not_in?: InputMaybe>; + id?: InputMaybe; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + id_not_in?: InputMaybe>; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + offerID?: InputMaybe; + offerID_?: InputMaybe; + offerID_contains?: InputMaybe; + offerID_contains_nocase?: InputMaybe; + offerID_ends_with?: InputMaybe; + offerID_ends_with_nocase?: InputMaybe; + offerID_gt?: InputMaybe; + offerID_gte?: InputMaybe; + offerID_in?: InputMaybe>; + offerID_lt?: InputMaybe; + offerID_lte?: InputMaybe; + offerID_not?: InputMaybe; + offerID_not_contains?: InputMaybe; + offerID_not_contains_nocase?: InputMaybe; + offerID_not_ends_with?: InputMaybe; + offerID_not_ends_with_nocase?: InputMaybe; + offerID_not_in?: InputMaybe>; + offerID_not_starts_with?: InputMaybe; + offerID_not_starts_with_nocase?: InputMaybe; + offerID_starts_with?: InputMaybe; + offerID_starts_with_nocase?: InputMaybe; + or?: InputMaybe>>; + token?: InputMaybe; + token_?: InputMaybe; + token_contains?: InputMaybe; + token_contains_nocase?: InputMaybe; + token_ends_with?: InputMaybe; + token_ends_with_nocase?: InputMaybe; + token_gt?: InputMaybe; + token_gte?: InputMaybe; + token_in?: InputMaybe>; + token_lt?: InputMaybe; + token_lte?: InputMaybe; + token_not?: InputMaybe; + token_not_contains?: InputMaybe; + token_not_contains_nocase?: InputMaybe; + token_not_ends_with?: InputMaybe; + token_not_ends_with_nocase?: InputMaybe; + token_not_in?: InputMaybe>; + token_not_starts_with?: InputMaybe; + token_not_starts_with_nocase?: InputMaybe; + token_starts_with?: InputMaybe; + token_starts_with_nocase?: InputMaybe; + unitsSold?: InputMaybe; + unitsSold_gt?: InputMaybe; + unitsSold_gte?: InputMaybe; + unitsSold_in?: InputMaybe>; + unitsSold_lt?: InputMaybe; + unitsSold_lte?: InputMaybe; + unitsSold_not?: InputMaybe; + unitsSold_not_in?: InputMaybe>; +}; + +export enum Trade_OrderBy { + AmountPerUnit = "amountPerUnit", + Buyer = "buyer", + Id = "id", + OfferId = "offerID", + OfferIdId = "offerID__id", + OfferIdMaxUnitsPerTrade = "offerID__maxUnitsPerTrade", + OfferIdMinUnitsPerTrade = "offerID__minUnitsPerTrade", + OfferIdStatus = "offerID__status", + OfferIdUnitsAvailable = "offerID__unitsAvailable", + Token = "token", + TokenDecimals = "token__decimals", + TokenId = "token__id", + TokenName = "token__name", + TokenSymbol = "token__symbol", + UnitsSold = "unitsSold", +} + +export type _Block_ = { + __typename?: "_Block_"; + /** The hash of the block */ + hash?: Maybe; + /** The block number */ + number: Scalars["Int"]["output"]; + /** Integer representation of the timestamp stored in blocks for the chain */ + timestamp?: Maybe; +}; + +/** The type for the top-level _meta field */ +export type _Meta_ = { + __typename?: "_Meta_"; + /** + * Information about a specific subgraph block. The hash of the block + * will be null if the _meta field has a block constraint that asks for + * a block number. It will be filled if the _meta field has no block constraint + * and therefore asks for the latest block + * + */ + block: _Block_; + /** The deployment ID */ + deployment: Scalars["String"]["output"]; + /** If `true`, the subgraph encountered indexing errors at some past block */ + hasIndexingErrors: Scalars["Boolean"]["output"]; +}; + +export enum _SubgraphErrorPolicy_ { + /** Data will be returned even if the subgraph has indexing errors */ + Allow = "allow", + /** If the subgraph has indexing errors, data will be omitted. The default. */ + Deny = "deny", +} + +export type ClaimsByOwnerQueryVariables = Exact<{ + owner?: InputMaybe; + orderDirection?: InputMaybe; + first?: InputMaybe; + skip?: InputMaybe; +}>; + +export type ClaimsByOwnerQuery = { + __typename?: "Query"; + claims: Array<{ + __typename?: "Claim"; + contract: string; + tokenID: any; + creator?: any | null; + id: string; + owner?: any | null; + totalUnits?: any | null; + uri?: string | null; + }>; +}; + +export type RecentClaimsQueryVariables = Exact<{ + orderDirection?: InputMaybe; + first?: InputMaybe; + skip?: InputMaybe; +}>; + +export type RecentClaimsQuery = { + __typename?: "Query"; + claims: Array<{ + __typename?: "Claim"; + contract: string; + tokenID: any; + creator?: any | null; + id: string; + owner?: any | null; + totalUnits?: any | null; + uri?: string | null; + }>; +}; + +export type ClaimByIdQueryVariables = Exact<{ + id: Scalars["ID"]["input"]; +}>; + +export type ClaimByIdQuery = { + __typename?: "Query"; + claim?: { + __typename?: "Claim"; + contract: string; + tokenID: any; + creator?: any | null; + id: string; + owner?: any | null; + totalUnits?: any | null; + uri?: string | null; + } | null; +}; + +export type ClaimTokensByOwnerQueryVariables = Exact<{ + owner?: InputMaybe; + orderDirection?: InputMaybe; + first?: InputMaybe; + skip?: InputMaybe; +}>; + +export type ClaimTokensByOwnerQuery = { + __typename?: "Query"; + claimTokens: Array<{ + __typename?: "ClaimToken"; + id: string; + owner: any; + tokenID: any; + units: any; + claim: { __typename?: "Claim"; id: string; creation: any; uri?: string | null; totalUnits?: any | null }; + }>; +}; + +export type ClaimTokensByClaimQueryVariables = Exact<{ + claimId: Scalars["String"]["input"]; + orderDirection?: InputMaybe; + first?: InputMaybe; + skip?: InputMaybe; +}>; + +export type ClaimTokensByClaimQuery = { + __typename?: "Query"; + claimTokens: Array<{ __typename?: "ClaimToken"; id: string; owner: any; tokenID: any; units: any }>; +}; + +export type ClaimTokenByIdQueryVariables = Exact<{ + claimTokenId: Scalars["ID"]["input"]; +}>; + +export type ClaimTokenByIdQuery = { + __typename?: "Query"; + claimToken?: { + __typename?: "ClaimToken"; + id: string; + owner: any; + tokenID: any; + units: any; + claim: { __typename?: "Claim"; id: string; creation: any; uri?: string | null; totalUnits?: any | null }; + } | null; +}; + +export const ClaimsByOwnerDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ClaimsByOwner" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "owner" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Bytes" } }, + defaultValue: { kind: "StringValue", value: "", block: false }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "orderDirection" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "OrderDirection" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "first" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "skip" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "claims" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { kind: "Name", value: "owner" }, + value: { kind: "Variable", name: { kind: "Name", value: "owner" } }, + }, + ], + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "skip" }, + value: { kind: "Variable", name: { kind: "Name", value: "skip" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "first" }, + value: { kind: "Variable", name: { kind: "Name", value: "first" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "orderDirection" }, + value: { kind: "Variable", name: { kind: "Name", value: "orderDirection" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { kind: "Field", name: { kind: "Name", value: "contract" } }, + { kind: "Field", name: { kind: "Name", value: "tokenID" } }, + { kind: "Field", name: { kind: "Name", value: "creator" } }, + { kind: "Field", name: { kind: "Name", value: "id" } }, + { kind: "Field", name: { kind: "Name", value: "owner" } }, + { kind: "Field", name: { kind: "Name", value: "totalUnits" } }, + { kind: "Field", name: { kind: "Name", value: "uri" } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const RecentClaimsDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "RecentClaims" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "orderDirection" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "OrderDirection" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "first" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "skip" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "claims" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "orderDirection" }, + value: { kind: "Variable", name: { kind: "Name", value: "orderDirection" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "orderBy" }, + value: { kind: "EnumValue", value: "creation" }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "first" }, + value: { kind: "Variable", name: { kind: "Name", value: "first" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { kind: "Field", name: { kind: "Name", value: "contract" } }, + { kind: "Field", name: { kind: "Name", value: "tokenID" } }, + { kind: "Field", name: { kind: "Name", value: "creator" } }, + { kind: "Field", name: { kind: "Name", value: "id" } }, + { kind: "Field", name: { kind: "Name", value: "owner" } }, + { kind: "Field", name: { kind: "Name", value: "totalUnits" } }, + { kind: "Field", name: { kind: "Name", value: "uri" } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ClaimByIdDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ClaimById" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "id" } }, + type: { kind: "NonNullType", type: { kind: "NamedType", name: { kind: "Name", value: "ID" } } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "claim" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "id" }, + value: { kind: "Variable", name: { kind: "Name", value: "id" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { kind: "Field", name: { kind: "Name", value: "contract" } }, + { kind: "Field", name: { kind: "Name", value: "tokenID" } }, + { kind: "Field", name: { kind: "Name", value: "creator" } }, + { kind: "Field", name: { kind: "Name", value: "id" } }, + { kind: "Field", name: { kind: "Name", value: "owner" } }, + { kind: "Field", name: { kind: "Name", value: "totalUnits" } }, + { kind: "Field", name: { kind: "Name", value: "uri" } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ClaimTokensByOwnerDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ClaimTokensByOwner" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "owner" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Bytes" } }, + defaultValue: { kind: "StringValue", value: "", block: false }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "orderDirection" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "OrderDirection" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "first" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "skip" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "claimTokens" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { kind: "Name", value: "owner" }, + value: { kind: "Variable", name: { kind: "Name", value: "owner" } }, + }, + ], + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "skip" }, + value: { kind: "Variable", name: { kind: "Name", value: "skip" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "first" }, + value: { kind: "Variable", name: { kind: "Name", value: "first" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "orderDirection" }, + value: { kind: "Variable", name: { kind: "Name", value: "orderDirection" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { kind: "Field", name: { kind: "Name", value: "id" } }, + { kind: "Field", name: { kind: "Name", value: "owner" } }, + { kind: "Field", name: { kind: "Name", value: "tokenID" } }, + { kind: "Field", name: { kind: "Name", value: "units" } }, + { + kind: "Field", + name: { kind: "Name", value: "claim" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { kind: "Field", name: { kind: "Name", value: "id" } }, + { kind: "Field", name: { kind: "Name", value: "creation" } }, + { kind: "Field", name: { kind: "Name", value: "uri" } }, + { kind: "Field", name: { kind: "Name", value: "totalUnits" } }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ClaimTokensByClaimDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ClaimTokensByClaim" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "claimId" } }, + type: { kind: "NonNullType", type: { kind: "NamedType", name: { kind: "Name", value: "String" } } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "orderDirection" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "OrderDirection" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "first" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "skip" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "claimTokens" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { kind: "Name", value: "claim" }, + value: { kind: "Variable", name: { kind: "Name", value: "claimId" } }, + }, + ], + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "skip" }, + value: { kind: "Variable", name: { kind: "Name", value: "skip" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "first" }, + value: { kind: "Variable", name: { kind: "Name", value: "first" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "orderDirection" }, + value: { kind: "Variable", name: { kind: "Name", value: "orderDirection" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { kind: "Field", name: { kind: "Name", value: "id" } }, + { kind: "Field", name: { kind: "Name", value: "owner" } }, + { kind: "Field", name: { kind: "Name", value: "tokenID" } }, + { kind: "Field", name: { kind: "Name", value: "units" } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ClaimTokenByIdDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ClaimTokenById" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "claimTokenId" } }, + type: { kind: "NonNullType", type: { kind: "NamedType", name: { kind: "Name", value: "ID" } } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "claimToken" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "id" }, + value: { kind: "Variable", name: { kind: "Name", value: "claimTokenId" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { kind: "Field", name: { kind: "Name", value: "id" } }, + { kind: "Field", name: { kind: "Name", value: "owner" } }, + { kind: "Field", name: { kind: "Name", value: "tokenID" } }, + { kind: "Field", name: { kind: "Name", value: "units" } }, + { + kind: "Field", + name: { kind: "Name", value: "claim" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { kind: "Field", name: { kind: "Name", value: "id" } }, + { kind: "Field", name: { kind: "Name", value: "creation" } }, + { kind: "Field", name: { kind: "Name", value: "uri" } }, + { kind: "Field", name: { kind: "Name", value: "totalUnits" } }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; diff --git a/sdk/src/indexer/gql/index.ts b/sdk/src/indexer/gql/index.ts new file mode 100644 index 00000000..0ea4a91c --- /dev/null +++ b/sdk/src/indexer/gql/index.ts @@ -0,0 +1,2 @@ +export * from "./fragment-masking"; +export * from "./gql"; diff --git a/sdk/src/indexer/queries/claims.graphql b/sdk/src/indexer/queries/claims.graphql index 9e143ae8..2783db67 100644 --- a/sdk/src/indexer/queries/claims.graphql +++ b/sdk/src/indexer/queries/claims.graphql @@ -1,6 +1,5 @@ query ClaimsByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) { claims(where: { owner: $owner }, skip: $skip, first: $first, orderDirection: $orderDirection) { - graphName contract tokenID creator @@ -13,7 +12,6 @@ query ClaimsByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: query RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) { claims(orderDirection: $orderDirection, orderBy: creation, first: $first) { - graphName contract tokenID creator @@ -26,7 +24,6 @@ query RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) { query ClaimById($id: ID!) { claim(id: $id) { - graphName contract tokenID creator diff --git a/sdk/src/indexer/queries/fractions.graphql b/sdk/src/indexer/queries/fractions.graphql index df07f421..686df2e5 100644 --- a/sdk/src/indexer/queries/fractions.graphql +++ b/sdk/src/indexer/queries/fractions.graphql @@ -1,6 +1,5 @@ query ClaimTokensByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $first: Int, $skip: Int) { claimTokens(where: { owner: $owner }, skip: $skip, first: $first, orderDirection: $orderDirection) { - graphName id owner tokenID @@ -16,7 +15,6 @@ query ClaimTokensByOwner($owner: Bytes = "", $orderDirection: OrderDirection, $f query ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) { claimTokens(where: { claim: $claimId }, skip: $skip, first: $first, orderDirection: $orderDirection) { - graphName id owner tokenID @@ -26,7 +24,6 @@ query ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $fi query ClaimTokenById($claimTokenId: ID!) { claimToken(id: $claimTokenId) { - graphName id owner tokenID diff --git a/sdk/src/types/global.d.ts b/sdk/src/types/global.d.ts deleted file mode 100644 index 62b29ce3..00000000 --- a/sdk/src/types/global.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { ClaimByIdQuery, ClaimTokensByClaimQuery, ClaimToken, Claim } from "../../.graphclient"; - -export type { ClaimByIdQuery, ClaimTokensByClaimQuery, ClaimToken, Claim }; diff --git a/sdk/src/types/index.ts b/sdk/src/types/index.ts index 39d19b46..9117f3f6 100644 --- a/sdk/src/types/index.ts +++ b/sdk/src/types/index.ts @@ -13,5 +13,4 @@ export type { IPFSEvaluation, HypercertPointer, } from "./evaluation"; -export type { ClaimByIdQuery, ClaimTokensByClaimQuery, Claim, ClaimToken } from "./global"; export type { HypercertMetadata } from "./metadata"; diff --git a/sdk/src/types/indexer.ts b/sdk/src/types/indexer.ts index 26cd9821..9417e95d 100644 --- a/sdk/src/types/indexer.ts +++ b/sdk/src/types/indexer.ts @@ -1,3 +1,4 @@ +import { Client } from "urql/core"; import { ClaimsByOwnerQuery, ClaimByIdQuery, @@ -5,9 +6,7 @@ import { ClaimTokensByOwnerQuery, ClaimTokensByClaimQuery, ClaimTokenByIdQuery, - Sdk, -} from "../../.graphclient"; - +} from "../indexer/gql/graphql"; export type QueryParams = { orderDirections: "asc" | "desc"; skip: number; @@ -16,11 +15,11 @@ export type QueryParams = { }; export interface HypercertIndexerInterface { - graphClient: Sdk; - claimsByOwner: (owner: string, params?: QueryParams) => Promise; - claimById: (id: string) => Promise; - firstClaims: (params?: QueryParams) => Promise; - fractionsByOwner: (owner: string, params?: QueryParams) => Promise; - fractionsByClaim: (claimId: string, params?: QueryParams) => Promise; - fractionById: (fractionId: string) => Promise; + graphClient: Client; + claimsByOwner: (owner: string, params?: QueryParams) => Promise; + claimById: (id: string) => Promise; + firstClaims: (params?: QueryParams) => Promise; + fractionsByOwner: (owner: string, params?: QueryParams) => Promise; + fractionsByClaim: (claimId: string, params?: QueryParams) => Promise; + fractionById: (fractionId: string) => Promise; } diff --git a/sdk/test/indexer.test.ts b/sdk/test/indexer.test.ts index 1d6b3f24..cc5d29d3 100644 --- a/sdk/test/indexer.test.ts +++ b/sdk/test/indexer.test.ts @@ -6,12 +6,12 @@ import { HypercertIndexer } from "../src/indexer"; describe("HypercertsIndexer", () => { it("should be able to create a new instance without valid graphName", () => { - const indexer = new HypercertIndexer({ graphName: "hypercerts-testnet" }); + const indexer = new HypercertIndexer({ graphUrl: "https://api.thegraph.com/subgraphs/name/hypercerts-testnet" }); expect(indexer).to.be.an.instanceOf(HypercertIndexer); }); - it("should be able to create a new instance with valid graphName", () => { + it("should be able to create a new instance with valid graphName and url", () => { const indexer = new HypercertIndexer({ graphName: "hypercerts-testnet", graphUrl: "https://api.thegraph.com/subgraphs/name/hypercerts-testnet", diff --git a/sdk/test/setup-env.ts b/sdk/test/setup-env.ts index aa5bf440..d7ea9cce 100644 --- a/sdk/test/setup-env.ts +++ b/sdk/test/setup-env.ts @@ -1,8 +1,5 @@ import dotenv from "dotenv"; import { startProxy } from "@viem/anvil"; -// import fetchMock from "jest-fetch-mock"; - -// fetchMock.enableMocks(); dotenv.config({ path: "./.env" }); diff --git a/sdk/vitest.config.mts b/sdk/vitest.config.mts index 8e1d367d..7c5a8b32 100644 --- a/sdk/vitest.config.mts +++ b/sdk/vitest.config.mts @@ -3,5 +3,6 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { globalSetup: "./test/setup-env.ts", + watch: false, }, }); From 73b06f37656194e7bc157d67b84ff7b2cf40a3b6 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Fri, 8 Dec 2023 20:25:31 +0100 Subject: [PATCH 042/118] Feat/docs updates docusaurs v3 search release (#1226) * chore(bump): docusaurs v3 * feat(docgen): docusaurus pulls SDK docs * feat(version): version 1.0.0 * fix(p.json): updated package-lock * fix(build): remove contract docs build from docs --- contracts/docs/AllowlistMinter.md | 113 - contracts/docs/HypercertMinter.md | 1062 ---- contracts/docs/SemiFungible1155.md | 546 -- contracts/docs/interfaces/IAllowlist.md | 39 - contracts/docs/interfaces/IHypercertToken.md | 194 - contracts/docs/libs/Errors.md | 114 - contracts/hardhat.config.ts | 4 +- contracts/package.json | 2 +- docs/babel.config.js | 3 - docs/babel.config.ts | 3 + docs/docs/developer/allowlists.md | 18 +- .../api/contracts/HypercertTrader.md | 434 -- .../api/contracts/IHypercertMinter.md | 39 - .../v0.8/interfaces/AggregatorV3Interface.md | 77 - .../api/contracts/forge-std/src/console.md | 1 - .../api/contracts/forge-std/src/console2.md | 3 - .../contracts/interfaces/IHypercertTrader.md | 133 - docs/docs/developer/api/index.md | 0 docs/docs/developer/api/sdk/.nojekyll | 1 - docs/docs/developer/api/sdk/README.md | 185 - docs/docs/developer/api/sdk/_category_.yml | 3 + .../developer/api/sdk/classes/ClientError.md | 162 +- .../api/sdk/classes/ConfigurationError.md | 162 +- .../api/sdk/classes/ContractError.md | 197 + .../developer/api/sdk/classes/FetchError.md | 162 +- .../api/sdk/classes/HypercertClient.md | 705 ++- .../api/sdk/classes/HypercertsStorage.md | 209 +- .../api/sdk/classes/InvalidOrMissingError.md | 162 +- .../api/sdk/classes/MalformedDataError.md | 162 +- .../developer/api/sdk/classes/MintingError.md | 162 +- .../developer/api/sdk/classes/StorageError.md | 162 +- .../api/sdk/classes/UnknownSchemaError.md | 162 +- .../api/sdk/classes/UnsupportedChainError.md | 162 +- .../developer/api/sdk/classes/_category_.yml | 2 + .../api/sdk/classes/internal.default-1.md | 278 - .../api/sdk/classes/internal.default-2.md | 131 - .../api/sdk/classes/internal.default.md | 110 - .../developer/api/sdk/index.md} | 100 +- .../api/sdk/interfaces/CustomError.md | 19 +- .../api/sdk/interfaces/DuplicateEvaluation.md | 27 +- .../api/sdk/interfaces/EASEvaluation.md | 27 +- .../api/sdk/interfaces/HypercertClaimdata.md | 33 +- .../interfaces/HypercertClientInterface.md | 268 +- .../sdk/interfaces/HypercertClientMethods.md | 232 +- .../sdk/interfaces/HypercertClientState.md | 33 +- .../interfaces/HypercertEvaluationSchema.md | 24 +- .../interfaces/HypercertIndexerInterface.md | 78 +- .../api/sdk/interfaces/HypercertMetadata.md | 46 +- .../api/sdk/interfaces/HypercertPointer.md | 24 +- .../interfaces/HypercertStorageInterface.md | 27 +- .../api/sdk/interfaces/IPFSEvaluation.md | 21 +- .../sdk/interfaces/SimpleTextEvaluation.md | 24 +- .../api/sdk/interfaces/_category_.yml | 2 + .../interfaces/internal.EvaluatorInterface.md | 43 - .../interfaces/internal.HypercertClaimdata.md | 169 - .../interfaces/internal.HypercertMinter.md | 17 - docs/docs/developer/api/sdk/modules.md | 676 ++- .../developer/api/sdk/modules/internal.md | 307 - docs/docs/developer/burning.md | 2 +- docs/docs/developer/config.md | 55 +- docs/docs/developer/errors.md | 22 +- docs/docs/developer/evaluations.md | 13 - docs/docs/developer/index.md | 49 + docs/docs/developer/minting.md | 4 +- docs/docs/developer/querying.md | 137 +- docs/docs/developer/quickstart-javascript.md | 15 +- docs/docs/developer/split-merge.md | 22 +- docs/docs/developer/supported-networks.md | 12 +- docs/docs/devops/deploy-proxy.md | 26 +- docs/docs/implementation/glossary.md | 34 +- docs/docusaurus.config.js | 130 +- docs/package.json | 28 +- docs/sidebars.js | 31 +- docs/src/components/homepage/homeNavBoxes.js | 108 +- .../version-0.0.1/devops/deploy-proxy.md | 120 - .../version-0.0.1/devops/index.md | 18 - .../version-0.0.1/implementation/glossary.md | 139 - docs/versioned_docs/version-0.3.0/about.md | 24 - .../api/contracts/AllowlistMinter.md | 84 - .../api/contracts/HypercertMinter.md | 870 --- .../api/contracts/SemiFungible1155.md | 457 -- .../api/contracts/interfaces/IAllowlist.md | 29 - .../contracts/interfaces/IHypercertToken.md | 175 - .../developer/api/contracts/libs/Errors.md | 59 - .../version-0.3.0/developer/api/sdk/.nojekyll | 1 - .../developer/api/sdk/classes/ClientError.md | 68 - .../api/sdk/classes/ConfigurationError.md | 66 - .../developer/api/sdk/classes/FetchError.md | 68 - .../api/sdk/classes/HypercertClient.md | 493 -- .../api/sdk/classes/HypercertsStorage.md | 250 - .../api/sdk/classes/InvalidOrMissingError.md | 68 - .../api/sdk/classes/MalformedDataError.md | 68 - .../developer/api/sdk/classes/MintingError.md | 68 - .../developer/api/sdk/classes/StorageError.md | 68 - .../api/sdk/classes/UnknownSchemaError.md | 71 - .../api/sdk/classes/UnsupportedChainError.md | 72 - .../api/sdk/classes/internal.default-1.md | 278 - .../api/sdk/classes/internal.default-2.md | 131 - .../api/sdk/classes/internal.default.md | 110 - .../api/sdk/interfaces/CustomError.md | 39 - .../api/sdk/interfaces/DuplicateEvaluation.md | 56 - .../api/sdk/interfaces/EASEvaluation.md | 56 - .../api/sdk/interfaces/HypercertClaimdata.md | 167 - .../interfaces/HypercertClientInterface.md | 341 -- .../sdk/interfaces/HypercertClientMethods.md | 239 - .../sdk/interfaces/HypercertClientState.md | 68 - .../interfaces/HypercertEvaluationSchema.md | 47 - .../interfaces/HypercertIndexerInterface.md | 176 - .../api/sdk/interfaces/HypercertMetadata.md | 123 - .../api/sdk/interfaces/HypercertPointer.md | 45 - .../interfaces/HypercertStorageInterface.md | 130 - .../api/sdk/interfaces/IPFSEvaluation.md | 34 - .../sdk/interfaces/SimpleTextEvaluation.md | 45 - .../interfaces/internal.EvaluatorInterface.md | 43 - .../interfaces/internal.HypercertClaimdata.md | 169 - .../interfaces/internal.HypercertMinter.md | 17 - .../developer/api/sdk/modules.md | 638 -- .../developer/api/sdk/modules/internal.md | 307 - .../version-0.3.0/developer/burning.md | 12 - .../version-0.3.0/developer/config.md | 112 - .../version-0.3.0/developer/errors.md | 18 - .../version-0.3.0/developer/evaluations.md | 13 - .../version-0.3.0/developer/querying.md | 306 - .../developer/quickstart-javascript.md | 101 - .../version-0.3.0/developer/split-merge.md | 29 - .../developer/supported-networks.md | 13 - .../version-0.3.0/devops/errors.md | 45 - .../version-0.3.0/devops/pause.md | 29 - .../version-0.3.0/devops/plasmic.md | 76 - .../version-0.3.0/devops/setup.md | 41 - .../version-0.3.0/devops/upgrade.md | 35 - docs/versioned_docs/version-0.3.0/faq.md | 139 - .../version-0.3.0/further-resources.md | 37 - .../version-0.3.0/implementation/metadata.md | 188 - .../implementation/token-standard.md | 29 - docs/versioned_docs/version-0.3.0/intro.md | 58 - .../minting-guide/gitcoin-round.md | 166 - .../minting-guide/minting-guide-start.md | 44 - .../minting-guide/step-by-step.md | 130 - .../version-0.3.0/whitepaper/evaluation.md | 23 - .../whitepaper/hypercerts-intro.md | 104 - .../version-0.3.0/whitepaper/ifs.md | 103 - .../version-0.3.0/whitepaper/impact-space.md | 35 - .../whitepaper/retrospective-funding.md | 42 - .../whitepaper/whitepaper-intro.md | 24 - .../version-1.0.0-alpha.0/about.md | 24 - .../developer/allowlists.md | 101 - .../api/contracts/AllowlistMinter.md | 84 - .../api/contracts/HypercertMinter.md | 895 --- .../api/contracts/HypercertTrader.md | 434 -- .../api/contracts/IHypercertMinter.md | 39 - .../api/contracts/SemiFungible1155.md | 457 -- .../v0.8/interfaces/AggregatorV3Interface.md | 77 - .../api/contracts/forge-std/src/console.md | 1 - .../api/contracts/forge-std/src/console2.md | 3 - .../api/contracts/interfaces/IAllowlist.md | 29 - .../contracts/interfaces/IHypercertToken.md | 192 - .../contracts/interfaces/IHypercertTrader.md | 133 - .../developer/api/contracts/libs/Errors.md | 59 - .../api/contracts/protocol/AllowlistMinter.md | 84 - .../api/contracts/protocol/HypercertMinter.md | 895 --- .../contracts/protocol/SemiFungible1155.md | 457 -- .../protocol/interfaces/IAllowlist.md | 29 - .../protocol/interfaces/IHypercertToken.md | 192 - .../api/contracts/protocol/libs/Errors.md | 59 - .../developer/api/sdk/.nojekyll | 1 - .../developer/api/sdk/classes/ClientError.md | 68 - .../api/sdk/classes/ConfigurationError.md | 66 - .../developer/api/sdk/classes/FetchError.md | 68 - .../api/sdk/classes/HypercertClient.md | 493 -- .../api/sdk/classes/HypercertsStorage.md | 250 - .../api/sdk/classes/InvalidOrMissingError.md | 68 - .../api/sdk/classes/MalformedDataError.md | 68 - .../developer/api/sdk/classes/MintingError.md | 68 - .../developer/api/sdk/classes/StorageError.md | 68 - .../api/sdk/classes/UnknownSchemaError.md | 71 - .../api/sdk/classes/UnsupportedChainError.md | 72 - .../api/sdk/classes/internal.default-1.md | 278 - .../api/sdk/classes/internal.default-2.md | 131 - .../api/sdk/classes/internal.default.md | 110 - .../api/sdk/interfaces/CustomError.md | 39 - .../api/sdk/interfaces/DuplicateEvaluation.md | 56 - .../api/sdk/interfaces/EASEvaluation.md | 56 - .../interfaces/HypercertClientInterface.md | 341 -- .../sdk/interfaces/HypercertClientMethods.md | 239 - .../sdk/interfaces/HypercertClientState.md | 68 - .../interfaces/HypercertEvaluationSchema.md | 47 - .../interfaces/HypercertIndexerInterface.md | 176 - .../api/sdk/interfaces/HypercertMetadata.md | 123 - .../api/sdk/interfaces/HypercertPointer.md | 45 - .../interfaces/HypercertStorageInterface.md | 130 - .../api/sdk/interfaces/IPFSEvaluation.md | 34 - .../sdk/interfaces/SimpleTextEvaluation.md | 45 - .../interfaces/internal.EvaluatorInterface.md | 43 - .../interfaces/internal.HypercertClaimdata.md | 169 - .../interfaces/internal.HypercertMinter.md | 17 - .../developer/api/sdk/modules.md | 638 -- .../developer/api/sdk/modules/internal.md | 307 - .../developer/burning.md | 12 - .../version-1.0.0-alpha.0/developer/config.md | 112 - .../version-1.0.0-alpha.0/developer/errors.md | 18 - .../developer/evaluations.md | 13 - .../developer/minting.md | 57 - .../developer/quickstart-solidity.md | 41 - .../developer/split-merge.md | 29 - .../developer/supported-networks.md | 13 - .../devops/deploy-proxy.md | 120 - .../version-1.0.0-alpha.0/devops/errors.md | 45 - .../version-1.0.0-alpha.0/devops/index.md | 18 - .../version-1.0.0-alpha.0/devops/pause.md | 29 - .../version-1.0.0-alpha.0/devops/plasmic.md | 76 - .../version-1.0.0-alpha.0/devops/setup.md | 41 - .../version-1.0.0-alpha.0/devops/upgrade.md | 35 - .../version-1.0.0-alpha.0/faq.md | 139 - .../further-resources.md | 37 - .../implementation/glossary.md | 139 - .../implementation/metadata.md | 188 - .../implementation/token-standard.md | 29 - .../version-1.0.0-alpha.0/intro.md | 58 - .../minting-guide/gitcoin-round.md | 166 - .../minting-guide/minting-guide-start.md | 44 - .../minting-guide/step-by-step.md | 130 - .../whitepaper/evaluation.md | 23 - .../whitepaper/hypercerts-intro.md | 104 - .../version-1.0.0-alpha.0/whitepaper/ifs.md | 103 - .../whitepaper/impact-space.md | 35 - .../whitepaper/retrospective-funding.md | 42 - .../whitepaper/whitepaper-intro.md | 24 - .../version-1.0.0-alpha.1/about.md | 24 - .../developer/allowlists.md | 101 - .../api/contracts/AllowlistMinter.md | 84 - .../api/contracts/HypercertMinter.md | 895 --- .../api/contracts/HypercertTrader.md | 434 -- .../api/contracts/IHypercertMinter.md | 39 - .../api/contracts/SemiFungible1155.md | 457 -- .../v0.8/interfaces/AggregatorV3Interface.md | 77 - .../api/contracts/forge-std/src/console.md | 1 - .../api/contracts/forge-std/src/console2.md | 3 - .../api/contracts/interfaces/IAllowlist.md | 29 - .../contracts/interfaces/IHypercertToken.md | 192 - .../contracts/interfaces/IHypercertTrader.md | 133 - .../developer/api/contracts/libs/Errors.md | 59 - .../marketplace/BatchOrderTypehashRegistry.md | 46 - .../CreatorFeeManagerWithRebates.md | 76 - .../CreatorFeeManagerWithRoyalties.md | 64 - .../contracts/marketplace/CurrencyManager.md | 250 - .../contracts/marketplace/ExecutionManager.md | 751 --- .../marketplace/InheritedStrategy.md | 9 - .../marketplace/LooksRareProtocol.md | 1157 ---- .../api/contracts/marketplace/NonceManager.md | 193 - .../marketplace/ProtocolFeeRecipient.md | 75 - .../contracts/marketplace/StrategyManager.md | 391 -- .../contracts/marketplace/TransferManager.md | 553 -- .../marketplace/TransferSelectorNFT.md | 779 --- .../executionStrategies/BaseStrategy.md | 41 - .../BaseStrategyChainlinkPriceLatency.md | 212 - .../StrategyChainlinkUSDDynamicAsk.md | 342 -- .../StrategyCollectionOffer.md | 127 - .../StrategyDutchAuction.md | 83 - .../StrategyHypercertFractionOffer.md | 123 - .../StrategyItemIdsRange.md | 75 - .../marketplace/helpers/OrderValidatorV2A.md | 215 - .../marketplace/helpers/ProtocolHelpers.md | 159 - .../interfaces/ICreatorFeeManager.md | 60 - .../interfaces/ICurrencyManager.md | 22 - .../interfaces/IExecutionManager.md | 99 - .../interfaces/IImmutableCreate2Factory.md | 41 - .../interfaces/ILooksRareProtocol.md | 157 - .../marketplace/interfaces/INonceManager.md | 53 - .../interfaces/IRoyaltyFeeRegistry.md | 29 - .../marketplace/interfaces/IStrategy.md | 41 - .../interfaces/IStrategyManager.md | 84 - .../interfaces/ITransferManager.md | 111 - .../libraries/CurrencyValidator.md | 7 - .../libraries/LowLevelHypercertCaller.md | 21 - .../MerkleProofCalldataWithNodes.md | 7 - .../OpenZeppelin/MerkleProofMemory.md | 7 - .../marketplace/libraries/OrderStructs.md | 7 - .../api/contracts/protocol/AllowlistMinter.md | 84 - .../api/contracts/protocol/HypercertMinter.md | 895 --- .../contracts/protocol/SemiFungible1155.md | 457 -- .../protocol/interfaces/IAllowlist.md | 29 - .../protocol/interfaces/IHypercertToken.md | 192 - .../api/contracts/protocol/libs/Errors.md | 59 - .../developer/api/sdk/.nojekyll | 1 - .../developer/api/sdk/README.md | 185 - .../developer/api/sdk/classes/ClientError.md | 68 - .../api/sdk/classes/ConfigurationError.md | 66 - .../developer/api/sdk/classes/FetchError.md | 68 - .../api/sdk/classes/HypercertClient.md | 493 -- .../api/sdk/classes/HypercertsStorage.md | 250 - .../api/sdk/classes/InvalidOrMissingError.md | 68 - .../api/sdk/classes/MalformedDataError.md | 68 - .../developer/api/sdk/classes/MintingError.md | 68 - .../developer/api/sdk/classes/StorageError.md | 68 - .../api/sdk/classes/UnknownSchemaError.md | 71 - .../api/sdk/classes/UnsupportedChainError.md | 72 - .../api/sdk/classes/internal.default-1.md | 278 - .../api/sdk/classes/internal.default-2.md | 131 - .../api/sdk/classes/internal.default.md | 110 - .../api/sdk/interfaces/DuplicateEvaluation.md | 56 - .../api/sdk/interfaces/EASEvaluation.md | 56 - .../api/sdk/interfaces/HypercertClaimdata.md | 167 - .../interfaces/HypercertClientInterface.md | 341 -- .../sdk/interfaces/HypercertClientMethods.md | 239 - .../sdk/interfaces/HypercertClientState.md | 68 - .../interfaces/HypercertEvaluationSchema.md | 47 - .../interfaces/HypercertIndexerInterface.md | 176 - .../api/sdk/interfaces/HypercertMetadata.md | 123 - .../api/sdk/interfaces/HypercertPointer.md | 45 - .../api/sdk/interfaces/IPFSEvaluation.md | 34 - .../sdk/interfaces/SimpleTextEvaluation.md | 45 - .../interfaces/internal.EvaluatorInterface.md | 43 - .../interfaces/internal.HypercertClaimdata.md | 169 - .../interfaces/internal.HypercertMinter.md | 17 - .../developer/api/sdk/modules.md | 638 -- .../developer/api/sdk/modules/internal.md | 307 - .../version-1.0.0-alpha.1/developer/errors.md | 18 - .../developer/evaluations.md | 13 - .../developer/minting.md | 57 - .../developer/querying.md | 306 - .../developer/quickstart-javascript.md | 101 - .../developer/quickstart-solidity.md | 41 - .../developer/split-merge.md | 29 - .../developer/supported-networks.md | 13 - .../devops/deploy-proxy.md | 120 - .../version-1.0.0-alpha.1/devops/errors.md | 45 - .../version-1.0.0-alpha.1/devops/index.md | 18 - .../version-1.0.0-alpha.1/devops/pause.md | 29 - .../version-1.0.0-alpha.1/devops/plasmic.md | 76 - .../version-1.0.0-alpha.1/devops/setup.md | 41 - .../version-1.0.0-alpha.1/devops/upgrade.md | 35 - .../version-1.0.0-alpha.1/faq.md | 139 - .../further-resources.md | 37 - .../implementation/glossary.md | 139 - .../implementation/metadata.md | 188 - .../implementation/token-standard.md | 29 - .../version-1.0.0-alpha.1/intro.md | 58 - .../minting-guide/gitcoin-round.md | 166 - .../minting-guide/minting-guide-start.md | 44 - .../minting-guide/step-by-step.md | 130 - .../whitepaper/evaluation.md | 23 - .../whitepaper/hypercerts-intro.md | 104 - .../version-1.0.0-alpha.1/whitepaper/ifs.md | 103 - .../whitepaper/impact-space.md | 35 - .../whitepaper/retrospective-funding.md | 42 - .../whitepaper/whitepaper-intro.md | 24 - .../{version-0.0.1 => version-1.0.0}/about.md | 0 .../developer/allowlists.md | 18 +- .../marketplace/BatchOrderTypehashRegistry.md | 0 .../CreatorFeeManagerWithRebates.md | 0 .../CreatorFeeManagerWithRoyalties.md | 0 .../contracts/marketplace/CurrencyManager.md | 0 .../contracts/marketplace/ExecutionManager.md | 0 .../marketplace/InheritedStrategy.md | 0 .../marketplace/LooksRareProtocol.md | 0 .../api/contracts/marketplace/NonceManager.md | 0 .../marketplace/ProtocolFeeRecipient.md | 0 .../contracts/marketplace/StrategyManager.md | 0 .../contracts/marketplace/TransferManager.md | 0 .../marketplace/TransferSelectorNFT.md | 0 .../executionStrategies/BaseStrategy.md | 0 .../BaseStrategyChainlinkPriceLatency.md | 0 .../StrategyChainlinkUSDDynamicAsk.md | 0 .../StrategyCollectionOffer.md | 0 .../StrategyDutchAuction.md | 0 .../StrategyHypercertFractionOffer.md | 2 +- .../StrategyItemIdsRange.md | 0 .../marketplace/helpers/OrderValidatorV2A.md | 0 .../marketplace/helpers/ProtocolHelpers.md | 0 .../interfaces/ICreatorFeeManager.md | 0 .../interfaces/ICurrencyManager.md | 0 .../interfaces/IExecutionManager.md | 0 .../interfaces/IImmutableCreate2Factory.md | 0 .../interfaces/ILooksRareProtocol.md | 0 .../marketplace/interfaces/INonceManager.md | 0 .../interfaces/IRoyaltyFeeRegistry.md | 0 .../marketplace/interfaces/IStrategy.md | 0 .../interfaces/IStrategyManager.md | 0 .../interfaces/ITransferManager.md | 0 .../libraries/CurrencyValidator.md | 0 .../libraries/LowLevelHypercertCaller.md | 0 .../MerkleProofCalldataWithNodes.md | 0 .../OpenZeppelin/MerkleProofMemory.md | 0 .../marketplace/libraries/OrderStructs.md | 0 .../contracts/protocol}/AllowlistMinter.md | 0 .../contracts/protocol}/HypercertMinter.md | 0 .../contracts/protocol}/SemiFungible1155.md | 0 .../protocol}/interfaces/IAllowlist.md | 0 .../protocol}/interfaces/IHypercertToken.md | 0 .../api/contracts/protocol}/libs/Errors.md | 0 .../version-1.0.0/developer/api/index.md | 0 .../developer/api/sdk/_category_.yml | 3 + .../developer/api/sdk/classes/ClientError.md | 198 + .../api/sdk/classes/ConfigurationError.md | 196 + .../api/sdk/classes/ContractError.md | 197 + .../developer/api/sdk/classes/FetchError.md | 198 + .../api/sdk/classes/HypercertClient.md | 818 +++ .../api/sdk/classes/HypercertsStorage.md | 243 + .../api/sdk/classes/InvalidOrMissingError.md | 198 + .../api/sdk/classes/MalformedDataError.md | 198 + .../developer/api/sdk/classes/MintingError.md | 198 + .../developer/api/sdk/classes/StorageError.md | 198 + .../api/sdk/classes/UnknownSchemaError.md | 201 + .../api/sdk/classes/UnsupportedChainError.md | 202 + .../developer/api/sdk/classes/_category_.yml | 2 + .../developer/api/sdk/index.md} | 100 +- .../api/sdk/interfaces/CustomError.md | 19 +- .../api/sdk/interfaces/DuplicateEvaluation.md | 51 + .../api/sdk/interfaces/EASEvaluation.md | 51 + .../api/sdk/interfaces/HypercertClaimdata.md | 33 +- .../interfaces/HypercertClientInterface.md | 427 ++ .../sdk/interfaces/HypercertClientMethods.md | 319 + .../sdk/interfaces/HypercertClientState.md | 61 + .../interfaces/HypercertEvaluationSchema.md | 43 + .../interfaces/HypercertIndexerInterface.md | 164 + .../api/sdk/interfaces/HypercertMetadata.md | 113 + .../api/sdk/interfaces/HypercertPointer.md | 41 + .../interfaces/HypercertStorageInterface.md | 27 +- .../api/sdk/interfaces/IPFSEvaluation.md | 31 + .../sdk/interfaces/SimpleTextEvaluation.md | 41 + .../api/sdk/interfaces/_category_.yml | 2 + .../developer/api/sdk/modules.md | 818 +++ .../developer/burning.md | 2 +- .../developer/config.md | 55 +- .../version-1.0.0/developer/errors.md | 20 + .../version-1.0.0/developer/index.md | 49 + .../developer/minting.md | 4 +- .../developer/querying.md | 137 +- .../developer/quickstart-javascript.md | 15 +- .../developer/quickstart-solidity.md | 0 .../version-1.0.0/developer/split-merge.md | 15 + .../developer/supported-networks.md | 15 + .../devops/deploy-proxy.md | 26 +- .../devops/errors.md | 0 .../devops/index.md | 0 .../devops/pause.md | 0 .../devops/plasmic.md | 0 .../devops/setup.md | 0 .../devops/upgrade.md | 0 .../{version-0.0.1 => version-1.0.0}/faq.md | 0 .../further-resources.md | 0 .../implementation/glossary.md | 2 +- .../implementation/metadata.md | 0 .../implementation/token-standard.md | 0 .../{version-0.0.1 => version-1.0.0}/intro.md | 0 .../minting-guide/gitcoin-round.md | 0 .../minting-guide/minting-guide-start.md | 0 .../minting-guide/step-by-step.md | 0 .../whitepaper/evaluation.md | 0 .../whitepaper/hypercerts-intro.md | 0 .../whitepaper/ifs.md | 0 .../whitepaper/impact-space.md | 0 .../whitepaper/retrospective-funding.md | 0 .../whitepaper/whitepaper-intro.md | 0 .../version-0.0.1-sidebars.json | 85 - .../version-0.3.0-sidebars.json | 162 - .../version-1.0.0-alpha.0-sidebars.json | 162 - ...ebars.json => version-1.0.0-sidebars.json} | 20 +- docs/versions.json | 3 +- pnpm-lock.yaml | 5113 ++++++++--------- sdk/package.json | 4 - sdk/src/indexer/gql/graphql.ts | 569 -- sdk/src/utils/resolvers.ts | 12 - sdk/test/utils/errors.test.ts | 2 - sdk/typedoc.json | 11 - 466 files changed, 11501 insertions(+), 46056 deletions(-) delete mode 100644 contracts/docs/AllowlistMinter.md delete mode 100644 contracts/docs/HypercertMinter.md delete mode 100644 contracts/docs/SemiFungible1155.md delete mode 100644 contracts/docs/interfaces/IAllowlist.md delete mode 100644 contracts/docs/interfaces/IHypercertToken.md delete mode 100644 contracts/docs/libs/Errors.md delete mode 100644 docs/babel.config.js create mode 100644 docs/babel.config.ts delete mode 100644 docs/docs/developer/api/contracts/HypercertTrader.md delete mode 100644 docs/docs/developer/api/contracts/IHypercertMinter.md delete mode 100644 docs/docs/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md delete mode 100644 docs/docs/developer/api/contracts/forge-std/src/console.md delete mode 100644 docs/docs/developer/api/contracts/forge-std/src/console2.md delete mode 100644 docs/docs/developer/api/contracts/interfaces/IHypercertTrader.md create mode 100644 docs/docs/developer/api/index.md delete mode 100644 docs/docs/developer/api/sdk/.nojekyll delete mode 100644 docs/docs/developer/api/sdk/README.md create mode 100644 docs/docs/developer/api/sdk/_category_.yml create mode 100644 docs/docs/developer/api/sdk/classes/ContractError.md create mode 100644 docs/docs/developer/api/sdk/classes/_category_.yml delete mode 100644 docs/docs/developer/api/sdk/classes/internal.default-1.md delete mode 100644 docs/docs/developer/api/sdk/classes/internal.default-2.md delete mode 100644 docs/docs/developer/api/sdk/classes/internal.default.md rename docs/{versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md => docs/developer/api/sdk/index.md} (50%) create mode 100644 docs/docs/developer/api/sdk/interfaces/_category_.yml delete mode 100644 docs/docs/developer/api/sdk/interfaces/internal.EvaluatorInterface.md delete mode 100644 docs/docs/developer/api/sdk/interfaces/internal.HypercertClaimdata.md delete mode 100644 docs/docs/developer/api/sdk/interfaces/internal.HypercertMinter.md delete mode 100644 docs/docs/developer/api/sdk/modules/internal.md delete mode 100644 docs/docs/developer/evaluations.md create mode 100644 docs/docs/developer/index.md delete mode 100644 docs/versioned_docs/version-0.0.1/devops/deploy-proxy.md delete mode 100644 docs/versioned_docs/version-0.0.1/devops/index.md delete mode 100644 docs/versioned_docs/version-0.0.1/implementation/glossary.md delete mode 100644 docs/versioned_docs/version-0.3.0/about.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/contracts/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/contracts/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/contracts/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/contracts/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/contracts/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/contracts/libs/Errors.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/.nojekyll delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/ClientError.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/ConfigurationError.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/FetchError.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/HypercertClient.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/HypercertsStorage.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/InvalidOrMissingError.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/MalformedDataError.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/MintingError.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/StorageError.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/UnknownSchemaError.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/UnsupportedChainError.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default-1.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default-2.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/CustomError.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/DuplicateEvaluation.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/EASEvaluation.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientInterface.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientMethods.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientState.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertMetadata.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertPointer.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertStorageInterface.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/IPFSEvaluation.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.HypercertMinter.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/modules.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/api/sdk/modules/internal.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/burning.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/config.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/errors.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/evaluations.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/querying.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/quickstart-javascript.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/split-merge.md delete mode 100644 docs/versioned_docs/version-0.3.0/developer/supported-networks.md delete mode 100644 docs/versioned_docs/version-0.3.0/devops/errors.md delete mode 100644 docs/versioned_docs/version-0.3.0/devops/pause.md delete mode 100644 docs/versioned_docs/version-0.3.0/devops/plasmic.md delete mode 100644 docs/versioned_docs/version-0.3.0/devops/setup.md delete mode 100644 docs/versioned_docs/version-0.3.0/devops/upgrade.md delete mode 100644 docs/versioned_docs/version-0.3.0/faq.md delete mode 100644 docs/versioned_docs/version-0.3.0/further-resources.md delete mode 100644 docs/versioned_docs/version-0.3.0/implementation/metadata.md delete mode 100644 docs/versioned_docs/version-0.3.0/implementation/token-standard.md delete mode 100644 docs/versioned_docs/version-0.3.0/intro.md delete mode 100644 docs/versioned_docs/version-0.3.0/minting-guide/gitcoin-round.md delete mode 100644 docs/versioned_docs/version-0.3.0/minting-guide/minting-guide-start.md delete mode 100644 docs/versioned_docs/version-0.3.0/minting-guide/step-by-step.md delete mode 100644 docs/versioned_docs/version-0.3.0/whitepaper/evaluation.md delete mode 100644 docs/versioned_docs/version-0.3.0/whitepaper/hypercerts-intro.md delete mode 100644 docs/versioned_docs/version-0.3.0/whitepaper/ifs.md delete mode 100644 docs/versioned_docs/version-0.3.0/whitepaper/impact-space.md delete mode 100644 docs/versioned_docs/version-0.3.0/whitepaper/retrospective-funding.md delete mode 100644 docs/versioned_docs/version-0.3.0/whitepaper/whitepaper-intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/about.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/faq.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/about.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/faq.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/about.md (100%) rename docs/versioned_docs/{version-0.3.0 => version-1.0.0}/developer/allowlists.md (91%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/CurrencyManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/ExecutionManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/InheritedStrategy.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/LooksRareProtocol.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/NonceManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/ProtocolFeeRecipient.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/StrategyManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/TransferManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/TransferSelectorNFT.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md (78%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/interfaces/IExecutionManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/interfaces/INonceManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/interfaces/IStrategy.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/interfaces/IStrategyManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/interfaces/ITransferManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/libraries/CurrencyValidator.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/contracts/marketplace/libraries/OrderStructs.md (100%) rename docs/{docs/developer/api/contracts => versioned_docs/version-1.0.0/developer/api/contracts/protocol}/AllowlistMinter.md (100%) rename docs/{docs/developer/api/contracts => versioned_docs/version-1.0.0/developer/api/contracts/protocol}/HypercertMinter.md (100%) rename docs/{docs/developer/api/contracts => versioned_docs/version-1.0.0/developer/api/contracts/protocol}/SemiFungible1155.md (100%) rename docs/{docs/developer/api/contracts => versioned_docs/version-1.0.0/developer/api/contracts/protocol}/interfaces/IAllowlist.md (100%) rename docs/{docs/developer/api/contracts => versioned_docs/version-1.0.0/developer/api/contracts/protocol}/interfaces/IHypercertToken.md (100%) rename docs/{docs/developer/api/contracts => versioned_docs/version-1.0.0/developer/api/contracts/protocol}/libs/Errors.md (100%) create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/index.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/_category_.yml create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ClientError.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ConfigurationError.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ContractError.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/FetchError.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertClient.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertsStorage.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/InvalidOrMissingError.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MalformedDataError.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MintingError.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/StorageError.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnknownSchemaError.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnsupportedChainError.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/_category_.yml rename docs/versioned_docs/{version-0.3.0/developer/api/sdk/README.md => version-1.0.0/developer/api/sdk/index.md} (50%) rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.0.0}/developer/api/sdk/interfaces/CustomError.md (70%) create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/DuplicateEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/EASEvaluation.md rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/api/sdk/interfaces/HypercertClaimdata.md (65%) create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientInterface.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientMethods.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientState.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertMetadata.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertPointer.md rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.0.0}/developer/api/sdk/interfaces/HypercertStorageInterface.md (74%) create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/IPFSEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/_category_.yml create mode 100644 docs/versioned_docs/version-1.0.0/developer/api/sdk/modules.md rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.0.0}/developer/burning.md (84%) rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.0.0}/developer/config.md (53%) create mode 100644 docs/versioned_docs/version-1.0.0/developer/errors.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/index.md rename docs/versioned_docs/{version-0.3.0 => version-1.0.0}/developer/minting.md (95%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/querying.md (66%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.0.0}/developer/quickstart-javascript.md (88%) rename docs/versioned_docs/{version-0.3.0 => version-1.0.0}/developer/quickstart-solidity.md (100%) create mode 100644 docs/versioned_docs/version-1.0.0/developer/split-merge.md create mode 100644 docs/versioned_docs/version-1.0.0/developer/supported-networks.md rename docs/versioned_docs/{version-0.3.0 => version-1.0.0}/devops/deploy-proxy.md (80%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/devops/errors.md (100%) rename docs/versioned_docs/{version-0.3.0 => version-1.0.0}/devops/index.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/devops/pause.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/devops/plasmic.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/devops/setup.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/devops/upgrade.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/faq.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/further-resources.md (100%) rename docs/versioned_docs/{version-0.3.0 => version-1.0.0}/implementation/glossary.md (96%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/implementation/metadata.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/implementation/token-standard.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/intro.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/minting-guide/gitcoin-round.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/minting-guide/minting-guide-start.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/minting-guide/step-by-step.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/whitepaper/evaluation.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/whitepaper/hypercerts-intro.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/whitepaper/ifs.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/whitepaper/impact-space.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/whitepaper/retrospective-funding.md (100%) rename docs/versioned_docs/{version-0.0.1 => version-1.0.0}/whitepaper/whitepaper-intro.md (100%) delete mode 100644 docs/versioned_sidebars/version-0.0.1-sidebars.json delete mode 100644 docs/versioned_sidebars/version-0.3.0-sidebars.json delete mode 100644 docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json rename docs/versioned_sidebars/{version-1.0.0-alpha.1-sidebars.json => version-1.0.0-sidebars.json} (86%) delete mode 100644 sdk/src/utils/resolvers.ts delete mode 100644 sdk/typedoc.json diff --git a/contracts/docs/AllowlistMinter.md b/contracts/docs/AllowlistMinter.md deleted file mode 100644 index 068d0fe7..00000000 --- a/contracts/docs/AllowlistMinter.md +++ /dev/null @@ -1,113 +0,0 @@ -# AllowlistMinter - -*bitbeckers* - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - - - -## Methods - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| _0 | uint256 | undefined | -| _1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | bool | undefined | - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| isAllowed | bool | undefined | - - - -## Events - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - - - -## Errors - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - - - - - - - diff --git a/contracts/docs/HypercertMinter.md b/contracts/docs/HypercertMinter.md deleted file mode 100644 index b4ee2c71..00000000 --- a/contracts/docs/HypercertMinter.md +++ /dev/null @@ -1,1062 +0,0 @@ -# HypercertMinter - -*bitbeckers* - -> Contract for managing hypercert claims and whitelists - -Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. - -*Wrapper contract to expose and chain functions.* - -## Methods - -### __SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - - - -*see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }* - - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - - - -*See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - - - -*See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | uint256[] | undefined | - -### batchMintClaimsFromAllowlists - -```solidity -function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable -``` - -Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - -*Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| proofs | bytes32[][] | undefined | -| claimIDs | uint256[] | undefined | -| units | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address _account, uint256 _tokenID) external nonpayable -``` - -Burn a claimtoken - -*see {IHypercertToken}* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| _account | address | undefined | -| _tokenID | uint256 | undefined | - -### createAllowlist - -```solidity -function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Register a claim and the whitelist for minting token(s) belonging to that claim - -*Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| units | uint256 | undefined | -| merkleRoot | bytes32 | undefined | -| _uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| _0 | uint256 | undefined | -| _1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | bool | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - - - -*see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }* - - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| isAllowed | bool | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - - - -*See {IERC1155-isApprovedForAll}.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | bool | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable -``` - -Merge the value of tokens belonging to the same claim - -*see {IHypercertToken}* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| _account | address | undefined | -| _fractionIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint a semi-fungible token for the impact claim referenced via `uri` - -*see {IHypercertToken}* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| units | uint256 | undefined | -| _uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimFromAllowlist - -```solidity -function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable -``` - -Mint a semi-fungible token representing a fraction of the claim - -*Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| units | uint256 | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint semi-fungible tokens for the impact claim referenced via `uri` - -*see {IHypercertToken}* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| _uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### name - -```solidity -function name() external view returns (string) -``` - - - - - - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | string | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - - - -*Returns the address of the current owner.* - - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -READ - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _owner | address | undefined | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - - - - -### paused - -```solidity -function paused() external view returns (bool) -``` - - - -*Returns true if the contract is paused, and false otherwise.* - - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - - - -*Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.* - - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | bytes32 | undefined | - -### readTransferRestriction - -```solidity -function readTransferRestriction(uint256 tokenID) external view returns (string) -``` - -TRANSFER RESTRICTIONS - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | string | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - - - -*Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.* - - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - - - -*See {IERC1155-safeBatchTransferFrom}.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - - - -*See {IERC1155-safeTransferFrom}.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - - - -*See {IERC1155-setApprovalForAll}.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| operator | address | undefined | -| approved | bool | undefined | - -### splitFraction - -```solidity -function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable -``` - -Split a claimtokens value into parts with summed value equal to the original - -*see {IHypercertToken}* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| _account | address | undefined | -| _tokenID | uint256 | undefined | -| _newFractions | uint256[] | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - - - -*See {IERC165-supportsInterface}.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - - - -*Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| newOwner | address | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - - - -*see {IHypercertToken}* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - - - -*see {IHypercertToken}* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| units | uint256 | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - - - - - - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - - - -*Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - - - -*Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - - - -*see { IHypercertMetadata}* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _uri | string | undefined | - - - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| beacon `indexed` | address | undefined | - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| version | uint8 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | - - - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - - - - - - -### ArraySize - -```solidity -error ArraySize() -``` - - - - - - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - - - - - - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - - - - - - -### Invalid - -```solidity -error Invalid() -``` - - - - - - -### NotAllowed - -```solidity -error NotAllowed() -``` - - - - - - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - - - - - - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - - - - - - -### TypeMismatch - -```solidity -error TypeMismatch() -``` - - - - - - - diff --git a/contracts/docs/SemiFungible1155.md b/contracts/docs/SemiFungible1155.md deleted file mode 100644 index 5767a620..00000000 --- a/contracts/docs/SemiFungible1155.md +++ /dev/null @@ -1,546 +0,0 @@ -# SemiFungible1155 - -*bitbeckers* - -> Contract for minting semi-fungible EIP1155 tokens - -Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` - -*Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)* - -## Methods - -### __SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - - - -*see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }* - - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - - - -*See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - - - -*See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - - - -*See {IERC1155-isApprovedForAll}.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - - - -*Returns the address of the current owner.* - - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -READ - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _owner | address | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - - - -*Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.* - - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - - - -*Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.* - - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - - - -*See {IERC1155-safeBatchTransferFrom}.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - - - -*See {IERC1155-safeTransferFrom}.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - - - -*See {IERC1155-setApprovalForAll}.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| operator | address | undefined | -| approved | bool | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - - - -*See {IERC165-supportsInterface}.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - - - -*Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| newOwner | address | undefined | - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - - - -*Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - - - -*Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - - - -*see { openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol }Always returns the URI for the basetype so that it's managed in one place.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _uri | string | undefined | - - - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - - - -*Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| version | uint8 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - - - -*Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | - - - diff --git a/contracts/docs/interfaces/IAllowlist.md b/contracts/docs/interfaces/IAllowlist.md deleted file mode 100644 index cbdf10e1..00000000 --- a/contracts/docs/interfaces/IAllowlist.md +++ /dev/null @@ -1,39 +0,0 @@ -# IAllowlist - -*bitbeckers* - -> Interface for allowlist - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - - - -## Methods - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) -``` - - - - - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| proof | bytes32[] | undefined | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| isAllowed | bool | undefined | - - - - diff --git a/contracts/docs/interfaces/IHypercertToken.md b/contracts/docs/interfaces/IHypercertToken.md deleted file mode 100644 index f1d1ad9a..00000000 --- a/contracts/docs/interfaces/IHypercertToken.md +++ /dev/null @@ -1,194 +0,0 @@ -# IHypercertToken - -*bitbeckers* - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - - - -## Methods - -### burnFraction - -```solidity -function burnFraction(address account, uint256 tokenID) external nonpayable -``` - -Operator must be allowed by `creator` and the token must represent the total amount of available units. - -*Function to burn the token at `tokenID` for `account`* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| tokenID | uint256 | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address account, uint256[] tokenIDs) external nonpayable -``` - -Tokens that have been merged are burned. - -*Function called to merge tokens within `tokenIDs`.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - - - -*Function called to store a claim referenced via `uri` with a maximum number of fractions `units`.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| units | uint256 | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - - - -*Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### splitFraction - -```solidity -function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable -``` - -The sum of `values` must equal the current value of `_tokenID`. - -*Function called to split `tokenID` owned by `account` into units declared in `values`.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| tokenID | uint256 | undefined | -| _values | uint256[] | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - - - -*Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - - - -*Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| units | uint256 | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string metadata) -``` - - - -*Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -|---|---|---| -| metadata | string | undefined | - - - -## Events - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - - - -*Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`.* - -#### Parameters - -| Name | Type | Description | -|---|---|---| -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | - - - diff --git a/contracts/docs/libs/Errors.md b/contracts/docs/libs/Errors.md deleted file mode 100644 index 52031321..00000000 --- a/contracts/docs/libs/Errors.md +++ /dev/null @@ -1,114 +0,0 @@ -# Errors - -*bitbeckers* - - - - - - - - - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - - - - - - -### ArraySize - -```solidity -error ArraySize() -``` - - - - - - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - - - - - - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - - - - - - -### Invalid - -```solidity -error Invalid() -``` - - - - - - -### NotAllowed - -```solidity -error NotAllowed() -``` - - - - - - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - - - - - - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - - - - - - -### TypeMismatch - -```solidity -error TypeMismatch() -``` - - - - - - - diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 9958691f..e4bb0221 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -127,8 +127,8 @@ const config: HardhatUserConfig = { }, dodoc: { runOnCompile: true, - include: ["src"], - freshOutput: false, + include: ["src/marketplace", "src/protocol"], + freshOutput: true, outputDir: "../docs/docs/developer/api/contracts", }, etherscan: { diff --git a/contracts/package.json b/contracts/package.json index 2b7597b1..bd79c463 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -97,7 +97,7 @@ "deploy:marketplace:sepolia": "forge script scripts/deployment/Deployment.s.sol:Deployment --broadcast --verify --fork-url sepolia", "deploy:marketplace:test": "pnpm deploy:marketplace:goerli && pnpm deploy:marketplace:sepolia", "deploy:marketplace:dryrun": "forge script scripts/deployment/Deployment.s.sol:Deployment --fork-url", - "docs": "hardhat dodoc", + "docs": "pnpm hardhat dodoc", "lint": "pnpm lint:sol && pnpm prettier:check", "lint:sol": "forge fmt --check && solhint \"./{src,test/foundry/protocol,test/foundry/marketplace}/**/*.sol\"", "prepublish": "pnpm build", diff --git a/docs/babel.config.js b/docs/babel.config.js deleted file mode 100644 index e00595da..00000000 --- a/docs/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], -}; diff --git a/docs/babel.config.ts b/docs/babel.config.ts new file mode 100644 index 00000000..4e1c4976 --- /dev/null +++ b/docs/babel.config.ts @@ -0,0 +1,3 @@ +export const config = { + presets: "@docusaurus/core/lib/babel/preset", +}; diff --git a/docs/docs/developer/allowlists.md b/docs/docs/developer/allowlists.md index bc65b116..61200236 100644 --- a/docs/docs/developer/allowlists.md +++ b/docs/docs/developer/allowlists.md @@ -16,8 +16,8 @@ import { } from "@hypercerts-org/sdk"; const allowlist: Allowlist = [ - { address: "0x123", units: 100 }, - { address: "0xabc", units: 100 }, + { address: "0x123....asfcnaes", units: 100n }, + { address: "0xabc....w2dwqwef", units: 100n }, ]; ``` @@ -25,10 +25,10 @@ Then, call `createAllowlist` with the metadata and allowlist. ```js const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; +const totalUnits = 10000n; const transferRestrictions = TransferRestrictions.FromCreatorOnly -const { claimId } = await hypercerts.createAllowlist({ +const txHash = await hypercerts.createAllowlist({ allowList, metaData, totalUnits, @@ -50,11 +50,11 @@ Finally, the method invokes the `createAllowlist` function on the contract with Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: -| Variable | Type | Source | -| -------- | ------------ | ------------ | -| claimId | BigNumberish | Hypercert ID | -| units | BigNumberish | Allowlist | -| proof | BytesLike[] | Merkle tree | +| Variable | Type | Source | +| -------- | ------ | ------------- | ----------- | +| claimId | bigint | Hypercert ID | +| units | bigint | Allowlist | +| proof | `(Hex | ByteArray)[]` | Merkle tree | We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. diff --git a/docs/docs/developer/api/contracts/HypercertTrader.md b/docs/docs/developer/api/contracts/HypercertTrader.md deleted file mode 100644 index e31e8840..00000000 --- a/docs/docs/developer/api/contracts/HypercertTrader.md +++ /dev/null @@ -1,434 +0,0 @@ -# HypercertTrader - -_bitbeckers_ - -> Contract for managing hypercert trades - -Implementation of the HypercertTrader Interface - -## Methods - -### batchBuyUnits - -```solidity -function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable -``` - -This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. - -_Buys Hypercert tokens from multiple existing offers in a single transaction._ - -#### Parameters - -| Name | Type | Description | -| ------------------- | --------- | -------------------------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerIDs | uint256[] | The list of IDs of the offers to buy from. | -| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | -| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | -| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | - -### buyUnits - -```solidity -function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable -``` - -This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. - -_Buys Hypercert tokens from an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | --------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerID | uint256 | The ID of the offer to buy from. | -| unitAmount | uint256 | The number of units to buy. | -| buyToken | address | The address of the token used for payment. | -| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | - -### cancelOffer - -```solidity -function cancelOffer(uint256 offerID) external nonpayable -``` - -This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. - -_Cancels an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ------------------------------ | -| offerID | uint256 | The ID of the offer to cancel. | - -### createOffer - -```solidity -function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | -------------------------------- | ----------- | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| unitsForSale | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -### getOffer - -```solidity -function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------- | ----------- | -| \_0 | IHypercertTrader.Offer | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### offers - -```solidity -function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | --------------------------------- | ----------- | -| offerer | address | undefined | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| unitsAvailable | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| offerType | enum IHypercertTrader.OfferType | undefined | -| status | enum IHypercertTrader.OfferStatus | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### totalUnitsForSale - -```solidity -function totalUnitsForSale(address, uint256) external view returns (uint256) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OfferCancelled - -```solidity -event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| creator `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OfferCreated - -```solidity -event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| offerer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Trade - -```solidity -event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| seller `indexed` | address | undefined | -| buyer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID | uint256 | undefined | -| unitsBought | uint256 | undefined | -| buyToken | address | undefined | -| tokenAmountPerUnit | uint256 | undefined | -| offerID | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -## Errors - -### InvalidBuy - -```solidity -error InvalidBuy(string) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### InvalidOffer - -```solidity -error InvalidOffer(string) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### NotAllowed - -```solidity -error NotAllowed() -``` diff --git a/docs/docs/developer/api/contracts/IHypercertMinter.md b/docs/docs/developer/api/contracts/IHypercertMinter.md deleted file mode 100644 index 13a84632..00000000 --- a/docs/docs/developer/api/contracts/IHypercertMinter.md +++ /dev/null @@ -1,39 +0,0 @@ -# IHypercertMinter - -## Methods - -### ownerOf - -```solidity -function ownerOf(uint256 id) external view returns (address) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 id) external view returns (uint256) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | diff --git a/docs/docs/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/docs/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md deleted file mode 100644 index 6be07157..00000000 --- a/docs/docs/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md +++ /dev/null @@ -1,77 +0,0 @@ -# AggregatorV3Interface - -## Methods - -### decimals - -```solidity -function decimals() external view returns (uint8) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ----- | ----------- | -| \_0 | uint8 | undefined | - -### description - -```solidity -function description() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### getRoundData - -```solidity -function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -#### Parameters - -| Name | Type | Description | -| --------- | ------ | ----------- | -| \_roundId | uint80 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| roundId | uint80 | undefined | -| answer | int256 | undefined | -| startedAt | uint256 | undefined | -| updatedAt | uint256 | undefined | -| answeredInRound | uint80 | undefined | - -### latestRoundData - -```solidity -function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -#### Returns - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| roundId | uint80 | undefined | -| answer | int256 | undefined | -| startedAt | uint256 | undefined | -| updatedAt | uint256 | undefined | -| answeredInRound | uint80 | undefined | - -### version - -```solidity -function version() external view returns (uint256) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | diff --git a/docs/docs/developer/api/contracts/forge-std/src/console.md b/docs/docs/developer/api/contracts/forge-std/src/console.md deleted file mode 100644 index 8d14ad8c..00000000 --- a/docs/docs/developer/api/contracts/forge-std/src/console.md +++ /dev/null @@ -1 +0,0 @@ -# console diff --git a/docs/docs/developer/api/contracts/forge-std/src/console2.md b/docs/docs/developer/api/contracts/forge-std/src/console2.md deleted file mode 100644 index cb666cd3..00000000 --- a/docs/docs/developer/api/contracts/forge-std/src/console2.md +++ /dev/null @@ -1,3 +0,0 @@ -# console2 - -_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/docs/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/docs/developer/api/contracts/interfaces/IHypercertTrader.md deleted file mode 100644 index 06fb700c..00000000 --- a/docs/docs/developer/api/contracts/interfaces/IHypercertTrader.md +++ /dev/null @@ -1,133 +0,0 @@ -# IHypercertTrader - -_bitbeckers_ - -> Interface for hypercert token trading - -This interface declares the required functionality to interact with the hypercert marketplace - -## Methods - -### batchBuyUnits - -```solidity -function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable -``` - -_Buys Hypercert tokens from multiple existing offers in a single transaction._ - -#### Parameters - -| Name | Type | Description | -| ------------------- | --------- | -------------------------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerIDs | uint256[] | The list of IDs of the offers to buy from. | -| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | -| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | -| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | - -### buyUnits - -```solidity -function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable -``` - -_Buys Hypercert tokens from an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | --------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerID | uint256 | The ID of the offer to buy from. | -| unitAmount | uint256 | The number of units to buy. | -| buyToken | address | The address of the token used for payment. | -| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | - -### cancelOffer - -```solidity -function cancelOffer(uint256 offerID) external nonpayable -``` - -_Cancels an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ------------------------------ | -| offerID | uint256 | The ID of the offer to cancel. | - -### createOffer - -```solidity -function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | -------------------------------- | ----------- | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| units | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -## Events - -### OfferCancelled - -```solidity -event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| creator `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OfferCreated - -```solidity -event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| offerer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### Trade - -```solidity -event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| seller `indexed` | address | undefined | -| buyer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID | uint256 | undefined | -| unitsBought | uint256 | undefined | -| buyToken | address | undefined | -| tokenAmountPerUnit | uint256 | undefined | -| offerID | uint256 | undefined | diff --git a/docs/docs/developer/api/index.md b/docs/docs/developer/api/index.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/docs/developer/api/sdk/.nojekyll b/docs/docs/developer/api/sdk/.nojekyll deleted file mode 100644 index e2ac6616..00000000 --- a/docs/docs/developer/api/sdk/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/docs/developer/api/sdk/README.md b/docs/docs/developer/api/sdk/README.md deleted file mode 100644 index b1434ab0..00000000 --- a/docs/docs/developer/api/sdk/README.md +++ /dev/null @@ -1,185 +0,0 @@ -Hypercerts SDK Documentation / [Exports](modules.md) - -# Hypercert SDK - -## Quickstart Guide - -1. Install the SDK using npm or yarn: - -```bash -npm install @hypercerts-org/sdk -``` - -or - -```bash - yarn add @hypercerts-org/sdk -``` - -2. Import the SDK into your project: - -```bash -import { HypercertClient } from "@hypercerts-org/sdk"; -``` - -3. Create a new instance of the HypercertClient class with your configuration options: - -```js -const client = new HypercertClient({ - chainId: 5, - provider, - signer, - nftStorageToken, - web3StorageToken, -}); -``` - -> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in -> [read-only mode](#read-only-mode) - -4. Use the client object to interact with the Hypercert network. - -For example, you can use the `client.mintClaim` method to create a new claim: - -```js -const tx = await client.mintClaim( - metaData, - totalUnits, - transferRestriction, - overrides, -); -``` - -This will validate the metadata, store it on IPFS, create a new hypercert on-chain and return a transaction receipt. - -You can also use the client to query the subgraph and retrieve which claims an address owns: - -```js -const claims = await client.indexer.fractionsByOwner(owner), -``` - -For more information on how to use the SDK, check out the -[developer documentation](https://hypercerts.org/docs/developer/) and the -[Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet). - -That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. Don't forget to set your -environment variables for your NFT.storage and web3.storage API keys in your .env file. - -## Config - -The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check -the environment variables. - -### Read-only mode - -The SDK client will be in read-only mode if any of the following conditions are true: - -- The client was initialized without a signer or provider. -- The client was initialized with a provider but not a signer. -- The client was initialized with a signer but not a provider. -- The contract address is not set. -- The storage layer is in read-only mode. - -If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a -warning message will be logged indicating that the client is in read-only mode. - -### Defaults - -The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief -explanation of each constant: - -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - -`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object -contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. - -For example: - -```json -{ - "5": { - "chainId": 5, - "chainName": "goerli", - "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "graphName": "hypercerts-testnet" - } -} -``` - -### Client config properties - -| \| Property | Type | Description | -| ------------------ | -------------------- | -------------------------------------- | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | -| `graphName` | `string` | The name of the Gsubgraph to use. | -| `provider` | `providers.Provider` | A custom provider to use. | -| `signer` | `Signer` | A custom signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | - -### Environment variables - -To determine the missing configuration values the SDK defaults to the following environment variables: - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - -### Logging - -The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level -determines which log messages are printed to the console. By default, the logger is configured to log messages with a -level of info or higher to the console. - -## Client modules - -The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient -has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, -HypercertIndexer, and HypercertMinter classes, respectively. - -```js -const { - client: { storage }, -} = new HypercertClient({}); -``` - -The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and -NFT.storage. It is used by the HypercertClient to store metadata when creating new Hypercerts. - -```js -const { - client: { indexer }, -} = new HypercertClient({}); -``` - -The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. -It is used by the HypercertClient to retrieve event-based data via the subgraph - -```js -const { - client: { contract }, -} = new HypercertClient({}); -``` - -Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used -by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. - -By providing instances of these classes through the storage, indexer, and contract getters, the HypercertClient allows -developers to easily interact with the various components of the Hypercert system. For example, a developer could use -the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based -on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the -contract. diff --git a/docs/docs/developer/api/sdk/_category_.yml b/docs/docs/developer/api/sdk/_category_.yml new file mode 100644 index 00000000..5c4b05b1 --- /dev/null +++ b/docs/docs/developer/api/sdk/_category_.yml @@ -0,0 +1,3 @@ +label: "API SDK" +position: 0 +collapsed: false \ No newline at end of file diff --git a/docs/docs/developer/api/sdk/classes/ClientError.md b/docs/docs/developer/api/sdk/classes/ClientError.md index 89f2105f..a0c9b619 100644 --- a/docs/docs/developer/api/sdk/classes/ClientError.md +++ b/docs/docs/developer/api/sdk/classes/ClientError.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError - -# Class: ClientError +--- +id: "ClientError" +title: "Class: ClientError" +sidebar_label: "ClientError" +sidebar_position: 0 +custom_edit_url: null +--- An error that is caused by a problem with the client. @@ -14,21 +18,11 @@ An error that is caused by a problem with the client. - [`CustomError`](../interfaces/CustomError.md) -## Table of contents - -### Constructors - -- [constructor](ClientError.md#constructor) - -### Properties - -- [payload](ClientError.md#payload) - ## Constructors ### constructor -• **new ClientError**(`message`, `payload?`) +• **new ClientError**(`message`, `payload?`): [`ClientError`](ClientError.md) Creates a new instance of the ClientError class. @@ -39,16 +33,62 @@ Creates a new instance of the ClientError class. | `message` | `string` | The error message. | | `payload?` | `Object` | Additional error payload. | +#### Returns + +[`ClientError`](ClientError.md) + #### Overrides Error.constructor #### Defined in -[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) +sdk/src/types/errors.ts:27 ## Properties +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + ### payload • `Optional` **payload**: `Object` @@ -65,4 +105,94 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) +sdk/src/types/errors.ts:20 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/docs/developer/api/sdk/classes/ConfigurationError.md b/docs/docs/developer/api/sdk/classes/ConfigurationError.md index 03813867..aa28ba72 100644 --- a/docs/docs/developer/api/sdk/classes/ConfigurationError.md +++ b/docs/docs/developer/api/sdk/classes/ConfigurationError.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError - -# Class: ConfigurationError +--- +id: "ConfigurationError" +title: "Class: ConfigurationError" +sidebar_label: "ConfigurationError" +sidebar_position: 0 +custom_edit_url: null +--- The configuration was invalid @@ -14,21 +18,11 @@ The configuration was invalid - [`CustomError`](../interfaces/CustomError.md) -## Table of contents - -### Constructors - -- [constructor](ConfigurationError.md#constructor) - -### Properties - -- [payload](ConfigurationError.md#payload) - ## Constructors ### constructor -• **new ConfigurationError**(`message`, `payload?`) +• **new ConfigurationError**(`message`, `payload?`): [`ConfigurationError`](ConfigurationError.md) #### Parameters @@ -37,16 +31,62 @@ The configuration was invalid | `message` | `string` | | `payload?` | `Object` | +#### Returns + +[`ConfigurationError`](ConfigurationError.md) + #### Overrides Error.constructor #### Defined in -[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) +sdk/src/types/errors.ts:188 ## Properties +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + ### payload • `Optional` **payload**: `Object` @@ -63,4 +103,94 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) +sdk/src/types/errors.ts:187 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/docs/developer/api/sdk/classes/ContractError.md b/docs/docs/developer/api/sdk/classes/ContractError.md new file mode 100644 index 00000000..8561bfa7 --- /dev/null +++ b/docs/docs/developer/api/sdk/classes/ContractError.md @@ -0,0 +1,197 @@ +--- +id: "ContractError" +title: "Class: ContractError" +sidebar_label: "ContractError" +sidebar_position: 0 +custom_edit_url: null +--- + +An error that is returned by the contract + +## Hierarchy + +- `Error` + + ↳ **`ContractError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Constructors + +### constructor + +• **new ContractError**(`errorName?`, `payload?`): [`ContractError`](ContractError.md) + +#### Parameters + +| Name | Type | +| :------------- | :------------------------------ | +| `errorName?` | `string` | +| `payload?` | `Object` | +| `payload.data` | \`0x$\{string}\` \| `BaseError` | + +#### Returns + +[`ContractError`](ContractError.md) + +#### Overrides + +Error.constructor + +#### Defined in + +sdk/src/types/errors.ts:43 + +## Properties + +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +sdk/src/types/errors.ts:41 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/docs/developer/api/sdk/classes/FetchError.md b/docs/docs/developer/api/sdk/classes/FetchError.md index d4c9f7c9..75c55a8c 100644 --- a/docs/docs/developer/api/sdk/classes/FetchError.md +++ b/docs/docs/developer/api/sdk/classes/FetchError.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError - -# Class: FetchError +--- +id: "FetchError" +title: "Class: FetchError" +sidebar_label: "FetchError" +sidebar_position: 0 +custom_edit_url: null +--- Fails fetching a remote resource @@ -14,21 +18,11 @@ Fails fetching a remote resource - [`CustomError`](../interfaces/CustomError.md) -## Table of contents - -### Constructors - -- [constructor](FetchError.md#constructor) - -### Properties - -- [payload](FetchError.md#payload) - ## Constructors ### constructor -• **new FetchError**(`message`, `payload?`) +• **new FetchError**(`message`, `payload?`): [`FetchError`](FetchError.md) Creates a new instance of the FetchError class. @@ -39,16 +33,62 @@ Creates a new instance of the FetchError class. | `message` | `string` | The error message. | | `payload?` | `Object` | Additional error payload. | +#### Returns + +[`FetchError`](FetchError.md) + #### Overrides Error.constructor #### Defined in -[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) +sdk/src/types/errors.ts:65 ## Properties +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + ### payload • `Optional` **payload**: `Object` @@ -65,4 +105,94 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) +sdk/src/types/errors.ts:58 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/docs/developer/api/sdk/classes/HypercertClient.md b/docs/docs/developer/api/sdk/classes/HypercertClient.md index a5a0e900..0ef53914 100644 --- a/docs/docs/developer/api/sdk/classes/HypercertClient.md +++ b/docs/docs/developer/api/sdk/classes/HypercertClient.md @@ -1,129 +1,164 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient - -# Class: HypercertClient - -Hypercerts client factory - -**`Dev`** - -Creates a Hypercerts client instance +--- +id: "HypercertClient" +title: "Class: HypercertClient" +sidebar_label: "HypercertClient" +sidebar_position: 0 +custom_edit_url: null +--- -**`Notice`** +The `HypercertClient` is a core class in the hypercerts SDK, providing a high-level interface to interact with the hypercerts system. -The client is readonly if no signer is set or if the contract address is not set +It encapsulates the logic for storage, evaluation, indexing, and wallet interactions, abstracting the complexity and providing a simple API for users. +The client is read-only if the storage is read-only (no nft.storage/web3.storage keys) or if no walletClient was found. -**`Param`** +**`Example`** -Hypercerts client configuration +```ts +const config: Partial = { + chain: { id: 5 }, +}; +const client = new HypercertClient(config); +``` **`Param`** -Hypercerts storage object +The configuration options for the client. ## Implements - [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) -## Table of contents - -### Constructors - -- [constructor](HypercertClient.md#constructor) - -### Properties - -- [\_config](HypercertClient.md#_config) -- [\_contract](HypercertClient.md#_contract) -- [\_evaluator](HypercertClient.md#_evaluator) -- [\_indexer](HypercertClient.md#_indexer) -- [\_operator](HypercertClient.md#_operator) -- [\_storage](HypercertClient.md#_storage) -- [readonly](HypercertClient.md#readonly) - -### Accessors - -- [contract](HypercertClient.md#contract) -- [indexer](HypercertClient.md#indexer) -- [storage](HypercertClient.md#storage) - -### Methods - -- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClient.md#burnclaimfraction) -- [checkWritable](HypercertClient.md#checkwritable) -- [createAllowlist](HypercertClient.md#createallowlist) -- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) -- [mintClaim](HypercertClient.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClient.md#splitclaimunits) - ## Constructors ### constructor -• **new HypercertClient**(`config?`) +• **new HypercertClient**(`config`): [`HypercertClient`](HypercertClient.md) Creates a new instance of the `HypercertClient` class. +This constructor takes a `config` parameter that is used to configure the client. The `config` parameter should be a `HypercertClientConfig` object. If the public client cannot be connected, it throws a `ClientError`. + #### Parameters | Name | Type | Description | | :------- | :------------------------------------------------------------------------- | :---------------------------------------- | | `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | -#### Defined in - -[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) +#### Returns -## Properties +[`HypercertClient`](HypercertClient.md) -### \_config +**`Throws`** -• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) +Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) +sdk/src/client.ts:55 ---- +## Properties -### \_contract +### \_config -• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) +• `Readonly` **\_config**: `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> #### Defined in -[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) +sdk/src/client.ts:38 --- ### \_evaluator -• `Private` **\_evaluator**: [`default`](internal.default.md) +• `Private` `Optional` **\_evaluator**: `HypercertEvaluator` #### Defined in -[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) +sdk/src/client.ts:41 --- ### \_indexer -• `Private` **\_indexer**: [`default`](internal.default-1.md) +• `Private` **\_indexer**: `HypercertIndexer` #### Defined in -[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) +sdk/src/client.ts:42 --- -### \_operator - -• `Private` **\_operator**: `Provider` \| `Signer` +### \_publicClient + +• `Private` **\_publicClient**: `Object` + +#### Type declaration + +| Name | Type | Description | +| :------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `account` | `undefined` | The Account of the Client. | +| `batch?` | \{ `multicall?`: `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } } | Flags for batch settings. | +| `batch.multicall?` | `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } | Toggle to enable `eth_call` multicall aggregation. | +| `cacheTime` | `number` | Time (in ms) that cached data will remain in memory. | +| `call` | (`parameters`: `CallParameters`<`undefined` \| `Chain`\>) => `Promise`<`CallReturnType`\> | Executes a new message call immediately without submitting a transaction to the network. - Docs: https://viem.sh/docs/actions/public/call.html - JSON-RPC Methods: [`eth_call`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const data = await client.call({ account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', }) ` | +| `chain` | `undefined` \| `Chain` | Chain for the client. | +| `createBlockFilter` | () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"block"` }\> | Creates a Filter to listen for new block hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createBlockFilter.html - JSON-RPC Methods: [`eth_newBlockFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newBlockFilter) **`Example`** `ts import { createPublicClient, createBlockFilter, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await createBlockFilter(client) // { id: "0x345a6572337856574a76364e457a4366", type: 'block' } ` | +| `createContractEventFilter` | (`args`: `CreateContractEventFilterParameters`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`CreateContractEventFilterReturnType`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Creates a Filter to retrieve event logs that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html) or [`getFilterLogs`](https://viem.sh/docs/actions/public/getFilterLogs.html). - Docs: https://viem.sh/docs/contract/createContractEventFilter.html **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createContractEventFilter({ abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']), }) ` | +| `createEventFilter` | (`args?`: `CreateEventFilterParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`, `_EventName`, `_Args`\>) => `Promise`<\{ [K in keyof Filter<"event", TAbiEvents, \_EventName, \_Args, TStrict, TFromBlock, TToBlock\>]: Filter<"event", TAbiEvents, ... 4 more ..., TToBlock\>[K]; }\> | Creates a [`Filter`](https://viem.sh/docs/glossary/types.html#filter) to listen for new events that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createEventFilter.html - JSON-RPC Methods: [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2', }) ` | +| `createPendingTransactionFilter` | () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"transaction"` }\> | Creates a Filter to listen for new pending transaction hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createPendingTransactionFilter.html - JSON-RPC Methods: [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createPendingTransactionFilter() // { id: "0x345a6572337856574a76364e457a4366", type: 'transaction' } ` | +| `estimateContractGas` | (`args`: `EstimateContractGasParameters`<`TAbi`, `TFunctionName`, `TChain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> | Estimates the gas required to successfully execute a contract write function call. - Docs: https://viem.sh/docs/contract/estimateContractGas.html **`Remarks`** Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`estimateGas` action](https://viem.sh/docs/actions/public/estimateGas.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gas = await client.estimateContractGas({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint() public']), functionName: 'mint', account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', }) ` | +| `estimateFeesPerGas` | (`args?`: `EstimateFeesPerGasParameters`<`undefined` \| `Chain`, `TChainOverride`, `TType`\>) => `Promise`<`EstimateFeesPerGasReturnType`\> | Returns an estimate for the fees per gas for a transaction to be included in the next block. - Docs: https://viem.sh/docs/actions/public/estimateFeesPerGas.html **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const maxPriorityFeePerGas = await client.estimateFeesPerGas() // { maxFeePerGas: ..., maxPriorityFeePerGas: ... } ` | +| `estimateGas` | (`args`: `EstimateGasParameters`<`undefined` \| `Chain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> | Estimates the gas necessary to complete a transaction without submitting it to the network. - Docs: https://viem.sh/docs/actions/public/estimateGas.html - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas) **`Example`** `ts import { createPublicClient, http, parseEther } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gasEstimate = await client.estimateGas({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: parseEther('1'), }) ` | +| `estimateMaxPriorityFeePerGas` | (`args?`: \{ `chain`: `null` \| `TChainOverride` }) => `Promise`<`bigint`\> | Returns an estimate for the max priority fee per gas (in wei) for a transaction to be included in the next block. - Docs: https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas.html **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const maxPriorityFeePerGas = await client.estimateMaxPriorityFeePerGas() // 10000000n ` | +| `extend` | (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, `PublicActions`<`Transport`, `undefined` \| `Chain`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, \{ [K in keyof client]: client[K]; } & `PublicActions`<`Transport`, `undefined` \| `Chain`\>\> | - | +| `getBalance` | (`args`: `GetBalanceParameters`) => `Promise`<`bigint`\> | Returns the balance of an address in wei. - Docs: https://viem.sh/docs/actions/public/getBalance.html - JSON-RPC Methods: [`eth_getBalance`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance) **`Remarks`** You can convert the balance to ether units with [`formatEther`](https://viem.sh/docs/utilities/formatEther.html). `ts const balance = await getBalance(client, { address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', blockTag: 'safe' }) const balanceAsEther = formatEther(balance) // "6.942" ` **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const balance = await client.getBalance({ address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) // 10000000000000000000000n (wei) ` | +| `getBlock` | (`args?`: `GetBlockParameters`<`TIncludeTransactions`, `TBlockTag`\>) => `Promise`<`GetBlockReturnType`<`undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>\> | Returns information about a block at a block number, hash, or tag. - Docs: https://viem.sh/docs/actions/public/getBlock.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/fetching-blocks - JSON-RPC Methods: - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) for `blockNumber` & `blockTag`. - Calls [`eth_getBlockByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbyhash) for `blockHash`. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const block = await client.getBlock() ` | +| `getBlockNumber` | (`args?`: `GetBlockNumberParameters`) => `Promise`<`bigint`\> | Returns the number of the most recent block seen. - Docs: https://viem.sh/docs/actions/public/getBlockNumber.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/fetching-blocks - JSON-RPC Methods: [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const blockNumber = await client.getBlockNumber() // 69420n ` | +| `getBlockTransactionCount` | (`args?`: `GetBlockTransactionCountParameters`) => `Promise`<`number`\> | Returns the number of Transactions at a block number, hash, or tag. - Docs: https://viem.sh/docs/actions/public/getBlockTransactionCount.html - JSON-RPC Methods: - Calls [`eth_getBlockTransactionCountByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbynumber) for `blockNumber` & `blockTag`. - Calls [`eth_getBlockTransactionCountByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbyhash) for `blockHash`. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const count = await client.getBlockTransactionCount() ` | +| `getBytecode` | (`args`: `GetBytecodeParameters`) => `Promise`<`GetBytecodeReturnType`\> | Retrieves the bytecode at an address. - Docs: https://viem.sh/docs/contract/getBytecode.html - JSON-RPC Methods: [`eth_getCode`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getcode) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const code = await client.getBytecode({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', }) ` | +| `getChainId` | () => `Promise`<`number`\> | Returns the chain ID associated with the current network. - Docs: https://viem.sh/docs/actions/public/getChainId.html - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const chainId = await client.getChainId() // 1 ` | +| `getContractEvents` | (`args`: `GetContractEventsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetContractEventsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs emitted by a contract. - Docs: https://viem.sh/docs/actions/public/getContractEvents.html - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { wagmiAbi } from './abi' const client = createPublicClient({ chain: mainnet, transport: http(), }) const logs = await client.getContractEvents(client, { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: wagmiAbi, eventName: 'Transfer' }) ` | +| `getEnsAddress` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; coinType?: number \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsAddressReturnType`\> | Gets address for ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsAddress.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensAddress = await client.getEnsAddress({ name: normalize('wagmi-dev.eth'), }) // '0xd2135CfB216b74109775236E36d4b433F1DF507B' ` | +| `getEnsAvatar` | (`args`: \{ name: string; blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; universalResolverAddress?: \`0x$\{string}\` \| undefined; gatewayUrls?: AssetGatewayUrls \| undefined; }) => `Promise`<`GetEnsAvatarReturnType`\> | Gets the avatar of an ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsAvatar.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText.html) with `key` set to `'avatar'`. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensAvatar = await client.getEnsAvatar({ name: normalize('wagmi-dev.eth'), }) // 'https://ipfs.io/ipfs/Qma8mnp6xV3J2cRNf3mTth5C8nV11CAnceVinc3y8jSbio' ` | +| `getEnsName` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; address: \`0x$\{string}\`; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsNameReturnType`\> | Gets primary name for specified address. - Docs: https://viem.sh/docs/ens/actions/getEnsName.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `reverse(bytes)` on ENS Universal Resolver Contract to "reverse resolve" the address to the primary ENS name. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensName = await client.getEnsName({ address: '0xd2135CfB216b74109775236E36d4b433F1DF507B', }) // 'wagmi-dev.eth' ` | +| `getEnsResolver` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<\`0x$\{string}\`\> | Gets resolver for ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsResolver.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `findResolver(bytes)` on ENS Universal Resolver Contract to retrieve the resolver of an ENS name. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const resolverAddress = await client.getEnsResolver({ name: normalize('wagmi-dev.eth'), }) // '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41' ` | +| `getEnsText` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; key: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsTextReturnType`\> | Gets a text record for specified ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsResolver.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const twitterRecord = await client.getEnsText({ name: normalize('wagmi-dev.eth'), key: 'com.twitter', }) // 'wagmi_sh' ` | +| `getFeeHistory` | (`args`: `GetFeeHistoryParameters`) => `Promise`<`GetFeeHistoryReturnType`\> | Returns a collection of historical gas information. - Docs: https://viem.sh/docs/actions/public/getFeeHistory.html - JSON-RPC Methods: [`eth_feeHistory`](https://docs.alchemy.com/reference/eth-feehistory) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const feeHistory = await client.getFeeHistory({ blockCount: 4, rewardPercentiles: [25, 75], }) ` | +| `getFilterChanges` | (`args`: `GetFilterChangesParameters`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterChangesReturnType`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of logs or hashes based on a [Filter](/docs/glossary/terms#filter) since the last time it was called. - Docs: https://viem.sh/docs/actions/public/getFilterChanges.html - JSON-RPC Methods: [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges) **`Remarks`** A Filter can be created from the following actions: - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter.html) - [`createContractEventFilter`](https://viem.sh/docs/contract/createContractEventFilter.html) - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter.html) - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter.html) Depending on the type of filter, the return value will be different: - If the filter was created with `createContractEventFilter` or `createEventFilter`, it returns a list of logs. - If the filter was created with `createPendingTransactionFilter`, it returns a list of transaction hashes. - If the filter was created with `createBlockFilter`, it returns a list of block hashes. **`Example`** `ts // Blocks import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createBlockFilter() const hashes = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Contract Events import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createContractEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']), eventName: 'Transfer', }) const logs = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Raw Events import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'), }) const logs = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Transactions import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createPendingTransactionFilter() const hashes = await client.getFilterChanges({ filter }) ` | +| `getFilterLogs` | (`args`: `GetFilterLogsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterLogsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs since the filter was created. - Docs: https://viem.sh/docs/actions/public/getFilterLogs.html - JSON-RPC Methods: [`eth_getFilterLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterlogs) **`Remarks`** `getFilterLogs` is only compatible with **event filters**. **`Example`** `ts import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'), }) const logs = await client.getFilterLogs({ filter }) ` | +| `getGasPrice` | () => `Promise`<`bigint`\> | Returns the current price of gas (in wei). - Docs: https://viem.sh/docs/actions/public/getGasPrice.html - JSON-RPC Methods: [`eth_gasPrice`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gasprice) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gasPrice = await client.getGasPrice() ` | +| `getLogs` | (`args?`: `GetLogsParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetLogsReturnType`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs matching the provided parameters. - Docs: https://viem.sh/docs/actions/public/getLogs.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/filters-and-logs/event-logs - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) **`Example`** `ts import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const logs = await client.getLogs() ` | +| `getProof` | (`args`: `GetProofParameters`) => `Promise`<`GetProofReturnType`\> | Returns the account and storage values of the specified account including the Merkle-proof. - Docs: https://viem.sh/docs/actions/public/getProof.html - JSON-RPC Methods: - Calls [`eth_getProof`](https://eips.ethereum.org/EIPS/eip-1186) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const block = await client.getProof({ address: '0x...', storageKeys: ['0x...'], }) ` | +| `getStorageAt` | (`args`: `GetStorageAtParameters`) => `Promise`<`GetStorageAtReturnType`\> | Returns the value from a storage slot at a given address. - Docs: https://viem.sh/docs/contract/getStorageAt.html - JSON-RPC Methods: [`eth_getStorageAt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { getStorageAt } from 'viem/contract' const client = createPublicClient({ chain: mainnet, transport: http(), }) const code = await client.getStorageAt({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', slot: toHex(0), }) ` | +| `getTransaction` | (`args`: `GetTransactionParameters`<`TBlockTag`\>) => `Promise`<`GetTransactionReturnType`<`undefined` \| `Chain`, `TBlockTag`\>\> | Returns information about a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) given a hash or block identifier. - Docs: https://viem.sh/docs/actions/public/getTransaction.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionByHash) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transaction = await client.getTransaction({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `getTransactionConfirmations` | (`args`: `GetTransactionConfirmationsParameters`<`undefined` \| `Chain`\>) => `Promise`<`bigint`\> | Returns the number of blocks passed (confirmations) since the transaction was processed on a block. - Docs: https://viem.sh/docs/actions/public/getTransactionConfirmations.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionConfirmations`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionConfirmations) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const confirmations = await client.getTransactionConfirmations({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `getTransactionCount` | (`args`: `GetTransactionCountParameters`) => `Promise`<`number`\> | Returns the number of [Transactions](https://viem.sh/docs/glossary/terms.html#transaction) an Account has broadcast / sent. - Docs: https://viem.sh/docs/actions/public/getTransactionCount.html - JSON-RPC Methods: [`eth_getTransactionCount`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactioncount) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionCount = await client.getTransactionCount({ address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) ` | +| `getTransactionReceipt` | (`args`: `GetTransactionReceiptParameters`) => `Promise`<`TransactionReceipt`\> | Returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) hash. - Docs: https://viem.sh/docs/actions/public/getTransactionReceipt.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionReceipt = await client.getTransactionReceipt({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `key` | `string` | A key for the client. | +| `multicall` | (`args`: `MulticallParameters`<`TContracts`, `TAllowFailure`\>) => `Promise`<`MulticallReturnType`<`TContracts`, `TAllowFailure`\>\> | Similar to [`readContract`](https://viem.sh/docs/contract/readContract.html), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall). - Docs: https://viem.sh/docs/contract/multicall.html **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const abi = parseAbi([ 'function balanceOf(address) view returns (uint256)', 'function totalSupply() view returns (uint256)', ]) const result = await client.multicall({ contracts: [ { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi, functionName: 'balanceOf', args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'], }, { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi, functionName: 'totalSupply', }, ], }) // [{ result: 424122n, status: 'success' }, { result: 1000000n, status: 'success' }] ` | +| `name` | `string` | A name for the client. | +| `pollingInterval` | `number` | Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. | +| `prepareTransactionRequest` | (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> | Prepares a transaction request for signing. - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest.html **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` | +| `readContract` | (`args`: `ReadContractParameters`<`TAbi`, `TFunctionName`\>) => `Promise`<`ReadContractReturnType`<`TAbi`, `TFunctionName`\>\> | Calls a read-only function on a contract, and returns the response. - Docs: https://viem.sh/docs/contract/readContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/reading-contracts **`Remarks`** A "read-only" function (constant function) on a Solidity contract is denoted by a `view` or `pure` keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas. Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' import { readContract } from 'viem/contract' const client = createPublicClient({ chain: mainnet, transport: http(), }) const result = await client.readContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function balanceOf(address) view returns (uint256)']), functionName: 'balanceOf', args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'], }) // 424122n ` | +| `request` | `EIP1193RequestFn`<`PublicRpcSchema`\> | Request function wrapped with friendly error handling | +| `sendRawTransaction` | (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> | Sends a **signed** transaction to the network - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction.html - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' import { sendRawTransaction } from 'viem/wallet' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendRawTransaction({ serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33' }) ` | +| `simulateContract` | (`args`: `SimulateContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>) => `Promise`<`SimulateContractReturnType`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>\> | Simulates/validates a contract interaction. This is useful for retrieving **return data** and **revert reasons** of contract write functions. - Docs: https://viem.sh/docs/contract/simulateContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/writing-to-contracts **`Remarks`** This function does not require gas to execute and _**does not**_ change the state of the blockchain. It is almost identical to [`readContract`](https://viem.sh/docs/contract/readContract.html), but also supports contract write functions. Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const result = await client.simulateContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32) view returns (uint32)']), functionName: 'mint', args: ['69420'], account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) ` | +| `transport` | `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> | The RPC transport | +| `type` | `string` | The type of client. | +| `uid` | `string` | A unique ID for the client. | +| `uninstallFilter` | (`args`: `UninstallFilterParameters`) => `Promise`<`boolean`\> | Destroys a Filter that was created from one of the following Actions: - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter.html) - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter.html) - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter.html) - Docs: https://viem.sh/docs/actions/public/uninstallFilter.html - JSON-RPC Methods: [`eth_uninstallFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_uninstallFilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { createPendingTransactionFilter, uninstallFilter } from 'viem/public' const filter = await client.createPendingTransactionFilter() const uninstalled = await client.uninstallFilter({ filter }) // true ` | +| `verifyMessage` | (`args`: `VerifyMessageParameters`) => `Promise`<`boolean`\> | - | +| `verifyTypedData` | (`args`: `VerifyTypedDataParameters`) => `Promise`<`boolean`\> | - | +| `waitForTransactionReceipt` | (`args`: `WaitForTransactionReceiptParameters`<`undefined` \| `Chain`\>) => `Promise`<`TransactionReceipt`\> | Waits for the [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) to be included on a [Block](https://viem.sh/docs/glossary/terms.html#block) (one confirmation), and then returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt). If the Transaction reverts, then the action will throw an error. - Docs: https://viem.sh/docs/actions/public/waitForTransactionReceipt.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/sending-transactions - JSON-RPC Methods: - Polls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) on each block until it has been processed. - If a Transaction has been replaced: - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) and extracts the transactions - Checks if one of the Transactions is a replacement - If so, calls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt). **`Remarks`** The `waitForTransactionReceipt` action additionally supports Replacement detection (e.g. sped up Transactions). Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel). Transactions are replaced when they are sent from the same nonce. There are 3 types of Transaction Replacement reasons: - `repriced`: The gas price has been modified (e.g. different `maxFeePerGas`) - `cancelled`: The Transaction has been cancelled (e.g. `value === 0n`) - `replaced`: The Transaction has been replaced (e.g. different `value` or `data`) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionReceipt = await client.waitForTransactionReceipt({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `watchBlockNumber` | (`args`: `WatchBlockNumberParameters`) => `WatchBlockNumberReturnType` | Watches and returns incoming block numbers. - Docs: https://viem.sh/docs/actions/public/watchBlockNumber.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/watching-blocks - JSON-RPC Methods: - When `poll: true`, calls [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchBlockNumber({ onBlockNumber: (blockNumber) => console.log(blockNumber), }) ` | +| `watchBlocks` | (`args`: `WatchBlocksParameters`<`Transport`, `undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>) => `WatchBlocksReturnType` | Watches and returns information for incoming blocks. - Docs: https://viem.sh/docs/actions/public/watchBlocks.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/watching-blocks - JSON-RPC Methods: - When `poll: true`, calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getBlockByNumber) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchBlocks({ onBlock: (block) => console.log(block), }) ` | +| `watchContractEvent` | (`args`: `WatchContractEventParameters`<`TAbi`, `TEventName`, `TStrict`\>) => `WatchContractEventReturnType` | Watches and returns emitted contract event logs. - Docs: https://viem.sh/docs/contract/watchContractEvent.html **`Remarks`** This Action will batch up all the event logs found within the [`pollingInterval`](https://viem.sh/docs/contract/watchContractEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/contract/watchContractEvent.html#onLogs). `watchContractEvent` will attempt to create an [Event Filter](https://viem.sh/docs/contract/createContractEventFilter.html) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchContractEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs.html) instead. **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = client.watchContractEvent({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['event Transfer(address indexed from, address indexed to, uint256 value)']), eventName: 'Transfer', args: { from: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b' }, onLogs: (logs) => console.log(logs), }) ` | +| `watchEvent` | (`args`: `WatchEventParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`\>) => `WatchEventReturnType` | Watches and returns emitted [Event Logs](https://viem.sh/docs/glossary/terms.html#event-log). - Docs: https://viem.sh/docs/actions/public/watchEvent.html - JSON-RPC Methods: - **RPC Provider supports `eth_newFilter`:** - Calls [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) to create a filter (called on initialize). - On a polling interval, it will call [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges). - **RPC Provider does not support `eth_newFilter`:** - Calls [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) for each block between the polling interval. **`Remarks`** This Action will batch up all the Event Logs found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/actions/public/watchEvent.html#onLogs). `watchEvent` will attempt to create an [Event Filter](https://viem.sh/docs/actions/public/createEventFilter.html) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs.html) instead. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = client.watchEvent({ onLogs: (logs) => console.log(logs), }) ` | +| `watchPendingTransactions` | (`args`: `WatchPendingTransactionsParameters`<`Transport`\>) => `WatchPendingTransactionsReturnType` | Watches and returns pending transaction hashes. - Docs: https://viem.sh/docs/actions/public/watchPendingTransactions.html - JSON-RPC Methods: - When `poll: true` - Calls [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) to initialize the filter. - Calls [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getFilterChanges) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newPendingTransactions"` event. **`Remarks`** This Action will batch up all the pending transactions found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchPendingTransactions.html#pollinginterval-optional), and invoke them via [`onTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions.html#ontransactions). **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchPendingTransactions({ onTransactions: (hashes) => console.log(hashes), }) ` | #### Defined in -[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) +sdk/src/client.ts:43 --- @@ -133,7 +168,51 @@ Creates a new instance of the `HypercertClient` class. #### Defined in -[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) +sdk/src/client.ts:39 + +--- + +### \_walletClient + +• `Private` `Optional` **\_walletClient**: `Object` + +#### Type declaration + +| Name | Type | Description | +| :-------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `account` | `undefined` \| `Account` | The Account of the Client. | +| `addChain` | (`args`: `AddChainParameters`) => `Promise`<`void`\> | Adds an EVM chain to the wallet. - Docs: https://viem.sh/docs/actions/wallet/addChain.html - JSON-RPC Methods: [`eth_addEthereumChain`](https://eips.ethereum.org/EIPS/eip-3085) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { optimism } from 'viem/chains' const client = createWalletClient({ transport: custom(window.ethereum), }) await client.addChain({ chain: optimism }) ` | +| `batch?` | \{ `multicall?`: `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } } | Flags for batch settings. | +| `batch.multicall?` | `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } | Toggle to enable `eth_call` multicall aggregation. | +| `cacheTime` | `number` | Time (in ms) that cached data will remain in memory. | +| `chain` | `undefined` \| `Chain` | Chain for the client. | +| `deployContract` | (`args`: `DeployContractParameters`<`TAbi`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Deploys a contract to the network, given bytecode and constructor arguments. - Docs: https://viem.sh/docs/contract/deployContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/deploying-contracts **`Example`** `ts import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const hash = await client.deployContract({ abi: [], account: '0x…, bytecode: '0x608060405260405161083e38038061083e833981016040819052610...', }) ` | +| `extend` | (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, \{ [K in keyof client]: client[K]; } & `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\> | - | +| `getAddresses` | () => `Promise`<`GetAddressesReturnType`\> | Returns a list of account addresses owned by the wallet or client. - Docs: https://viem.sh/docs/actions/wallet/getAddresses.html - JSON-RPC Methods: [`eth_accounts`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_accounts) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const accounts = await client.getAddresses() ` | +| `getChainId` | () => `Promise`<`number`\> | Returns the chain ID associated with the current network. - Docs: https://viem.sh/docs/actions/public/getChainId.html - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid) **`Example`** `ts import { createWalletClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const chainId = await client.getChainId() // 1 ` | +| `getPermissions` | () => `Promise`<`GetPermissionsReturnType`\> | Gets the wallets current permissions. - Docs: https://viem.sh/docs/actions/wallet/getPermissions.html - JSON-RPC Methods: [`wallet_getPermissions`](https://eips.ethereum.org/EIPS/eip-2255) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const permissions = await client.getPermissions() ` | +| `key` | `string` | A key for the client. | +| `name` | `string` | A name for the client. | +| `pollingInterval` | `number` | Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. | +| `prepareTransactionRequest` | (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> | Prepares a transaction request for signing. - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest.html **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` | +| `request` | `EIP1193RequestFn`<`WalletRpcSchema`\> | Request function wrapped with friendly error handling | +| `requestAddresses` | () => `Promise`<`RequestAddressesReturnType`\> | Requests a list of accounts managed by a wallet. - Docs: https://viem.sh/docs/actions/wallet/requestAddresses.html - JSON-RPC Methods: [`eth_requestAccounts`](https://eips.ethereum.org/EIPS/eip-1102) Sends a request to the wallet, asking for permission to access the user's accounts. After the user accepts the request, it will return a list of accounts (addresses). This API can be useful for dapps that need to access the user's accounts in order to execute transactions or interact with smart contracts. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const accounts = await client.requestAddresses() ` | +| `requestPermissions` | (`args`: \{ [x: string]: Record; eth_accounts: Record; }) => `Promise`<`RequestPermissionsReturnType`\> | Requests permissions for a wallet. - Docs: https://viem.sh/docs/actions/wallet/requestPermissions.html - JSON-RPC Methods: [`wallet_requestPermissions`](https://eips.ethereum.org/EIPS/eip-2255) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const permissions = await client.requestPermissions({ eth_accounts: {} }) ` | +| `sendRawTransaction` | (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> | Sends a **signed** transaction to the network - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction.html - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' import { sendRawTransaction } from 'viem/wallet' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendRawTransaction({ serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33' }) ` | +| `sendTransaction` | (`args`: `SendTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Creates, signs, and sends a new transaction to the network. - Docs: https://viem.sh/docs/actions/wallet/sendTransaction.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/sending-transactions - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_sendTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendtransaction) - Local Accounts: [`eth_sendRawTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendrawtransaction) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendTransaction({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: 1000000000000000000n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const hash = await client.sendTransaction({ to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: 1000000000000000000n, }) ` | +| `signMessage` | (`args`: `SignMessageParameters`<`undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | Calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191): `keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))`. - Docs: https://viem.sh/docs/actions/wallet/signMessage.html - JSON-RPC Methods: - JSON-RPC Accounts: [`personal_sign`](https://docs.metamask.io/guide/signing-data.html#personal-sign) - Local Accounts: Signs locally. No JSON-RPC request. With the calculated signature, you can: - use [`verifyMessage`](https://viem.sh/docs/utilities/verifyMessage.html) to verify the signature, - use [`recoverMessageAddress`](https://viem.sh/docs/utilities/recoverMessageAddress.html) to recover the signing address from a signature. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const signature = await client.signMessage({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', message: 'hello world', }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const signature = await client.signMessage({ message: 'hello world', }) ` | +| `signTransaction` | (`args`: `SignTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Signs a transaction. - Docs: https://viem.sh/docs/actions/wallet/signTransaction.html - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_signTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) - Local Accounts: Signs locally. No JSON-RPC request. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) const signature = await client.signTransaction(request) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) const signature = await client.signTransaction(request) ` | +| `signTypedData` | (`args`: `SignTypedDataParameters`<`TTypedData`, `TPrimaryType`, `undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | Signs typed data and calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191): `keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))`. - Docs: https://viem.sh/docs/actions/wallet/signTypedData.html - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_signTypedData_v4`](https://docs.metamask.io/guide/signing-data.html#signtypeddata-v4) - Local Accounts: Signs locally. No JSON-RPC request. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const signature = await client.signTypedData({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', domain: { name: 'Ether Mail', version: '1', chainId: 1, verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', }, types: { Person: [ { name: 'name', type: 'string' }, { name: 'wallet', type: 'address' }, ], Mail: [ { name: 'from', type: 'Person' }, { name: 'to', type: 'Person' }, { name: 'contents', type: 'string' }, ], }, primaryType: 'Mail', message: { from: { name: 'Cow', wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', }, to: { name: 'Bob', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', }, contents: 'Hello, Bob!', }, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const signature = await client.signTypedData({ domain: { name: 'Ether Mail', version: '1', chainId: 1, verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', }, types: { Person: [ { name: 'name', type: 'string' }, { name: 'wallet', type: 'address' }, ], Mail: [ { name: 'from', type: 'Person' }, { name: 'to', type: 'Person' }, { name: 'contents', type: 'string' }, ], }, primaryType: 'Mail', message: { from: { name: 'Cow', wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', }, to: { name: 'Bob', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', }, contents: 'Hello, Bob!', }, }) ` | +| `switchChain` | (`args`: `SwitchChainParameters`) => `Promise`<`void`\> | Switch the target chain in a wallet. - Docs: https://viem.sh/docs/actions/wallet/switchChain.html - JSON-RPC Methods: [`eth_switchEthereumChain`](https://eips.ethereum.org/EIPS/eip-3326) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet, optimism } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) await client.switchChain({ id: optimism.id }) ` | +| `transport` | `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> | The RPC transport | +| `type` | `string` | The type of client. | +| `uid` | `string` | A unique ID for the client. | +| `watchAsset` | (`args`: `WatchAssetParams`) => `Promise`<`boolean`\> | Adds an EVM chain to the wallet. - Docs: https://viem.sh/docs/actions/wallet/watchAsset.html - JSON-RPC Methods: [`eth_switchEthereumChain`](https://eips.ethereum.org/EIPS/eip-747) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const success = await client.watchAsset({ type: 'ERC20', options: { address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', decimals: 18, symbol: 'WETH', }, }) ` | +| `writeContract` | (`args`: `WriteContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Executes a write function on a contract. - Docs: https://viem.sh/docs/contract/writeContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/writing-to-contracts A "write" function on a Solidity contract modifies the state of the blockchain. These types of functions require gas to be executed, and hence a [Transaction](https://viem.sh/docs/glossary/terms.html) is needed to be broadcast in order to change the state. Internally, uses a [Wallet Client](https://viem.sh/docs/clients/wallet.html) to call the [`sendTransaction` action](https://viem.sh/docs/actions/wallet/sendTransaction.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **Warning: The `write` internally sends a transaction – it does not validate if the contract write will succeed (the contract may throw an error). It is highly recommended to [simulate the contract write with `contract.simulate`](https://viem.sh/docs/contract/writeContract.html#usage) before you execute it.** **`Example`** `ts import { createWalletClient, custom, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.writeContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32 tokenId) nonpayable']), functionName: 'mint', args: [69420], }) ` **`Example`** `ts // With Validation import { createWalletClient, custom, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const { request } = await client.simulateContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32 tokenId) nonpayable']), functionName: 'mint', args: [69420], } const hash = await client.writeContract(request) ` | + +#### Defined in + +sdk/src/client.ts:44 --- @@ -149,19 +228,37 @@ Whether the client is in read-only mode. #### Defined in -[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) +sdk/src/client.ts:45 ## Accessors +### config + +• `get` **config**(): `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> + +Gets the config for the client. + +#### Returns + +`Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> + +The client config. + +#### Defined in + +sdk/src/client.ts:79 + +--- + ### contract -• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) +• `get` **contract**(): `GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[]\> Gets the HypercertMinter contract used by the client. #### Returns -[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) +`GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[]\> The contract. @@ -171,19 +268,19 @@ The contract. #### Defined in -[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) +sdk/src/client.ts:103 --- ### indexer -• `get` **indexer**(): [`default`](internal.default-1.md) +• `get` **indexer**(): `HypercertIndexer` Gets the indexer for the client. #### Returns -[`default`](internal.default-1.md) +`HypercertIndexer` The indexer. @@ -193,7 +290,7 @@ The indexer. #### Defined in -[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) +sdk/src/client.ts:95 --- @@ -215,279 +312,507 @@ The storage layer. #### Defined in -[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) +sdk/src/client.ts:87 ## Methods ### batchMintClaimFractionsFromAllowlists -▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> +▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Mints multiple claim fractions from allowlists in a batch. + +This method first retrieves the wallet client and account using the `getWallet` method. If the roots are provided, it verifies each proof using the `verifyMerkleProofs` function. If any of the proofs are invalid, it throws an `InvalidOrMissingError`. +It then simulates a contract call to the `batchMintClaimsFromAllowlists` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------- | :------------------------------------------------------------------------ | +| `claimIds` | `bigint`[] | The IDs of the claims to mint. | +| `units` | `bigint`[] | The units of each claim to mint. | +| `proofs` | (\`0x$\{string}\` \| `Uint8Array`)[][] | The proofs for each claim. | +| `roots?` | (\`0x$\{string}\` \| `Uint8Array`)[] | The roots of each proof. If provided, they are used to verify the proofs. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +**`Throws`** + +Will throw an `InvalidOrMissingError` if any of the proofs are invalid. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[batchMintClaimFractionsFromAllowlists](../interfaces/HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) + +#### Defined in + +sdk/src/client.ts:459 -Batch mints a claim fraction from an allowlist +--- -**`Note`** +### batchTransferFractions -The length of the arrays must be equal. +▸ **batchTransferFractions**(`fractionIds`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> -**`Note`** +Transfers multiple claim fractions to a new owner. -The order of the arrays must be equal. +This method first retrieves the wallet client and account using the `getWallet` method. +It then simulates a contract call to the `safeBatchTransferFrom` function with the provided parameters and the account, and submits the request using the `submitRequest` method. #### Parameters -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | -| `roots?` | `BytesLike`[] | - | -| `overrides?` | `Overrides` | - | +| Name | Type | +| :------------ | :------------------------------------------------------- | +| `fractionIds` | `bigint`[] | +| `to` | \`0x$\{string}\` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | #### Returns -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A promise that resolves to the transaction hash. #### Implementation of -HypercertClientInterface.batchMintClaimFractionsFromAllowlists +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[batchTransferFractions](../interfaces/HypercertClientInterface.md#batchtransferfractions) #### Defined in -[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) +sdk/src/client.ts:210 --- ### burnClaimFraction -▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> +▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Burns a claim fraction. + +This method first retrieves the wallet client and account using the `getWallet` method. It then retrieves the owner of the claim using the `ownerOf` method of the read contract. +If the claim is not owned by the account, it throws a `ClientError`. +It then simulates a contract call to the `burnFraction` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------- | :---------------------------------------- | +| `claimId` | `bigint` | The ID of the claim to burn. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +**`Throws`** + +Will throw a `ClientError` if the claim is not owned by the account. + +#### Implementation of -Burn a Hypercert claim by providing the claim id +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[burnClaimFraction](../interfaces/HypercertClientInterface.md#burnclaimfraction) -**`Dev`** +#### Defined in -Burns a Hypercert claim +sdk/src/client.ts:382 + +--- + +### createAllowlist + +▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Creates an allowlist. + +This method first validates the provided allowlist and metadata using the `validateAllowlist` and `validateMetaData` functions respectively. If either is invalid, it throws a `MalformedDataError`. +It then creates an allowlist from the provided entries and stores it on IPFS using the `storeData` method of the storage client. +After that, it stores the metadata (including the CID of the allowlist) on IPFS using the `storeMetadata` method of the storage client. +Finally, it simulates a contract call to the `createAllowlist` function with the provided parameters and the stored metadata CID, and submits the request using the `submitRequest` method. #### Parameters -| Name | Type | Description | -| :----------- | :------------- | :----------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `overrides?` | `Overrides` | - | +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :---------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The entries for the allowlist. | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `bigint` | The total units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restrictions for the claim. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | #### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. -Contract transaction +**`Throws`** + +Will throw a `MalformedDataError` if the provided allowlist or metadata is invalid. #### Implementation of -HypercertClientInterface.burnClaimFraction +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[createAllowlist](../interfaces/HypercertClientInterface.md#createallowlist) #### Defined in -[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) +sdk/src/client.ts:243 --- -### checkWritable +### getCleanedOverrides + +▸ **getCleanedOverrides**(`overrides?`): `Object` -▸ `Private` **checkWritable**(): `boolean` +#### Parameters + +| Name | Type | +| :----------- | :------------------------------------------------------- | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | #### Returns -`boolean` +`Object` #### Defined in -[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) +sdk/src/client.ts:499 --- -### createAllowlist +### getContractConfig -▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> +▸ **getContractConfig**(): `GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[], `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`\>, `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`\>, \`0x$\{string}\`, `string`, `string`, `string`, `false`\> -Create a Hypercert claim with an allowlist +#### Returns + +`GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[], `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`\>, `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`\>, \`0x$\{string}\`, `string`, `string`, `string`, `false`\> + +#### Defined in + +sdk/src/client.ts:490 -**`Dev`** +--- + +### getTransferRestrictions -Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist +▸ **getTransferRestrictions**(`fractionId`): `Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> -**`Notice`** +Gets the TransferRestrictions for a claim. -The total number of units in the allowlist must match the total number of units for the Hypercert +This method first retrieves the read contract using the `getContract` method. It then simulates a contract call to the `readTransferRestriction` function with the provided fraction ID. #### Parameters -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | +| Name | Type | +| :----------- | :------- | +| `fractionId` | `bigint` | #### Returns -`Promise`<`ContractTransaction`\> +`Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> -Contract transaction +a Promise that resolves to the applicable transfer restrictions. #### Implementation of -HypercertClientInterface.createAllowlist +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[getTransferRestrictions](../interfaces/HypercertClientInterface.md#gettransferrestrictions) #### Defined in -[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) +sdk/src/client.ts:162 --- -### mergeClaimUnits +### getWallet + +▸ **getWallet**(): `Object` + +#### Returns + +`Object` + +| Name | Type | +| :--------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `account` | `Account` | +| `walletClient` | \{ `account`: `undefined` \| `Account` ; `addChain`: (`args`: `AddChainParameters`) => `Promise`<`void`\> ; `batch?`: \{ `multicall?`: `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } } ; `cacheTime`: `number` ; `chain`: `undefined` \| `Chain` ; `deployContract`: (`args`: `DeployContractParameters`<`TAbi`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> ; `extend`: (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, \{ [K in keyof client]: client[K]; } & `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\> ; `getAddresses`: () => `Promise`<`GetAddressesReturnType`\> ; `getChainId`: () => `Promise`<`number`\> ; `getPermissions`: () => `Promise`<`GetPermissionsReturnType`\> ; `key`: `string` ; `name`: `string` ; `pollingInterval`: `number` ; `prepareTransactionRequest`: (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> ; `request`: `EIP1193RequestFn`<`WalletRpcSchema`\> ; `requestAddresses`: () => `Promise`<`RequestAddressesReturnType`\> ; `requestPermissions`: (`args`: \{ [x: string]: Record; eth\_accounts: Record; }) => `Promise`<`RequestPermissionsReturnType`\> ; `sendRawTransaction`: (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> ; `sendTransaction`: (`args`: `SendTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> ; `signMessage`: (`args`: `SignMessageParameters`<`undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> ; `signTransaction`: (`args`: `SignTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> ; `signTypedData`: (`args`: `SignTypedDataParameters`<`TTypedData`, `TPrimaryType`, `undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> ; `switchChain`: (`args`: `SwitchChainParameters`) => `Promise`<`void`\> ; `transport`: `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> ; `type`: `string` ; `uid`: `string` ; `watchAsset`: (`args`: `WatchAssetParams`) => `Promise`<`boolean`\> ; `writeContract`: (`args`: `WriteContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> } | +| `walletClient.account` | `undefined` \| `Account` | +| `walletClient.addChain` | (`args`: `AddChainParameters`) => `Promise`<`void`\> | +| `walletClient.batch?` | \{ `multicall?`: `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } } | +| `walletClient.batch.multicall?` | `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } | +| `walletClient.cacheTime` | `number` | +| `walletClient.chain` | `undefined` \| `Chain` | +| `walletClient.deployContract` | (`args`: `DeployContractParameters`<`TAbi`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.extend` | (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, \{ [K in keyof client]: client[K]; } & `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\> | +| `walletClient.getAddresses` | () => `Promise`<`GetAddressesReturnType`\> | +| `walletClient.getChainId` | () => `Promise`<`number`\> | +| `walletClient.getPermissions` | () => `Promise`<`GetPermissionsReturnType`\> | +| `walletClient.key` | `string` | +| `walletClient.name` | `string` | +| `walletClient.pollingInterval` | `number` | +| `walletClient.prepareTransactionRequest` | (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> | +| `walletClient.request` | `EIP1193RequestFn`<`WalletRpcSchema`\> | +| `walletClient.requestAddresses` | () => `Promise`<`RequestAddressesReturnType`\> | +| `walletClient.requestPermissions` | (`args`: \{ [x: string]: Record; eth_accounts: Record; }) => `Promise`<`RequestPermissionsReturnType`\> | +| `walletClient.sendRawTransaction` | (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.sendTransaction` | (`args`: `SendTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.signMessage` | (`args`: `SignMessageParameters`<`undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.signTransaction` | (`args`: `SignTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.signTypedData` | (`args`: `SignTypedDataParameters`<`TTypedData`, `TPrimaryType`, `undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.switchChain` | (`args`: `SwitchChainParameters`) => `Promise`<`void`\> | +| `walletClient.transport` | `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> | +| `walletClient.type` | `string` | +| `walletClient.uid` | `string` | +| `walletClient.watchAsset` | (`args`: `WatchAssetParams`) => `Promise`<`boolean`\> | +| `walletClient.writeContract` | (`args`: `WriteContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | + +#### Defined in + +sdk/src/client.ts:509 + +--- -▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> +### mergeFractionUnits -Merge multiple Hypercert claims fractions into one +▸ **mergeFractionUnits**(`fractionIds`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> -**`Dev`** +Merges multiple fractions into a single fraction. -Merges multiple Hypercert claims into one +This method first retrieves the wallet client and account using the `getWallet` method. It then retrieves the owner of each fraction using the `ownerOf` method of the read contract. +If any of the fractions are not owned by the account, it throws a `ClientError`. +It then simulates a contract call to the `mergeFractions` function with the provided parameters and the account, and submits the request using the `submitRequest` method. #### Parameters -| Name | Type | Description | -| :----------- | :--------------- | :------------------ | -| `claimIds` | `BigNumberish`[] | Hypercert claim ids | -| `overrides?` | `Overrides` | - | +| Name | Type | Description | +| :------------ | :------------------------------------------------------- | :---------------------------------------- | +| `fractionIds` | `bigint`[] | The IDs of the fractions to merge. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | #### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +**`Throws`** -Contract transaction +Will throw a `ClientError` if any of the fractions are not owned by the account. #### Implementation of -HypercertClientInterface.mergeClaimUnits +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[mergeFractionUnits](../interfaces/HypercertClientInterface.md#mergefractionunits) #### Defined in -[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) +sdk/src/client.ts:341 --- ### mintClaim -▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> +▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> -Mint a Hypercert claim +Mints a new claim. -**`Dev`** - -Mints a Hypercert claim with the given metadata, total units and transfer restrictions +This method first validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. +It then stores the metadata on IPFS using the `storeMetadata` method of the storage client. +After that, it simulates a contract call to the `mintClaim` function with the provided parameters and the stored metadata CID to validate the transaction. +Finally, it submits the request using the `submitRequest` method. #### Parameters -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :---------------------------------------- | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `bigint` | The total units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restrictions for the claim. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | #### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. -Contract transaction +**`Throws`** + +Will throw a `MalformedDataError` if the provided metadata is invalid. #### Implementation of -HypercertClientInterface.mintClaim +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[mintClaim](../interfaces/HypercertClientInterface.md#mintclaim) #### Defined in -[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) +sdk/src/client.ts:127 --- ### mintClaimFractionFromAllowlist -▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> +▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Mints a claim fraction from an allowlist. + +This method first retrieves the wallet client and account using the `getWallet` method. It then verifies the provided proof using the `verifyMerkleProof` function. If the proof is invalid, it throws an `InvalidOrMissingError`. +It then simulates a contract call to the `mintClaimFromAllowlist` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------- | :------------------------------------------------------------------ | +| `claimId` | `bigint` | The ID of the claim to mint. | +| `units` | `bigint` | The units of the claim to mint. | +| `proof` | (\`0x$\{string}\` \| `Uint8Array`)[] | The proof for the claim. | +| `root?` | \`0x$\{string}\` \| `Uint8Array` | The root of the proof. If provided, it is used to verify the proof. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | + +#### Returns -Mint a Hypercert claim fraction from an allowlist. +`Promise`<`undefined` \| \`0x$\{string}\`\> -**`Dev`** +A promise that resolves to the transaction hash. -Verifies the claim proof and mints the claim fraction +**`Throws`** -**`Notice`** +Will throw an `InvalidOrMissingError` if the proof is invalid. + +#### Implementation of -If known, provide the root for client side verification +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[mintClaimFractionFromAllowlist](../interfaces/HypercertClientInterface.md#mintclaimfractionfromallowlist) + +#### Defined in + +sdk/src/client.ts:415 + +--- + +### simulateRequest + +▸ **simulateRequest**(`account`, `functionName`, `args`, `overrides?`): `Promise`<\{ `abi`: `Narrow`<\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" }\>[] ; `accessList?`: `AccessList` ; `account`: \`0x$\{string}\` \| `Account` ; `address`: \`0x$\{string}\` ; `args?`: readonly `unknown`[] ; `chain`: `undefined` ; `dataSuffix?`: \`0x$\{string}\` ; `functionName`: `string` ; `gas?`: `bigint` ; `gasPrice?`: `bigint` ; `maxFeePerGas?`: `bigint` ; `maxPriorityFeePerGas?`: `bigint` ; `nonce?`: `number` ; `type?`: `"legacy"` \| `"eip2930"` \| `"eip1559"` ; `value?`: `bigint` }\> #### Parameters -| Name | Type | Description | -| :----------- | :------------- | :------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `units` | `BigNumberish` | Number of units to mint | -| `proof` | `BytesLike`[] | Merkle proof for the claim | -| `root?` | `BytesLike` | - | -| `overrides?` | `Overrides` | - | +| Name | Type | +| :------------- | :------------------------------------------------------- | +| `account` | `Account` | +| `functionName` | `string` | +| `args` | `unknown`[] | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | #### Returns -`Promise`<`ContractTransaction`\> +`Promise`<\{ `abi`: `Narrow`<\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" }\>[] ; `accessList?`: `AccessList` ; `account`: \`0x$\{string}\` \| `Account` ; `address`: \`0x$\{string}\` ; `args?`: readonly `unknown`[] ; `chain`: `undefined` ; `dataSuffix?`: \`0x$\{string}\` ; `functionName`: `string` ; `gas?`: `bigint` ; `gasPrice?`: `bigint` ; `maxFeePerGas?`: `bigint` ; `maxPriorityFeePerGas?`: `bigint` ; `nonce?`: `number` ; `type?`: `"legacy"` \| `"eip2930"` \| `"eip1559"` ; `value?`: `bigint` }\> + +#### Defined in + +sdk/src/client.ts:519 -Contract transaction +--- + +### splitFractionUnits + +▸ **splitFractionUnits**(`fractionId`, `fractions`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Splits a fraction into multiple fractions. + +This method first retrieves the wallet client and account using the `getWallet` method. It then retrieves the owner and total units of the fraction using the `ownerOf` and `unitsOf` methods of the read contract. +If the fraction is not owned by the account, it throws a `ClientError`. +It then checks if the sum of the provided fractions is equal to the total units of the fraction. If not, it throws a `ClientError`. +Finally, it simulates a contract call to the `splitFraction` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------- | :---------------------------------------- | +| `fractionId` | `bigint` | The ID of the fraction to split. | +| `fractions` | `bigint`[] | The fractions to split the fraction into. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +**`Throws`** + +Will throw a `ClientError` if the fraction is not owned by the account or if the sum of the fractions is not equal to the total units of the fraction. #### Implementation of -HypercertClientInterface.mintClaimFractionFromAllowlist +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[splitFractionUnits](../interfaces/HypercertClientInterface.md#splitfractionunits) #### Defined in -[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) +sdk/src/client.ts:296 --- -### splitClaimUnits +### submitRequest + +▸ **submitRequest**(`request`): `Promise`<\`0x$\{string}\`\> -▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> +Submits a contract request. -Split a Hypercert's unit into multiple claims with the given fractions +This method submits a contract request using the `writeContract` method of the wallet client. If the request fails, it throws a `ClientError`. + +#### Parameters + +| Name | Type | Description | +| :-------- | :---- | :------------------------------ | +| `request` | `any` | The contract request to submit. | + +#### Returns + +`Promise`<\`0x$\{string}\`\> + +A promise that resolves to the hash of the submitted request. + +**`Throws`** + +Will throw a `ClientError` if the request fails. + +#### Defined in + +sdk/src/client.ts:550 + +--- -**`Dev`** +### transferFraction -Submit the ID of the claim to split and new fraction values. +▸ **transferFraction**(`fractionId`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> -**`Notice`** +Transfers a claim fraction to a new owner. -The sum of the fractions must be equal to the total units of the claim +This method first retrieves the wallet client and account using the `getWallet` method. +It then simulates a contract call to the `safeTransferFrom` function with the provided parameters and the account, and submits the request using the `submitRequest` method. #### Parameters -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | -| `overrides?` | `Overrides` | - | +| Name | Type | +| :----------- | :------------------------------------------------------- | +| `fractionId` | `bigint` | +| `to` | `string` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | #### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -Contract transaction +A promise that resolves to the transaction hash. #### Implementation of -HypercertClientInterface.splitClaimUnits +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[transferFraction](../interfaces/HypercertClientInterface.md#transferfraction) #### Defined in -[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) +sdk/src/client.ts:182 diff --git a/docs/docs/developer/api/sdk/classes/HypercertsStorage.md b/docs/docs/developer/api/sdk/classes/HypercertsStorage.md index 706c14fe..6105ec7c 100644 --- a/docs/docs/developer/api/sdk/classes/HypercertsStorage.md +++ b/docs/docs/developer/api/sdk/classes/HypercertsStorage.md @@ -1,50 +1,52 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage - -# Class: HypercertsStorage +--- +id: "HypercertsStorage" +title: "Class: HypercertsStorage" +sidebar_label: "HypercertsStorage" +sidebar_position: 0 +custom_edit_url: null +--- A class that provides storage functionality for Hypercerts. -## Implements - -- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) - -## Table of contents - -### Constructors - -- [constructor](HypercertsStorage.md#constructor) +This class implements the `HypercertStorageInterface` and provides methods for storing and retrieving Hypercerts. It uses the NFT Storage and Web3 Storage APIs for storage, and can be configured to be read-only. -### Properties +**`Example`** -- [nftStorageClient](HypercertsStorage.md#nftstorageclient) -- [readonly](HypercertsStorage.md#readonly) -- [web3StorageClient](HypercertsStorage.md#web3storageclient) +```ts +const storage = new HypercertsStorage({ + nftStorageToken: "your-nft-storage-token", + web3StorageToken: "your-web3-storage-token", +}); +const metadata = await storage.getMetadata("your-hypercert-id"); +``` -### Methods +## Implements -- [getData](HypercertsStorage.md#getdata) -- [getMetadata](HypercertsStorage.md#getmetadata) -- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) -- [storeData](HypercertsStorage.md#storedata) -- [storeMetadata](HypercertsStorage.md#storemetadata) +- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) ## Constructors ### constructor -• **new HypercertsStorage**(`overrides`) +• **new HypercertsStorage**(`overrides`): [`HypercertsStorage`](HypercertsStorage.md) Creates a new instance of the `HypercertsStorage` class. +This constructor takes an optional `overrides` parameter that can be used to override the default configuration. If the NFT Storage or Web3 Storage API keys are missing or invalid, the storage will be read-only. + #### Parameters | Name | Type | Description | | :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | | `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | +#### Returns + +[`HypercertsStorage`](HypercertsStorage.md) + #### Defined in -[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) +sdk/src/storage.ts:47 ## Properties @@ -52,11 +54,11 @@ Creates a new instance of the `HypercertsStorage` class. • `Optional` **nftStorageClient**: `NFTStorage` -The NFT storage client. +The NFT Storage client used for storing and retrieving Hypercerts. #### Defined in -[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) +sdk/src/storage.ts:36 --- @@ -64,55 +66,65 @@ The NFT storage client. • **readonly**: `boolean` = `true` -Whether the storage is read-only. +Whether the storage is read-only. If true, the storage methods will not perform any write operations. #### Defined in -[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) +sdk/src/storage.ts:34 --- ### web3StorageClient -• `Optional` **web3StorageClient**: `any` +• `Optional` **web3StorageClient**: `Web3Storage` -The Web3 storage client. +The Web3 Storage client used for storing and retrieving Hypercerts. #### Defined in -[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) +sdk/src/storage.ts:38 ## Methods ### getData -▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> +▸ **getData**(`cidOrIpfsUri`): `Promise`<`unknown`\> -Gets arbitrary data from Web3 storage. - -**`Throws`** +Retrieves data from IPFS using the provided CID or IPFS URI. -A `StorageError` if the storage client is not configured or the data cannot be retrieved. +This method first retrieves the data from IPFS using the `getFromIPFS` function. It then parses the retrieved data as JSON and returns it. #### Parameters -| Name | Type | Description | -| :------------- | :------- | :-------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | #### Returns -`Promise`<`any`\> +`Promise`<`unknown`\> -A Promise that resolves to the data. +A promise that resolves to the retrieved data. + +**`Throws`** + +Will throw a `FetchError` if the retrieval operation fails. + +**`Throws`** + +Will throw a `MalformedDataError` if the retrieved data is not a single file. + +**`Remarkts`** + +Note: The original implementation using the Web3 Storage client is currently commented out due to issues with upstream repos. This will be replaced once those issues are resolved. #### Implementation of -HypercertStorageInterface.getData +[HypercertStorageInterface](../interfaces/HypercertStorageInterface.md).[getData](../interfaces/HypercertStorageInterface.md#getdata) #### Defined in -[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) +sdk/src/storage.ts:167 --- @@ -120,93 +132,75 @@ HypercertStorageInterface.getData ▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> -Gets metadata for a Hypercert. +Retrieves Hypercert metadata from IPFS using the provided CID or IPFS URI. -**`Throws`** - -A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. - -**`Throws`** - -A `MalformedDataError` if the metadata is invalid. E.g. unknown schema +This method first retrieves the data from IPFS using the `getFromIPFS` function. It then validates the retrieved data using the `validateMetaData` function. If the data is invalid, it throws a `MalformedDataError`. +If the data is valid, it returns the data as a `HypercertMetadata` object. #### Parameters -| Name | Type | Description | -| :------------- | :------- | :------------------------------------------ | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | +| Name | Type | Description | +| :------------- | :------- | :----------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | #### Returns `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> -A Promise that resolves to the metadata. +A promise that resolves to the retrieved metadata. + +**`Throws`** + +Will throw a `MalformedDataError` if the retrieved data is invalid. #### Implementation of -HypercertStorageInterface.getMetadata +[HypercertStorageInterface](../interfaces/HypercertStorageInterface.md).[getMetadata](../interfaces/HypercertStorageInterface.md#getmetadata) #### Defined in -[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) +sdk/src/storage.ts:114 --- -### getNftStorageGatewayUri - -▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` - -#### Parameters - -| Name | Type | -| :------------- | :------- | -| `cidOrIpfsUri` | `string` | +### storeData -#### Returns +▸ **storeData**(`data`): `Promise`<`CIDString`\> -`string` +Stores data using the Web3 Storage client. -#### Defined in +This method first checks if the storage is read-only or if the Web3 Storage client is not configured. If either of these conditions is true, it throws a `StorageError`. +It then creates a new Blob from the provided data and stores it using the Web3 Storage client. If the storage operation fails, it throws a `StorageError`. -[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) +#### Parameters ---- +| Name | Type | Description | +| :----- | :-------- | :----------------------------------------------- | +| `data` | `unknown` | The data to store. This can be any type of data. | -### storeData +#### Returns -▸ **storeData**(`data`): `Promise`<`CIDString`\> +`Promise`<`CIDString`\> -Stores arbitrary data in Web3 storage. +A promise that resolves to the CID of the stored data. **`Throws`** -A `StorageError` if the storage client is not configured. +Will throw a `StorageError` if the storage is read-only, if the Web3 Storage client is not configured, or if the storage operation fails. -**`Notice`** +**`Remarks`** Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. Because we pay for storage quotas, this data is stored best effort. If you are using our default keys, we may delete older data if we hit our storage quota. -#### Parameters - -| Name | Type | Description | -| :----- | :-------- | :----------------- | -| `data` | `unknown` | The data to store. | - -#### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored data. - #### Implementation of -HypercertStorageInterface.storeData +[HypercertStorageInterface](../interfaces/HypercertStorageInterface.md).[storeData](../interfaces/HypercertStorageInterface.md#storedata) #### Defined in -[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) +sdk/src/storage.ts:139 --- @@ -214,37 +208,36 @@ HypercertStorageInterface.storeData ▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> -Stores metadata for a Hypercert. +Stores Hypercert metadata using the NFT Storage client. -**`Throws`** +This method first checks if the storage is read-only or if the NFT Storage client is not configured. If either of these conditions is true, it throws a `StorageError`. +It then validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. +If the metadata is valid, it creates a new Blob from the metadata and stores it using the NFT Storage client. If the storage operation fails, it throws a `StorageError`. -A `StorageError` if the storage client is not configured. - -**`Throws`** +#### Parameters -A `MalformedDataError` if the metadata is invalid. +| Name | Type | Description | +| :----- | :-------------------------------------------------------- | :----------------------------------------------------------------------------------------------------- | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The Hypercert metadata to store. This should be an object that conforms to the HypercertMetadata type. | -**`Notice`** +#### Returns -Because we pay for storage quotas, this data is stored best effort. -If you are using our default keys, we may delete older data if we hit our storage quota. +`Promise`<`CIDString`\> -#### Parameters +A promise that resolves to the CID of the stored metadata. -| Name | Type | Description | -| :----- | :-------------------------------------------------------- | :--------------------- | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | +**`Throws`** -#### Returns +Will throw a `StorageError` if the storage is read-only, if the NFT Storage client is not configured, or if the storage operation fails. -`Promise`<`CIDString`\> +**`Throws`** -A Promise that resolves to the CID of the stored metadata. +Will throw a `MalformedDataError` if the provided metadata is invalid. #### Implementation of -HypercertStorageInterface.storeMetadata +[HypercertStorageInterface](../interfaces/HypercertStorageInterface.md).[storeMetadata](../interfaces/HypercertStorageInterface.md#storemetadata) #### Defined in -[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) +sdk/src/storage.ts:81 diff --git a/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md index d12c0653..ca034a9d 100644 --- a/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md +++ b/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError - -# Class: InvalidOrMissingError +--- +id: "InvalidOrMissingError" +title: "Class: InvalidOrMissingError" +sidebar_label: "InvalidOrMissingError" +sidebar_position: 0 +custom_edit_url: null +--- The provided value was undefined or empty @@ -14,21 +18,11 @@ The provided value was undefined or empty - [`CustomError`](../interfaces/CustomError.md) -## Table of contents - -### Constructors - -- [constructor](InvalidOrMissingError.md#constructor) - -### Properties - -- [payload](InvalidOrMissingError.md#payload) - ## Constructors ### constructor -• **new InvalidOrMissingError**(`message`, `payload?`) +• **new InvalidOrMissingError**(`message`, `payload?`): [`InvalidOrMissingError`](InvalidOrMissingError.md) Creates a new instance of the InvalidOrMissingError class. @@ -39,16 +33,62 @@ Creates a new instance of the InvalidOrMissingError class. | `message` | `string` | The error message. | | `payload?` | `Object` | Additional error payload. | +#### Returns + +[`InvalidOrMissingError`](InvalidOrMissingError.md) + #### Overrides Error.constructor #### Defined in -[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) +sdk/src/types/errors.ts:83 ## Properties +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + ### payload • `Optional` **payload**: `Object` @@ -65,4 +105,94 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) +sdk/src/types/errors.ts:76 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/docs/developer/api/sdk/classes/MalformedDataError.md b/docs/docs/developer/api/sdk/classes/MalformedDataError.md index 028129d8..826cc8f2 100644 --- a/docs/docs/developer/api/sdk/classes/MalformedDataError.md +++ b/docs/docs/developer/api/sdk/classes/MalformedDataError.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError - -# Class: MalformedDataError +--- +id: "MalformedDataError" +title: "Class: MalformedDataError" +sidebar_label: "MalformedDataError" +sidebar_position: 0 +custom_edit_url: null +--- Data doesn't conform to expectations @@ -14,21 +18,11 @@ Data doesn't conform to expectations - [`CustomError`](../interfaces/CustomError.md) -## Table of contents - -### Constructors - -- [constructor](MalformedDataError.md#constructor) - -### Properties - -- [payload](MalformedDataError.md#payload) - ## Constructors ### constructor -• **new MalformedDataError**(`message`, `payload?`) +• **new MalformedDataError**(`message`, `payload?`): [`MalformedDataError`](MalformedDataError.md) Creates a new instance of the MalformedDataError class. @@ -39,16 +33,62 @@ Creates a new instance of the MalformedDataError class. | `message` | `string` | The error message. | | `payload?` | `Object` | Additional error payload. | +#### Returns + +[`MalformedDataError`](MalformedDataError.md) + #### Overrides Error.constructor #### Defined in -[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) +sdk/src/types/errors.ts:155 ## Properties +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + ### payload • `Optional` **payload**: `Object` @@ -65,4 +105,94 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) +sdk/src/types/errors.ts:148 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/docs/developer/api/sdk/classes/MintingError.md b/docs/docs/developer/api/sdk/classes/MintingError.md index de284494..50d11138 100644 --- a/docs/docs/developer/api/sdk/classes/MintingError.md +++ b/docs/docs/developer/api/sdk/classes/MintingError.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError - -# Class: MintingError +--- +id: "MintingError" +title: "Class: MintingError" +sidebar_label: "MintingError" +sidebar_position: 0 +custom_edit_url: null +--- Minting transaction failed @@ -14,21 +18,11 @@ Minting transaction failed - [`CustomError`](../interfaces/CustomError.md) -## Table of contents - -### Constructors - -- [constructor](MintingError.md#constructor) - -### Properties - -- [payload](MintingError.md#payload) - ## Constructors ### constructor -• **new MintingError**(`message`, `payload?`) +• **new MintingError**(`message`, `payload?`): [`MintingError`](MintingError.md) Creates a new instance of the MintingError class. @@ -39,16 +33,62 @@ Creates a new instance of the MintingError class. | `message` | `string` | The error message. | | `payload?` | `Object` | Additional error payload. | +#### Returns + +[`MintingError`](MintingError.md) + #### Overrides Error.constructor #### Defined in -[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) +sdk/src/types/errors.ts:101 ## Properties +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + ### payload • `Optional` **payload**: `Object` @@ -65,4 +105,94 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) +sdk/src/types/errors.ts:94 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/docs/developer/api/sdk/classes/StorageError.md b/docs/docs/developer/api/sdk/classes/StorageError.md index 0dcf0291..e8fe2baa 100644 --- a/docs/docs/developer/api/sdk/classes/StorageError.md +++ b/docs/docs/developer/api/sdk/classes/StorageError.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError - -# Class: StorageError +--- +id: "StorageError" +title: "Class: StorageError" +sidebar_label: "StorageError" +sidebar_position: 0 +custom_edit_url: null +--- Fails storing to a remote resource @@ -14,21 +18,11 @@ Fails storing to a remote resource - [`CustomError`](../interfaces/CustomError.md) -## Table of contents - -### Constructors - -- [constructor](StorageError.md#constructor) - -### Properties - -- [payload](StorageError.md#payload) - ## Constructors ### constructor -• **new StorageError**(`message`, `payload?`) +• **new StorageError**(`message`, `payload?`): [`StorageError`](StorageError.md) Creates a new instance of the StorageError class. @@ -39,16 +33,62 @@ Creates a new instance of the StorageError class. | `message` | `string` | The error message. | | `payload?` | `Object` | Additional error payload. | +#### Returns + +[`StorageError`](StorageError.md) + #### Overrides Error.constructor #### Defined in -[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) +sdk/src/types/errors.ts:119 ## Properties +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + ### payload • `Optional` **payload**: `Object` @@ -65,4 +105,94 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) +sdk/src/types/errors.ts:112 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md b/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md index 5fdb25e0..2325eb5a 100644 --- a/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md +++ b/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError - -# Class: UnknownSchemaError +--- +id: "UnknownSchemaError" +title: "Class: UnknownSchemaError" +sidebar_label: "UnknownSchemaError" +sidebar_position: 0 +custom_edit_url: null +--- Schema could not be loaded @@ -14,21 +18,11 @@ Schema could not be loaded - [`CustomError`](../interfaces/CustomError.md) -## Table of contents - -### Constructors - -- [constructor](UnknownSchemaError.md#constructor) - -### Properties - -- [payload](UnknownSchemaError.md#payload) - ## Constructors ### constructor -• **new UnknownSchemaError**(`message`, `payload?`) +• **new UnknownSchemaError**(`message`, `payload?`): [`UnknownSchemaError`](UnknownSchemaError.md) Creates a new instance of the UnknownSchemaError class. @@ -40,16 +34,62 @@ Creates a new instance of the UnknownSchemaError class. | `payload?` | `Object` | Additional error payload. | | `payload.schemaName` | `string` | - | +#### Returns + +[`UnknownSchemaError`](UnknownSchemaError.md) + #### Overrides Error.constructor #### Defined in -[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) +sdk/src/types/errors.ts:137 ## Properties +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + ### payload • `Optional` **payload**: `Object` @@ -68,4 +108,94 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) +sdk/src/types/errors.ts:130 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md b/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md index 0964b138..7c02e287 100644 --- a/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md +++ b/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError - -# Class: UnsupportedChainError +--- +id: "UnsupportedChainError" +title: "Class: UnsupportedChainError" +sidebar_label: "UnsupportedChainError" +sidebar_position: 0 +custom_edit_url: null +--- This blockchain is not yet supported Please file an issue @@ -15,21 +19,11 @@ Please file an issue - [`CustomError`](../interfaces/CustomError.md) -## Table of contents - -### Constructors - -- [constructor](UnsupportedChainError.md#constructor) - -### Properties - -- [payload](UnsupportedChainError.md#payload) - ## Constructors ### constructor -• **new UnsupportedChainError**(`message`, `payload?`) +• **new UnsupportedChainError**(`message`, `payload?`): [`UnsupportedChainError`](UnsupportedChainError.md) Creates a new instance of the UnsupportedChainError class. @@ -41,16 +35,62 @@ Creates a new instance of the UnsupportedChainError class. | `payload?` | `Object` | Additional error payload. | | `payload.chainID` | `undefined` \| `string` \| `number` | - | +#### Returns + +[`UnsupportedChainError`](UnsupportedChainError.md) + #### Overrides Error.constructor #### Defined in -[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) +sdk/src/types/errors.ts:174 ## Properties +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + ### payload • `Optional` **payload**: `Object` @@ -69,4 +109,94 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) +sdk/src/types/errors.ts:167 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/docs/developer/api/sdk/classes/_category_.yml b/docs/docs/developer/api/sdk/classes/_category_.yml new file mode 100644 index 00000000..55c7980a --- /dev/null +++ b/docs/docs/developer/api/sdk/classes/_category_.yml @@ -0,0 +1,2 @@ +label: "Classes" +position: 3 \ No newline at end of file diff --git a/docs/docs/developer/api/sdk/classes/internal.default-1.md b/docs/docs/developer/api/sdk/classes/internal.default-1.md deleted file mode 100644 index 1b94a629..00000000 --- a/docs/docs/developer/api/sdk/classes/internal.default-1.md +++ /dev/null @@ -1,278 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -A class that provides indexing functionality for Hypercerts. - -## Implements - -- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default-1.md#constructor) - -### Properties - -- [\_graphClient](internal.default-1.md#_graphclient) - -### Accessors - -- [graphClient](internal.default-1.md#graphclient) - -### Methods - -- [claimById](internal.default-1.md#claimbyid) -- [claimsByOwner](internal.default-1.md#claimsbyowner) -- [firstClaims](internal.default-1.md#firstclaims) -- [fractionById](internal.default-1.md#fractionbyid) -- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) -- [fractionsByOwner](internal.default-1.md#fractionsbyowner) - -## Constructors - -### constructor - -• **new default**(`options`) - -Creates a new instance of the `HypercertIndexer` class. - -#### Parameters - -| Name | Type | Description | -| :------------------ | :------- | :----------------------------------------- | -| `options` | `Object` | The configuration options for the indexer. | -| `options.graphUrl?` | `string` | - | - -#### Defined in - -[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) - -## Properties - -### \_graphClient - -• `Private` **\_graphClient**: `Object` - -The Graph client used by the indexer. - -#### Type declaration - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Defined in - -[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) - -## Accessors - -### graphClient - -• `get` **graphClient**(): `Object` - -Gets the Graph client used by the indexer. - -#### Returns - -`Object` - -The Graph client. - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Implementation of - -[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) - -#### Defined in - -[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) - -## Methods - -### claimById - -▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -Gets a claim by its ID. - -#### Parameters - -| Name | Type | Description | -| :--- | :------- | :------------------- | -| `id` | `string` | The ID of the claim. | - -#### Returns - -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -A Promise that resolves to the claim. - -#### Implementation of - -HypercertIndexerInterface.claimById - -#### Defined in - -[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) - ---- - -### claimsByOwner - -▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -Gets the claims owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.claimsByOwner - -#### Defined in - -[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) - ---- - -### firstClaims - -▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -Gets the most recent claims. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :-------------------- | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.firstClaims - -#### Defined in - -[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) - ---- - -### fractionById - -▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -Gets a claim token by its ID. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------- | :------------------------- | -| `fractionId` | `string` | The ID of the claim token. | - -#### Returns - -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -A Promise that resolves to the claim token. - -#### Implementation of - -HypercertIndexerInterface.fractionById - -#### Defined in - -[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) - ---- - -### fractionsByClaim - -▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -Gets the claim tokens for a given claim. - -#### Parameters - -| Name | Type | Default value | Description | -| :-------- | :----------------------------------------- | :------------------- | :-------------------- | -| `claimId` | `string` | `undefined` | The ID of the claim. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByClaim - -#### Defined in - -[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) - ---- - -### fractionsByOwner - -▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -Gets the claim tokens owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByOwner - -#### Defined in - -[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/docs/developer/api/sdk/classes/internal.default-2.md b/docs/docs/developer/api/sdk/classes/internal.default-2.md deleted file mode 100644 index 1538ce61..00000000 --- a/docs/docs/developer/api/sdk/classes/internal.default-2.md +++ /dev/null @@ -1,131 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -The EasEvaluator class provides methods for signing off-chain attestations of evaluations. -Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. - -## Table of contents - -### Constructors - -- [constructor](internal.default-2.md#constructor) - -### Properties - -- [offChain](internal.default-2.md#offchain) -- [readonly](internal.default-2.md#readonly) -- [signer](internal.default-2.md#signer) - -### Methods - -- [getSignature](internal.default-2.md#getsignature) -- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) - -## Constructors - -### constructor - -• **new default**(`config`) - -Creates a new EasEvaluator instance. - -#### Parameters - -| Name | Type | Description | -| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | - -#### Defined in - -[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) - -## Properties - -### offChain - -• **offChain**: `Offchain` - -The Offchain instance used for signing off-chain attestations. - -#### Defined in - -[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -The TypedDataSigner instance used for signing typed data. - -#### Defined in - -[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) - -## Methods - -### getSignature - -▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> - -Gets a signature for an off-chain attestation. - -#### Parameters - -| Name | Type | Description | -| :------------ | :------- | :------------------------------------------------ | -| `encodedData` | `string` | The encoded data to sign. | -| `recipient` | `string` | The address of the recipient of the attestation. | -| `schemaUid` | `string` | The UID of the schema to use for the attestation. | - -#### Returns - -`Promise`<`SignedOffchainAttestation`\> - -- The signature for the attestation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) - ---- - -### signOfflineEvaluation - -▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> - -Signs an offline evaluation. - -**`Throws`** - -- If the evaluation data is malformed. - -#### Parameters - -| Name | Type | Description | -| :----------- | :----------------------------------------------- | :--------------------------- | -| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | - -#### Returns - -`Promise`<`undefined` \| `SignedOffchainAttestation`\> - -- The signature for the evaluation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/docs/developer/api/sdk/classes/internal.default.md b/docs/docs/developer/api/sdk/classes/internal.default.md deleted file mode 100644 index 86daa5e4..00000000 --- a/docs/docs/developer/api/sdk/classes/internal.default.md +++ /dev/null @@ -1,110 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -## Implements - -- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default.md#constructor) - -### Properties - -- [eas](internal.default.md#eas) -- [readonly](internal.default.md#readonly) -- [signer](internal.default.md#signer) -- [storage](internal.default.md#storage) - -### Methods - -- [submitEvaluation](internal.default.md#submitevaluation) - -## Constructors - -### constructor - -• **new default**(`config?`) - -#### Parameters - -| Name | Type | -| :------- | :------------------------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | - -#### Defined in - -[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) - -## Properties - -### eas - -• **eas**: [`default`](internal.default-2.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -#### Defined in - -[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) - ---- - -### storage - -• **storage**: [`HypercertsStorage`](HypercertsStorage.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) - -## Methods - -### submitEvaluation - -▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------------------------------------------------------------------ | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | - -#### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Implementation of - -EvaluatorInterface.submitEvaluation - -#### Defined in - -[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md b/docs/docs/developer/api/sdk/index.md similarity index 50% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md rename to docs/docs/developer/api/sdk/index.md index b1434ab0..408b51f2 100644 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md +++ b/docs/docs/developer/api/sdk/index.md @@ -1,4 +1,10 @@ -Hypercerts SDK Documentation / [Exports](modules.md) +--- +id: "index" +title: "@hypercerts-org/sdk" +sidebar_label: "Readme" +sidebar_position: 0 +custom_edit_url: null +--- # Hypercert SDK @@ -26,15 +32,13 @@ import { HypercertClient } from "@hypercerts-org/sdk"; ```js const client = new HypercertClient({ - chainId: 5, - provider, - signer, + chain: { id: 5 } // required nftStorageToken, web3StorageToken, }); ``` -> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in +> **Note** If there's no `walletClient`, `nftStorageToken` or `web3StorageToken` provided, the client will run in > [read-only mode](#read-only-mode) 4. Use the client object to interact with the Hypercert network. @@ -67,78 +71,36 @@ environment variables for your NFT.storage and web3.storage API keys in your .en ## Config -The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check -the environment variables. +HypercertClientConfig is a configuration object used when initializing a new instance of the HypercertClient. It allows +you to customize the client by setting your own providers or deployments. At it's simplest, you only need to provide +`chain.id` to initalize the client in `readonly` mode. + +| Field | Type | Description | +| --------------------------- | ------- | ---------------------------------------------------------------------------------------------- | +| `chain` | Object | Partial configuration for the blockchain network. | +| `contractAddress` | String | The address of the deployed contract. | +| `graphUrl` | String | The URL to the subgraph that indexes the contract events. Override for localized testing. | +| `graphName` | String | The name of the subgraph. | +| `nftStorageToken` | String | The API token for NFT.storage. | +| `web3StorageToken` | String | The API token for Web3.storage. | +| `easContractAddress` | String | The address of the EAS contract. | +| `publicClient` | Object | The PublicClient is inherently read-only and is used for reading data from the blockchain. | +| `walletClient` | Object | The WalletClient is used for signing and sending transactions. | +| `unsafeForceOverrideConfig` | Boolean | Boolean to force the use of overridden values. | +| `readOnly` | Boolean | Boolean to assert if the client is in read-only mode. | +| `readOnlyReason` | String | Reason for read-only mode. This is optional and can be used for logging or debugging purposes. | ### Read-only mode The SDK client will be in read-only mode if any of the following conditions are true: -- The client was initialized without a signer or provider. -- The client was initialized with a provider but not a signer. -- The client was initialized with a signer but not a provider. +- The client was initialized without a walletprovider. - The contract address is not set. - The storage layer is in read-only mode. If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. -### Defaults - -The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief -explanation of each constant: - -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - -`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object -contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. - -For example: - -```json -{ - "5": { - "chainId": 5, - "chainName": "goerli", - "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "graphName": "hypercerts-testnet" - } -} -``` - -### Client config properties - -| \| Property | Type | Description | -| ------------------ | -------------------- | -------------------------------------- | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | -| `graphName` | `string` | The name of the Gsubgraph to use. | -| `provider` | `providers.Provider` | A custom provider to use. | -| `signer` | `Signer` | A custom signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | - -### Environment variables - -To determine the missing configuration values the SDK defaults to the following environment variables: - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - ### Logging The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level @@ -154,7 +116,7 @@ HypercertIndexer, and HypercertMinter classes, respectively. ```js const { client: { storage }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and @@ -163,7 +125,7 @@ NFT.storage. It is used by the HypercertClient to store metadata when creating n ```js const { client: { indexer }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. @@ -172,7 +134,7 @@ It is used by the HypercertClient to retrieve event-based data via the subgraph ```js const { client: { contract }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used diff --git a/docs/docs/developer/api/sdk/interfaces/CustomError.md b/docs/docs/developer/api/sdk/interfaces/CustomError.md index b4af6279..3b0952f8 100644 --- a/docs/docs/developer/api/sdk/interfaces/CustomError.md +++ b/docs/docs/developer/api/sdk/interfaces/CustomError.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError - -# Interface: CustomError +--- +id: "CustomError" +title: "Interface: CustomError" +sidebar_label: "CustomError" +sidebar_position: 0 +custom_edit_url: null +--- An interface for errors that have a specific type. @@ -8,6 +12,7 @@ An interface for errors that have a specific type. - [`ClientError`](../classes/ClientError.md) - [`ConfigurationError`](../classes/ConfigurationError.md) +- [`ContractError`](../classes/ContractError.md) - [`FetchError`](../classes/FetchError.md) - [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) - [`MalformedDataError`](../classes/MalformedDataError.md) @@ -16,12 +21,6 @@ An interface for errors that have a specific type. - [`UnknownSchemaError`](../classes/UnknownSchemaError.md) - [`UnsupportedChainError`](../classes/UnsupportedChainError.md) -## Table of contents - -### Properties - -- [payload](CustomError.md#payload) - ## Properties ### payload @@ -36,4 +35,4 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) +sdk/src/types/errors.ts:10 diff --git a/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md index 4606b46e..4da8fd22 100644 --- a/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -1,20 +1,15 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation - -# Interface: DuplicateEvaluation +--- +id: "DuplicateEvaluation" +title: "Interface: DuplicateEvaluation" +sidebar_label: "DuplicateEvaluation" +sidebar_position: 0 +custom_edit_url: null +--- ## Indexable ▪ [k: `string`]: `unknown` -## Table of contents - -### Properties - -- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) -- [explanation](DuplicateEvaluation.md#explanation) -- [realHypercert](DuplicateEvaluation.md#realhypercert) -- [type](DuplicateEvaluation.md#type) - ## Properties ### duplicateHypercerts @@ -23,7 +18,7 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) +sdk/src/types/evaluation.d.ts:22 --- @@ -33,7 +28,7 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) +sdk/src/types/evaluation.d.ts:24 --- @@ -43,7 +38,7 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) +sdk/src/types/evaluation.d.ts:23 --- @@ -53,4 +48,4 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) +sdk/src/types/evaluation.d.ts:21 diff --git a/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md b/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md index 205b7004..9328c6cd 100644 --- a/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md @@ -1,20 +1,15 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation - -# Interface: EASEvaluation +--- +id: "EASEvaluation" +title: "Interface: EASEvaluation" +sidebar_label: "EASEvaluation" +sidebar_position: 0 +custom_edit_url: null +--- ## Indexable ▪ [k: `string`]: `unknown` -## Table of contents - -### Properties - -- [chainId](EASEvaluation.md#chainid) -- [contract](EASEvaluation.md#contract) -- [type](EASEvaluation.md#type) -- [uid](EASEvaluation.md#uid) - ## Properties ### chainId @@ -23,7 +18,7 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) +sdk/src/types/evaluation.d.ts:41 --- @@ -33,7 +28,7 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) +sdk/src/types/evaluation.d.ts:42 --- @@ -43,7 +38,7 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) +sdk/src/types/evaluation.d.ts:40 --- @@ -53,4 +48,4 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) +sdk/src/types/evaluation.d.ts:43 diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md index 3dcea656..cc3c8ce2 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata - -# Interface: HypercertClaimdata +--- +id: "HypercertClaimdata" +title: "Interface: HypercertClaimdata" +sidebar_label: "HypercertClaimdata" +sidebar_position: 0 +custom_edit_url: null +--- Properties of an impact claim @@ -8,17 +12,6 @@ Properties of an impact claim ▪ [k: `string`]: `unknown` -## Table of contents - -### Properties - -- [contributors](HypercertClaimdata.md#contributors) -- [impact_scope](HypercertClaimdata.md#impact_scope) -- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) -- [rights](HypercertClaimdata.md#rights) -- [work_scope](HypercertClaimdata.md#work_scope) -- [work_timeframe](HypercertClaimdata.md#work_timeframe) - ## Properties ### contributors @@ -41,7 +34,7 @@ Contributors #### Defined in -[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) +sdk/src/types/claimdata.d.ts:53 --- @@ -66,7 +59,7 @@ Scopes of impact #### Defined in -[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) +sdk/src/types/claimdata.d.ts:15 --- @@ -90,7 +83,7 @@ Impact time period. The value is UNIX time in seconds from epoch. #### Defined in -[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) +sdk/src/types/claimdata.d.ts:44 --- @@ -115,7 +108,7 @@ Rights #### Defined in -[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) +sdk/src/types/claimdata.d.ts:62 --- @@ -140,7 +133,7 @@ Scopes of work #### Defined in -[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) +sdk/src/types/claimdata.d.ts:25 --- @@ -164,4 +157,4 @@ Work time period. The value is UNIX time in seconds from epoch. #### Defined in -[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) +sdk/src/types/claimdata.d.ts:35 diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md index 0483b520..9b969ab0 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface - -# Interface: HypercertClientInterface +--- +id: "HypercertClientInterface" +title: "Interface: HypercertClientInterface" +sidebar_label: "HypercertClientInterface" +sidebar_position: 0 +custom_edit_url: null +--- The interface for the Hypercert client. @@ -16,34 +20,34 @@ The interface for the Hypercert client. - [`HypercertClient`](../classes/HypercertClient.md) -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) -- [contract](HypercertClientInterface.md#contract) -- [createAllowlist](HypercertClientInterface.md#createallowlist) -- [indexer](HypercertClientInterface.md#indexer) -- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) -- [mintClaim](HypercertClientInterface.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) -- [readonly](HypercertClientInterface.md#readonly) -- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) -- [storage](HypercertClientInterface.md#storage) - ## Properties ### batchMintClaimFractionsFromAllowlists -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `bigint`[], `units`: `bigint`[], `proofs`: (\`0x$\{string}\` \| `Uint8Array`)[][]) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> +▸ (`claimIds`, `units`, `proofs`): `Promise`<`undefined` \| \`0x$\{string}\`\> Batch mints a claim fraction from an allowlist +##### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------- | :---------------------------------------------------- | +| `claimIds` | `bigint`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `bigint`[] | Array of the number of units for each fraction. | +| `proofs` | (\`0x$\{string}\` \| `Uint8Array`)[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction hash + **`Note`** The length of the arrays must be equal. @@ -52,53 +56,71 @@ The length of the arrays must be equal. The order of the arrays must be equal. +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) + +#### Defined in + +sdk/src/types/client.ts:237 + +--- + +### batchTransferFractions + +• **batchTransferFractions**: (`fractionIds`: `bigint`[], `to`: \`0x$\{string}\`, `overrides?`: [`SupportedOverrides`](../modules.md#supportedoverrides)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionIds`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Transfers multiple claim fractions to a new owner. + ##### Parameters -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | +| Name | Type | +| :------------ | :------------------------------------------------------- | +| `fractionIds` | `bigint`[] | +| `to` | \`0x$\{string}\` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Inherited from -[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) +[HypercertClientMethods](HypercertClientMethods.md).[batchTransferFractions](HypercertClientMethods.md#batchtransferfractions) #### Defined in -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) +sdk/src/types/client.ts:171 --- ### burnClaimFraction -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> +• **burnClaimFraction**: (`fractionId`: `bigint`) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`claimId`): `Promise`<`ContractTransaction`\> +▸ (`fractionId`): `Promise`<`undefined` \| \`0x$\{string}\`\> Burns a claim fraction. ##### Parameters -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | +| Name | Type | Description | +| :----------- | :------- | :------------------------------------ | +| `fractionId` | `bigint` | The ID of the claim fraction to burn. | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Inherited from @@ -106,15 +128,13 @@ A Promise that resolves to the transaction receipt #### Defined in -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) +sdk/src/types/client.ts:212 --- ### contract -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. +• **contract**: `GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[]\> #### Inherited from @@ -122,17 +142,17 @@ The contract used by the client. #### Defined in -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) +sdk/src/types/client.ts:124 --- ### createAllowlist -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `bigint`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`undefined` \| \`0x$\{string}\`\> Creates a new allowlist and mints a new claim with the allowlist. @@ -142,14 +162,14 @@ Creates a new allowlist and mints a new claim with the allowlist. | :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | | `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | | `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `totalUnits` | `bigint` | The total number of units for the claim. | | `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Inherited from @@ -157,13 +177,45 @@ A Promise that resolves to the transaction receipt #### Defined in -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) +sdk/src/types/client.ts:185 + +--- + +### getTransferRestrictions + +• **getTransferRestrictions**: (`fractionId`: `bigint`) => `Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +Retrieves the TransferRestrictions for a claim. + +##### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------------- | +| `fractionId` | `bigint` | The ID of the claim to retrieve. | + +##### Returns + +`Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +A Promise that resolves to the applicable transfer restrictions. + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[getTransferRestrictions](HypercertClientMethods.md#gettransferrestrictions) + +#### Defined in + +sdk/src/types/client.ts:149 --- ### indexer -• **indexer**: [`default`](../classes/internal.default-1.md) +• **indexer**: `HypercertIndexer` The indexer used by the client. @@ -173,49 +225,49 @@ The indexer used by the client. #### Defined in -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) +sdk/src/types/client.ts:123 --- -### mergeClaimUnits +### mergeFractionUnits -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> +• **mergeFractionUnits**: (`fractionIds`: `bigint`[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`claimIds`): `Promise`<`ContractTransaction`\> +▸ (`fractionIds`): `Promise`<`undefined` \| \`0x$\{string}\`\> Merges multiple claim fractions into a single claim. ##### Parameters -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | +| Name | Type | Description | +| :------------ | :--------- | :--------------------------------------- | +| `fractionIds` | `bigint`[] | The IDs of the claim fractions to merge. | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Inherited from -[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) +[HypercertClientMethods](HypercertClientMethods.md).[mergeFractionUnits](HypercertClientMethods.md#mergefractionunits) #### Defined in -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) +sdk/src/types/client.ts:205 --- ### mintClaim -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `bigint`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`undefined` \| \`0x$\{string}\`\> Mints a new claim. @@ -224,14 +276,14 @@ Mints a new claim. | Name | Type | Description | | :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | | `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `totalUnits` | `bigint` | The total number of units for the claim. | | `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Inherited from @@ -239,33 +291,33 @@ A Promise that resolves to the transaction receipt #### Defined in -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) +sdk/src/types/client.ts:138 --- ### mintClaimFractionFromAllowlist -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> +• **mintClaimFractionFromAllowlist**: (`claimId`: `bigint`, `units`: `bigint`, `proof`: (\`0x$\{string}\` \| `Uint8Array`)[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> +▸ (`claimId`, `units`, `proof`): `Promise`<`undefined` \| \`0x$\{string}\`\> Mints a claim fraction from an allowlist. ##### Parameters -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | +| Name | Type | Description | +| :-------- | :----------------------------------- | :------------------------------------------ | +| `claimId` | `bigint` | The ID of the claim to mint a fraction for. | +| `units` | `bigint` | The number of units for the fraction. | +| `proof` | (\`0x$\{string}\` \| `Uint8Array`)[] | The Merkle proof for the allowlist. | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Inherited from @@ -273,7 +325,7 @@ A Promise that resolves to the transaction receipt #### Defined in -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) +sdk/src/types/client.ts:221 --- @@ -289,40 +341,40 @@ Whether the client is in read-only mode. #### Defined in -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) +sdk/src/types/client.ts:119 --- -### splitClaimUnits +### splitFractionUnits -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> +• **splitFractionUnits**: (`fractionId`: `bigint`, `fractions`: `bigint`[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> +▸ (`fractionId`, `fractions`): `Promise`<`undefined` \| \`0x$\{string}\`\> Splits a claim into multiple fractions. ##### Parameters -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | +| Name | Type | Description | +| :----------- | :--------- | :---------------------------- | +| `fractionId` | `bigint` | The ID of the claim to split. | +| `fractions` | `bigint`[] | - | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Inherited from -[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) +[HypercertClientMethods](HypercertClientMethods.md).[splitFractionUnits](HypercertClientMethods.md#splitfractionunits) #### Defined in -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) +sdk/src/types/client.ts:198 --- @@ -338,4 +390,38 @@ The storage layer used by the client. #### Defined in -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) +sdk/src/types/client.ts:121 + +--- + +### transferFraction + +• **transferFraction**: (`fractionId`: `bigint`, `to`: \`0x$\{string}\`, `overrides?`: [`SupportedOverrides`](../modules.md#supportedoverrides)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionId`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Transfers a claim fraction to a new owner. + +##### Parameters + +| Name | Type | +| :----------- | :------------------------------------------------------- | +| `fractionId` | `bigint` | +| `to` | \`0x$\{string}\` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[transferFraction](HypercertClientMethods.md#transferfraction) + +#### Defined in + +sdk/src/types/client.ts:158 diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md index 734ccbee..c6f4aa3c 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods - -# Interface: HypercertClientMethods +--- +id: "HypercertClientMethods" +title: "Interface: HypercertClientMethods" +sidebar_label: "HypercertClientMethods" +sidebar_position: 0 +custom_edit_url: null +--- The methods for the Hypercert client. @@ -10,30 +14,34 @@ The methods for the Hypercert client. ↳ [`HypercertClientInterface`](HypercertClientInterface.md) -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) -- [createAllowlist](HypercertClientMethods.md#createallowlist) -- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) -- [mintClaim](HypercertClientMethods.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) - ## Properties ### batchMintClaimFractionsFromAllowlists -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `bigint`[], `units`: `bigint`[], `proofs`: (\`0x$\{string}\` \| `Uint8Array`)[][]) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> +▸ (`claimIds`, `units`, `proofs`): `Promise`<`undefined` \| \`0x$\{string}\`\> Batch mints a claim fraction from an allowlist +##### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------- | :---------------------------------------------------- | +| `claimIds` | `bigint`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `bigint`[] | Array of the number of units for each fraction. | +| `proofs` | (\`0x$\{string}\` \| `Uint8Array`)[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction hash + **`Note`** The length of the arrays must be equal. @@ -42,63 +50,77 @@ The length of the arrays must be equal. The order of the arrays must be equal. +#### Defined in + +sdk/src/types/client.ts:237 + +--- + +### batchTransferFractions + +• **batchTransferFractions**: (`fractionIds`: `bigint`[], `to`: \`0x$\{string}\`, `overrides?`: [`SupportedOverrides`](../modules.md#supportedoverrides)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionIds`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Transfers multiple claim fractions to a new owner. + ##### Parameters -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | +| Name | Type | +| :------------ | :------------------------------------------------------- | +| `fractionIds` | `bigint`[] | +| `to` | \`0x$\{string}\` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | ##### Returns -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) +sdk/src/types/client.ts:171 --- ### burnClaimFraction -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> +• **burnClaimFraction**: (`fractionId`: `bigint`) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`claimId`): `Promise`<`ContractTransaction`\> +▸ (`fractionId`): `Promise`<`undefined` \| \`0x$\{string}\`\> Burns a claim fraction. ##### Parameters -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | +| Name | Type | Description | +| :----------- | :------- | :------------------------------------ | +| `fractionId` | `bigint` | The ID of the claim fraction to burn. | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) +sdk/src/types/client.ts:212 --- ### createAllowlist -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `bigint`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`undefined` \| \`0x$\{string}\`\> Creates a new allowlist and mints a new claim with the allowlist. @@ -108,56 +130,84 @@ Creates a new allowlist and mints a new claim with the allowlist. | :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | | `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | | `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `totalUnits` | `bigint` | The total number of units for the claim. | | `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) +sdk/src/types/client.ts:185 --- -### mergeClaimUnits +### getTransferRestrictions -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> +• **getTransferRestrictions**: (`fractionId`: `bigint`) => `Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> #### Type declaration -▸ (`claimIds`): `Promise`<`ContractTransaction`\> +▸ (`fractionId`): `Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +Retrieves the TransferRestrictions for a claim. + +##### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------------- | +| `fractionId` | `bigint` | The ID of the claim to retrieve. | + +##### Returns + +`Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +A Promise that resolves to the applicable transfer restrictions. + +#### Defined in + +sdk/src/types/client.ts:149 + +--- + +### mergeFractionUnits + +• **mergeFractionUnits**: (`fractionIds`: `bigint`[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionIds`): `Promise`<`undefined` \| \`0x$\{string}\`\> Merges multiple claim fractions into a single claim. ##### Parameters -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | +| Name | Type | Description | +| :------------ | :--------- | :--------------------------------------- | +| `fractionIds` | `bigint`[] | The IDs of the claim fractions to merge. | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) +sdk/src/types/client.ts:205 --- ### mintClaim -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `bigint`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`undefined` \| \`0x$\{string}\`\> Mints a new claim. @@ -166,74 +216,104 @@ Mints a new claim. | Name | Type | Description | | :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | | `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `totalUnits` | `bigint` | The total number of units for the claim. | | `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) +sdk/src/types/client.ts:138 --- ### mintClaimFractionFromAllowlist -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> +• **mintClaimFractionFromAllowlist**: (`claimId`: `bigint`, `units`: `bigint`, `proof`: (\`0x$\{string}\` \| `Uint8Array`)[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> +▸ (`claimId`, `units`, `proof`): `Promise`<`undefined` \| \`0x$\{string}\`\> Mints a claim fraction from an allowlist. ##### Parameters -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | +| Name | Type | Description | +| :-------- | :----------------------------------- | :------------------------------------------ | +| `claimId` | `bigint` | The ID of the claim to mint a fraction for. | +| `units` | `bigint` | The number of units for the fraction. | +| `proof` | (\`0x$\{string}\` \| `Uint8Array`)[] | The Merkle proof for the allowlist. | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) +sdk/src/types/client.ts:221 --- -### splitClaimUnits +### splitFractionUnits -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> +• **splitFractionUnits**: (`fractionId`: `bigint`, `fractions`: `bigint`[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> #### Type declaration -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> +▸ (`fractionId`, `fractions`): `Promise`<`undefined` \| \`0x$\{string}\`\> Splits a claim into multiple fractions. ##### Parameters -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | +| Name | Type | Description | +| :----------- | :--------- | :---------------------------- | +| `fractionId` | `bigint` | The ID of the claim to split. | +| `fractions` | `bigint`[] | - | ##### Returns -`Promise`<`ContractTransaction`\> +`Promise`<`undefined` \| \`0x$\{string}\`\> -A Promise that resolves to the transaction receipt +A Promise that resolves to the transaction hash + +#### Defined in + +sdk/src/types/client.ts:198 + +--- + +### transferFraction + +• **transferFraction**: (`fractionId`: `bigint`, `to`: \`0x$\{string}\`, `overrides?`: [`SupportedOverrides`](../modules.md#supportedoverrides)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionId`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Transfers a claim fraction to a new owner. + +##### Parameters + +| Name | Type | +| :----------- | :------------------------------------------------------- | +| `fractionId` | `bigint` | +| `to` | \`0x$\{string}\` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) +sdk/src/types/client.ts:158 diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md index 2d90a599..69a38d6f 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState - -# Interface: HypercertClientState +--- +id: "HypercertClientState" +title: "Interface: HypercertClientState" +sidebar_label: "HypercertClientState" +sidebar_position: 0 +custom_edit_url: null +--- The state of the Hypercert client. @@ -10,38 +14,27 @@ The state of the Hypercert client. ↳ [`HypercertClientInterface`](HypercertClientInterface.md) -## Table of contents - -### Properties - -- [contract](HypercertClientState.md#contract) -- [indexer](HypercertClientState.md#indexer) -- [readonly](HypercertClientState.md#readonly) -- [storage](HypercertClientState.md#storage) - ## Properties ### contract -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. +• **contract**: `GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[]\> #### Defined in -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) +sdk/src/types/client.ts:124 --- ### indexer -• **indexer**: [`default`](../classes/internal.default-1.md) +• **indexer**: `HypercertIndexer` The indexer used by the client. #### Defined in -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) +sdk/src/types/client.ts:123 --- @@ -53,7 +46,7 @@ Whether the client is in read-only mode. #### Defined in -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) +sdk/src/types/client.ts:119 --- @@ -65,4 +58,4 @@ The storage layer used by the client. #### Defined in -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) +sdk/src/types/client.ts:121 diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md index 6ebed93a..59e77fde 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema - -# Interface: HypercertEvaluationSchema +--- +id: "HypercertEvaluationSchema" +title: "Interface: HypercertEvaluationSchema" +sidebar_label: "HypercertEvaluationSchema" +sidebar_position: 0 +custom_edit_url: null +--- Schema for evaluating Hypercerts across different sources and evaluation types @@ -8,14 +12,6 @@ Schema for evaluating Hypercerts across different sources and evaluation types ▪ [k: `string`]: `unknown` -## Table of contents - -### Properties - -- [creator](HypercertEvaluationSchema.md#creator) -- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) -- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) - ## Properties ### creator @@ -24,7 +20,7 @@ Schema for evaluating Hypercerts across different sources and evaluation types #### Defined in -[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) +sdk/src/types/evaluation.d.ts:15 --- @@ -34,7 +30,7 @@ Schema for evaluating Hypercerts across different sources and evaluation types #### Defined in -[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) +sdk/src/types/evaluation.d.ts:16 --- @@ -44,4 +40,4 @@ Schema for evaluating Hypercerts across different sources and evaluation types #### Defined in -[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) +sdk/src/types/evaluation.d.ts:17 diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md index f18c409f..dcda3dd2 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -1,32 +1,20 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface - -# Interface: HypercertIndexerInterface - -## Implemented by - -- [`default`](../classes/internal.default-1.md) - -## Table of contents - -### Properties - -- [claimById](HypercertIndexerInterface.md#claimbyid) -- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) -- [firstClaims](HypercertIndexerInterface.md#firstclaims) -- [fractionById](HypercertIndexerInterface.md#fractionbyid) -- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) -- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) -- [graphClient](HypercertIndexerInterface.md#graphclient) +--- +id: "HypercertIndexerInterface" +title: "Interface: HypercertIndexerInterface" +sidebar_label: "HypercertIndexerInterface" +sidebar_position: 0 +custom_edit_url: null +--- ## Properties ### claimById -• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> +• **claimById**: (`id`: `string`) => `Promise`<`undefined` \| `ClaimByIdQuery`\> #### Type declaration -▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> +▸ (`id`): `Promise`<`undefined` \| `ClaimByIdQuery`\> ##### Parameters @@ -36,21 +24,21 @@ ##### Returns -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> +`Promise`<`undefined` \| `ClaimByIdQuery`\> #### Defined in -[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) +sdk/src/types/indexer.ts:20 --- ### claimsByOwner -• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> +• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimsByOwnerQuery`\> #### Type declaration -▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> +▸ (`owner`, `params?`): `Promise`<`undefined` \| `ClaimsByOwnerQuery`\> ##### Parameters @@ -61,21 +49,21 @@ ##### Returns -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> +`Promise`<`undefined` \| `ClaimsByOwnerQuery`\> #### Defined in -[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) +sdk/src/types/indexer.ts:19 --- ### firstClaims -• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> +• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `RecentClaimsQuery`\> #### Type declaration -▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> +▸ (`params?`): `Promise`<`undefined` \| `RecentClaimsQuery`\> ##### Parameters @@ -85,21 +73,21 @@ ##### Returns -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> +`Promise`<`undefined` \| `RecentClaimsQuery`\> #### Defined in -[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) +sdk/src/types/indexer.ts:21 --- ### fractionById -• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> +• **fractionById**: (`fractionId`: `string`) => `Promise`<`undefined` \| `ClaimTokenByIdQuery`\> #### Type declaration -▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> +▸ (`fractionId`): `Promise`<`undefined` \| `ClaimTokenByIdQuery`\> ##### Parameters @@ -109,21 +97,21 @@ ##### Returns -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> +`Promise`<`undefined` \| `ClaimTokenByIdQuery`\> #### Defined in -[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) +sdk/src/types/indexer.ts:24 --- ### fractionsByClaim -• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> +• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> #### Type declaration -▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> +▸ (`claimId`, `params?`): `Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> ##### Parameters @@ -134,21 +122,21 @@ ##### Returns -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> +`Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> #### Defined in -[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) +sdk/src/types/indexer.ts:23 --- ### fractionsByOwner -• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> +• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> #### Type declaration -▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> +▸ (`owner`, `params?`): `Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> ##### Parameters @@ -159,18 +147,18 @@ ##### Returns -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> +`Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> #### Defined in -[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) +sdk/src/types/indexer.ts:22 --- ### graphClient -• **graphClient**: `any` +• **graphClient**: `Client` #### Defined in -[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) +sdk/src/types/indexer.ts:18 diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md index d65362f3..c0a9cbf8 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md @@ -1,23 +1,13 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata - -# Interface: HypercertMetadata +--- +id: "HypercertMetadata" +title: "Interface: HypercertMetadata" +sidebar_label: "HypercertMetadata" +sidebar_position: 0 +custom_edit_url: null +--- Claim data for hypercert. ERC1155 Metadata compliant -## Table of contents - -### Properties - -- [allowList](HypercertMetadata.md#allowlist) -- [description](HypercertMetadata.md#description) -- [external_url](HypercertMetadata.md#external_url) -- [hypercert](HypercertMetadata.md#hypercert) -- [image](HypercertMetadata.md#image) -- [name](HypercertMetadata.md#name) -- [properties](HypercertMetadata.md#properties) -- [ref](HypercertMetadata.md#ref) -- [version](HypercertMetadata.md#version) - ## Properties ### allowList @@ -28,7 +18,7 @@ A CID pointer to the merke tree proof json on ipfs #### Defined in -[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) +sdk/src/types/metadata.d.ts:39 --- @@ -40,7 +30,7 @@ Describes the asset to which this token represents #### Defined in -[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) +sdk/src/types/metadata.d.ts:19 --- @@ -52,17 +42,17 @@ An url pointing to the external website of the project #### Defined in -[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) +sdk/src/types/metadata.d.ts:23 --- ### hypercert -• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) +• `Optional` **hypercert**: `HypercertClaimdata` #### Defined in -[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) +sdk/src/types/metadata.d.ts:45 --- @@ -74,7 +64,7 @@ A URI pointing to a resource with mime type image/\* representing the asset to w #### Defined in -[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) +sdk/src/types/metadata.d.ts:27 --- @@ -86,17 +76,17 @@ Identifies the asset to which this token represents #### Defined in -[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) +sdk/src/types/metadata.d.ts:15 --- ### properties -• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] +• `Optional` **properties**: \{ `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] #### Defined in -[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) +sdk/src/types/metadata.d.ts:40 --- @@ -108,7 +98,7 @@ Describes the asset to which this token represents #### Defined in -[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) +sdk/src/types/metadata.d.ts:35 --- @@ -120,4 +110,4 @@ The version of Hypercert schema used to describe this hypercert #### Defined in -[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) +sdk/src/types/metadata.d.ts:31 diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md b/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md index 773c41d3..f97b5d26 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md @@ -1,19 +1,15 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer - -# Interface: HypercertPointer +--- +id: "HypercertPointer" +title: "Interface: HypercertPointer" +sidebar_label: "HypercertPointer" +sidebar_position: 0 +custom_edit_url: null +--- ## Indexable ▪ [k: `string`]: `unknown` -## Table of contents - -### Properties - -- [chainId](HypercertPointer.md#chainid) -- [claimId](HypercertPointer.md#claimid) -- [contract](HypercertPointer.md#contract) - ## Properties ### chainId @@ -22,7 +18,7 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) +sdk/src/types/evaluation.d.ts:28 --- @@ -32,7 +28,7 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) +sdk/src/types/evaluation.d.ts:30 --- @@ -42,4 +38,4 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) +sdk/src/types/evaluation.d.ts:29 diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md index 8ffda51e..ba0a2551 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface - -# Interface: HypercertStorageInterface +--- +id: "HypercertStorageInterface" +title: "Interface: HypercertStorageInterface" +sidebar_label: "HypercertStorageInterface" +sidebar_position: 0 +custom_edit_url: null +--- The interface for the Hypercert storage layer. @@ -8,15 +12,6 @@ The interface for the Hypercert storage layer. - [`HypercertsStorage`](../classes/HypercertsStorage.md) -## Table of contents - -### Properties - -- [getData](HypercertStorageInterface.md#getdata) -- [getMetadata](HypercertStorageInterface.md#getmetadata) -- [storeData](HypercertStorageInterface.md#storedata) -- [storeMetadata](HypercertStorageInterface.md#storemetadata) - ## Properties ### getData @@ -43,7 +38,7 @@ A Promise that resolves to the retrieved data. #### Defined in -[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) +sdk/src/types/client.ts:98 --- @@ -71,7 +66,7 @@ A Promise that resolves to the retrieved metadata. #### Defined in -[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) +sdk/src/types/client.ts:84 --- @@ -99,7 +94,7 @@ A Promise that resolves to the CID of the stored data. #### Defined in -[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) +sdk/src/types/client.ts:91 --- @@ -127,4 +122,4 @@ A Promise that resolves to the CID of the stored metadata. #### Defined in -[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) +sdk/src/types/client.ts:77 diff --git a/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md index 5f5871f2..15835a1e 100644 --- a/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -1,18 +1,15 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation - -# Interface: IPFSEvaluation +--- +id: "IPFSEvaluation" +title: "Interface: IPFSEvaluation" +sidebar_label: "IPFSEvaluation" +sidebar_position: 0 +custom_edit_url: null +--- ## Indexable ▪ [k: `string`]: `unknown` -## Table of contents - -### Properties - -- [cid](IPFSEvaluation.md#cid) -- [type](IPFSEvaluation.md#type) - ## Properties ### cid @@ -21,7 +18,7 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) +sdk/src/types/evaluation.d.ts:48 --- @@ -31,4 +28,4 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) +sdk/src/types/evaluation.d.ts:47 diff --git a/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md index 3e4b3b92..0ad3d38f 100644 --- a/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -1,19 +1,15 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation - -# Interface: SimpleTextEvaluation +--- +id: "SimpleTextEvaluation" +title: "Interface: SimpleTextEvaluation" +sidebar_label: "SimpleTextEvaluation" +sidebar_position: 0 +custom_edit_url: null +--- ## Indexable ▪ [k: `string`]: `unknown` -## Table of contents - -### Properties - -- [hypercert](SimpleTextEvaluation.md#hypercert) -- [text](SimpleTextEvaluation.md#text) -- [type](SimpleTextEvaluation.md#type) - ## Properties ### hypercert @@ -22,7 +18,7 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) +sdk/src/types/evaluation.d.ts:35 --- @@ -32,7 +28,7 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) +sdk/src/types/evaluation.d.ts:36 --- @@ -42,4 +38,4 @@ #### Defined in -[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) +sdk/src/types/evaluation.d.ts:34 diff --git a/docs/docs/developer/api/sdk/interfaces/_category_.yml b/docs/docs/developer/api/sdk/interfaces/_category_.yml new file mode 100644 index 00000000..43bec88c --- /dev/null +++ b/docs/docs/developer/api/sdk/interfaces/_category_.yml @@ -0,0 +1,2 @@ +label: "Interfaces" +position: 4 \ No newline at end of file diff --git a/docs/docs/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/docs/developer/api/sdk/interfaces/internal.EvaluatorInterface.md deleted file mode 100644 index 53ac36ed..00000000 --- a/docs/docs/developer/api/sdk/interfaces/internal.EvaluatorInterface.md +++ /dev/null @@ -1,43 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface - -# Interface: EvaluatorInterface - -[internal](../modules/internal.md).EvaluatorInterface - -## Implemented by - -- [`default`](../classes/internal.default.md) - -## Table of contents - -### Properties - -- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) - -## Properties - -### submitEvaluation - -• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -##### Parameters - -| Name | Type | Description | -| :----------- | :---------------------------------------------------------- | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | - -##### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Defined in - -[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/docs/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/docs/developer/api/sdk/interfaces/internal.HypercertClaimdata.md deleted file mode 100644 index 273912bc..00000000 --- a/docs/docs/developer/api/sdk/interfaces/internal.HypercertClaimdata.md +++ /dev/null @@ -1,169 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata - -# Interface: HypercertClaimdata - -[internal](../modules/internal.md).HypercertClaimdata - -Properties of an impact claim - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [contributors](internal.HypercertClaimdata.md#contributors) -- [impact_scope](internal.HypercertClaimdata.md#impact_scope) -- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) -- [rights](internal.HypercertClaimdata.md#rights) -- [work_scope](internal.HypercertClaimdata.md#work_scope) -- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) - -## Properties - -### contributors - -• **contributors**: `Object` - -Contributors - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) - ---- - -### impact_scope - -• **impact_scope**: `Object` - -Scopes of impact - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) - ---- - -### impact_timeframe - -• **impact_timeframe**: `Object` - -Impact time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) - ---- - -### rights - -• `Optional` **rights**: `Object` - -Rights - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) - ---- - -### work_scope - -• **work_scope**: `Object` - -Scopes of work - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) - ---- - -### work_timeframe - -• **work_timeframe**: `Object` - -Work time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/docs/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/docs/developer/api/sdk/interfaces/internal.HypercertMinter.md deleted file mode 100644 index 3f4ea346..00000000 --- a/docs/docs/developer/api/sdk/interfaces/internal.HypercertMinter.md +++ /dev/null @@ -1,17 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter - -# Interface: HypercertMinter - -[internal](../modules/internal.md).HypercertMinter - -Hypercert contract interface. - -**`Notice`** - -hacky loop to get typedoc to generate all the docs - -## Hierarchy - -- `HypercertMinter` - - ↳ **`HypercertMinter`** diff --git a/docs/docs/developer/api/sdk/modules.md b/docs/docs/developer/api/sdk/modules.md index 15998930..0d5aa920 100644 --- a/docs/docs/developer/api/sdk/modules.md +++ b/docs/docs/developer/api/sdk/modules.md @@ -1,23 +1,16 @@ -[Hypercerts SDK Documentation](README.md) / Exports - -# Hypercerts SDK Documentation - -## Table of contents - -### References - -- [Claim](modules.md#claim) -- [ClaimToken](modules.md#claimtoken) -- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) - -### Modules - -- [internal](modules/internal.md) +--- +id: "modules" +title: "@hypercerts-org/sdk" +sidebar_label: "Exports" +sidebar_position: 0.5 +custom_edit_url: null +--- -### Classes +## Classes - [ClientError](classes/ClientError.md) - [ConfigurationError](classes/ConfigurationError.md) +- [ContractError](classes/ContractError.md) - [FetchError](classes/FetchError.md) - [HypercertClient](classes/HypercertClient.md) - [HypercertsStorage](classes/HypercertsStorage.md) @@ -28,7 +21,7 @@ - [UnknownSchemaError](classes/UnknownSchemaError.md) - [UnsupportedChainError](classes/UnsupportedChainError.md) -### Interfaces +## Interfaces - [CustomError](interfaces/CustomError.md) - [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) @@ -45,88 +38,24 @@ - [IPFSEvaluation](interfaces/IPFSEvaluation.md) - [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) -### Type Aliases - -- [AllowlistEntry](modules.md#allowlistentry) -- [Deployment](modules.md#deployment) -- [EvaluationData](modules.md#evaluationdata) -- [EvaluationSource](modules.md#evaluationsource) -- [HypercertClientConfig](modules.md#hypercertclientconfig) -- [HypercertClientProps](modules.md#hypercertclientprops) -- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) -- [HypercertStorageConfig](modules.md#hypercertstorageconfig) -- [HypercertsSdkError](modules.md#hypercertssdkerror) -- [QueryParams](modules.md#queryparams) -- [SupportedChainIds](modules.md#supportedchainids) -- [TransferRestrictions](modules.md#transferrestrictions) - -### Properties - -- [ClaimByIdQuery](modules.md#claimbyidquery) - -### Variables - -- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) -- [TransferRestrictions](modules.md#transferrestrictions-1) - -### Functions - -- [execute](modules.md#execute) -- [formatDate](modules.md#formatdate) -- [formatHypercertData](modules.md#formathypercertdata) -- [formatUnixTime](modules.md#formatunixtime) -- [validateAllowlist](modules.md#validateallowlist) -- [validateClaimData](modules.md#validateclaimdata) -- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) -- [validateMetaData](modules.md#validatemetadata) -- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) -- [verifyMerkleProof](modules.md#verifymerkleproof) -- [verifyMerkleProofs](modules.md#verifymerkleproofs) - -## References - -### Claim - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimToken - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimTokensByClaimQuery - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ## Type Aliases ### AllowlistEntry Ƭ **AllowlistEntry**: `Object` -Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol - -**`Param`** - -Address of the recipient - -**`Param`** - -Number of units allocated to the recipient +Represents an entry in an allowlist. #### Type declaration -| Name | Type | -| :-------- | :------------- | -| `address` | `string` | -| `units` | `BigNumberish` | +| Name | Type | +| :-------- | :------- | +| `address` | `string` | +| `units` | `bigint` | #### Defined in -[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) +sdk/src/types/hypercerts.ts:24 --- @@ -138,16 +67,16 @@ Represents a deployment of a contract on a specific network. #### Type declaration -| Name | Type | Description | -| :---------------- | :------- | :--------------------------------------------------------------------------------------- | -| `chainId` | `number` | The ID of the network on which the contract is deployed. | -| `chainName` | `string` | The name of the network on which the contract is deployed. | -| `contractAddress` | `string` | The address of the deployed contract. | -| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | +| Name | Type | Description | +| :---------------- | :------------------ | :--------------------------------------------------------------------------------------- | +| `chain` | `Partial`<`Chain`\> | - | +| `contractAddress` | `string` | The address of the deployed contract. | +| `graphName` | `string` | - | +| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | #### Defined in -[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) +sdk/src/types/client.ts:23 --- @@ -161,7 +90,7 @@ and run json-schema-to-typescript to regenerate this file. #### Defined in -[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) +sdk/src/types/evaluation.d.ts:8 --- @@ -171,19 +100,19 @@ and run json-schema-to-typescript to regenerate this file. #### Defined in -[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) +sdk/src/types/evaluation.d.ts:9 --- ### HypercertClientConfig -Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } +Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & \{ `publicClient`: `PublicClient` ; `readOnly`: `boolean` ; `readOnlyReason?`: `string` ; `unsafeForceOverrideConfig?`: `boolean` ; `walletClient`: `WalletClient` } Configuration options for the Hypercert client. #### Defined in -[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) +sdk/src/types/client.ts:35 --- @@ -201,13 +130,13 @@ The props for the Hypercert client. #### Defined in -[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) +sdk/src/types/client.ts:104 --- ### HypercertEvaluatorConfig -Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } +Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & \{ `easContractAddress`: `string` } Configuration options for the Hypercert evaluator. @@ -217,7 +146,7 @@ The signer is required for submitting evaluations. #### Defined in -[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) +sdk/src/types/client.ts:64 --- @@ -240,7 +169,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) +sdk/src/types/client.ts:53 --- @@ -250,7 +179,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) +sdk/src/types/errors.ts:195 --- @@ -260,7 +189,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Index signature -▪ [key: `string`]: `any` +▪ [key: `string`]: `string` \| `number` \| `undefined` #### Type declaration @@ -272,65 +201,75 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) +sdk/src/types/indexer.ts:10 --- ### SupportedChainIds -Ƭ **SupportedChainIds**: `5` \| `10` +Ƭ **SupportedChainIds**: `5` \| `10` \| `42220` \| `11155111` #### Defined in -[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) +sdk/src/types/client.ts:13 --- -### TransferRestrictions +### SupportedOverrides -Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] +Ƭ **SupportedOverrides**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :------- | +| `gasLimit?` | `bigint` | +| `gasPrice?` | `bigint` | +| `value?` | `bigint` | #### Defined in -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) +sdk/src/types/client.ts:14 -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) +--- + +### TransferRestrictions + +Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] -## Properties +#### Defined in -### ClaimByIdQuery +sdk/src/types/hypercerts.ts:9 -• **ClaimByIdQuery**: `any` +sdk/src/types/hypercerts.ts:15 ## Variables -### INDEFINITE_DATE_STRING +### HypercertExchangeAbi -• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` +• **HypercertExchangeAbi**: (\{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "\_owner"; `type`: `string` = "address" }[] ; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = "length"; `type`: `string` = "uint256" }[] ; `name`: `string` = "MerkleProofTooLarge"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: (\{ `components`: \{ `internalType`: `string` = "bytes32"; `name`: `string` = "orderHash"; `type`: `string` = "bytes32" }[] ; `indexed`: `boolean` = false; `internalType`: `string` = "struct ILooksRareProtocol.NonceInvalidationParameters"; `name`: `string` = "nonceInvalidationParameters"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "askUser"; `type`: `string` = "address" })[] ; `name`: `string` = "TakerAsk"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: (\{ `components?`: `undefined` ; `internalType`: `string` = "bytes[]"; `name`: `string` = "makerSignatures"; `type`: `string` = "bytes[]" } \| \{ `components`: (\{ `components?`: `undefined` ; `internalType`: `string` = "bytes32"; `name`: `string` = "root"; `type`: `string` = "bytes32" } \| \{ `components`: \{ `internalType`: `string` = "bytes32"; `name`: `string` = "value"; `type`: `string` = "bytes32" }[] ; `internalType`: `string` = "struct OrderStructs.MerkleTreeNode[]"; `name`: `string` = "proof"; `type`: `string` = "tuple[]" })[] ; `internalType`: `string` = "struct OrderStructs.MerkleTree[]"; `name`: `string` = "merkleTrees"; `type`: `string` = "tuple[]" })[] ; `name`: `string` = "executeMultipleTakerBids"; `outputs`: `never`[] = []; `stateMutability`: `string` = "payable"; `type`: `string` = "function" } \| \{ `anonymous?`: `undefined` = false; `inputs`: (\{ `components`: \{ `internalType`: `string` = "address"; `name`: `string` = "recipient"; `type`: `string` = "address" }[] ; `internalType`: `string` = "struct OrderStructs.Taker"; `name`: `string` = "takerBid"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `internalType`: `string` = "address"; `name`: `string` = "sender"; `type`: `string` = "address" })[] ; `name`: `string` = "restrictedExecuteTakerBid"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = "protocolFeeAmount"; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "function" })[] #### Defined in -[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) +node_modules/.pnpm/@hypercerts-org+contracts@1.0.0-alpha.6_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:1524 --- -### TransferRestrictions +### HypercertMinterAbi -• `Const` **TransferRestrictions**: `Object` +• **HypercertMinterAbi**: (\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[] -Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol - -**`Dev`** +#### Defined in -AllowAll: All transfers are allowed +node_modules/.pnpm/@hypercerts-org+contracts@1.0.0-alpha.6_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:352 -**`Dev`** +--- -DisallowAll: All transfers are disallowed +### TransferRestrictions -**`Dev`** +• `Const` **TransferRestrictions**: `Object` -FromCreatorOnly: Only the creator can transfer the Hypercert +Represents the possible transfer restrictions of a claim matching the hypercerts protocol. #### Type declaration @@ -342,238 +281,418 @@ FromCreatorOnly: Only the creator can transfer the Hypercert #### Defined in -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) +sdk/src/types/hypercerts.ts:9 -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) +sdk/src/types/hypercerts.ts:15 + +--- + +### deployments + +• `Const` **deployments**: \{ [key in SupportedChainIds]: Partial } + +#### Defined in + +sdk/src/constants.ts:10 + +--- + +### logger + +• `Const` **logger**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :-------------------------------------------------------------------------- | +| `debug` | (`message`: `string`, `label?`: `string`, ...`data`: `unknown`[]) => `void` | +| `error` | (`error`: `Error`, `label?`: `string`) => `void` | +| `info` | (`message`: `string`, `label?`: `string`, ...`data`: `unknown`[]) => `void` | +| `warn` | (`message`: `string`, `label?`: `string`, ...`data`: `unknown`[]) => `void` | + +#### Defined in + +sdk/src/utils/logger.ts:24 ## Functions -### execute +### formatHypercertData -▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> +▸ **formatHypercertData**(`«destructured»`): `FormatResult` + +Formats input data to an object containing HypercertMetadata including appropriate labels #### Parameters -| Name | Type | -| :--------------- | :-------------------------------- | -| `document` | `GraphQLOperation`<`any`, `any`\> | -| `variables` | `any` | -| `context?` | `any` | -| `rootValue?` | `any` | -| `operationName?` | `string` | +| Name | Type | +| :----------------------- | :------------------------------------------------ | +| `«destructured»` | `Object` | +| › `contributors` | `string`[] | +| › `description` | `string` | +| › `excludedImpactScope` | `string`[] | +| › `excludedRights` | `string`[] | +| › `excludedWorkScope` | `string`[] | +| › `external_url?` | `string` | +| › `image` | `string` | +| › `impactScope` | `string`[] | +| › `impactTimeframeEnd` | `number` | +| › `impactTimeframeStart` | `number` | +| › `name` | `string` | +| › `properties?` | \{ `trait_type`: `string` ; `value`: `string` }[] | +| › `rights` | `string`[] | +| › `version` | `string` | +| › `workScope` | `string`[] | +| › `workTimeframeEnd` | `number` | +| › `workTimeframeStart` | `number` | #### Returns -`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> +`FormatResult` #### Defined in -node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 +sdk/src/utils/formatter.ts:27 --- -### formatDate +### getFromIPFS -▸ **formatDate**(`date`): `string` +▸ **getFromIPFS**(`cidOrIpfsUri`, `timeout?`): `Promise`<`unknown`\> + +Fetches data from IPFS using either the NFT Storage gateway or the Web3 Storage gateway. + +This function attempts to fetch data from the NFT Storage gateway first. If the request times out, it then tries to fetch the data from the Web3 Storage gateway. +If the data cannot be fetched from either gateway, it throws a `StorageError`. #### Parameters -| Name | Type | -| :----- | :----- | -| `date` | `Date` | +| Name | Type | Default value | Description | +| :------------- | :------- | :------------ | :---------------------------------------------------------------------- | +| `cidOrIpfsUri` | `string` | `undefined` | The CID or IPFS URI of the data to fetch. | +| `timeout?` | `number` | `10000` | The timeout for the fetch request in milliseconds. Defaults to 10000ms. | #### Returns -`string` +`Promise`<`unknown`\> + +The data fetched from IPFS. + +**`Throws`** + +Will throw a `StoragjeError` if the data cannot be fetched from either gateway. + +**`Async`** #### Defined in -[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) +sdk/src/utils/fetchers.ts:17 --- -### formatHypercertData +### getProofsFromAllowlist -▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) +▸ **getProofsFromAllowlist**(`cidOrIpfsUri`, `account`): `Promise`<`undefined` \| \{ `proof`: `string`[] ; `root`: `string` = tree.root }\> -Formats input data to an object containing HypercertMetadata including appropriate labels +This function retrieves proofs from an allowlist. + +It fetches a Merkle tree from IPFS using a given CID or IPFS URI, then iterates over the tree to find an account. +When the account is found, it generates a proof for that account and logs the account, index, and proof as debug. +It returns the proof and the root of the Merkle tree. #### Parameters -| Name | Type | -| :----------------------- | :----------------------------------------------- | -| `«destructured»` | `Object` | -| › `contributors` | `string`[] | -| › `description` | `string` | -| › `excludedImpactScope` | `string`[] | -| › `excludedRights` | `string`[] | -| › `excludedWorkScope` | `string`[] | -| › `external_url?` | `string` | -| › `image` | `string` | -| › `impactScope` | `string`[] | -| › `impactTimeframeEnd` | `number` | -| › `impactTimeframeStart` | `number` | -| › `name` | `string` | -| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | -| › `rights` | `string`[] | -| › `version` | `string` | -| › `workScope` | `string`[] | -| › `workTimeframeEnd` | `number` | -| › `workTimeframeStart` | `number` | +| Name | Type | Description | +| :------------- | :--------------- | :------------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI to fetch the Merkle tree from. | +| `account` | \`0x$\{string}\` | The account to find in the Merkle tree. | #### Returns -[`FormatResult`](modules/internal.md#formatresult) +`Promise`<`undefined` \| \{ `proof`: `string`[] ; `root`: `string` = tree.root }\> + +An object containing the proof for the account and the root of the Merkle tree. + +**`Throws`** + +Will throw an error if the Merkle tree cannot be fetched. + +**`Async`** #### Defined in -[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) +sdk/src/utils/allowlist.ts:35 --- -### formatUnixTime +### handleContractError -▸ **formatUnixTime**(`seconds`): `string` +▸ **handleContractError**(`data`): [`ContractError`](classes/ContractError.md) #### Parameters -| Name | Type | -| :-------- | :------- | -| `seconds` | `number` | +| Name | Type | +| :----- | :--------------- | +| `data` | \`0x$\{string}\` | #### Returns -`string` +[`ContractError`](classes/ContractError.md) #### Defined in -[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) +sdk/src/utils/errors.ts:39 --- -### validateAllowlist +### handleSdkError -▸ **validateAllowlist**(`data`, `units`): `Object` +▸ **handleSdkError**(`err`): `void` -Validates the data for an allowlist. +Method to catch errors and log them #### Parameters -| Name | Type | Description | -| :------ | :---------------------------------------------- | :------------------------------------------ | -| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | -| `units` | `BigNumberish` | The total number of units in the allowlist. | +| Name | Type | Description | +| :---- | :---------------------------------------------------- | :-------------------------------------------- | +| `err` | [`HypercertsSdkError`](modules.md#hypercertssdkerror) | Error to handle defined in HypercertsSdkError | #### Returns -`Object` +`void` + +#### Defined in + +sdk/src/utils/errors.ts:22 + +--- + +### publicClientToProvider + +▸ **publicClientToProvider**(`publicClient`): `undefined` \| `FallbackProvider` \| `JsonRpcProvider` + +This function converts a `PublicClient` instance to an ethers.js `Provider` to faciliate compatibility between ethers and viem. + +It extracts the chain and transport from the `PublicClient` and creates a network object. +If no chain is found in the `PublicClient`, it logs a warning and stops the signature request. +If the transport type is "fallback", it creates a `FallbackProvider` with multiple transports. +Otherwise, it creates a `JsonRpcProvider` with a single transport. + +Ref: https://viem.sh/docs/ethers-migration.html + +#### Parameters + +| Name | Type | Description | +| :-------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `publicClient` | `Object` | The `PublicClient` instance to convert. | +| `publicClient.account` | `undefined` | The Account of the Client. | +| `publicClient.batch?` | `Object` | Flags for batch settings. | +| `publicClient.batch.multicall?` | `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } | Toggle to enable `eth_call` multicall aggregation. | +| `publicClient.cacheTime` | `number` | Time (in ms) that cached data will remain in memory. | +| `publicClient.call` | (`parameters`: `CallParameters`<`undefined` \| `Chain`\>) => `Promise`<`CallReturnType`\> | Executes a new message call immediately without submitting a transaction to the network. - Docs: https://viem.sh/docs/actions/public/call.html - JSON-RPC Methods: [`eth_call`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const data = await client.call({ account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', }) ` | +| `publicClient.chain` | `undefined` \| `Chain` | Chain for the client. | +| `publicClient.createBlockFilter` | () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"block"` }\> | Creates a Filter to listen for new block hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createBlockFilter.html - JSON-RPC Methods: [`eth_newBlockFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newBlockFilter) **`Example`** `ts import { createPublicClient, createBlockFilter, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await createBlockFilter(client) // { id: "0x345a6572337856574a76364e457a4366", type: 'block' } ` | +| `publicClient.createContractEventFilter` | (`args`: `CreateContractEventFilterParameters`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`CreateContractEventFilterReturnType`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Creates a Filter to retrieve event logs that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html) or [`getFilterLogs`](https://viem.sh/docs/actions/public/getFilterLogs.html). - Docs: https://viem.sh/docs/contract/createContractEventFilter.html **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createContractEventFilter({ abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']), }) ` | +| `publicClient.createEventFilter` | (`args?`: `CreateEventFilterParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`, `_EventName`, `_Args`\>) => `Promise`<\{ [K in keyof Filter<"event", TAbiEvents, \_EventName, \_Args, TStrict, TFromBlock, TToBlock\>]: Filter<"event", TAbiEvents, ... 4 more ..., TToBlock\>[K]; }\> | Creates a [`Filter`](https://viem.sh/docs/glossary/types.html#filter) to listen for new events that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createEventFilter.html - JSON-RPC Methods: [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2', }) ` | +| `publicClient.createPendingTransactionFilter` | () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"transaction"` }\> | Creates a Filter to listen for new pending transaction hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createPendingTransactionFilter.html - JSON-RPC Methods: [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createPendingTransactionFilter() // { id: "0x345a6572337856574a76364e457a4366", type: 'transaction' } ` | +| `publicClient.estimateContractGas` | (`args`: `EstimateContractGasParameters`<`TAbi`, `TFunctionName`, `TChain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> | Estimates the gas required to successfully execute a contract write function call. - Docs: https://viem.sh/docs/contract/estimateContractGas.html **`Remarks`** Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`estimateGas` action](https://viem.sh/docs/actions/public/estimateGas.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gas = await client.estimateContractGas({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint() public']), functionName: 'mint', account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', }) ` | +| `publicClient.estimateFeesPerGas` | (`args?`: `EstimateFeesPerGasParameters`<`undefined` \| `Chain`, `TChainOverride`, `TType`\>) => `Promise`<`EstimateFeesPerGasReturnType`\> | Returns an estimate for the fees per gas for a transaction to be included in the next block. - Docs: https://viem.sh/docs/actions/public/estimateFeesPerGas.html **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const maxPriorityFeePerGas = await client.estimateFeesPerGas() // { maxFeePerGas: ..., maxPriorityFeePerGas: ... } ` | +| `publicClient.estimateGas` | (`args`: `EstimateGasParameters`<`undefined` \| `Chain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> | Estimates the gas necessary to complete a transaction without submitting it to the network. - Docs: https://viem.sh/docs/actions/public/estimateGas.html - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas) **`Example`** `ts import { createPublicClient, http, parseEther } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gasEstimate = await client.estimateGas({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: parseEther('1'), }) ` | +| `publicClient.estimateMaxPriorityFeePerGas` | (`args?`: \{ `chain`: `null` \| `TChainOverride` }) => `Promise`<`bigint`\> | Returns an estimate for the max priority fee per gas (in wei) for a transaction to be included in the next block. - Docs: https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas.html **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const maxPriorityFeePerGas = await client.estimateMaxPriorityFeePerGas() // 10000000n ` | +| `publicClient.extend` | (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, `PublicActions`<`Transport`, `undefined` \| `Chain`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, \{ [K in keyof client]: client[K]; } & `PublicActions`<`Transport`, `undefined` \| `Chain`\>\> | - | +| `publicClient.getBalance` | (`args`: `GetBalanceParameters`) => `Promise`<`bigint`\> | Returns the balance of an address in wei. - Docs: https://viem.sh/docs/actions/public/getBalance.html - JSON-RPC Methods: [`eth_getBalance`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance) **`Remarks`** You can convert the balance to ether units with [`formatEther`](https://viem.sh/docs/utilities/formatEther.html). `ts const balance = await getBalance(client, { address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', blockTag: 'safe' }) const balanceAsEther = formatEther(balance) // "6.942" ` **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const balance = await client.getBalance({ address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) // 10000000000000000000000n (wei) ` | +| `publicClient.getBlock` | (`args?`: `GetBlockParameters`<`TIncludeTransactions`, `TBlockTag`\>) => `Promise`<`GetBlockReturnType`<`undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>\> | Returns information about a block at a block number, hash, or tag. - Docs: https://viem.sh/docs/actions/public/getBlock.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/fetching-blocks - JSON-RPC Methods: - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) for `blockNumber` & `blockTag`. - Calls [`eth_getBlockByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbyhash) for `blockHash`. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const block = await client.getBlock() ` | +| `publicClient.getBlockNumber` | (`args?`: `GetBlockNumberParameters`) => `Promise`<`bigint`\> | Returns the number of the most recent block seen. - Docs: https://viem.sh/docs/actions/public/getBlockNumber.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/fetching-blocks - JSON-RPC Methods: [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const blockNumber = await client.getBlockNumber() // 69420n ` | +| `publicClient.getBlockTransactionCount` | (`args?`: `GetBlockTransactionCountParameters`) => `Promise`<`number`\> | Returns the number of Transactions at a block number, hash, or tag. - Docs: https://viem.sh/docs/actions/public/getBlockTransactionCount.html - JSON-RPC Methods: - Calls [`eth_getBlockTransactionCountByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbynumber) for `blockNumber` & `blockTag`. - Calls [`eth_getBlockTransactionCountByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbyhash) for `blockHash`. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const count = await client.getBlockTransactionCount() ` | +| `publicClient.getBytecode` | (`args`: `GetBytecodeParameters`) => `Promise`<`GetBytecodeReturnType`\> | Retrieves the bytecode at an address. - Docs: https://viem.sh/docs/contract/getBytecode.html - JSON-RPC Methods: [`eth_getCode`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getcode) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const code = await client.getBytecode({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', }) ` | +| `publicClient.getChainId` | () => `Promise`<`number`\> | Returns the chain ID associated with the current network. - Docs: https://viem.sh/docs/actions/public/getChainId.html - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const chainId = await client.getChainId() // 1 ` | +| `publicClient.getContractEvents` | (`args`: `GetContractEventsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetContractEventsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs emitted by a contract. - Docs: https://viem.sh/docs/actions/public/getContractEvents.html - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { wagmiAbi } from './abi' const client = createPublicClient({ chain: mainnet, transport: http(), }) const logs = await client.getContractEvents(client, { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: wagmiAbi, eventName: 'Transfer' }) ` | +| `publicClient.getEnsAddress` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; coinType?: number \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsAddressReturnType`\> | Gets address for ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsAddress.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensAddress = await client.getEnsAddress({ name: normalize('wagmi-dev.eth'), }) // '0xd2135CfB216b74109775236E36d4b433F1DF507B' ` | +| `publicClient.getEnsAvatar` | (`args`: \{ name: string; blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; universalResolverAddress?: \`0x$\{string}\` \| undefined; gatewayUrls?: AssetGatewayUrls \| undefined; }) => `Promise`<`GetEnsAvatarReturnType`\> | Gets the avatar of an ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsAvatar.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText.html) with `key` set to `'avatar'`. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensAvatar = await client.getEnsAvatar({ name: normalize('wagmi-dev.eth'), }) // 'https://ipfs.io/ipfs/Qma8mnp6xV3J2cRNf3mTth5C8nV11CAnceVinc3y8jSbio' ` | +| `publicClient.getEnsName` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; address: \`0x$\{string}\`; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsNameReturnType`\> | Gets primary name for specified address. - Docs: https://viem.sh/docs/ens/actions/getEnsName.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `reverse(bytes)` on ENS Universal Resolver Contract to "reverse resolve" the address to the primary ENS name. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensName = await client.getEnsName({ address: '0xd2135CfB216b74109775236E36d4b433F1DF507B', }) // 'wagmi-dev.eth' ` | +| `publicClient.getEnsResolver` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<\`0x$\{string}\`\> | Gets resolver for ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsResolver.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `findResolver(bytes)` on ENS Universal Resolver Contract to retrieve the resolver of an ENS name. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const resolverAddress = await client.getEnsResolver({ name: normalize('wagmi-dev.eth'), }) // '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41' ` | +| `publicClient.getEnsText` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; key: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsTextReturnType`\> | Gets a text record for specified ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsResolver.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const twitterRecord = await client.getEnsText({ name: normalize('wagmi-dev.eth'), key: 'com.twitter', }) // 'wagmi_sh' ` | +| `publicClient.getFeeHistory` | (`args`: `GetFeeHistoryParameters`) => `Promise`<`GetFeeHistoryReturnType`\> | Returns a collection of historical gas information. - Docs: https://viem.sh/docs/actions/public/getFeeHistory.html - JSON-RPC Methods: [`eth_feeHistory`](https://docs.alchemy.com/reference/eth-feehistory) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const feeHistory = await client.getFeeHistory({ blockCount: 4, rewardPercentiles: [25, 75], }) ` | +| `publicClient.getFilterChanges` | (`args`: `GetFilterChangesParameters`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterChangesReturnType`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of logs or hashes based on a [Filter](/docs/glossary/terms#filter) since the last time it was called. - Docs: https://viem.sh/docs/actions/public/getFilterChanges.html - JSON-RPC Methods: [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges) **`Remarks`** A Filter can be created from the following actions: - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter.html) - [`createContractEventFilter`](https://viem.sh/docs/contract/createContractEventFilter.html) - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter.html) - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter.html) Depending on the type of filter, the return value will be different: - If the filter was created with `createContractEventFilter` or `createEventFilter`, it returns a list of logs. - If the filter was created with `createPendingTransactionFilter`, it returns a list of transaction hashes. - If the filter was created with `createBlockFilter`, it returns a list of block hashes. **`Example`** `ts // Blocks import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createBlockFilter() const hashes = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Contract Events import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createContractEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']), eventName: 'Transfer', }) const logs = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Raw Events import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'), }) const logs = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Transactions import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createPendingTransactionFilter() const hashes = await client.getFilterChanges({ filter }) ` | +| `publicClient.getFilterLogs` | (`args`: `GetFilterLogsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterLogsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs since the filter was created. - Docs: https://viem.sh/docs/actions/public/getFilterLogs.html - JSON-RPC Methods: [`eth_getFilterLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterlogs) **`Remarks`** `getFilterLogs` is only compatible with **event filters**. **`Example`** `ts import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'), }) const logs = await client.getFilterLogs({ filter }) ` | +| `publicClient.getGasPrice` | () => `Promise`<`bigint`\> | Returns the current price of gas (in wei). - Docs: https://viem.sh/docs/actions/public/getGasPrice.html - JSON-RPC Methods: [`eth_gasPrice`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gasprice) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gasPrice = await client.getGasPrice() ` | +| `publicClient.getLogs` | (`args?`: `GetLogsParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetLogsReturnType`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs matching the provided parameters. - Docs: https://viem.sh/docs/actions/public/getLogs.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/filters-and-logs/event-logs - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) **`Example`** `ts import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const logs = await client.getLogs() ` | +| `publicClient.getProof` | (`args`: `GetProofParameters`) => `Promise`<`GetProofReturnType`\> | Returns the account and storage values of the specified account including the Merkle-proof. - Docs: https://viem.sh/docs/actions/public/getProof.html - JSON-RPC Methods: - Calls [`eth_getProof`](https://eips.ethereum.org/EIPS/eip-1186) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const block = await client.getProof({ address: '0x...', storageKeys: ['0x...'], }) ` | +| `publicClient.getStorageAt` | (`args`: `GetStorageAtParameters`) => `Promise`<`GetStorageAtReturnType`\> | Returns the value from a storage slot at a given address. - Docs: https://viem.sh/docs/contract/getStorageAt.html - JSON-RPC Methods: [`eth_getStorageAt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { getStorageAt } from 'viem/contract' const client = createPublicClient({ chain: mainnet, transport: http(), }) const code = await client.getStorageAt({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', slot: toHex(0), }) ` | +| `publicClient.getTransaction` | (`args`: `GetTransactionParameters`<`TBlockTag`\>) => `Promise`<`GetTransactionReturnType`<`undefined` \| `Chain`, `TBlockTag`\>\> | Returns information about a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) given a hash or block identifier. - Docs: https://viem.sh/docs/actions/public/getTransaction.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionByHash) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transaction = await client.getTransaction({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `publicClient.getTransactionConfirmations` | (`args`: `GetTransactionConfirmationsParameters`<`undefined` \| `Chain`\>) => `Promise`<`bigint`\> | Returns the number of blocks passed (confirmations) since the transaction was processed on a block. - Docs: https://viem.sh/docs/actions/public/getTransactionConfirmations.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionConfirmations`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionConfirmations) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const confirmations = await client.getTransactionConfirmations({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `publicClient.getTransactionCount` | (`args`: `GetTransactionCountParameters`) => `Promise`<`number`\> | Returns the number of [Transactions](https://viem.sh/docs/glossary/terms.html#transaction) an Account has broadcast / sent. - Docs: https://viem.sh/docs/actions/public/getTransactionCount.html - JSON-RPC Methods: [`eth_getTransactionCount`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactioncount) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionCount = await client.getTransactionCount({ address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) ` | +| `publicClient.getTransactionReceipt` | (`args`: `GetTransactionReceiptParameters`) => `Promise`<`TransactionReceipt`\> | Returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) hash. - Docs: https://viem.sh/docs/actions/public/getTransactionReceipt.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionReceipt = await client.getTransactionReceipt({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `publicClient.key` | `string` | A key for the client. | +| `publicClient.multicall` | (`args`: `MulticallParameters`<`TContracts`, `TAllowFailure`\>) => `Promise`<`MulticallReturnType`<`TContracts`, `TAllowFailure`\>\> | Similar to [`readContract`](https://viem.sh/docs/contract/readContract.html), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall). - Docs: https://viem.sh/docs/contract/multicall.html **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const abi = parseAbi([ 'function balanceOf(address) view returns (uint256)', 'function totalSupply() view returns (uint256)', ]) const result = await client.multicall({ contracts: [ { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi, functionName: 'balanceOf', args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'], }, { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi, functionName: 'totalSupply', }, ], }) // [{ result: 424122n, status: 'success' }, { result: 1000000n, status: 'success' }] ` | +| `publicClient.name` | `string` | A name for the client. | +| `publicClient.pollingInterval` | `number` | Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. | +| `publicClient.prepareTransactionRequest` | (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> | Prepares a transaction request for signing. - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest.html **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` | +| `publicClient.readContract` | (`args`: `ReadContractParameters`<`TAbi`, `TFunctionName`\>) => `Promise`<`ReadContractReturnType`<`TAbi`, `TFunctionName`\>\> | Calls a read-only function on a contract, and returns the response. - Docs: https://viem.sh/docs/contract/readContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/reading-contracts **`Remarks`** A "read-only" function (constant function) on a Solidity contract is denoted by a `view` or `pure` keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas. Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' import { readContract } from 'viem/contract' const client = createPublicClient({ chain: mainnet, transport: http(), }) const result = await client.readContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function balanceOf(address) view returns (uint256)']), functionName: 'balanceOf', args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'], }) // 424122n ` | +| `publicClient.request` | `EIP1193RequestFn`<`PublicRpcSchema`\> | Request function wrapped with friendly error handling | +| `publicClient.sendRawTransaction` | (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> | Sends a **signed** transaction to the network - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction.html - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' import { sendRawTransaction } from 'viem/wallet' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendRawTransaction({ serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33' }) ` | +| `publicClient.simulateContract` | (`args`: `SimulateContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>) => `Promise`<`SimulateContractReturnType`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>\> | Simulates/validates a contract interaction. This is useful for retrieving **return data** and **revert reasons** of contract write functions. - Docs: https://viem.sh/docs/contract/simulateContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/writing-to-contracts **`Remarks`** This function does not require gas to execute and _**does not**_ change the state of the blockchain. It is almost identical to [`readContract`](https://viem.sh/docs/contract/readContract.html), but also supports contract write functions. Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const result = await client.simulateContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32) view returns (uint32)']), functionName: 'mint', args: ['69420'], account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) ` | +| `publicClient.transport` | `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> | The RPC transport | +| `publicClient.type` | `string` | The type of client. | +| `publicClient.uid` | `string` | A unique ID for the client. | +| `publicClient.uninstallFilter` | (`args`: `UninstallFilterParameters`) => `Promise`<`boolean`\> | Destroys a Filter that was created from one of the following Actions: - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter.html) - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter.html) - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter.html) - Docs: https://viem.sh/docs/actions/public/uninstallFilter.html - JSON-RPC Methods: [`eth_uninstallFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_uninstallFilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { createPendingTransactionFilter, uninstallFilter } from 'viem/public' const filter = await client.createPendingTransactionFilter() const uninstalled = await client.uninstallFilter({ filter }) // true ` | +| `publicClient.verifyMessage` | (`args`: `VerifyMessageParameters`) => `Promise`<`boolean`\> | - | +| `publicClient.verifyTypedData` | (`args`: `VerifyTypedDataParameters`) => `Promise`<`boolean`\> | - | +| `publicClient.waitForTransactionReceipt` | (`args`: `WaitForTransactionReceiptParameters`<`undefined` \| `Chain`\>) => `Promise`<`TransactionReceipt`\> | Waits for the [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) to be included on a [Block](https://viem.sh/docs/glossary/terms.html#block) (one confirmation), and then returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt). If the Transaction reverts, then the action will throw an error. - Docs: https://viem.sh/docs/actions/public/waitForTransactionReceipt.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/sending-transactions - JSON-RPC Methods: - Polls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) on each block until it has been processed. - If a Transaction has been replaced: - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) and extracts the transactions - Checks if one of the Transactions is a replacement - If so, calls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt). **`Remarks`** The `waitForTransactionReceipt` action additionally supports Replacement detection (e.g. sped up Transactions). Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel). Transactions are replaced when they are sent from the same nonce. There are 3 types of Transaction Replacement reasons: - `repriced`: The gas price has been modified (e.g. different `maxFeePerGas`) - `cancelled`: The Transaction has been cancelled (e.g. `value === 0n`) - `replaced`: The Transaction has been replaced (e.g. different `value` or `data`) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionReceipt = await client.waitForTransactionReceipt({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `publicClient.watchBlockNumber` | (`args`: `WatchBlockNumberParameters`) => `WatchBlockNumberReturnType` | Watches and returns incoming block numbers. - Docs: https://viem.sh/docs/actions/public/watchBlockNumber.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/watching-blocks - JSON-RPC Methods: - When `poll: true`, calls [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchBlockNumber({ onBlockNumber: (blockNumber) => console.log(blockNumber), }) ` | +| `publicClient.watchBlocks` | (`args`: `WatchBlocksParameters`<`Transport`, `undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>) => `WatchBlocksReturnType` | Watches and returns information for incoming blocks. - Docs: https://viem.sh/docs/actions/public/watchBlocks.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/watching-blocks - JSON-RPC Methods: - When `poll: true`, calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getBlockByNumber) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchBlocks({ onBlock: (block) => console.log(block), }) ` | +| `publicClient.watchContractEvent` | (`args`: `WatchContractEventParameters`<`TAbi`, `TEventName`, `TStrict`\>) => `WatchContractEventReturnType` | Watches and returns emitted contract event logs. - Docs: https://viem.sh/docs/contract/watchContractEvent.html **`Remarks`** This Action will batch up all the event logs found within the [`pollingInterval`](https://viem.sh/docs/contract/watchContractEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/contract/watchContractEvent.html#onLogs). `watchContractEvent` will attempt to create an [Event Filter](https://viem.sh/docs/contract/createContractEventFilter.html) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchContractEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs.html) instead. **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = client.watchContractEvent({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['event Transfer(address indexed from, address indexed to, uint256 value)']), eventName: 'Transfer', args: { from: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b' }, onLogs: (logs) => console.log(logs), }) ` | +| `publicClient.watchEvent` | (`args`: `WatchEventParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`\>) => `WatchEventReturnType` | Watches and returns emitted [Event Logs](https://viem.sh/docs/glossary/terms.html#event-log). - Docs: https://viem.sh/docs/actions/public/watchEvent.html - JSON-RPC Methods: - **RPC Provider supports `eth_newFilter`:** - Calls [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) to create a filter (called on initialize). - On a polling interval, it will call [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges). - **RPC Provider does not support `eth_newFilter`:** - Calls [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) for each block between the polling interval. **`Remarks`** This Action will batch up all the Event Logs found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/actions/public/watchEvent.html#onLogs). `watchEvent` will attempt to create an [Event Filter](https://viem.sh/docs/actions/public/createEventFilter.html) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs.html) instead. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = client.watchEvent({ onLogs: (logs) => console.log(logs), }) ` | +| `publicClient.watchPendingTransactions` | (`args`: `WatchPendingTransactionsParameters`<`Transport`\>) => `WatchPendingTransactionsReturnType` | Watches and returns pending transaction hashes. - Docs: https://viem.sh/docs/actions/public/watchPendingTransactions.html - JSON-RPC Methods: - When `poll: true` - Calls [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) to initialize the filter. - Calls [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getFilterChanges) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newPendingTransactions"` event. **`Remarks`** This Action will batch up all the pending transactions found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchPendingTransactions.html#pollinginterval-optional), and invoke them via [`onTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions.html#ontransactions). **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchPendingTransactions({ onTransactions: (hashes) => console.log(hashes), }) ` | + +#### Returns + +`undefined` \| `FallbackProvider` \| `JsonRpcProvider` + +An ethers.js `Provider` instance, or `undefined` if no chain is found in the `PublicClient`. + +#### Defined in + +sdk/src/utils/adapters.ts:19 + +--- + +### validateAllowlist + +▸ **validateAllowlist**(`data`, `units`): `ValidationResult` + +Validates an array of allowlist entries. + +This function checks that the total units in the allowlist match the expected total units, that the total units are greater than 0, +and that all addresses in the allowlist are valid Ethereum addresses. It returns an object that includes a validity flag and any errors that occurred during validation. + +#### Parameters + +| Name | Type | Description | +| :------ | :---------------------------------------------- | :---------------------------------------------------------------------------------------------------------------- | +| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The allowlist entries to validate. Each entry should be an object that includes an address and a number of units. | +| `units` | `bigint` | The expected total units in the allowlist. | + +#### Returns -A `ValidationResult` object indicating whether the data is valid and any errors that were found. +`ValidationResult` -| Name | Type | -| :------- | :------------------------------------------ | -| `errors` | `Record`<`string`, `string` \| `string`[]\> | -| `valid` | `boolean` | +An object that includes a validity flag and any errors that occurred during validation. The keys in the errors object are the names of the invalid properties, and the values are the error messages. #### Defined in -[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) +sdk/src/validator/index.ts:108 --- ### validateClaimData -▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) +▸ **validateClaimData**(`data`): `ValidationResult` -Validates the data for a simple text evaluation. +Validates Hypercert claim data. + +This function uses the AJV library to validate the claim data. It first retrieves the schema for the claim data, +then validates the data against the schema. If the schema is not found, it returns an error. If the data does not +conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. #### Parameters -| Name | Type | Description | -| :----- | :------------------------------------------------------- | :-------------------- | -| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | +| Name | Type | Description | +| :----- | :-------- | :------------------------------------------------------------------------------------------------- | +| `data` | `unknown` | The claim data to validate. This should be an object that conforms to the HypercertClaimdata type. | #### Returns -[`ValidationResult`](modules/internal.md#validationresult) +`ValidationResult` -A `ValidationResult` object indicating whether the data is valid and any errors that were found. +An object that includes a validity flag and any errors that occurred during validation. #### Defined in -[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) +sdk/src/validator/index.ts:77 --- ### validateDuplicateEvaluationData -▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) +▸ **validateDuplicateEvaluationData**(`data`): `ValidationResult` + +Validates duplicate evaluation data. -Validates the data for a duplicate evaluation. +This function uses the AJV library to validate the duplicate evaluation data. It first retrieves the schema for the duplicate evaluation data, +then validates the data against the schema. If the schema is not found, it returns an error. If the data does not +conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. #### Parameters -| Name | Type | Description | -| :----- | :--------------------------------------------------------- | :-------------------- | -| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | +| Name | Type | Description | +| :----- | :--------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------- | +| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The duplicate evaluation data to validate. This should be an object that conforms to the DuplicateEvaluation type. | #### Returns -[`ValidationResult`](modules/internal.md#validationresult) +`ValidationResult` -A `ValidationResult` object indicating whether the data is valid and any errors that were found. +An object that includes a validity flag and any errors that occurred during validation. #### Defined in -[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) +sdk/src/validator/index.ts:139 --- ### validateMetaData -▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) +▸ **validateMetaData**(`data`): `ValidationResult` + +Validates Hypercert metadata. -Validates the data for a simple text evaluation. +This function uses the AJV library to validate the metadata. It first retrieves the schema for the metadata, +then validates the data against the schema. If the schema is not found, it returns an error. If the data does not +conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. #### Parameters -| Name | Type | Description | -| :----- | :----------------------------------------------------- | :-------------------- | -| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | +| Name | Type | Description | +| :----- | :-------- | :---------------------------------------------------------------------------------------------- | +| `data` | `unknown` | The metadata to validate. This should be an object that conforms to the HypercertMetadata type. | #### Returns -[`ValidationResult`](modules/internal.md#validationresult) +`ValidationResult` -A `ValidationResult` object indicating whether the data is valid and any errors that were found. +An object that includes a validity flag and any errors that occurred during validation. #### Defined in -[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) +sdk/src/validator/index.ts:46 --- ### validateSimpleTextEvaluationData -▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) +▸ **validateSimpleTextEvaluationData**(`data`): `ValidationResult` -Validates the data for a simple text evaluation. +Validates simple text evaluation data against a predefined schema. + +This function uses the AJV library to validate the simple text evaluation data. It first retrieves the schema for the simple text evaluation data, +then validates the data against the schema. If the schema is not found, it returns an error. If the data does not +conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. #### Parameters -| Name | Type | Description | -| :----- | :----------------------------------------------------------- | :-------------------- | -| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | +| Name | Type | Description | +| :----- | :----------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The simple text evaluation data to validate. This should be an object that conforms to the SimpleTextEvaluation type. | #### Returns -[`ValidationResult`](modules/internal.md#validationresult) +`ValidationResult` -A `ValidationResult` object indicating whether the data is valid and any errors that were found. +An object that includes a validity flag and any errors that occurred during validation. #### Defined in -[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) +sdk/src/validator/index.ts:169 --- @@ -581,28 +700,31 @@ A `ValidationResult` object indicating whether the data is valid and any errors ▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` -Verifies a Merkle proof for a given address and units. +Verifies a Merkle proof for a given root, signer address, units, and proof. -**`Throws`** - -If the Merkle proof verification fails. +This function first checks if the signer address is a valid Ethereum address. If it's not, it throws a `MintingError`. +It then verifies the Merkle proof using the `StandardMerkleTree.verify` method. If the verification fails, it throws a `MintingError`. #### Parameters -| Name | Type | Description | -| :-------------- | :------------- | :-------------------------------------- | -| `root` | `string` | The Merkle root hash to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish` | The units to verify. | -| `proof` | `string`[] | The Merkle proof to verify. | +| Name | Type | Description | +| :-------------- | :--------- | :----------------------------- | +| `root` | `string` | The root of the Merkle tree. | +| `signerAddress` | `string` | The signer's Ethereum address. | +| `units` | `bigint` | The number of units. | +| `proof` | `string`[] | The Merkle proof to verify. | #### Returns `void` +**`Throws`** + +Will throw a `MintingError` if the signer address is invalid or if the Merkle proof verification fails. + #### Defined in -[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) +sdk/src/validator/index.ts:201 --- @@ -610,29 +732,87 @@ If the Merkle proof verification fails. ▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` -Batch verifies Merkle proofs for multiple roots, units and proofs for a single address +Verifies multiple Merkle proofs for given roots, a signer address, units, and proofs. + +This function first checks if the lengths of the roots, units, and proofs arrays are equal. If they're not, it throws a `MintingError`. +It then iterates over the arrays and verifies each Merkle proof using the `verifyMerkleProof` function. If any verification fails, it throws a `MintingError`. + +#### Parameters + +| Name | Type | Description | +| :-------------- | :----------- | :----------------------------- | +| `roots` | `string`[] | The roots of the Merkle trees. | +| `signerAddress` | `string` | The signer's Ethereum address. | +| `units` | `bigint`[] | The numbers of units. | +| `proofs` | `string`[][] | The Merkle proofs to verify. | + +#### Returns + +`void` **`Throws`** -If the Merkle proof verification fails. +Will throw a `MintingError` if the lengths of the input arrays are not equal or if any Merkle proof verification fails. + +#### Defined in + +sdk/src/validator/index.ts:224 + +--- + +### walletClientToSigner -**`Notice`** +▸ **walletClientToSigner**(`walletClient`): `undefined` \| `Signer` & `TypedDataSigner` -Wrapper around `verifyMerkleProof` to batch verify multiple proofs +This function converts a `WalletClient` instance to an ethers.js `Signer` to faciliate compatibility between ethers and viem. + +It extracts the account, chain, and transport from the `WalletClient` and creates a network object. +If no chain is found in the `WalletClient`, it logs a warning and stops the signature request. +It then creates a `Web3Provider` with the transport and network, and gets a `Signer` from the provider using the account's address. + +Ref: https://viem.sh/docs/ethers-migration.html #### Parameters -| Name | Type | Description | -| :-------------- | :--------------- | :---------------------------------------- | -| `roots` | `string`[] | The Merkle root hashes to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish`[] | The units to verify. | -| `proofs` | `string`[][] | The Merkle proofs to verify. | +| Name | Type | Description | +| :--------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `walletClient` | `Object` | The `WalletClient` instance to convert. | +| `walletClient.account` | `undefined` \| `Account` | The Account of the Client. | +| `walletClient.addChain` | (`args`: `AddChainParameters`) => `Promise`<`void`\> | Adds an EVM chain to the wallet. - Docs: https://viem.sh/docs/actions/wallet/addChain.html - JSON-RPC Methods: [`eth_addEthereumChain`](https://eips.ethereum.org/EIPS/eip-3085) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { optimism } from 'viem/chains' const client = createWalletClient({ transport: custom(window.ethereum), }) await client.addChain({ chain: optimism }) ` | +| `walletClient.batch?` | `Object` | Flags for batch settings. | +| `walletClient.batch.multicall?` | `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } | Toggle to enable `eth_call` multicall aggregation. | +| `walletClient.cacheTime` | `number` | Time (in ms) that cached data will remain in memory. | +| `walletClient.chain` | `undefined` \| `Chain` | Chain for the client. | +| `walletClient.deployContract` | (`args`: `DeployContractParameters`<`TAbi`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Deploys a contract to the network, given bytecode and constructor arguments. - Docs: https://viem.sh/docs/contract/deployContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/deploying-contracts **`Example`** `ts import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const hash = await client.deployContract({ abi: [], account: '0x…, bytecode: '0x608060405260405161083e38038061083e833981016040819052610...', }) ` | +| `walletClient.extend` | (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, \{ [K in keyof client]: client[K]; } & `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\> | - | +| `walletClient.getAddresses` | () => `Promise`<`GetAddressesReturnType`\> | Returns a list of account addresses owned by the wallet or client. - Docs: https://viem.sh/docs/actions/wallet/getAddresses.html - JSON-RPC Methods: [`eth_accounts`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_accounts) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const accounts = await client.getAddresses() ` | +| `walletClient.getChainId` | () => `Promise`<`number`\> | Returns the chain ID associated with the current network. - Docs: https://viem.sh/docs/actions/public/getChainId.html - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid) **`Example`** `ts import { createWalletClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const chainId = await client.getChainId() // 1 ` | +| `walletClient.getPermissions` | () => `Promise`<`GetPermissionsReturnType`\> | Gets the wallets current permissions. - Docs: https://viem.sh/docs/actions/wallet/getPermissions.html - JSON-RPC Methods: [`wallet_getPermissions`](https://eips.ethereum.org/EIPS/eip-2255) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const permissions = await client.getPermissions() ` | +| `walletClient.key` | `string` | A key for the client. | +| `walletClient.name` | `string` | A name for the client. | +| `walletClient.pollingInterval` | `number` | Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. | +| `walletClient.prepareTransactionRequest` | (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> | Prepares a transaction request for signing. - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest.html **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` | +| `walletClient.request` | `EIP1193RequestFn`<`WalletRpcSchema`\> | Request function wrapped with friendly error handling | +| `walletClient.requestAddresses` | () => `Promise`<`RequestAddressesReturnType`\> | Requests a list of accounts managed by a wallet. - Docs: https://viem.sh/docs/actions/wallet/requestAddresses.html - JSON-RPC Methods: [`eth_requestAccounts`](https://eips.ethereum.org/EIPS/eip-1102) Sends a request to the wallet, asking for permission to access the user's accounts. After the user accepts the request, it will return a list of accounts (addresses). This API can be useful for dapps that need to access the user's accounts in order to execute transactions or interact with smart contracts. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const accounts = await client.requestAddresses() ` | +| `walletClient.requestPermissions` | (`args`: \{ [x: string]: Record; eth_accounts: Record; }) => `Promise`<`RequestPermissionsReturnType`\> | Requests permissions for a wallet. - Docs: https://viem.sh/docs/actions/wallet/requestPermissions.html - JSON-RPC Methods: [`wallet_requestPermissions`](https://eips.ethereum.org/EIPS/eip-2255) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const permissions = await client.requestPermissions({ eth_accounts: {} }) ` | +| `walletClient.sendRawTransaction` | (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> | Sends a **signed** transaction to the network - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction.html - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' import { sendRawTransaction } from 'viem/wallet' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendRawTransaction({ serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33' }) ` | +| `walletClient.sendTransaction` | (`args`: `SendTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Creates, signs, and sends a new transaction to the network. - Docs: https://viem.sh/docs/actions/wallet/sendTransaction.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/sending-transactions - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_sendTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendtransaction) - Local Accounts: [`eth_sendRawTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendrawtransaction) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendTransaction({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: 1000000000000000000n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const hash = await client.sendTransaction({ to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: 1000000000000000000n, }) ` | +| `walletClient.signMessage` | (`args`: `SignMessageParameters`<`undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | Calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191): `keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))`. - Docs: https://viem.sh/docs/actions/wallet/signMessage.html - JSON-RPC Methods: - JSON-RPC Accounts: [`personal_sign`](https://docs.metamask.io/guide/signing-data.html#personal-sign) - Local Accounts: Signs locally. No JSON-RPC request. With the calculated signature, you can: - use [`verifyMessage`](https://viem.sh/docs/utilities/verifyMessage.html) to verify the signature, - use [`recoverMessageAddress`](https://viem.sh/docs/utilities/recoverMessageAddress.html) to recover the signing address from a signature. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const signature = await client.signMessage({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', message: 'hello world', }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const signature = await client.signMessage({ message: 'hello world', }) ` | +| `walletClient.signTransaction` | (`args`: `SignTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Signs a transaction. - Docs: https://viem.sh/docs/actions/wallet/signTransaction.html - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_signTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) - Local Accounts: Signs locally. No JSON-RPC request. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) const signature = await client.signTransaction(request) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) const signature = await client.signTransaction(request) ` | +| `walletClient.signTypedData` | (`args`: `SignTypedDataParameters`<`TTypedData`, `TPrimaryType`, `undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | Signs typed data and calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191): `keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))`. - Docs: https://viem.sh/docs/actions/wallet/signTypedData.html - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_signTypedData_v4`](https://docs.metamask.io/guide/signing-data.html#signtypeddata-v4) - Local Accounts: Signs locally. No JSON-RPC request. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const signature = await client.signTypedData({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', domain: { name: 'Ether Mail', version: '1', chainId: 1, verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', }, types: { Person: [ { name: 'name', type: 'string' }, { name: 'wallet', type: 'address' }, ], Mail: [ { name: 'from', type: 'Person' }, { name: 'to', type: 'Person' }, { name: 'contents', type: 'string' }, ], }, primaryType: 'Mail', message: { from: { name: 'Cow', wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', }, to: { name: 'Bob', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', }, contents: 'Hello, Bob!', }, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const signature = await client.signTypedData({ domain: { name: 'Ether Mail', version: '1', chainId: 1, verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', }, types: { Person: [ { name: 'name', type: 'string' }, { name: 'wallet', type: 'address' }, ], Mail: [ { name: 'from', type: 'Person' }, { name: 'to', type: 'Person' }, { name: 'contents', type: 'string' }, ], }, primaryType: 'Mail', message: { from: { name: 'Cow', wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', }, to: { name: 'Bob', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', }, contents: 'Hello, Bob!', }, }) ` | +| `walletClient.switchChain` | (`args`: `SwitchChainParameters`) => `Promise`<`void`\> | Switch the target chain in a wallet. - Docs: https://viem.sh/docs/actions/wallet/switchChain.html - JSON-RPC Methods: [`eth_switchEthereumChain`](https://eips.ethereum.org/EIPS/eip-3326) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet, optimism } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) await client.switchChain({ id: optimism.id }) ` | +| `walletClient.transport` | `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> | The RPC transport | +| `walletClient.type` | `string` | The type of client. | +| `walletClient.uid` | `string` | A unique ID for the client. | +| `walletClient.watchAsset` | (`args`: `WatchAssetParams`) => `Promise`<`boolean`\> | Adds an EVM chain to the wallet. - Docs: https://viem.sh/docs/actions/wallet/watchAsset.html - JSON-RPC Methods: [`eth_switchEthereumChain`](https://eips.ethereum.org/EIPS/eip-747) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const success = await client.watchAsset({ type: 'ERC20', options: { address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', decimals: 18, symbol: 'WETH', }, }) ` | +| `walletClient.writeContract` | (`args`: `WriteContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Executes a write function on a contract. - Docs: https://viem.sh/docs/contract/writeContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/writing-to-contracts A "write" function on a Solidity contract modifies the state of the blockchain. These types of functions require gas to be executed, and hence a [Transaction](https://viem.sh/docs/glossary/terms.html) is needed to be broadcast in order to change the state. Internally, uses a [Wallet Client](https://viem.sh/docs/clients/wallet.html) to call the [`sendTransaction` action](https://viem.sh/docs/actions/wallet/sendTransaction.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **Warning: The `write` internally sends a transaction – it does not validate if the contract write will succeed (the contract may throw an error). It is highly recommended to [simulate the contract write with `contract.simulate`](https://viem.sh/docs/contract/writeContract.html#usage) before you execute it.** **`Example`** `ts import { createWalletClient, custom, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.writeContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32 tokenId) nonpayable']), functionName: 'mint', args: [69420], }) ` **`Example`** `ts // With Validation import { createWalletClient, custom, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const { request } = await client.simulateContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32 tokenId) nonpayable']), functionName: 'mint', args: [69420], } const hash = await client.writeContract(request) ` | #### Returns -`void` +`undefined` \| `Signer` & `TypedDataSigner` + +An ethers.js `Signer` instance, or `undefined` if no chain is found in the `WalletClient`. #### Defined in -[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) +sdk/src/utils/adapters.ts:51 diff --git a/docs/docs/developer/api/sdk/modules/internal.md b/docs/docs/developer/api/sdk/modules/internal.md deleted file mode 100644 index d20a3804..00000000 --- a/docs/docs/developer/api/sdk/modules/internal.md +++ /dev/null @@ -1,307 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal - -# Module: internal - -## Table of contents - -### Classes - -- [default](../classes/internal.default.md) -- [default](../classes/internal.default-1.md) -- [default](../classes/internal.default-2.md) - -### Interfaces - -- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) -- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) -- [HypercertMinter](../interfaces/internal.HypercertMinter.md) - -### Type Aliases - -- [Claim](internal.md#claim) -- [ClaimByIdQuery](internal.md#claimbyidquery) -- [ClaimToken](internal.md#claimtoken) -- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) -- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) -- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) -- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) -- [Exact](internal.md#exact) -- [FormatResult](internal.md#formatresult) -- [InputMaybe](internal.md#inputmaybe) -- [Maybe](internal.md#maybe) -- [OrderDirection](internal.md#orderdirection) -- [RecentClaimsQuery](internal.md#recentclaimsquery) -- [Scalars](internal.md#scalars) -- [ValidationResult](internal.md#validationresult) - -## Type Aliases - -### Claim - -Ƭ **Claim**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | -| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | - -#### Defined in - -[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) - ---- - -### ClaimByIdQuery - -Ƭ **ClaimByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | - -#### Defined in - -[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) - ---- - -### ClaimToken - -Ƭ **ClaimToken**: `Object` - -#### Type declaration - -| Name | Type | -| :---------- | :--------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `claim` | [`Claim`](internal.md#claim) | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | - -#### Defined in - -[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) - ---- - -### ClaimTokenByIdQuery - -Ƭ **ClaimTokenByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | - -#### Defined in - -[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) - ---- - -### ClaimTokensByClaimQuery - -Ƭ **ClaimTokensByClaimQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :------------------------------------------------------------------------------------------------------------------ | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) - ---- - -### ClaimTokensByOwnerQuery - -Ƭ **ClaimTokensByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | - -#### Defined in - -[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) - ---- - -### ClaimsByOwnerQuery - -Ƭ **ClaimsByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) - ---- - -### Exact - -Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } - -#### Type parameters - -| Name | Type | -| :--- | :--------------- | -| `T` | extends `Object` | - -#### Defined in - -[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) - ---- - -### FormatResult - -Ƭ **FormatResult**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------ | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | -| `errors` | `Record`<`string`, `string`\> \| `null` | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) - ---- - -### InputMaybe - -Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) - ---- - -### Maybe - -Ƭ **Maybe**<`T`\>: `T` \| `null` - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) - ---- - -### OrderDirection - -Ƭ **OrderDirection**: `"asc"` \| `"desc"` - -Defines the order direction, either ascending or descending - -#### Defined in - -[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) - ---- - -### RecentClaimsQuery - -Ƭ **RecentClaimsQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) - ---- - -### Scalars - -Ƭ **Scalars**: `Object` - -All built-in and custom scalars, mapped to their actual values - -#### Type declaration - -| Name | Type | -| :----------- | :-------- | -| `BigDecimal` | `any` | -| `BigInt` | `any` | -| `Boolean` | `boolean` | -| `Bytes` | `any` | -| `Float` | `number` | -| `ID` | `string` | -| `Int` | `number` | -| `Int8` | `any` | -| `String` | `string` | - -#### Defined in - -[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) - ---- - -### ValidationResult - -Ƭ **ValidationResult**: `Object` - -The result of a validation. - -**`Property`** - -Whether the data is valid. - -**`Property`** - -A map of errors, where the key is the field that failed validation and the value is the error message. - -#### Type declaration - -| Name | Type | -| :------- | :---------------------------- | -| `errors` | `Record`<`string`, `string`\> | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/docs/developer/burning.md b/docs/docs/developer/burning.md index b591d11d..331ebc52 100644 --- a/docs/docs/developer/burning.md +++ b/docs/docs/developer/burning.md @@ -8,5 +8,5 @@ You can only burn fraction tokens that you own. Hypercert claims cannot be burne You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). ```js -const txn = await hypercerts.burnFraction({ tokenId }); +const txHash = await hypercerts.burnClaimFraction({ claimId }); ``` diff --git a/docs/docs/developer/config.md b/docs/docs/developer/config.md index 0be153cb..e69050c3 100644 --- a/docs/docs/developer/config.md +++ b/docs/docs/developer/config.md @@ -35,11 +35,6 @@ If any of these conditions are true, the read-only property of the `HypercertCli The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - `DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. @@ -48,48 +43,40 @@ For example: ```json { "5": { - "chainId": 5, - "chainName": "goerli", "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphName": "hypercerts-testnet", "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" } } ``` -You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. +You can select which deployment to use by passing in a `chainId` configuration parameter. We also allow for `overrides` +when creating the SDK by passing configuration variables. ### Client config properties -| Property | Type | Description | -| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `graphUrl` | `string` | The url of the subgraph to use. | -| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | +HypercertClientConfig is a configuration object used when initializing a new instance of the HypercertClient. It allows +you to customize the client by setting your own providers or deployments. At it's simplest, you only need to provide +`chain.id` to initalize the client in `readonly` mode. + +| Field | Type | Description | +| --------------------------- | ------- | ---------------------------------------------------------------------------------------------- | +| `chain` | Object | Partial configuration for the blockchain network. | +| `contractAddress` | String | The address of the deployed contract. | +| `graphUrl` | String | The URL to the subgraph that indexes the contract events. Override for localized testing. | +| `graphName` | String | The name of the subgraph. | +| `nftStorageToken` | String | The API token for NFT.storage. | +| `web3StorageToken` | String | The API token for Web3.storage. | +| `easContractAddress` | String | The address of the EAS contract. | +| `publicClient` | Object | The PublicClient is inherently read-only and is used for reading data from the blockchain. | +| `walletClient` | Object | The WalletClient is used for signing and sending transactions. | +| `unsafeForceOverrideConfig` | Boolean | Boolean to force the use of overridden values. | +| `readOnly` | Boolean | Boolean to assert if the client is in read-only mode. | +| `readOnlyReason` | String | Reason for read-only mode. This is optional and can be used for logging or debugging purposes. | - [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) - [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) -### Environment variables - -You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. - -We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - ### Logging The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level diff --git a/docs/docs/developer/errors.md b/docs/docs/developer/errors.md index 60f4e5e7..291bb9f0 100644 --- a/docs/docs/developer/errors.md +++ b/docs/docs/developer/errors.md @@ -6,13 +6,15 @@ Generally, we follow the pattern of throwing on errors and letting those surface To support debugging we've implemented some custom errors. -| Error | Reason | Payload | -| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | -| ClientError | An error caused by the client | `{ [key: string]: unknown }` | -| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | -| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | -| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | -| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | -| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | -| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | -| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | +| Error | Description | Payload | +| ----------------------- | ---------------------------------------------------- | ---------------------------- | +| `ClientError` | An error that is caused by a problem with the client | `{ "key": "value" }` | +| `ContractError` | An error that is returned by the contract | \`{ "data": "BaseError | +| `FetchError` | Fails fetching a remote resource | `{ "key": "value" }` | +| `InvalidOrMissingError` | The provided value was undefined or empty | `{ "key": "value" }` | +| `MintingError` | Minting transaction failed | `{ "key": "value" }` | +| `StorageError` | Fails storing to a remote resource | `{ "key": "value" }` | +| `UnknownSchemaError` | Schema could not be loaded | `{ "schemaName": "string" }` | +| `MalformedDataError` | Data doesn't conform to expectations | `{ "key": "value" }` | +| `UnsupportedChainError` | This blockchain is not yet supported | \`{ "chainID": "string | +| `ConfigurationError` | The configuration was invalid | `{ "key": "value" }` | diff --git a/docs/docs/developer/evaluations.md b/docs/docs/developer/evaluations.md deleted file mode 100644 index c5399a4f..00000000 --- a/docs/docs/developer/evaluations.md +++ /dev/null @@ -1,13 +0,0 @@ -# Evaluations - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## Respond / or contest an evaluation - -To create an evaluation of a hypercert - -```js -TODO; -``` - -_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/docs/developer/index.md b/docs/docs/developer/index.md new file mode 100644 index 00000000..1baebcca --- /dev/null +++ b/docs/docs/developer/index.md @@ -0,0 +1,49 @@ +# Developer Documentation for Hypercerts + +Welcome to the developer documentation for Hypercerts! This guide will provide you with all the information you need to get started with developing applications using Hypercerts. + +## API Documentation + +The API documentation section contains detailed information about the hypercerts SDK and contracts. You will find everything you need to integrate Hypercerts into your applications. + +## NPM packages + +We provide the following NPM packages for you to use in your applications: + +- [SDK](https://www.npmjs.com/package/@hypercerts-org/sdk) +- [Contracts](https://www.npmjs.com/package/@hypercerts-org/contracts) + +## Starter app + +The starter app repo contains a sample application that demonstrates how to use the Hypercerts SDK to create a simple web application based on Next.js, Chakra UI, and the Hypercerts SDK. + +[Starter app repository](https://github.com/hypercerts-org/hypercert-nextjs-chakra-starter) + +--- + +**NOTE** + +The starter app is a template to feel free to fork it and get started quickly. + +--- + +## Demo Apps + +In the demo apps repo, you will find a collection of sample applications that show the bare minimum to implement hypercerts. These apps serve as a starting point for your own development and can be used as a reference to understand how to implement the SDK. + +[Demo apps repository](https://github.com/hypercerts-org/demo-apps) + +## Issue Tracking + +If you encounter any issues or have questions while working with hypercerts, the issue tracking is the place to go. Here, you can find a list of known issues, report new issues, and participate in discussions with the hypercerts community. + +[Issues on GitHub](https://github.com/hypercerts-org/hypercerts/issues) + +## Quickstarts + +The quickstarts section provides step-by-step guides to help you quickly get up and running with Hypercerts. Whether you are a beginner or an experienced developer, these guides will walk you through the process of setting up your development environment and creating your first Hypercerts application. + +[Quickstart Javascript](./quickstart-javascript.md) +[Quickstart Solidity](./quickstart-solidity.md) + +We hope you find this developer documentation helpful in your journey with Hypercerts. Happy coding! diff --git a/docs/docs/developer/minting.md b/docs/docs/developer/minting.md index d5ff1226..0acd42f0 100644 --- a/docs/docs/developer/minting.md +++ b/docs/docs/developer/minting.md @@ -17,9 +17,9 @@ The resulting hypercert will be wholly owned by the creator. import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; +const totalUnits = 10000n; -const tx: Promise = await hypercerts.mintClaim({ +const txHash = await hypercerts.mintClaim({ metadata, totalUnits, transferRestrictions: TransferRestrictions.FromCreatorOnly, diff --git a/docs/docs/developer/querying.md b/docs/docs/developer/querying.md index 98ebbb83..760c34c8 100644 --- a/docs/docs/developer/querying.md +++ b/docs/docs/developer/querying.md @@ -9,7 +9,7 @@ HypercertIndexer, and HypercertMinter classes, respectively. ```js const { client: { storage }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. @@ -17,7 +17,7 @@ The `storage` is a utility class that provides methods for storing and retrievin ```js const { client: { indexer }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. @@ -26,7 +26,7 @@ It is used by the HypercertClient to retrieve event-based data via the subgraph. ```js const { client: { contract }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used @@ -37,7 +37,7 @@ For example, a developer could use the storage instance to store metadata for a ## Indexer -For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. +For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we provide a client that wraps [urql](https://formidable.com/open-source/urql/) into an opiniated set of queries. ### Live graph playground @@ -56,7 +56,7 @@ Here's one example from our frontend where we let [react-query](https://www.npmj import { useHypercertClient } from "./hypercerts-client"; import { useQuery } from "@tanstack/react-query"; -export const useFractionsByOwner = (owner: string) => { +export const useFractionsByOwner = (owner: `0x${string}`) => { const { client: { indexer }, } = useHypercertClient(); @@ -93,16 +93,15 @@ The query takes the following input parameters: The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | +| Field | Type | Description | +| ------------ | -------- | ------------------------------ | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | #### `RecentClaims` @@ -122,16 +121,15 @@ The query takes the following input parameters: The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | +| Field | Type | Description | +| ------------ | -------- | ------------------------------ | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | #### `ClaimByID` @@ -149,16 +147,15 @@ The query takes the following input parameters: The query returns a claim object that matches the input parameter. The claim object has the following fields: -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | +| Field | Type | Description | +| ------------ | -------- | ------------------------------ | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | ### Queries: Fractions @@ -184,14 +181,13 @@ The query takes the following input parameters: The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: -| Field | Type | Description | -| ----------- | -------- | ------------------------------------------ | -| `chainName` | `String` | The name of the chain. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | +| Field | Type | Description | +| --------- | -------- | ------------------------------------------ | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | The Claim object has the following fields: @@ -221,13 +217,12 @@ The query takes the following input parameters: The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | +| Field | Type | Description | +| --------- | -------- | -------------------------- | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | #### `ClaimTokenById` Query @@ -245,14 +240,13 @@ The query takes the following input parameters: The query returns a claim token object that matches the input parameter. The claim token object has the following fields: -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | +| Field | Type | Description | +| --------- | -------- | ------------------------------------------ | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | The Claim object has the following fields: @@ -277,30 +271,3 @@ const claimById = await indexer.claimById(claimId); // Get the off-chain metadata const metadata = await storage.getMetadata(claimById.claim.uri); ``` - -## Contract - -### Typechain bindings - -We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, -which you can import and use from your TypeScript/JavaScript codebase. - -For example: - -```js -import { ethers } from "ethers"; -import { - HyperCertMinterFactory, - HypercertMinterABI, - IHypercertTokenABI, -} from "@hypercerts-org/sdk"; - -const provider = new ethers.getDefaultProvider(network); -const contractInterface = new ethers.utils.Interface(HypercertMinterABI); -const contract = new ethers.Contract( - contractAddress, - HypercertMinterABI, - provider, -); -const metadataUri = await contract.functions.uri(tokenId); -``` diff --git a/docs/docs/developer/quickstart-javascript.md b/docs/docs/developer/quickstart-javascript.md index 936cc05b..eee1f333 100644 --- a/docs/docs/developer/quickstart-javascript.md +++ b/docs/docs/developer/quickstart-javascript.md @@ -28,15 +28,20 @@ Import the SDK into your project and create a new instance of `HypercertClient` ```js import { HypercertClient } from "@hypercerts-org/sdk"; -import { ethers } from "ethers"; +import { createWalletClient, custom } from "viem"; +import { mainnet } from "viem/chains"; + +const walletClient = createWalletClient({ + chain: mainnet, + transport: custom(window.ethereum), +}); // NOTE: you should replace this with your own JSON-RPC provider to the network // This should have signing abilities and match the `chainId` passed into HypercertClient -const operator = ethers.providers.getDefaultProvider("goerli"); const client = new HypercertClient({ chainId: 5, // goerli testnet - operator, + walletClient, nftStorageToken, web3StorageToken, }); @@ -45,7 +50,7 @@ const client = new HypercertClient({ Hypercerts is a multi-chain protocol. See [here](./supported-networks.md) for a list of currently supported networks. -> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). +> **Note** If there's no `walletClient`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). ## Make a Hypercert @@ -69,7 +74,7 @@ if (!valid) { } // Set the total amount of units available -const totalUnits: BigNumberish = 10_000_000 +const totalUnits: bigint = 10000n // Define the transfer restriction const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly diff --git a/docs/docs/developer/split-merge.md b/docs/docs/developer/split-merge.md index 1ac5556e..1335884f 100644 --- a/docs/docs/developer/split-merge.md +++ b/docs/docs/developer/split-merge.md @@ -7,23 +7,9 @@ ### Split / merge token values ```js -const { tokenIds } = await hypercerts.splitFraction({ - tokenId, - units: [10, 12, 15], -}); -const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); -``` - -## By Claim Data - -### Split / merge claim data - -```js -const { claimIds } = await hypercerts.splitClaim({ - claimId, - TODO: somehow specify hypercert subregions -}); -const { claimId} = await hypercerts.mergeClaims({ - claimIds, +const { tokenIds } = await hypercerts.splitFractionUnits({ + fractionId, + units: [10n, 12n, 15n], }); +const { tokenId } = await hypercerts.mergeFractionUnits({ fractionIds }); ``` diff --git a/docs/docs/developer/supported-networks.md b/docs/docs/developer/supported-networks.md index 3bfd0f18..e8585291 100644 --- a/docs/docs/developer/supported-networks.md +++ b/docs/docs/developer/supported-networks.md @@ -1,13 +1,15 @@ # Supported networks -Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. +Hypercerts is developed in public and released under [dual MIT and Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: `Goerli` and `Sepolia` for testing, `Optimism` and `Celo` as the production deployment. We want to support every network that wants to support positive impact! If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). ## Overview -| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | -| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | -| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | -| Optimism | 10 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | +| Network | HypercertMinter (UUPS Proxy) | Safe | +| -------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| Goerli | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [0x8CD35a62fF56A91485eBF97491612F1552dbc1c9](https://goerli.etherscan.io/address/0x8CD35a62fF56A91485eBF97491612F1552dbc1c9) | +| Sepolia | [0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941](https://goerli.etherscan.io/address/0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941) | TBD | +| Celo | [0x16bA53B74c234C870c61EFC04cD418B8f2865959](https://celoscan.io/address/0x16bA53B74c234C870c61EFC04cD418B8f2865959) | TBD | +| Optimism | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [0x560adA72a80b4707e493cA8c3B7B7528930E7Be5](https://optimistic.etherscan.io/address/0x560adA72a80b4707e493cA8c3B7B7528930E7Be5) | diff --git a/docs/docs/devops/deploy-proxy.md b/docs/docs/devops/deploy-proxy.md index 72b3ee2d..4ed58fc0 100644 --- a/docs/docs/devops/deploy-proxy.md +++ b/docs/docs/devops/deploy-proxy.md @@ -15,10 +15,18 @@ Navigate to `contracts/`. Configure your `.env` file by following the instructio ### Build and deploy the smart contracts +--- + +**NOTE** + +While we use foundry for developement and testing, we use hardhat for deployment. This is because hardhat is more flexible and allows us to easily integrate with OpenZeppelin tools for upgradeable contracts. + +--- + If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. ```javascript - "optimism-goeri": getChainConfig("optimism-goerli"), + "sepolia": getChainConfig("sepolia"), ``` Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. @@ -49,13 +57,23 @@ to get set up. Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). -Now deploy the subgraph +To separate test from production, we use a different subgraph for each network. This means that we need to deploy a new subgraph for each network; but we group the deployments in the scripts. + +- Create a new deploy script for the network in the `package.json` of the `graph/` directory. For example, if you are deploying to the `sepolia` network, you would add the following script: + +````json + "deploy:sepolia": "graph deploy --node https://api.thegraph.com/deploy/ --network sepolia hypercerts-admin/hypercerts-sepolia" + ``` + +* Add the deploy script to `deploy:test` or `deploy:prod` depending on whether you are deploying to a test or production network. + +* Now deploy the subgraph ```sh # Run in graph/ yarn build -yarn deploy:hosted -``` +yarn deploy:test +```` ## OpenZeppelin Defender diff --git a/docs/docs/implementation/glossary.md b/docs/docs/implementation/glossary.md index 40d5c3c2..b35d4405 100644 --- a/docs/docs/implementation/glossary.md +++ b/docs/docs/implementation/glossary.md @@ -9,99 +9,131 @@ sidebar_position: 3 ## Main Terms ### Allowlist + A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. ### Claiming a fraction + Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. ### Contributor + An individual or organization that performs some or all of the work described in a hypercert. ### Creating a hypercert + Synonymous to minting a hypercert. ### Fraction + A token that represents a quantified proportion of a hypercert denominated in units. ### Funder + Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. ### Hypercert + A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. ### Hypercerts interface -The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. + +The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/protocol/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. ### Hypercerts implementation + An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. ### Hypercerts standard + A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. ### Impact + Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. ### Impact evaluation + A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. ### Impact Funding System (IFS) + A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. ### Impact space + A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. ### Merging hypercerts + An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. ### Minting a hypercert + Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. ### Project + Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. ### Prospective funder + Individual, organization, or algorithm that fund work before it is done. ### Retrospective funder + Individual, organization, or algorithm that fund work after it is done. ### Rights + An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. ### Set of contributors + An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. ### Scope of impact + A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. ### Scope of work + A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. ### Splitting hypercerts + An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. ### Time of impact + Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. ### Time of work + A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. ### Unit + The smallest possible fraction of a claim. Generally units are grouped in fractions. ### Work + Activities that produce impact. ## Additional Impact Evaluation Terms ### Auditor + Individual, organization, or algorithm that evaluates the impact of work after it is done. ### Beneficiaries + People or objects that are impacted by work. ### Evaluator + Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. ### Scout + Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 16fb8dff..891844ed 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -1,60 +1,79 @@ -// @ts-check -/* eslint-disable @typescript-eslint/no-var-requires */ -const lightCodeTheme = require("prism-react-renderer/themes/github"); -const darkCodeTheme = require("prism-react-renderer/themes/dracula"); +import { themes } from "prism-react-renderer"; -/** @type {import('@docusaurus/types').Config} */ -const config = { - title: "Hypercerts", - tagline: "Accounting and rewarding impact with hypercerts", - url: "https://hypercerts-org.github.io/", - baseUrl: "/docs/", - onBrokenLinks: "throw", - onBrokenMarkdownLinks: "warn", - favicon: "img/favicon.ico", - trailingSlash: false, +export default async function createConfigAsync() { + // Use a dynamic import instead of require('esm-lib') + const mdx_mermaid = await import("mdx-mermaid"); - // GitHub pages deployment config. - // If you aren't using GitHub pages, you don't need these. - organizationName: "Hypercerts Foundation", // Usually your GitHub org/user name. - projectName: "hypercerts", // Usually your repo name. + return { + title: "Hypercerts", + tagline: "Accounting and rewarding impact with hypercerts", + url: "https://hypercerts-org.github.io/", + baseUrl: "/docs/", + onBrokenLinks: "log", + onBrokenMarkdownLinks: "warn", + favicon: "img/favicon.ico", + trailingSlash: false, - // Even if you don't use internalization, you can use this field to set useful - // metadata like html lang. For example, if your site is Chinese, you may want - // to replace "en" with "zh-Hans". - i18n: { - defaultLocale: "en", - locales: ["en"], - }, + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: "Hypercerts Foundation", // Usually your GitHub org/user name. + projectName: "hypercerts", // Usually your repo name. - presets: [ - [ - "classic", - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - blog: false, // Optional: disable the blog plugin - docs: { - routeBasePath: "/", // Serve the docs at the site's root - sidebarPath: require.resolve("./sidebars.js"), - // Please change this to your repo. - // Remove this to remove the "edit this page" links. - remarkPlugins: [require("mdx-mermaid")], - editUrl: "https://github.com/hypercerts-org/hypercerts", + // Even if you don't use internalization, you can use this field to set useful + // metadata like html lang. For example, if your site is Chinese, you may want + // to replace "en" with "zh-Hans". + i18n: { + defaultLocale: "en", + locales: ["en"], + }, + + plugins: [ + [ + "docusaurus-plugin-typedoc", + { + // TypeDoc options + entryPoints: ["../sdk/src/index.ts"], + tsconfig: "../sdk/tsconfig.json", + + // Plugin options + out: "developer/api/sdk", + sidebar: { + categoryLabel: "API SDK", + collapsed: false, + position: 0, + fullNames: true, + }, }, - theme: { - customCss: require.resolve("./src/css/custom.css"), + ], + ], + + presets: [ + [ + "classic", + /** @type {import('@docusaurus/preset-classic').Options} */ + { + blog: false, // Optional: disable the blog plugin + docs: { + routeBasePath: "/", // Serve the docs at the site's root + sidebarPath: "./sidebars.js", + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + remarkPlugins: [mdx_mermaid], + editUrl: "https://github.com/hypercerts-org/hypercerts", + }, + theme: { + customCss: "./src/css/custom.css", + }, }, - }), + ], ], - ], - markdown: { - mermaid: true, - }, - themes: ["@docusaurus/theme-mermaid"], - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ + markdown: { + mermaid: true, + format: "detect", + }, + themes: ["@docusaurus/theme-mermaid"], + themeConfig: { docs: { sidebar: { hideable: true, @@ -104,16 +123,15 @@ const config = { }, footer: { style: "dark", - copyright: `Copyright © ${new Date().getFullYear()} Hypercerts Foundation. Built with Docusaurus.`, + copyright: `Copyright © 2023 Hypercerts Foundation. Built with Docusaurus.`, }, prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, + theme: themes.github, + darkTheme: themes.dracula, }, mermaid: { theme: { light: "neutral", dark: "dark" }, }, - }), -}; - -module.exports = config; + }, + }; +} diff --git a/docs/package.json b/docs/package.json index 674a836e..d6275d94 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/docs", - "version": "0.1.0", + "version": "1.0.0-alpha.2", "license": "Apache-2.0", "private": false, "scripts": { @@ -11,29 +11,31 @@ "deploy": "docusaurus deploy", "clear": "docusaurus clear", "serve": "docusaurus serve", - "version:new": "docusaurus docs:version `jq -r .version ../sdk/package.json `", + "version:new": "docusaurus docs:version", "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids", "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^2.4.1", - "@docusaurus/preset-classic": "^2.4.1", - "@docusaurus/theme-mermaid": "^2.4.1", - "@mdx-js/react": "^1.6.22", + "@docusaurus/core": "^3.0.0", + "@docusaurus/preset-classic": "^3.0.0", + "@docusaurus/theme-mermaid": "^3.0.0", + "@mdx-js/react": "^3.0.0", "clsx": "^1.2.1", "docusaurus-plugin-remote-content": "^3.1.0", - "mdx-mermaid": "^1.3.2", + "docusaurus-plugin-typedoc": "^0.21.0", + "mdx-mermaid": "^2.0.0", "mermaid": "^9.3.0", - "prism-react-renderer": "^1.3.5", + "prism-react-renderer": "^2.1.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { - "@docusaurus/eslint-plugin": "^2.4.1", - "@docusaurus/module-type-aliases": "^2.4.1", - "@tsconfig/docusaurus": "^1.0.6", - "typescript": "^4.9.4" + "@docusaurus/eslint-plugin": "^3.0.0", + "@docusaurus/module-type-aliases": "^3.0.0", + "@docusaurus/tsconfig": "3.0.0", + "@docusaurus/types": "3.0.0", + "typescript": "^5.0.0" }, "browserslist": { "production": [ @@ -48,6 +50,6 @@ ] }, "engines": { - "node": ">=16.14" + "node": ">=18.0" } } diff --git a/docs/sidebars.js b/docs/sidebars.js index 67629f9d..fe6dec32 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -39,10 +39,6 @@ const sidebars = { type: "doc", id: "whitepaper/impact-space", }, - { - type: "doc", - id: "whitepaper/evaluation", - }, { type: "doc", id: "whitepaper/retrospective-funding", @@ -78,10 +74,6 @@ const sidebars = { type: "doc", id: "developer/split-merge", }, - { - type: "doc", - id: "developer/evaluations", - }, { type: "doc", id: "developer/burning", @@ -105,22 +97,21 @@ const sidebars = { collapsed: true, items: [ { - type: "doc", - id: "developer/api/contracts/HypercertMinter", - }, - { - type: "doc", - id: "developer/api/contracts/SemiFungible1155", - }, - { - type: "doc", - id: "developer/api/contracts/AllowlistMinter", + type: "autogenerated", + dirName: "developer/api/contracts", }, ], }, { - type: "doc", - id: "developer/api/sdk/modules", + type: "category", + label: "SDK", + collapsed: true, + items: [ + { + type: "autogenerated", + dirName: "developer/api/sdk", + }, + ], }, ], }, diff --git a/docs/src/components/homepage/homeNavBoxes.js b/docs/src/components/homepage/homeNavBoxes.js index 41c38093..dab34160 100644 --- a/docs/src/components/homepage/homeNavBoxes.js +++ b/docs/src/components/homepage/homeNavBoxes.js @@ -1,74 +1,84 @@ -import React from 'react'; -import clsx from 'clsx'; -import styles from './homeNavBoxes.module.css'; +import React from "react"; +import clsx from "clsx"; +import styles from "./homeNavBoxes.module.css"; const FeatureList = [ { - title: 'Introduction', - icon: 'img/icons/hypercerts_logo_green.png', + title: "Introduction", + icon: "img/icons/hypercerts_logo_green.png", items: [ - {url: "intro", text: "What are hypercerts?"}, - {url: "about", text: "About the Hypercerts Foundation"}, - {url: "faq", text: "Frequently Asked Questions"}, - {url: "further-resources", text: "Further Resources"}, - ] + { url: "intro", text: "What are hypercerts?" }, + { url: "about", text: "About the Hypercerts Foundation" }, + { url: "faq", text: "Frequently Asked Questions" }, + { url: "further-resources", text: "Further Resources" }, + ], }, { - title: 'Vision & Whitepaper', - icon: 'img/icons/hypercerts_logo_beige.png', + title: "Vision & Whitepaper", + icon: "img/icons/hypercerts_logo_beige.png", items: [ - {url: "whitepaper/whitepaper-intro", text: "Introduction"}, - {url: "whitepaper/ifs", text: "Impact Funding Systems (IFSs)"}, - {url: "whitepaper/hypercerts-intro", text: "Hypercerts: a New Primitive"}, - {url: "whitepaper/impact-space", text: "A Consistent Impact Space"}, - {url: "whitepaper/evaluations", text: "Open Impact Evaluations"}, - {url: "whitepaper/retrospective-funding", text: "Retrospective Impact Funding"}, - ] + { url: "whitepaper/whitepaper-intro", text: "Introduction" }, + { url: "whitepaper/ifs", text: "Impact Funding Systems (IFSs)" }, + { + url: "whitepaper/hypercerts-intro", + text: "Hypercerts: a New Primitive", + }, + { url: "whitepaper/impact-space", text: "A Consistent Impact Space" }, + { url: "whitepaper/evaluations", text: "Open Impact Evaluations" }, + { + url: "whitepaper/retrospective-funding", + text: "Retrospective Impact Funding", + }, + ], }, { - title: 'Minting Guide', - icon: 'img/icons/hypercerts_logo_red.png', + title: "Minting Guide", + icon: "img/icons/hypercerts_logo_red.png", items: [ - {url: "minting-guide/minting-guide-start", text: "Getting Started"}, - {url: "minting-guide/step-by-step", text: "Step-by-step Instructions"}, - {url: "minting-guide/gitcoin-round", text: "Gitcoin Alpha Round Instructions"}, - ] + { url: "minting-guide/minting-guide-start", text: "Getting Started" }, + { url: "minting-guide/step-by-step", text: "Step-by-step Instructions" }, + { + url: "minting-guide/gitcoin-round", + text: "Gitcoin Alpha Round Instructions", + }, + ], }, { - title: 'Implementation', - icon: 'img/icons/hypercerts_logo_yellow.png', + title: "Developers", + icon: "img/icons/hypercerts_logo_yellow.png", items: [ - {url: "implementation/token-standard", text: "Token Standard"}, - {url: "implementation/metadata", text: "Metadata Standard"}, - {url: "implementation/glossary", text: "Glossary"}, - ] + { url: "developer", text: "Developer docs" }, + { url: "implementation/token-standard", text: "Token Standard" }, + { url: "implementation/metadata", text: "Metadata Standard" }, + { url: "implementation/glossary", text: "Glossary" }, + ], }, ]; -function FeatureItem({url, text}){ +function FeatureItem({ url, text }) { return ( -
  • {text}
  • +
  • + + {text} + +
  • ); } - -function Feature({title, icon, items }) { - - +function Feature({ title, icon, items }) { return ( -
    +

    {title}

    -
      - {items.map((props, idx) => ( - - ))} -
    +
      + {items.map((props, idx) => ( + + ))} +
    -
    ); } @@ -76,11 +86,11 @@ function Feature({title, icon, items }) { export default function HomepageFeatures() { return (
    -
      - {FeatureList.map((props, idx) => ( - - ))} -
    +
      + {FeatureList.map((props, idx) => ( + + ))} +
    ); } diff --git a/docs/versioned_docs/version-0.0.1/devops/deploy-proxy.md b/docs/versioned_docs/version-0.0.1/devops/deploy-proxy.md deleted file mode 100644 index fffaa48f..00000000 --- a/docs/versioned_docs/version-0.0.1/devops/deploy-proxy.md +++ /dev/null @@ -1,120 +0,0 @@ -# Deploy a new proxy contract - -This should be done only on rare occasions. For example, when: - -- We want to deploy to a new network -- We have updated the contract in a way that is _NOT_ backwards-compatible. - - For most upgrades, please use UUPS [upgrades](./upgrade.md). - -## Smart Contracts - -### Setup the `contracts/` environment - -Navigate to `contracts/`. Configure your `.env` file by following the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/contracts#setup). - -### Build and deploy the smart contracts - -If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. - -```javascript - "optimism-goeri": getChainConfig("optimism-goerli"), -``` - -Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. - -```sh -# Run in contracts/ -yarn build:hardhat -yarn hardhat deploy --network NETWORK -``` - -This will output the new proxy address. Update the root `README.md` with this new address. - -Now transfer ownership over the proxy contract to the multisig: - -```sh -yarn hardhat transfer-owner --network NETWORK --proxy PROXY_CONTRACT_ADDRESS --owner MULTISIG_ADDRESS -``` - -## Subgraph - -### Setup the `graph/` environment - -Navigate to `graph/`. Follow the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/graph#setup) -to get set up. - -### Deploy the subgraph - -Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). - -Now deploy the subgraph - -```sh -# Run in graph/ -yarn build -yarn deploy:hosted -``` - -## OpenZeppelin Defender - -### Create a new Supabase table - -Log into the [Supabase dashboard](https://app.supabase.com/). -We store all data in a single project, but use different tables for each network. -The table name should be prefixed by the network (e.g. `goerli-allowlistCache`). -If you are deploying to a new network, create a new table. You can copy the table schema and RLS policy from another pre-existing table. - -If you are deploying a new proxy contract to a network for which you already have another deployment, you'll have to make a judgement call as to whether you can reuse the existing table, whether you need to clear the existing table, or create another table. - -Note: We want to merge all the tables in this [issue](https://github.com/hypercerts-org/hypercerts/issues/477). - -### Update the OpenZeppelin Defender scripts - -Modify the Defender scripts to support the new network in `defender/src/networks.ts`. - -If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. - -Note: The entry point for deployment is in `defender/src/setup.ts`. - -### Setup the `defender/` environment - -Navigate to `defender/`. Follow the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/defender#setup) -to get set up. - -### Deploy defender scripts - -Deploy to OpenZeppelin Defender via - -```sh -# Run in defender/ -yarn deploy -``` - -## Hypercerts SDK - -TODO: Flesh this out - -Run the build in `contracts/`. - -(Soon to be deprecated) Publish `contracts/` to npm - -Configure the SDK to support the new network via the graphclient. - -Publish SDK to npm - -## Deploy the Dapp frontend - -Each frontend build is configured to run on a different network (e.g. `https://testnet.hypercerts.org`). You can use any CDN to serve the site (e.g. Netlify, Vercel, GitHub Pages, Cloudflare Pages, Fleek, Firebase Hosting). - -1. Configure your build environment with the environment variables specified in `frontend/.env.local.example`. - -2. Configure your builds to the following settings: - -- Build command: `yarn build:site` -- Build output directory: `/build` -- Root directory: `/` - -3. Configure the domain that you want for your build. diff --git a/docs/versioned_docs/version-0.0.1/devops/index.md b/docs/versioned_docs/version-0.0.1/devops/index.md deleted file mode 100644 index 3d901d98..00000000 --- a/docs/versioned_docs/version-0.0.1/devops/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# Devops Playbook - -We use this playbook to encapsulate our practices and current setup. - -## Setup dev environment - -- [Setup guide](./setup.md) -- [Plasmic setup](./plasmic.md) - -## Tasks - -- [Deploy new proxy contract](./deploy-proxy.md) -- [Upgrade contract](./upgrade.md) -- [Pause contract](./pause.md) - -## FAQ - -- [Common errors](./errors.md) diff --git a/docs/versioned_docs/version-0.0.1/implementation/glossary.md b/docs/versioned_docs/version-0.0.1/implementation/glossary.md deleted file mode 100644 index b2451310..00000000 --- a/docs/versioned_docs/version-0.0.1/implementation/glossary.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Glossary -id: glossary -sidebar_position: 3 ---- - -# Glossary of Hypercerts Terms - -## Main Terms - -### Allowlist - -A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. - -### Claiming a fraction - -Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. - -### Contributor - -An individual or organization that performs some or all of the work described in a hypercert. - -### Creating a hypercert - -Synonymous to minting a hypercert. - -### Fraction - -A token that represents a quantified proportion of a hypercert denominated in units. - -### Funder - -Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. - -### Hypercert - -A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. - -### Hypercerts interface - -The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. - -### Hypercerts implementation - -An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. - -### Hypercerts standard - -A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. - -### Impact - -Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. - -### Impact evaluation - -A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. - -### Impact Funding System (IFS) - -A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. - -### Impact space - -A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. - -### Merging hypercerts - -An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. - -### Minting a hypercert - -Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. - -### Project - -Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. - -### Prospective funder - -Individual, organization, or algorithm that fund work before it is done. - -### Retrospective funder - -Individual, organization, or algorithm that fund work after it is done. - -### Rights - -An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. - -### Set of contributors - -An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Scope of impact - -A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Scope of work - -A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Splitting hypercerts - -An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. - -### Time of impact - -Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Time of work - -A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Unit - -The smallest possible fraction of a claim. Generally units are grouped in fractions. - -### Work - -Activities that produce impact. - -## Additional Impact Evaluation Terms - -### Auditor - -Individual, organization, or algorithm that evaluates the impact of work after it is done. - -### Beneficiaries - -People or objects that are impacted by work. - -### Evaluator - -Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. - -### Scout - -Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/versioned_docs/version-0.3.0/about.md b/docs/versioned_docs/version-0.3.0/about.md deleted file mode 100644 index e2d4eb79..00000000 --- a/docs/versioned_docs/version-0.3.0/about.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: The Hypercerts Foundation -id: about ---- - -# The Hypercerts Foundation - -### Mission - -The mission of the Hypercerts Foundation is to advance the development and adoption of open-source protocols for funding and rewarding positive impact. - -### Organization - -The Hypercerts Foundation is a fully independent organisation working closely with stakeholders in the open source, scientific research, and cryptography communities to develop and promote additional protocols that are decentralized, secure, and transparent. The Foundation will also provide support and resources to help drive the wider adoption of these protocols. - -### History - -Research on hypercerts was first presented to the public by David A. Dalrymple at the conference series Funding the Commons in March 2022. However, the concept of “impact certificates” has been a recurring theme at conferences and in online discussion forums since at least 2014. In late 2022, a small team of research scientists, developers, and practitioners began implementing hypercerts as a set of Ethereum-based smart contracts that could be used to assert and fund impact claims. The Hypercerts Foundation will now serve as the long-term home for this work. - -The new foundation is supported in part by Protocol Labs and is part of the broader Protocol Labs Network of hundreds of companies and organizations. The Foundation will complement Protocol Labs Network’s mission of enabling a more secure, open, and accessible internet. The Hypercerts Foundation, however, is fully independent and will focus on protocol development and cultivating a community of developers and impact entrepreneurs well beyond the Protocol Labs Network. - -### Further links - -Read the full [announcement of the Hypercerts Foundation](https://hypercerts.notion.site/Introducing-the-Hypercerts-Foundation-d956203fe0fc4792980da138015e770a). diff --git a/docs/versioned_docs/version-0.3.0/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-0.3.0/developer/api/contracts/AllowlistMinter.md deleted file mode 100644 index 4684053c..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/contracts/AllowlistMinter.md +++ /dev/null @@ -1,84 +0,0 @@ -# AllowlistMinter - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -## Events - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -## Errors - -### DoesNotExist - -```solidity -error DoesNotExist() -``` diff --git a/docs/versioned_docs/version-0.3.0/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-0.3.0/developer/api/contracts/HypercertMinter.md deleted file mode 100644 index 785dd5cf..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/contracts/HypercertMinter.md +++ /dev/null @@ -1,870 +0,0 @@ -# HypercertMinter - -_bitbeckers_ - -> Contract for managing hypercert claims and whitelists - -Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. - -_Wrapper contract to expose and chain functions._ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### batchMintClaimsFromAllowlists - -```solidity -function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable -``` - -Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - -_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| -------- | ----------- | ----------- | -| account | address | undefined | -| proofs | bytes32[][] | undefined | -| claimIDs | uint256[] | undefined | -| units | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address _account, uint256 _tokenID) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | - -### createAllowlist - -```solidity -function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Register a claim and the whitelist for minting token(s) belonging to that claim - -_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| merkleRoot | bytes32 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable -``` - -Merge the value of tokens belonging to the same claim - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------- | --------- | ----------- | -| \_account | address | undefined | -| \_fractionIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint a semi-fungible token for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimFromAllowlist - -```solidity -function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable -``` - -Mint a semi-fungible token representing a fraction of the claim - -_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| units | uint256 | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint semi-fungible tokens for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### name - -```solidity -function name() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -READ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| \_owner | address | undefined | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### readTransferRestriction - -```solidity -function readTransferRestriction(uint256 tokenID) external view returns (string) -``` - -TRANSFER RESTRICTIONS - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### splitFraction - -```solidity -function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable -``` - -Split a claimtokens value into parts with summed value equal to the original - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| -------------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | -| \_newFractions | uint256[] | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_see { IHypercertMetadata}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | ----------- | -| \_uri | string | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-0.3.0/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-0.3.0/developer/api/contracts/SemiFungible1155.md deleted file mode 100644 index 444dfe22..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/contracts/SemiFungible1155.md +++ /dev/null @@ -1,457 +0,0 @@ -# SemiFungible1155 - -_bitbeckers_ - -> Contract for minting semi-fungible EIP1155 tokens - -Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` - -_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -READ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| \_owner | address | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_see { openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol }Always returns the URI for the basetype so that it's managed in one place._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | ----------- | -| \_uri | string | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-0.3.0/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-0.3.0/developer/api/contracts/interfaces/IAllowlist.md deleted file mode 100644 index 72455b43..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/contracts/interfaces/IAllowlist.md +++ /dev/null @@ -1,29 +0,0 @@ -# IAllowlist - -_bitbeckers_ - -> Interface for allowlist - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-0.3.0/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-0.3.0/developer/api/contracts/interfaces/IHypercertToken.md deleted file mode 100644 index 6bd5a931..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/contracts/interfaces/IHypercertToken.md +++ /dev/null @@ -1,175 +0,0 @@ -# IHypercertToken - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### burnFraction - -```solidity -function burnFraction(address account, uint256 tokenID) external nonpayable -``` - -Operator must be allowed by `creator` and the token must represent the total amount of available units. - -_Function to burn the token at `tokenID` for `account`_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address account, uint256[] tokenIDs) external nonpayable -``` - -Tokens that have been merged are burned. - -_Function called to merge tokens within `tokenIDs`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### splitFraction - -```solidity -function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable -``` - -The sum of `values` must equal the current value of `_tokenID`. - -_Function called to split `tokenID` owned by `account` into units declared in `values`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | -| \_values | uint256[] | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string metadata) -``` - -_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------ | ----------- | -| metadata | string | undefined | - -## Events - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-0.3.0/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-0.3.0/developer/api/contracts/libs/Errors.md deleted file mode 100644 index 93fe0124..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/contracts/libs/Errors.md +++ /dev/null @@ -1,59 +0,0 @@ -# Errors - -_bitbeckers_ - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/.nojekyll b/docs/versioned_docs/version-0.3.0/developer/api/sdk/.nojekyll deleted file mode 100644 index e2ac6616..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/ClientError.md deleted file mode 100644 index 89f2105f..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/ClientError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError - -# Class: ClientError - -An error that is caused by a problem with the client. - -## Hierarchy - -- `Error` - - ↳ **`ClientError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](ClientError.md#constructor) - -### Properties - -- [payload](ClientError.md#payload) - -## Constructors - -### constructor - -• **new ClientError**(`message`, `payload?`) - -Creates a new instance of the ClientError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/ConfigurationError.md deleted file mode 100644 index 03813867..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/ConfigurationError.md +++ /dev/null @@ -1,66 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError - -# Class: ConfigurationError - -The configuration was invalid - -## Hierarchy - -- `Error` - - ↳ **`ConfigurationError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](ConfigurationError.md#constructor) - -### Properties - -- [payload](ConfigurationError.md#payload) - -## Constructors - -### constructor - -• **new ConfigurationError**(`message`, `payload?`) - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `message` | `string` | -| `payload?` | `Object` | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/FetchError.md deleted file mode 100644 index d4c9f7c9..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/FetchError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError - -# Class: FetchError - -Fails fetching a remote resource - -## Hierarchy - -- `Error` - - ↳ **`FetchError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](FetchError.md#constructor) - -### Properties - -- [payload](FetchError.md#payload) - -## Constructors - -### constructor - -• **new FetchError**(`message`, `payload?`) - -Creates a new instance of the FetchError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/HypercertClient.md deleted file mode 100644 index a5a0e900..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/HypercertClient.md +++ /dev/null @@ -1,493 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient - -# Class: HypercertClient - -Hypercerts client factory - -**`Dev`** - -Creates a Hypercerts client instance - -**`Notice`** - -The client is readonly if no signer is set or if the contract address is not set - -**`Param`** - -Hypercerts client configuration - -**`Param`** - -Hypercerts storage object - -## Implements - -- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) - -## Table of contents - -### Constructors - -- [constructor](HypercertClient.md#constructor) - -### Properties - -- [\_config](HypercertClient.md#_config) -- [\_contract](HypercertClient.md#_contract) -- [\_evaluator](HypercertClient.md#_evaluator) -- [\_indexer](HypercertClient.md#_indexer) -- [\_operator](HypercertClient.md#_operator) -- [\_storage](HypercertClient.md#_storage) -- [readonly](HypercertClient.md#readonly) - -### Accessors - -- [contract](HypercertClient.md#contract) -- [indexer](HypercertClient.md#indexer) -- [storage](HypercertClient.md#storage) - -### Methods - -- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClient.md#burnclaimfraction) -- [checkWritable](HypercertClient.md#checkwritable) -- [createAllowlist](HypercertClient.md#createallowlist) -- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) -- [mintClaim](HypercertClient.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClient.md#splitclaimunits) - -## Constructors - -### constructor - -• **new HypercertClient**(`config?`) - -Creates a new instance of the `HypercertClient` class. - -#### Parameters - -| Name | Type | Description | -| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | - -#### Defined in - -[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) - -## Properties - -### \_config - -• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) - -#### Defined in - -[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) - ---- - -### \_contract - -• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -#### Defined in - -[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) - ---- - -### \_evaluator - -• `Private` **\_evaluator**: [`default`](internal.default.md) - -#### Defined in - -[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) - ---- - -### \_indexer - -• `Private` **\_indexer**: [`default`](internal.default-1.md) - -#### Defined in - -[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) - ---- - -### \_operator - -• `Private` **\_operator**: `Provider` \| `Signer` - -#### Defined in - -[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) - ---- - -### \_storage - -• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) - -#### Defined in - -[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) - -#### Defined in - -[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) - -## Accessors - -### contract - -• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -Gets the HypercertMinter contract used by the client. - -#### Returns - -[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -The contract. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) - -#### Defined in - -[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) - ---- - -### indexer - -• `get` **indexer**(): [`default`](internal.default-1.md) - -Gets the indexer for the client. - -#### Returns - -[`default`](internal.default-1.md) - -The indexer. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) - -#### Defined in - -[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) - ---- - -### storage - -• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) - -Gets the storage layer for the client. - -#### Returns - -[`HypercertsStorage`](HypercertsStorage.md) - -The storage layer. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) - -#### Defined in - -[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) - -## Methods - -### batchMintClaimFractionsFromAllowlists - -▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | -| `roots?` | `BytesLike`[] | - | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Implementation of - -HypercertClientInterface.batchMintClaimFractionsFromAllowlists - -#### Defined in - -[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) - ---- - -### burnClaimFraction - -▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> - -Burn a Hypercert claim by providing the claim id - -**`Dev`** - -Burns a Hypercert claim - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------- | :----------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.burnClaimFraction - -#### Defined in - -[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) - ---- - -### checkWritable - -▸ `Private` **checkWritable**(): `boolean` - -#### Returns - -`boolean` - -#### Defined in - -[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) - ---- - -### createAllowlist - -▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> - -Create a Hypercert claim with an allowlist - -**`Dev`** - -Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist - -**`Notice`** - -The total number of units in the allowlist must match the total number of units for the Hypercert - -#### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.createAllowlist - -#### Defined in - -[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) - ---- - -### mergeClaimUnits - -▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> - -Merge multiple Hypercert claims fractions into one - -**`Dev`** - -Merges multiple Hypercert claims into one - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :------------------ | -| `claimIds` | `BigNumberish`[] | Hypercert claim ids | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mergeClaimUnits - -#### Defined in - -[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) - ---- - -### mintClaim - -▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> - -Mint a Hypercert claim - -**`Dev`** - -Mints a Hypercert claim with the given metadata, total units and transfer restrictions - -#### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mintClaim - -#### Defined in - -[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) - ---- - -### mintClaimFractionFromAllowlist - -▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> - -Mint a Hypercert claim fraction from an allowlist. - -**`Dev`** - -Verifies the claim proof and mints the claim fraction - -**`Notice`** - -If known, provide the root for client side verification - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------- | :------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `units` | `BigNumberish` | Number of units to mint | -| `proof` | `BytesLike`[] | Merkle proof for the claim | -| `root?` | `BytesLike` | - | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mintClaimFractionFromAllowlist - -#### Defined in - -[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) - ---- - -### splitClaimUnits - -▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> - -Split a Hypercert's unit into multiple claims with the given fractions - -**`Dev`** - -Submit the ID of the claim to split and new fraction values. - -**`Notice`** - -The sum of the fractions must be equal to the total units of the claim - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.splitClaimUnits - -#### Defined in - -[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/HypercertsStorage.md deleted file mode 100644 index 706c14fe..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/HypercertsStorage.md +++ /dev/null @@ -1,250 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage - -# Class: HypercertsStorage - -A class that provides storage functionality for Hypercerts. - -## Implements - -- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) - -## Table of contents - -### Constructors - -- [constructor](HypercertsStorage.md#constructor) - -### Properties - -- [nftStorageClient](HypercertsStorage.md#nftstorageclient) -- [readonly](HypercertsStorage.md#readonly) -- [web3StorageClient](HypercertsStorage.md#web3storageclient) - -### Methods - -- [getData](HypercertsStorage.md#getdata) -- [getMetadata](HypercertsStorage.md#getmetadata) -- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) -- [storeData](HypercertsStorage.md#storedata) -- [storeMetadata](HypercertsStorage.md#storemetadata) - -## Constructors - -### constructor - -• **new HypercertsStorage**(`overrides`) - -Creates a new instance of the `HypercertsStorage` class. - -#### Parameters - -| Name | Type | Description | -| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | -| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | - -#### Defined in - -[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) - -## Properties - -### nftStorageClient - -• `Optional` **nftStorageClient**: `NFTStorage` - -The NFT storage client. - -#### Defined in - -[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -Whether the storage is read-only. - -#### Defined in - -[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) - ---- - -### web3StorageClient - -• `Optional` **web3StorageClient**: `any` - -The Web3 storage client. - -#### Defined in - -[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) - -## Methods - -### getData - -▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> - -Gets arbitrary data from Web3 storage. - -**`Throws`** - -A `StorageError` if the storage client is not configured or the data cannot be retrieved. - -#### Parameters - -| Name | Type | Description | -| :------------- | :------- | :-------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | - -#### Returns - -`Promise`<`any`\> - -A Promise that resolves to the data. - -#### Implementation of - -HypercertStorageInterface.getData - -#### Defined in - -[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) - ---- - -### getMetadata - -▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> - -Gets metadata for a Hypercert. - -**`Throws`** - -A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. - -**`Throws`** - -A `MalformedDataError` if the metadata is invalid. E.g. unknown schema - -#### Parameters - -| Name | Type | Description | -| :------------- | :------- | :------------------------------------------ | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | - -#### Returns - -`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> - -A Promise that resolves to the metadata. - -#### Implementation of - -HypercertStorageInterface.getMetadata - -#### Defined in - -[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) - ---- - -### getNftStorageGatewayUri - -▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` - -#### Parameters - -| Name | Type | -| :------------- | :------- | -| `cidOrIpfsUri` | `string` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) - ---- - -### storeData - -▸ **storeData**(`data`): `Promise`<`CIDString`\> - -Stores arbitrary data in Web3 storage. - -**`Throws`** - -A `StorageError` if the storage client is not configured. - -**`Notice`** - -Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. -Because we pay for storage quotas, this data is stored best effort. -If you are using our default keys, we may delete older data if we hit our storage quota. - -#### Parameters - -| Name | Type | Description | -| :----- | :-------- | :----------------- | -| `data` | `unknown` | The data to store. | - -#### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored data. - -#### Implementation of - -HypercertStorageInterface.storeData - -#### Defined in - -[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) - ---- - -### storeMetadata - -▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> - -Stores metadata for a Hypercert. - -**`Throws`** - -A `StorageError` if the storage client is not configured. - -**`Throws`** - -A `MalformedDataError` if the metadata is invalid. - -**`Notice`** - -Because we pay for storage quotas, this data is stored best effort. -If you are using our default keys, we may delete older data if we hit our storage quota. - -#### Parameters - -| Name | Type | Description | -| :----- | :-------------------------------------------------------- | :--------------------- | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | - -#### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored metadata. - -#### Implementation of - -HypercertStorageInterface.storeMetadata - -#### Defined in - -[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/InvalidOrMissingError.md deleted file mode 100644 index d12c0653..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/InvalidOrMissingError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError - -# Class: InvalidOrMissingError - -The provided value was undefined or empty - -## Hierarchy - -- `Error` - - ↳ **`InvalidOrMissingError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](InvalidOrMissingError.md#constructor) - -### Properties - -- [payload](InvalidOrMissingError.md#payload) - -## Constructors - -### constructor - -• **new InvalidOrMissingError**(`message`, `payload?`) - -Creates a new instance of the InvalidOrMissingError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/MalformedDataError.md deleted file mode 100644 index 028129d8..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/MalformedDataError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError - -# Class: MalformedDataError - -Data doesn't conform to expectations - -## Hierarchy - -- `Error` - - ↳ **`MalformedDataError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](MalformedDataError.md#constructor) - -### Properties - -- [payload](MalformedDataError.md#payload) - -## Constructors - -### constructor - -• **new MalformedDataError**(`message`, `payload?`) - -Creates a new instance of the MalformedDataError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/MintingError.md deleted file mode 100644 index de284494..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/MintingError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError - -# Class: MintingError - -Minting transaction failed - -## Hierarchy - -- `Error` - - ↳ **`MintingError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](MintingError.md#constructor) - -### Properties - -- [payload](MintingError.md#payload) - -## Constructors - -### constructor - -• **new MintingError**(`message`, `payload?`) - -Creates a new instance of the MintingError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/StorageError.md deleted file mode 100644 index 0dcf0291..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/StorageError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError - -# Class: StorageError - -Fails storing to a remote resource - -## Hierarchy - -- `Error` - - ↳ **`StorageError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](StorageError.md#constructor) - -### Properties - -- [payload](StorageError.md#payload) - -## Constructors - -### constructor - -• **new StorageError**(`message`, `payload?`) - -Creates a new instance of the StorageError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/UnknownSchemaError.md deleted file mode 100644 index 5fdb25e0..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/UnknownSchemaError.md +++ /dev/null @@ -1,71 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError - -# Class: UnknownSchemaError - -Schema could not be loaded - -## Hierarchy - -- `Error` - - ↳ **`UnknownSchemaError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](UnknownSchemaError.md#constructor) - -### Properties - -- [payload](UnknownSchemaError.md#payload) - -## Constructors - -### constructor - -• **new UnknownSchemaError**(`message`, `payload?`) - -Creates a new instance of the UnknownSchemaError class. - -#### Parameters - -| Name | Type | Description | -| :------------------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | -| `payload.schemaName` | `string` | - | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Type declaration - -| Name | Type | -| :----------- | :------- | -| `schemaName` | `string` | - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/UnsupportedChainError.md deleted file mode 100644 index 0964b138..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/UnsupportedChainError.md +++ /dev/null @@ -1,72 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError - -# Class: UnsupportedChainError - -This blockchain is not yet supported -Please file an issue - -## Hierarchy - -- `Error` - - ↳ **`UnsupportedChainError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](UnsupportedChainError.md#constructor) - -### Properties - -- [payload](UnsupportedChainError.md#payload) - -## Constructors - -### constructor - -• **new UnsupportedChainError**(`message`, `payload?`) - -Creates a new instance of the UnsupportedChainError class. - -#### Parameters - -| Name | Type | Description | -| :---------------- | :---------------------------------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | -| `payload.chainID` | `undefined` \| `string` \| `number` | - | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Type declaration - -| Name | Type | -| :-------- | :---------------------------------- | -| `chainID` | `undefined` \| `string` \| `number` | - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default-1.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default-1.md deleted file mode 100644 index 1b94a629..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default-1.md +++ /dev/null @@ -1,278 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -A class that provides indexing functionality for Hypercerts. - -## Implements - -- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default-1.md#constructor) - -### Properties - -- [\_graphClient](internal.default-1.md#_graphclient) - -### Accessors - -- [graphClient](internal.default-1.md#graphclient) - -### Methods - -- [claimById](internal.default-1.md#claimbyid) -- [claimsByOwner](internal.default-1.md#claimsbyowner) -- [firstClaims](internal.default-1.md#firstclaims) -- [fractionById](internal.default-1.md#fractionbyid) -- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) -- [fractionsByOwner](internal.default-1.md#fractionsbyowner) - -## Constructors - -### constructor - -• **new default**(`options`) - -Creates a new instance of the `HypercertIndexer` class. - -#### Parameters - -| Name | Type | Description | -| :------------------ | :------- | :----------------------------------------- | -| `options` | `Object` | The configuration options for the indexer. | -| `options.graphUrl?` | `string` | - | - -#### Defined in - -[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) - -## Properties - -### \_graphClient - -• `Private` **\_graphClient**: `Object` - -The Graph client used by the indexer. - -#### Type declaration - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Defined in - -[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) - -## Accessors - -### graphClient - -• `get` **graphClient**(): `Object` - -Gets the Graph client used by the indexer. - -#### Returns - -`Object` - -The Graph client. - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Implementation of - -[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) - -#### Defined in - -[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) - -## Methods - -### claimById - -▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -Gets a claim by its ID. - -#### Parameters - -| Name | Type | Description | -| :--- | :------- | :------------------- | -| `id` | `string` | The ID of the claim. | - -#### Returns - -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -A Promise that resolves to the claim. - -#### Implementation of - -HypercertIndexerInterface.claimById - -#### Defined in - -[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) - ---- - -### claimsByOwner - -▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -Gets the claims owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.claimsByOwner - -#### Defined in - -[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) - ---- - -### firstClaims - -▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -Gets the most recent claims. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :-------------------- | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.firstClaims - -#### Defined in - -[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) - ---- - -### fractionById - -▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -Gets a claim token by its ID. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------- | :------------------------- | -| `fractionId` | `string` | The ID of the claim token. | - -#### Returns - -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -A Promise that resolves to the claim token. - -#### Implementation of - -HypercertIndexerInterface.fractionById - -#### Defined in - -[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) - ---- - -### fractionsByClaim - -▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -Gets the claim tokens for a given claim. - -#### Parameters - -| Name | Type | Default value | Description | -| :-------- | :----------------------------------------- | :------------------- | :-------------------- | -| `claimId` | `string` | `undefined` | The ID of the claim. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByClaim - -#### Defined in - -[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) - ---- - -### fractionsByOwner - -▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -Gets the claim tokens owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByOwner - -#### Defined in - -[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default-2.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default-2.md deleted file mode 100644 index 1538ce61..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default-2.md +++ /dev/null @@ -1,131 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -The EasEvaluator class provides methods for signing off-chain attestations of evaluations. -Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. - -## Table of contents - -### Constructors - -- [constructor](internal.default-2.md#constructor) - -### Properties - -- [offChain](internal.default-2.md#offchain) -- [readonly](internal.default-2.md#readonly) -- [signer](internal.default-2.md#signer) - -### Methods - -- [getSignature](internal.default-2.md#getsignature) -- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) - -## Constructors - -### constructor - -• **new default**(`config`) - -Creates a new EasEvaluator instance. - -#### Parameters - -| Name | Type | Description | -| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | - -#### Defined in - -[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) - -## Properties - -### offChain - -• **offChain**: `Offchain` - -The Offchain instance used for signing off-chain attestations. - -#### Defined in - -[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -The TypedDataSigner instance used for signing typed data. - -#### Defined in - -[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) - -## Methods - -### getSignature - -▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> - -Gets a signature for an off-chain attestation. - -#### Parameters - -| Name | Type | Description | -| :------------ | :------- | :------------------------------------------------ | -| `encodedData` | `string` | The encoded data to sign. | -| `recipient` | `string` | The address of the recipient of the attestation. | -| `schemaUid` | `string` | The UID of the schema to use for the attestation. | - -#### Returns - -`Promise`<`SignedOffchainAttestation`\> - -- The signature for the attestation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) - ---- - -### signOfflineEvaluation - -▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> - -Signs an offline evaluation. - -**`Throws`** - -- If the evaluation data is malformed. - -#### Parameters - -| Name | Type | Description | -| :----------- | :----------------------------------------------- | :--------------------------- | -| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | - -#### Returns - -`Promise`<`undefined` \| `SignedOffchainAttestation`\> - -- The signature for the evaluation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default.md deleted file mode 100644 index 86daa5e4..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/classes/internal.default.md +++ /dev/null @@ -1,110 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -## Implements - -- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default.md#constructor) - -### Properties - -- [eas](internal.default.md#eas) -- [readonly](internal.default.md#readonly) -- [signer](internal.default.md#signer) -- [storage](internal.default.md#storage) - -### Methods - -- [submitEvaluation](internal.default.md#submitevaluation) - -## Constructors - -### constructor - -• **new default**(`config?`) - -#### Parameters - -| Name | Type | -| :------- | :------------------------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | - -#### Defined in - -[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) - -## Properties - -### eas - -• **eas**: [`default`](internal.default-2.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -#### Defined in - -[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) - ---- - -### storage - -• **storage**: [`HypercertsStorage`](HypercertsStorage.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) - -## Methods - -### submitEvaluation - -▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------------------------------------------------------------------ | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | - -#### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Implementation of - -EvaluatorInterface.submitEvaluation - -#### Defined in - -[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/CustomError.md deleted file mode 100644 index b4af6279..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/CustomError.md +++ /dev/null @@ -1,39 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError - -# Interface: CustomError - -An interface for errors that have a specific type. - -## Implemented by - -- [`ClientError`](../classes/ClientError.md) -- [`ConfigurationError`](../classes/ConfigurationError.md) -- [`FetchError`](../classes/FetchError.md) -- [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) -- [`MalformedDataError`](../classes/MalformedDataError.md) -- [`MintingError`](../classes/MintingError.md) -- [`StorageError`](../classes/StorageError.md) -- [`UnknownSchemaError`](../classes/UnknownSchemaError.md) -- [`UnsupportedChainError`](../classes/UnsupportedChainError.md) - -## Table of contents - -### Properties - -- [payload](CustomError.md#payload) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Defined in - -[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/DuplicateEvaluation.md deleted file mode 100644 index 4606b46e..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/DuplicateEvaluation.md +++ /dev/null @@ -1,56 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation - -# Interface: DuplicateEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) -- [explanation](DuplicateEvaluation.md#explanation) -- [realHypercert](DuplicateEvaluation.md#realhypercert) -- [type](DuplicateEvaluation.md#type) - -## Properties - -### duplicateHypercerts - -• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] - -#### Defined in - -[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) - ---- - -### explanation - -• **explanation**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) - ---- - -### realHypercert - -• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) - ---- - -### type - -• **type**: `"duplicate"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/EASEvaluation.md deleted file mode 100644 index 205b7004..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/EASEvaluation.md +++ /dev/null @@ -1,56 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation - -# Interface: EASEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [chainId](EASEvaluation.md#chainid) -- [contract](EASEvaluation.md#contract) -- [type](EASEvaluation.md#type) -- [uid](EASEvaluation.md#uid) - -## Properties - -### chainId - -• **chainId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) - ---- - -### contract - -• **contract**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) - ---- - -### type - -• **type**: `"EAS"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) - ---- - -### uid - -• **uid**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClaimdata.md deleted file mode 100644 index 3dcea656..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClaimdata.md +++ /dev/null @@ -1,167 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata - -# Interface: HypercertClaimdata - -Properties of an impact claim - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [contributors](HypercertClaimdata.md#contributors) -- [impact_scope](HypercertClaimdata.md#impact_scope) -- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) -- [rights](HypercertClaimdata.md#rights) -- [work_scope](HypercertClaimdata.md#work_scope) -- [work_timeframe](HypercertClaimdata.md#work_timeframe) - -## Properties - -### contributors - -• **contributors**: `Object` - -Contributors - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) - ---- - -### impact_scope - -• **impact_scope**: `Object` - -Scopes of impact - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) - ---- - -### impact_timeframe - -• **impact_timeframe**: `Object` - -Impact time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) - ---- - -### rights - -• `Optional` **rights**: `Object` - -Rights - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) - ---- - -### work_scope - -• **work_scope**: `Object` - -Scopes of work - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) - ---- - -### work_timeframe - -• **work_timeframe**: `Object` - -Work time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientInterface.md deleted file mode 100644 index 0483b520..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientInterface.md +++ /dev/null @@ -1,341 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface - -# Interface: HypercertClientInterface - -The interface for the Hypercert client. - -## Hierarchy - -- [`HypercertClientMethods`](HypercertClientMethods.md) - -- [`HypercertClientState`](HypercertClientState.md) - - ↳ **`HypercertClientInterface`** - -## Implemented by - -- [`HypercertClient`](../classes/HypercertClient.md) - -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) -- [contract](HypercertClientInterface.md#contract) -- [createAllowlist](HypercertClientInterface.md#createallowlist) -- [indexer](HypercertClientInterface.md#indexer) -- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) -- [mintClaim](HypercertClientInterface.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) -- [readonly](HypercertClientInterface.md#readonly) -- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) -- [storage](HypercertClientInterface.md#storage) - -## Properties - -### batchMintClaimFractionsFromAllowlists - -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) - -#### Defined in - -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) - ---- - -### burnClaimFraction - -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`): `Promise`<`ContractTransaction`\> - -Burns a claim fraction. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) - -#### Defined in - -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) - ---- - -### contract - -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) - -#### Defined in - -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) - ---- - -### createAllowlist - -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Creates a new allowlist and mints a new claim with the allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) - -#### Defined in - -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) - ---- - -### indexer - -• **indexer**: [`default`](../classes/internal.default-1.md) - -The indexer used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) - -#### Defined in - -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) - ---- - -### mergeClaimUnits - -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`): `Promise`<`ContractTransaction`\> - -Merges multiple claim fractions into a single claim. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) - -#### Defined in - -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) - ---- - -### mintClaim - -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Mints a new claim. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) - -#### Defined in - -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) - ---- - -### mintClaimFractionFromAllowlist - -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> - -Mints a claim fraction from an allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) - -#### Defined in - -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) - -#### Defined in - -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) - ---- - -### splitClaimUnits - -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> - -Splits a claim into multiple fractions. - -##### Parameters - -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) - -#### Defined in - -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) - ---- - -### storage - -• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) - -The storage layer used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) - -#### Defined in - -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientMethods.md deleted file mode 100644 index 734ccbee..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientMethods.md +++ /dev/null @@ -1,239 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods - -# Interface: HypercertClientMethods - -The methods for the Hypercert client. - -## Hierarchy - -- **`HypercertClientMethods`** - - ↳ [`HypercertClientInterface`](HypercertClientInterface.md) - -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) -- [createAllowlist](HypercertClientMethods.md#createallowlist) -- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) -- [mintClaim](HypercertClientMethods.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) - -## Properties - -### batchMintClaimFractionsFromAllowlists - -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) - ---- - -### burnClaimFraction - -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`): `Promise`<`ContractTransaction`\> - -Burns a claim fraction. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) - ---- - -### createAllowlist - -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Creates a new allowlist and mints a new claim with the allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) - ---- - -### mergeClaimUnits - -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`): `Promise`<`ContractTransaction`\> - -Merges multiple claim fractions into a single claim. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) - ---- - -### mintClaim - -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Mints a new claim. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) - ---- - -### mintClaimFractionFromAllowlist - -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> - -Mints a claim fraction from an allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) - ---- - -### splitClaimUnits - -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> - -Splits a claim into multiple fractions. - -##### Parameters - -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientState.md deleted file mode 100644 index 2d90a599..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertClientState.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState - -# Interface: HypercertClientState - -The state of the Hypercert client. - -## Hierarchy - -- **`HypercertClientState`** - - ↳ [`HypercertClientInterface`](HypercertClientInterface.md) - -## Table of contents - -### Properties - -- [contract](HypercertClientState.md#contract) -- [indexer](HypercertClientState.md#indexer) -- [readonly](HypercertClientState.md#readonly) -- [storage](HypercertClientState.md#storage) - -## Properties - -### contract - -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. - -#### Defined in - -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) - ---- - -### indexer - -• **indexer**: [`default`](../classes/internal.default-1.md) - -The indexer used by the client. - -#### Defined in - -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Defined in - -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) - ---- - -### storage - -• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) - -The storage layer used by the client. - -#### Defined in - -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md deleted file mode 100644 index 6ebed93a..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md +++ /dev/null @@ -1,47 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema - -# Interface: HypercertEvaluationSchema - -Schema for evaluating Hypercerts across different sources and evaluation types - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [creator](HypercertEvaluationSchema.md#creator) -- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) -- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) - -## Properties - -### creator - -• **creator**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) - ---- - -### evaluationData - -• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) - ---- - -### evaluationSource - -• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md deleted file mode 100644 index f18c409f..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md +++ /dev/null @@ -1,176 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface - -# Interface: HypercertIndexerInterface - -## Implemented by - -- [`default`](../classes/internal.default-1.md) - -## Table of contents - -### Properties - -- [claimById](HypercertIndexerInterface.md#claimbyid) -- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) -- [firstClaims](HypercertIndexerInterface.md#firstclaims) -- [fractionById](HypercertIndexerInterface.md#fractionbyid) -- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) -- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) -- [graphClient](HypercertIndexerInterface.md#graphclient) - -## Properties - -### claimById - -• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -#### Type declaration - -▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -##### Parameters - -| Name | Type | -| :--- | :------- | -| `id` | `string` | - -##### Returns - -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) - ---- - -### claimsByOwner - -• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -#### Type declaration - -▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `owner` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) - ---- - -### firstClaims - -• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -#### Type declaration - -▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) - ---- - -### fractionById - -• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -#### Type declaration - -▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -##### Parameters - -| Name | Type | -| :----------- | :------- | -| `fractionId` | `string` | - -##### Returns - -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) - ---- - -### fractionsByClaim - -• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -#### Type declaration - -▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `claimId` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) - ---- - -### fractionsByOwner - -• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -#### Type declaration - -▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `owner` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) - ---- - -### graphClient - -• **graphClient**: `any` - -#### Defined in - -[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertMetadata.md deleted file mode 100644 index d65362f3..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertMetadata.md +++ /dev/null @@ -1,123 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata - -# Interface: HypercertMetadata - -Claim data for hypercert. ERC1155 Metadata compliant - -## Table of contents - -### Properties - -- [allowList](HypercertMetadata.md#allowlist) -- [description](HypercertMetadata.md#description) -- [external_url](HypercertMetadata.md#external_url) -- [hypercert](HypercertMetadata.md#hypercert) -- [image](HypercertMetadata.md#image) -- [name](HypercertMetadata.md#name) -- [properties](HypercertMetadata.md#properties) -- [ref](HypercertMetadata.md#ref) -- [version](HypercertMetadata.md#version) - -## Properties - -### allowList - -• `Optional` **allowList**: `string` - -A CID pointer to the merke tree proof json on ipfs - -#### Defined in - -[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) - ---- - -### description - -• **description**: `string` - -Describes the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) - ---- - -### external_url - -• `Optional` **external_url**: `string` - -An url pointing to the external website of the project - -#### Defined in - -[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) - ---- - -### hypercert - -• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) - -#### Defined in - -[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) - ---- - -### image - -• **image**: `string` - -A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. - -#### Defined in - -[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) - ---- - -### name - -• **name**: `string` - -Identifies the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) - ---- - -### properties - -• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] - -#### Defined in - -[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) - ---- - -### ref - -• `Optional` **ref**: `string` - -Describes the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) - ---- - -### version - -• `Optional` **version**: `string` - -The version of Hypercert schema used to describe this hypercert - -#### Defined in - -[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertPointer.md deleted file mode 100644 index 773c41d3..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertPointer.md +++ /dev/null @@ -1,45 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer - -# Interface: HypercertPointer - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [chainId](HypercertPointer.md#chainid) -- [claimId](HypercertPointer.md#claimid) -- [contract](HypercertPointer.md#contract) - -## Properties - -### chainId - -• **chainId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) - ---- - -### claimId - -• **claimId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) - ---- - -### contract - -• **contract**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertStorageInterface.md deleted file mode 100644 index 8ffda51e..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/HypercertStorageInterface.md +++ /dev/null @@ -1,130 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface - -# Interface: HypercertStorageInterface - -The interface for the Hypercert storage layer. - -## Implemented by - -- [`HypercertsStorage`](../classes/HypercertsStorage.md) - -## Table of contents - -### Properties - -- [getData](HypercertStorageInterface.md#getdata) -- [getMetadata](HypercertStorageInterface.md#getmetadata) -- [storeData](HypercertStorageInterface.md#storedata) -- [storeMetadata](HypercertStorageInterface.md#storemetadata) - -## Properties - -### getData - -• **getData**: (`cidOrIpfsUri`: `string`) => `Promise`<`unknown`\> - -#### Type declaration - -▸ (`cidOrIpfsUri`): `Promise`<`unknown`\> - -Retrieves arbitrary data from IPFS. - -##### Parameters - -| Name | Type | Description | -| :------------- | :------- | :------------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | - -##### Returns - -`Promise`<`unknown`\> - -A Promise that resolves to the retrieved data. - -#### Defined in - -[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) - ---- - -### getMetadata - -• **getMetadata**: (`cidOrIpfsUri`: `string`) => `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -#### Type declaration - -▸ (`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -Retrieves the metadata for a Hypercert evaluation. - -##### Parameters - -| Name | Type | Description | -| :------------- | :------- | :----------------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | - -##### Returns - -`Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -A Promise that resolves to the retrieved metadata. - -#### Defined in - -[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) - ---- - -### storeData - -• **storeData**: (`data`: `unknown`) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`data`): `Promise`<`CIDString`\> - -Stores arbitrary data on IPFS. - -##### Parameters - -| Name | Type | Description | -| :----- | :-------- | :----------------- | -| `data` | `unknown` | The data to store. | - -##### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored data. - -#### Defined in - -[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) - ---- - -### storeMetadata - -• **storeMetadata**: (`metadata`: [`HypercertMetadata`](HypercertMetadata.md)) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`metadata`): `Promise`<`CIDString`\> - -Stores the metadata for a Hypercert evaluation. - -##### Parameters - -| Name | Type | Description | -| :--------- | :------------------------------------------ | :--------------------- | -| `metadata` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata to store. | - -##### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored metadata. - -#### Defined in - -[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/IPFSEvaluation.md deleted file mode 100644 index 5f5871f2..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/IPFSEvaluation.md +++ /dev/null @@ -1,34 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation - -# Interface: IPFSEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [cid](IPFSEvaluation.md#cid) -- [type](IPFSEvaluation.md#type) - -## Properties - -### cid - -• **cid**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) - ---- - -### type - -• **type**: `"IPFS"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md deleted file mode 100644 index 3e4b3b92..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md +++ /dev/null @@ -1,45 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation - -# Interface: SimpleTextEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [hypercert](SimpleTextEvaluation.md#hypercert) -- [text](SimpleTextEvaluation.md#text) -- [type](SimpleTextEvaluation.md#type) - -## Properties - -### hypercert - -• **hypercert**: [`HypercertPointer`](HypercertPointer.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) - ---- - -### text - -• **text**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) - ---- - -### type - -• **type**: `"simpleText"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md deleted file mode 100644 index 53ac36ed..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md +++ /dev/null @@ -1,43 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface - -# Interface: EvaluatorInterface - -[internal](../modules/internal.md).EvaluatorInterface - -## Implemented by - -- [`default`](../classes/internal.default.md) - -## Table of contents - -### Properties - -- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) - -## Properties - -### submitEvaluation - -• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -##### Parameters - -| Name | Type | Description | -| :----------- | :---------------------------------------------------------- | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | - -##### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Defined in - -[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md deleted file mode 100644 index 273912bc..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md +++ /dev/null @@ -1,169 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata - -# Interface: HypercertClaimdata - -[internal](../modules/internal.md).HypercertClaimdata - -Properties of an impact claim - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [contributors](internal.HypercertClaimdata.md#contributors) -- [impact_scope](internal.HypercertClaimdata.md#impact_scope) -- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) -- [rights](internal.HypercertClaimdata.md#rights) -- [work_scope](internal.HypercertClaimdata.md#work_scope) -- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) - -## Properties - -### contributors - -• **contributors**: `Object` - -Contributors - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) - ---- - -### impact_scope - -• **impact_scope**: `Object` - -Scopes of impact - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) - ---- - -### impact_timeframe - -• **impact_timeframe**: `Object` - -Impact time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) - ---- - -### rights - -• `Optional` **rights**: `Object` - -Rights - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) - ---- - -### work_scope - -• **work_scope**: `Object` - -Scopes of work - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) - ---- - -### work_timeframe - -• **work_timeframe**: `Object` - -Work time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.HypercertMinter.md deleted file mode 100644 index 3f4ea346..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/interfaces/internal.HypercertMinter.md +++ /dev/null @@ -1,17 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter - -# Interface: HypercertMinter - -[internal](../modules/internal.md).HypercertMinter - -Hypercert contract interface. - -**`Notice`** - -hacky loop to get typedoc to generate all the docs - -## Hierarchy - -- `HypercertMinter` - - ↳ **`HypercertMinter`** diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/modules.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/modules.md deleted file mode 100644 index 15998930..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/modules.md +++ /dev/null @@ -1,638 +0,0 @@ -[Hypercerts SDK Documentation](README.md) / Exports - -# Hypercerts SDK Documentation - -## Table of contents - -### References - -- [Claim](modules.md#claim) -- [ClaimToken](modules.md#claimtoken) -- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) - -### Modules - -- [internal](modules/internal.md) - -### Classes - -- [ClientError](classes/ClientError.md) -- [ConfigurationError](classes/ConfigurationError.md) -- [FetchError](classes/FetchError.md) -- [HypercertClient](classes/HypercertClient.md) -- [HypercertsStorage](classes/HypercertsStorage.md) -- [InvalidOrMissingError](classes/InvalidOrMissingError.md) -- [MalformedDataError](classes/MalformedDataError.md) -- [MintingError](classes/MintingError.md) -- [StorageError](classes/StorageError.md) -- [UnknownSchemaError](classes/UnknownSchemaError.md) -- [UnsupportedChainError](classes/UnsupportedChainError.md) - -### Interfaces - -- [CustomError](interfaces/CustomError.md) -- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) -- [EASEvaluation](interfaces/EASEvaluation.md) -- [HypercertClaimdata](interfaces/HypercertClaimdata.md) -- [HypercertClientInterface](interfaces/HypercertClientInterface.md) -- [HypercertClientMethods](interfaces/HypercertClientMethods.md) -- [HypercertClientState](interfaces/HypercertClientState.md) -- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) -- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) -- [HypercertMetadata](interfaces/HypercertMetadata.md) -- [HypercertPointer](interfaces/HypercertPointer.md) -- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) -- [IPFSEvaluation](interfaces/IPFSEvaluation.md) -- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) - -### Type Aliases - -- [AllowlistEntry](modules.md#allowlistentry) -- [Deployment](modules.md#deployment) -- [EvaluationData](modules.md#evaluationdata) -- [EvaluationSource](modules.md#evaluationsource) -- [HypercertClientConfig](modules.md#hypercertclientconfig) -- [HypercertClientProps](modules.md#hypercertclientprops) -- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) -- [HypercertStorageConfig](modules.md#hypercertstorageconfig) -- [HypercertsSdkError](modules.md#hypercertssdkerror) -- [QueryParams](modules.md#queryparams) -- [SupportedChainIds](modules.md#supportedchainids) -- [TransferRestrictions](modules.md#transferrestrictions) - -### Properties - -- [ClaimByIdQuery](modules.md#claimbyidquery) - -### Variables - -- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) -- [TransferRestrictions](modules.md#transferrestrictions-1) - -### Functions - -- [execute](modules.md#execute) -- [formatDate](modules.md#formatdate) -- [formatHypercertData](modules.md#formathypercertdata) -- [formatUnixTime](modules.md#formatunixtime) -- [validateAllowlist](modules.md#validateallowlist) -- [validateClaimData](modules.md#validateclaimdata) -- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) -- [validateMetaData](modules.md#validatemetadata) -- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) -- [verifyMerkleProof](modules.md#verifymerkleproof) -- [verifyMerkleProofs](modules.md#verifymerkleproofs) - -## References - -### Claim - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimToken - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimTokensByClaimQuery - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - -## Type Aliases - -### AllowlistEntry - -Ƭ **AllowlistEntry**: `Object` - -Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol - -**`Param`** - -Address of the recipient - -**`Param`** - -Number of units allocated to the recipient - -#### Type declaration - -| Name | Type | -| :-------- | :------------- | -| `address` | `string` | -| `units` | `BigNumberish` | - -#### Defined in - -[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) - ---- - -### Deployment - -Ƭ **Deployment**: `Object` - -Represents a deployment of a contract on a specific network. - -#### Type declaration - -| Name | Type | Description | -| :---------------- | :------- | :--------------------------------------------------------------------------------------- | -| `chainId` | `number` | The ID of the network on which the contract is deployed. | -| `chainName` | `string` | The name of the network on which the contract is deployed. | -| `contractAddress` | `string` | The address of the deployed contract. | -| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | - -#### Defined in - -[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) - ---- - -### EvaluationData - -Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) - -This file was automatically generated by json-schema-to-typescript. -DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, -and run json-schema-to-typescript to regenerate this file. - -#### Defined in - -[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) - ---- - -### EvaluationSource - -Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) - ---- - -### HypercertClientConfig - -Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } - -Configuration options for the Hypercert client. - -#### Defined in - -[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) - ---- - -### HypercertClientProps - -Ƭ **HypercertClientProps**: `Object` - -The props for the Hypercert client. - -#### Type declaration - -| Name | Type | Description | -| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | -| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | - -#### Defined in - -[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) - ---- - -### HypercertEvaluatorConfig - -Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } - -Configuration options for the Hypercert evaluator. - -**`Note`** - -The signer is required for submitting evaluations. - -#### Defined in - -[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) - ---- - -### HypercertStorageConfig - -Ƭ **HypercertStorageConfig**: `Object` - -Configuration options for the Hypercert storage layer. - -**`Note`** - -The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. - -#### Type declaration - -| Name | Type | Description | -| :------------------ | :------- | :------------------------------ | -| `nftStorageToken?` | `string` | The API token for NFT.storage. | -| `web3StorageToken?` | `string` | The API token for Web3.storage. | - -#### Defined in - -[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) - ---- - -### HypercertsSdkError - -Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) - -#### Defined in - -[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) - ---- - -### QueryParams - -Ƭ **QueryParams**: `Object` - -#### Index signature - -▪ [key: `string`]: `any` - -#### Type declaration - -| Name | Type | -| :---------------- | :------------------ | -| `first` | `number` | -| `orderDirections` | `"asc"` \| `"desc"` | -| `skip` | `number` | - -#### Defined in - -[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) - ---- - -### SupportedChainIds - -Ƭ **SupportedChainIds**: `5` \| `10` - -#### Defined in - -[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) - ---- - -### TransferRestrictions - -Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] - -#### Defined in - -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) - -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) - -## Properties - -### ClaimByIdQuery - -• **ClaimByIdQuery**: `any` - -## Variables - -### INDEFINITE_DATE_STRING - -• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` - -#### Defined in - -[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) - ---- - -### TransferRestrictions - -• `Const` **TransferRestrictions**: `Object` - -Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol - -**`Dev`** - -AllowAll: All transfers are allowed - -**`Dev`** - -DisallowAll: All transfers are disallowed - -**`Dev`** - -FromCreatorOnly: Only the creator can transfer the Hypercert - -#### Type declaration - -| Name | Type | -| :---------------- | :--- | -| `AllowAll` | `0` | -| `DisallowAll` | `1` | -| `FromCreatorOnly` | `2` | - -#### Defined in - -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) - -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) - -## Functions - -### execute - -▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> - -#### Parameters - -| Name | Type | -| :--------------- | :-------------------------------- | -| `document` | `GraphQLOperation`<`any`, `any`\> | -| `variables` | `any` | -| `context?` | `any` | -| `rootValue?` | `any` | -| `operationName?` | `string` | - -#### Returns - -`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> - -#### Defined in - -node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 - ---- - -### formatDate - -▸ **formatDate**(`date`): `string` - -#### Parameters - -| Name | Type | -| :----- | :----- | -| `date` | `Date` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) - ---- - -### formatHypercertData - -▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) - -Formats input data to an object containing HypercertMetadata including appropriate labels - -#### Parameters - -| Name | Type | -| :----------------------- | :----------------------------------------------- | -| `«destructured»` | `Object` | -| › `contributors` | `string`[] | -| › `description` | `string` | -| › `excludedImpactScope` | `string`[] | -| › `excludedRights` | `string`[] | -| › `excludedWorkScope` | `string`[] | -| › `external_url?` | `string` | -| › `image` | `string` | -| › `impactScope` | `string`[] | -| › `impactTimeframeEnd` | `number` | -| › `impactTimeframeStart` | `number` | -| › `name` | `string` | -| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | -| › `rights` | `string`[] | -| › `version` | `string` | -| › `workScope` | `string`[] | -| › `workTimeframeEnd` | `number` | -| › `workTimeframeStart` | `number` | - -#### Returns - -[`FormatResult`](modules/internal.md#formatresult) - -#### Defined in - -[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) - ---- - -### formatUnixTime - -▸ **formatUnixTime**(`seconds`): `string` - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `seconds` | `number` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) - ---- - -### validateAllowlist - -▸ **validateAllowlist**(`data`, `units`): `Object` - -Validates the data for an allowlist. - -#### Parameters - -| Name | Type | Description | -| :------ | :---------------------------------------------- | :------------------------------------------ | -| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | -| `units` | `BigNumberish` | The total number of units in the allowlist. | - -#### Returns - -`Object` - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -| Name | Type | -| :------- | :------------------------------------------ | -| `errors` | `Record`<`string`, `string` \| `string`[]\> | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) - ---- - -### validateClaimData - -▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :------------------------------------------------------- | :-------------------- | -| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) - ---- - -### validateDuplicateEvaluationData - -▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a duplicate evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :--------------------------------------------------------- | :-------------------- | -| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) - ---- - -### validateMetaData - -▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :----------------------------------------------------- | :-------------------- | -| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) - ---- - -### validateSimpleTextEvaluationData - -▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :----------------------------------------------------------- | :-------------------- | -| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) - ---- - -### verifyMerkleProof - -▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` - -Verifies a Merkle proof for a given address and units. - -**`Throws`** - -If the Merkle proof verification fails. - -#### Parameters - -| Name | Type | Description | -| :-------------- | :------------- | :-------------------------------------- | -| `root` | `string` | The Merkle root hash to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish` | The units to verify. | -| `proof` | `string`[] | The Merkle proof to verify. | - -#### Returns - -`void` - -#### Defined in - -[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) - ---- - -### verifyMerkleProofs - -▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` - -Batch verifies Merkle proofs for multiple roots, units and proofs for a single address - -**`Throws`** - -If the Merkle proof verification fails. - -**`Notice`** - -Wrapper around `verifyMerkleProof` to batch verify multiple proofs - -#### Parameters - -| Name | Type | Description | -| :-------------- | :--------------- | :---------------------------------------- | -| `roots` | `string`[] | The Merkle root hashes to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish`[] | The units to verify. | -| `proofs` | `string`[][] | The Merkle proofs to verify. | - -#### Returns - -`void` - -#### Defined in - -[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/modules/internal.md b/docs/versioned_docs/version-0.3.0/developer/api/sdk/modules/internal.md deleted file mode 100644 index d20a3804..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/modules/internal.md +++ /dev/null @@ -1,307 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal - -# Module: internal - -## Table of contents - -### Classes - -- [default](../classes/internal.default.md) -- [default](../classes/internal.default-1.md) -- [default](../classes/internal.default-2.md) - -### Interfaces - -- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) -- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) -- [HypercertMinter](../interfaces/internal.HypercertMinter.md) - -### Type Aliases - -- [Claim](internal.md#claim) -- [ClaimByIdQuery](internal.md#claimbyidquery) -- [ClaimToken](internal.md#claimtoken) -- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) -- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) -- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) -- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) -- [Exact](internal.md#exact) -- [FormatResult](internal.md#formatresult) -- [InputMaybe](internal.md#inputmaybe) -- [Maybe](internal.md#maybe) -- [OrderDirection](internal.md#orderdirection) -- [RecentClaimsQuery](internal.md#recentclaimsquery) -- [Scalars](internal.md#scalars) -- [ValidationResult](internal.md#validationresult) - -## Type Aliases - -### Claim - -Ƭ **Claim**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | -| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | - -#### Defined in - -[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) - ---- - -### ClaimByIdQuery - -Ƭ **ClaimByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | - -#### Defined in - -[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) - ---- - -### ClaimToken - -Ƭ **ClaimToken**: `Object` - -#### Type declaration - -| Name | Type | -| :---------- | :--------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `claim` | [`Claim`](internal.md#claim) | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | - -#### Defined in - -[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) - ---- - -### ClaimTokenByIdQuery - -Ƭ **ClaimTokenByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | - -#### Defined in - -[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) - ---- - -### ClaimTokensByClaimQuery - -Ƭ **ClaimTokensByClaimQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :------------------------------------------------------------------------------------------------------------------ | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) - ---- - -### ClaimTokensByOwnerQuery - -Ƭ **ClaimTokensByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | - -#### Defined in - -[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) - ---- - -### ClaimsByOwnerQuery - -Ƭ **ClaimsByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) - ---- - -### Exact - -Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } - -#### Type parameters - -| Name | Type | -| :--- | :--------------- | -| `T` | extends `Object` | - -#### Defined in - -[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) - ---- - -### FormatResult - -Ƭ **FormatResult**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------ | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | -| `errors` | `Record`<`string`, `string`\> \| `null` | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) - ---- - -### InputMaybe - -Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) - ---- - -### Maybe - -Ƭ **Maybe**<`T`\>: `T` \| `null` - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) - ---- - -### OrderDirection - -Ƭ **OrderDirection**: `"asc"` \| `"desc"` - -Defines the order direction, either ascending or descending - -#### Defined in - -[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) - ---- - -### RecentClaimsQuery - -Ƭ **RecentClaimsQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) - ---- - -### Scalars - -Ƭ **Scalars**: `Object` - -All built-in and custom scalars, mapped to their actual values - -#### Type declaration - -| Name | Type | -| :----------- | :-------- | -| `BigDecimal` | `any` | -| `BigInt` | `any` | -| `Boolean` | `boolean` | -| `Bytes` | `any` | -| `Float` | `number` | -| `ID` | `string` | -| `Int` | `number` | -| `Int8` | `any` | -| `String` | `string` | - -#### Defined in - -[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) - ---- - -### ValidationResult - -Ƭ **ValidationResult**: `Object` - -The result of a validation. - -**`Property`** - -Whether the data is valid. - -**`Property`** - -A map of errors, where the key is the field that failed validation and the value is the error message. - -#### Type declaration - -| Name | Type | -| :------- | :---------------------------- | -| `errors` | `Record`<`string`, `string`\> | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/versioned_docs/version-0.3.0/developer/burning.md b/docs/versioned_docs/version-0.3.0/developer/burning.md deleted file mode 100644 index b591d11d..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/burning.md +++ /dev/null @@ -1,12 +0,0 @@ -# Burning - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## Burning fraction tokens - -You can only burn fraction tokens that you own. Hypercert claims cannot be burned once minted. -You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). - -```js -const txn = await hypercerts.burnFraction({ tokenId }); -``` diff --git a/docs/versioned_docs/version-0.3.0/developer/config.md b/docs/versioned_docs/version-0.3.0/developer/config.md deleted file mode 100644 index b26fc0e8..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/config.md +++ /dev/null @@ -1,112 +0,0 @@ -# Hypercert Client Configuration - -The client provides a high level interface that communicates with the Graph, IPFS and the evm. For easy setup we harmonised the configuration into a flow that allows for configuration with different levels of specificity. - -## Configuration - -### Setup - -The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: - -1. Overrides declared in `Partial` -2. Environment variables exposed via `process.env` - -Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. - -We then process the rest of the overrides and possible environment variables to customise the default configuration. - -To get started quickly you can either: - -- set `process.env.DEFAULT_CHAIN_ID` to 5 or 10 -- initialize a new client by calling `new HypercertClient({chainId: 5})` (or 10) - -Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) - -### Read-only mode - -The SDK client will be in read-only mode if any of the following conditions are true: - -- The client was initialized without an operator. -- The client was initialized with an operator without signing abilities. -- The contract address is not set. -- The storage layer is in read-only mode. - -If any of these conditions are true, the read-only property of the `HypercertClient` instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. - -### Defaults - -The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. - -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - -`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object -contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. - -For example: - -```json -{ - "5": { - "chainId": 5, - "chainName": "goerli", - "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" - } -} -``` - -You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. - -### Client config properties - -| Property | Type | Description | -| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `graphUrl` | `string` | The url of the subgraph to use. | -| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | - -- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) -- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) - -### Environment variables - -You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. - -We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - -### Logging - -The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level -determines which log messages are printed to the console. By default, the logger is configured to log messages with a -level of info or higher to the console. - -In your `.env` file: - -```bash -LOG_LEVEL="info" -``` - -The SDK logger supports four log levels: `error`, `warn`, `info`, and `debug`. - -- The `error` log level is used to log errors that occur in the SDK. -- The `warn` log level is used to log warnings that do not necessarily indicate an error, but may be important to investigate. -- The `info` log level is used to log general information about the SDK's state or behavior. -- The `debug` log level is used to log detailed information that is useful for debugging purposes. diff --git a/docs/versioned_docs/version-0.3.0/developer/errors.md b/docs/versioned_docs/version-0.3.0/developer/errors.md deleted file mode 100644 index 60f4e5e7..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/errors.md +++ /dev/null @@ -1,18 +0,0 @@ -# Errors in the SDK - -Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. - -### Handling Errors - -To support debugging we've implemented some custom errors. - -| Error | Reason | Payload | -| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | -| ClientError | An error caused by the client | `{ [key: string]: unknown }` | -| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | -| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | -| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | -| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | -| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | -| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | -| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | diff --git a/docs/versioned_docs/version-0.3.0/developer/evaluations.md b/docs/versioned_docs/version-0.3.0/developer/evaluations.md deleted file mode 100644 index c5399a4f..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/evaluations.md +++ /dev/null @@ -1,13 +0,0 @@ -# Evaluations - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## Respond / or contest an evaluation - -To create an evaluation of a hypercert - -```js -TODO; -``` - -_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/versioned_docs/version-0.3.0/developer/querying.md b/docs/versioned_docs/version-0.3.0/developer/querying.md deleted file mode 100644 index 98ebbb83..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/querying.md +++ /dev/null @@ -1,306 +0,0 @@ -# Querying - -## Overview - -The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient -has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, -HypercertIndexer, and HypercertMinter classes, respectively. - -```js -const { - client: { storage }, -} = new HypercertClient({}); -``` - -The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. - -```js -const { - client: { indexer }, -} = new HypercertClient({}); -``` - -The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. -It is used by the HypercertClient to retrieve event-based data via the subgraph. - -```js -const { - client: { contract }, -} = new HypercertClient({}); -``` - -Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used -by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. - -By providing instances of these classes through the `storage`, `indexer`, and `contract` getters, the HypercertClient allows developers to easily interact with the various components of the Hypercert system directly. -For example, a developer could use the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the contract. - -## Indexer - -For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. - -### Live graph playground - -To inspect the subgraph and explore queries, have a look at the Graph playground for Goerli testnet and Optimism mainnet: - -- [Goerli dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) -- [Optimism dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) - -### Graph client - -Since the client is fully typed, it's easy to explore the functionalities using code completion in IDEs. - -Here's one example from our frontend where we let [react-query](https://www.npmjs.com/package/%2540tanstack/react-query) frequently update the call to the graph: - -```js -import { useHypercertClient } from "./hypercerts-client"; -import { useQuery } from "@tanstack/react-query"; - -export const useFractionsByOwner = (owner: string) => { - const { - client: { indexer }, - } = useHypercertClient(); - - return useQuery( - ["hypercerts", "fractions", "owner", owner], - () => indexer.fractionsByOwner(owner), - { enabled: !!owner, refetchInterval: 5000 }, - ); -}; -``` - -### Queries: Claims - -These tables show the input parameters and output fields for each of the GraphQL queries in [claims.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/claims.graphql). -A claim represents 1 Hypercert and all of the common data across all claim/fraction tokens. - -#### `ClaimsByOwner` - -The `ClaimsByOwner` query retrieves an array of claims that belong to a specific owner. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------- | ------------- | -| `owner` | `Bytes` | The address of the owner whose claims to retrieve. | "" | -| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | -| `first` | `Int` | The number of claims to retrieve. | `100` | -| `skip` | `Int` | The number of claims to skip. | `0` | - -##### Output - -The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -#### `RecentClaims` - -The RecentClaims query retrieves an array of the most recent claims on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | ---------------------------------- | ------------- | -| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | -| `first` | `Int` | The number of claims to retrieve. | `100` | -| `skip` | `Int` | The number of claims to skip. | `0` | - -##### Output - -The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -#### `ClaimByID` - -The ClaimById query retrieves a single claim by its ID on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | -| --------- | ----- | -------------------------------- | -| `id` | `ID!` | The ID of the claim to retrieve. | - -##### Output - -The query returns a claim object that matches the input parameter. The claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -### Queries: Fractions - -These tables show the input parameters and output fields for each of the GraphQL queries in [fractions.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/fractions.graphql). -A claim token represents a fraction of ownership of a Hypercert. - -#### `ClaimTokensByOwner` - -The `ClaimTokensByOwner` query retrieves an array of claim tokens that belong to a specific owner on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | -| `owner` | `Bytes` | The address of the owner whose claim tokens to retrieve. | "" | -| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | -| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | -| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | - -##### Output - -The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ------------------------------------------ | -| `chainName` | `String` | The name of the chain. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | - -The Claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ------------------------------------ | -| `id` | `ID` | The ID of the claim. | -| `creation` | `Int` | The timestamp of the claim creation. | -| `uri` | `String` | The URI of the claim metadata. | -| `totalUnits` | `BigInt` | The total number of units. | - -#### `ClaimTokensByClaim` - -The `ClaimTokensByClaim` query retrieves an array of claim tokens that belong to a specific claim on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | -| `claimId` | `String!` | The ID of the claim whose claim tokens to retrieve. | None | -| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | -| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | -| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | - -##### Output - -The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | - -#### `ClaimTokenById` Query - -The `ClaimTokenById` query retrieves a single claim token by its ID on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | -| --------- | ----- | -------------------------------------- | -| `id` | `ID!` | The ID of the claim token to retrieve. | - -##### Output - -The query returns a claim token object that matches the input parameter. The claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | - -The Claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ------------------------------------ | -| `id` | `ID` | The ID of the claim. | -| `creation` | `Int` | The timestamp of the claim creation. | -| `uri` | `String` | The URI of the claim metadata. | -| `totalUnits` | `BigInt` | The total number of units. | - -## Storage - -### Hypercert Metadata - -Currently, all metadata is stored off-chain in IPFS. Use the `storage` client to retrieve the metadata - -```js -const claimId = "0x822f17a9a5eecfd...85254363386255337"; -const { indexer, storage } = hypercertsClient; -// Get the on-chain claim -const claimById = await indexer.claimById(claimId); -// Get the off-chain metadata -const metadata = await storage.getMetadata(claimById.claim.uri); -``` - -## Contract - -### Typechain bindings - -We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, -which you can import and use from your TypeScript/JavaScript codebase. - -For example: - -```js -import { ethers } from "ethers"; -import { - HyperCertMinterFactory, - HypercertMinterABI, - IHypercertTokenABI, -} from "@hypercerts-org/sdk"; - -const provider = new ethers.getDefaultProvider(network); -const contractInterface = new ethers.utils.Interface(HypercertMinterABI); -const contract = new ethers.Contract( - contractAddress, - HypercertMinterABI, - provider, -); -const metadataUri = await contract.functions.uri(tokenId); -``` diff --git a/docs/versioned_docs/version-0.3.0/developer/quickstart-javascript.md b/docs/versioned_docs/version-0.3.0/developer/quickstart-javascript.md deleted file mode 100644 index 936cc05b..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/quickstart-javascript.md +++ /dev/null @@ -1,101 +0,0 @@ -# Getting started with JavaScript - -The Hypercerts SDK makes it easy to integrate Hypercerts into your application or backend with JavaScript/TypeScript. - -## Installation - -Install the SDK using npm or yarn: - -```bash -npm install @hypercerts-org/sdk -# OR yarn add @hypercerts-org/sdk -``` - -## Get storage credentials (only required for minting) - -For now, we store all metadata (e.g. Hypercert claim data) on IPFS using [NFT.Storage](https://nft.storage/) and [web3.storage](https://web3.storage/). - -In order to mint a Hypercert, you will need to create API tokens for both services, which you can learn more about from their respective guides: - -- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) -- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) - -_Note: In the future, we want to also support other mechanisms for storing off-chain data._ - -## Initialize - -Import the SDK into your project and create a new instance of `HypercertClient` with your configuration options: - -```js -import { HypercertClient } from "@hypercerts-org/sdk"; -import { ethers } from "ethers"; - -// NOTE: you should replace this with your own JSON-RPC provider to the network -// This should have signing abilities and match the `chainId` passed into HypercertClient -const operator = ethers.providers.getDefaultProvider("goerli"); - -const client = new HypercertClient({ - chainId: 5, // goerli testnet - operator, - nftStorageToken, - web3StorageToken, -}); -``` - -Hypercerts is a multi-chain protocol. -See [here](./supported-networks.md) for a list of currently supported networks. - -> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). - -## Make a Hypercert - -Use the client object to interact with the Hypercert network. For example, you can use the `client.mintClaim` method to create a new claim: - -```js -import { - formatHypercertData, - TransferRestrictions, -} from "@hypercerts-org/sdk"; - -// Validate and format your Hypercert metadata -const { data: metadata, valid, errors } = formatHypercertData({ - name, - ... -}) - -// Check on errors -if (!valid) { - return console.error(errors); -} - -// Set the total amount of units available -const totalUnits: BigNumberish = 10_000_000 - -// Define the transfer restriction -const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly - -// Mint your Hypercert! -const tx = await client.mintClaim( - metadata, - totalUnits, - transferRestrictions, -); -``` - -For guidance on how to specify your metadata, see the [minting guide](../minting-guide/step-by-step.md). -This will validate the metadata, store claim metadata on IPFS, create a new hypercert on-chain, and return a transaction receipt. - -For more details, check out the [Minting Guide](./minting.md). - -## Query for Hypercerts - -You can also use the client to query the subgraph and retrieve which claims an address owns: - -```js -const claims = await client.indexer.fractionsByOwner(owner), -``` - -For more details, checkout the [Querying guide](./querying.md) -and our [Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet). - -That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. diff --git a/docs/versioned_docs/version-0.3.0/developer/split-merge.md b/docs/versioned_docs/version-0.3.0/developer/split-merge.md deleted file mode 100644 index 1ac5556e..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/split-merge.md +++ /dev/null @@ -1,29 +0,0 @@ -# Split and Merge - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## By Token Value - -### Split / merge token values - -```js -const { tokenIds } = await hypercerts.splitFraction({ - tokenId, - units: [10, 12, 15], -}); -const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); -``` - -## By Claim Data - -### Split / merge claim data - -```js -const { claimIds } = await hypercerts.splitClaim({ - claimId, - TODO: somehow specify hypercert subregions -}); -const { claimId} = await hypercerts.mergeClaims({ - claimIds, -}); -``` diff --git a/docs/versioned_docs/version-0.3.0/developer/supported-networks.md b/docs/versioned_docs/version-0.3.0/developer/supported-networks.md deleted file mode 100644 index 55592c14..00000000 --- a/docs/versioned_docs/version-0.3.0/developer/supported-networks.md +++ /dev/null @@ -1,13 +0,0 @@ -# Supported networks - -Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. - -We want to support every network that wants to support positive impact! -If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). - -## Overview - -| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | -| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | -| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | -| Optimism | 100 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | diff --git a/docs/versioned_docs/version-0.3.0/devops/errors.md b/docs/versioned_docs/version-0.3.0/devops/errors.md deleted file mode 100644 index 05dc5b0c..00000000 --- a/docs/versioned_docs/version-0.3.0/devops/errors.md +++ /dev/null @@ -1,45 +0,0 @@ -# Errors - -## Deploying - -### Artifact for contract "HypercertMinter" not found - -#### Error message - -`Error HH700: Artifact for contract "HypercertMinter" not found.` - -#### Cause - -Attempting to deploy a contract with `npx hardhat deploy` before the contract has been compiled by hardhat. Contracts compiled by forge are currently not visible to hardhat (this could be a configuration problem). - -### insufficient funds for intrinsic transaction cost - -#### Error message - -`Error: insufficient funds for intrinsic transaction cost` - -#### Cause - -The environment variable `MNEMONIC` is not configured correctly. - -Alternatively, the wallet may not have enough funds for the selected network - -Causing pause twice - -Error: cannot estimate gas; transaction may fail or may require manual gas limit - -reason: 'execution reverted: Pausable: paused', - -#### Etherscan API - -Note: It can take between 5-10 minutes before a newly created etherscan API key becomes valid for queries to goerli. - -When using an etherscan API key that was too recently created, hardhat tasks using etherscan to verify transactions will exit with an error message: - -`Etherscan returned with message: NOTOK, reason: Invalid API Key` - -Despite this error the transaction may have succeeded, the hardhat task just can't confirm it. - -It is unknown if this is a problem for queries to mainnet as well. - -Metamask makes it very difficult to have multiple wallets. diff --git a/docs/versioned_docs/version-0.3.0/devops/pause.md b/docs/versioned_docs/version-0.3.0/devops/pause.md deleted file mode 100644 index 2668f51e..00000000 --- a/docs/versioned_docs/version-0.3.0/devops/pause.md +++ /dev/null @@ -1,29 +0,0 @@ -# Pause / Unpause - -## Pause - -### Contract owned by an address - -Make sure you have set up your wallets and config from the [setup guide](./setup.md). - -To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: - -```sh -yarn hardhat pause --network NETWORK --address CONTRACT_ADDRESS -``` - -### Contract owned by a multi-sig - -If we transferred ownership to a multisig, we can use -[OpenZeppelin Defender Admin](https://defender.openzeppelin.com/#/admin) -to propose a pause to be approved by the multisig. - -## Unpause - -Make sure you have set up your wallets and config from the [setup guide](./setup.md). - -To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: - -```sh -yarn hardhat unpause --network NETWORK --address CONTRACT_ADDRESS -``` diff --git a/docs/versioned_docs/version-0.3.0/devops/plasmic.md b/docs/versioned_docs/version-0.3.0/devops/plasmic.md deleted file mode 100644 index 10e52f5b..00000000 --- a/docs/versioned_docs/version-0.3.0/devops/plasmic.md +++ /dev/null @@ -1,76 +0,0 @@ -# Plasmic setup - -## HypercertImage - -### Props - -hideImpact - -``` -$ctx.currentForm.impactTimeEnd === "indefinite" && ($ctx.currentForm.impactScopes.length === 0 || ($ctx.currentForm.impactScopes.length === 1 && $ctx.currentForm.impactScopes[0] === "all")) -``` - -color - -``` -$ctx.currentForm.backgroundColor -``` - -vectorart - -``` -$ctx.currentForm.backgroundVectorArt -``` - -### Slots - -logoImage Image URL - -``` -$ctx.currentForm.logoUrl -``` - -title Content - -``` -$ctx.currentForm.name -``` - -workPeriod Content - -``` -`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.workTimeEnd.format ? $ctx.currentForm.workTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.workTimeEnd}` -``` - -bannerImage Image URL - -``` -$ctx.currentForm.bannerUrl -``` - -impactPeriod Content - -``` -`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.impactTimeEnd.format ? $ctx.currentForm.impactTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.impactTimeEnd}` -``` - -#### workScopes: repeated ScopeChip - -Collection - -``` -$ctx.currentForm.workScopes.split(/[,\n]/).map(i => i.trim()).filter(i => !!i) -``` - -Element name: `currentWorkScope` -Index name: `currentIndex` -Color variant: `$ctx.currentForm.backgroundColor` -Content: `currentWorkScope` - -#### impactScopes: repeated ScopeChip - -Collection: `$ctx.currentForm.impactScopes` -Element name: `currentImpactScope` -Index name: `currentIndex` -Color variant: `$ctx.currentForm.backgroundColor` -Content: `currentImpactScope` diff --git a/docs/versioned_docs/version-0.3.0/devops/setup.md b/docs/versioned_docs/version-0.3.0/devops/setup.md deleted file mode 100644 index afb95296..00000000 --- a/docs/versioned_docs/version-0.3.0/devops/setup.md +++ /dev/null @@ -1,41 +0,0 @@ -# Setup - -## Pre-requisites - -1. Install [NodeJS](https://nodejs.org/en/) and [git](https://git-scm.com/) -2. Install [yarn](https://classic.yarnpkg.com/) - -```sh -npm install --global yarn -``` - -3. Clone the repository: - -``` -git clone git@github.com:hypercerts-org/hypercerts.git -cd hypercerts -``` - -4. Install dependancies: - -To install dependencies across all projects in the monorepo workspace: - -```sh -yarn install -``` - -## Setup your wallets - -We need 2 wallets: a multi-sig for administering the contracts, and a hot wallet for setting everything up. - -1. We use a [Gnosis Safe](https://app.safe.global/) multisig for managing and administering the contracts. Set one up with your desired confirmation threshold (e.g. 2 of 3). This wallet will not require any balance. -2. Separately, set up a wallet that we'll use in our developer scripts. - -- If you don't have one, you can goto `contracts/` and run `yarn hardhat generate-address`. -- Make sure there is enough balance in this account to deploy the contract and transfer ownership to the multisig - - [Goerli Faucet](https://goerlifaucet.com/) - - [Optimism Bridge](https://app.optimism.io/bridge/deposit) - -## Next Steps - -Depending on what you want to do (e.g. in `./sdk/` or `./frontend/`), there will be further setup instructions in the respective `README.md` file. diff --git a/docs/versioned_docs/version-0.3.0/devops/upgrade.md b/docs/versioned_docs/version-0.3.0/devops/upgrade.md deleted file mode 100644 index 820255e7..00000000 --- a/docs/versioned_docs/version-0.3.0/devops/upgrade.md +++ /dev/null @@ -1,35 +0,0 @@ -# Upgrading the contract - -## Validate upgrade - -Validate contract upgradeability against deployment. - -For example, for the `goerli` deployment: - -```sh -yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS -``` - -## Propose Upgrade - -Propose an upgrade via OpenZeppelin Defender. For more information, see this -[guide](https://docs.openzeppelin.com/defender/guide-upgrades) - -For example, for the `goerli` deployment: - -```sh -yarn build:hardhat -yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS -``` - -This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. - -## Publish to npm - -After you update the contracts, deploy the `contracts/` package to npm. - -TODO - -Update the dependencies in `frontend/package.json` and `sdk/package.json`. - -If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. diff --git a/docs/versioned_docs/version-0.3.0/faq.md b/docs/versioned_docs/version-0.3.0/faq.md deleted file mode 100644 index b9659b5a..00000000 --- a/docs/versioned_docs/version-0.3.0/faq.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Frequently Asked Questions -id: faq ---- - -# FAQs - -### How do I create a hypercert? - -We've created a step-by-step guide in the documents, which you can find [here](minting-guide/minting-guide-start). - -### Who gets to claim my hypercert? - -There are currently two types of users who are eligible to claim your hypercert. - -1. You as the creator of the hypercert are eligible to claim your hypercert. For projects with an allow list, you are eligible to claim 50% of the total tokens. For projects with no allow list, you will receive 100% of the tokens automatically and can do whatever you like with them. - -2. Anyone on the hypercert's allow list will be eligible to claim your hypercert. The allow list is stored and the time of minting and allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions through a separate contract interaction. Creators often use allow lists be used to allocate fractions to previous funders and contributors. - -### How do I claim a hypercert? Can I claim all of the ones I’m eligible for at once? - -After you connect your wallet, you will see a dashboard of hypercerts that you can claim. You can either claim them individually or in a batch transaction. Note that if you perform the batch transaction you will automatically claim _all_ hypercerts you are allow-listed for. (You still pay a gas fee for each claim, however.) If you don't want to claim _all_ at once, then you should claim them one-by-one. - -### What token standard do hypercerts utilize? - -The interface supports both ERC-1155s and 721s. Our current implementation makes use of [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) (a semi-fungible token). - -### What are the required fields to generate a hypercert? - -There are six required fields: - -1. Set of contributors: An ordered list of all contributors, who claim to do or have done the work described by this hypercert. -2. Scope of work: A conjunction of potentially-negated work scope tags, where an empty string means “all”. -3. Time of work: A date range, from the start to the end of the work being claimed by this hypercert. -4. Scope of impact: A conjunction of potentially-negated impact scope tags, where an empty string means “all”. -5. Time of impact: Date ranges from the start to the end of the impact. -6. Rights of the owners: An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. - -Hypercerts also need a name and description. - -### What should I put for my hypercert's work scope? - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -### Are hypercerts the same as impact evaluations? - -No. A hypercert is a claim over a discrete piece of work and the impact that may result from that work. It has no opinion about the legitimacy or quality of the claim. - -An impact evaluation is an opinionated assessment about the legitimacy or quality of a claim. - -For example, a hypercert might represent "Planting trees in the Amazon in 2022". An impact evaluation might point to that hypercert and assert the percent of trees that survived, the amount of CO2 removed by the trees, or the income change among people living around the project. - -Over time, the expectation is that hypercerts that attract multiple, high quality, credibly neutral impact evaluations will be more relevant than ones that do not. - -### What can I do with my hypercert? - -The `rights` dimension specific what an owner can do with their hypercert. Currently, the only `right` that owners have is "Public Display". Over time, we hope the protocol can support various `rights` including transfers, intellectual property, tax-deductibility, carbon offsets, ESG reporting, and more. - -### How is a hypercert different than a POAP or Impact NFT? - -Hypercerts have some things in common with certain POAPs or Impact NFTs, but also a number of crucial differences. - -First, all POAPs and most Impact NFTs are implemented as non-fungible tokens (ERC-721s). Hypercerts are currently being implemented as semi-fungible tokens (ERC-1155s), meaning it is possible to own more than one unit or fraction of a given hypercert. This makes it easy and intuitive to display the share of hypercerts that a given owner has. - -Second, hypercerts have specific metadata requirements and interpretation logic. These include a standard schema for how the six required hypercert dimensions are defined and captured (i.e., work scopes, impact scopes, timeframes, contributors, etc) as well as logic for how to interpret different inputs (e.g., how to include or exclude certain work scopes, create an indefinite time period, etc). POAPs have a completely different schema. Although there is no standard schema for Impact NFTs, an Impact NFT project could choose to adopt the hypercert standard and token interface and thereby achieve compatibility. - -Third, the hypercerts token interface is intended to support several functions that are not possible out of the box with other token standards, chiefly, atomic split and merge capabilities. We also expect other protocols to work with hypercerts for the purposes of prospective and retrospective funding, contributor verification, and impact evaluation. - -For certain use cases, POAPs may be better suited for projects as hypercerts are focused on the funding aspect of impactful work. - -### Where can I purchase a hypercert? - -Currently, it is only possible to purchase a hypercert from a creator or project. This can be facilitated directly by the project or via a third-party marketplace like OpenSea. Currently, hypercerts cannot be resold on secondary markets. - -### What chain(s) is hypercerts running on? - -The hypercerts smart contracts have been deployed on Optimism and Goerli Testnet. We plan to support various EVM chains in the near future. - -### How do I bridge to Optimism? - -There are various bridging services including the official [Optimism Bridge](https://app.optimism.io/bridge/deposit). Note that bridging assets from Ethereum to Optimism will incur a gas fee. - -### How much gas will it cost to create or claim a hypercert? - -In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). Claiming a hypercert should be below 0.0001 ETH or less than $0.10 on Optimism. - -### How do I create a hypercert from a multisig? - -If you are creating a hypercert on Optimism, then you will need an Optimism-based multisig. (Unfortunately, Safe wallets created on Ethereum won't work on Optimism.) - -### Have the smart contracts been audited? - -Yes. The auditor's security report is available [here](https://github.com/pashov/audits/blob/master/solo/Hypercerts-security-review.md). - -### How is the allow list generated? - -For Gitcoin projects, an allow list is generated from a snapshot of all of the on-chain funding received by the project. - -The queries used to generate the allow lists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -Once the snapshot is taken, the formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. - -For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.96 donated --> 1 fraction -- $0.52 donated --> 0 fractions - -### Why am I not on the allow list even though I contributed to the project? - -If you contributed less than $1 DAI to a project, then you will not be eligible to claim a hypercert fraction. - -### I supported a project. Why I don't I see the hypercert in my dashboard? - -In order to your hypercert to appear as "claimable", the project needs to mint the hypercert first. If the project has not minted its hypercert yet, then you will not be able to claim it. We suggest you check back in a few days to see if the project has created the hypercert and is now claimable. - -If the project has created its hypercert, then please try the following solutions: - -1. Confirm the wallet address is correct (some users have multiple wallet addresses and forget which one they donated with) -2. Check that your wallet is included in the Dune Dashboards for each Gitcoin Round - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -3. Confirm you donated more than $1 DAI to the project. - -If the project has created its hypercert, and you have confirmed items 1-3, then please send us a DM over Twitter or Telegram with your wallet address and we will get back to you promptly. - -### How do I retire a hypercert? - -We don't yet have a frontend for retiring hypercerts but you can do this by interacting directly with the smart contract on Etherscan. diff --git a/docs/versioned_docs/version-0.3.0/further-resources.md b/docs/versioned_docs/version-0.3.0/further-resources.md deleted file mode 100644 index 86c25331..00000000 --- a/docs/versioned_docs/version-0.3.0/further-resources.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Further Resources -id: further-resources ---- - -# Papers, Articles, Presentations - -## Writings - -- Feb 14, 2023, Whitepaper draft by [@hypercerts](http://twitter.com/hypercerts): [Hypercerts: A new primitive for impact funding systems (draft v0)](../static/pdf/hypercerts_whitepaper_v0.pdf) -- Aug 24, 2022, Blogpost by [@holkeb](https://twitter.com/holkeb): [Hypercerts: A new primitive for public goods funding](https://protocol.ai/blog/hypercert-new-primitive/) -- Jun 2022, Tech report (draft) by [@davidad](https://twitter.com/davidad): [Hypercerts; an Interoperable Datalayer for Impact-Funding Mechanisms](../static/pdf/hypercerts_Tech_Report_draft.pdf) - -## Talks - -#### Jun 24, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Hypercerts: on-chain primitives for impact markets](https://youtu.be/2hOhOdCbBlU) - - - -#### Jun 23, 2022, Conversation between [@emiyazono](http://twitter.com/emiyazono) and [@owocki](http://twitter.com/owocki) at GreenPill Podcast: [Impact Certificates | Evan Miyazono, Head of Research at Protocol Labs | Green Pill #21](https://youtu.be/kyo5SxtSJ9U) - - - -#### Mar 4, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Interoperable mechanisms for non-rival goods (Hypercerts)](https://youtu.be/acbBeGcevok) - - - -## Other resources - -Overview of some previous writings on impact certificates, retrospective funding and impact markets: - -- Christiano, Paul (2014) Certificates of impact, Rational Altruist, [https://rationalaltruist.com/2014/11/15/certificates-of-impact/](https://rationalaltruist.com/2014/11/15/certificates-of-impact/) -- Christiano, Paul & Katja Grace (2015) The Impact Purchase, [https://impactpurchase.org/why-certificates/](https://impactpurchase.org/why-certificates/) -- Optimism & Buterin, Vitalik (2021) Retroactive Public Goods Funding, [https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c) -- Cotton-Barratt, Owen (2021), Impact Certificates and Impact Markets, Funding the Commons November 2021, [https://youtu.be/ZiDV56o5M7Q](https://youtu.be/ZiDV56o5M7Q) -- Drescher, Denis (2022) Towards Impact Markets, [https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1](https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1) -- Ofer & Cotton-Barratt, Owen (2022) Impact markets may incentivize predictably net-negative projects, [https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6](https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6) diff --git a/docs/versioned_docs/version-0.3.0/implementation/metadata.md b/docs/versioned_docs/version-0.3.0/implementation/metadata.md deleted file mode 100644 index 08eb9fcb..00000000 --- a/docs/versioned_docs/version-0.3.0/implementation/metadata.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: Metadata Standard -id: metadata -sidebar_position: 2 ---- - -# Hypercert Metadata Structure - -Hypercerts are represented as [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) tokens. All token instances of a hypercert must share the same ERC-1155 metadata. For sites like OpenSea to pull in off-chain metadata for ERC-1155 assets, your hypercert contract will need to return an IPFS URI that contains all necessary hypercert metadata. - -The hypercert metadata schema follows the [Enjin recommendation](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema) for ERC-1155 metadata. It also includes **six required dimensions** that are necessary to clearly and unambiguously identify the hypercert's impact claim. - -The following are standard ERC-1155 metadata fields. - -## ERC-1155 fields - -| Property | Description | -| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | Name or title of the hypercert. Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. | -| `description` | A human readable description of the hypercert. Markdown is supported. Additional external URLs can be added. | -| `image` | A URI pointing to a resource with mime type image/\* that represents the hypercert's artwork, i.e., `ipfs://`. We recommend images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. | -| `external_url` | [optional] A URL that can be displayed next to the hypercert on webpages like OpenSea and links users to a page that has more information about the project or impact claim. | -| `properties` | [optional] Additional properties (aka attributes) that may be helpful for discovery and curation of hypercerts. Marketplaces like OpenSea will display these properties in the same way as they display rarity traits of NFTs. | - -In order to perform hypercert-specific operations, including split and merge functions, and for your hypercert to robustly claim a set of coordinates in the impact space, there are six additional dimensions that must be included in your metadata. - -## Required Hypercert dimensions - -| Property | Description | -| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `work_scope` | An _ordered list_ of work scope tags. Work scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any work scope that is explicitly excluded from the claim. | -| `work_timeframe` | Date range from the start to the end of the work in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). | -| `impact_scope` | An _ordered list_ of impact scope tags. Impact scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any impact scope that is explicitly excluded from the claim. The default claim is to "all" impact, giving the owner rights to claim all potential impact created by the work that is represented by the hypercert. | -| `impact_timeframe` | Date range from the start to the end of the impact in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). The default claim is from the start date of work until `indefinite` (i.e., the impact may occur at any point in time in the future). | -| `contributors` | An _ordered list_ of all contributors. Contributors should be itemized as wallet addresses or ENS names, but may be names / pseudonyms. The default claim is to the wallet address that created the hypercert contract. A multisig wallet can be used to represent a group of contributors. | -| `rights` | An _unordered list_ of usage rights tags. The default claim is solely to "public display" of the hypercert, i.e., all other rights remain with the contributors. | - -## Examples - -### Example 1: hypercert with minimal bounds - -Here is an example of hypercert dimensions for work on IPFS with minimal bounds: - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["IPFS"], - "excludes": [], - "display_value": "IPFS" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["All"], - "excludes": [], - "display_value": "All" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1380585600, 1388534399], - "display_value": "2013-10-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1380585600, 0], - "display_value": "2013-10-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["Protocol Labs"], - "display_value": "Protocol Labs" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Example 2: hypercert with bounded impact claims - -This hypercert is for a carbon removal project that provides a bounded impact scope. - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["Protecting Trees in Amazon"], - "excludes": [], - "display_value": "Protecting Trees in Amazon" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["CO2 in Atmosphere"], - "excludes": [], - "display_value": "CO2 in Atmosphere" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1356998400, 1388534399], - "display_value": "2013-01-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1356998400, 0], - "display_value": "2013-01-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], - "display_value": "0xa1f...000, Project Forest Conservation" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Example 3: hypercert with excluded impact claims - -Here is an example that explicitly excludes an impact scope to generate a more fine-grained claim. - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["Protecting Trees in Amazon"], - "excludes": [], - "display_value": "Protecting Trees in Amazon" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["All"], - "excludes": ["CO2 in Atmosphere"], - "display_value": "All ∧ ¬CO2 in Atmosphere" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1356998400, 1388534399], - "display_value": "2013-01-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1356998400, 0], - "display_value": "2013-01-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], - "display_value": "0xa1f...000, Project Forest Conservation" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Additional guidelines - -Here are some additional guidelines for defining hypercert dimensions. - -- For most hypercerts, the `work_scope` is best represented as the name of the project or activity. Other information contained in the hypercert, namely, the `contributors` and the `work_timeframe` should provide sufficient context to disambiguate multiple claims from the same project. -- Similarly, for most hypercerts, the `impact_scope` will be most clearly represented as "all" (with an indefinite upper bound on the `impact_timeframe` dimensions). This gives the hypercert creator and its owners the flexibility to make claims about impact that may not have been observable or well-understood when the hypercert was created. - -- It is recommended to browse the `impact_scope` and `work_scope` tags that have already been created and are in use by your or other projects. (We are building a catalog to be available at [hypercerts.org](https://hypercerts.org).) Picking established tags can make it easier for users to discover, curate, and interact with your hypercert. In the long-run, we expect different ontologies to emerge in domains like climate solutions, open source software, etc, and picking more established tags will help prevent overlapping or duplicate claims. -- Tags for work scopes and impact scopes are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. -- Scopes that are explicitly excluded from the hypercert claim are enumerated separately and displayed with the `¬` prefix in the tag. Excluded scopes are not currently displayed on hypercert artwork. -- The order of tags matters only for display purposes. The hypercert artwork will only display a limited number of tags in the `impact_scope` and `work_scope` arrays due to image size and stylistic constraints. -- A `contributor` can be identified using any human-readable string. The base case is to set the `contributors` to the wallet address used to create the hypercert. A multisig wallet can be used to represent a group of contributors. - -### Assigning `rights` - -In version 1.0 of the protocol, only one `rights` tag will be enabled: - -> **Public Display**: owners of the hypercert have the right to publicly display and receive social utility from their hypercert. - -This means that any other rights regarding the work described by the hypercert either remain with the original contributors or are governed by other agreements. - -Additional `rights` including the potential for certain types of transfers to be explicitly enabled will be released in subsequent versions. - -## Optional hidden properties - -Creators may wish to add other fields in their metadata that are not a part of the hypercert claim and are not for display on third-party marketplaces like OpenSea. These can be added by creating a `hidden_properties` field in the metadata. diff --git a/docs/versioned_docs/version-0.3.0/implementation/token-standard.md b/docs/versioned_docs/version-0.3.0/implementation/token-standard.md deleted file mode 100644 index a767c670..00000000 --- a/docs/versioned_docs/version-0.3.0/implementation/token-standard.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Token Standard -id: token-standard -sidebar_position: 1 ---- - -### Hypercerts as a semi-fungible token - -In order to make the token identifiable, traceable, and transferable, hypercerts are represented as [ERC-1155 tokens](https://eips.ethereum.org/EIPS/eip-1155). The ERC-1155 standard enables a single deployed contract to store many hypercerts, facilitating simpler creation, transfers, as well as splitting and merging of hypercerts within a single namespace. As a semi-fungible token, each unique token represents a fraction of ownership of a hypercert. Hypercerts are then represented as a group of tokens, where the total ownership sums to 100%. In order to easily identify which hypercert a token belongs to, we utilize the upper 128 bits of a 256-bit token ID to identify the hypercert. All tokens within the same hypercert group should share the same [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). - -![hypercert id](../../static/img/hypercert_id.png) - -For illustrative purposes, let us assume that token IDs are just 2 bytes long, where the first byte represents the hypercert ID and the last byte represents which fraction of ownership. Alice could create a new hypercert token 0x2301, representing 100% of hypercert 0x23. If Alice wanted to transfer 20% to Bob, Alice could perform a split operation by minting token 0x2302 and transferring 20% of value to it, such that tokens 0x2301 and 0x2302 represent 80% and 20% ownership respectively of hypercert 0x23. Then Alice transfers token 0x2302 to Bob. Similarly, they could merge these 2 tokens together, back to form a token that represented 100% ownership. In this case, the value of 0x2301 would be transferred to 0x2302, and then 0x2301 is subsequently burned. - -Alice can also choose to split or merge hypercerts along some dimension of the impact space. For example, Alice may split hypercert 0x23 into two new hypercerts — 0x24 representing work done before the year 2000, and 0x25 representing work done after 2000. The original hypercert 0x23 is burned and the two new hypercerts store a reference to the previous hypercert. When the history of splits and merges are indexed, we can easily trace through the provenance of any individual hypercert. - -### Claim Data - -Hypercert claim data, such as scope of work and the contributor list, is encoded in JSON format into the [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). Claim data can be stored on-chain alongside the token, or in off-chain storage such as IPFS. For details on the JSON schema and how off-chain storage can be utilized, see the [hypercerts-sdk repository](https://github.com/hypercerts-org/hypercerts/tree/main/sdk). - -When considering whether to store hypercert metadata on-chain or off-chain, we can consider the different trade-offs to the user experience and cost, which may differ depending on which blockchain is being used. Storing data off-chain saves on costs, but could lead to on-chain claims without the metadata. Storing data on-chain adds additional security that the claims will not be forgotten but can lead to higher gas fees. - -Beyond the standard fields of hypercerts that locate the hypercert in the impact space, additional fields can be added. This allows for different templates in different impact areas, such as AI safety or biodiversity, as different additional information will be useful. Importantly, however, all hypercerts will be located in a single impact space – the additional fields do not change that. - -### Multi-chain support - -We expect hypercerts to exist in a multi-chain ecosystem, where the local deployment can be used to support the unique funding systems of that community. In order to visualize a single global impact space, we index the different contract deployments across chains and surface any potential hypercert claim conflicts. Because different blockchains support different subsets of programming languages, we do expect different implementations of the hypercert protocol to exist. However, they must adhere to the same hypercert data model to be indexed into the impact space. - -In order to decide which deployments to index into the hypercerts impact space, decentralized governance institutions will be used to govern the list of contract addresses used across all blockchains. diff --git a/docs/versioned_docs/version-0.3.0/intro.md b/docs/versioned_docs/version-0.3.0/intro.md deleted file mode 100644 index 0c4d7ca3..00000000 --- a/docs/versioned_docs/version-0.3.0/intro.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: What Are Hypercerts? -id: intro ---- - -# What are hypercerts? - -### Hypercerts are a new token standard for tracking and rewarding positive impact. - -Each hypercert represents a unique impact claim capturing the following information: - -- a scope of work and its corresponding scope of impact -- a set of time frames for both the work and its impact -- a set of contributors – the organization or people behind the work -- a set of rights you get by owning a hypercert - -The hypercert itself is an ERC-1155 semi-fungible token with the information above stored as metadata on IPFS. Here’s an example. - -### Hypercert example - -#### Graphic representation - -![hypercert design example](../static/img/hypercert_example.png) - -#### Supplementary information (metadata) - -- **Title of hypercert:** Invention of the InterPlanetary Filesystem (IPFS) -- **Description:** The InterPlanetary File System (IPFS) is a set of composable, peer-to-peer protocols for addressing, routing, and transferring content-addressed data in a decentralized file system. -- **Link:** ipns://ipfs.tech/ - -#### Hypercert dimensions (metadata) - -- **Set of contributors:** 0xb794f5ea0ba39494ce839613fffba74279579268 _(example Ethereum address)_ -- **Scope of work:** IPFS ∧ ¬ go-ipfs -- **Time of work:** 2013-01-01 --> 2013-12-31 -- **Scope of impact:** All -- **Time of impact:** 2013-01-01 --> indefinite -- **Rights:** Public display - -### Why should you care? - -We spend trillions of dollars every year on public goods via governmental agencies, foundations, private donations and corporate spendings; however, we don’t effectively track this work – leaving us in the dark, hoping that it actually has the intended positive impact. - -We believe we can do better: - -- We should start by tracking this work consistently – this is what hypercerts are for. -- We should evaluate how impactful that work was – this is what the open evaluation system of hypercerts supports. -- We should reward the work that was exceptionally impactful – this is what the public display of hypercerts and retrospective funding is for. - -Doing this would unfold powerful incentives. Retrospective funding 1) provides incentives for creators to take on public goods projects with a potentially high, but uncertain, impact, 2) enables feedback loops to learn from successes and failures, and 3) attracts more talent to the public goods sector by improving performance-based compensation. - -While we are excited about the prospects of retrospective funding, hypercerts do not impose any specific funding mechanisms, but start with tracking the work that is supposed to be impactful. As a database for many funding mechanisms this facilitates experimentation and interoperability between funding mechanisms. - -### Next - -Curious and want to learn more? Head over to the [whitepaper](whitepaper/whitepaper-intro.md) to dive deeper into the world of hypercerts. - -Or do you want to get started right away? Head to the [minting guide](minting-guide/minting-guide-start.md). diff --git a/docs/versioned_docs/version-0.3.0/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-0.3.0/minting-guide/gitcoin-round.md deleted file mode 100644 index 1ad2310a..00000000 --- a/docs/versioned_docs/version-0.3.0/minting-guide/gitcoin-round.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: Gitcoin Alpha Round Instructions -id: gitcoin-round -sidebar_position: 3 ---- - -# Gitcoin Alpha Round Instructions - -## Overview - -- all projects in the Gitcoin Alpha Round are invited to mint a hypercert for their work -- anyone who gave over $1 to a project is automatically allowlisted for that project’s hypercert -- 50% of each hypercert is distributed to the funders, 50% is kept by the project and can be transferred later -- each project has a custom URL to make minting super easy (the link is sent directly to each project) -- everything runs on Optimism (users only need to pay L2 gas costs) - -:::info -If your project participated in the Gitcoin Alpha Round, but you didn't get a message with a custom URL, please reach out to team[at]hypercert.org. -::: - -## Hypercerts x Gitcoin Alpha Round - -Now that Gitcoin’s Alpha Round has officially closed and the funding distribution is finalized, we are inviting all eligible projects that participated to mint a hypercert for their past work and to allocate fractions of their hypercert to a list of supporters. - -We’ve created a dApp that pulls all of the data required to mint your hypercert directly from Gitcoin’s Grant Protocol. You can fine-tune the properties, tweak your artwork, and review the distribution mechanism. Once you’re ready, hit the create button and your hypercert will be released into the ethers! - -Once your hypercert has been minted, the people who supported your project with a contribution of at least $1 DAI on Gitcoin’s Alpha Round will be able to connect and claim their fractions. - -A few important notes about the Alpha Round: - -- The total units of a hypercert is based on the total donations; each funder get awarded units proportional to their donations. -- Transfers will be restricted to one transfer from the project to the supporters. -- There will be no additional rights awarded to the funders except the right to "public display" their support for the project. - -## Instructions - -The following guidance is only for projects that receive a custom URL that pre-populates the hypercerts form based on their Gitcoin Grants' data. - -It explains the default settings in the form and recommends fields that the creator may choose to update or edit. - -:::note -Gitcoin Grant hypercerts are for retrospective work, i.e., they are intended to capture work that happened between Gitcoin Grants Round 15 (September 2022) and the Alpha Round (January 2023). Therefore, the work time period is always set to past dates. (You might need to adjust the name and description to also refer to past work only.) We are focusing solely on retrospective hypercerts for this round as part of broader efforts to promote retrospective funding; you can read more about it [in the whitepaper](whitepaper/retrospective-funding.md). -::: - -### General Fields - -#### Name of Hypercert - -This field is set by default to the name of your project on Gitcoin Grants. You can edit this to be more specific. Given that your project may create numerous hypercerts over time, consider giving each hypercert a name that represents a more discrete phase or output. - -#### Logo - -This field is set to the icon artwork provided for your project on Gitcoin Grants. If there was an error accessing your icon, you will see a generic icon. - -You can update this by providing a new URL and the hypercert artwork should update automatically. - -Logo images look best with an aspect ratio of 1.0 (square-shaped). - -#### Background Banner Image - -This field is set to the banner artwork provided for your project on Gitcoin Grants. If there was an error accessing your banner, you will see a generic Gitcoin banner. - -You can update this by providing a new URL and the hypercert artwork should update automatically. - -Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. - -#### Project Description - -This field is set by default to the description of your project on Gitcoin Grants. Review closely -- a long project description in your Gitcoin Grant description will be truncated. - -You may edit this to provide more details about your work and to remove information that is targeted solely at Gitcoin Grants users. This is also a good place to provide other links, such as Github repos or social media accounts, where the general public can learn more about the work. Please aim for a project description that is less than 500 characters. - -:::note -The project description should refer to **past work**, not future work that you would like to do with additional funding. -::: - -#### Link - -This field is set to the first external URL provided for your project on Gitcoin Grants. You can update this. - -### Hypercert Fields - -#### Work Scope - -This field is set by default to a **shortened version** of the name of your project on Gitcoin Grants. You may edit or add additional work scope tags. - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -#### Work Start/End Dates - -The start date has been set by default to the `2022-09-22` for all projects on Gitcoin Grants. This date coincides with the end of Gitcoin Grants Round 15. - -The end date references the last update to your grant page on Gitcoin Grants. - -You may edit or update these fields, however, the end date may not extend beyond `2023-01-31` (the close of the funding round) as all hypercerts will be retrospective in this round. - -#### Set of Contributors - -This field is set by default to the wallet address that is set as the recipient address for receiving Gitcoin Grants funding. - -:::note -You should review this field closely and – if applicable – provide the addresses of additional contributors. -::: - -### Advanced Fields - -#### Impact Scope - -This field is set by default to `all`. - -Updates are currently disabled on the frontend because funding decisions on Gitcoin Grants were not specific to an impact scope or impact time period. - -#### Impact Start/End Dates - -This field is set by default to the work start date of `2022-09-22` (see above) and a work end date of `indefinite`. Updates are currently disabled on the frontend. - -#### Rights - -This field is set by default to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. - -Updates are currently disabled on the frontend. - -### Distribution - -#### Allowlist - -This field is set by default to a custom allowlist generated for each project based on the funding it received on the Gitcoin Grants Alpha Round. You should not need to update this field. If there is a problem with your allowlist, please contact us. - -50% of the hypercert will be allocated according to this allowlist. The other 50% will be kept by the project, i.e. it is allocated to the address that mints the hypercert. You will be able to transfer or sell these fractions later as long as they are owned by the minter. This means that they can only be transferred or sold once. - -The formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. - -For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.96 donated --> 1 fraction -- $0.52 donated --> 0 fractions - -The queries used to generate the allowlists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -Donors who contributed to the matching pool for each round are also eligible to claim hypercerts. - -:::note -You are free to edit your allowlist. You can do this by following the step-by-step instructions [here](minting-guide/step-by-step.md). Just remember that you will need to upload the new allowlist in a CSV format to a storage site like [web3.storage](https://web3.storage) and then update the link in the allowlist field. Contact team[at]hypercerts.org if you need help. -::: - -### Confirmations - -#### Contributors' permission - -Every contributor needs to agree to have their contribution be represented by a hypercert. This is why the person minting the hypercert has to confirm to have the permission of all listed contributors. - -#### Terms & Conditions - -The terms & Conditions can be found [here](https://hypercerts.org/terms). - -### Final step: Click "Create" - -Make sure your Optimism wallet or multi-sig is connected. Click on "create" and wait for your hypercert to be created. Congratulations! diff --git a/docs/versioned_docs/version-0.3.0/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-0.3.0/minting-guide/minting-guide-start.md deleted file mode 100644 index 47e8ad7c..00000000 --- a/docs/versioned_docs/version-0.3.0/minting-guide/minting-guide-start.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Getting Started -id: minting-guide-start -sidebar_position: 1 ---- - -# Getting started - -### How to create a hypercert - -Creating a hypercert is similar to creating an NFT on sites like OpenSea or Zora. - -In this article, we’ll walk through the steps one by one and explain exactly what you need to do to create your first hypercert. - -There are typically two ways of creating a hypercert: - -1. As a project affiliated with a specific funding network (e.g., Gitcoin Grants): In this case, you should receive a custom URL from the funding network that pre-populates most of your hypercert fields. You will still be able to change most of these, so you should review and adjust them as needed to better describe your hypercert. Guidance on how to do so (for Gitcoin Grants projects) is provided at the end of this doc. -2. As a project not affiliated with a specific funding network: In this case, you will be creating a hypercert from scratch and filling in each field on your own. Read on below. - -### Who can create a hypercert? - -Anyone doing work that is intended to have a positive impact can create a hypercert. Your hypercert can be as simple as "I did X on this date and want to claim all future impact from it". - -It can also represent something more, such as a phase in an ongoing team project, an invention or discovery, a research publication, or an important software release. - -Critically, if the work was done by more than one person, then each person should be listed as a contributor to the hypercert and approve the creation of the hypercert. - -_Note: In the future, the approval of each contributor will be verified on-chain._ - -### What do I need to create a hypercert? - -You will need to prepare all of the information required in the form builder (see **Step-by-step instructions for creating a hypercert** below). This includes important metadata, such as a description of the project and the dimensions of your impact claim, as well as a project artwork. You may also want to include an allowlist of wallets that are approved to claim one or more fractions of the hypercert. - -In addition to the information regarding the hypercert itself, you’ll need a crypto wallet to mint your hypercert. “Minting” a hypercert is the process of writing an impact claim to the blockchain. This establishes its immutable record of authenticity and ownership. - -Next, choose a blockchain on which to mint your hypercert. The hypercerts protocol is available on Ethereum, Goerli (testnet), and Optimism. Each of these blockchains has different gas fees associated with transactions on their networks. To reduce gas fees we recommend Optimism for most projects. - -Finally, go ahead and create your hypercert. - -### How much does it cost to create a hypercert? - -You will need enough Ethereum in your wallet to cover gas fees. In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). - -The protocol currently does not offer gas-free or "lazy" minting. diff --git a/docs/versioned_docs/version-0.3.0/minting-guide/step-by-step.md b/docs/versioned_docs/version-0.3.0/minting-guide/step-by-step.md deleted file mode 100644 index 9f3b6303..00000000 --- a/docs/versioned_docs/version-0.3.0/minting-guide/step-by-step.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Step-by-step Instructions -id: step-by-step -sidebar_position: 2 ---- - -# Step-by-step instructions - -First, go to the [Create Hypercert](https://hypercerts.org/app/create) site with a wallet-enabled browser or follow the custom URL you received to access a prepopulated form. - -Although the site works on mobile, it is easier to use on desktop because the browser will display a dynamic preview of the hypercert while you fill out the Create form. - -Next, connect your wallet. You will be prompted to switch to the Ethereum or Optimism network. - -Once you've connected, you will see an empty form for creating a hypercert. - -### General fields - -#### Name of Hypercert - -Enter the name or title of the hypercert. This is the place to be verbose and specific about what the project is doing. You'll see on the preview when your title becomes too long. - -Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. - -Names are restricted to 100 characters but may include emojis (:smile:), accents (é), non-Latin scripts (表情), and other Unicode characters. - -#### Project Description - -Enter a human readable description of the hypercert. This is the place to share more details about the work and the team or individual behind the work. - -The description field supports [Markdown syntax](https://www.markdownguide.org/cheat-sheet/) and has a limit of 10,000 characters. - -In addition to the main link (see next field) you can add further links in the markdown to help others to understand the work of the project. - -#### Link - -A valid URL for the project, beginning with https:// - -This will be displayed next to the hypercert on webpages like OpenSea and should link users to a page that has more information about the project or impact claim. - -#### Logo - -An icon for the top left part of the card. This could be your project logo. It will be automatically masked to the shape of a circle. - -Logo images look best with an aspect ratio of 1.0 (square-shaped). - -The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. - -#### Background Banner Image - -A background image that will extend across the upper half of the artwork. This could be your project masthead or a unique piece of art. - -Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. - -Currently we don't support zoom / cropping, so you will need to test the look and feel on your own. - -The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. - -### Work Scope fields - -#### Work Scope - -One or multiple tags describe the work that the hypercert represents. This work scope will be used to identify the work that is included in the hypercerts and the work that is not included. - -Multiple tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -_Note: In the future, you will be able to specifically exclude work from the hypercert._ - -#### Start and End Date of Work - -The work time period defines when the work was done that the hypercert represents, i.e., only the work in this time period is included in the hypercert. - -The time period of work doesn't need to be the start and end date of a project, but it can be. One project can be split up into multiple hypercerts, e.g. all hypercerts can have the same `work scope`, but different time periods of work. Of course, the time periods are not allowed to overlap. - -### Impact scope fields - -#### Impact Scope - -The impact scope can be used to limit the impact that a hypercert represents, e.g. for the work scope `Planting trees` a hypercert can represent _only_ the impact on biodiversity by including the impact scope tag `Biodiversity`. This would exclude all other impacts, including the impact on CO2 in the atmosphere, which can be useful if that impact is already captured by a carbon credit. - -By default this is set to "`all`" and we strongly recommend keeping it that way. - -Just like the work scope, multiple impact scope tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction). - -#### Start and End Date of Impact - -The impact time period is another way to limit the impact that a hypercert represents, e.g. inventing a new medical treatment has a positive impact over many years, but we might want to capture the positive impact separately for each year. - -By default the `impact start date` is the same as the `work start date` and the `impact end date` is "`indefinite`", i.e., the impact is not restricted time-wise. We strongly recommend keeping it that way. - -### Set of Contributors - -Provide a list of contributors, one per line, or comma-separated. - -The list should include _all_ contributors that performed the described work. - -Contributors are generally itemized as wallet addresses or ENS names, but can also be names / pseudonyms. Groups of contributors can be represented by a multisig or name of an organization. - -### Owners - -#### Allowlist - -The allowlist allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions afterwards. For example, it can be used to allocate fractions to previous funders and contributors. - -The allowlist is implemented as a CSV file specifying `index,address,price,fractions` headers. - -| index | address | price | fractions | -| ----- | ------------------------------------------ | ----- | --------- | -| 0 | 0x5dee7b340764c49a827c60d2b8729e49405fbefc | 0.0 | 100 | -| 1 | 0x1e2dbb9ca3f6d48e085384a821b7259abfdc7d65 | 0.0 | 50 | -| ... | ... | ... | ... | -| 999 | 0x436bad18642f45d3fa5fcaad0a2d81764a9cba85 | 0.0 | 1 | - -The `price` field is denominated in ETH. This should remain at 0.0 for all hypercerts, as primary sales are not currently supported through the app and the secondary sale/transfer of hypercerts is currently not allowed. - -You can store your allowlists on IPFS using [web3.storage](https://web3.storage/). - -:::note -If your allowlist is not properly formatted, you will be unable to mint your hypercert. If you do not include an allowlist, then the creator of the hypercert will receive 100% of the hypercert (set to a default of 10,000 units), which you can then sell or transfer to another wallet a maximum of one time. -::: - -#### Rights - -This field defines the rights that owners of the hypercert have over the work being claimed by this hypercert. - -By default this is set to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. - -_Note: In the future, additional rights can be included for different hypercerts._ diff --git a/docs/versioned_docs/version-0.3.0/whitepaper/evaluation.md b/docs/versioned_docs/version-0.3.0/whitepaper/evaluation.md deleted file mode 100644 index 87fb9194..00000000 --- a/docs/versioned_docs/version-0.3.0/whitepaper/evaluation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Open Impact Evaluations -id: evaluation -sidebar_position: 5 ---- - -A key design element is that hypercerts themselves do not make a claim about the size of the impact, but only account for the work that is supposed to be impactful. The figure below shows this contrast in a simplified illustration of the example that we introduced above. The open evaluation system allows multiple evaluations to point at the same area of the impact space that a hypercert claims. The evaluations can include self-evaluation from the contributors themselves. Funders observe these and make their funding decisions based on this richer set of information. - -![hypercert evaluations](../../static/img/hypercert_evaluations.png) - -The open evaluation system is also used to provide additional information, e.g. an evaluator or the project itself provides information about the health of the trees. This information can then be used transparently by other evaluators to evaluate the impact on CO2 in the atmosphere. - -An important feature is that the evaluations do not directly point at a hypercert, but rather at an area in the impact space. In practice this area will mostly be the exact same area that a hypercert claims, such that it can be considered an evaluation of the hypercert, but it does not have to. This feature ensures that, if hypercerts are merged or split, previous evaluations will continue to be linked appropriately. - -The form of evaluations can be standardized to simplify handling and comparing multiple evaluations from multiple evaluators. The open evaluation system allows for templates to be created and used by any evaluators. Similar to the emerging ontologies, these are not enforced centrally, but should emerge as useful standards – potentially steered by decentralized governance institutions. - -Important characteristics of the open evaluation system are: - -- Evaluators can submit multiple evaluations of the same area in the impact space as more information becomes available -- Evaluations can challenge other evaluations -- Evaluation methodologies can evolve over time - -These features allow the whole evaluation system to be dynamically improved by each actor. The relevant incentives for this improvement will stem from the funders who will value the signals from some evaluators more than others and evaluators are able to build up reputation. diff --git a/docs/versioned_docs/version-0.3.0/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-0.3.0/whitepaper/hypercerts-intro.md deleted file mode 100644 index 8acc11d1..00000000 --- a/docs/versioned_docs/version-0.3.0/whitepaper/hypercerts-intro.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: "Hypercerts: a New Primitive for Impact Funding Systems" -id: hypercerts-intro -sidebar_position: 3 ---- - -### Defining hypercerts - -A hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and represents all or parts of that impact. A hypercert has the following fields (one for each dimension): - -1. **Set of contributors:** An ordered list of all contributors, who claim to do or have done the work described by this hypercert. -2. **Scope of work:** A conjunction of potentially-negated work scope tags, where an empty string means “all”: - -``` - ::= AND | " " - ::= | NOT -``` - -3. **Time of work:** A date range, from the start to the end of the work being claimed by this hypercert. -4. **Scope of impact:** A conjunction of potentially-negated impact scope tags, where an empty string means “all”: - -``` - ::= AND | " " - ::= | NOT -``` - -5. **Time of impact:** Date ranges from the start to the end of the impact. -6. **Rights of the owners:** An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. - -Implementing hypercerts as a semi-fungible token allows multiple contributors and funders to own parts of hypercerts. For instance the original contributors can award 10% of a hypercert to a funder, while keeping 90%, which they can award to other funders later. This is why hypercerts are fractionalizable. - -### Examples - -In the simplest cases of hypercerts, the scope of work and impact as well as the time of impact are not restricted and no rights are transferred to owners of the hypercerts, i.e. the hypercerts just define the who (set of contributors) and when (time of work) of the claimed work. Scope of work and impact would be set to all, time of impact to “indefinite” and the rights to only “public display of support”. The latter is always included as the hypercert is a public record, such that owners will always automatically display their support of the work. - -Take for example hypercert 1 below: It represents all work that contributor 1 has performed in 2013 with all the impact that the work had from the beginning of the work; the hypercert doesn’t give any additional rights to the owners of the hypercert. - -The other fields – except the rights field – can be used to limit the work or impact that is represented by the hypercert. Hypercert 2 limits this to the work on IPFS in 2013, i.e. any other work besides IPFS that contributor 1 performed is not included. Hypercert 3 limits it even further as it excludes a specific aspect of IPFS, the go-ipfs implementation. - -| | **Hypercert 1** | **Hypercert 2** | **Hypercert 3** | -| ----------------------- | ------------------------- | ------------------------- | ------------------------- | -| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | -| **Scope of work** | all | IPFS | IPFS ∧ ¬ go-ipfs | -| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | -| **Scope of impact** | all | all | all | -| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → 2013-12-31 | -| **Rights** | Public display of support | Public display of support | Public display of support | - -In the table below we illustrate a use case for limiting the scope of impact. Suppose contributor 1 protects trees in a certain area. This work has positive effects on the CO2 in the atmosphere and could turn into carbon credits; however, the trees have additional positive impacts, such as protecting biodiversity. Instead of including all positive impacts in one hypercert (hypercert 4), the impact can be split between the impact on CO2 in the atmosphere (hypercert 5) and all other positive impacts (hypercert 6). If funders are willing to pay for biodiversity, this would be a new income opportunity. And it would account for the additional positive impact that other methods of reducing CO2 might not have, like industrial carbon capture. Importantly, negative impacts can not be excluded from a hypercert. - -| | **Hypercert 4** | **Hypercert 5** | **Hypercert 6** | -| ----------------------- | -------------------------- | -------------------------- | -------------------------- | -| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | -| **Scope of work** | Protecting trees in area X | Protecting trees in area X | Protecting trees in area X | -| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | -| **Scope of impact** | all | CO2 in atmosphere | all ∧ ¬ CO2 in atmosphere | -| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → indefinite | -| **Rights** | Public display of support | Public display of support | Public display of support | - -Importantly a hypercert does not specify the “size” of the impact, e.g. a hypercert does not state “5 tons of CO2 removed from the atmosphere.” Instead the hypercert only defines the work, e.g. “200 trees protected” (scope of work) in 2022 (time of work). The size of the impact is then left to the evaluations of the “CO2 in the atmosphere” (scope of impact) in 2022 (time of impact) that point towards the covered region of the hypercert. For instance: This allows a self evaluation to claim that 5 tons of CO2 were removed in a given year as well as one or multiple evaluations from independent auditors to confirm or challenge how much CO2 has been removed. An evaluator could detect that some of the trees were not healthy and hence only 4 tons of CO2 were removed. Allowing for multiple evaluation is a defining characteristic of the open evaluation system. - -### Functions of hypercerts - -#### 1. Identifiability - -Hypercerts clearly define the work that is supposed to be impactful by creating a record of who (set of contributors) claims to do or have done what (scope of work) in what time period (time of work). They also allow the creation of multiple records of the same work to identify separate impacts that this work had or will have (scope of impact) over specified time periods (time of impact). - -#### 2. Traceability - -As these records are public and logically monotonic (immutable, except to split or merge hypercerts), records are durable and permanent. - -#### 3. Transferability - -The records are a digital object that can be owned and ownership can be transferred (under specific conditions). As hypercerts can be created as fractionalizable, it is also possible to transfer only a specified fraction of the hypercert. Each hypercert defines the rights over the defined work that owners have, such as rights to retrospective rewards, rights to public display of the support (“bragging rights”) or rights to passive income from intellectual property. - -:::note Transferability restrictions - -Hypercerts are generally transferable. However, there are use cases, in which minters of hypercerts want to restrict how their hypercerts can be transferred. The protocol allows the minter to restrict who can transfer the hypercert and/or to whom the hypercert can be transferred. For instance, by specifying that only the original owner can transfer the hypercert, any future owner is prohibited from selling it, i.e. a secondary market would not exist for this hypercert. - -::: - -### Merging hypercerts - -Besides the fungible dimension, hypercerts can be merged and split on any of the six dimensions as shown in box 1. Let us take the hypercert 1 from the section "Hypercerts definition" and focus only on two of the dimensions, scope of work and time of work. These two dimensions create a simplified impact space. The figure below shows how work on IPFS (InterPlanetary File System) could have been minted over time in separate hypercerts, one for each quarter of work. - -![minting hypercerts example](../../static/img/creating.png) - -We created five hypercerts, one for each quarter of work. As the resulting work of all of these together is IPFS 0.1, the merged hypercert in total is more meaningful and more valuable than just the five individual hypercerts. In this case the proverb is true, the whole is greater than the sum of its parts. Hence, we want to merge them as shown in the next figure. - -![merging hypercerts example](../../static/img/merging.png) - -### Splitting hypercerts - -Conversely, splitting can increase the meaningfulness and value of hypercerts as well. We can split the work on IPFS 0.1 into the conceptual work “invention of IPFS” and the implementation via “go-ipfs 0.1” as shown in the next figure. - -![splitting hypercerts examples](../../static/img/splitting.png) - -Other use cases are where multiple contributors want to combine their work on the same scope of work (merging) or disentangle their work (splitting). Ultimately, splitting and merging allows users to repackage the digital representation of their work and impact. - -Importantly, splitting and merging are the only operations that are permitted to change hypercerts. Once an area in the impact space is claimed, it can not be unclaimed. This ensures that claims are never forgotten. - -### Retiring hypercerts - -While a claim in the impact space can not be unclaimed, it can be retired. Retiring a hypercert means that owners can not transfer and sell it anymore. This way owners prove that they are the final buyers of the impact. Technically retiring hypercerts means that they are sent to a specific null address, which ensures that the retired hypercerts are recorded and traceable. diff --git a/docs/versioned_docs/version-0.3.0/whitepaper/ifs.md b/docs/versioned_docs/version-0.3.0/whitepaper/ifs.md deleted file mode 100644 index 6f71ac50..00000000 --- a/docs/versioned_docs/version-0.3.0/whitepaper/ifs.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: The Need for Interoperable Impact Funding Systems (IFSs) -id: ifs ---- - -# The Need for Interoperable Impact Funding Systems (IFSs) - -### An IFS consists of - -- **Actors:** Contributors, funders, evaluators, and beneficiaries -- **Funding mechanisms:** Grants, bounties, retrospective funding, etc. -- **Coordination mechanisms:** Roadmapping, communication forums, etc. -- **A goal:** Maximize the domain-specific positive value created (impact) - -The goal will be specific to the impact area, e.g. prevent existential risks from artificial intelligence (AI) would be the goal for the impact area “AI safety.” To achieve these goals, skilled contributors must work with high effort on promising projects. Additionally, for those projects that create impact continuously, sufficient income streams are necessary to cover both their ongoing operating expenses and contributors’ upside incentives. - -#### Actors in IFSs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeSubtypeDescription
    ContributorsPeople or organizations who do the work
    FundersProspective fundersPeople or organizations who fund work before it is done
    Retrospective fundersPeople or organizations who fund work after it is done
    EvaluatorsScoutsPeople or organizations who evaluate the potential impact of work before it is done
    AuditorsPeople or organizations who evaluate the impact of work after it is done
    BeneficiariesPeople or objects that are impacted by the work
    - -### Guiding questions for designing IFSs - -1. **Projects:** How can we improve the chances that the most promising projects are worked on? -2. **Talent & resources:** How can we attract top talent to contribute to the most promising projects and provide them with the necessary resources? -3. **Effort:** How can we reward contributors for their impact on outcomes? -4. **Sustainable income:** How can we create recurring income streams and financial sustainability for impactful projects? - -Markets have been proven very powerful in answering these questions if they are directed towards maximizing profits. As we are directing systems towards maximizing impact, these answers become more challenging. In particular, in an IFS we are facing coordination and incentive problems in funding impact, such as the free-rider problem. - -### Example dynamics between actors in an IFS - -In order for impact funding systems to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources and (3) evaluations. In the diagram below you see a potential dynamic between the actors of an IFS. In that scenario hypercerts can account for the prospective funding (steps 2-3) as well as for the retrospective funding (steps 8-9) from different funders. Evaluations are made public and can be discovered through the hypercerts for all funders (steps 5-7). Retrospective funders can reward not only the contributors but also the prospective funders (steps 10-11). - -```mermaid -sequenceDiagram - autonumber - participant Beneficiaries - participant Contributors - participant Prospective funders - participant Retrospective funders - participant Evaluators - Contributors ->> Contributors: Mint hypercerts - Prospective funders ->> Contributors: Award funding - Contributors ->> Prospective funders: Award fractions of
    the hypercert - Contributors ->> Beneficiaries: Create impact - Retrospective funders ->> Evaluators: Fund evaluation - Evaluators ->> Beneficiaries: Evaluate impact on beneficiaries - Evaluators ->> Retrospective funders: Make evaluations public,
    esp. for retrospective
    funders - Retrospective funders ->> Contributors: Award funding - Contributors ->> Retrospective funders: Award fractions of hypercerts - opt - Retrospective funders ->> Prospective funders: Award funding - Prospective funders ->> Retrospective funders: Transfer fractions
    of hypercert - end -``` - -### Hypercerts as a data layer for IFSs - -By serving as a single, open, shared, decentralized database hypercerts lower the transaction costs to coordinate and fund impactful work together. This is important because the optimal funding decisions of a single funder depends on the funding decision of all other funders. For instance, some work is only impactful if a minimum funding is provided: The impact is non-linear in the funding amount, e.g. half a bridge is not half as impactful as a full bridge. Other work might be over-funded, i.e. the impact of an additional dollar is basically zero. Ultimately, funders want to find the highest impact for each additional dollar spend (cf. S-process as in Critch, 2021). Today multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Through hypercerts the funding becomes more transparent and the credits for funding impactful work can be easily shared. Coordinating funding becomes easier. - -Hypercerts don’t solve this coordination problem by themselves, but build the basis for different decision and funding mechanisms as shown below. Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. Hypercerts do not lock in any particular decision-making scheme for funders. - -![Hypercerts as a data layer for an IFS](../../static/img/hypercert_data_layer.png) - -Looking farther into the future: If a large majority of funding across an entire IFS ends up flowing through hypercerts, funders have created the transparency that enables each of them to make the best decisions given the funding decision of everyone else. diff --git a/docs/versioned_docs/version-0.3.0/whitepaper/impact-space.md b/docs/versioned_docs/version-0.3.0/whitepaper/impact-space.md deleted file mode 100644 index f8fed762..00000000 --- a/docs/versioned_docs/version-0.3.0/whitepaper/impact-space.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: A Consistent Impact Space -id: impact-space -sidebar_position: 4 ---- - -Every hypercert represents a claim in the impact space, which itself represents all possible claims. Above we illustrated the impact space with two dimensions, scope and time of work. The complete impact space is spanned by the six dimensions introduced in the definition of hypercerts. - -### Consistency of the impact space - -Every point in the impact space should either be claimed or not be claimed. No point must be claimed twice, or equivalently: - -- If the impact of some work is represented in one hypercert, it must not be part of any other hypercert. -- Hypercerts must not overlap with each other. - -The table below shows two hypercerts that were illustrated in the section on "Hypercerts operations", but now with all six fields. The two hypercerts can represent the exact same work by the same contributor, but they do not overlap because of the difference in the time of work. - -| | **Hypercert 7** | **Hypercert 8** | -| ----------------------- | ------------------------ | ------------------------ | -| **Set of contributors** | Contributor 1 | Contributor 1 | -| **Scope of work** | IPFS | IPFS | -| **Time of work** | 2013-10-01 to 2013-12-31 | 2014-01-01 to 2014-03-31 | -| **Scope of impact** | all | all | -| **Time of impact** | 2013-10-01 → indefinite | 2014-01-01 → indefinite | -| **Rights** | None | None | - -The consistency of the impact space is crucial as it ensures that no rights to an impact claim are sold twice. If for example someone owns the right to retrospective rewards for the impact of some work, the owners must be identifiable unambiguously. - -Because users can create hypercerts with arbitrary data on any chain, on which a hypercert contract is deployed, we provide ways to help users detect collisions in the impact space. For example, if one hypercert on Ethereum points to the work on “IPFS”, and another hypercert on Filecoin points to the work on “https://github.com/ipfs/go-ipfs” both with the same contributor and time of work, which of these overlapping hypercerts is the correct one to support? To surface such overlapping hypercerts, the hypercerts protocol and SDK will support mechanisms to index, search, and visualize neighbors in the impact space. With these tools evaluators can quickly detect potential conflicts and submit the results as evaluations to help disambiguate proper credit and attribution. - -### Emerging ontologies - -Common ontologies for the scope of work and scope of impact are useful to create transparency and improve discoverability. Such ontologies need to be created from the practices and should be adapted over time. They are like emerging norms, instead of fixed rules. However, some larger players or a group of smaller players could enforce certain ontologies, e.g. if multiple funders agree that they only fund projects that follow a specified ontology. - -As some ontologies might be more useful than others, we would ideally see a consensus emerge between participants and experts in each impact area. Decentralized governance institutions can help facilitate this; however, further details on the design are out of the scope of this paper and are left for future work. diff --git a/docs/versioned_docs/version-0.3.0/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-0.3.0/whitepaper/retrospective-funding.md deleted file mode 100644 index 57444581..00000000 --- a/docs/versioned_docs/version-0.3.0/whitepaper/retrospective-funding.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Retrospective Impact Funding -id: retrospective-funding -sidebar_position: 6 ---- - -### Introducing retrospective funding - -While hypercerts do not impose any specific funding mechanisms, they are especially useful for retrospective funding. The core idea, from the perspective of contributors building impactful goods, is this: if you can reasonably expect to get funded retrospectively for your work once you produce a positive impact, then you can work now, in expectation of a probabilistic future cash flow. In another conception, you are effectively “borrowing” money from this anticipated future cash flow to fund the work in the first place; the expectation of future funding “retro-causes” the impactful work. Retrospective funding may be able to 1) provide incentives for contributors to take on impactful goods projects with a potentially high, but uncertain, impact and 2) create a more efficient IFS by back-propagating signals on what outcomes were impactful post-hoc. - -In addition, contributors are able to receive fair compensation by providing outsized impact that will be highly valued. It incentivizes you to create a positive impact, beyond your intrinsic motivation. This does not mean that the most successful contributors to impactful goods automatically have potential upside comparable to some for-profit startup founders (or that they should), just that their potential upside does depend on how much funders later value their past work. This will attract more talent to the impact sector by improving performance-based compensation. - -The crucial aspect for this to work: funders need to retrospectively fund impact, and send credible signals that they will do so in the future. Based on these signals contributors form expectations about future retrospective rewards and can start working today to receive them in the future. - -Hypercerts facilitate retrospective funding as the impact claims are identifiable, traceable and transferable. Contributors can sell parts of their hypercerts to prospective funders to receive the necessary funding for their project (“activity” in the figure below). The project delivers impact to a larger group (“beneficiaries”), which retrospectively buys the hypercerts from the prospective funder, and from the contributors if they retained some fraction of their hypercerts (the latter is not represented in the figure). - -![Retrospective funding with hypercerts](../../static/img/retrospective_funding.png) - -### Increasing rewards - -Retrospective funding allows us to increase rewards as more impact is created because impact is easier to observe, measure and prove retrospectively. Increasing rewards – as shown in the next figure – incentivizes contributors to put in their highest effort to produce impact and enables contributors to be rewarded for their talent. Moreover, prospective funders are incentivized to select, fund and support the projects with the highest expected impact, if they also receive retrospective rewards. - -![Increasing rewards](../../static/img/increasing_rewards.png) - -Note that retrospective funding should not be used in cases where a significant negative impact is possible since a nongovernmental, permissionless framework can not impose retrospective penalties for negative externalities. See Ofer & Cotton-Barratt (2022) for a discussion of this limitation of retrospective funding. - -In some cases we do not expect the retrospective evaluation to be any different than the prospective evaluation, i.e. there is no uncertainty resolved over time as the impact of an activity is already “known” prospectively. In these cases retrospective funding would only complicate the funding mechanism and funding via grants or milestone bounties would be preferable. Retrospective funding is preferable only if uncertainty is resolved over time. - -### Impact evaluations - -The relevance of impact evaluations will depend on how much their signals influence the funding decisions of retrospective funders (see the potential dynamics in the section on "IFSs"). This is a critical difference to many impact reports today: If a project was funded by a grant, the funders as well as the project want to receive a positive evaluation. If, however, the funding decisions of the retrospective funders are outstanding, they are interested in truthful signals about the impact. Hence, funders value improvements in evaluation methodologies and can fund independent evaluators. Evaluators in turn would build up a reputation for their evaluation methodologies and improve the strength of their signals to retrospective funders. - -Impact evaluators can take on a range of forms ranging forms, such as - -- Voting by relevant communities or beneficiaries -- Expert panels -- Professional evaluators similar to financial rating agencies -- Automatic monitoring and data collection by sensors and oracles - -The most useful form or combinations thereof will depend on the specific requirements of the impact area. For a generalized framework on impact evaluators see Protocol Labs (2023). - -While retrospective funding makes impact evaluations financially relevant for funders and contributors, hypercerts enable to pre-commit funding for those evaluations: As impact claims are never forgotten, any actor can at any time commit funding to a future evaluation of these claims. diff --git a/docs/versioned_docs/version-0.3.0/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-0.3.0/whitepaper/whitepaper-intro.md deleted file mode 100644 index 4d4648ba..00000000 --- a/docs/versioned_docs/version-0.3.0/whitepaper/whitepaper-intro.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Introduction -id: whitepaper-intro ---- - -# Vision & Whitepaper - -:::note - -If you prefer to read the draft whitepaper (v0) as a pdf, you can find it [here](../../static/pdf/hypercerts_whitepaper_v0.pdf). The content is mostly identical to the following pages. - -::: - -#### The world faces unprecedented challenges, from climate change to safe artificial intelligence, that require billions to trillions of dollars of public goods funding. - -High-upside/high-uncertainty endeavors are often overlooked due to the absence of strong incentives to pursue them in the dominant public goods funding framework of at-cost grants or even a milestone-bounty framework (which directly exposes small contributors to aversive risk levels). Yet these should be pursued when the expected positive value is very high, as it often is. New impact funding mechanisms can address this. One such mechanism is retrospective funding, which rewards projects based on the impact they create after the impact is observable. If projects can reasonably expect such retrospective rewards, they are incentivized to maximize their impact and – together with prospective funders – take risky bets when the expected positive value is high. - -#### In order for Impact Funding Systems (IFSs) to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources, and (3) evaluations. - -Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. We do not wish to lock in any particular decision-making scheme for funders. Without mechanisms like these, multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Funders should be able to easily collaborate with other funders or to intentionally fund different projects to diversify the funded approaches. Evaluators should be able to evaluate the same impact with different methodologies – potentially with conflicting results, to foster rigor and progress of evaluation methodologies. - -#### Hypercerts create this interoperability by serving as a single, open, shared, decentralized database for impact funding mechanisms. - -A single hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and whose ownership is fractionizable and transferable (under specific conditions). Hypercerts do not impose any specific funding mechanisms but provide baseline invariant guarantees such that claims will not be forgotten as different mechanisms come into and out of fashion. This is also why hypercerts are especially useful for any retrospective funding mechanisms – funding can be applied to claims of the past. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/about.md b/docs/versioned_docs/version-1.0.0-alpha.0/about.md deleted file mode 100644 index e2d4eb79..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/about.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: The Hypercerts Foundation -id: about ---- - -# The Hypercerts Foundation - -### Mission - -The mission of the Hypercerts Foundation is to advance the development and adoption of open-source protocols for funding and rewarding positive impact. - -### Organization - -The Hypercerts Foundation is a fully independent organisation working closely with stakeholders in the open source, scientific research, and cryptography communities to develop and promote additional protocols that are decentralized, secure, and transparent. The Foundation will also provide support and resources to help drive the wider adoption of these protocols. - -### History - -Research on hypercerts was first presented to the public by David A. Dalrymple at the conference series Funding the Commons in March 2022. However, the concept of “impact certificates” has been a recurring theme at conferences and in online discussion forums since at least 2014. In late 2022, a small team of research scientists, developers, and practitioners began implementing hypercerts as a set of Ethereum-based smart contracts that could be used to assert and fund impact claims. The Hypercerts Foundation will now serve as the long-term home for this work. - -The new foundation is supported in part by Protocol Labs and is part of the broader Protocol Labs Network of hundreds of companies and organizations. The Foundation will complement Protocol Labs Network’s mission of enabling a more secure, open, and accessible internet. The Hypercerts Foundation, however, is fully independent and will focus on protocol development and cultivating a community of developers and impact entrepreneurs well beyond the Protocol Labs Network. - -### Further links - -Read the full [announcement of the Hypercerts Foundation](https://hypercerts.notion.site/Introducing-the-Hypercerts-Foundation-d956203fe0fc4792980da138015e770a). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md deleted file mode 100644 index bc65b116..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md +++ /dev/null @@ -1,101 +0,0 @@ -# Allowlists - -Allowlists are an efficient way to enable distribution of hypercert fractions amongst a group. -First, the creator will create the hypercert with the metadata and an immutable allowlist. -With the `claimId`, every account specified in the allowlist can later mint their fraction token from that allowlist. - -## Create an allowlist - -First specify an allowlist, mapping addresses to the number of units they should receive. - -```js -import { - TransferRestrictions, - formatHypercertData, - Allowlist, -} from "@hypercerts-org/sdk"; - -const allowlist: Allowlist = [ - { address: "0x123", units: 100 }, - { address: "0xabc", units: 100 }, -]; -``` - -Then, call `createAllowlist` with the metadata and allowlist. - -```js -const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; -const transferRestrictions = TransferRestrictions.FromCreatorOnly - -const { claimId } = await hypercerts.createAllowlist({ - allowList, - metaData, - totalUnits, - transferRestrictions: TransferRestrictions.FromCreatorOnly, -}); -``` - -> **note** We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree generation and data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree) - -It first checks if the client is writable and if the operator is a signer. If the operator is not a signer, it throws an `InvalidOrMissingError`. - -Next, it validates the allowlist and metadata by calling the `validateAllowlist` and `validateMetaData` functions respectively. If either the allowlist or metadata is invalid, it throws a `MalformedDataError`. - -Once the allowlist and metadata are validated, the method creates a Merkle tree from the allowlist and stores it on IPFS. It then stores the metadata on IPFS as well. - -Finally, the method invokes the `createAllowlist` function on the contract with the signer's `address`, the total number of `units`, the Merkle tree `root`, the metadata `CID`, and the `transfer restrictions`. If the method is called with `overrides`, it passes them to the createAllowlist function. - -## Claiming a fraction token - -Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: - -| Variable | Type | Source | -| -------- | ------------ | ------------ | -| claimId | BigNumberish | Hypercert ID | -| units | BigNumberish | Allowlist | -| proof | BytesLike[] | Merkle tree | - -We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. - -Then, call `mintClaimFractionFromAllowlist` with the required data. The contracts will also verify the proofs. However, when providing the `root` in the function input, the proofs will be verified before a transaction is submitted. - -```js -import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; - -const claimId = "0x822f17a9a5eecfd...85254363386255337"; -const address = "0xc0ffee254729296a45a3885639AC7E10F9d54979"; - -const { indexer, storage } = hypercertsClient; -const claimById = await indexer.claimById(claimId); -const { uri, tokenID: _id } = claimById.claim; -const metadata = await storage.getMetadata(uri || ""); -const treeResponse = await storage.getData(metadata.allowList); -const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); - -let args; -// Find the proof in the allowlist -for (const [leaf, value] of tree.entries()) { - if (value[0] === address) { - args = { - proofs: tree.getProof(leaf), - units: Number(value[1]), - claimId: _id, - }; - break; - } -} - -// Mint fraction token -const tx = await hypercerts.mintClaimFractionFromAllowlist({ - ...args, -}); -``` - -Let's see what happens under the hood: - -First, the method checks that the client is not `read only` and that the operator is a signer. If not, it throws an `InvalidOrMissingError`. - -Next, the method verifies the Merkle `proof` using the OpenZeppelin Merkle tree library. If a `root` is provided, the method uses it to verify the proof. If the proof is invalid, it throws an error. - -Finally, the method calls the `mintClaimFromAllowlist` function on the contract with the signer `address`, Merkle `proof`, `claim ID`, and number of `units` as parameters. If overrides are provided, the method uses them to send the transaction. Otherwise, it sends the transaction without overrides. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md deleted file mode 100644 index 4684053c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md +++ /dev/null @@ -1,84 +0,0 @@ -# AllowlistMinter - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -## Events - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -## Errors - -### DoesNotExist - -```solidity -error DoesNotExist() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md deleted file mode 100644 index 518efa42..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md +++ /dev/null @@ -1,895 +0,0 @@ -# HypercertMinter - -_bitbeckers_ - -> Contract for managing hypercert claims and whitelists - -Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. - -_Wrapper contract to expose and chain functions._ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### batchBurnFraction - -```solidity -function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenIDs | uint256[] | undefined | - -### batchMintClaimsFromAllowlists - -```solidity -function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable -``` - -Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - -_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| -------- | ----------- | ----------- | -| account | address | undefined | -| proofs | bytes32[][] | undefined | -| claimIDs | uint256[] | undefined | -| units | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256) external nonpayable -``` - -Burn a claimtoken; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| \_2 | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable -``` - -Batch burn claimtokens; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| \_2 | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address _account, uint256 _tokenID) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | - -### createAllowlist - -```solidity -function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Register a claim and the whitelist for minting token(s) belonging to that claim - -_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| merkleRoot | bytes32 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable -``` - -Merge the value of tokens belonging to the same claim - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------- | --------- | ----------- | -| \_account | address | undefined | -| \_fractionIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint a semi-fungible token for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimFromAllowlist - -```solidity -function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable -``` - -Mint a semi-fungible token representing a fraction of the claim - -_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| units | uint256 | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint semi-fungible tokens for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### name - -```solidity -function name() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### readTransferRestriction - -```solidity -function readTransferRestriction(uint256 tokenID) external view returns (string) -``` - -TRANSFER RESTRICTIONS - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### splitFraction - -```solidity -function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable -``` - -Split a claimtokens value into parts with summed value equal to the original - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| -------------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | -| \_newFractions | uint256[] | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_see { IHypercertMetadata}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | ----------- | -| \_uri | string | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md deleted file mode 100644 index e31e8840..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md +++ /dev/null @@ -1,434 +0,0 @@ -# HypercertTrader - -_bitbeckers_ - -> Contract for managing hypercert trades - -Implementation of the HypercertTrader Interface - -## Methods - -### batchBuyUnits - -```solidity -function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable -``` - -This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. - -_Buys Hypercert tokens from multiple existing offers in a single transaction._ - -#### Parameters - -| Name | Type | Description | -| ------------------- | --------- | -------------------------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerIDs | uint256[] | The list of IDs of the offers to buy from. | -| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | -| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | -| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | - -### buyUnits - -```solidity -function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable -``` - -This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. - -_Buys Hypercert tokens from an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | --------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerID | uint256 | The ID of the offer to buy from. | -| unitAmount | uint256 | The number of units to buy. | -| buyToken | address | The address of the token used for payment. | -| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | - -### cancelOffer - -```solidity -function cancelOffer(uint256 offerID) external nonpayable -``` - -This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. - -_Cancels an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ------------------------------ | -| offerID | uint256 | The ID of the offer to cancel. | - -### createOffer - -```solidity -function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | -------------------------------- | ----------- | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| unitsForSale | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -### getOffer - -```solidity -function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------- | ----------- | -| \_0 | IHypercertTrader.Offer | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### offers - -```solidity -function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | --------------------------------- | ----------- | -| offerer | address | undefined | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| unitsAvailable | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| offerType | enum IHypercertTrader.OfferType | undefined | -| status | enum IHypercertTrader.OfferStatus | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### totalUnitsForSale - -```solidity -function totalUnitsForSale(address, uint256) external view returns (uint256) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OfferCancelled - -```solidity -event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| creator `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OfferCreated - -```solidity -event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| offerer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Trade - -```solidity -event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| seller `indexed` | address | undefined | -| buyer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID | uint256 | undefined | -| unitsBought | uint256 | undefined | -| buyToken | address | undefined | -| tokenAmountPerUnit | uint256 | undefined | -| offerID | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -## Errors - -### InvalidBuy - -```solidity -error InvalidBuy(string) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### InvalidOffer - -```solidity -error InvalidOffer(string) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### NotAllowed - -```solidity -error NotAllowed() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md deleted file mode 100644 index 13a84632..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md +++ /dev/null @@ -1,39 +0,0 @@ -# IHypercertMinter - -## Methods - -### ownerOf - -```solidity -function ownerOf(uint256 id) external view returns (address) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 id) external view returns (uint256) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md deleted file mode 100644 index a4086e37..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md +++ /dev/null @@ -1,457 +0,0 @@ -# SemiFungible1155 - -_bitbeckers_ - -> Contract for minting semi-fungible EIP1155 tokens - -Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` - -_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------------------------------- | -| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | -------------------------------------------- | -| \_uri | string | The metadata URI for the specified token ID. | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md deleted file mode 100644 index 6be07157..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md +++ /dev/null @@ -1,77 +0,0 @@ -# AggregatorV3Interface - -## Methods - -### decimals - -```solidity -function decimals() external view returns (uint8) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ----- | ----------- | -| \_0 | uint8 | undefined | - -### description - -```solidity -function description() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### getRoundData - -```solidity -function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -#### Parameters - -| Name | Type | Description | -| --------- | ------ | ----------- | -| \_roundId | uint80 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| roundId | uint80 | undefined | -| answer | int256 | undefined | -| startedAt | uint256 | undefined | -| updatedAt | uint256 | undefined | -| answeredInRound | uint80 | undefined | - -### latestRoundData - -```solidity -function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -#### Returns - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| roundId | uint80 | undefined | -| answer | int256 | undefined | -| startedAt | uint256 | undefined | -| updatedAt | uint256 | undefined | -| answeredInRound | uint80 | undefined | - -### version - -```solidity -function version() external view returns (uint256) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md deleted file mode 100644 index 8d14ad8c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md +++ /dev/null @@ -1 +0,0 @@ -# console diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md deleted file mode 100644 index cb666cd3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md +++ /dev/null @@ -1,3 +0,0 @@ -# console2 - -_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md deleted file mode 100644 index 72455b43..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md +++ /dev/null @@ -1,29 +0,0 @@ -# IAllowlist - -_bitbeckers_ - -> Interface for allowlist - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md deleted file mode 100644 index 30ed6f95..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md +++ /dev/null @@ -1,192 +0,0 @@ -# IHypercertToken - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### batchBurnFraction - -```solidity -function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable -``` - -Operator must be allowed by `creator` and the tokens must represent the total amount of available units. - -_Function to burn the tokens at `tokenIDs` for `account`_ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address account, uint256 tokenID) external nonpayable -``` - -Operator must be allowed by `creator` and the token must represent the total amount of available units. - -_Function to burn the token at `tokenID` for `account`_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address account, uint256[] tokenIDs) external nonpayable -``` - -Tokens that have been merged are burned. - -_Function called to merge tokens within `tokenIDs`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### splitFraction - -```solidity -function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable -``` - -The sum of `values` must equal the current value of `_tokenID`. - -_Function called to split `tokenID` owned by `account` into units declared in `values`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | -| \_values | uint256[] | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string metadata) -``` - -_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------ | ----------- | -| metadata | string | undefined | - -## Events - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md deleted file mode 100644 index 06fb700c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md +++ /dev/null @@ -1,133 +0,0 @@ -# IHypercertTrader - -_bitbeckers_ - -> Interface for hypercert token trading - -This interface declares the required functionality to interact with the hypercert marketplace - -## Methods - -### batchBuyUnits - -```solidity -function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable -``` - -_Buys Hypercert tokens from multiple existing offers in a single transaction._ - -#### Parameters - -| Name | Type | Description | -| ------------------- | --------- | -------------------------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerIDs | uint256[] | The list of IDs of the offers to buy from. | -| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | -| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | -| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | - -### buyUnits - -```solidity -function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable -``` - -_Buys Hypercert tokens from an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | --------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerID | uint256 | The ID of the offer to buy from. | -| unitAmount | uint256 | The number of units to buy. | -| buyToken | address | The address of the token used for payment. | -| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | - -### cancelOffer - -```solidity -function cancelOffer(uint256 offerID) external nonpayable -``` - -_Cancels an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ------------------------------ | -| offerID | uint256 | The ID of the offer to cancel. | - -### createOffer - -```solidity -function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | -------------------------------- | ----------- | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| units | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -## Events - -### OfferCancelled - -```solidity -event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| creator `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OfferCreated - -```solidity -event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| offerer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### Trade - -```solidity -event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| seller `indexed` | address | undefined | -| buyer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID | uint256 | undefined | -| unitsBought | uint256 | undefined | -| buyToken | address | undefined | -| tokenAmountPerUnit | uint256 | undefined | -| offerID | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md deleted file mode 100644 index 93fe0124..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md +++ /dev/null @@ -1,59 +0,0 @@ -# Errors - -_bitbeckers_ - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md deleted file mode 100644 index 4684053c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md +++ /dev/null @@ -1,84 +0,0 @@ -# AllowlistMinter - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -## Events - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -## Errors - -### DoesNotExist - -```solidity -error DoesNotExist() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md deleted file mode 100644 index 518efa42..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md +++ /dev/null @@ -1,895 +0,0 @@ -# HypercertMinter - -_bitbeckers_ - -> Contract for managing hypercert claims and whitelists - -Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. - -_Wrapper contract to expose and chain functions._ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### batchBurnFraction - -```solidity -function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenIDs | uint256[] | undefined | - -### batchMintClaimsFromAllowlists - -```solidity -function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable -``` - -Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - -_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| -------- | ----------- | ----------- | -| account | address | undefined | -| proofs | bytes32[][] | undefined | -| claimIDs | uint256[] | undefined | -| units | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256) external nonpayable -``` - -Burn a claimtoken; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| \_2 | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable -``` - -Batch burn claimtokens; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| \_2 | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address _account, uint256 _tokenID) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | - -### createAllowlist - -```solidity -function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Register a claim and the whitelist for minting token(s) belonging to that claim - -_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| merkleRoot | bytes32 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable -``` - -Merge the value of tokens belonging to the same claim - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------- | --------- | ----------- | -| \_account | address | undefined | -| \_fractionIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint a semi-fungible token for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimFromAllowlist - -```solidity -function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable -``` - -Mint a semi-fungible token representing a fraction of the claim - -_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| units | uint256 | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint semi-fungible tokens for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### name - -```solidity -function name() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### readTransferRestriction - -```solidity -function readTransferRestriction(uint256 tokenID) external view returns (string) -``` - -TRANSFER RESTRICTIONS - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### splitFraction - -```solidity -function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable -``` - -Split a claimtokens value into parts with summed value equal to the original - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| -------------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | -| \_newFractions | uint256[] | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_see { IHypercertMetadata}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | ----------- | -| \_uri | string | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md deleted file mode 100644 index a4086e37..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md +++ /dev/null @@ -1,457 +0,0 @@ -# SemiFungible1155 - -_bitbeckers_ - -> Contract for minting semi-fungible EIP1155 tokens - -Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` - -_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------------------------------- | -| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | -------------------------------------------- | -| \_uri | string | The metadata URI for the specified token ID. | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md deleted file mode 100644 index 72455b43..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md +++ /dev/null @@ -1,29 +0,0 @@ -# IAllowlist - -_bitbeckers_ - -> Interface for allowlist - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md deleted file mode 100644 index 30ed6f95..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md +++ /dev/null @@ -1,192 +0,0 @@ -# IHypercertToken - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### batchBurnFraction - -```solidity -function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable -``` - -Operator must be allowed by `creator` and the tokens must represent the total amount of available units. - -_Function to burn the tokens at `tokenIDs` for `account`_ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address account, uint256 tokenID) external nonpayable -``` - -Operator must be allowed by `creator` and the token must represent the total amount of available units. - -_Function to burn the token at `tokenID` for `account`_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address account, uint256[] tokenIDs) external nonpayable -``` - -Tokens that have been merged are burned. - -_Function called to merge tokens within `tokenIDs`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### splitFraction - -```solidity -function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable -``` - -The sum of `values` must equal the current value of `_tokenID`. - -_Function called to split `tokenID` owned by `account` into units declared in `values`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | -| \_values | uint256[] | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string metadata) -``` - -_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------ | ----------- | -| metadata | string | undefined | - -## Events - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md deleted file mode 100644 index 93fe0124..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md +++ /dev/null @@ -1,59 +0,0 @@ -# Errors - -_bitbeckers_ - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll deleted file mode 100644 index e2ac6616..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md deleted file mode 100644 index 89f2105f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError - -# Class: ClientError - -An error that is caused by a problem with the client. - -## Hierarchy - -- `Error` - - ↳ **`ClientError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](ClientError.md#constructor) - -### Properties - -- [payload](ClientError.md#payload) - -## Constructors - -### constructor - -• **new ClientError**(`message`, `payload?`) - -Creates a new instance of the ClientError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md deleted file mode 100644 index 03813867..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md +++ /dev/null @@ -1,66 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError - -# Class: ConfigurationError - -The configuration was invalid - -## Hierarchy - -- `Error` - - ↳ **`ConfigurationError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](ConfigurationError.md#constructor) - -### Properties - -- [payload](ConfigurationError.md#payload) - -## Constructors - -### constructor - -• **new ConfigurationError**(`message`, `payload?`) - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `message` | `string` | -| `payload?` | `Object` | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md deleted file mode 100644 index d4c9f7c9..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError - -# Class: FetchError - -Fails fetching a remote resource - -## Hierarchy - -- `Error` - - ↳ **`FetchError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](FetchError.md#constructor) - -### Properties - -- [payload](FetchError.md#payload) - -## Constructors - -### constructor - -• **new FetchError**(`message`, `payload?`) - -Creates a new instance of the FetchError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md deleted file mode 100644 index a5a0e900..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md +++ /dev/null @@ -1,493 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient - -# Class: HypercertClient - -Hypercerts client factory - -**`Dev`** - -Creates a Hypercerts client instance - -**`Notice`** - -The client is readonly if no signer is set or if the contract address is not set - -**`Param`** - -Hypercerts client configuration - -**`Param`** - -Hypercerts storage object - -## Implements - -- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) - -## Table of contents - -### Constructors - -- [constructor](HypercertClient.md#constructor) - -### Properties - -- [\_config](HypercertClient.md#_config) -- [\_contract](HypercertClient.md#_contract) -- [\_evaluator](HypercertClient.md#_evaluator) -- [\_indexer](HypercertClient.md#_indexer) -- [\_operator](HypercertClient.md#_operator) -- [\_storage](HypercertClient.md#_storage) -- [readonly](HypercertClient.md#readonly) - -### Accessors - -- [contract](HypercertClient.md#contract) -- [indexer](HypercertClient.md#indexer) -- [storage](HypercertClient.md#storage) - -### Methods - -- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClient.md#burnclaimfraction) -- [checkWritable](HypercertClient.md#checkwritable) -- [createAllowlist](HypercertClient.md#createallowlist) -- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) -- [mintClaim](HypercertClient.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClient.md#splitclaimunits) - -## Constructors - -### constructor - -• **new HypercertClient**(`config?`) - -Creates a new instance of the `HypercertClient` class. - -#### Parameters - -| Name | Type | Description | -| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | - -#### Defined in - -[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) - -## Properties - -### \_config - -• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) - -#### Defined in - -[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) - ---- - -### \_contract - -• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -#### Defined in - -[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) - ---- - -### \_evaluator - -• `Private` **\_evaluator**: [`default`](internal.default.md) - -#### Defined in - -[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) - ---- - -### \_indexer - -• `Private` **\_indexer**: [`default`](internal.default-1.md) - -#### Defined in - -[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) - ---- - -### \_operator - -• `Private` **\_operator**: `Provider` \| `Signer` - -#### Defined in - -[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) - ---- - -### \_storage - -• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) - -#### Defined in - -[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) - -#### Defined in - -[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) - -## Accessors - -### contract - -• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -Gets the HypercertMinter contract used by the client. - -#### Returns - -[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -The contract. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) - -#### Defined in - -[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) - ---- - -### indexer - -• `get` **indexer**(): [`default`](internal.default-1.md) - -Gets the indexer for the client. - -#### Returns - -[`default`](internal.default-1.md) - -The indexer. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) - -#### Defined in - -[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) - ---- - -### storage - -• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) - -Gets the storage layer for the client. - -#### Returns - -[`HypercertsStorage`](HypercertsStorage.md) - -The storage layer. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) - -#### Defined in - -[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) - -## Methods - -### batchMintClaimFractionsFromAllowlists - -▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | -| `roots?` | `BytesLike`[] | - | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Implementation of - -HypercertClientInterface.batchMintClaimFractionsFromAllowlists - -#### Defined in - -[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) - ---- - -### burnClaimFraction - -▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> - -Burn a Hypercert claim by providing the claim id - -**`Dev`** - -Burns a Hypercert claim - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------- | :----------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.burnClaimFraction - -#### Defined in - -[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) - ---- - -### checkWritable - -▸ `Private` **checkWritable**(): `boolean` - -#### Returns - -`boolean` - -#### Defined in - -[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) - ---- - -### createAllowlist - -▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> - -Create a Hypercert claim with an allowlist - -**`Dev`** - -Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist - -**`Notice`** - -The total number of units in the allowlist must match the total number of units for the Hypercert - -#### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.createAllowlist - -#### Defined in - -[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) - ---- - -### mergeClaimUnits - -▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> - -Merge multiple Hypercert claims fractions into one - -**`Dev`** - -Merges multiple Hypercert claims into one - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :------------------ | -| `claimIds` | `BigNumberish`[] | Hypercert claim ids | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mergeClaimUnits - -#### Defined in - -[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) - ---- - -### mintClaim - -▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> - -Mint a Hypercert claim - -**`Dev`** - -Mints a Hypercert claim with the given metadata, total units and transfer restrictions - -#### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mintClaim - -#### Defined in - -[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) - ---- - -### mintClaimFractionFromAllowlist - -▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> - -Mint a Hypercert claim fraction from an allowlist. - -**`Dev`** - -Verifies the claim proof and mints the claim fraction - -**`Notice`** - -If known, provide the root for client side verification - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------- | :------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `units` | `BigNumberish` | Number of units to mint | -| `proof` | `BytesLike`[] | Merkle proof for the claim | -| `root?` | `BytesLike` | - | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mintClaimFractionFromAllowlist - -#### Defined in - -[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) - ---- - -### splitClaimUnits - -▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> - -Split a Hypercert's unit into multiple claims with the given fractions - -**`Dev`** - -Submit the ID of the claim to split and new fraction values. - -**`Notice`** - -The sum of the fractions must be equal to the total units of the claim - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.splitClaimUnits - -#### Defined in - -[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md deleted file mode 100644 index 706c14fe..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md +++ /dev/null @@ -1,250 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage - -# Class: HypercertsStorage - -A class that provides storage functionality for Hypercerts. - -## Implements - -- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) - -## Table of contents - -### Constructors - -- [constructor](HypercertsStorage.md#constructor) - -### Properties - -- [nftStorageClient](HypercertsStorage.md#nftstorageclient) -- [readonly](HypercertsStorage.md#readonly) -- [web3StorageClient](HypercertsStorage.md#web3storageclient) - -### Methods - -- [getData](HypercertsStorage.md#getdata) -- [getMetadata](HypercertsStorage.md#getmetadata) -- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) -- [storeData](HypercertsStorage.md#storedata) -- [storeMetadata](HypercertsStorage.md#storemetadata) - -## Constructors - -### constructor - -• **new HypercertsStorage**(`overrides`) - -Creates a new instance of the `HypercertsStorage` class. - -#### Parameters - -| Name | Type | Description | -| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | -| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | - -#### Defined in - -[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) - -## Properties - -### nftStorageClient - -• `Optional` **nftStorageClient**: `NFTStorage` - -The NFT storage client. - -#### Defined in - -[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -Whether the storage is read-only. - -#### Defined in - -[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) - ---- - -### web3StorageClient - -• `Optional` **web3StorageClient**: `any` - -The Web3 storage client. - -#### Defined in - -[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) - -## Methods - -### getData - -▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> - -Gets arbitrary data from Web3 storage. - -**`Throws`** - -A `StorageError` if the storage client is not configured or the data cannot be retrieved. - -#### Parameters - -| Name | Type | Description | -| :------------- | :------- | :-------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | - -#### Returns - -`Promise`<`any`\> - -A Promise that resolves to the data. - -#### Implementation of - -HypercertStorageInterface.getData - -#### Defined in - -[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) - ---- - -### getMetadata - -▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> - -Gets metadata for a Hypercert. - -**`Throws`** - -A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. - -**`Throws`** - -A `MalformedDataError` if the metadata is invalid. E.g. unknown schema - -#### Parameters - -| Name | Type | Description | -| :------------- | :------- | :------------------------------------------ | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | - -#### Returns - -`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> - -A Promise that resolves to the metadata. - -#### Implementation of - -HypercertStorageInterface.getMetadata - -#### Defined in - -[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) - ---- - -### getNftStorageGatewayUri - -▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` - -#### Parameters - -| Name | Type | -| :------------- | :------- | -| `cidOrIpfsUri` | `string` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) - ---- - -### storeData - -▸ **storeData**(`data`): `Promise`<`CIDString`\> - -Stores arbitrary data in Web3 storage. - -**`Throws`** - -A `StorageError` if the storage client is not configured. - -**`Notice`** - -Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. -Because we pay for storage quotas, this data is stored best effort. -If you are using our default keys, we may delete older data if we hit our storage quota. - -#### Parameters - -| Name | Type | Description | -| :----- | :-------- | :----------------- | -| `data` | `unknown` | The data to store. | - -#### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored data. - -#### Implementation of - -HypercertStorageInterface.storeData - -#### Defined in - -[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) - ---- - -### storeMetadata - -▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> - -Stores metadata for a Hypercert. - -**`Throws`** - -A `StorageError` if the storage client is not configured. - -**`Throws`** - -A `MalformedDataError` if the metadata is invalid. - -**`Notice`** - -Because we pay for storage quotas, this data is stored best effort. -If you are using our default keys, we may delete older data if we hit our storage quota. - -#### Parameters - -| Name | Type | Description | -| :----- | :-------------------------------------------------------- | :--------------------- | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | - -#### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored metadata. - -#### Implementation of - -HypercertStorageInterface.storeMetadata - -#### Defined in - -[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md deleted file mode 100644 index d12c0653..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError - -# Class: InvalidOrMissingError - -The provided value was undefined or empty - -## Hierarchy - -- `Error` - - ↳ **`InvalidOrMissingError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](InvalidOrMissingError.md#constructor) - -### Properties - -- [payload](InvalidOrMissingError.md#payload) - -## Constructors - -### constructor - -• **new InvalidOrMissingError**(`message`, `payload?`) - -Creates a new instance of the InvalidOrMissingError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md deleted file mode 100644 index 028129d8..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError - -# Class: MalformedDataError - -Data doesn't conform to expectations - -## Hierarchy - -- `Error` - - ↳ **`MalformedDataError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](MalformedDataError.md#constructor) - -### Properties - -- [payload](MalformedDataError.md#payload) - -## Constructors - -### constructor - -• **new MalformedDataError**(`message`, `payload?`) - -Creates a new instance of the MalformedDataError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md deleted file mode 100644 index de284494..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError - -# Class: MintingError - -Minting transaction failed - -## Hierarchy - -- `Error` - - ↳ **`MintingError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](MintingError.md#constructor) - -### Properties - -- [payload](MintingError.md#payload) - -## Constructors - -### constructor - -• **new MintingError**(`message`, `payload?`) - -Creates a new instance of the MintingError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md deleted file mode 100644 index 0dcf0291..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError - -# Class: StorageError - -Fails storing to a remote resource - -## Hierarchy - -- `Error` - - ↳ **`StorageError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](StorageError.md#constructor) - -### Properties - -- [payload](StorageError.md#payload) - -## Constructors - -### constructor - -• **new StorageError**(`message`, `payload?`) - -Creates a new instance of the StorageError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md deleted file mode 100644 index 5fdb25e0..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md +++ /dev/null @@ -1,71 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError - -# Class: UnknownSchemaError - -Schema could not be loaded - -## Hierarchy - -- `Error` - - ↳ **`UnknownSchemaError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](UnknownSchemaError.md#constructor) - -### Properties - -- [payload](UnknownSchemaError.md#payload) - -## Constructors - -### constructor - -• **new UnknownSchemaError**(`message`, `payload?`) - -Creates a new instance of the UnknownSchemaError class. - -#### Parameters - -| Name | Type | Description | -| :------------------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | -| `payload.schemaName` | `string` | - | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Type declaration - -| Name | Type | -| :----------- | :------- | -| `schemaName` | `string` | - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md deleted file mode 100644 index 0964b138..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md +++ /dev/null @@ -1,72 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError - -# Class: UnsupportedChainError - -This blockchain is not yet supported -Please file an issue - -## Hierarchy - -- `Error` - - ↳ **`UnsupportedChainError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](UnsupportedChainError.md#constructor) - -### Properties - -- [payload](UnsupportedChainError.md#payload) - -## Constructors - -### constructor - -• **new UnsupportedChainError**(`message`, `payload?`) - -Creates a new instance of the UnsupportedChainError class. - -#### Parameters - -| Name | Type | Description | -| :---------------- | :---------------------------------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | -| `payload.chainID` | `undefined` \| `string` \| `number` | - | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Type declaration - -| Name | Type | -| :-------- | :---------------------------------- | -| `chainID` | `undefined` \| `string` \| `number` | - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md deleted file mode 100644 index 1b94a629..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md +++ /dev/null @@ -1,278 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -A class that provides indexing functionality for Hypercerts. - -## Implements - -- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default-1.md#constructor) - -### Properties - -- [\_graphClient](internal.default-1.md#_graphclient) - -### Accessors - -- [graphClient](internal.default-1.md#graphclient) - -### Methods - -- [claimById](internal.default-1.md#claimbyid) -- [claimsByOwner](internal.default-1.md#claimsbyowner) -- [firstClaims](internal.default-1.md#firstclaims) -- [fractionById](internal.default-1.md#fractionbyid) -- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) -- [fractionsByOwner](internal.default-1.md#fractionsbyowner) - -## Constructors - -### constructor - -• **new default**(`options`) - -Creates a new instance of the `HypercertIndexer` class. - -#### Parameters - -| Name | Type | Description | -| :------------------ | :------- | :----------------------------------------- | -| `options` | `Object` | The configuration options for the indexer. | -| `options.graphUrl?` | `string` | - | - -#### Defined in - -[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) - -## Properties - -### \_graphClient - -• `Private` **\_graphClient**: `Object` - -The Graph client used by the indexer. - -#### Type declaration - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Defined in - -[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) - -## Accessors - -### graphClient - -• `get` **graphClient**(): `Object` - -Gets the Graph client used by the indexer. - -#### Returns - -`Object` - -The Graph client. - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Implementation of - -[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) - -#### Defined in - -[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) - -## Methods - -### claimById - -▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -Gets a claim by its ID. - -#### Parameters - -| Name | Type | Description | -| :--- | :------- | :------------------- | -| `id` | `string` | The ID of the claim. | - -#### Returns - -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -A Promise that resolves to the claim. - -#### Implementation of - -HypercertIndexerInterface.claimById - -#### Defined in - -[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) - ---- - -### claimsByOwner - -▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -Gets the claims owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.claimsByOwner - -#### Defined in - -[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) - ---- - -### firstClaims - -▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -Gets the most recent claims. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :-------------------- | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.firstClaims - -#### Defined in - -[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) - ---- - -### fractionById - -▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -Gets a claim token by its ID. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------- | :------------------------- | -| `fractionId` | `string` | The ID of the claim token. | - -#### Returns - -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -A Promise that resolves to the claim token. - -#### Implementation of - -HypercertIndexerInterface.fractionById - -#### Defined in - -[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) - ---- - -### fractionsByClaim - -▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -Gets the claim tokens for a given claim. - -#### Parameters - -| Name | Type | Default value | Description | -| :-------- | :----------------------------------------- | :------------------- | :-------------------- | -| `claimId` | `string` | `undefined` | The ID of the claim. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByClaim - -#### Defined in - -[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) - ---- - -### fractionsByOwner - -▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -Gets the claim tokens owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByOwner - -#### Defined in - -[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md deleted file mode 100644 index 1538ce61..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md +++ /dev/null @@ -1,131 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -The EasEvaluator class provides methods for signing off-chain attestations of evaluations. -Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. - -## Table of contents - -### Constructors - -- [constructor](internal.default-2.md#constructor) - -### Properties - -- [offChain](internal.default-2.md#offchain) -- [readonly](internal.default-2.md#readonly) -- [signer](internal.default-2.md#signer) - -### Methods - -- [getSignature](internal.default-2.md#getsignature) -- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) - -## Constructors - -### constructor - -• **new default**(`config`) - -Creates a new EasEvaluator instance. - -#### Parameters - -| Name | Type | Description | -| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | - -#### Defined in - -[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) - -## Properties - -### offChain - -• **offChain**: `Offchain` - -The Offchain instance used for signing off-chain attestations. - -#### Defined in - -[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -The TypedDataSigner instance used for signing typed data. - -#### Defined in - -[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) - -## Methods - -### getSignature - -▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> - -Gets a signature for an off-chain attestation. - -#### Parameters - -| Name | Type | Description | -| :------------ | :------- | :------------------------------------------------ | -| `encodedData` | `string` | The encoded data to sign. | -| `recipient` | `string` | The address of the recipient of the attestation. | -| `schemaUid` | `string` | The UID of the schema to use for the attestation. | - -#### Returns - -`Promise`<`SignedOffchainAttestation`\> - -- The signature for the attestation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) - ---- - -### signOfflineEvaluation - -▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> - -Signs an offline evaluation. - -**`Throws`** - -- If the evaluation data is malformed. - -#### Parameters - -| Name | Type | Description | -| :----------- | :----------------------------------------------- | :--------------------------- | -| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | - -#### Returns - -`Promise`<`undefined` \| `SignedOffchainAttestation`\> - -- The signature for the evaluation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md deleted file mode 100644 index 86daa5e4..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md +++ /dev/null @@ -1,110 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -## Implements - -- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default.md#constructor) - -### Properties - -- [eas](internal.default.md#eas) -- [readonly](internal.default.md#readonly) -- [signer](internal.default.md#signer) -- [storage](internal.default.md#storage) - -### Methods - -- [submitEvaluation](internal.default.md#submitevaluation) - -## Constructors - -### constructor - -• **new default**(`config?`) - -#### Parameters - -| Name | Type | -| :------- | :------------------------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | - -#### Defined in - -[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) - -## Properties - -### eas - -• **eas**: [`default`](internal.default-2.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -#### Defined in - -[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) - ---- - -### storage - -• **storage**: [`HypercertsStorage`](HypercertsStorage.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) - -## Methods - -### submitEvaluation - -▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------------------------------------------------------------------ | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | - -#### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Implementation of - -EvaluatorInterface.submitEvaluation - -#### Defined in - -[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md deleted file mode 100644 index b4af6279..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md +++ /dev/null @@ -1,39 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError - -# Interface: CustomError - -An interface for errors that have a specific type. - -## Implemented by - -- [`ClientError`](../classes/ClientError.md) -- [`ConfigurationError`](../classes/ConfigurationError.md) -- [`FetchError`](../classes/FetchError.md) -- [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) -- [`MalformedDataError`](../classes/MalformedDataError.md) -- [`MintingError`](../classes/MintingError.md) -- [`StorageError`](../classes/StorageError.md) -- [`UnknownSchemaError`](../classes/UnknownSchemaError.md) -- [`UnsupportedChainError`](../classes/UnsupportedChainError.md) - -## Table of contents - -### Properties - -- [payload](CustomError.md#payload) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Defined in - -[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md deleted file mode 100644 index 4606b46e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md +++ /dev/null @@ -1,56 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation - -# Interface: DuplicateEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) -- [explanation](DuplicateEvaluation.md#explanation) -- [realHypercert](DuplicateEvaluation.md#realhypercert) -- [type](DuplicateEvaluation.md#type) - -## Properties - -### duplicateHypercerts - -• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] - -#### Defined in - -[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) - ---- - -### explanation - -• **explanation**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) - ---- - -### realHypercert - -• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) - ---- - -### type - -• **type**: `"duplicate"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md deleted file mode 100644 index 205b7004..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md +++ /dev/null @@ -1,56 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation - -# Interface: EASEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [chainId](EASEvaluation.md#chainid) -- [contract](EASEvaluation.md#contract) -- [type](EASEvaluation.md#type) -- [uid](EASEvaluation.md#uid) - -## Properties - -### chainId - -• **chainId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) - ---- - -### contract - -• **contract**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) - ---- - -### type - -• **type**: `"EAS"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) - ---- - -### uid - -• **uid**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md deleted file mode 100644 index 0483b520..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md +++ /dev/null @@ -1,341 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface - -# Interface: HypercertClientInterface - -The interface for the Hypercert client. - -## Hierarchy - -- [`HypercertClientMethods`](HypercertClientMethods.md) - -- [`HypercertClientState`](HypercertClientState.md) - - ↳ **`HypercertClientInterface`** - -## Implemented by - -- [`HypercertClient`](../classes/HypercertClient.md) - -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) -- [contract](HypercertClientInterface.md#contract) -- [createAllowlist](HypercertClientInterface.md#createallowlist) -- [indexer](HypercertClientInterface.md#indexer) -- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) -- [mintClaim](HypercertClientInterface.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) -- [readonly](HypercertClientInterface.md#readonly) -- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) -- [storage](HypercertClientInterface.md#storage) - -## Properties - -### batchMintClaimFractionsFromAllowlists - -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) - -#### Defined in - -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) - ---- - -### burnClaimFraction - -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`): `Promise`<`ContractTransaction`\> - -Burns a claim fraction. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) - -#### Defined in - -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) - ---- - -### contract - -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) - -#### Defined in - -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) - ---- - -### createAllowlist - -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Creates a new allowlist and mints a new claim with the allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) - -#### Defined in - -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) - ---- - -### indexer - -• **indexer**: [`default`](../classes/internal.default-1.md) - -The indexer used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) - -#### Defined in - -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) - ---- - -### mergeClaimUnits - -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`): `Promise`<`ContractTransaction`\> - -Merges multiple claim fractions into a single claim. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) - -#### Defined in - -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) - ---- - -### mintClaim - -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Mints a new claim. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) - -#### Defined in - -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) - ---- - -### mintClaimFractionFromAllowlist - -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> - -Mints a claim fraction from an allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) - -#### Defined in - -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) - -#### Defined in - -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) - ---- - -### splitClaimUnits - -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> - -Splits a claim into multiple fractions. - -##### Parameters - -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) - -#### Defined in - -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) - ---- - -### storage - -• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) - -The storage layer used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) - -#### Defined in - -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md deleted file mode 100644 index 734ccbee..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md +++ /dev/null @@ -1,239 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods - -# Interface: HypercertClientMethods - -The methods for the Hypercert client. - -## Hierarchy - -- **`HypercertClientMethods`** - - ↳ [`HypercertClientInterface`](HypercertClientInterface.md) - -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) -- [createAllowlist](HypercertClientMethods.md#createallowlist) -- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) -- [mintClaim](HypercertClientMethods.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) - -## Properties - -### batchMintClaimFractionsFromAllowlists - -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) - ---- - -### burnClaimFraction - -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`): `Promise`<`ContractTransaction`\> - -Burns a claim fraction. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) - ---- - -### createAllowlist - -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Creates a new allowlist and mints a new claim with the allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) - ---- - -### mergeClaimUnits - -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`): `Promise`<`ContractTransaction`\> - -Merges multiple claim fractions into a single claim. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) - ---- - -### mintClaim - -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Mints a new claim. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) - ---- - -### mintClaimFractionFromAllowlist - -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> - -Mints a claim fraction from an allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) - ---- - -### splitClaimUnits - -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> - -Splits a claim into multiple fractions. - -##### Parameters - -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md deleted file mode 100644 index 2d90a599..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState - -# Interface: HypercertClientState - -The state of the Hypercert client. - -## Hierarchy - -- **`HypercertClientState`** - - ↳ [`HypercertClientInterface`](HypercertClientInterface.md) - -## Table of contents - -### Properties - -- [contract](HypercertClientState.md#contract) -- [indexer](HypercertClientState.md#indexer) -- [readonly](HypercertClientState.md#readonly) -- [storage](HypercertClientState.md#storage) - -## Properties - -### contract - -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. - -#### Defined in - -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) - ---- - -### indexer - -• **indexer**: [`default`](../classes/internal.default-1.md) - -The indexer used by the client. - -#### Defined in - -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Defined in - -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) - ---- - -### storage - -• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) - -The storage layer used by the client. - -#### Defined in - -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md deleted file mode 100644 index 6ebed93a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md +++ /dev/null @@ -1,47 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema - -# Interface: HypercertEvaluationSchema - -Schema for evaluating Hypercerts across different sources and evaluation types - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [creator](HypercertEvaluationSchema.md#creator) -- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) -- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) - -## Properties - -### creator - -• **creator**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) - ---- - -### evaluationData - -• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) - ---- - -### evaluationSource - -• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md deleted file mode 100644 index f18c409f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md +++ /dev/null @@ -1,176 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface - -# Interface: HypercertIndexerInterface - -## Implemented by - -- [`default`](../classes/internal.default-1.md) - -## Table of contents - -### Properties - -- [claimById](HypercertIndexerInterface.md#claimbyid) -- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) -- [firstClaims](HypercertIndexerInterface.md#firstclaims) -- [fractionById](HypercertIndexerInterface.md#fractionbyid) -- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) -- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) -- [graphClient](HypercertIndexerInterface.md#graphclient) - -## Properties - -### claimById - -• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -#### Type declaration - -▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -##### Parameters - -| Name | Type | -| :--- | :------- | -| `id` | `string` | - -##### Returns - -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) - ---- - -### claimsByOwner - -• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -#### Type declaration - -▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `owner` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) - ---- - -### firstClaims - -• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -#### Type declaration - -▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) - ---- - -### fractionById - -• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -#### Type declaration - -▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -##### Parameters - -| Name | Type | -| :----------- | :------- | -| `fractionId` | `string` | - -##### Returns - -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) - ---- - -### fractionsByClaim - -• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -#### Type declaration - -▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `claimId` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) - ---- - -### fractionsByOwner - -• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -#### Type declaration - -▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `owner` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) - ---- - -### graphClient - -• **graphClient**: `any` - -#### Defined in - -[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md deleted file mode 100644 index d65362f3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md +++ /dev/null @@ -1,123 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata - -# Interface: HypercertMetadata - -Claim data for hypercert. ERC1155 Metadata compliant - -## Table of contents - -### Properties - -- [allowList](HypercertMetadata.md#allowlist) -- [description](HypercertMetadata.md#description) -- [external_url](HypercertMetadata.md#external_url) -- [hypercert](HypercertMetadata.md#hypercert) -- [image](HypercertMetadata.md#image) -- [name](HypercertMetadata.md#name) -- [properties](HypercertMetadata.md#properties) -- [ref](HypercertMetadata.md#ref) -- [version](HypercertMetadata.md#version) - -## Properties - -### allowList - -• `Optional` **allowList**: `string` - -A CID pointer to the merke tree proof json on ipfs - -#### Defined in - -[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) - ---- - -### description - -• **description**: `string` - -Describes the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) - ---- - -### external_url - -• `Optional` **external_url**: `string` - -An url pointing to the external website of the project - -#### Defined in - -[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) - ---- - -### hypercert - -• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) - -#### Defined in - -[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) - ---- - -### image - -• **image**: `string` - -A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. - -#### Defined in - -[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) - ---- - -### name - -• **name**: `string` - -Identifies the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) - ---- - -### properties - -• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] - -#### Defined in - -[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) - ---- - -### ref - -• `Optional` **ref**: `string` - -Describes the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) - ---- - -### version - -• `Optional` **version**: `string` - -The version of Hypercert schema used to describe this hypercert - -#### Defined in - -[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md deleted file mode 100644 index 773c41d3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md +++ /dev/null @@ -1,45 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer - -# Interface: HypercertPointer - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [chainId](HypercertPointer.md#chainid) -- [claimId](HypercertPointer.md#claimid) -- [contract](HypercertPointer.md#contract) - -## Properties - -### chainId - -• **chainId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) - ---- - -### claimId - -• **claimId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) - ---- - -### contract - -• **contract**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md deleted file mode 100644 index 8ffda51e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md +++ /dev/null @@ -1,130 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface - -# Interface: HypercertStorageInterface - -The interface for the Hypercert storage layer. - -## Implemented by - -- [`HypercertsStorage`](../classes/HypercertsStorage.md) - -## Table of contents - -### Properties - -- [getData](HypercertStorageInterface.md#getdata) -- [getMetadata](HypercertStorageInterface.md#getmetadata) -- [storeData](HypercertStorageInterface.md#storedata) -- [storeMetadata](HypercertStorageInterface.md#storemetadata) - -## Properties - -### getData - -• **getData**: (`cidOrIpfsUri`: `string`) => `Promise`<`unknown`\> - -#### Type declaration - -▸ (`cidOrIpfsUri`): `Promise`<`unknown`\> - -Retrieves arbitrary data from IPFS. - -##### Parameters - -| Name | Type | Description | -| :------------- | :------- | :------------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | - -##### Returns - -`Promise`<`unknown`\> - -A Promise that resolves to the retrieved data. - -#### Defined in - -[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) - ---- - -### getMetadata - -• **getMetadata**: (`cidOrIpfsUri`: `string`) => `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -#### Type declaration - -▸ (`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -Retrieves the metadata for a Hypercert evaluation. - -##### Parameters - -| Name | Type | Description | -| :------------- | :------- | :----------------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | - -##### Returns - -`Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -A Promise that resolves to the retrieved metadata. - -#### Defined in - -[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) - ---- - -### storeData - -• **storeData**: (`data`: `unknown`) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`data`): `Promise`<`CIDString`\> - -Stores arbitrary data on IPFS. - -##### Parameters - -| Name | Type | Description | -| :----- | :-------- | :----------------- | -| `data` | `unknown` | The data to store. | - -##### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored data. - -#### Defined in - -[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) - ---- - -### storeMetadata - -• **storeMetadata**: (`metadata`: [`HypercertMetadata`](HypercertMetadata.md)) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`metadata`): `Promise`<`CIDString`\> - -Stores the metadata for a Hypercert evaluation. - -##### Parameters - -| Name | Type | Description | -| :--------- | :------------------------------------------ | :--------------------- | -| `metadata` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata to store. | - -##### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored metadata. - -#### Defined in - -[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md deleted file mode 100644 index 5f5871f2..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md +++ /dev/null @@ -1,34 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation - -# Interface: IPFSEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [cid](IPFSEvaluation.md#cid) -- [type](IPFSEvaluation.md#type) - -## Properties - -### cid - -• **cid**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) - ---- - -### type - -• **type**: `"IPFS"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md deleted file mode 100644 index 3e4b3b92..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md +++ /dev/null @@ -1,45 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation - -# Interface: SimpleTextEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [hypercert](SimpleTextEvaluation.md#hypercert) -- [text](SimpleTextEvaluation.md#text) -- [type](SimpleTextEvaluation.md#type) - -## Properties - -### hypercert - -• **hypercert**: [`HypercertPointer`](HypercertPointer.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) - ---- - -### text - -• **text**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) - ---- - -### type - -• **type**: `"simpleText"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md deleted file mode 100644 index 53ac36ed..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md +++ /dev/null @@ -1,43 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface - -# Interface: EvaluatorInterface - -[internal](../modules/internal.md).EvaluatorInterface - -## Implemented by - -- [`default`](../classes/internal.default.md) - -## Table of contents - -### Properties - -- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) - -## Properties - -### submitEvaluation - -• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -##### Parameters - -| Name | Type | Description | -| :----------- | :---------------------------------------------------------- | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | - -##### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Defined in - -[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md deleted file mode 100644 index 273912bc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md +++ /dev/null @@ -1,169 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata - -# Interface: HypercertClaimdata - -[internal](../modules/internal.md).HypercertClaimdata - -Properties of an impact claim - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [contributors](internal.HypercertClaimdata.md#contributors) -- [impact_scope](internal.HypercertClaimdata.md#impact_scope) -- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) -- [rights](internal.HypercertClaimdata.md#rights) -- [work_scope](internal.HypercertClaimdata.md#work_scope) -- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) - -## Properties - -### contributors - -• **contributors**: `Object` - -Contributors - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) - ---- - -### impact_scope - -• **impact_scope**: `Object` - -Scopes of impact - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) - ---- - -### impact_timeframe - -• **impact_timeframe**: `Object` - -Impact time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) - ---- - -### rights - -• `Optional` **rights**: `Object` - -Rights - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) - ---- - -### work_scope - -• **work_scope**: `Object` - -Scopes of work - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) - ---- - -### work_timeframe - -• **work_timeframe**: `Object` - -Work time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md deleted file mode 100644 index 3f4ea346..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md +++ /dev/null @@ -1,17 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter - -# Interface: HypercertMinter - -[internal](../modules/internal.md).HypercertMinter - -Hypercert contract interface. - -**`Notice`** - -hacky loop to get typedoc to generate all the docs - -## Hierarchy - -- `HypercertMinter` - - ↳ **`HypercertMinter`** diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md deleted file mode 100644 index 15998930..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md +++ /dev/null @@ -1,638 +0,0 @@ -[Hypercerts SDK Documentation](README.md) / Exports - -# Hypercerts SDK Documentation - -## Table of contents - -### References - -- [Claim](modules.md#claim) -- [ClaimToken](modules.md#claimtoken) -- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) - -### Modules - -- [internal](modules/internal.md) - -### Classes - -- [ClientError](classes/ClientError.md) -- [ConfigurationError](classes/ConfigurationError.md) -- [FetchError](classes/FetchError.md) -- [HypercertClient](classes/HypercertClient.md) -- [HypercertsStorage](classes/HypercertsStorage.md) -- [InvalidOrMissingError](classes/InvalidOrMissingError.md) -- [MalformedDataError](classes/MalformedDataError.md) -- [MintingError](classes/MintingError.md) -- [StorageError](classes/StorageError.md) -- [UnknownSchemaError](classes/UnknownSchemaError.md) -- [UnsupportedChainError](classes/UnsupportedChainError.md) - -### Interfaces - -- [CustomError](interfaces/CustomError.md) -- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) -- [EASEvaluation](interfaces/EASEvaluation.md) -- [HypercertClaimdata](interfaces/HypercertClaimdata.md) -- [HypercertClientInterface](interfaces/HypercertClientInterface.md) -- [HypercertClientMethods](interfaces/HypercertClientMethods.md) -- [HypercertClientState](interfaces/HypercertClientState.md) -- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) -- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) -- [HypercertMetadata](interfaces/HypercertMetadata.md) -- [HypercertPointer](interfaces/HypercertPointer.md) -- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) -- [IPFSEvaluation](interfaces/IPFSEvaluation.md) -- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) - -### Type Aliases - -- [AllowlistEntry](modules.md#allowlistentry) -- [Deployment](modules.md#deployment) -- [EvaluationData](modules.md#evaluationdata) -- [EvaluationSource](modules.md#evaluationsource) -- [HypercertClientConfig](modules.md#hypercertclientconfig) -- [HypercertClientProps](modules.md#hypercertclientprops) -- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) -- [HypercertStorageConfig](modules.md#hypercertstorageconfig) -- [HypercertsSdkError](modules.md#hypercertssdkerror) -- [QueryParams](modules.md#queryparams) -- [SupportedChainIds](modules.md#supportedchainids) -- [TransferRestrictions](modules.md#transferrestrictions) - -### Properties - -- [ClaimByIdQuery](modules.md#claimbyidquery) - -### Variables - -- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) -- [TransferRestrictions](modules.md#transferrestrictions-1) - -### Functions - -- [execute](modules.md#execute) -- [formatDate](modules.md#formatdate) -- [formatHypercertData](modules.md#formathypercertdata) -- [formatUnixTime](modules.md#formatunixtime) -- [validateAllowlist](modules.md#validateallowlist) -- [validateClaimData](modules.md#validateclaimdata) -- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) -- [validateMetaData](modules.md#validatemetadata) -- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) -- [verifyMerkleProof](modules.md#verifymerkleproof) -- [verifyMerkleProofs](modules.md#verifymerkleproofs) - -## References - -### Claim - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimToken - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimTokensByClaimQuery - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - -## Type Aliases - -### AllowlistEntry - -Ƭ **AllowlistEntry**: `Object` - -Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol - -**`Param`** - -Address of the recipient - -**`Param`** - -Number of units allocated to the recipient - -#### Type declaration - -| Name | Type | -| :-------- | :------------- | -| `address` | `string` | -| `units` | `BigNumberish` | - -#### Defined in - -[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) - ---- - -### Deployment - -Ƭ **Deployment**: `Object` - -Represents a deployment of a contract on a specific network. - -#### Type declaration - -| Name | Type | Description | -| :---------------- | :------- | :--------------------------------------------------------------------------------------- | -| `chainId` | `number` | The ID of the network on which the contract is deployed. | -| `chainName` | `string` | The name of the network on which the contract is deployed. | -| `contractAddress` | `string` | The address of the deployed contract. | -| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | - -#### Defined in - -[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) - ---- - -### EvaluationData - -Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) - -This file was automatically generated by json-schema-to-typescript. -DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, -and run json-schema-to-typescript to regenerate this file. - -#### Defined in - -[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) - ---- - -### EvaluationSource - -Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) - ---- - -### HypercertClientConfig - -Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } - -Configuration options for the Hypercert client. - -#### Defined in - -[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) - ---- - -### HypercertClientProps - -Ƭ **HypercertClientProps**: `Object` - -The props for the Hypercert client. - -#### Type declaration - -| Name | Type | Description | -| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | -| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | - -#### Defined in - -[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) - ---- - -### HypercertEvaluatorConfig - -Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } - -Configuration options for the Hypercert evaluator. - -**`Note`** - -The signer is required for submitting evaluations. - -#### Defined in - -[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) - ---- - -### HypercertStorageConfig - -Ƭ **HypercertStorageConfig**: `Object` - -Configuration options for the Hypercert storage layer. - -**`Note`** - -The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. - -#### Type declaration - -| Name | Type | Description | -| :------------------ | :------- | :------------------------------ | -| `nftStorageToken?` | `string` | The API token for NFT.storage. | -| `web3StorageToken?` | `string` | The API token for Web3.storage. | - -#### Defined in - -[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) - ---- - -### HypercertsSdkError - -Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) - -#### Defined in - -[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) - ---- - -### QueryParams - -Ƭ **QueryParams**: `Object` - -#### Index signature - -▪ [key: `string`]: `any` - -#### Type declaration - -| Name | Type | -| :---------------- | :------------------ | -| `first` | `number` | -| `orderDirections` | `"asc"` \| `"desc"` | -| `skip` | `number` | - -#### Defined in - -[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) - ---- - -### SupportedChainIds - -Ƭ **SupportedChainIds**: `5` \| `10` - -#### Defined in - -[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) - ---- - -### TransferRestrictions - -Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] - -#### Defined in - -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) - -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) - -## Properties - -### ClaimByIdQuery - -• **ClaimByIdQuery**: `any` - -## Variables - -### INDEFINITE_DATE_STRING - -• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` - -#### Defined in - -[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) - ---- - -### TransferRestrictions - -• `Const` **TransferRestrictions**: `Object` - -Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol - -**`Dev`** - -AllowAll: All transfers are allowed - -**`Dev`** - -DisallowAll: All transfers are disallowed - -**`Dev`** - -FromCreatorOnly: Only the creator can transfer the Hypercert - -#### Type declaration - -| Name | Type | -| :---------------- | :--- | -| `AllowAll` | `0` | -| `DisallowAll` | `1` | -| `FromCreatorOnly` | `2` | - -#### Defined in - -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) - -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) - -## Functions - -### execute - -▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> - -#### Parameters - -| Name | Type | -| :--------------- | :-------------------------------- | -| `document` | `GraphQLOperation`<`any`, `any`\> | -| `variables` | `any` | -| `context?` | `any` | -| `rootValue?` | `any` | -| `operationName?` | `string` | - -#### Returns - -`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> - -#### Defined in - -node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 - ---- - -### formatDate - -▸ **formatDate**(`date`): `string` - -#### Parameters - -| Name | Type | -| :----- | :----- | -| `date` | `Date` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) - ---- - -### formatHypercertData - -▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) - -Formats input data to an object containing HypercertMetadata including appropriate labels - -#### Parameters - -| Name | Type | -| :----------------------- | :----------------------------------------------- | -| `«destructured»` | `Object` | -| › `contributors` | `string`[] | -| › `description` | `string` | -| › `excludedImpactScope` | `string`[] | -| › `excludedRights` | `string`[] | -| › `excludedWorkScope` | `string`[] | -| › `external_url?` | `string` | -| › `image` | `string` | -| › `impactScope` | `string`[] | -| › `impactTimeframeEnd` | `number` | -| › `impactTimeframeStart` | `number` | -| › `name` | `string` | -| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | -| › `rights` | `string`[] | -| › `version` | `string` | -| › `workScope` | `string`[] | -| › `workTimeframeEnd` | `number` | -| › `workTimeframeStart` | `number` | - -#### Returns - -[`FormatResult`](modules/internal.md#formatresult) - -#### Defined in - -[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) - ---- - -### formatUnixTime - -▸ **formatUnixTime**(`seconds`): `string` - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `seconds` | `number` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) - ---- - -### validateAllowlist - -▸ **validateAllowlist**(`data`, `units`): `Object` - -Validates the data for an allowlist. - -#### Parameters - -| Name | Type | Description | -| :------ | :---------------------------------------------- | :------------------------------------------ | -| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | -| `units` | `BigNumberish` | The total number of units in the allowlist. | - -#### Returns - -`Object` - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -| Name | Type | -| :------- | :------------------------------------------ | -| `errors` | `Record`<`string`, `string` \| `string`[]\> | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) - ---- - -### validateClaimData - -▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :------------------------------------------------------- | :-------------------- | -| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) - ---- - -### validateDuplicateEvaluationData - -▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a duplicate evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :--------------------------------------------------------- | :-------------------- | -| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) - ---- - -### validateMetaData - -▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :----------------------------------------------------- | :-------------------- | -| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) - ---- - -### validateSimpleTextEvaluationData - -▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :----------------------------------------------------------- | :-------------------- | -| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) - ---- - -### verifyMerkleProof - -▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` - -Verifies a Merkle proof for a given address and units. - -**`Throws`** - -If the Merkle proof verification fails. - -#### Parameters - -| Name | Type | Description | -| :-------------- | :------------- | :-------------------------------------- | -| `root` | `string` | The Merkle root hash to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish` | The units to verify. | -| `proof` | `string`[] | The Merkle proof to verify. | - -#### Returns - -`void` - -#### Defined in - -[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) - ---- - -### verifyMerkleProofs - -▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` - -Batch verifies Merkle proofs for multiple roots, units and proofs for a single address - -**`Throws`** - -If the Merkle proof verification fails. - -**`Notice`** - -Wrapper around `verifyMerkleProof` to batch verify multiple proofs - -#### Parameters - -| Name | Type | Description | -| :-------------- | :--------------- | :---------------------------------------- | -| `roots` | `string`[] | The Merkle root hashes to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish`[] | The units to verify. | -| `proofs` | `string`[][] | The Merkle proofs to verify. | - -#### Returns - -`void` - -#### Defined in - -[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md deleted file mode 100644 index d20a3804..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md +++ /dev/null @@ -1,307 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal - -# Module: internal - -## Table of contents - -### Classes - -- [default](../classes/internal.default.md) -- [default](../classes/internal.default-1.md) -- [default](../classes/internal.default-2.md) - -### Interfaces - -- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) -- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) -- [HypercertMinter](../interfaces/internal.HypercertMinter.md) - -### Type Aliases - -- [Claim](internal.md#claim) -- [ClaimByIdQuery](internal.md#claimbyidquery) -- [ClaimToken](internal.md#claimtoken) -- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) -- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) -- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) -- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) -- [Exact](internal.md#exact) -- [FormatResult](internal.md#formatresult) -- [InputMaybe](internal.md#inputmaybe) -- [Maybe](internal.md#maybe) -- [OrderDirection](internal.md#orderdirection) -- [RecentClaimsQuery](internal.md#recentclaimsquery) -- [Scalars](internal.md#scalars) -- [ValidationResult](internal.md#validationresult) - -## Type Aliases - -### Claim - -Ƭ **Claim**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | -| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | - -#### Defined in - -[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) - ---- - -### ClaimByIdQuery - -Ƭ **ClaimByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | - -#### Defined in - -[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) - ---- - -### ClaimToken - -Ƭ **ClaimToken**: `Object` - -#### Type declaration - -| Name | Type | -| :---------- | :--------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `claim` | [`Claim`](internal.md#claim) | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | - -#### Defined in - -[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) - ---- - -### ClaimTokenByIdQuery - -Ƭ **ClaimTokenByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | - -#### Defined in - -[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) - ---- - -### ClaimTokensByClaimQuery - -Ƭ **ClaimTokensByClaimQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :------------------------------------------------------------------------------------------------------------------ | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) - ---- - -### ClaimTokensByOwnerQuery - -Ƭ **ClaimTokensByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | - -#### Defined in - -[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) - ---- - -### ClaimsByOwnerQuery - -Ƭ **ClaimsByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) - ---- - -### Exact - -Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } - -#### Type parameters - -| Name | Type | -| :--- | :--------------- | -| `T` | extends `Object` | - -#### Defined in - -[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) - ---- - -### FormatResult - -Ƭ **FormatResult**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------ | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | -| `errors` | `Record`<`string`, `string`\> \| `null` | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) - ---- - -### InputMaybe - -Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) - ---- - -### Maybe - -Ƭ **Maybe**<`T`\>: `T` \| `null` - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) - ---- - -### OrderDirection - -Ƭ **OrderDirection**: `"asc"` \| `"desc"` - -Defines the order direction, either ascending or descending - -#### Defined in - -[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) - ---- - -### RecentClaimsQuery - -Ƭ **RecentClaimsQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) - ---- - -### Scalars - -Ƭ **Scalars**: `Object` - -All built-in and custom scalars, mapped to their actual values - -#### Type declaration - -| Name | Type | -| :----------- | :-------- | -| `BigDecimal` | `any` | -| `BigInt` | `any` | -| `Boolean` | `boolean` | -| `Bytes` | `any` | -| `Float` | `number` | -| `ID` | `string` | -| `Int` | `number` | -| `Int8` | `any` | -| `String` | `string` | - -#### Defined in - -[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) - ---- - -### ValidationResult - -Ƭ **ValidationResult**: `Object` - -The result of a validation. - -**`Property`** - -Whether the data is valid. - -**`Property`** - -A map of errors, where the key is the field that failed validation and the value is the error message. - -#### Type declaration - -| Name | Type | -| :------- | :---------------------------- | -| `errors` | `Record`<`string`, `string`\> | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md deleted file mode 100644 index b591d11d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md +++ /dev/null @@ -1,12 +0,0 @@ -# Burning - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## Burning fraction tokens - -You can only burn fraction tokens that you own. Hypercert claims cannot be burned once minted. -You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). - -```js -const txn = await hypercerts.burnFraction({ tokenId }); -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md deleted file mode 100644 index b26fc0e8..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md +++ /dev/null @@ -1,112 +0,0 @@ -# Hypercert Client Configuration - -The client provides a high level interface that communicates with the Graph, IPFS and the evm. For easy setup we harmonised the configuration into a flow that allows for configuration with different levels of specificity. - -## Configuration - -### Setup - -The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: - -1. Overrides declared in `Partial` -2. Environment variables exposed via `process.env` - -Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. - -We then process the rest of the overrides and possible environment variables to customise the default configuration. - -To get started quickly you can either: - -- set `process.env.DEFAULT_CHAIN_ID` to 5 or 10 -- initialize a new client by calling `new HypercertClient({chainId: 5})` (or 10) - -Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) - -### Read-only mode - -The SDK client will be in read-only mode if any of the following conditions are true: - -- The client was initialized without an operator. -- The client was initialized with an operator without signing abilities. -- The contract address is not set. -- The storage layer is in read-only mode. - -If any of these conditions are true, the read-only property of the `HypercertClient` instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. - -### Defaults - -The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. - -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - -`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object -contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. - -For example: - -```json -{ - "5": { - "chainId": 5, - "chainName": "goerli", - "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" - } -} -``` - -You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. - -### Client config properties - -| Property | Type | Description | -| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `graphUrl` | `string` | The url of the subgraph to use. | -| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | - -- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) -- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) - -### Environment variables - -You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. - -We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - -### Logging - -The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level -determines which log messages are printed to the console. By default, the logger is configured to log messages with a -level of info or higher to the console. - -In your `.env` file: - -```bash -LOG_LEVEL="info" -``` - -The SDK logger supports four log levels: `error`, `warn`, `info`, and `debug`. - -- The `error` log level is used to log errors that occur in the SDK. -- The `warn` log level is used to log warnings that do not necessarily indicate an error, but may be important to investigate. -- The `info` log level is used to log general information about the SDK's state or behavior. -- The `debug` log level is used to log detailed information that is useful for debugging purposes. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md deleted file mode 100644 index 60f4e5e7..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md +++ /dev/null @@ -1,18 +0,0 @@ -# Errors in the SDK - -Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. - -### Handling Errors - -To support debugging we've implemented some custom errors. - -| Error | Reason | Payload | -| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | -| ClientError | An error caused by the client | `{ [key: string]: unknown }` | -| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | -| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | -| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | -| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | -| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | -| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | -| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md deleted file mode 100644 index c5399a4f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md +++ /dev/null @@ -1,13 +0,0 @@ -# Evaluations - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## Respond / or contest an evaluation - -To create an evaluation of a hypercert - -```js -TODO; -``` - -_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md deleted file mode 100644 index d5ff1226..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md +++ /dev/null @@ -1,57 +0,0 @@ -# Minting - -## Token design - -Hypercerts are semi-fungible tokens. -Thus, each hypercert is represented on-chain by a group of fraction tokens, -each representing a fraction of ownership over the hypercert. -If you want to split your fraction token, or merge multiple tokens into one, -check out the section on [splitting and merging](./split-merge.md). - -## Minting your first hypercert - -To mint a hypercert you need to provide the `metadata`, total amount of `units` and the preferred `TransferRestrictions`. -The resulting hypercert will be wholly owned by the creator. - -```js -import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" - -const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; - -const tx: Promise = await hypercerts.mintClaim({ - metadata, - totalUnits, - transferRestrictions: TransferRestrictions.FromCreatorOnly, -}); -``` - -> **Note** If you did not initialize your HypercertsClient with an `operator`, `nftStorageToken` and `web3StorageToken`, the client will run in [read-only mode](#read-only-mode) and this will fail. - -Let's see what happens under the hood: - -First, `mintClaim` checks that the client is not `read only` and that the operator is a `Signer`. If not, it throws an `InvalidOrMissingError`. - -Next, the function validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. The function then stores the metadata on `IPFS` using the `storeMetadata` method and returns the `CID` for the metadata. - -Finally, we call the mintClaim function on the contract with the signer `address`, total `units`, `CID`, and `transfer restriction` as parameters. If `overrides` are provided, the function uses them to send the transaction. Otherwise, it sends the transaction without overrides. - -## Transfer restrictions - -When minting a Hypercert, you must pass in a `TransferRestriction` policy. For now there are only 3 implemented policies: - -```js -enum TransferRestrictions { - // Unrestricted - AllowAll, - // All transfers disabled after minting - DisallowAll, - // Only the original creator can transfer - FromCreatorOnly -} -``` - -## Reference - -See the [code](https://github.com/hypercerts-org/hypercerts/tree/main/sdk/src/client.ts) -for more details on how we implement minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md deleted file mode 100644 index 409a1e9d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md +++ /dev/null @@ -1,41 +0,0 @@ -# Getting started with Solidity - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -If you need the Solidity contracts or interfaces exported from the SDK, -please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). - -## Hypercerts deployments - -Hypercerts is a multi-chain protocol and we want to support any network that wants to make positive impact. -We plan to support at most 1 canonical contract deployment per network. -For a complete list of deployments and their contract addresses, see [Supported Networks](./supported-networks.md). - -## Installing the Hypercert contracts - -```bash -npm install @hypercerts-org/contracts -# or yarn add @hypercerts-org/contracts -``` - -## Using the Solidity interface - -If you want to call the Hypercerts contract on your network directly from Solidity, -we export the interface/ABI for you to use from your contract. - -```js -import { IHypercertToken } from "@hypercerts-org/contracts/IHypercertMinter.sol"; - -contract MyContract { - IHypercertToken hypercerts; - - function initialize(address _addr) public virtual initializer { - hypercerts = IHypercertToken(_addr); - } - - function uri(uint256 tokenID) public view returns (string memory _uri) { - _uri = hypercerts.uri(tokenID); - } -} - -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md deleted file mode 100644 index 1ac5556e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md +++ /dev/null @@ -1,29 +0,0 @@ -# Split and Merge - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## By Token Value - -### Split / merge token values - -```js -const { tokenIds } = await hypercerts.splitFraction({ - tokenId, - units: [10, 12, 15], -}); -const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); -``` - -## By Claim Data - -### Split / merge claim data - -```js -const { claimIds } = await hypercerts.splitClaim({ - claimId, - TODO: somehow specify hypercert subregions -}); -const { claimId} = await hypercerts.mergeClaims({ - claimIds, -}); -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md deleted file mode 100644 index 3bfd0f18..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md +++ /dev/null @@ -1,13 +0,0 @@ -# Supported networks - -Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. - -We want to support every network that wants to support positive impact! -If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). - -## Overview - -| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | -| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | -| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | -| Optimism | 10 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md deleted file mode 100644 index 72b3ee2d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md +++ /dev/null @@ -1,120 +0,0 @@ -# Deploy a new proxy contract - -This should be done only on rare occasions. For example, when: - -- We want to deploy to a new network -- We have updated the contract in a way that is _NOT_ backwards-compatible. - - For most upgrades, please use UUPS [upgrades](./upgrade.md). - -## Smart Contracts - -### Setup the `contracts/` environment - -Navigate to `contracts/`. Configure your `.env` file by following the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/contracts#setup). - -### Build and deploy the smart contracts - -If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. - -```javascript - "optimism-goeri": getChainConfig("optimism-goerli"), -``` - -Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. - -```sh -# Run in contracts/ -yarn build:hardhat -yarn hardhat deploy --network NETWORK -``` - -This will output the new proxy address. Update the root `README.md` with this new address. - -Now transfer ownership over the proxy contract to the multisig: - -```sh -yarn hardhat transfer-owner --network NETWORK --proxy PROXY_CONTRACT_ADDRESS --owner MULTISIG_ADDRESS -``` - -## Subgraph - -### Setup the `graph/` environment - -Navigate to `graph/`. Follow the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/graph#setup) -to get set up. - -### Deploy the subgraph - -Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). - -Now deploy the subgraph - -```sh -# Run in graph/ -yarn build -yarn deploy:hosted -``` - -## OpenZeppelin Defender - -### Create a new Supabase table - -Log into the [Supabase dashboard](https://app.supabase.com/). -We store all data in a single project, but use different tables for each network. -The table name should be suffixed by the network (e.g. `allowlistCache-goerli`). -If you are deploying to a new network, create a new table. You can copy the table schema and RLS policy from another pre-existing table. - -If you are deploying a new proxy contract to a network for which you already have another deployment, you'll have to make a judgement call as to whether you can reuse the existing table, whether you need to clear the existing table, or create another table. - -Note: We want to merge all the tables in this [issue](https://github.com/hypercerts-org/hypercerts/issues/477). - -### Update the OpenZeppelin Defender scripts - -Modify the Defender scripts to support the new network in `defender/src/networks.ts`. - -If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. - -Note: The entry point for deployment is in `defender/src/setup.ts`. - -### Setup the `defender/` environment - -Navigate to `defender/`. Follow the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/defender#setup) -to get set up. - -### Deploy defender scripts - -Deploy to OpenZeppelin Defender via - -```sh -# Run in defender/ -yarn deploy -``` - -## Hypercerts SDK - -TODO: Flesh this out - -Run the build in `contracts/`. - -(Soon to be deprecated) Publish `contracts/` to npm - -Configure the SDK to support the new network via the graphclient. - -Publish SDK to npm - -## Deploy the Dapp frontend - -Each frontend build is configured to run on a different network (e.g. `https://testnet.hypercerts.org`). You can use any CDN to serve the site (e.g. Netlify, Vercel, GitHub Pages, Cloudflare Pages, Fleek, Firebase Hosting). - -1. Configure your build environment with the environment variables specified in `frontend/.env.local.example`. - -2. Configure your builds to the following settings: - -- Build command: `yarn build:site` -- Build output directory: `/build` -- Root directory: `/` - -3. Configure the domain that you want for your build. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md deleted file mode 100644 index 05dc5b0c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md +++ /dev/null @@ -1,45 +0,0 @@ -# Errors - -## Deploying - -### Artifact for contract "HypercertMinter" not found - -#### Error message - -`Error HH700: Artifact for contract "HypercertMinter" not found.` - -#### Cause - -Attempting to deploy a contract with `npx hardhat deploy` before the contract has been compiled by hardhat. Contracts compiled by forge are currently not visible to hardhat (this could be a configuration problem). - -### insufficient funds for intrinsic transaction cost - -#### Error message - -`Error: insufficient funds for intrinsic transaction cost` - -#### Cause - -The environment variable `MNEMONIC` is not configured correctly. - -Alternatively, the wallet may not have enough funds for the selected network - -Causing pause twice - -Error: cannot estimate gas; transaction may fail or may require manual gas limit - -reason: 'execution reverted: Pausable: paused', - -#### Etherscan API - -Note: It can take between 5-10 minutes before a newly created etherscan API key becomes valid for queries to goerli. - -When using an etherscan API key that was too recently created, hardhat tasks using etherscan to verify transactions will exit with an error message: - -`Etherscan returned with message: NOTOK, reason: Invalid API Key` - -Despite this error the transaction may have succeeded, the hardhat task just can't confirm it. - -It is unknown if this is a problem for queries to mainnet as well. - -Metamask makes it very difficult to have multiple wallets. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md deleted file mode 100644 index 9b208595..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# DevOps - -We use this playbook to encapsulate our practices and current setup. - -## Setup dev environment - -- [Setup guide](./setup.md) -- [Plasmic setup](./plasmic.md) - -## Tasks - -- [Deploy new proxy contract](./deploy-proxy.md) -- [Upgrade contract](./upgrade.md) -- [Pause contract](./pause.md) - -## FAQ - -- [Common errors](./errors.md) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md deleted file mode 100644 index 2668f51e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md +++ /dev/null @@ -1,29 +0,0 @@ -# Pause / Unpause - -## Pause - -### Contract owned by an address - -Make sure you have set up your wallets and config from the [setup guide](./setup.md). - -To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: - -```sh -yarn hardhat pause --network NETWORK --address CONTRACT_ADDRESS -``` - -### Contract owned by a multi-sig - -If we transferred ownership to a multisig, we can use -[OpenZeppelin Defender Admin](https://defender.openzeppelin.com/#/admin) -to propose a pause to be approved by the multisig. - -## Unpause - -Make sure you have set up your wallets and config from the [setup guide](./setup.md). - -To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: - -```sh -yarn hardhat unpause --network NETWORK --address CONTRACT_ADDRESS -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md deleted file mode 100644 index 10e52f5b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md +++ /dev/null @@ -1,76 +0,0 @@ -# Plasmic setup - -## HypercertImage - -### Props - -hideImpact - -``` -$ctx.currentForm.impactTimeEnd === "indefinite" && ($ctx.currentForm.impactScopes.length === 0 || ($ctx.currentForm.impactScopes.length === 1 && $ctx.currentForm.impactScopes[0] === "all")) -``` - -color - -``` -$ctx.currentForm.backgroundColor -``` - -vectorart - -``` -$ctx.currentForm.backgroundVectorArt -``` - -### Slots - -logoImage Image URL - -``` -$ctx.currentForm.logoUrl -``` - -title Content - -``` -$ctx.currentForm.name -``` - -workPeriod Content - -``` -`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.workTimeEnd.format ? $ctx.currentForm.workTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.workTimeEnd}` -``` - -bannerImage Image URL - -``` -$ctx.currentForm.bannerUrl -``` - -impactPeriod Content - -``` -`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.impactTimeEnd.format ? $ctx.currentForm.impactTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.impactTimeEnd}` -``` - -#### workScopes: repeated ScopeChip - -Collection - -``` -$ctx.currentForm.workScopes.split(/[,\n]/).map(i => i.trim()).filter(i => !!i) -``` - -Element name: `currentWorkScope` -Index name: `currentIndex` -Color variant: `$ctx.currentForm.backgroundColor` -Content: `currentWorkScope` - -#### impactScopes: repeated ScopeChip - -Collection: `$ctx.currentForm.impactScopes` -Element name: `currentImpactScope` -Index name: `currentIndex` -Color variant: `$ctx.currentForm.backgroundColor` -Content: `currentImpactScope` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md deleted file mode 100644 index afb95296..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md +++ /dev/null @@ -1,41 +0,0 @@ -# Setup - -## Pre-requisites - -1. Install [NodeJS](https://nodejs.org/en/) and [git](https://git-scm.com/) -2. Install [yarn](https://classic.yarnpkg.com/) - -```sh -npm install --global yarn -``` - -3. Clone the repository: - -``` -git clone git@github.com:hypercerts-org/hypercerts.git -cd hypercerts -``` - -4. Install dependancies: - -To install dependencies across all projects in the monorepo workspace: - -```sh -yarn install -``` - -## Setup your wallets - -We need 2 wallets: a multi-sig for administering the contracts, and a hot wallet for setting everything up. - -1. We use a [Gnosis Safe](https://app.safe.global/) multisig for managing and administering the contracts. Set one up with your desired confirmation threshold (e.g. 2 of 3). This wallet will not require any balance. -2. Separately, set up a wallet that we'll use in our developer scripts. - -- If you don't have one, you can goto `contracts/` and run `yarn hardhat generate-address`. -- Make sure there is enough balance in this account to deploy the contract and transfer ownership to the multisig - - [Goerli Faucet](https://goerlifaucet.com/) - - [Optimism Bridge](https://app.optimism.io/bridge/deposit) - -## Next Steps - -Depending on what you want to do (e.g. in `./sdk/` or `./frontend/`), there will be further setup instructions in the respective `README.md` file. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md deleted file mode 100644 index 820255e7..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md +++ /dev/null @@ -1,35 +0,0 @@ -# Upgrading the contract - -## Validate upgrade - -Validate contract upgradeability against deployment. - -For example, for the `goerli` deployment: - -```sh -yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS -``` - -## Propose Upgrade - -Propose an upgrade via OpenZeppelin Defender. For more information, see this -[guide](https://docs.openzeppelin.com/defender/guide-upgrades) - -For example, for the `goerli` deployment: - -```sh -yarn build:hardhat -yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS -``` - -This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. - -## Publish to npm - -After you update the contracts, deploy the `contracts/` package to npm. - -TODO - -Update the dependencies in `frontend/package.json` and `sdk/package.json`. - -If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/faq.md b/docs/versioned_docs/version-1.0.0-alpha.0/faq.md deleted file mode 100644 index b9659b5a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/faq.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Frequently Asked Questions -id: faq ---- - -# FAQs - -### How do I create a hypercert? - -We've created a step-by-step guide in the documents, which you can find [here](minting-guide/minting-guide-start). - -### Who gets to claim my hypercert? - -There are currently two types of users who are eligible to claim your hypercert. - -1. You as the creator of the hypercert are eligible to claim your hypercert. For projects with an allow list, you are eligible to claim 50% of the total tokens. For projects with no allow list, you will receive 100% of the tokens automatically and can do whatever you like with them. - -2. Anyone on the hypercert's allow list will be eligible to claim your hypercert. The allow list is stored and the time of minting and allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions through a separate contract interaction. Creators often use allow lists be used to allocate fractions to previous funders and contributors. - -### How do I claim a hypercert? Can I claim all of the ones I’m eligible for at once? - -After you connect your wallet, you will see a dashboard of hypercerts that you can claim. You can either claim them individually or in a batch transaction. Note that if you perform the batch transaction you will automatically claim _all_ hypercerts you are allow-listed for. (You still pay a gas fee for each claim, however.) If you don't want to claim _all_ at once, then you should claim them one-by-one. - -### What token standard do hypercerts utilize? - -The interface supports both ERC-1155s and 721s. Our current implementation makes use of [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) (a semi-fungible token). - -### What are the required fields to generate a hypercert? - -There are six required fields: - -1. Set of contributors: An ordered list of all contributors, who claim to do or have done the work described by this hypercert. -2. Scope of work: A conjunction of potentially-negated work scope tags, where an empty string means “all”. -3. Time of work: A date range, from the start to the end of the work being claimed by this hypercert. -4. Scope of impact: A conjunction of potentially-negated impact scope tags, where an empty string means “all”. -5. Time of impact: Date ranges from the start to the end of the impact. -6. Rights of the owners: An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. - -Hypercerts also need a name and description. - -### What should I put for my hypercert's work scope? - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -### Are hypercerts the same as impact evaluations? - -No. A hypercert is a claim over a discrete piece of work and the impact that may result from that work. It has no opinion about the legitimacy or quality of the claim. - -An impact evaluation is an opinionated assessment about the legitimacy or quality of a claim. - -For example, a hypercert might represent "Planting trees in the Amazon in 2022". An impact evaluation might point to that hypercert and assert the percent of trees that survived, the amount of CO2 removed by the trees, or the income change among people living around the project. - -Over time, the expectation is that hypercerts that attract multiple, high quality, credibly neutral impact evaluations will be more relevant than ones that do not. - -### What can I do with my hypercert? - -The `rights` dimension specific what an owner can do with their hypercert. Currently, the only `right` that owners have is "Public Display". Over time, we hope the protocol can support various `rights` including transfers, intellectual property, tax-deductibility, carbon offsets, ESG reporting, and more. - -### How is a hypercert different than a POAP or Impact NFT? - -Hypercerts have some things in common with certain POAPs or Impact NFTs, but also a number of crucial differences. - -First, all POAPs and most Impact NFTs are implemented as non-fungible tokens (ERC-721s). Hypercerts are currently being implemented as semi-fungible tokens (ERC-1155s), meaning it is possible to own more than one unit or fraction of a given hypercert. This makes it easy and intuitive to display the share of hypercerts that a given owner has. - -Second, hypercerts have specific metadata requirements and interpretation logic. These include a standard schema for how the six required hypercert dimensions are defined and captured (i.e., work scopes, impact scopes, timeframes, contributors, etc) as well as logic for how to interpret different inputs (e.g., how to include or exclude certain work scopes, create an indefinite time period, etc). POAPs have a completely different schema. Although there is no standard schema for Impact NFTs, an Impact NFT project could choose to adopt the hypercert standard and token interface and thereby achieve compatibility. - -Third, the hypercerts token interface is intended to support several functions that are not possible out of the box with other token standards, chiefly, atomic split and merge capabilities. We also expect other protocols to work with hypercerts for the purposes of prospective and retrospective funding, contributor verification, and impact evaluation. - -For certain use cases, POAPs may be better suited for projects as hypercerts are focused on the funding aspect of impactful work. - -### Where can I purchase a hypercert? - -Currently, it is only possible to purchase a hypercert from a creator or project. This can be facilitated directly by the project or via a third-party marketplace like OpenSea. Currently, hypercerts cannot be resold on secondary markets. - -### What chain(s) is hypercerts running on? - -The hypercerts smart contracts have been deployed on Optimism and Goerli Testnet. We plan to support various EVM chains in the near future. - -### How do I bridge to Optimism? - -There are various bridging services including the official [Optimism Bridge](https://app.optimism.io/bridge/deposit). Note that bridging assets from Ethereum to Optimism will incur a gas fee. - -### How much gas will it cost to create or claim a hypercert? - -In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). Claiming a hypercert should be below 0.0001 ETH or less than $0.10 on Optimism. - -### How do I create a hypercert from a multisig? - -If you are creating a hypercert on Optimism, then you will need an Optimism-based multisig. (Unfortunately, Safe wallets created on Ethereum won't work on Optimism.) - -### Have the smart contracts been audited? - -Yes. The auditor's security report is available [here](https://github.com/pashov/audits/blob/master/solo/Hypercerts-security-review.md). - -### How is the allow list generated? - -For Gitcoin projects, an allow list is generated from a snapshot of all of the on-chain funding received by the project. - -The queries used to generate the allow lists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -Once the snapshot is taken, the formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. - -For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.96 donated --> 1 fraction -- $0.52 donated --> 0 fractions - -### Why am I not on the allow list even though I contributed to the project? - -If you contributed less than $1 DAI to a project, then you will not be eligible to claim a hypercert fraction. - -### I supported a project. Why I don't I see the hypercert in my dashboard? - -In order to your hypercert to appear as "claimable", the project needs to mint the hypercert first. If the project has not minted its hypercert yet, then you will not be able to claim it. We suggest you check back in a few days to see if the project has created the hypercert and is now claimable. - -If the project has created its hypercert, then please try the following solutions: - -1. Confirm the wallet address is correct (some users have multiple wallet addresses and forget which one they donated with) -2. Check that your wallet is included in the Dune Dashboards for each Gitcoin Round - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -3. Confirm you donated more than $1 DAI to the project. - -If the project has created its hypercert, and you have confirmed items 1-3, then please send us a DM over Twitter or Telegram with your wallet address and we will get back to you promptly. - -### How do I retire a hypercert? - -We don't yet have a frontend for retiring hypercerts but you can do this by interacting directly with the smart contract on Etherscan. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md b/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md deleted file mode 100644 index 86c25331..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Further Resources -id: further-resources ---- - -# Papers, Articles, Presentations - -## Writings - -- Feb 14, 2023, Whitepaper draft by [@hypercerts](http://twitter.com/hypercerts): [Hypercerts: A new primitive for impact funding systems (draft v0)](../static/pdf/hypercerts_whitepaper_v0.pdf) -- Aug 24, 2022, Blogpost by [@holkeb](https://twitter.com/holkeb): [Hypercerts: A new primitive for public goods funding](https://protocol.ai/blog/hypercert-new-primitive/) -- Jun 2022, Tech report (draft) by [@davidad](https://twitter.com/davidad): [Hypercerts; an Interoperable Datalayer for Impact-Funding Mechanisms](../static/pdf/hypercerts_Tech_Report_draft.pdf) - -## Talks - -#### Jun 24, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Hypercerts: on-chain primitives for impact markets](https://youtu.be/2hOhOdCbBlU) - - - -#### Jun 23, 2022, Conversation between [@emiyazono](http://twitter.com/emiyazono) and [@owocki](http://twitter.com/owocki) at GreenPill Podcast: [Impact Certificates | Evan Miyazono, Head of Research at Protocol Labs | Green Pill #21](https://youtu.be/kyo5SxtSJ9U) - - - -#### Mar 4, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Interoperable mechanisms for non-rival goods (Hypercerts)](https://youtu.be/acbBeGcevok) - - - -## Other resources - -Overview of some previous writings on impact certificates, retrospective funding and impact markets: - -- Christiano, Paul (2014) Certificates of impact, Rational Altruist, [https://rationalaltruist.com/2014/11/15/certificates-of-impact/](https://rationalaltruist.com/2014/11/15/certificates-of-impact/) -- Christiano, Paul & Katja Grace (2015) The Impact Purchase, [https://impactpurchase.org/why-certificates/](https://impactpurchase.org/why-certificates/) -- Optimism & Buterin, Vitalik (2021) Retroactive Public Goods Funding, [https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c) -- Cotton-Barratt, Owen (2021), Impact Certificates and Impact Markets, Funding the Commons November 2021, [https://youtu.be/ZiDV56o5M7Q](https://youtu.be/ZiDV56o5M7Q) -- Drescher, Denis (2022) Towards Impact Markets, [https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1](https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1) -- Ofer & Cotton-Barratt, Owen (2022) Impact markets may incentivize predictably net-negative projects, [https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6](https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md deleted file mode 100644 index b2451310..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Glossary -id: glossary -sidebar_position: 3 ---- - -# Glossary of Hypercerts Terms - -## Main Terms - -### Allowlist - -A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. - -### Claiming a fraction - -Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. - -### Contributor - -An individual or organization that performs some or all of the work described in a hypercert. - -### Creating a hypercert - -Synonymous to minting a hypercert. - -### Fraction - -A token that represents a quantified proportion of a hypercert denominated in units. - -### Funder - -Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. - -### Hypercert - -A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. - -### Hypercerts interface - -The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. - -### Hypercerts implementation - -An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. - -### Hypercerts standard - -A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. - -### Impact - -Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. - -### Impact evaluation - -A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. - -### Impact Funding System (IFS) - -A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. - -### Impact space - -A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. - -### Merging hypercerts - -An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. - -### Minting a hypercert - -Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. - -### Project - -Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. - -### Prospective funder - -Individual, organization, or algorithm that fund work before it is done. - -### Retrospective funder - -Individual, organization, or algorithm that fund work after it is done. - -### Rights - -An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. - -### Set of contributors - -An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Scope of impact - -A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Scope of work - -A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Splitting hypercerts - -An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. - -### Time of impact - -Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Time of work - -A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Unit - -The smallest possible fraction of a claim. Generally units are grouped in fractions. - -### Work - -Activities that produce impact. - -## Additional Impact Evaluation Terms - -### Auditor - -Individual, organization, or algorithm that evaluates the impact of work after it is done. - -### Beneficiaries - -People or objects that are impacted by work. - -### Evaluator - -Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. - -### Scout - -Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md deleted file mode 100644 index 08eb9fcb..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: Metadata Standard -id: metadata -sidebar_position: 2 ---- - -# Hypercert Metadata Structure - -Hypercerts are represented as [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) tokens. All token instances of a hypercert must share the same ERC-1155 metadata. For sites like OpenSea to pull in off-chain metadata for ERC-1155 assets, your hypercert contract will need to return an IPFS URI that contains all necessary hypercert metadata. - -The hypercert metadata schema follows the [Enjin recommendation](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema) for ERC-1155 metadata. It also includes **six required dimensions** that are necessary to clearly and unambiguously identify the hypercert's impact claim. - -The following are standard ERC-1155 metadata fields. - -## ERC-1155 fields - -| Property | Description | -| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | Name or title of the hypercert. Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. | -| `description` | A human readable description of the hypercert. Markdown is supported. Additional external URLs can be added. | -| `image` | A URI pointing to a resource with mime type image/\* that represents the hypercert's artwork, i.e., `ipfs://`. We recommend images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. | -| `external_url` | [optional] A URL that can be displayed next to the hypercert on webpages like OpenSea and links users to a page that has more information about the project or impact claim. | -| `properties` | [optional] Additional properties (aka attributes) that may be helpful for discovery and curation of hypercerts. Marketplaces like OpenSea will display these properties in the same way as they display rarity traits of NFTs. | - -In order to perform hypercert-specific operations, including split and merge functions, and for your hypercert to robustly claim a set of coordinates in the impact space, there are six additional dimensions that must be included in your metadata. - -## Required Hypercert dimensions - -| Property | Description | -| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `work_scope` | An _ordered list_ of work scope tags. Work scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any work scope that is explicitly excluded from the claim. | -| `work_timeframe` | Date range from the start to the end of the work in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). | -| `impact_scope` | An _ordered list_ of impact scope tags. Impact scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any impact scope that is explicitly excluded from the claim. The default claim is to "all" impact, giving the owner rights to claim all potential impact created by the work that is represented by the hypercert. | -| `impact_timeframe` | Date range from the start to the end of the impact in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). The default claim is from the start date of work until `indefinite` (i.e., the impact may occur at any point in time in the future). | -| `contributors` | An _ordered list_ of all contributors. Contributors should be itemized as wallet addresses or ENS names, but may be names / pseudonyms. The default claim is to the wallet address that created the hypercert contract. A multisig wallet can be used to represent a group of contributors. | -| `rights` | An _unordered list_ of usage rights tags. The default claim is solely to "public display" of the hypercert, i.e., all other rights remain with the contributors. | - -## Examples - -### Example 1: hypercert with minimal bounds - -Here is an example of hypercert dimensions for work on IPFS with minimal bounds: - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["IPFS"], - "excludes": [], - "display_value": "IPFS" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["All"], - "excludes": [], - "display_value": "All" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1380585600, 1388534399], - "display_value": "2013-10-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1380585600, 0], - "display_value": "2013-10-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["Protocol Labs"], - "display_value": "Protocol Labs" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Example 2: hypercert with bounded impact claims - -This hypercert is for a carbon removal project that provides a bounded impact scope. - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["Protecting Trees in Amazon"], - "excludes": [], - "display_value": "Protecting Trees in Amazon" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["CO2 in Atmosphere"], - "excludes": [], - "display_value": "CO2 in Atmosphere" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1356998400, 1388534399], - "display_value": "2013-01-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1356998400, 0], - "display_value": "2013-01-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], - "display_value": "0xa1f...000, Project Forest Conservation" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Example 3: hypercert with excluded impact claims - -Here is an example that explicitly excludes an impact scope to generate a more fine-grained claim. - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["Protecting Trees in Amazon"], - "excludes": [], - "display_value": "Protecting Trees in Amazon" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["All"], - "excludes": ["CO2 in Atmosphere"], - "display_value": "All ∧ ¬CO2 in Atmosphere" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1356998400, 1388534399], - "display_value": "2013-01-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1356998400, 0], - "display_value": "2013-01-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], - "display_value": "0xa1f...000, Project Forest Conservation" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Additional guidelines - -Here are some additional guidelines for defining hypercert dimensions. - -- For most hypercerts, the `work_scope` is best represented as the name of the project or activity. Other information contained in the hypercert, namely, the `contributors` and the `work_timeframe` should provide sufficient context to disambiguate multiple claims from the same project. -- Similarly, for most hypercerts, the `impact_scope` will be most clearly represented as "all" (with an indefinite upper bound on the `impact_timeframe` dimensions). This gives the hypercert creator and its owners the flexibility to make claims about impact that may not have been observable or well-understood when the hypercert was created. - -- It is recommended to browse the `impact_scope` and `work_scope` tags that have already been created and are in use by your or other projects. (We are building a catalog to be available at [hypercerts.org](https://hypercerts.org).) Picking established tags can make it easier for users to discover, curate, and interact with your hypercert. In the long-run, we expect different ontologies to emerge in domains like climate solutions, open source software, etc, and picking more established tags will help prevent overlapping or duplicate claims. -- Tags for work scopes and impact scopes are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. -- Scopes that are explicitly excluded from the hypercert claim are enumerated separately and displayed with the `¬` prefix in the tag. Excluded scopes are not currently displayed on hypercert artwork. -- The order of tags matters only for display purposes. The hypercert artwork will only display a limited number of tags in the `impact_scope` and `work_scope` arrays due to image size and stylistic constraints. -- A `contributor` can be identified using any human-readable string. The base case is to set the `contributors` to the wallet address used to create the hypercert. A multisig wallet can be used to represent a group of contributors. - -### Assigning `rights` - -In version 1.0 of the protocol, only one `rights` tag will be enabled: - -> **Public Display**: owners of the hypercert have the right to publicly display and receive social utility from their hypercert. - -This means that any other rights regarding the work described by the hypercert either remain with the original contributors or are governed by other agreements. - -Additional `rights` including the potential for certain types of transfers to be explicitly enabled will be released in subsequent versions. - -## Optional hidden properties - -Creators may wish to add other fields in their metadata that are not a part of the hypercert claim and are not for display on third-party marketplaces like OpenSea. These can be added by creating a `hidden_properties` field in the metadata. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md deleted file mode 100644 index a767c670..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Token Standard -id: token-standard -sidebar_position: 1 ---- - -### Hypercerts as a semi-fungible token - -In order to make the token identifiable, traceable, and transferable, hypercerts are represented as [ERC-1155 tokens](https://eips.ethereum.org/EIPS/eip-1155). The ERC-1155 standard enables a single deployed contract to store many hypercerts, facilitating simpler creation, transfers, as well as splitting and merging of hypercerts within a single namespace. As a semi-fungible token, each unique token represents a fraction of ownership of a hypercert. Hypercerts are then represented as a group of tokens, where the total ownership sums to 100%. In order to easily identify which hypercert a token belongs to, we utilize the upper 128 bits of a 256-bit token ID to identify the hypercert. All tokens within the same hypercert group should share the same [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). - -![hypercert id](../../static/img/hypercert_id.png) - -For illustrative purposes, let us assume that token IDs are just 2 bytes long, where the first byte represents the hypercert ID and the last byte represents which fraction of ownership. Alice could create a new hypercert token 0x2301, representing 100% of hypercert 0x23. If Alice wanted to transfer 20% to Bob, Alice could perform a split operation by minting token 0x2302 and transferring 20% of value to it, such that tokens 0x2301 and 0x2302 represent 80% and 20% ownership respectively of hypercert 0x23. Then Alice transfers token 0x2302 to Bob. Similarly, they could merge these 2 tokens together, back to form a token that represented 100% ownership. In this case, the value of 0x2301 would be transferred to 0x2302, and then 0x2301 is subsequently burned. - -Alice can also choose to split or merge hypercerts along some dimension of the impact space. For example, Alice may split hypercert 0x23 into two new hypercerts — 0x24 representing work done before the year 2000, and 0x25 representing work done after 2000. The original hypercert 0x23 is burned and the two new hypercerts store a reference to the previous hypercert. When the history of splits and merges are indexed, we can easily trace through the provenance of any individual hypercert. - -### Claim Data - -Hypercert claim data, such as scope of work and the contributor list, is encoded in JSON format into the [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). Claim data can be stored on-chain alongside the token, or in off-chain storage such as IPFS. For details on the JSON schema and how off-chain storage can be utilized, see the [hypercerts-sdk repository](https://github.com/hypercerts-org/hypercerts/tree/main/sdk). - -When considering whether to store hypercert metadata on-chain or off-chain, we can consider the different trade-offs to the user experience and cost, which may differ depending on which blockchain is being used. Storing data off-chain saves on costs, but could lead to on-chain claims without the metadata. Storing data on-chain adds additional security that the claims will not be forgotten but can lead to higher gas fees. - -Beyond the standard fields of hypercerts that locate the hypercert in the impact space, additional fields can be added. This allows for different templates in different impact areas, such as AI safety or biodiversity, as different additional information will be useful. Importantly, however, all hypercerts will be located in a single impact space – the additional fields do not change that. - -### Multi-chain support - -We expect hypercerts to exist in a multi-chain ecosystem, where the local deployment can be used to support the unique funding systems of that community. In order to visualize a single global impact space, we index the different contract deployments across chains and surface any potential hypercert claim conflicts. Because different blockchains support different subsets of programming languages, we do expect different implementations of the hypercert protocol to exist. However, they must adhere to the same hypercert data model to be indexed into the impact space. - -In order to decide which deployments to index into the hypercerts impact space, decentralized governance institutions will be used to govern the list of contract addresses used across all blockchains. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/intro.md deleted file mode 100644 index 0c4d7ca3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/intro.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: What Are Hypercerts? -id: intro ---- - -# What are hypercerts? - -### Hypercerts are a new token standard for tracking and rewarding positive impact. - -Each hypercert represents a unique impact claim capturing the following information: - -- a scope of work and its corresponding scope of impact -- a set of time frames for both the work and its impact -- a set of contributors – the organization or people behind the work -- a set of rights you get by owning a hypercert - -The hypercert itself is an ERC-1155 semi-fungible token with the information above stored as metadata on IPFS. Here’s an example. - -### Hypercert example - -#### Graphic representation - -![hypercert design example](../static/img/hypercert_example.png) - -#### Supplementary information (metadata) - -- **Title of hypercert:** Invention of the InterPlanetary Filesystem (IPFS) -- **Description:** The InterPlanetary File System (IPFS) is a set of composable, peer-to-peer protocols for addressing, routing, and transferring content-addressed data in a decentralized file system. -- **Link:** ipns://ipfs.tech/ - -#### Hypercert dimensions (metadata) - -- **Set of contributors:** 0xb794f5ea0ba39494ce839613fffba74279579268 _(example Ethereum address)_ -- **Scope of work:** IPFS ∧ ¬ go-ipfs -- **Time of work:** 2013-01-01 --> 2013-12-31 -- **Scope of impact:** All -- **Time of impact:** 2013-01-01 --> indefinite -- **Rights:** Public display - -### Why should you care? - -We spend trillions of dollars every year on public goods via governmental agencies, foundations, private donations and corporate spendings; however, we don’t effectively track this work – leaving us in the dark, hoping that it actually has the intended positive impact. - -We believe we can do better: - -- We should start by tracking this work consistently – this is what hypercerts are for. -- We should evaluate how impactful that work was – this is what the open evaluation system of hypercerts supports. -- We should reward the work that was exceptionally impactful – this is what the public display of hypercerts and retrospective funding is for. - -Doing this would unfold powerful incentives. Retrospective funding 1) provides incentives for creators to take on public goods projects with a potentially high, but uncertain, impact, 2) enables feedback loops to learn from successes and failures, and 3) attracts more talent to the public goods sector by improving performance-based compensation. - -While we are excited about the prospects of retrospective funding, hypercerts do not impose any specific funding mechanisms, but start with tracking the work that is supposed to be impactful. As a database for many funding mechanisms this facilitates experimentation and interoperability between funding mechanisms. - -### Next - -Curious and want to learn more? Head over to the [whitepaper](whitepaper/whitepaper-intro.md) to dive deeper into the world of hypercerts. - -Or do you want to get started right away? Head to the [minting guide](minting-guide/minting-guide-start.md). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md deleted file mode 100644 index 1ad2310a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: Gitcoin Alpha Round Instructions -id: gitcoin-round -sidebar_position: 3 ---- - -# Gitcoin Alpha Round Instructions - -## Overview - -- all projects in the Gitcoin Alpha Round are invited to mint a hypercert for their work -- anyone who gave over $1 to a project is automatically allowlisted for that project’s hypercert -- 50% of each hypercert is distributed to the funders, 50% is kept by the project and can be transferred later -- each project has a custom URL to make minting super easy (the link is sent directly to each project) -- everything runs on Optimism (users only need to pay L2 gas costs) - -:::info -If your project participated in the Gitcoin Alpha Round, but you didn't get a message with a custom URL, please reach out to team[at]hypercert.org. -::: - -## Hypercerts x Gitcoin Alpha Round - -Now that Gitcoin’s Alpha Round has officially closed and the funding distribution is finalized, we are inviting all eligible projects that participated to mint a hypercert for their past work and to allocate fractions of their hypercert to a list of supporters. - -We’ve created a dApp that pulls all of the data required to mint your hypercert directly from Gitcoin’s Grant Protocol. You can fine-tune the properties, tweak your artwork, and review the distribution mechanism. Once you’re ready, hit the create button and your hypercert will be released into the ethers! - -Once your hypercert has been minted, the people who supported your project with a contribution of at least $1 DAI on Gitcoin’s Alpha Round will be able to connect and claim their fractions. - -A few important notes about the Alpha Round: - -- The total units of a hypercert is based on the total donations; each funder get awarded units proportional to their donations. -- Transfers will be restricted to one transfer from the project to the supporters. -- There will be no additional rights awarded to the funders except the right to "public display" their support for the project. - -## Instructions - -The following guidance is only for projects that receive a custom URL that pre-populates the hypercerts form based on their Gitcoin Grants' data. - -It explains the default settings in the form and recommends fields that the creator may choose to update or edit. - -:::note -Gitcoin Grant hypercerts are for retrospective work, i.e., they are intended to capture work that happened between Gitcoin Grants Round 15 (September 2022) and the Alpha Round (January 2023). Therefore, the work time period is always set to past dates. (You might need to adjust the name and description to also refer to past work only.) We are focusing solely on retrospective hypercerts for this round as part of broader efforts to promote retrospective funding; you can read more about it [in the whitepaper](whitepaper/retrospective-funding.md). -::: - -### General Fields - -#### Name of Hypercert - -This field is set by default to the name of your project on Gitcoin Grants. You can edit this to be more specific. Given that your project may create numerous hypercerts over time, consider giving each hypercert a name that represents a more discrete phase or output. - -#### Logo - -This field is set to the icon artwork provided for your project on Gitcoin Grants. If there was an error accessing your icon, you will see a generic icon. - -You can update this by providing a new URL and the hypercert artwork should update automatically. - -Logo images look best with an aspect ratio of 1.0 (square-shaped). - -#### Background Banner Image - -This field is set to the banner artwork provided for your project on Gitcoin Grants. If there was an error accessing your banner, you will see a generic Gitcoin banner. - -You can update this by providing a new URL and the hypercert artwork should update automatically. - -Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. - -#### Project Description - -This field is set by default to the description of your project on Gitcoin Grants. Review closely -- a long project description in your Gitcoin Grant description will be truncated. - -You may edit this to provide more details about your work and to remove information that is targeted solely at Gitcoin Grants users. This is also a good place to provide other links, such as Github repos or social media accounts, where the general public can learn more about the work. Please aim for a project description that is less than 500 characters. - -:::note -The project description should refer to **past work**, not future work that you would like to do with additional funding. -::: - -#### Link - -This field is set to the first external URL provided for your project on Gitcoin Grants. You can update this. - -### Hypercert Fields - -#### Work Scope - -This field is set by default to a **shortened version** of the name of your project on Gitcoin Grants. You may edit or add additional work scope tags. - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -#### Work Start/End Dates - -The start date has been set by default to the `2022-09-22` for all projects on Gitcoin Grants. This date coincides with the end of Gitcoin Grants Round 15. - -The end date references the last update to your grant page on Gitcoin Grants. - -You may edit or update these fields, however, the end date may not extend beyond `2023-01-31` (the close of the funding round) as all hypercerts will be retrospective in this round. - -#### Set of Contributors - -This field is set by default to the wallet address that is set as the recipient address for receiving Gitcoin Grants funding. - -:::note -You should review this field closely and – if applicable – provide the addresses of additional contributors. -::: - -### Advanced Fields - -#### Impact Scope - -This field is set by default to `all`. - -Updates are currently disabled on the frontend because funding decisions on Gitcoin Grants were not specific to an impact scope or impact time period. - -#### Impact Start/End Dates - -This field is set by default to the work start date of `2022-09-22` (see above) and a work end date of `indefinite`. Updates are currently disabled on the frontend. - -#### Rights - -This field is set by default to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. - -Updates are currently disabled on the frontend. - -### Distribution - -#### Allowlist - -This field is set by default to a custom allowlist generated for each project based on the funding it received on the Gitcoin Grants Alpha Round. You should not need to update this field. If there is a problem with your allowlist, please contact us. - -50% of the hypercert will be allocated according to this allowlist. The other 50% will be kept by the project, i.e. it is allocated to the address that mints the hypercert. You will be able to transfer or sell these fractions later as long as they are owned by the minter. This means that they can only be transferred or sold once. - -The formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. - -For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.96 donated --> 1 fraction -- $0.52 donated --> 0 fractions - -The queries used to generate the allowlists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -Donors who contributed to the matching pool for each round are also eligible to claim hypercerts. - -:::note -You are free to edit your allowlist. You can do this by following the step-by-step instructions [here](minting-guide/step-by-step.md). Just remember that you will need to upload the new allowlist in a CSV format to a storage site like [web3.storage](https://web3.storage) and then update the link in the allowlist field. Contact team[at]hypercerts.org if you need help. -::: - -### Confirmations - -#### Contributors' permission - -Every contributor needs to agree to have their contribution be represented by a hypercert. This is why the person minting the hypercert has to confirm to have the permission of all listed contributors. - -#### Terms & Conditions - -The terms & Conditions can be found [here](https://hypercerts.org/terms). - -### Final step: Click "Create" - -Make sure your Optimism wallet or multi-sig is connected. Click on "create" and wait for your hypercert to be created. Congratulations! diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md deleted file mode 100644 index 47e8ad7c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Getting Started -id: minting-guide-start -sidebar_position: 1 ---- - -# Getting started - -### How to create a hypercert - -Creating a hypercert is similar to creating an NFT on sites like OpenSea or Zora. - -In this article, we’ll walk through the steps one by one and explain exactly what you need to do to create your first hypercert. - -There are typically two ways of creating a hypercert: - -1. As a project affiliated with a specific funding network (e.g., Gitcoin Grants): In this case, you should receive a custom URL from the funding network that pre-populates most of your hypercert fields. You will still be able to change most of these, so you should review and adjust them as needed to better describe your hypercert. Guidance on how to do so (for Gitcoin Grants projects) is provided at the end of this doc. -2. As a project not affiliated with a specific funding network: In this case, you will be creating a hypercert from scratch and filling in each field on your own. Read on below. - -### Who can create a hypercert? - -Anyone doing work that is intended to have a positive impact can create a hypercert. Your hypercert can be as simple as "I did X on this date and want to claim all future impact from it". - -It can also represent something more, such as a phase in an ongoing team project, an invention or discovery, a research publication, or an important software release. - -Critically, if the work was done by more than one person, then each person should be listed as a contributor to the hypercert and approve the creation of the hypercert. - -_Note: In the future, the approval of each contributor will be verified on-chain._ - -### What do I need to create a hypercert? - -You will need to prepare all of the information required in the form builder (see **Step-by-step instructions for creating a hypercert** below). This includes important metadata, such as a description of the project and the dimensions of your impact claim, as well as a project artwork. You may also want to include an allowlist of wallets that are approved to claim one or more fractions of the hypercert. - -In addition to the information regarding the hypercert itself, you’ll need a crypto wallet to mint your hypercert. “Minting” a hypercert is the process of writing an impact claim to the blockchain. This establishes its immutable record of authenticity and ownership. - -Next, choose a blockchain on which to mint your hypercert. The hypercerts protocol is available on Ethereum, Goerli (testnet), and Optimism. Each of these blockchains has different gas fees associated with transactions on their networks. To reduce gas fees we recommend Optimism for most projects. - -Finally, go ahead and create your hypercert. - -### How much does it cost to create a hypercert? - -You will need enough Ethereum in your wallet to cover gas fees. In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). - -The protocol currently does not offer gas-free or "lazy" minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md deleted file mode 100644 index 9f3b6303..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Step-by-step Instructions -id: step-by-step -sidebar_position: 2 ---- - -# Step-by-step instructions - -First, go to the [Create Hypercert](https://hypercerts.org/app/create) site with a wallet-enabled browser or follow the custom URL you received to access a prepopulated form. - -Although the site works on mobile, it is easier to use on desktop because the browser will display a dynamic preview of the hypercert while you fill out the Create form. - -Next, connect your wallet. You will be prompted to switch to the Ethereum or Optimism network. - -Once you've connected, you will see an empty form for creating a hypercert. - -### General fields - -#### Name of Hypercert - -Enter the name or title of the hypercert. This is the place to be verbose and specific about what the project is doing. You'll see on the preview when your title becomes too long. - -Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. - -Names are restricted to 100 characters but may include emojis (:smile:), accents (é), non-Latin scripts (表情), and other Unicode characters. - -#### Project Description - -Enter a human readable description of the hypercert. This is the place to share more details about the work and the team or individual behind the work. - -The description field supports [Markdown syntax](https://www.markdownguide.org/cheat-sheet/) and has a limit of 10,000 characters. - -In addition to the main link (see next field) you can add further links in the markdown to help others to understand the work of the project. - -#### Link - -A valid URL for the project, beginning with https:// - -This will be displayed next to the hypercert on webpages like OpenSea and should link users to a page that has more information about the project or impact claim. - -#### Logo - -An icon for the top left part of the card. This could be your project logo. It will be automatically masked to the shape of a circle. - -Logo images look best with an aspect ratio of 1.0 (square-shaped). - -The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. - -#### Background Banner Image - -A background image that will extend across the upper half of the artwork. This could be your project masthead or a unique piece of art. - -Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. - -Currently we don't support zoom / cropping, so you will need to test the look and feel on your own. - -The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. - -### Work Scope fields - -#### Work Scope - -One or multiple tags describe the work that the hypercert represents. This work scope will be used to identify the work that is included in the hypercerts and the work that is not included. - -Multiple tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -_Note: In the future, you will be able to specifically exclude work from the hypercert._ - -#### Start and End Date of Work - -The work time period defines when the work was done that the hypercert represents, i.e., only the work in this time period is included in the hypercert. - -The time period of work doesn't need to be the start and end date of a project, but it can be. One project can be split up into multiple hypercerts, e.g. all hypercerts can have the same `work scope`, but different time periods of work. Of course, the time periods are not allowed to overlap. - -### Impact scope fields - -#### Impact Scope - -The impact scope can be used to limit the impact that a hypercert represents, e.g. for the work scope `Planting trees` a hypercert can represent _only_ the impact on biodiversity by including the impact scope tag `Biodiversity`. This would exclude all other impacts, including the impact on CO2 in the atmosphere, which can be useful if that impact is already captured by a carbon credit. - -By default this is set to "`all`" and we strongly recommend keeping it that way. - -Just like the work scope, multiple impact scope tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction). - -#### Start and End Date of Impact - -The impact time period is another way to limit the impact that a hypercert represents, e.g. inventing a new medical treatment has a positive impact over many years, but we might want to capture the positive impact separately for each year. - -By default the `impact start date` is the same as the `work start date` and the `impact end date` is "`indefinite`", i.e., the impact is not restricted time-wise. We strongly recommend keeping it that way. - -### Set of Contributors - -Provide a list of contributors, one per line, or comma-separated. - -The list should include _all_ contributors that performed the described work. - -Contributors are generally itemized as wallet addresses or ENS names, but can also be names / pseudonyms. Groups of contributors can be represented by a multisig or name of an organization. - -### Owners - -#### Allowlist - -The allowlist allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions afterwards. For example, it can be used to allocate fractions to previous funders and contributors. - -The allowlist is implemented as a CSV file specifying `index,address,price,fractions` headers. - -| index | address | price | fractions | -| ----- | ------------------------------------------ | ----- | --------- | -| 0 | 0x5dee7b340764c49a827c60d2b8729e49405fbefc | 0.0 | 100 | -| 1 | 0x1e2dbb9ca3f6d48e085384a821b7259abfdc7d65 | 0.0 | 50 | -| ... | ... | ... | ... | -| 999 | 0x436bad18642f45d3fa5fcaad0a2d81764a9cba85 | 0.0 | 1 | - -The `price` field is denominated in ETH. This should remain at 0.0 for all hypercerts, as primary sales are not currently supported through the app and the secondary sale/transfer of hypercerts is currently not allowed. - -You can store your allowlists on IPFS using [web3.storage](https://web3.storage/). - -:::note -If your allowlist is not properly formatted, you will be unable to mint your hypercert. If you do not include an allowlist, then the creator of the hypercert will receive 100% of the hypercert (set to a default of 10,000 units), which you can then sell or transfer to another wallet a maximum of one time. -::: - -#### Rights - -This field defines the rights that owners of the hypercert have over the work being claimed by this hypercert. - -By default this is set to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. - -_Note: In the future, additional rights can be included for different hypercerts._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md deleted file mode 100644 index 87fb9194..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Open Impact Evaluations -id: evaluation -sidebar_position: 5 ---- - -A key design element is that hypercerts themselves do not make a claim about the size of the impact, but only account for the work that is supposed to be impactful. The figure below shows this contrast in a simplified illustration of the example that we introduced above. The open evaluation system allows multiple evaluations to point at the same area of the impact space that a hypercert claims. The evaluations can include self-evaluation from the contributors themselves. Funders observe these and make their funding decisions based on this richer set of information. - -![hypercert evaluations](../../static/img/hypercert_evaluations.png) - -The open evaluation system is also used to provide additional information, e.g. an evaluator or the project itself provides information about the health of the trees. This information can then be used transparently by other evaluators to evaluate the impact on CO2 in the atmosphere. - -An important feature is that the evaluations do not directly point at a hypercert, but rather at an area in the impact space. In practice this area will mostly be the exact same area that a hypercert claims, such that it can be considered an evaluation of the hypercert, but it does not have to. This feature ensures that, if hypercerts are merged or split, previous evaluations will continue to be linked appropriately. - -The form of evaluations can be standardized to simplify handling and comparing multiple evaluations from multiple evaluators. The open evaluation system allows for templates to be created and used by any evaluators. Similar to the emerging ontologies, these are not enforced centrally, but should emerge as useful standards – potentially steered by decentralized governance institutions. - -Important characteristics of the open evaluation system are: - -- Evaluators can submit multiple evaluations of the same area in the impact space as more information becomes available -- Evaluations can challenge other evaluations -- Evaluation methodologies can evolve over time - -These features allow the whole evaluation system to be dynamically improved by each actor. The relevant incentives for this improvement will stem from the funders who will value the signals from some evaluators more than others and evaluators are able to build up reputation. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md deleted file mode 100644 index 8acc11d1..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: "Hypercerts: a New Primitive for Impact Funding Systems" -id: hypercerts-intro -sidebar_position: 3 ---- - -### Defining hypercerts - -A hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and represents all or parts of that impact. A hypercert has the following fields (one for each dimension): - -1. **Set of contributors:** An ordered list of all contributors, who claim to do or have done the work described by this hypercert. -2. **Scope of work:** A conjunction of potentially-negated work scope tags, where an empty string means “all”: - -``` - ::= AND | " " - ::= | NOT -``` - -3. **Time of work:** A date range, from the start to the end of the work being claimed by this hypercert. -4. **Scope of impact:** A conjunction of potentially-negated impact scope tags, where an empty string means “all”: - -``` - ::= AND | " " - ::= | NOT -``` - -5. **Time of impact:** Date ranges from the start to the end of the impact. -6. **Rights of the owners:** An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. - -Implementing hypercerts as a semi-fungible token allows multiple contributors and funders to own parts of hypercerts. For instance the original contributors can award 10% of a hypercert to a funder, while keeping 90%, which they can award to other funders later. This is why hypercerts are fractionalizable. - -### Examples - -In the simplest cases of hypercerts, the scope of work and impact as well as the time of impact are not restricted and no rights are transferred to owners of the hypercerts, i.e. the hypercerts just define the who (set of contributors) and when (time of work) of the claimed work. Scope of work and impact would be set to all, time of impact to “indefinite” and the rights to only “public display of support”. The latter is always included as the hypercert is a public record, such that owners will always automatically display their support of the work. - -Take for example hypercert 1 below: It represents all work that contributor 1 has performed in 2013 with all the impact that the work had from the beginning of the work; the hypercert doesn’t give any additional rights to the owners of the hypercert. - -The other fields – except the rights field – can be used to limit the work or impact that is represented by the hypercert. Hypercert 2 limits this to the work on IPFS in 2013, i.e. any other work besides IPFS that contributor 1 performed is not included. Hypercert 3 limits it even further as it excludes a specific aspect of IPFS, the go-ipfs implementation. - -| | **Hypercert 1** | **Hypercert 2** | **Hypercert 3** | -| ----------------------- | ------------------------- | ------------------------- | ------------------------- | -| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | -| **Scope of work** | all | IPFS | IPFS ∧ ¬ go-ipfs | -| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | -| **Scope of impact** | all | all | all | -| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → 2013-12-31 | -| **Rights** | Public display of support | Public display of support | Public display of support | - -In the table below we illustrate a use case for limiting the scope of impact. Suppose contributor 1 protects trees in a certain area. This work has positive effects on the CO2 in the atmosphere and could turn into carbon credits; however, the trees have additional positive impacts, such as protecting biodiversity. Instead of including all positive impacts in one hypercert (hypercert 4), the impact can be split between the impact on CO2 in the atmosphere (hypercert 5) and all other positive impacts (hypercert 6). If funders are willing to pay for biodiversity, this would be a new income opportunity. And it would account for the additional positive impact that other methods of reducing CO2 might not have, like industrial carbon capture. Importantly, negative impacts can not be excluded from a hypercert. - -| | **Hypercert 4** | **Hypercert 5** | **Hypercert 6** | -| ----------------------- | -------------------------- | -------------------------- | -------------------------- | -| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | -| **Scope of work** | Protecting trees in area X | Protecting trees in area X | Protecting trees in area X | -| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | -| **Scope of impact** | all | CO2 in atmosphere | all ∧ ¬ CO2 in atmosphere | -| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → indefinite | -| **Rights** | Public display of support | Public display of support | Public display of support | - -Importantly a hypercert does not specify the “size” of the impact, e.g. a hypercert does not state “5 tons of CO2 removed from the atmosphere.” Instead the hypercert only defines the work, e.g. “200 trees protected” (scope of work) in 2022 (time of work). The size of the impact is then left to the evaluations of the “CO2 in the atmosphere” (scope of impact) in 2022 (time of impact) that point towards the covered region of the hypercert. For instance: This allows a self evaluation to claim that 5 tons of CO2 were removed in a given year as well as one or multiple evaluations from independent auditors to confirm or challenge how much CO2 has been removed. An evaluator could detect that some of the trees were not healthy and hence only 4 tons of CO2 were removed. Allowing for multiple evaluation is a defining characteristic of the open evaluation system. - -### Functions of hypercerts - -#### 1. Identifiability - -Hypercerts clearly define the work that is supposed to be impactful by creating a record of who (set of contributors) claims to do or have done what (scope of work) in what time period (time of work). They also allow the creation of multiple records of the same work to identify separate impacts that this work had or will have (scope of impact) over specified time periods (time of impact). - -#### 2. Traceability - -As these records are public and logically monotonic (immutable, except to split or merge hypercerts), records are durable and permanent. - -#### 3. Transferability - -The records are a digital object that can be owned and ownership can be transferred (under specific conditions). As hypercerts can be created as fractionalizable, it is also possible to transfer only a specified fraction of the hypercert. Each hypercert defines the rights over the defined work that owners have, such as rights to retrospective rewards, rights to public display of the support (“bragging rights”) or rights to passive income from intellectual property. - -:::note Transferability restrictions - -Hypercerts are generally transferable. However, there are use cases, in which minters of hypercerts want to restrict how their hypercerts can be transferred. The protocol allows the minter to restrict who can transfer the hypercert and/or to whom the hypercert can be transferred. For instance, by specifying that only the original owner can transfer the hypercert, any future owner is prohibited from selling it, i.e. a secondary market would not exist for this hypercert. - -::: - -### Merging hypercerts - -Besides the fungible dimension, hypercerts can be merged and split on any of the six dimensions as shown in box 1. Let us take the hypercert 1 from the section "Hypercerts definition" and focus only on two of the dimensions, scope of work and time of work. These two dimensions create a simplified impact space. The figure below shows how work on IPFS (InterPlanetary File System) could have been minted over time in separate hypercerts, one for each quarter of work. - -![minting hypercerts example](../../static/img/creating.png) - -We created five hypercerts, one for each quarter of work. As the resulting work of all of these together is IPFS 0.1, the merged hypercert in total is more meaningful and more valuable than just the five individual hypercerts. In this case the proverb is true, the whole is greater than the sum of its parts. Hence, we want to merge them as shown in the next figure. - -![merging hypercerts example](../../static/img/merging.png) - -### Splitting hypercerts - -Conversely, splitting can increase the meaningfulness and value of hypercerts as well. We can split the work on IPFS 0.1 into the conceptual work “invention of IPFS” and the implementation via “go-ipfs 0.1” as shown in the next figure. - -![splitting hypercerts examples](../../static/img/splitting.png) - -Other use cases are where multiple contributors want to combine their work on the same scope of work (merging) or disentangle their work (splitting). Ultimately, splitting and merging allows users to repackage the digital representation of their work and impact. - -Importantly, splitting and merging are the only operations that are permitted to change hypercerts. Once an area in the impact space is claimed, it can not be unclaimed. This ensures that claims are never forgotten. - -### Retiring hypercerts - -While a claim in the impact space can not be unclaimed, it can be retired. Retiring a hypercert means that owners can not transfer and sell it anymore. This way owners prove that they are the final buyers of the impact. Technically retiring hypercerts means that they are sent to a specific null address, which ensures that the retired hypercerts are recorded and traceable. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md deleted file mode 100644 index 6f71ac50..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: The Need for Interoperable Impact Funding Systems (IFSs) -id: ifs ---- - -# The Need for Interoperable Impact Funding Systems (IFSs) - -### An IFS consists of - -- **Actors:** Contributors, funders, evaluators, and beneficiaries -- **Funding mechanisms:** Grants, bounties, retrospective funding, etc. -- **Coordination mechanisms:** Roadmapping, communication forums, etc. -- **A goal:** Maximize the domain-specific positive value created (impact) - -The goal will be specific to the impact area, e.g. prevent existential risks from artificial intelligence (AI) would be the goal for the impact area “AI safety.” To achieve these goals, skilled contributors must work with high effort on promising projects. Additionally, for those projects that create impact continuously, sufficient income streams are necessary to cover both their ongoing operating expenses and contributors’ upside incentives. - -#### Actors in IFSs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeSubtypeDescription
    ContributorsPeople or organizations who do the work
    FundersProspective fundersPeople or organizations who fund work before it is done
    Retrospective fundersPeople or organizations who fund work after it is done
    EvaluatorsScoutsPeople or organizations who evaluate the potential impact of work before it is done
    AuditorsPeople or organizations who evaluate the impact of work after it is done
    BeneficiariesPeople or objects that are impacted by the work
    - -### Guiding questions for designing IFSs - -1. **Projects:** How can we improve the chances that the most promising projects are worked on? -2. **Talent & resources:** How can we attract top talent to contribute to the most promising projects and provide them with the necessary resources? -3. **Effort:** How can we reward contributors for their impact on outcomes? -4. **Sustainable income:** How can we create recurring income streams and financial sustainability for impactful projects? - -Markets have been proven very powerful in answering these questions if they are directed towards maximizing profits. As we are directing systems towards maximizing impact, these answers become more challenging. In particular, in an IFS we are facing coordination and incentive problems in funding impact, such as the free-rider problem. - -### Example dynamics between actors in an IFS - -In order for impact funding systems to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources and (3) evaluations. In the diagram below you see a potential dynamic between the actors of an IFS. In that scenario hypercerts can account for the prospective funding (steps 2-3) as well as for the retrospective funding (steps 8-9) from different funders. Evaluations are made public and can be discovered through the hypercerts for all funders (steps 5-7). Retrospective funders can reward not only the contributors but also the prospective funders (steps 10-11). - -```mermaid -sequenceDiagram - autonumber - participant Beneficiaries - participant Contributors - participant Prospective funders - participant Retrospective funders - participant Evaluators - Contributors ->> Contributors: Mint hypercerts - Prospective funders ->> Contributors: Award funding - Contributors ->> Prospective funders: Award fractions of
    the hypercert - Contributors ->> Beneficiaries: Create impact - Retrospective funders ->> Evaluators: Fund evaluation - Evaluators ->> Beneficiaries: Evaluate impact on beneficiaries - Evaluators ->> Retrospective funders: Make evaluations public,
    esp. for retrospective
    funders - Retrospective funders ->> Contributors: Award funding - Contributors ->> Retrospective funders: Award fractions of hypercerts - opt - Retrospective funders ->> Prospective funders: Award funding - Prospective funders ->> Retrospective funders: Transfer fractions
    of hypercert - end -``` - -### Hypercerts as a data layer for IFSs - -By serving as a single, open, shared, decentralized database hypercerts lower the transaction costs to coordinate and fund impactful work together. This is important because the optimal funding decisions of a single funder depends on the funding decision of all other funders. For instance, some work is only impactful if a minimum funding is provided: The impact is non-linear in the funding amount, e.g. half a bridge is not half as impactful as a full bridge. Other work might be over-funded, i.e. the impact of an additional dollar is basically zero. Ultimately, funders want to find the highest impact for each additional dollar spend (cf. S-process as in Critch, 2021). Today multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Through hypercerts the funding becomes more transparent and the credits for funding impactful work can be easily shared. Coordinating funding becomes easier. - -Hypercerts don’t solve this coordination problem by themselves, but build the basis for different decision and funding mechanisms as shown below. Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. Hypercerts do not lock in any particular decision-making scheme for funders. - -![Hypercerts as a data layer for an IFS](../../static/img/hypercert_data_layer.png) - -Looking farther into the future: If a large majority of funding across an entire IFS ends up flowing through hypercerts, funders have created the transparency that enables each of them to make the best decisions given the funding decision of everyone else. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md deleted file mode 100644 index f8fed762..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: A Consistent Impact Space -id: impact-space -sidebar_position: 4 ---- - -Every hypercert represents a claim in the impact space, which itself represents all possible claims. Above we illustrated the impact space with two dimensions, scope and time of work. The complete impact space is spanned by the six dimensions introduced in the definition of hypercerts. - -### Consistency of the impact space - -Every point in the impact space should either be claimed or not be claimed. No point must be claimed twice, or equivalently: - -- If the impact of some work is represented in one hypercert, it must not be part of any other hypercert. -- Hypercerts must not overlap with each other. - -The table below shows two hypercerts that were illustrated in the section on "Hypercerts operations", but now with all six fields. The two hypercerts can represent the exact same work by the same contributor, but they do not overlap because of the difference in the time of work. - -| | **Hypercert 7** | **Hypercert 8** | -| ----------------------- | ------------------------ | ------------------------ | -| **Set of contributors** | Contributor 1 | Contributor 1 | -| **Scope of work** | IPFS | IPFS | -| **Time of work** | 2013-10-01 to 2013-12-31 | 2014-01-01 to 2014-03-31 | -| **Scope of impact** | all | all | -| **Time of impact** | 2013-10-01 → indefinite | 2014-01-01 → indefinite | -| **Rights** | None | None | - -The consistency of the impact space is crucial as it ensures that no rights to an impact claim are sold twice. If for example someone owns the right to retrospective rewards for the impact of some work, the owners must be identifiable unambiguously. - -Because users can create hypercerts with arbitrary data on any chain, on which a hypercert contract is deployed, we provide ways to help users detect collisions in the impact space. For example, if one hypercert on Ethereum points to the work on “IPFS”, and another hypercert on Filecoin points to the work on “https://github.com/ipfs/go-ipfs” both with the same contributor and time of work, which of these overlapping hypercerts is the correct one to support? To surface such overlapping hypercerts, the hypercerts protocol and SDK will support mechanisms to index, search, and visualize neighbors in the impact space. With these tools evaluators can quickly detect potential conflicts and submit the results as evaluations to help disambiguate proper credit and attribution. - -### Emerging ontologies - -Common ontologies for the scope of work and scope of impact are useful to create transparency and improve discoverability. Such ontologies need to be created from the practices and should be adapted over time. They are like emerging norms, instead of fixed rules. However, some larger players or a group of smaller players could enforce certain ontologies, e.g. if multiple funders agree that they only fund projects that follow a specified ontology. - -As some ontologies might be more useful than others, we would ideally see a consensus emerge between participants and experts in each impact area. Decentralized governance institutions can help facilitate this; however, further details on the design are out of the scope of this paper and are left for future work. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md deleted file mode 100644 index 57444581..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Retrospective Impact Funding -id: retrospective-funding -sidebar_position: 6 ---- - -### Introducing retrospective funding - -While hypercerts do not impose any specific funding mechanisms, they are especially useful for retrospective funding. The core idea, from the perspective of contributors building impactful goods, is this: if you can reasonably expect to get funded retrospectively for your work once you produce a positive impact, then you can work now, in expectation of a probabilistic future cash flow. In another conception, you are effectively “borrowing” money from this anticipated future cash flow to fund the work in the first place; the expectation of future funding “retro-causes” the impactful work. Retrospective funding may be able to 1) provide incentives for contributors to take on impactful goods projects with a potentially high, but uncertain, impact and 2) create a more efficient IFS by back-propagating signals on what outcomes were impactful post-hoc. - -In addition, contributors are able to receive fair compensation by providing outsized impact that will be highly valued. It incentivizes you to create a positive impact, beyond your intrinsic motivation. This does not mean that the most successful contributors to impactful goods automatically have potential upside comparable to some for-profit startup founders (or that they should), just that their potential upside does depend on how much funders later value their past work. This will attract more talent to the impact sector by improving performance-based compensation. - -The crucial aspect for this to work: funders need to retrospectively fund impact, and send credible signals that they will do so in the future. Based on these signals contributors form expectations about future retrospective rewards and can start working today to receive them in the future. - -Hypercerts facilitate retrospective funding as the impact claims are identifiable, traceable and transferable. Contributors can sell parts of their hypercerts to prospective funders to receive the necessary funding for their project (“activity” in the figure below). The project delivers impact to a larger group (“beneficiaries”), which retrospectively buys the hypercerts from the prospective funder, and from the contributors if they retained some fraction of their hypercerts (the latter is not represented in the figure). - -![Retrospective funding with hypercerts](../../static/img/retrospective_funding.png) - -### Increasing rewards - -Retrospective funding allows us to increase rewards as more impact is created because impact is easier to observe, measure and prove retrospectively. Increasing rewards – as shown in the next figure – incentivizes contributors to put in their highest effort to produce impact and enables contributors to be rewarded for their talent. Moreover, prospective funders are incentivized to select, fund and support the projects with the highest expected impact, if they also receive retrospective rewards. - -![Increasing rewards](../../static/img/increasing_rewards.png) - -Note that retrospective funding should not be used in cases where a significant negative impact is possible since a nongovernmental, permissionless framework can not impose retrospective penalties for negative externalities. See Ofer & Cotton-Barratt (2022) for a discussion of this limitation of retrospective funding. - -In some cases we do not expect the retrospective evaluation to be any different than the prospective evaluation, i.e. there is no uncertainty resolved over time as the impact of an activity is already “known” prospectively. In these cases retrospective funding would only complicate the funding mechanism and funding via grants or milestone bounties would be preferable. Retrospective funding is preferable only if uncertainty is resolved over time. - -### Impact evaluations - -The relevance of impact evaluations will depend on how much their signals influence the funding decisions of retrospective funders (see the potential dynamics in the section on "IFSs"). This is a critical difference to many impact reports today: If a project was funded by a grant, the funders as well as the project want to receive a positive evaluation. If, however, the funding decisions of the retrospective funders are outstanding, they are interested in truthful signals about the impact. Hence, funders value improvements in evaluation methodologies and can fund independent evaluators. Evaluators in turn would build up a reputation for their evaluation methodologies and improve the strength of their signals to retrospective funders. - -Impact evaluators can take on a range of forms ranging forms, such as - -- Voting by relevant communities or beneficiaries -- Expert panels -- Professional evaluators similar to financial rating agencies -- Automatic monitoring and data collection by sensors and oracles - -The most useful form or combinations thereof will depend on the specific requirements of the impact area. For a generalized framework on impact evaluators see Protocol Labs (2023). - -While retrospective funding makes impact evaluations financially relevant for funders and contributors, hypercerts enable to pre-commit funding for those evaluations: As impact claims are never forgotten, any actor can at any time commit funding to a future evaluation of these claims. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md deleted file mode 100644 index 4d4648ba..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Introduction -id: whitepaper-intro ---- - -# Vision & Whitepaper - -:::note - -If you prefer to read the draft whitepaper (v0) as a pdf, you can find it [here](../../static/pdf/hypercerts_whitepaper_v0.pdf). The content is mostly identical to the following pages. - -::: - -#### The world faces unprecedented challenges, from climate change to safe artificial intelligence, that require billions to trillions of dollars of public goods funding. - -High-upside/high-uncertainty endeavors are often overlooked due to the absence of strong incentives to pursue them in the dominant public goods funding framework of at-cost grants or even a milestone-bounty framework (which directly exposes small contributors to aversive risk levels). Yet these should be pursued when the expected positive value is very high, as it often is. New impact funding mechanisms can address this. One such mechanism is retrospective funding, which rewards projects based on the impact they create after the impact is observable. If projects can reasonably expect such retrospective rewards, they are incentivized to maximize their impact and – together with prospective funders – take risky bets when the expected positive value is high. - -#### In order for Impact Funding Systems (IFSs) to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources, and (3) evaluations. - -Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. We do not wish to lock in any particular decision-making scheme for funders. Without mechanisms like these, multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Funders should be able to easily collaborate with other funders or to intentionally fund different projects to diversify the funded approaches. Evaluators should be able to evaluate the same impact with different methodologies – potentially with conflicting results, to foster rigor and progress of evaluation methodologies. - -#### Hypercerts create this interoperability by serving as a single, open, shared, decentralized database for impact funding mechanisms. - -A single hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and whose ownership is fractionizable and transferable (under specific conditions). Hypercerts do not impose any specific funding mechanisms but provide baseline invariant guarantees such that claims will not be forgotten as different mechanisms come into and out of fashion. This is also why hypercerts are especially useful for any retrospective funding mechanisms – funding can be applied to claims of the past. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/about.md b/docs/versioned_docs/version-1.0.0-alpha.1/about.md deleted file mode 100644 index e2d4eb79..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/about.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: The Hypercerts Foundation -id: about ---- - -# The Hypercerts Foundation - -### Mission - -The mission of the Hypercerts Foundation is to advance the development and adoption of open-source protocols for funding and rewarding positive impact. - -### Organization - -The Hypercerts Foundation is a fully independent organisation working closely with stakeholders in the open source, scientific research, and cryptography communities to develop and promote additional protocols that are decentralized, secure, and transparent. The Foundation will also provide support and resources to help drive the wider adoption of these protocols. - -### History - -Research on hypercerts was first presented to the public by David A. Dalrymple at the conference series Funding the Commons in March 2022. However, the concept of “impact certificates” has been a recurring theme at conferences and in online discussion forums since at least 2014. In late 2022, a small team of research scientists, developers, and practitioners began implementing hypercerts as a set of Ethereum-based smart contracts that could be used to assert and fund impact claims. The Hypercerts Foundation will now serve as the long-term home for this work. - -The new foundation is supported in part by Protocol Labs and is part of the broader Protocol Labs Network of hundreds of companies and organizations. The Foundation will complement Protocol Labs Network’s mission of enabling a more secure, open, and accessible internet. The Hypercerts Foundation, however, is fully independent and will focus on protocol development and cultivating a community of developers and impact entrepreneurs well beyond the Protocol Labs Network. - -### Further links - -Read the full [announcement of the Hypercerts Foundation](https://hypercerts.notion.site/Introducing-the-Hypercerts-Foundation-d956203fe0fc4792980da138015e770a). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md deleted file mode 100644 index bc65b116..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md +++ /dev/null @@ -1,101 +0,0 @@ -# Allowlists - -Allowlists are an efficient way to enable distribution of hypercert fractions amongst a group. -First, the creator will create the hypercert with the metadata and an immutable allowlist. -With the `claimId`, every account specified in the allowlist can later mint their fraction token from that allowlist. - -## Create an allowlist - -First specify an allowlist, mapping addresses to the number of units they should receive. - -```js -import { - TransferRestrictions, - formatHypercertData, - Allowlist, -} from "@hypercerts-org/sdk"; - -const allowlist: Allowlist = [ - { address: "0x123", units: 100 }, - { address: "0xabc", units: 100 }, -]; -``` - -Then, call `createAllowlist` with the metadata and allowlist. - -```js -const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; -const transferRestrictions = TransferRestrictions.FromCreatorOnly - -const { claimId } = await hypercerts.createAllowlist({ - allowList, - metaData, - totalUnits, - transferRestrictions: TransferRestrictions.FromCreatorOnly, -}); -``` - -> **note** We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree generation and data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree) - -It first checks if the client is writable and if the operator is a signer. If the operator is not a signer, it throws an `InvalidOrMissingError`. - -Next, it validates the allowlist and metadata by calling the `validateAllowlist` and `validateMetaData` functions respectively. If either the allowlist or metadata is invalid, it throws a `MalformedDataError`. - -Once the allowlist and metadata are validated, the method creates a Merkle tree from the allowlist and stores it on IPFS. It then stores the metadata on IPFS as well. - -Finally, the method invokes the `createAllowlist` function on the contract with the signer's `address`, the total number of `units`, the Merkle tree `root`, the metadata `CID`, and the `transfer restrictions`. If the method is called with `overrides`, it passes them to the createAllowlist function. - -## Claiming a fraction token - -Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: - -| Variable | Type | Source | -| -------- | ------------ | ------------ | -| claimId | BigNumberish | Hypercert ID | -| units | BigNumberish | Allowlist | -| proof | BytesLike[] | Merkle tree | - -We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. - -Then, call `mintClaimFractionFromAllowlist` with the required data. The contracts will also verify the proofs. However, when providing the `root` in the function input, the proofs will be verified before a transaction is submitted. - -```js -import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; - -const claimId = "0x822f17a9a5eecfd...85254363386255337"; -const address = "0xc0ffee254729296a45a3885639AC7E10F9d54979"; - -const { indexer, storage } = hypercertsClient; -const claimById = await indexer.claimById(claimId); -const { uri, tokenID: _id } = claimById.claim; -const metadata = await storage.getMetadata(uri || ""); -const treeResponse = await storage.getData(metadata.allowList); -const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); - -let args; -// Find the proof in the allowlist -for (const [leaf, value] of tree.entries()) { - if (value[0] === address) { - args = { - proofs: tree.getProof(leaf), - units: Number(value[1]), - claimId: _id, - }; - break; - } -} - -// Mint fraction token -const tx = await hypercerts.mintClaimFractionFromAllowlist({ - ...args, -}); -``` - -Let's see what happens under the hood: - -First, the method checks that the client is not `read only` and that the operator is a signer. If not, it throws an `InvalidOrMissingError`. - -Next, the method verifies the Merkle `proof` using the OpenZeppelin Merkle tree library. If a `root` is provided, the method uses it to verify the proof. If the proof is invalid, it throws an error. - -Finally, the method calls the `mintClaimFromAllowlist` function on the contract with the signer `address`, Merkle `proof`, `claim ID`, and number of `units` as parameters. If overrides are provided, the method uses them to send the transaction. Otherwise, it sends the transaction without overrides. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md deleted file mode 100644 index 4684053c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md +++ /dev/null @@ -1,84 +0,0 @@ -# AllowlistMinter - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -## Events - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -## Errors - -### DoesNotExist - -```solidity -error DoesNotExist() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md deleted file mode 100644 index 518efa42..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md +++ /dev/null @@ -1,895 +0,0 @@ -# HypercertMinter - -_bitbeckers_ - -> Contract for managing hypercert claims and whitelists - -Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. - -_Wrapper contract to expose and chain functions._ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### batchBurnFraction - -```solidity -function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenIDs | uint256[] | undefined | - -### batchMintClaimsFromAllowlists - -```solidity -function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable -``` - -Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - -_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| -------- | ----------- | ----------- | -| account | address | undefined | -| proofs | bytes32[][] | undefined | -| claimIDs | uint256[] | undefined | -| units | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256) external nonpayable -``` - -Burn a claimtoken; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| \_2 | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable -``` - -Batch burn claimtokens; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| \_2 | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address _account, uint256 _tokenID) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | - -### createAllowlist - -```solidity -function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Register a claim and the whitelist for minting token(s) belonging to that claim - -_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| merkleRoot | bytes32 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable -``` - -Merge the value of tokens belonging to the same claim - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------- | --------- | ----------- | -| \_account | address | undefined | -| \_fractionIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint a semi-fungible token for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimFromAllowlist - -```solidity -function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable -``` - -Mint a semi-fungible token representing a fraction of the claim - -_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| units | uint256 | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint semi-fungible tokens for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### name - -```solidity -function name() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### readTransferRestriction - -```solidity -function readTransferRestriction(uint256 tokenID) external view returns (string) -``` - -TRANSFER RESTRICTIONS - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### splitFraction - -```solidity -function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable -``` - -Split a claimtokens value into parts with summed value equal to the original - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| -------------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | -| \_newFractions | uint256[] | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_see { IHypercertMetadata}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | ----------- | -| \_uri | string | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md deleted file mode 100644 index e31e8840..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md +++ /dev/null @@ -1,434 +0,0 @@ -# HypercertTrader - -_bitbeckers_ - -> Contract for managing hypercert trades - -Implementation of the HypercertTrader Interface - -## Methods - -### batchBuyUnits - -```solidity -function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable -``` - -This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. - -_Buys Hypercert tokens from multiple existing offers in a single transaction._ - -#### Parameters - -| Name | Type | Description | -| ------------------- | --------- | -------------------------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerIDs | uint256[] | The list of IDs of the offers to buy from. | -| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | -| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | -| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | - -### buyUnits - -```solidity -function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable -``` - -This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. - -_Buys Hypercert tokens from an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | --------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerID | uint256 | The ID of the offer to buy from. | -| unitAmount | uint256 | The number of units to buy. | -| buyToken | address | The address of the token used for payment. | -| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | - -### cancelOffer - -```solidity -function cancelOffer(uint256 offerID) external nonpayable -``` - -This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. - -_Cancels an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ------------------------------ | -| offerID | uint256 | The ID of the offer to cancel. | - -### createOffer - -```solidity -function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | -------------------------------- | ----------- | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| unitsForSale | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -### getOffer - -```solidity -function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------- | ----------- | -| \_0 | IHypercertTrader.Offer | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### offers - -```solidity -function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | --------------------------------- | ----------- | -| offerer | address | undefined | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| unitsAvailable | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| offerType | enum IHypercertTrader.OfferType | undefined | -| status | enum IHypercertTrader.OfferStatus | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### totalUnitsForSale - -```solidity -function totalUnitsForSale(address, uint256) external view returns (uint256) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OfferCancelled - -```solidity -event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| creator `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OfferCreated - -```solidity -event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| offerer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Trade - -```solidity -event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| seller `indexed` | address | undefined | -| buyer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID | uint256 | undefined | -| unitsBought | uint256 | undefined | -| buyToken | address | undefined | -| tokenAmountPerUnit | uint256 | undefined | -| offerID | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -## Errors - -### InvalidBuy - -```solidity -error InvalidBuy(string) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### InvalidOffer - -```solidity -error InvalidOffer(string) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### NotAllowed - -```solidity -error NotAllowed() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md deleted file mode 100644 index 13a84632..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md +++ /dev/null @@ -1,39 +0,0 @@ -# IHypercertMinter - -## Methods - -### ownerOf - -```solidity -function ownerOf(uint256 id) external view returns (address) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 id) external view returns (uint256) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md deleted file mode 100644 index a4086e37..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md +++ /dev/null @@ -1,457 +0,0 @@ -# SemiFungible1155 - -_bitbeckers_ - -> Contract for minting semi-fungible EIP1155 tokens - -Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` - -_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------------------------------- | -| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | -------------------------------------------- | -| \_uri | string | The metadata URI for the specified token ID. | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md deleted file mode 100644 index 6be07157..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md +++ /dev/null @@ -1,77 +0,0 @@ -# AggregatorV3Interface - -## Methods - -### decimals - -```solidity -function decimals() external view returns (uint8) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ----- | ----------- | -| \_0 | uint8 | undefined | - -### description - -```solidity -function description() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### getRoundData - -```solidity -function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -#### Parameters - -| Name | Type | Description | -| --------- | ------ | ----------- | -| \_roundId | uint80 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| roundId | uint80 | undefined | -| answer | int256 | undefined | -| startedAt | uint256 | undefined | -| updatedAt | uint256 | undefined | -| answeredInRound | uint80 | undefined | - -### latestRoundData - -```solidity -function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -#### Returns - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| roundId | uint80 | undefined | -| answer | int256 | undefined | -| startedAt | uint256 | undefined | -| updatedAt | uint256 | undefined | -| answeredInRound | uint80 | undefined | - -### version - -```solidity -function version() external view returns (uint256) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md deleted file mode 100644 index 8d14ad8c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md +++ /dev/null @@ -1 +0,0 @@ -# console diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md deleted file mode 100644 index cb666cd3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md +++ /dev/null @@ -1,3 +0,0 @@ -# console2 - -_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md deleted file mode 100644 index 72455b43..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md +++ /dev/null @@ -1,29 +0,0 @@ -# IAllowlist - -_bitbeckers_ - -> Interface for allowlist - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md deleted file mode 100644 index 30ed6f95..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md +++ /dev/null @@ -1,192 +0,0 @@ -# IHypercertToken - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### batchBurnFraction - -```solidity -function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable -``` - -Operator must be allowed by `creator` and the tokens must represent the total amount of available units. - -_Function to burn the tokens at `tokenIDs` for `account`_ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address account, uint256 tokenID) external nonpayable -``` - -Operator must be allowed by `creator` and the token must represent the total amount of available units. - -_Function to burn the token at `tokenID` for `account`_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address account, uint256[] tokenIDs) external nonpayable -``` - -Tokens that have been merged are burned. - -_Function called to merge tokens within `tokenIDs`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### splitFraction - -```solidity -function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable -``` - -The sum of `values` must equal the current value of `_tokenID`. - -_Function called to split `tokenID` owned by `account` into units declared in `values`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | -| \_values | uint256[] | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string metadata) -``` - -_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------ | ----------- | -| metadata | string | undefined | - -## Events - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md deleted file mode 100644 index 06fb700c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md +++ /dev/null @@ -1,133 +0,0 @@ -# IHypercertTrader - -_bitbeckers_ - -> Interface for hypercert token trading - -This interface declares the required functionality to interact with the hypercert marketplace - -## Methods - -### batchBuyUnits - -```solidity -function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable -``` - -_Buys Hypercert tokens from multiple existing offers in a single transaction._ - -#### Parameters - -| Name | Type | Description | -| ------------------- | --------- | -------------------------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerIDs | uint256[] | The list of IDs of the offers to buy from. | -| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | -| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | -| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | - -### buyUnits - -```solidity -function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable -``` - -_Buys Hypercert tokens from an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | --------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerID | uint256 | The ID of the offer to buy from. | -| unitAmount | uint256 | The number of units to buy. | -| buyToken | address | The address of the token used for payment. | -| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | - -### cancelOffer - -```solidity -function cancelOffer(uint256 offerID) external nonpayable -``` - -_Cancels an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ------------------------------ | -| offerID | uint256 | The ID of the offer to cancel. | - -### createOffer - -```solidity -function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | -------------------------------- | ----------- | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| units | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -## Events - -### OfferCancelled - -```solidity -event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| creator `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OfferCreated - -```solidity -event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| offerer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### Trade - -```solidity -event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| seller `indexed` | address | undefined | -| buyer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID | uint256 | undefined | -| unitsBought | uint256 | undefined | -| buyToken | address | undefined | -| tokenAmountPerUnit | uint256 | undefined | -| offerID | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md deleted file mode 100644 index 93fe0124..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md +++ /dev/null @@ -1,59 +0,0 @@ -# Errors - -_bitbeckers_ - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md deleted file mode 100644 index 4cb96bfc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md +++ /dev/null @@ -1,46 +0,0 @@ -# BatchOrderTypehashRegistry - -_LooksRare protocol team (👀,💎)_ - -> BatchOrderTypehashRegistry - -The contract generates the batch order hash that is used to compute the digest for signature verification. - -## Methods - -### hashBatchOrder - -```solidity -function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) -``` - -This function returns the hash of the concatenation of batch order type hash and merkle root. - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ------------------- | -| root | bytes32 | Merkle root | -| proofLength | uint256 | Merkle proof length | - -#### Returns - -| Name | Type | Description | -| -------------- | ------- | -------------------- | -| batchOrderHash | bytes32 | The batch order hash | - -## Errors - -### MerkleProofTooLarge - -```solidity -error MerkleProofTooLarge(uint256 length) -``` - -It is returned if the length of the merkle proof provided is greater than tolerated. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ------------ | -| length | uint256 | Proof length | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md deleted file mode 100644 index a32aef65..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md +++ /dev/null @@ -1,76 +0,0 @@ -# CreatorFeeManagerWithRebates - -_LooksRare protocol team (👀,💎)_ - -> CreatorFeeManagerWithRebates - -This contract returns the creator fee address and the creator rebate amount. - -## Methods - -### STANDARD_ROYALTY_FEE_BP - -```solidity -function STANDARD_ROYALTY_FEE_BP() external view returns (uint256) -``` - -Standard royalty fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### royaltyFeeRegistry - -```solidity -function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) -``` - -Royalty fee registry interface. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | contract IRoyaltyFeeRegistry | undefined | - -### viewCreatorFeeInfo - -```solidity -function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) -``` - -This function returns the creator address and calculates the creator fee amount. - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | -| itemIds | uint256[] | Array of item ids | - -#### Returns - -| Name | Type | Description | -| ---------------- | ------- | ------------------ | -| creator | address | Creator address | -| creatorFeeAmount | uint256 | Creator fee amount | - -## Errors - -### BundleEIP2981NotAllowed - -```solidity -error BundleEIP2981NotAllowed(address collection) -``` - -It is returned if the bundle contains multiple itemIds with different creator fee structure. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md deleted file mode 100644 index 41cab900..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md +++ /dev/null @@ -1,64 +0,0 @@ -# CreatorFeeManagerWithRoyalties - -_LooksRare protocol team (👀,💎)_ - -> CreatorFeeManagerWithRoyalties - -This contract returns the creator fee address and the creator fee amount. - -## Methods - -### royaltyFeeRegistry - -```solidity -function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) -``` - -Royalty fee registry interface. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | contract IRoyaltyFeeRegistry | undefined | - -### viewCreatorFeeInfo - -```solidity -function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) -``` - -This function returns the creator address and calculates the creator fee amount. - -_There are two on-chain sources for the royalty fee to distribute. 1. RoyaltyFeeRegistry: It is an on-chain registry where creator fee is defined for all items of a collection. 2. ERC2981: The NFT Royalty Standard where royalty fee is defined at a itemId level in a collection. The on-chain logic looks up the registry first. If it does not find anything, it checks if a collection is ERC2981. If so, it fetches the proper royalty information for the itemId. For a bundle that contains multiple itemIds (for a collection using ERC2981), if the royalty fee/recipient differ among the itemIds part of the bundle, the trade reverts. This contract DOES NOT enforce any restriction for extremely high creator fee, nor verifies the creator fee fetched is inferior to the total price. If any contract relies on it to build an on-chain royalty logic, it should implement protection against: (1) high royalties (2) potential unexpected royalty changes that can occur after the creation of the order._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | -| itemIds | uint256[] | Array of item ids | - -#### Returns - -| Name | Type | Description | -| ---------------- | ------- | ------------------ | -| creator | address | Creator address | -| creatorFeeAmount | uint256 | Creator fee amount | - -## Errors - -### BundleEIP2981NotAllowed - -```solidity -error BundleEIP2981NotAllowed(address collection) -``` - -It is returned if the bundle contains multiple itemIds with different creator fee structure. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md deleted file mode 100644 index 9ff1c0fc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md +++ /dev/null @@ -1,250 +0,0 @@ -# CurrencyManager - -_LooksRare protocol team (👀,💎)_ - -> CurrencyManager - -This contract manages the list of valid fungible currencies. - -## Methods - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -## Errors - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md deleted file mode 100644 index 83eefc37..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md +++ /dev/null @@ -1,751 +0,0 @@ -# ExecutionManager - -_LooksRare protocol team (👀,💎); bitbeckers;_ - -> ExecutionManager - -This contract handles the execution and resolution of transactions. A transaction is executed on-chain when an off-chain maker order is matched by on-chain taker order of a different kind. For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -Creator fee manager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint16) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | uint16 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### protocolFeeRecipient - -```solidity -function protocolFeeRecipient() external view returns (address) -``` - -Protocol fee recipient. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### updateCreatorFeeManager - -```solidity -function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable -``` - -This function allows the owner to update the creator fee manager address. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ---------------------------------- | -| newCreatorFeeManager | address | Address of the creator fee manager | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateMaxCreatorFeeBp - -```solidity -function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable -``` - -This function allows the owner to update the maximum creator fee (in basis point). - -_The maximum value that can be set is 25%. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------ | ---------------------------------------- | -| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | - -### updateProtocolFeeRecipient - -```solidity -function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable -``` - -This function allows the owner to update the protocol fee recipient. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ---------------------------------- | -| newProtocolFeeRecipient | address | New protocol fee recipient address | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| creatorFeeManager | address | undefined | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| maxCreatorFeeBp | uint256 | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------- | -| protocolFeeRecipient | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -## Errors - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md deleted file mode 100644 index 022cce57..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md +++ /dev/null @@ -1,9 +0,0 @@ -# InheritedStrategy - -_LooksRare protocol team (👀,💎)_ - -> InheritedStrategy - -This contract handles the verification of parameters for standard transactions. It does not verify the taker struct's itemIds and amounts array as well as minPrice (taker ask) / maxPrice (taker bid) because before the taker executes the transaction and the maker itemIds/amounts/price should have already been confirmed off-chain. - -_A standard transaction (bid or ask) is mapped to strategyId = 0._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md deleted file mode 100644 index cc542c7e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md +++ /dev/null @@ -1,1157 +0,0 @@ -# LooksRareProtocol - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> LooksRareProtocol - -This contract is the core smart contract of the LooksRare protocol ("v2"). It is the main entry point for users to initiate transactions with taker orders and manage the cancellation of maker orders, which exist off-chain. ~~~~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~- ~~~~~~~~ ~~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~~ ~~~~~~~~ ~~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~~~~ - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### WETH - -```solidity -function WETH() external view returns (address) -``` - -Wrapped ETH. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### chainId - -```solidity -function chainId() external view returns (uint256) -``` - -Current chainId. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -Creator fee manager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### domainSeparator - -```solidity -function domainSeparator() external view returns (bytes32) -``` - -Current domain separator. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### executeMultipleTakerBids - -```solidity -function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable -``` - -#### Parameters - -| Name | Type | Description | -| --------------- | ------------------------- | ----------- | -| takerBids | OrderStructs.Taker[] | undefined | -| makerAsks | OrderStructs.Maker[] | undefined | -| makerSignatures | bytes[] | undefined | -| merkleTrees | OrderStructs.MerkleTree[] | undefined | -| isAtomic | bool | undefined | - -### executeTakerAsk - -```solidity -function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -### executeTakerBid - -```solidity -function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -### hashBatchOrder - -```solidity -function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) -``` - -This function returns the hash of the concatenation of batch order type hash and merkle root. - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ------------------- | -| root | bytes32 | Merkle root | -| proofLength | uint256 | Merkle proof length | - -#### Returns - -| Name | Type | Description | -| -------------- | ------- | -------------------- | -| batchOrderHash | bytes32 | The batch order hash | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint16) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | uint16 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### protocolFeeRecipient - -```solidity -function protocolFeeRecipient() external view returns (address) -``` - -Protocol fee recipient. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### restrictedExecuteTakerBid - -```solidity -function restrictedExecuteTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, address sender, bytes32 orderHash) external nonpayable returns (uint256 protocolFeeAmount) -``` - -#### Parameters - -| Name | Type | Description | -| --------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | -| sender | address | undefined | -| orderHash | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| protocolFeeAmount | uint256 | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### transferManager - -```solidity -function transferManager() external view returns (contract TransferManager) -``` - -Transfer manager for ERC721, ERC1155 and Hypercerts. - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------ | ----------- | -| \_0 | contract TransferManager | undefined | - -### updateCreatorFeeManager - -```solidity -function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable -``` - -This function allows the owner to update the creator fee manager address. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ---------------------------------- | -| newCreatorFeeManager | address | Address of the creator fee manager | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateDomainSeparator - -```solidity -function updateDomainSeparator() external nonpayable -``` - -This function allows the owner to update the domain separator (if possible). - -_Only callable by owner. If there is a fork of the network with a new chainId, it allows the owner to reset the domain separator for the new chain id._ - -### updateETHGasLimitForTransfer - -```solidity -function updateETHGasLimitForTransfer(uint256 newGasLimitETHTransfer) external nonpayable -``` - -This function allows the owner to update the maximum ETH gas limit for a standard transfer. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------ | -| newGasLimitETHTransfer | uint256 | New gas limit for ETH transfer | - -### updateMaxCreatorFeeBp - -```solidity -function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable -``` - -This function allows the owner to update the maximum creator fee (in basis point). - -_The maximum value that can be set is 25%. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------ | ---------------------------------------- | -| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | - -### updateProtocolFeeRecipient - -```solidity -function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable -``` - -This function allows the owner to update the protocol fee recipient. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ---------------------------------- | -| newProtocolFeeRecipient | address | New protocol fee recipient address | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| creatorFeeManager | address | undefined | - -### NewDomainSeparator - -```solidity -event NewDomainSeparator() -``` - -It is emitted if there is a change in the domain separator. - -### NewGasLimitETHTransfer - -```solidity -event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) -``` - -It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). - -#### Parameters - -| Name | Type | Description | -| ------------------- | ------- | ----------- | -| gasLimitETHTransfer | uint256 | undefined | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| maxCreatorFeeBp | uint256 | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------- | -| protocolFeeRecipient | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -### TakerAsk - -```solidity -event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker ask transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | -| askUser | address | undefined | -| bidUser | address | undefined | -| strategyId | uint256 | undefined | -| currency | address | undefined | -| collection | address | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| feeRecipients | address[2] | undefined | -| feeAmounts | uint256[3] | undefined | - -### TakerBid - -```solidity -event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker bid transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | -| bidUser | address | undefined | -| bidRecipient | address | undefined | -| strategyId | uint256 | undefined | -| currency | address | undefined | -| collection | address | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| feeRecipients | address[2] | undefined | -| feeAmounts | uint256[3] | undefined | - -## Errors - -### CallerInvalid - -```solidity -error CallerInvalid() -``` - -It is returned if the function cannot be called by the sender. - -### ChainIdInvalid - -```solidity -error ChainIdInvalid() -``` - -It is returned if the domain separator should change. - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### CurrencyInvalid - -```solidity -error CurrencyInvalid() -``` - -It is returned if the currency is invalid. - -### ERC20TransferFromFail - -```solidity -error ERC20TransferFromFail() -``` - -It is emitted if the ERC20 transferFrom fails. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### MerkleProofInvalid - -```solidity -error MerkleProofInvalid() -``` - -It is returned if the merkle proof provided is invalid. - -### MerkleProofTooLarge - -```solidity -error MerkleProofTooLarge(uint256 length) -``` - -It is returned if the length of the merkle proof provided is greater than tolerated. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ------------ | -| length | uint256 | Proof length | - -### NewGasLimitETHTransferTooLow - -```solidity -error NewGasLimitETHTransferTooLow() -``` - -It is returned if the gas limit for a standard ETH transfer is too low. - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### NoncesInvalid - -```solidity -error NoncesInvalid() -``` - -It is returned if the nonces are invalid. - -### NotAContract - -```solidity -error NotAContract() -``` - -It is emitted if the call recipient is not a contract. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### NullSignerAddress - -```solidity -error NullSignerAddress() -``` - -It is emitted if the signer is null. - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### QuoteTypeInvalid - -```solidity -error QuoteTypeInvalid() -``` - -It is returned if the maker quote type is invalid. - -### ReentrancyFail - -```solidity -error ReentrancyFail() -``` - -This is returned when there is a reentrant call. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### SameDomainSeparator - -```solidity -error SameDomainSeparator() -``` - -It is returned if the domain separator cannot be updated (i.e. the chainId is the same). - -### SignatureEOAInvalid - -```solidity -error SignatureEOAInvalid() -``` - -It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). - -### SignatureERC1271Invalid - -```solidity -error SignatureERC1271Invalid() -``` - -It is emitted if the signature is invalid for a ERC1271 contract signer. - -### SignatureLengthInvalid - -```solidity -error SignatureLengthInvalid(uint256 length) -``` - -It is emitted if the signature's length is neither 64 nor 65 bytes. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| length | uint256 | undefined | - -### SignatureParameterSInvalid - -```solidity -error SignatureParameterSInvalid() -``` - -It is emitted if the signature is invalid due to S parameter. - -### SignatureParameterVInvalid - -```solidity -error SignatureParameterVInvalid(uint8 v) -``` - -It is emitted if the signature is invalid due to V parameter. - -#### Parameters - -| Name | Type | Description | -| ---- | ----- | ----------- | -| v | uint8 | undefined | - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### UnsupportedCollectionType - -```solidity -error UnsupportedCollectionType() -``` - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md deleted file mode 100644 index fea95495..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md +++ /dev/null @@ -1,193 +0,0 @@ -# NonceManager - -_LooksRare protocol team (👀,💎)_ - -> NonceManager - -This contract handles the nonce logic that is used for invalidating maker orders that exist off-chain. The nonce logic revolves around three parts at the user level: - order nonce (orders sharing an order nonce are conditional, OCO-like) - subset (orders can be grouped under a same subset) - bid/ask (all orders can be executed only if the bid/ask nonce matches the user's one on-chain) Only the order nonce is invalidated at the time of the execution of a maker order that contains it. - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -## Errors - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md deleted file mode 100644 index 36f6a35c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md +++ /dev/null @@ -1,75 +0,0 @@ -# ProtocolFeeRecipient - -_LooksRare protocol team (👀,💎)_ - -> ProtocolFeeRecipient - -This contract is used to receive protocol fees and transfer them to the fee sharing setter. Fee sharing setter cannot receive ETH directly, so we need to use this contract as a middleman to convert ETH into WETH before sending it. - -## Methods - -### FEE_SHARING_SETTER - -```solidity -function FEE_SHARING_SETTER() external view returns (address) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### WETH - -```solidity -function WETH() external view returns (contract IWETH) -``` - -#### Returns - -| Name | Type | Description | -| ---- | -------------- | ----------- | -| \_0 | contract IWETH | undefined | - -### transferERC20 - -```solidity -function transferERC20(address currency) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ---------------------- | -| currency | address | ERC20 currency address | - -### transferETH - -```solidity -function transferETH() external nonpayable -``` - -## Errors - -### ERC20TransferFail - -```solidity -error ERC20TransferFail() -``` - -It is emitted if the ERC20 transfer fails. - -### NotAContract - -```solidity -error NotAContract() -``` - -It is emitted if the call recipient is not a contract. - -### NothingToTransfer - -```solidity -error NothingToTransfer() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md deleted file mode 100644 index a55f3985..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md +++ /dev/null @@ -1,391 +0,0 @@ -# StrategyManager - -_LooksRare protocol team (👀,💎)_ - -> StrategyManager - -This contract handles the addition and the update of execution strategies. - -## Methods - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -## Errors - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md deleted file mode 100644 index c6766114..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md +++ /dev/null @@ -1,553 +0,0 @@ -# TransferManager - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> TransferManager - -This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. - -_"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ - -## Methods - -### allowOperator - -```solidity -function allowOperator(address operator) external nonpayable -``` - -This function allows an operator to be added for the shared transfer system. Once the operator is allowed, users can grant NFT approvals to this operator. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ------------------------- | -| operator | address | Operator address to allow | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### grantApprovals - -```solidity -function grantApprovals(address[] operators) external nonpayable -``` - -This function allows a user to grant approvals for an array of operators. Users cannot grant approvals if the operator is not allowed by this contract's owner. - -_Each operator address must be globally allowed to be approved._ - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| operators | address[] | Array of operator addresses | - -### hasUserApprovedOperator - -```solidity -function hasUserApprovedOperator(address, address) external view returns (bool) -``` - -This returns whether the user has approved the operator address. The first address is the user and the second address is the operator (e.g. LooksRareProtocol). - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isOperatorAllowed - -```solidity -function isOperatorAllowed(address) external view returns (bool) -``` - -This returns whether the operator address is allowed by this contract's owner. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### removeOperator - -```solidity -function removeOperator(address operator) external nonpayable -``` - -This function allows the user to remove an operator for the shared transfer system. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | -------------------------- | -| operator | address | Operator address to remove | - -### revokeApprovals - -```solidity -function revokeApprovals(address[] operators) external nonpayable -``` - -This function allows a user to revoke existing approvals for an array of operators. - -_Each operator address must be approved at the user level to be revoked._ - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| operators | address[] | Array of operator addresses | - -### splitItemsHypercert - -```solidity -function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function splits and transfers a fraction of a hypercert. - -_It does not allow batch transferring._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -### transferBatchItemsAcrossCollections - -```solidity -function transferBatchItemsAcrossCollections(ITransferManager.BatchTransferItem[] items, address from, address to) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ----- | ------------------------------------ | ----------- | -| items | ITransferManager.BatchTransferItem[] | undefined | -| from | address | undefined | -| to | address | undefined | - -### transferItemsERC1155 - -```solidity -function transferItemsERC1155(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function transfers items for a single ERC1155 collection. - -_It does not allow batch transferring if from = msg.sender since native function should be used._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -### transferItemsERC721 - -```solidity -function transferItemsERC721(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function transfers items for a single ERC721 collection. - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -### transferItemsHypercert - -```solidity -function transferItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function transfers items for a single Hypercert. - -_It does not allow batch transferring if from = msg.sender since native function should be used._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -## Events - -### ApprovalsGranted - -```solidity -event ApprovalsGranted(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are granted by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | ----------- | -| user | address | undefined | -| operators | address[] | undefined | - -### ApprovalsRemoved - -```solidity -event ApprovalsRemoved(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are revoked by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | ----------- | -| user | address | undefined | -| operators | address[] | undefined | - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### OperatorAllowed - -```solidity -event OperatorAllowed(address operator) -``` - -It is emitted if a new operator is added to the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | - -### OperatorRemoved - -```solidity -event OperatorRemoved(address operator) -``` - -It is emitted if an operator is removed from the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | - -## Errors - -### AmountInvalid - -```solidity -error AmountInvalid() -``` - -It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. - -### ERC1155SafeBatchTransferFromFail - -```solidity -error ERC1155SafeBatchTransferFromFail() -``` - -It is emitted if the ERC1155 safeBatchTransferFrom fails. - -### ERC1155SafeTransferFromFail - -```solidity -error ERC1155SafeTransferFromFail() -``` - -It is emitted if the ERC1155 safeTransferFrom fails. - -### ERC721TransferFromFail - -```solidity -error ERC721TransferFromFail() -``` - -It is emitted if the ERC721 transferFrom fails. - -### HypercertSplitFractionError - -```solidity -error HypercertSplitFractionError() -``` - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotAContract - -```solidity -error NotAContract() -``` - -It is emitted if the call recipient is not a contract. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### OperatorAlreadyAllowed - -```solidity -error OperatorAlreadyAllowed() -``` - -It is returned if the transfer caller is already allowed by the owner. - -_This error can only be returned for owner operations._ - -### OperatorAlreadyApprovedByUser - -```solidity -error OperatorAlreadyApprovedByUser() -``` - -It is returned if the operator to approve has already been approved by the user. - -### OperatorNotAllowed - -```solidity -error OperatorNotAllowed() -``` - -It is returned if the operator to approve is not in the global allowlist defined by the owner. - -_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ - -### OperatorNotApprovedByUser - -```solidity -error OperatorNotApprovedByUser() -``` - -It is returned if the operator to revoke has not been previously approved by the user. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferCallerInvalid - -```solidity -error TransferCallerInvalid() -``` - -It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md deleted file mode 100644 index 9011bd50..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md +++ /dev/null @@ -1,779 +0,0 @@ -# TransferSelectorNFT - -_LooksRare protocol team (👀,💎); bitbeckers;_ - -> TransferSelectorNFT - -This contract handles the logic for transferring non-fungible items. - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -Creator fee manager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint16) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | uint16 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### protocolFeeRecipient - -```solidity -function protocolFeeRecipient() external view returns (address) -``` - -Protocol fee recipient. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### transferManager - -```solidity -function transferManager() external view returns (contract TransferManager) -``` - -Transfer manager for ERC721, ERC1155 and Hypercerts. - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------ | ----------- | -| \_0 | contract TransferManager | undefined | - -### updateCreatorFeeManager - -```solidity -function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable -``` - -This function allows the owner to update the creator fee manager address. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ---------------------------------- | -| newCreatorFeeManager | address | Address of the creator fee manager | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateMaxCreatorFeeBp - -```solidity -function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable -``` - -This function allows the owner to update the maximum creator fee (in basis point). - -_The maximum value that can be set is 25%. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------ | ---------------------------------------- | -| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | - -### updateProtocolFeeRecipient - -```solidity -function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable -``` - -This function allows the owner to update the protocol fee recipient. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ---------------------------------- | -| newProtocolFeeRecipient | address | New protocol fee recipient address | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| creatorFeeManager | address | undefined | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| maxCreatorFeeBp | uint256 | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------- | -| protocolFeeRecipient | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -## Errors - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### ReentrancyFail - -```solidity -error ReentrancyFail() -``` - -This is returned when there is a reentrant call. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### UnsupportedCollectionType - -```solidity -error UnsupportedCollectionType() -``` - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md deleted file mode 100644 index 37866658..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md +++ /dev/null @@ -1,41 +0,0 @@ -# BaseStrategy - -_LooksRare protocol team (👀,💎)_ - -> BaseStrategy - -## Methods - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerOrder | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md deleted file mode 100644 index c9503939..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md +++ /dev/null @@ -1,212 +0,0 @@ -# BaseStrategyChainlinkPriceLatency - -_LooksRare protocol team (👀,💎)_ - -> BaseStrategyChainlinkPriceLatency - -This contract allows the owner to define the maximum acceptable Chainlink price latency. - -## Methods - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### maxLatency - -```solidity -function maxLatency() external view returns (uint256) -``` - -Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -## Errors - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md deleted file mode 100644 index e2d77dd3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md +++ /dev/null @@ -1,342 +0,0 @@ -# StrategyChainlinkUSDDynamicAsk - -_LooksRare protocol team (👀,💎)_ - -> StrategyChainlinkUSDDynamicAsk - -This contract allows a seller to sell an NFT priced in USD and the receivable amount to be in ETH. - -## Methods - -### ETH_USD_PRICE_FEED_DECIMALS - -```solidity -function ETH_USD_PRICE_FEED_DECIMALS() external view returns (uint256) -``` - -_It is possible to call priceFeed.decimals() to get the decimals, but to save gas, it is hard coded instead._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### WETH - -```solidity -function WETH() external view returns (address) -``` - -Wrapped ether (WETH) address. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### executeStrategyWithTakerBid - -```solidity -function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerAsk | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -### maxLatency - -```solidity -function maxLatency() external view returns (uint256) -``` - -Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### priceFeed - -```solidity -function priceFeed() external view returns (contract AggregatorV3Interface) -``` - -ETH/USD Chainlink price feed - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------------ | ----------- | -| \_0 | contract AggregatorV3Interface | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -## Errors - -### BidTooLow - -```solidity -error BidTooLow() -``` - -It is returned if the bid price is too low for the ask user. - -### ChainlinkPriceInvalid - -```solidity -error ChainlinkPriceInvalid() -``` - -It is returned if the Chainlink price is invalid (e.g. negative). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. - -### PriceNotRecentEnough - -```solidity -error PriceNotRecentEnough() -``` - -It is returned if the current block time relative to the latest price's update time is greater than the latency tolerance. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md deleted file mode 100644 index ddec4495..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md +++ /dev/null @@ -1,127 +0,0 @@ -# StrategyCollectionOffer - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> StrategyCollectionOffer - -This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount must be 1 (fractions are NFTs) - -## Methods - -### executeCollectionStrategyWithTakerAsk - -```solidity -function executeCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### executeCollectionStrategyWithTakerAskWithAllowlist - -```solidity -function executeCollectionStrategyWithTakerAskWithAllowlist(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### executeCollectionStrategyWithTakerAskWithProof - -```solidity -function executeCollectionStrategyWithTakerAskWithProof(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerBid | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### MerkleProofInvalid - -```solidity -error MerkleProofInvalid() -``` - -It is returned if the merkle proof provided is invalid. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md deleted file mode 100644 index 1227878d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md +++ /dev/null @@ -1,83 +0,0 @@ -# StrategyDutchAuction - -_LooksRare protocol team (👀,💎)_ - -> StrategyDutchAuction - -This contract offers a single execution strategy for users to create Dutch auctions. - -## Methods - -### executeStrategyWithTakerBid - -```solidity -function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerAsk | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### BidTooLow - -```solidity -error BidTooLow() -``` - -It is returned if the bid price is too low for the ask user. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md deleted file mode 100644 index daa427e4..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md +++ /dev/null @@ -1,123 +0,0 @@ -# StrategyHypercertFractionOffer - -_LooksRare protocol team (👀,💎); bitbeckers;_ - -> StrategyHypercertFractionOffer - -This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. - -_Use cases can include tiered pricing; think early bird tickets._ - -## Methods - -### executeHypercertFractionStrategyWithTakerBid - -```solidity -function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### executeHypercertFractionStrategyWithTakerBidWithAllowlist - -```solidity -function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerAsk | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### AmountInvalid - -```solidity -error AmountInvalid() -``` - -It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### MerkleProofInvalid - -```solidity -error MerkleProofInvalid() -``` - -It is returned if the merkle proof provided is invalid. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md deleted file mode 100644 index 6a1f0cd5..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md +++ /dev/null @@ -1,75 +0,0 @@ -# StrategyItemIdsRange - -_LooksRare protocol team (👀,💎)_ - -> StrategyItemIdsRange - -This contract offers a single execution strategy for users to bid on a specific amount of items in a range bounded by 2 item ids. - -## Methods - -### executeStrategyWithTakerAsk - -```solidity -function executeStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerBid | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md deleted file mode 100644 index 76918fc5..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md +++ /dev/null @@ -1,215 +0,0 @@ -# OrderValidatorV2A - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> OrderValidatorV2A - -This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) - -_This version does not handle strategies with partial fills._ - -## Methods - -### CRITERIA_GROUPS - -```solidity -function CRITERIA_GROUPS() external view returns (uint256) -``` - -Number of distinct criteria groups checked to evaluate the validity of an order. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### ERC1155_INTERFACE_ID - -```solidity -function ERC1155_INTERFACE_ID() external view returns (bytes4) -``` - -ERC1155 interfaceId. - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### ERC721_INTERFACE_ID_1 - -```solidity -function ERC721_INTERFACE_ID_1() external view returns (bytes4) -``` - -ERC721 potential interfaceId. - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### ERC721_INTERFACE_ID_2 - -```solidity -function ERC721_INTERFACE_ID_2() external view returns (bytes4) -``` - -ERC721 potential interfaceId. - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### HYPERCERT_INTERFACE_ID - -```solidity -function HYPERCERT_INTERFACE_ID() external view returns (bytes4) -``` - -Hypercert interfaceId - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### checkMakerOrderValidity - -```solidity -function checkMakerOrderValidity(OrderStructs.Maker makerOrder, bytes signature, OrderStructs.MerkleTree merkleTree) external view returns (uint256[9] validationCodes) -``` - -#### Parameters - -| Name | Type | Description | -| ---------- | ----------------------- | ----------- | -| makerOrder | OrderStructs.Maker | undefined | -| signature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -#### Returns - -| Name | Type | Description | -| --------------- | ---------- | ----------- | -| validationCodes | uint256[9] | undefined | - -### checkMultipleMakerOrderValidities - -```solidity -function checkMultipleMakerOrderValidities(OrderStructs.Maker[] makerOrders, bytes[] signatures, OrderStructs.MerkleTree[] merkleTrees) external view returns (uint256[9][] validationCodes) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------------------------- | ----------- | -| makerOrders | OrderStructs.Maker[] | undefined | -| signatures | bytes[] | undefined | -| merkleTrees | OrderStructs.MerkleTree[] | undefined | - -#### Returns - -| Name | Type | Description | -| --------------- | ------------ | ----------- | -| validationCodes | uint256[9][] | undefined | - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -CreatorFeeManager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### deriveProtocolParameters - -```solidity -function deriveProtocolParameters() external nonpayable -``` - -Derive protocol parameters. Anyone can call this function. - -_It allows adjusting if the domain separator or creator fee manager address were to change._ - -### domainSeparator - -```solidity -function domainSeparator() external view returns (bytes32) -``` - -LooksRareProtocol domain separator. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### looksRareProtocol - -```solidity -function looksRareProtocol() external view returns (contract LooksRareProtocol) -``` - -LooksRareProtocol. - -#### Returns - -| Name | Type | Description | -| ---- | -------------------------- | ----------- | -| \_0 | contract LooksRareProtocol | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint256) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### transferManager - -```solidity -function transferManager() external view returns (contract TransferManager) -``` - -TransferManager - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------ | ----------- | -| \_0 | contract TransferManager | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md deleted file mode 100644 index 91be29a9..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md +++ /dev/null @@ -1,159 +0,0 @@ -# ProtocolHelpers - -_LooksRare protocol team (👀,💎)_ - -> ProtocolHelpers - -This contract contains helper view functions for order creation. - -## Methods - -### computeDigestMerkleTree - -```solidity -function computeDigestMerkleTree(OrderStructs.MerkleTree merkleTree) external view returns (bytes32 digest) -``` - -#### Parameters - -| Name | Type | Description | -| ---------- | ----------------------- | ----------- | -| merkleTree | OrderStructs.MerkleTree | undefined | - -#### Returns - -| Name | Type | Description | -| ------ | ------- | ----------- | -| digest | bytes32 | undefined | - -### computeMakerDigest - -```solidity -function computeMakerDigest(OrderStructs.Maker maker) external view returns (bytes32 digest) -``` - -#### Parameters - -| Name | Type | Description | -| ----- | ------------------ | ----------- | -| maker | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------ | ------- | ----------- | -| digest | bytes32 | undefined | - -### looksRareProtocol - -```solidity -function looksRareProtocol() external view returns (contract LooksRareProtocol) -``` - -#### Returns - -| Name | Type | Description | -| ---- | -------------------------- | ----------- | -| \_0 | contract LooksRareProtocol | undefined | - -### verifyMakerSignature - -```solidity -function verifyMakerSignature(OrderStructs.Maker maker, bytes makerSignature, address signer) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ------------------ | ----------- | -| maker | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| signer | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### verifyMerkleTree - -```solidity -function verifyMerkleTree(OrderStructs.MerkleTree merkleTree, bytes makerSignature, address signer) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| merkleTree | OrderStructs.MerkleTree | undefined | -| makerSignature | bytes | undefined | -| signer | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Errors - -### NullSignerAddress - -```solidity -error NullSignerAddress() -``` - -It is emitted if the signer is null. - -### SignatureEOAInvalid - -```solidity -error SignatureEOAInvalid() -``` - -It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). - -### SignatureERC1271Invalid - -```solidity -error SignatureERC1271Invalid() -``` - -It is emitted if the signature is invalid for a ERC1271 contract signer. - -### SignatureLengthInvalid - -```solidity -error SignatureLengthInvalid(uint256 length) -``` - -It is emitted if the signature's length is neither 64 nor 65 bytes. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| length | uint256 | undefined | - -### SignatureParameterSInvalid - -```solidity -error SignatureParameterSInvalid() -``` - -It is emitted if the signature is invalid due to S parameter. - -### SignatureParameterVInvalid - -```solidity -error SignatureParameterVInvalid(uint8 v) -``` - -It is emitted if the signature is invalid due to V parameter. - -#### Parameters - -| Name | Type | Description | -| ---- | ----- | ----------- | -| v | uint8 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md deleted file mode 100644 index b832744e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md +++ /dev/null @@ -1,60 +0,0 @@ -# ICreatorFeeManager - -_LooksRare protocol team (👀,💎)_ - -> ICreatorFeeManager - -## Methods - -### royaltyFeeRegistry - -```solidity -function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry royaltyFeeRegistry) -``` - -It returns the royalty fee registry address/interface. - -#### Returns - -| Name | Type | Description | -| ------------------ | ---------------------------- | ------------------------------------- | -| royaltyFeeRegistry | contract IRoyaltyFeeRegistry | Interface of the royalty fee registry | - -### viewCreatorFeeInfo - -```solidity -function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) -``` - -This function returns the creator address and calculates the creator fee amount. - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | -| itemIds | uint256[] | Array of item ids | - -#### Returns - -| Name | Type | Description | -| ---------------- | ------- | ------------------ | -| creator | address | Creator address | -| creatorFeeAmount | uint256 | Creator fee amount | - -## Errors - -### BundleEIP2981NotAllowed - -```solidity -error BundleEIP2981NotAllowed(address collection) -``` - -It is returned if the bundle contains multiple itemIds with different creator fee structure. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md deleted file mode 100644 index da683d8c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md +++ /dev/null @@ -1,22 +0,0 @@ -# ICurrencyManager - -_LooksRare protocol team (👀,💎)_ - -> ICurrencyManager - -## Events - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------------------------------- | -| currency | address | Currency address (address(0) = ETH) | -| isAllowed | bool | Whether the currency is allowed | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md deleted file mode 100644 index 0e86c75b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md +++ /dev/null @@ -1,99 +0,0 @@ -# IExecutionManager - -_LooksRare protocol team (👀,💎)_ - -> IExecutionManager - -## Events - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | -------------------------------------- | -| creatorFeeManager | address | Address of the new creator fee manager | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ---------------------------------------- | -| maxCreatorFeeBp | uint256 | New maximum creator fee (in basis point) | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------------------------------------- | -| protocolFeeRecipient | address | Address of the new protocol fee recipient | - -## Errors - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md deleted file mode 100644 index 393cb24b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md +++ /dev/null @@ -1,41 +0,0 @@ -# IImmutableCreate2Factory - -## Methods - -### findCreate2Address - -```solidity -function findCreate2Address(bytes32 salt, bytes initializationCode) external view returns (address deploymentAddress) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| salt | bytes32 | undefined | -| initializationCode | bytes | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| deploymentAddress | address | undefined | - -### safeCreate2 - -```solidity -function safeCreate2(bytes32 salt, bytes initializationCode) external payable returns (address deploymentAddress) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| salt | bytes32 | undefined | -| initializationCode | bytes | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| deploymentAddress | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md deleted file mode 100644 index e7414f54..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md +++ /dev/null @@ -1,157 +0,0 @@ -# ILooksRareProtocol - -_LooksRare protocol team (👀,💎)_ - -> ILooksRareProtocol - -## Methods - -### executeMultipleTakerBids - -```solidity -function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable -``` - -#### Parameters - -| Name | Type | Description | -| --------------- | ------------------------- | ----------- | -| takerBids | OrderStructs.Taker[] | undefined | -| makerAsks | OrderStructs.Maker[] | undefined | -| makerSignatures | bytes[] | undefined | -| merkleTrees | OrderStructs.MerkleTree[] | undefined | -| isAtomic | bool | undefined | - -### executeTakerAsk - -```solidity -function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -### executeTakerBid - -```solidity -function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -## Events - -### NewDomainSeparator - -```solidity -event NewDomainSeparator() -``` - -It is emitted if there is a change in the domain separator. - -### NewGasLimitETHTransfer - -```solidity -event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) -``` - -It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). - -#### Parameters - -| Name | Type | Description | -| ------------------- | ------- | ----------------------------- | -| gasLimitETHTransfer | uint256 | Gas limit for an ETH transfer | - -### TakerAsk - -```solidity -event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker ask transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | -| askUser | address | Address of the ask user | -| bidUser | address | Address of the bid user | -| strategyId | uint256 | Id of the strategy | -| currency | address | Address of the currency | -| collection | address | Address of the collection | -| itemIds | uint256[] | Array of item ids | -| amounts | uint256[] | Array of amounts (for item ids) | -| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it can be the taker ask user or different) feeRecipients[1] Creator fee recipient (if none, address(0)) | -| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | - -### TakerBid - -```solidity -event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker bid transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | -| bidUser | address | Address of the bid user | -| bidRecipient | address | Address of the recipient of the bid | -| strategyId | uint256 | Id of the strategy | -| currency | address | Address of the currency | -| collection | address | Address of the collection | -| itemIds | uint256[] | Array of item ids | -| amounts | uint256[] | Array of amounts (for item ids) | -| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it is the maker ask user) feeRecipients[1] Creator fee recipient (if none, address(0)) | -| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | - -## Errors - -### ChainIdInvalid - -```solidity -error ChainIdInvalid() -``` - -It is returned if the domain separator should change. - -### NewGasLimitETHTransferTooLow - -```solidity -error NewGasLimitETHTransferTooLow() -``` - -It is returned if the gas limit for a standard ETH transfer is too low. - -### NoncesInvalid - -```solidity -error NoncesInvalid() -``` - -It is returned if the nonces are invalid. - -### SameDomainSeparator - -```solidity -error SameDomainSeparator() -``` - -It is returned if the domain separator cannot be updated (i.e. the chainId is the same). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md deleted file mode 100644 index eaa3f977..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md +++ /dev/null @@ -1,53 +0,0 @@ -# INonceManager - -_LooksRare protocol team (👀,💎)_ - -> INonceManager - -## Events - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ------------------- | -| user | address | Address of the user | -| bidNonce | uint256 | New bid nonce | -| askNonce | uint256 | New ask nonce | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ------------------------------- | -| user | address | Address of the user | -| orderNonces | uint256[] | Array of order nonces cancelled | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | -------------------------------- | -| user | address | Address of the user | -| subsetNonces | uint256[] | Array of subset nonces cancelled | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md deleted file mode 100644 index 5ed0ef6c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md +++ /dev/null @@ -1,29 +0,0 @@ -# IRoyaltyFeeRegistry - -_LooksRare protocol team (👀,💎)_ - -> IRoyaltyFeeRegistry - -## Methods - -### royaltyInfo - -```solidity -function royaltyInfo(address collection, uint256 price) external view returns (address receiver, uint256 royaltyFee) -``` - -This function returns the royalty information for a collection at a given transaction price. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | - -#### Returns - -| Name | Type | Description | -| ---------- | ------- | ------------------ | -| receiver | address | Receiver address | -| royaltyFee | uint256 | Royalty fee amount | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md deleted file mode 100644 index 2b4a45bc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md +++ /dev/null @@ -1,41 +0,0 @@ -# IStrategy - -_LooksRare protocol team (👀,💎)_ - -> IStrategy - -## Methods - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool isStrategy) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---------- | ---- | ---------------------------------------------- | -| isStrategy | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerOrder | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md deleted file mode 100644 index ae6ea7b1..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md +++ /dev/null @@ -1,84 +0,0 @@ -# IStrategyManager - -_LooksRare protocol team (👀,💎)_ - -> IStrategyManager - -## Events - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------------- | -| strategyId | uint256 | Id of the new strategy | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the transaction to be executed | -| isMakerBid | bool | Whether the strategyId is for maker bid | -| implementation | address | Address of the implementation of the strategy | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | -------------------------------------------------------- | -| strategyId | uint256 | Id of the strategy | -| isActive | bool | Whether the strategy is active (or not) after the update | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | - -## Errors - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md deleted file mode 100644 index 3ba8ca81..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md +++ /dev/null @@ -1,111 +0,0 @@ -# ITransferManager - -_LooksRare protocol team (👀,💎)_ - -> ITransferManager - -## Events - -### ApprovalsGranted - -```solidity -event ApprovalsGranted(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are granted by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| user | address | Address of the user | -| operators | address[] | Array of operator addresses | - -### ApprovalsRemoved - -```solidity -event ApprovalsRemoved(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are revoked by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| user | address | Address of the user | -| operators | address[] | Array of operator addresses | - -### OperatorAllowed - -```solidity -event OperatorAllowed(address operator) -``` - -It is emitted if a new operator is added to the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ---------------- | -| operator | address | Operator address | - -### OperatorRemoved - -```solidity -event OperatorRemoved(address operator) -``` - -It is emitted if an operator is removed from the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ---------------- | -| operator | address | Operator address | - -## Errors - -### OperatorAlreadyAllowed - -```solidity -error OperatorAlreadyAllowed() -``` - -It is returned if the transfer caller is already allowed by the owner. - -_This error can only be returned for owner operations._ - -### OperatorAlreadyApprovedByUser - -```solidity -error OperatorAlreadyApprovedByUser() -``` - -It is returned if the operator to approve has already been approved by the user. - -### OperatorNotAllowed - -```solidity -error OperatorNotAllowed() -``` - -It is returned if the operator to approve is not in the global allowlist defined by the owner. - -_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ - -### OperatorNotApprovedByUser - -```solidity -error OperatorNotApprovedByUser() -``` - -It is returned if the operator to revoke has not been previously approved by the user. - -### TransferCallerInvalid - -```solidity -error TransferCallerInvalid() -``` - -It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md deleted file mode 100644 index 1b1f41a2..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md +++ /dev/null @@ -1,7 +0,0 @@ -# CurrencyValidator - -_LooksRare protocol team (👀,💎)_ - -> CurrencyValidator - -This library validates the order currency to be the chain's native currency or the specified ERC20 token. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md deleted file mode 100644 index 5951cc56..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md +++ /dev/null @@ -1,21 +0,0 @@ -# LowLevelHypercertCaller - -_bitbeckers_ - -> LowLevelHypercertCaller - -This contract contains low-level calls to transfer ERC1155 tokens. - -## Errors - -### HypercertSplitFractionError - -```solidity -error HypercertSplitFractionError() -``` - -### NotAContract - -```solidity -error NotAContract() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md deleted file mode 100644 index 943a54cd..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md +++ /dev/null @@ -1,7 +0,0 @@ -# MerkleProofCalldataWithNodes - -_OpenZeppelin (adjusted by LooksRare)_ - -> MerkleProofCalldataWithNodes - -This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md deleted file mode 100644 index 37529181..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md +++ /dev/null @@ -1,7 +0,0 @@ -# MerkleProofMemory - -_OpenZeppelin (adjusted by LooksRare)_ - -> MerkleProofMemory - -This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md deleted file mode 100644 index 6ffa83e2..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md +++ /dev/null @@ -1,7 +0,0 @@ -# OrderStructs - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> OrderStructs - -This library contains all order struct types for the LooksRare protocol (v2). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md deleted file mode 100644 index 4684053c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md +++ /dev/null @@ -1,84 +0,0 @@ -# AllowlistMinter - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -## Events - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -## Errors - -### DoesNotExist - -```solidity -error DoesNotExist() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md deleted file mode 100644 index 518efa42..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md +++ /dev/null @@ -1,895 +0,0 @@ -# HypercertMinter - -_bitbeckers_ - -> Contract for managing hypercert claims and whitelists - -Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. - -_Wrapper contract to expose and chain functions._ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### batchBurnFraction - -```solidity -function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenIDs | uint256[] | undefined | - -### batchMintClaimsFromAllowlists - -```solidity -function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable -``` - -Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - -_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| -------- | ----------- | ----------- | -| account | address | undefined | -| proofs | bytes32[][] | undefined | -| claimIDs | uint256[] | undefined | -| units | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256) external nonpayable -``` - -Burn a claimtoken; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| \_2 | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable -``` - -Batch burn claimtokens; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| \_2 | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address _account, uint256 _tokenID) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | - -### createAllowlist - -```solidity -function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Register a claim and the whitelist for minting token(s) belonging to that claim - -_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| merkleRoot | bytes32 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable -``` - -Merge the value of tokens belonging to the same claim - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------- | --------- | ----------- | -| \_account | address | undefined | -| \_fractionIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint a semi-fungible token for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimFromAllowlist - -```solidity -function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable -``` - -Mint a semi-fungible token representing a fraction of the claim - -_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| units | uint256 | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint semi-fungible tokens for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### name - -```solidity -function name() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### readTransferRestriction - -```solidity -function readTransferRestriction(uint256 tokenID) external view returns (string) -``` - -TRANSFER RESTRICTIONS - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### splitFraction - -```solidity -function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable -``` - -Split a claimtokens value into parts with summed value equal to the original - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| -------------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | -| \_newFractions | uint256[] | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_see { IHypercertMetadata}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | ----------- | -| \_uri | string | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md deleted file mode 100644 index a4086e37..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md +++ /dev/null @@ -1,457 +0,0 @@ -# SemiFungible1155 - -_bitbeckers_ - -> Contract for minting semi-fungible EIP1155 tokens - -Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` - -_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------------------------------- | -| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | -------------------------------------------- | -| \_uri | string | The metadata URI for the specified token ID. | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md deleted file mode 100644 index 72455b43..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md +++ /dev/null @@ -1,29 +0,0 @@ -# IAllowlist - -_bitbeckers_ - -> Interface for allowlist - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md deleted file mode 100644 index 30ed6f95..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md +++ /dev/null @@ -1,192 +0,0 @@ -# IHypercertToken - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### batchBurnFraction - -```solidity -function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable -``` - -Operator must be allowed by `creator` and the tokens must represent the total amount of available units. - -_Function to burn the tokens at `tokenIDs` for `account`_ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address account, uint256 tokenID) external nonpayable -``` - -Operator must be allowed by `creator` and the token must represent the total amount of available units. - -_Function to burn the token at `tokenID` for `account`_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address account, uint256[] tokenIDs) external nonpayable -``` - -Tokens that have been merged are burned. - -_Function called to merge tokens within `tokenIDs`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### splitFraction - -```solidity -function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable -``` - -The sum of `values` must equal the current value of `_tokenID`. - -_Function called to split `tokenID` owned by `account` into units declared in `values`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | -| \_values | uint256[] | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string metadata) -``` - -_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------ | ----------- | -| metadata | string | undefined | - -## Events - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md deleted file mode 100644 index 93fe0124..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md +++ /dev/null @@ -1,59 +0,0 @@ -# Errors - -_bitbeckers_ - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll deleted file mode 100644 index e2ac6616..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md deleted file mode 100644 index b1434ab0..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md +++ /dev/null @@ -1,185 +0,0 @@ -Hypercerts SDK Documentation / [Exports](modules.md) - -# Hypercert SDK - -## Quickstart Guide - -1. Install the SDK using npm or yarn: - -```bash -npm install @hypercerts-org/sdk -``` - -or - -```bash - yarn add @hypercerts-org/sdk -``` - -2. Import the SDK into your project: - -```bash -import { HypercertClient } from "@hypercerts-org/sdk"; -``` - -3. Create a new instance of the HypercertClient class with your configuration options: - -```js -const client = new HypercertClient({ - chainId: 5, - provider, - signer, - nftStorageToken, - web3StorageToken, -}); -``` - -> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in -> [read-only mode](#read-only-mode) - -4. Use the client object to interact with the Hypercert network. - -For example, you can use the `client.mintClaim` method to create a new claim: - -```js -const tx = await client.mintClaim( - metaData, - totalUnits, - transferRestriction, - overrides, -); -``` - -This will validate the metadata, store it on IPFS, create a new hypercert on-chain and return a transaction receipt. - -You can also use the client to query the subgraph and retrieve which claims an address owns: - -```js -const claims = await client.indexer.fractionsByOwner(owner), -``` - -For more information on how to use the SDK, check out the -[developer documentation](https://hypercerts.org/docs/developer/) and the -[Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet). - -That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. Don't forget to set your -environment variables for your NFT.storage and web3.storage API keys in your .env file. - -## Config - -The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check -the environment variables. - -### Read-only mode - -The SDK client will be in read-only mode if any of the following conditions are true: - -- The client was initialized without a signer or provider. -- The client was initialized with a provider but not a signer. -- The client was initialized with a signer but not a provider. -- The contract address is not set. -- The storage layer is in read-only mode. - -If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a -warning message will be logged indicating that the client is in read-only mode. - -### Defaults - -The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief -explanation of each constant: - -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - -`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object -contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. - -For example: - -```json -{ - "5": { - "chainId": 5, - "chainName": "goerli", - "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "graphName": "hypercerts-testnet" - } -} -``` - -### Client config properties - -| \| Property | Type | Description | -| ------------------ | -------------------- | -------------------------------------- | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | -| `graphName` | `string` | The name of the Gsubgraph to use. | -| `provider` | `providers.Provider` | A custom provider to use. | -| `signer` | `Signer` | A custom signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | - -### Environment variables - -To determine the missing configuration values the SDK defaults to the following environment variables: - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - -### Logging - -The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level -determines which log messages are printed to the console. By default, the logger is configured to log messages with a -level of info or higher to the console. - -## Client modules - -The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient -has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, -HypercertIndexer, and HypercertMinter classes, respectively. - -```js -const { - client: { storage }, -} = new HypercertClient({}); -``` - -The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and -NFT.storage. It is used by the HypercertClient to store metadata when creating new Hypercerts. - -```js -const { - client: { indexer }, -} = new HypercertClient({}); -``` - -The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. -It is used by the HypercertClient to retrieve event-based data via the subgraph - -```js -const { - client: { contract }, -} = new HypercertClient({}); -``` - -Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used -by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. - -By providing instances of these classes through the storage, indexer, and contract getters, the HypercertClient allows -developers to easily interact with the various components of the Hypercert system. For example, a developer could use -the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based -on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the -contract. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md deleted file mode 100644 index 89f2105f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError - -# Class: ClientError - -An error that is caused by a problem with the client. - -## Hierarchy - -- `Error` - - ↳ **`ClientError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](ClientError.md#constructor) - -### Properties - -- [payload](ClientError.md#payload) - -## Constructors - -### constructor - -• **new ClientError**(`message`, `payload?`) - -Creates a new instance of the ClientError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md deleted file mode 100644 index 03813867..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md +++ /dev/null @@ -1,66 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError - -# Class: ConfigurationError - -The configuration was invalid - -## Hierarchy - -- `Error` - - ↳ **`ConfigurationError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](ConfigurationError.md#constructor) - -### Properties - -- [payload](ConfigurationError.md#payload) - -## Constructors - -### constructor - -• **new ConfigurationError**(`message`, `payload?`) - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `message` | `string` | -| `payload?` | `Object` | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md deleted file mode 100644 index d4c9f7c9..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError - -# Class: FetchError - -Fails fetching a remote resource - -## Hierarchy - -- `Error` - - ↳ **`FetchError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](FetchError.md#constructor) - -### Properties - -- [payload](FetchError.md#payload) - -## Constructors - -### constructor - -• **new FetchError**(`message`, `payload?`) - -Creates a new instance of the FetchError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md deleted file mode 100644 index a5a0e900..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md +++ /dev/null @@ -1,493 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient - -# Class: HypercertClient - -Hypercerts client factory - -**`Dev`** - -Creates a Hypercerts client instance - -**`Notice`** - -The client is readonly if no signer is set or if the contract address is not set - -**`Param`** - -Hypercerts client configuration - -**`Param`** - -Hypercerts storage object - -## Implements - -- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) - -## Table of contents - -### Constructors - -- [constructor](HypercertClient.md#constructor) - -### Properties - -- [\_config](HypercertClient.md#_config) -- [\_contract](HypercertClient.md#_contract) -- [\_evaluator](HypercertClient.md#_evaluator) -- [\_indexer](HypercertClient.md#_indexer) -- [\_operator](HypercertClient.md#_operator) -- [\_storage](HypercertClient.md#_storage) -- [readonly](HypercertClient.md#readonly) - -### Accessors - -- [contract](HypercertClient.md#contract) -- [indexer](HypercertClient.md#indexer) -- [storage](HypercertClient.md#storage) - -### Methods - -- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClient.md#burnclaimfraction) -- [checkWritable](HypercertClient.md#checkwritable) -- [createAllowlist](HypercertClient.md#createallowlist) -- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) -- [mintClaim](HypercertClient.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClient.md#splitclaimunits) - -## Constructors - -### constructor - -• **new HypercertClient**(`config?`) - -Creates a new instance of the `HypercertClient` class. - -#### Parameters - -| Name | Type | Description | -| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | - -#### Defined in - -[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) - -## Properties - -### \_config - -• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) - -#### Defined in - -[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) - ---- - -### \_contract - -• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -#### Defined in - -[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) - ---- - -### \_evaluator - -• `Private` **\_evaluator**: [`default`](internal.default.md) - -#### Defined in - -[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) - ---- - -### \_indexer - -• `Private` **\_indexer**: [`default`](internal.default-1.md) - -#### Defined in - -[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) - ---- - -### \_operator - -• `Private` **\_operator**: `Provider` \| `Signer` - -#### Defined in - -[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) - ---- - -### \_storage - -• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) - -#### Defined in - -[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) - -#### Defined in - -[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) - -## Accessors - -### contract - -• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -Gets the HypercertMinter contract used by the client. - -#### Returns - -[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -The contract. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) - -#### Defined in - -[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) - ---- - -### indexer - -• `get` **indexer**(): [`default`](internal.default-1.md) - -Gets the indexer for the client. - -#### Returns - -[`default`](internal.default-1.md) - -The indexer. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) - -#### Defined in - -[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) - ---- - -### storage - -• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) - -Gets the storage layer for the client. - -#### Returns - -[`HypercertsStorage`](HypercertsStorage.md) - -The storage layer. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) - -#### Defined in - -[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) - -## Methods - -### batchMintClaimFractionsFromAllowlists - -▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | -| `roots?` | `BytesLike`[] | - | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Implementation of - -HypercertClientInterface.batchMintClaimFractionsFromAllowlists - -#### Defined in - -[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) - ---- - -### burnClaimFraction - -▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> - -Burn a Hypercert claim by providing the claim id - -**`Dev`** - -Burns a Hypercert claim - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------- | :----------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.burnClaimFraction - -#### Defined in - -[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) - ---- - -### checkWritable - -▸ `Private` **checkWritable**(): `boolean` - -#### Returns - -`boolean` - -#### Defined in - -[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) - ---- - -### createAllowlist - -▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> - -Create a Hypercert claim with an allowlist - -**`Dev`** - -Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist - -**`Notice`** - -The total number of units in the allowlist must match the total number of units for the Hypercert - -#### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.createAllowlist - -#### Defined in - -[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) - ---- - -### mergeClaimUnits - -▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> - -Merge multiple Hypercert claims fractions into one - -**`Dev`** - -Merges multiple Hypercert claims into one - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :------------------ | -| `claimIds` | `BigNumberish`[] | Hypercert claim ids | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mergeClaimUnits - -#### Defined in - -[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) - ---- - -### mintClaim - -▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> - -Mint a Hypercert claim - -**`Dev`** - -Mints a Hypercert claim with the given metadata, total units and transfer restrictions - -#### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mintClaim - -#### Defined in - -[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) - ---- - -### mintClaimFractionFromAllowlist - -▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> - -Mint a Hypercert claim fraction from an allowlist. - -**`Dev`** - -Verifies the claim proof and mints the claim fraction - -**`Notice`** - -If known, provide the root for client side verification - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------- | :------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `units` | `BigNumberish` | Number of units to mint | -| `proof` | `BytesLike`[] | Merkle proof for the claim | -| `root?` | `BytesLike` | - | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mintClaimFractionFromAllowlist - -#### Defined in - -[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) - ---- - -### splitClaimUnits - -▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> - -Split a Hypercert's unit into multiple claims with the given fractions - -**`Dev`** - -Submit the ID of the claim to split and new fraction values. - -**`Notice`** - -The sum of the fractions must be equal to the total units of the claim - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.splitClaimUnits - -#### Defined in - -[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md deleted file mode 100644 index 706c14fe..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md +++ /dev/null @@ -1,250 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage - -# Class: HypercertsStorage - -A class that provides storage functionality for Hypercerts. - -## Implements - -- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) - -## Table of contents - -### Constructors - -- [constructor](HypercertsStorage.md#constructor) - -### Properties - -- [nftStorageClient](HypercertsStorage.md#nftstorageclient) -- [readonly](HypercertsStorage.md#readonly) -- [web3StorageClient](HypercertsStorage.md#web3storageclient) - -### Methods - -- [getData](HypercertsStorage.md#getdata) -- [getMetadata](HypercertsStorage.md#getmetadata) -- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) -- [storeData](HypercertsStorage.md#storedata) -- [storeMetadata](HypercertsStorage.md#storemetadata) - -## Constructors - -### constructor - -• **new HypercertsStorage**(`overrides`) - -Creates a new instance of the `HypercertsStorage` class. - -#### Parameters - -| Name | Type | Description | -| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | -| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | - -#### Defined in - -[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) - -## Properties - -### nftStorageClient - -• `Optional` **nftStorageClient**: `NFTStorage` - -The NFT storage client. - -#### Defined in - -[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -Whether the storage is read-only. - -#### Defined in - -[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) - ---- - -### web3StorageClient - -• `Optional` **web3StorageClient**: `any` - -The Web3 storage client. - -#### Defined in - -[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) - -## Methods - -### getData - -▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> - -Gets arbitrary data from Web3 storage. - -**`Throws`** - -A `StorageError` if the storage client is not configured or the data cannot be retrieved. - -#### Parameters - -| Name | Type | Description | -| :------------- | :------- | :-------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | - -#### Returns - -`Promise`<`any`\> - -A Promise that resolves to the data. - -#### Implementation of - -HypercertStorageInterface.getData - -#### Defined in - -[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) - ---- - -### getMetadata - -▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> - -Gets metadata for a Hypercert. - -**`Throws`** - -A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. - -**`Throws`** - -A `MalformedDataError` if the metadata is invalid. E.g. unknown schema - -#### Parameters - -| Name | Type | Description | -| :------------- | :------- | :------------------------------------------ | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | - -#### Returns - -`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> - -A Promise that resolves to the metadata. - -#### Implementation of - -HypercertStorageInterface.getMetadata - -#### Defined in - -[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) - ---- - -### getNftStorageGatewayUri - -▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` - -#### Parameters - -| Name | Type | -| :------------- | :------- | -| `cidOrIpfsUri` | `string` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) - ---- - -### storeData - -▸ **storeData**(`data`): `Promise`<`CIDString`\> - -Stores arbitrary data in Web3 storage. - -**`Throws`** - -A `StorageError` if the storage client is not configured. - -**`Notice`** - -Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. -Because we pay for storage quotas, this data is stored best effort. -If you are using our default keys, we may delete older data if we hit our storage quota. - -#### Parameters - -| Name | Type | Description | -| :----- | :-------- | :----------------- | -| `data` | `unknown` | The data to store. | - -#### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored data. - -#### Implementation of - -HypercertStorageInterface.storeData - -#### Defined in - -[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) - ---- - -### storeMetadata - -▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> - -Stores metadata for a Hypercert. - -**`Throws`** - -A `StorageError` if the storage client is not configured. - -**`Throws`** - -A `MalformedDataError` if the metadata is invalid. - -**`Notice`** - -Because we pay for storage quotas, this data is stored best effort. -If you are using our default keys, we may delete older data if we hit our storage quota. - -#### Parameters - -| Name | Type | Description | -| :----- | :-------------------------------------------------------- | :--------------------- | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | - -#### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored metadata. - -#### Implementation of - -HypercertStorageInterface.storeMetadata - -#### Defined in - -[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md deleted file mode 100644 index d12c0653..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError - -# Class: InvalidOrMissingError - -The provided value was undefined or empty - -## Hierarchy - -- `Error` - - ↳ **`InvalidOrMissingError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](InvalidOrMissingError.md#constructor) - -### Properties - -- [payload](InvalidOrMissingError.md#payload) - -## Constructors - -### constructor - -• **new InvalidOrMissingError**(`message`, `payload?`) - -Creates a new instance of the InvalidOrMissingError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md deleted file mode 100644 index 028129d8..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError - -# Class: MalformedDataError - -Data doesn't conform to expectations - -## Hierarchy - -- `Error` - - ↳ **`MalformedDataError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](MalformedDataError.md#constructor) - -### Properties - -- [payload](MalformedDataError.md#payload) - -## Constructors - -### constructor - -• **new MalformedDataError**(`message`, `payload?`) - -Creates a new instance of the MalformedDataError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md deleted file mode 100644 index de284494..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError - -# Class: MintingError - -Minting transaction failed - -## Hierarchy - -- `Error` - - ↳ **`MintingError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](MintingError.md#constructor) - -### Properties - -- [payload](MintingError.md#payload) - -## Constructors - -### constructor - -• **new MintingError**(`message`, `payload?`) - -Creates a new instance of the MintingError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md deleted file mode 100644 index 0dcf0291..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError - -# Class: StorageError - -Fails storing to a remote resource - -## Hierarchy - -- `Error` - - ↳ **`StorageError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](StorageError.md#constructor) - -### Properties - -- [payload](StorageError.md#payload) - -## Constructors - -### constructor - -• **new StorageError**(`message`, `payload?`) - -Creates a new instance of the StorageError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md deleted file mode 100644 index 5fdb25e0..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md +++ /dev/null @@ -1,71 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError - -# Class: UnknownSchemaError - -Schema could not be loaded - -## Hierarchy - -- `Error` - - ↳ **`UnknownSchemaError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](UnknownSchemaError.md#constructor) - -### Properties - -- [payload](UnknownSchemaError.md#payload) - -## Constructors - -### constructor - -• **new UnknownSchemaError**(`message`, `payload?`) - -Creates a new instance of the UnknownSchemaError class. - -#### Parameters - -| Name | Type | Description | -| :------------------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | -| `payload.schemaName` | `string` | - | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Type declaration - -| Name | Type | -| :----------- | :------- | -| `schemaName` | `string` | - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md deleted file mode 100644 index 0964b138..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md +++ /dev/null @@ -1,72 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError - -# Class: UnsupportedChainError - -This blockchain is not yet supported -Please file an issue - -## Hierarchy - -- `Error` - - ↳ **`UnsupportedChainError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](UnsupportedChainError.md#constructor) - -### Properties - -- [payload](UnsupportedChainError.md#payload) - -## Constructors - -### constructor - -• **new UnsupportedChainError**(`message`, `payload?`) - -Creates a new instance of the UnsupportedChainError class. - -#### Parameters - -| Name | Type | Description | -| :---------------- | :---------------------------------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | -| `payload.chainID` | `undefined` \| `string` \| `number` | - | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Type declaration - -| Name | Type | -| :-------- | :---------------------------------- | -| `chainID` | `undefined` \| `string` \| `number` | - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md deleted file mode 100644 index 1b94a629..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md +++ /dev/null @@ -1,278 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -A class that provides indexing functionality for Hypercerts. - -## Implements - -- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default-1.md#constructor) - -### Properties - -- [\_graphClient](internal.default-1.md#_graphclient) - -### Accessors - -- [graphClient](internal.default-1.md#graphclient) - -### Methods - -- [claimById](internal.default-1.md#claimbyid) -- [claimsByOwner](internal.default-1.md#claimsbyowner) -- [firstClaims](internal.default-1.md#firstclaims) -- [fractionById](internal.default-1.md#fractionbyid) -- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) -- [fractionsByOwner](internal.default-1.md#fractionsbyowner) - -## Constructors - -### constructor - -• **new default**(`options`) - -Creates a new instance of the `HypercertIndexer` class. - -#### Parameters - -| Name | Type | Description | -| :------------------ | :------- | :----------------------------------------- | -| `options` | `Object` | The configuration options for the indexer. | -| `options.graphUrl?` | `string` | - | - -#### Defined in - -[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) - -## Properties - -### \_graphClient - -• `Private` **\_graphClient**: `Object` - -The Graph client used by the indexer. - -#### Type declaration - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Defined in - -[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) - -## Accessors - -### graphClient - -• `get` **graphClient**(): `Object` - -Gets the Graph client used by the indexer. - -#### Returns - -`Object` - -The Graph client. - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Implementation of - -[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) - -#### Defined in - -[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) - -## Methods - -### claimById - -▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -Gets a claim by its ID. - -#### Parameters - -| Name | Type | Description | -| :--- | :------- | :------------------- | -| `id` | `string` | The ID of the claim. | - -#### Returns - -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -A Promise that resolves to the claim. - -#### Implementation of - -HypercertIndexerInterface.claimById - -#### Defined in - -[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) - ---- - -### claimsByOwner - -▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -Gets the claims owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.claimsByOwner - -#### Defined in - -[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) - ---- - -### firstClaims - -▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -Gets the most recent claims. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :-------------------- | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.firstClaims - -#### Defined in - -[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) - ---- - -### fractionById - -▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -Gets a claim token by its ID. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------- | :------------------------- | -| `fractionId` | `string` | The ID of the claim token. | - -#### Returns - -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -A Promise that resolves to the claim token. - -#### Implementation of - -HypercertIndexerInterface.fractionById - -#### Defined in - -[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) - ---- - -### fractionsByClaim - -▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -Gets the claim tokens for a given claim. - -#### Parameters - -| Name | Type | Default value | Description | -| :-------- | :----------------------------------------- | :------------------- | :-------------------- | -| `claimId` | `string` | `undefined` | The ID of the claim. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByClaim - -#### Defined in - -[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) - ---- - -### fractionsByOwner - -▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -Gets the claim tokens owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByOwner - -#### Defined in - -[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md deleted file mode 100644 index 1538ce61..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md +++ /dev/null @@ -1,131 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -The EasEvaluator class provides methods for signing off-chain attestations of evaluations. -Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. - -## Table of contents - -### Constructors - -- [constructor](internal.default-2.md#constructor) - -### Properties - -- [offChain](internal.default-2.md#offchain) -- [readonly](internal.default-2.md#readonly) -- [signer](internal.default-2.md#signer) - -### Methods - -- [getSignature](internal.default-2.md#getsignature) -- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) - -## Constructors - -### constructor - -• **new default**(`config`) - -Creates a new EasEvaluator instance. - -#### Parameters - -| Name | Type | Description | -| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | - -#### Defined in - -[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) - -## Properties - -### offChain - -• **offChain**: `Offchain` - -The Offchain instance used for signing off-chain attestations. - -#### Defined in - -[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -The TypedDataSigner instance used for signing typed data. - -#### Defined in - -[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) - -## Methods - -### getSignature - -▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> - -Gets a signature for an off-chain attestation. - -#### Parameters - -| Name | Type | Description | -| :------------ | :------- | :------------------------------------------------ | -| `encodedData` | `string` | The encoded data to sign. | -| `recipient` | `string` | The address of the recipient of the attestation. | -| `schemaUid` | `string` | The UID of the schema to use for the attestation. | - -#### Returns - -`Promise`<`SignedOffchainAttestation`\> - -- The signature for the attestation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) - ---- - -### signOfflineEvaluation - -▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> - -Signs an offline evaluation. - -**`Throws`** - -- If the evaluation data is malformed. - -#### Parameters - -| Name | Type | Description | -| :----------- | :----------------------------------------------- | :--------------------------- | -| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | - -#### Returns - -`Promise`<`undefined` \| `SignedOffchainAttestation`\> - -- The signature for the evaluation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md deleted file mode 100644 index 86daa5e4..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md +++ /dev/null @@ -1,110 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -## Implements - -- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default.md#constructor) - -### Properties - -- [eas](internal.default.md#eas) -- [readonly](internal.default.md#readonly) -- [signer](internal.default.md#signer) -- [storage](internal.default.md#storage) - -### Methods - -- [submitEvaluation](internal.default.md#submitevaluation) - -## Constructors - -### constructor - -• **new default**(`config?`) - -#### Parameters - -| Name | Type | -| :------- | :------------------------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | - -#### Defined in - -[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) - -## Properties - -### eas - -• **eas**: [`default`](internal.default-2.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -#### Defined in - -[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) - ---- - -### storage - -• **storage**: [`HypercertsStorage`](HypercertsStorage.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) - -## Methods - -### submitEvaluation - -▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------------------------------------------------------------------ | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | - -#### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Implementation of - -EvaluatorInterface.submitEvaluation - -#### Defined in - -[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md deleted file mode 100644 index 4606b46e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md +++ /dev/null @@ -1,56 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation - -# Interface: DuplicateEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) -- [explanation](DuplicateEvaluation.md#explanation) -- [realHypercert](DuplicateEvaluation.md#realhypercert) -- [type](DuplicateEvaluation.md#type) - -## Properties - -### duplicateHypercerts - -• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] - -#### Defined in - -[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) - ---- - -### explanation - -• **explanation**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) - ---- - -### realHypercert - -• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) - ---- - -### type - -• **type**: `"duplicate"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md deleted file mode 100644 index 205b7004..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md +++ /dev/null @@ -1,56 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation - -# Interface: EASEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [chainId](EASEvaluation.md#chainid) -- [contract](EASEvaluation.md#contract) -- [type](EASEvaluation.md#type) -- [uid](EASEvaluation.md#uid) - -## Properties - -### chainId - -• **chainId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) - ---- - -### contract - -• **contract**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) - ---- - -### type - -• **type**: `"EAS"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) - ---- - -### uid - -• **uid**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md deleted file mode 100644 index 3dcea656..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md +++ /dev/null @@ -1,167 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata - -# Interface: HypercertClaimdata - -Properties of an impact claim - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [contributors](HypercertClaimdata.md#contributors) -- [impact_scope](HypercertClaimdata.md#impact_scope) -- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) -- [rights](HypercertClaimdata.md#rights) -- [work_scope](HypercertClaimdata.md#work_scope) -- [work_timeframe](HypercertClaimdata.md#work_timeframe) - -## Properties - -### contributors - -• **contributors**: `Object` - -Contributors - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) - ---- - -### impact_scope - -• **impact_scope**: `Object` - -Scopes of impact - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) - ---- - -### impact_timeframe - -• **impact_timeframe**: `Object` - -Impact time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) - ---- - -### rights - -• `Optional` **rights**: `Object` - -Rights - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) - ---- - -### work_scope - -• **work_scope**: `Object` - -Scopes of work - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) - ---- - -### work_timeframe - -• **work_timeframe**: `Object` - -Work time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md deleted file mode 100644 index 0483b520..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md +++ /dev/null @@ -1,341 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface - -# Interface: HypercertClientInterface - -The interface for the Hypercert client. - -## Hierarchy - -- [`HypercertClientMethods`](HypercertClientMethods.md) - -- [`HypercertClientState`](HypercertClientState.md) - - ↳ **`HypercertClientInterface`** - -## Implemented by - -- [`HypercertClient`](../classes/HypercertClient.md) - -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) -- [contract](HypercertClientInterface.md#contract) -- [createAllowlist](HypercertClientInterface.md#createallowlist) -- [indexer](HypercertClientInterface.md#indexer) -- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) -- [mintClaim](HypercertClientInterface.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) -- [readonly](HypercertClientInterface.md#readonly) -- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) -- [storage](HypercertClientInterface.md#storage) - -## Properties - -### batchMintClaimFractionsFromAllowlists - -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) - -#### Defined in - -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) - ---- - -### burnClaimFraction - -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`): `Promise`<`ContractTransaction`\> - -Burns a claim fraction. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) - -#### Defined in - -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) - ---- - -### contract - -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) - -#### Defined in - -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) - ---- - -### createAllowlist - -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Creates a new allowlist and mints a new claim with the allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) - -#### Defined in - -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) - ---- - -### indexer - -• **indexer**: [`default`](../classes/internal.default-1.md) - -The indexer used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) - -#### Defined in - -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) - ---- - -### mergeClaimUnits - -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`): `Promise`<`ContractTransaction`\> - -Merges multiple claim fractions into a single claim. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) - -#### Defined in - -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) - ---- - -### mintClaim - -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Mints a new claim. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) - -#### Defined in - -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) - ---- - -### mintClaimFractionFromAllowlist - -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> - -Mints a claim fraction from an allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) - -#### Defined in - -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) - -#### Defined in - -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) - ---- - -### splitClaimUnits - -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> - -Splits a claim into multiple fractions. - -##### Parameters - -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) - -#### Defined in - -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) - ---- - -### storage - -• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) - -The storage layer used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) - -#### Defined in - -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md deleted file mode 100644 index 734ccbee..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md +++ /dev/null @@ -1,239 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods - -# Interface: HypercertClientMethods - -The methods for the Hypercert client. - -## Hierarchy - -- **`HypercertClientMethods`** - - ↳ [`HypercertClientInterface`](HypercertClientInterface.md) - -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) -- [createAllowlist](HypercertClientMethods.md#createallowlist) -- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) -- [mintClaim](HypercertClientMethods.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) - -## Properties - -### batchMintClaimFractionsFromAllowlists - -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) - ---- - -### burnClaimFraction - -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`): `Promise`<`ContractTransaction`\> - -Burns a claim fraction. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) - ---- - -### createAllowlist - -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Creates a new allowlist and mints a new claim with the allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) - ---- - -### mergeClaimUnits - -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`): `Promise`<`ContractTransaction`\> - -Merges multiple claim fractions into a single claim. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) - ---- - -### mintClaim - -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Mints a new claim. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) - ---- - -### mintClaimFractionFromAllowlist - -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> - -Mints a claim fraction from an allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) - ---- - -### splitClaimUnits - -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> - -Splits a claim into multiple fractions. - -##### Parameters - -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md deleted file mode 100644 index 2d90a599..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState - -# Interface: HypercertClientState - -The state of the Hypercert client. - -## Hierarchy - -- **`HypercertClientState`** - - ↳ [`HypercertClientInterface`](HypercertClientInterface.md) - -## Table of contents - -### Properties - -- [contract](HypercertClientState.md#contract) -- [indexer](HypercertClientState.md#indexer) -- [readonly](HypercertClientState.md#readonly) -- [storage](HypercertClientState.md#storage) - -## Properties - -### contract - -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. - -#### Defined in - -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) - ---- - -### indexer - -• **indexer**: [`default`](../classes/internal.default-1.md) - -The indexer used by the client. - -#### Defined in - -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Defined in - -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) - ---- - -### storage - -• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) - -The storage layer used by the client. - -#### Defined in - -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md deleted file mode 100644 index 6ebed93a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md +++ /dev/null @@ -1,47 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema - -# Interface: HypercertEvaluationSchema - -Schema for evaluating Hypercerts across different sources and evaluation types - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [creator](HypercertEvaluationSchema.md#creator) -- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) -- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) - -## Properties - -### creator - -• **creator**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) - ---- - -### evaluationData - -• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) - ---- - -### evaluationSource - -• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md deleted file mode 100644 index f18c409f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md +++ /dev/null @@ -1,176 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface - -# Interface: HypercertIndexerInterface - -## Implemented by - -- [`default`](../classes/internal.default-1.md) - -## Table of contents - -### Properties - -- [claimById](HypercertIndexerInterface.md#claimbyid) -- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) -- [firstClaims](HypercertIndexerInterface.md#firstclaims) -- [fractionById](HypercertIndexerInterface.md#fractionbyid) -- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) -- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) -- [graphClient](HypercertIndexerInterface.md#graphclient) - -## Properties - -### claimById - -• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -#### Type declaration - -▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -##### Parameters - -| Name | Type | -| :--- | :------- | -| `id` | `string` | - -##### Returns - -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) - ---- - -### claimsByOwner - -• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -#### Type declaration - -▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `owner` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) - ---- - -### firstClaims - -• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -#### Type declaration - -▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) - ---- - -### fractionById - -• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -#### Type declaration - -▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -##### Parameters - -| Name | Type | -| :----------- | :------- | -| `fractionId` | `string` | - -##### Returns - -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) - ---- - -### fractionsByClaim - -• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -#### Type declaration - -▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `claimId` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) - ---- - -### fractionsByOwner - -• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -#### Type declaration - -▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `owner` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) - ---- - -### graphClient - -• **graphClient**: `any` - -#### Defined in - -[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md deleted file mode 100644 index d65362f3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md +++ /dev/null @@ -1,123 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata - -# Interface: HypercertMetadata - -Claim data for hypercert. ERC1155 Metadata compliant - -## Table of contents - -### Properties - -- [allowList](HypercertMetadata.md#allowlist) -- [description](HypercertMetadata.md#description) -- [external_url](HypercertMetadata.md#external_url) -- [hypercert](HypercertMetadata.md#hypercert) -- [image](HypercertMetadata.md#image) -- [name](HypercertMetadata.md#name) -- [properties](HypercertMetadata.md#properties) -- [ref](HypercertMetadata.md#ref) -- [version](HypercertMetadata.md#version) - -## Properties - -### allowList - -• `Optional` **allowList**: `string` - -A CID pointer to the merke tree proof json on ipfs - -#### Defined in - -[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) - ---- - -### description - -• **description**: `string` - -Describes the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) - ---- - -### external_url - -• `Optional` **external_url**: `string` - -An url pointing to the external website of the project - -#### Defined in - -[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) - ---- - -### hypercert - -• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) - -#### Defined in - -[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) - ---- - -### image - -• **image**: `string` - -A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. - -#### Defined in - -[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) - ---- - -### name - -• **name**: `string` - -Identifies the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) - ---- - -### properties - -• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] - -#### Defined in - -[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) - ---- - -### ref - -• `Optional` **ref**: `string` - -Describes the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) - ---- - -### version - -• `Optional` **version**: `string` - -The version of Hypercert schema used to describe this hypercert - -#### Defined in - -[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md deleted file mode 100644 index 773c41d3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md +++ /dev/null @@ -1,45 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer - -# Interface: HypercertPointer - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [chainId](HypercertPointer.md#chainid) -- [claimId](HypercertPointer.md#claimid) -- [contract](HypercertPointer.md#contract) - -## Properties - -### chainId - -• **chainId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) - ---- - -### claimId - -• **claimId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) - ---- - -### contract - -• **contract**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md deleted file mode 100644 index 5f5871f2..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md +++ /dev/null @@ -1,34 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation - -# Interface: IPFSEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [cid](IPFSEvaluation.md#cid) -- [type](IPFSEvaluation.md#type) - -## Properties - -### cid - -• **cid**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) - ---- - -### type - -• **type**: `"IPFS"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md deleted file mode 100644 index 3e4b3b92..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md +++ /dev/null @@ -1,45 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation - -# Interface: SimpleTextEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [hypercert](SimpleTextEvaluation.md#hypercert) -- [text](SimpleTextEvaluation.md#text) -- [type](SimpleTextEvaluation.md#type) - -## Properties - -### hypercert - -• **hypercert**: [`HypercertPointer`](HypercertPointer.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) - ---- - -### text - -• **text**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) - ---- - -### type - -• **type**: `"simpleText"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md deleted file mode 100644 index 53ac36ed..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md +++ /dev/null @@ -1,43 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface - -# Interface: EvaluatorInterface - -[internal](../modules/internal.md).EvaluatorInterface - -## Implemented by - -- [`default`](../classes/internal.default.md) - -## Table of contents - -### Properties - -- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) - -## Properties - -### submitEvaluation - -• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -##### Parameters - -| Name | Type | Description | -| :----------- | :---------------------------------------------------------- | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | - -##### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Defined in - -[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md deleted file mode 100644 index 273912bc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md +++ /dev/null @@ -1,169 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata - -# Interface: HypercertClaimdata - -[internal](../modules/internal.md).HypercertClaimdata - -Properties of an impact claim - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [contributors](internal.HypercertClaimdata.md#contributors) -- [impact_scope](internal.HypercertClaimdata.md#impact_scope) -- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) -- [rights](internal.HypercertClaimdata.md#rights) -- [work_scope](internal.HypercertClaimdata.md#work_scope) -- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) - -## Properties - -### contributors - -• **contributors**: `Object` - -Contributors - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) - ---- - -### impact_scope - -• **impact_scope**: `Object` - -Scopes of impact - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) - ---- - -### impact_timeframe - -• **impact_timeframe**: `Object` - -Impact time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) - ---- - -### rights - -• `Optional` **rights**: `Object` - -Rights - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) - ---- - -### work_scope - -• **work_scope**: `Object` - -Scopes of work - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) - ---- - -### work_timeframe - -• **work_timeframe**: `Object` - -Work time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md deleted file mode 100644 index 3f4ea346..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md +++ /dev/null @@ -1,17 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter - -# Interface: HypercertMinter - -[internal](../modules/internal.md).HypercertMinter - -Hypercert contract interface. - -**`Notice`** - -hacky loop to get typedoc to generate all the docs - -## Hierarchy - -- `HypercertMinter` - - ↳ **`HypercertMinter`** diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md deleted file mode 100644 index 15998930..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md +++ /dev/null @@ -1,638 +0,0 @@ -[Hypercerts SDK Documentation](README.md) / Exports - -# Hypercerts SDK Documentation - -## Table of contents - -### References - -- [Claim](modules.md#claim) -- [ClaimToken](modules.md#claimtoken) -- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) - -### Modules - -- [internal](modules/internal.md) - -### Classes - -- [ClientError](classes/ClientError.md) -- [ConfigurationError](classes/ConfigurationError.md) -- [FetchError](classes/FetchError.md) -- [HypercertClient](classes/HypercertClient.md) -- [HypercertsStorage](classes/HypercertsStorage.md) -- [InvalidOrMissingError](classes/InvalidOrMissingError.md) -- [MalformedDataError](classes/MalformedDataError.md) -- [MintingError](classes/MintingError.md) -- [StorageError](classes/StorageError.md) -- [UnknownSchemaError](classes/UnknownSchemaError.md) -- [UnsupportedChainError](classes/UnsupportedChainError.md) - -### Interfaces - -- [CustomError](interfaces/CustomError.md) -- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) -- [EASEvaluation](interfaces/EASEvaluation.md) -- [HypercertClaimdata](interfaces/HypercertClaimdata.md) -- [HypercertClientInterface](interfaces/HypercertClientInterface.md) -- [HypercertClientMethods](interfaces/HypercertClientMethods.md) -- [HypercertClientState](interfaces/HypercertClientState.md) -- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) -- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) -- [HypercertMetadata](interfaces/HypercertMetadata.md) -- [HypercertPointer](interfaces/HypercertPointer.md) -- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) -- [IPFSEvaluation](interfaces/IPFSEvaluation.md) -- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) - -### Type Aliases - -- [AllowlistEntry](modules.md#allowlistentry) -- [Deployment](modules.md#deployment) -- [EvaluationData](modules.md#evaluationdata) -- [EvaluationSource](modules.md#evaluationsource) -- [HypercertClientConfig](modules.md#hypercertclientconfig) -- [HypercertClientProps](modules.md#hypercertclientprops) -- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) -- [HypercertStorageConfig](modules.md#hypercertstorageconfig) -- [HypercertsSdkError](modules.md#hypercertssdkerror) -- [QueryParams](modules.md#queryparams) -- [SupportedChainIds](modules.md#supportedchainids) -- [TransferRestrictions](modules.md#transferrestrictions) - -### Properties - -- [ClaimByIdQuery](modules.md#claimbyidquery) - -### Variables - -- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) -- [TransferRestrictions](modules.md#transferrestrictions-1) - -### Functions - -- [execute](modules.md#execute) -- [formatDate](modules.md#formatdate) -- [formatHypercertData](modules.md#formathypercertdata) -- [formatUnixTime](modules.md#formatunixtime) -- [validateAllowlist](modules.md#validateallowlist) -- [validateClaimData](modules.md#validateclaimdata) -- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) -- [validateMetaData](modules.md#validatemetadata) -- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) -- [verifyMerkleProof](modules.md#verifymerkleproof) -- [verifyMerkleProofs](modules.md#verifymerkleproofs) - -## References - -### Claim - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimToken - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimTokensByClaimQuery - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - -## Type Aliases - -### AllowlistEntry - -Ƭ **AllowlistEntry**: `Object` - -Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol - -**`Param`** - -Address of the recipient - -**`Param`** - -Number of units allocated to the recipient - -#### Type declaration - -| Name | Type | -| :-------- | :------------- | -| `address` | `string` | -| `units` | `BigNumberish` | - -#### Defined in - -[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) - ---- - -### Deployment - -Ƭ **Deployment**: `Object` - -Represents a deployment of a contract on a specific network. - -#### Type declaration - -| Name | Type | Description | -| :---------------- | :------- | :--------------------------------------------------------------------------------------- | -| `chainId` | `number` | The ID of the network on which the contract is deployed. | -| `chainName` | `string` | The name of the network on which the contract is deployed. | -| `contractAddress` | `string` | The address of the deployed contract. | -| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | - -#### Defined in - -[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) - ---- - -### EvaluationData - -Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) - -This file was automatically generated by json-schema-to-typescript. -DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, -and run json-schema-to-typescript to regenerate this file. - -#### Defined in - -[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) - ---- - -### EvaluationSource - -Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) - ---- - -### HypercertClientConfig - -Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } - -Configuration options for the Hypercert client. - -#### Defined in - -[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) - ---- - -### HypercertClientProps - -Ƭ **HypercertClientProps**: `Object` - -The props for the Hypercert client. - -#### Type declaration - -| Name | Type | Description | -| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | -| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | - -#### Defined in - -[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) - ---- - -### HypercertEvaluatorConfig - -Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } - -Configuration options for the Hypercert evaluator. - -**`Note`** - -The signer is required for submitting evaluations. - -#### Defined in - -[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) - ---- - -### HypercertStorageConfig - -Ƭ **HypercertStorageConfig**: `Object` - -Configuration options for the Hypercert storage layer. - -**`Note`** - -The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. - -#### Type declaration - -| Name | Type | Description | -| :------------------ | :------- | :------------------------------ | -| `nftStorageToken?` | `string` | The API token for NFT.storage. | -| `web3StorageToken?` | `string` | The API token for Web3.storage. | - -#### Defined in - -[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) - ---- - -### HypercertsSdkError - -Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) - -#### Defined in - -[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) - ---- - -### QueryParams - -Ƭ **QueryParams**: `Object` - -#### Index signature - -▪ [key: `string`]: `any` - -#### Type declaration - -| Name | Type | -| :---------------- | :------------------ | -| `first` | `number` | -| `orderDirections` | `"asc"` \| `"desc"` | -| `skip` | `number` | - -#### Defined in - -[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) - ---- - -### SupportedChainIds - -Ƭ **SupportedChainIds**: `5` \| `10` - -#### Defined in - -[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) - ---- - -### TransferRestrictions - -Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] - -#### Defined in - -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) - -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) - -## Properties - -### ClaimByIdQuery - -• **ClaimByIdQuery**: `any` - -## Variables - -### INDEFINITE_DATE_STRING - -• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` - -#### Defined in - -[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) - ---- - -### TransferRestrictions - -• `Const` **TransferRestrictions**: `Object` - -Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol - -**`Dev`** - -AllowAll: All transfers are allowed - -**`Dev`** - -DisallowAll: All transfers are disallowed - -**`Dev`** - -FromCreatorOnly: Only the creator can transfer the Hypercert - -#### Type declaration - -| Name | Type | -| :---------------- | :--- | -| `AllowAll` | `0` | -| `DisallowAll` | `1` | -| `FromCreatorOnly` | `2` | - -#### Defined in - -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) - -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) - -## Functions - -### execute - -▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> - -#### Parameters - -| Name | Type | -| :--------------- | :-------------------------------- | -| `document` | `GraphQLOperation`<`any`, `any`\> | -| `variables` | `any` | -| `context?` | `any` | -| `rootValue?` | `any` | -| `operationName?` | `string` | - -#### Returns - -`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> - -#### Defined in - -node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 - ---- - -### formatDate - -▸ **formatDate**(`date`): `string` - -#### Parameters - -| Name | Type | -| :----- | :----- | -| `date` | `Date` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) - ---- - -### formatHypercertData - -▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) - -Formats input data to an object containing HypercertMetadata including appropriate labels - -#### Parameters - -| Name | Type | -| :----------------------- | :----------------------------------------------- | -| `«destructured»` | `Object` | -| › `contributors` | `string`[] | -| › `description` | `string` | -| › `excludedImpactScope` | `string`[] | -| › `excludedRights` | `string`[] | -| › `excludedWorkScope` | `string`[] | -| › `external_url?` | `string` | -| › `image` | `string` | -| › `impactScope` | `string`[] | -| › `impactTimeframeEnd` | `number` | -| › `impactTimeframeStart` | `number` | -| › `name` | `string` | -| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | -| › `rights` | `string`[] | -| › `version` | `string` | -| › `workScope` | `string`[] | -| › `workTimeframeEnd` | `number` | -| › `workTimeframeStart` | `number` | - -#### Returns - -[`FormatResult`](modules/internal.md#formatresult) - -#### Defined in - -[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) - ---- - -### formatUnixTime - -▸ **formatUnixTime**(`seconds`): `string` - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `seconds` | `number` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) - ---- - -### validateAllowlist - -▸ **validateAllowlist**(`data`, `units`): `Object` - -Validates the data for an allowlist. - -#### Parameters - -| Name | Type | Description | -| :------ | :---------------------------------------------- | :------------------------------------------ | -| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | -| `units` | `BigNumberish` | The total number of units in the allowlist. | - -#### Returns - -`Object` - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -| Name | Type | -| :------- | :------------------------------------------ | -| `errors` | `Record`<`string`, `string` \| `string`[]\> | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) - ---- - -### validateClaimData - -▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :------------------------------------------------------- | :-------------------- | -| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) - ---- - -### validateDuplicateEvaluationData - -▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a duplicate evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :--------------------------------------------------------- | :-------------------- | -| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) - ---- - -### validateMetaData - -▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :----------------------------------------------------- | :-------------------- | -| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) - ---- - -### validateSimpleTextEvaluationData - -▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :----------------------------------------------------------- | :-------------------- | -| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) - ---- - -### verifyMerkleProof - -▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` - -Verifies a Merkle proof for a given address and units. - -**`Throws`** - -If the Merkle proof verification fails. - -#### Parameters - -| Name | Type | Description | -| :-------------- | :------------- | :-------------------------------------- | -| `root` | `string` | The Merkle root hash to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish` | The units to verify. | -| `proof` | `string`[] | The Merkle proof to verify. | - -#### Returns - -`void` - -#### Defined in - -[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) - ---- - -### verifyMerkleProofs - -▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` - -Batch verifies Merkle proofs for multiple roots, units and proofs for a single address - -**`Throws`** - -If the Merkle proof verification fails. - -**`Notice`** - -Wrapper around `verifyMerkleProof` to batch verify multiple proofs - -#### Parameters - -| Name | Type | Description | -| :-------------- | :--------------- | :---------------------------------------- | -| `roots` | `string`[] | The Merkle root hashes to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish`[] | The units to verify. | -| `proofs` | `string`[][] | The Merkle proofs to verify. | - -#### Returns - -`void` - -#### Defined in - -[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md deleted file mode 100644 index d20a3804..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md +++ /dev/null @@ -1,307 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal - -# Module: internal - -## Table of contents - -### Classes - -- [default](../classes/internal.default.md) -- [default](../classes/internal.default-1.md) -- [default](../classes/internal.default-2.md) - -### Interfaces - -- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) -- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) -- [HypercertMinter](../interfaces/internal.HypercertMinter.md) - -### Type Aliases - -- [Claim](internal.md#claim) -- [ClaimByIdQuery](internal.md#claimbyidquery) -- [ClaimToken](internal.md#claimtoken) -- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) -- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) -- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) -- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) -- [Exact](internal.md#exact) -- [FormatResult](internal.md#formatresult) -- [InputMaybe](internal.md#inputmaybe) -- [Maybe](internal.md#maybe) -- [OrderDirection](internal.md#orderdirection) -- [RecentClaimsQuery](internal.md#recentclaimsquery) -- [Scalars](internal.md#scalars) -- [ValidationResult](internal.md#validationresult) - -## Type Aliases - -### Claim - -Ƭ **Claim**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | -| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | - -#### Defined in - -[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) - ---- - -### ClaimByIdQuery - -Ƭ **ClaimByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | - -#### Defined in - -[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) - ---- - -### ClaimToken - -Ƭ **ClaimToken**: `Object` - -#### Type declaration - -| Name | Type | -| :---------- | :--------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `claim` | [`Claim`](internal.md#claim) | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | - -#### Defined in - -[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) - ---- - -### ClaimTokenByIdQuery - -Ƭ **ClaimTokenByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | - -#### Defined in - -[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) - ---- - -### ClaimTokensByClaimQuery - -Ƭ **ClaimTokensByClaimQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :------------------------------------------------------------------------------------------------------------------ | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) - ---- - -### ClaimTokensByOwnerQuery - -Ƭ **ClaimTokensByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | - -#### Defined in - -[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) - ---- - -### ClaimsByOwnerQuery - -Ƭ **ClaimsByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) - ---- - -### Exact - -Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } - -#### Type parameters - -| Name | Type | -| :--- | :--------------- | -| `T` | extends `Object` | - -#### Defined in - -[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) - ---- - -### FormatResult - -Ƭ **FormatResult**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------ | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | -| `errors` | `Record`<`string`, `string`\> \| `null` | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) - ---- - -### InputMaybe - -Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) - ---- - -### Maybe - -Ƭ **Maybe**<`T`\>: `T` \| `null` - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) - ---- - -### OrderDirection - -Ƭ **OrderDirection**: `"asc"` \| `"desc"` - -Defines the order direction, either ascending or descending - -#### Defined in - -[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) - ---- - -### RecentClaimsQuery - -Ƭ **RecentClaimsQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) - ---- - -### Scalars - -Ƭ **Scalars**: `Object` - -All built-in and custom scalars, mapped to their actual values - -#### Type declaration - -| Name | Type | -| :----------- | :-------- | -| `BigDecimal` | `any` | -| `BigInt` | `any` | -| `Boolean` | `boolean` | -| `Bytes` | `any` | -| `Float` | `number` | -| `ID` | `string` | -| `Int` | `number` | -| `Int8` | `any` | -| `String` | `string` | - -#### Defined in - -[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) - ---- - -### ValidationResult - -Ƭ **ValidationResult**: `Object` - -The result of a validation. - -**`Property`** - -Whether the data is valid. - -**`Property`** - -A map of errors, where the key is the field that failed validation and the value is the error message. - -#### Type declaration - -| Name | Type | -| :------- | :---------------------------- | -| `errors` | `Record`<`string`, `string`\> | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md deleted file mode 100644 index 60f4e5e7..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md +++ /dev/null @@ -1,18 +0,0 @@ -# Errors in the SDK - -Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. - -### Handling Errors - -To support debugging we've implemented some custom errors. - -| Error | Reason | Payload | -| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | -| ClientError | An error caused by the client | `{ [key: string]: unknown }` | -| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | -| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | -| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | -| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | -| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | -| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | -| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md deleted file mode 100644 index c5399a4f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md +++ /dev/null @@ -1,13 +0,0 @@ -# Evaluations - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## Respond / or contest an evaluation - -To create an evaluation of a hypercert - -```js -TODO; -``` - -_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md deleted file mode 100644 index d5ff1226..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md +++ /dev/null @@ -1,57 +0,0 @@ -# Minting - -## Token design - -Hypercerts are semi-fungible tokens. -Thus, each hypercert is represented on-chain by a group of fraction tokens, -each representing a fraction of ownership over the hypercert. -If you want to split your fraction token, or merge multiple tokens into one, -check out the section on [splitting and merging](./split-merge.md). - -## Minting your first hypercert - -To mint a hypercert you need to provide the `metadata`, total amount of `units` and the preferred `TransferRestrictions`. -The resulting hypercert will be wholly owned by the creator. - -```js -import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" - -const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; - -const tx: Promise = await hypercerts.mintClaim({ - metadata, - totalUnits, - transferRestrictions: TransferRestrictions.FromCreatorOnly, -}); -``` - -> **Note** If you did not initialize your HypercertsClient with an `operator`, `nftStorageToken` and `web3StorageToken`, the client will run in [read-only mode](#read-only-mode) and this will fail. - -Let's see what happens under the hood: - -First, `mintClaim` checks that the client is not `read only` and that the operator is a `Signer`. If not, it throws an `InvalidOrMissingError`. - -Next, the function validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. The function then stores the metadata on `IPFS` using the `storeMetadata` method and returns the `CID` for the metadata. - -Finally, we call the mintClaim function on the contract with the signer `address`, total `units`, `CID`, and `transfer restriction` as parameters. If `overrides` are provided, the function uses them to send the transaction. Otherwise, it sends the transaction without overrides. - -## Transfer restrictions - -When minting a Hypercert, you must pass in a `TransferRestriction` policy. For now there are only 3 implemented policies: - -```js -enum TransferRestrictions { - // Unrestricted - AllowAll, - // All transfers disabled after minting - DisallowAll, - // Only the original creator can transfer - FromCreatorOnly -} -``` - -## Reference - -See the [code](https://github.com/hypercerts-org/hypercerts/tree/main/sdk/src/client.ts) -for more details on how we implement minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md deleted file mode 100644 index 98ebbb83..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md +++ /dev/null @@ -1,306 +0,0 @@ -# Querying - -## Overview - -The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient -has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, -HypercertIndexer, and HypercertMinter classes, respectively. - -```js -const { - client: { storage }, -} = new HypercertClient({}); -``` - -The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. - -```js -const { - client: { indexer }, -} = new HypercertClient({}); -``` - -The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. -It is used by the HypercertClient to retrieve event-based data via the subgraph. - -```js -const { - client: { contract }, -} = new HypercertClient({}); -``` - -Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used -by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. - -By providing instances of these classes through the `storage`, `indexer`, and `contract` getters, the HypercertClient allows developers to easily interact with the various components of the Hypercert system directly. -For example, a developer could use the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the contract. - -## Indexer - -For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. - -### Live graph playground - -To inspect the subgraph and explore queries, have a look at the Graph playground for Goerli testnet and Optimism mainnet: - -- [Goerli dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) -- [Optimism dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) - -### Graph client - -Since the client is fully typed, it's easy to explore the functionalities using code completion in IDEs. - -Here's one example from our frontend where we let [react-query](https://www.npmjs.com/package/%2540tanstack/react-query) frequently update the call to the graph: - -```js -import { useHypercertClient } from "./hypercerts-client"; -import { useQuery } from "@tanstack/react-query"; - -export const useFractionsByOwner = (owner: string) => { - const { - client: { indexer }, - } = useHypercertClient(); - - return useQuery( - ["hypercerts", "fractions", "owner", owner], - () => indexer.fractionsByOwner(owner), - { enabled: !!owner, refetchInterval: 5000 }, - ); -}; -``` - -### Queries: Claims - -These tables show the input parameters and output fields for each of the GraphQL queries in [claims.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/claims.graphql). -A claim represents 1 Hypercert and all of the common data across all claim/fraction tokens. - -#### `ClaimsByOwner` - -The `ClaimsByOwner` query retrieves an array of claims that belong to a specific owner. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------- | ------------- | -| `owner` | `Bytes` | The address of the owner whose claims to retrieve. | "" | -| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | -| `first` | `Int` | The number of claims to retrieve. | `100` | -| `skip` | `Int` | The number of claims to skip. | `0` | - -##### Output - -The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -#### `RecentClaims` - -The RecentClaims query retrieves an array of the most recent claims on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | ---------------------------------- | ------------- | -| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | -| `first` | `Int` | The number of claims to retrieve. | `100` | -| `skip` | `Int` | The number of claims to skip. | `0` | - -##### Output - -The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -#### `ClaimByID` - -The ClaimById query retrieves a single claim by its ID on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | -| --------- | ----- | -------------------------------- | -| `id` | `ID!` | The ID of the claim to retrieve. | - -##### Output - -The query returns a claim object that matches the input parameter. The claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -### Queries: Fractions - -These tables show the input parameters and output fields for each of the GraphQL queries in [fractions.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/fractions.graphql). -A claim token represents a fraction of ownership of a Hypercert. - -#### `ClaimTokensByOwner` - -The `ClaimTokensByOwner` query retrieves an array of claim tokens that belong to a specific owner on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | -| `owner` | `Bytes` | The address of the owner whose claim tokens to retrieve. | "" | -| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | -| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | -| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | - -##### Output - -The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ------------------------------------------ | -| `chainName` | `String` | The name of the chain. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | - -The Claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ------------------------------------ | -| `id` | `ID` | The ID of the claim. | -| `creation` | `Int` | The timestamp of the claim creation. | -| `uri` | `String` | The URI of the claim metadata. | -| `totalUnits` | `BigInt` | The total number of units. | - -#### `ClaimTokensByClaim` - -The `ClaimTokensByClaim` query retrieves an array of claim tokens that belong to a specific claim on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | -| `claimId` | `String!` | The ID of the claim whose claim tokens to retrieve. | None | -| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | -| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | -| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | - -##### Output - -The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | - -#### `ClaimTokenById` Query - -The `ClaimTokenById` query retrieves a single claim token by its ID on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | -| --------- | ----- | -------------------------------------- | -| `id` | `ID!` | The ID of the claim token to retrieve. | - -##### Output - -The query returns a claim token object that matches the input parameter. The claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | - -The Claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ------------------------------------ | -| `id` | `ID` | The ID of the claim. | -| `creation` | `Int` | The timestamp of the claim creation. | -| `uri` | `String` | The URI of the claim metadata. | -| `totalUnits` | `BigInt` | The total number of units. | - -## Storage - -### Hypercert Metadata - -Currently, all metadata is stored off-chain in IPFS. Use the `storage` client to retrieve the metadata - -```js -const claimId = "0x822f17a9a5eecfd...85254363386255337"; -const { indexer, storage } = hypercertsClient; -// Get the on-chain claim -const claimById = await indexer.claimById(claimId); -// Get the off-chain metadata -const metadata = await storage.getMetadata(claimById.claim.uri); -``` - -## Contract - -### Typechain bindings - -We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, -which you can import and use from your TypeScript/JavaScript codebase. - -For example: - -```js -import { ethers } from "ethers"; -import { - HyperCertMinterFactory, - HypercertMinterABI, - IHypercertTokenABI, -} from "@hypercerts-org/sdk"; - -const provider = new ethers.getDefaultProvider(network); -const contractInterface = new ethers.utils.Interface(HypercertMinterABI); -const contract = new ethers.Contract( - contractAddress, - HypercertMinterABI, - provider, -); -const metadataUri = await contract.functions.uri(tokenId); -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md deleted file mode 100644 index 936cc05b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md +++ /dev/null @@ -1,101 +0,0 @@ -# Getting started with JavaScript - -The Hypercerts SDK makes it easy to integrate Hypercerts into your application or backend with JavaScript/TypeScript. - -## Installation - -Install the SDK using npm or yarn: - -```bash -npm install @hypercerts-org/sdk -# OR yarn add @hypercerts-org/sdk -``` - -## Get storage credentials (only required for minting) - -For now, we store all metadata (e.g. Hypercert claim data) on IPFS using [NFT.Storage](https://nft.storage/) and [web3.storage](https://web3.storage/). - -In order to mint a Hypercert, you will need to create API tokens for both services, which you can learn more about from their respective guides: - -- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) -- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) - -_Note: In the future, we want to also support other mechanisms for storing off-chain data._ - -## Initialize - -Import the SDK into your project and create a new instance of `HypercertClient` with your configuration options: - -```js -import { HypercertClient } from "@hypercerts-org/sdk"; -import { ethers } from "ethers"; - -// NOTE: you should replace this with your own JSON-RPC provider to the network -// This should have signing abilities and match the `chainId` passed into HypercertClient -const operator = ethers.providers.getDefaultProvider("goerli"); - -const client = new HypercertClient({ - chainId: 5, // goerli testnet - operator, - nftStorageToken, - web3StorageToken, -}); -``` - -Hypercerts is a multi-chain protocol. -See [here](./supported-networks.md) for a list of currently supported networks. - -> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). - -## Make a Hypercert - -Use the client object to interact with the Hypercert network. For example, you can use the `client.mintClaim` method to create a new claim: - -```js -import { - formatHypercertData, - TransferRestrictions, -} from "@hypercerts-org/sdk"; - -// Validate and format your Hypercert metadata -const { data: metadata, valid, errors } = formatHypercertData({ - name, - ... -}) - -// Check on errors -if (!valid) { - return console.error(errors); -} - -// Set the total amount of units available -const totalUnits: BigNumberish = 10_000_000 - -// Define the transfer restriction -const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly - -// Mint your Hypercert! -const tx = await client.mintClaim( - metadata, - totalUnits, - transferRestrictions, -); -``` - -For guidance on how to specify your metadata, see the [minting guide](../minting-guide/step-by-step.md). -This will validate the metadata, store claim metadata on IPFS, create a new hypercert on-chain, and return a transaction receipt. - -For more details, check out the [Minting Guide](./minting.md). - -## Query for Hypercerts - -You can also use the client to query the subgraph and retrieve which claims an address owns: - -```js -const claims = await client.indexer.fractionsByOwner(owner), -``` - -For more details, checkout the [Querying guide](./querying.md) -and our [Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet). - -That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md deleted file mode 100644 index 409a1e9d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md +++ /dev/null @@ -1,41 +0,0 @@ -# Getting started with Solidity - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -If you need the Solidity contracts or interfaces exported from the SDK, -please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). - -## Hypercerts deployments - -Hypercerts is a multi-chain protocol and we want to support any network that wants to make positive impact. -We plan to support at most 1 canonical contract deployment per network. -For a complete list of deployments and their contract addresses, see [Supported Networks](./supported-networks.md). - -## Installing the Hypercert contracts - -```bash -npm install @hypercerts-org/contracts -# or yarn add @hypercerts-org/contracts -``` - -## Using the Solidity interface - -If you want to call the Hypercerts contract on your network directly from Solidity, -we export the interface/ABI for you to use from your contract. - -```js -import { IHypercertToken } from "@hypercerts-org/contracts/IHypercertMinter.sol"; - -contract MyContract { - IHypercertToken hypercerts; - - function initialize(address _addr) public virtual initializer { - hypercerts = IHypercertToken(_addr); - } - - function uri(uint256 tokenID) public view returns (string memory _uri) { - _uri = hypercerts.uri(tokenID); - } -} - -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md deleted file mode 100644 index 1ac5556e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md +++ /dev/null @@ -1,29 +0,0 @@ -# Split and Merge - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## By Token Value - -### Split / merge token values - -```js -const { tokenIds } = await hypercerts.splitFraction({ - tokenId, - units: [10, 12, 15], -}); -const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); -``` - -## By Claim Data - -### Split / merge claim data - -```js -const { claimIds } = await hypercerts.splitClaim({ - claimId, - TODO: somehow specify hypercert subregions -}); -const { claimId} = await hypercerts.mergeClaims({ - claimIds, -}); -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md deleted file mode 100644 index 3bfd0f18..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md +++ /dev/null @@ -1,13 +0,0 @@ -# Supported networks - -Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. - -We want to support every network that wants to support positive impact! -If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). - -## Overview - -| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | -| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | -| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | -| Optimism | 10 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md deleted file mode 100644 index 72b3ee2d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md +++ /dev/null @@ -1,120 +0,0 @@ -# Deploy a new proxy contract - -This should be done only on rare occasions. For example, when: - -- We want to deploy to a new network -- We have updated the contract in a way that is _NOT_ backwards-compatible. - - For most upgrades, please use UUPS [upgrades](./upgrade.md). - -## Smart Contracts - -### Setup the `contracts/` environment - -Navigate to `contracts/`. Configure your `.env` file by following the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/contracts#setup). - -### Build and deploy the smart contracts - -If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. - -```javascript - "optimism-goeri": getChainConfig("optimism-goerli"), -``` - -Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. - -```sh -# Run in contracts/ -yarn build:hardhat -yarn hardhat deploy --network NETWORK -``` - -This will output the new proxy address. Update the root `README.md` with this new address. - -Now transfer ownership over the proxy contract to the multisig: - -```sh -yarn hardhat transfer-owner --network NETWORK --proxy PROXY_CONTRACT_ADDRESS --owner MULTISIG_ADDRESS -``` - -## Subgraph - -### Setup the `graph/` environment - -Navigate to `graph/`. Follow the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/graph#setup) -to get set up. - -### Deploy the subgraph - -Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). - -Now deploy the subgraph - -```sh -# Run in graph/ -yarn build -yarn deploy:hosted -``` - -## OpenZeppelin Defender - -### Create a new Supabase table - -Log into the [Supabase dashboard](https://app.supabase.com/). -We store all data in a single project, but use different tables for each network. -The table name should be suffixed by the network (e.g. `allowlistCache-goerli`). -If you are deploying to a new network, create a new table. You can copy the table schema and RLS policy from another pre-existing table. - -If you are deploying a new proxy contract to a network for which you already have another deployment, you'll have to make a judgement call as to whether you can reuse the existing table, whether you need to clear the existing table, or create another table. - -Note: We want to merge all the tables in this [issue](https://github.com/hypercerts-org/hypercerts/issues/477). - -### Update the OpenZeppelin Defender scripts - -Modify the Defender scripts to support the new network in `defender/src/networks.ts`. - -If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. - -Note: The entry point for deployment is in `defender/src/setup.ts`. - -### Setup the `defender/` environment - -Navigate to `defender/`. Follow the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/defender#setup) -to get set up. - -### Deploy defender scripts - -Deploy to OpenZeppelin Defender via - -```sh -# Run in defender/ -yarn deploy -``` - -## Hypercerts SDK - -TODO: Flesh this out - -Run the build in `contracts/`. - -(Soon to be deprecated) Publish `contracts/` to npm - -Configure the SDK to support the new network via the graphclient. - -Publish SDK to npm - -## Deploy the Dapp frontend - -Each frontend build is configured to run on a different network (e.g. `https://testnet.hypercerts.org`). You can use any CDN to serve the site (e.g. Netlify, Vercel, GitHub Pages, Cloudflare Pages, Fleek, Firebase Hosting). - -1. Configure your build environment with the environment variables specified in `frontend/.env.local.example`. - -2. Configure your builds to the following settings: - -- Build command: `yarn build:site` -- Build output directory: `/build` -- Root directory: `/` - -3. Configure the domain that you want for your build. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md deleted file mode 100644 index 05dc5b0c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md +++ /dev/null @@ -1,45 +0,0 @@ -# Errors - -## Deploying - -### Artifact for contract "HypercertMinter" not found - -#### Error message - -`Error HH700: Artifact for contract "HypercertMinter" not found.` - -#### Cause - -Attempting to deploy a contract with `npx hardhat deploy` before the contract has been compiled by hardhat. Contracts compiled by forge are currently not visible to hardhat (this could be a configuration problem). - -### insufficient funds for intrinsic transaction cost - -#### Error message - -`Error: insufficient funds for intrinsic transaction cost` - -#### Cause - -The environment variable `MNEMONIC` is not configured correctly. - -Alternatively, the wallet may not have enough funds for the selected network - -Causing pause twice - -Error: cannot estimate gas; transaction may fail or may require manual gas limit - -reason: 'execution reverted: Pausable: paused', - -#### Etherscan API - -Note: It can take between 5-10 minutes before a newly created etherscan API key becomes valid for queries to goerli. - -When using an etherscan API key that was too recently created, hardhat tasks using etherscan to verify transactions will exit with an error message: - -`Etherscan returned with message: NOTOK, reason: Invalid API Key` - -Despite this error the transaction may have succeeded, the hardhat task just can't confirm it. - -It is unknown if this is a problem for queries to mainnet as well. - -Metamask makes it very difficult to have multiple wallets. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md deleted file mode 100644 index 9b208595..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# DevOps - -We use this playbook to encapsulate our practices and current setup. - -## Setup dev environment - -- [Setup guide](./setup.md) -- [Plasmic setup](./plasmic.md) - -## Tasks - -- [Deploy new proxy contract](./deploy-proxy.md) -- [Upgrade contract](./upgrade.md) -- [Pause contract](./pause.md) - -## FAQ - -- [Common errors](./errors.md) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md deleted file mode 100644 index 2668f51e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md +++ /dev/null @@ -1,29 +0,0 @@ -# Pause / Unpause - -## Pause - -### Contract owned by an address - -Make sure you have set up your wallets and config from the [setup guide](./setup.md). - -To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: - -```sh -yarn hardhat pause --network NETWORK --address CONTRACT_ADDRESS -``` - -### Contract owned by a multi-sig - -If we transferred ownership to a multisig, we can use -[OpenZeppelin Defender Admin](https://defender.openzeppelin.com/#/admin) -to propose a pause to be approved by the multisig. - -## Unpause - -Make sure you have set up your wallets and config from the [setup guide](./setup.md). - -To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: - -```sh -yarn hardhat unpause --network NETWORK --address CONTRACT_ADDRESS -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md deleted file mode 100644 index 10e52f5b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md +++ /dev/null @@ -1,76 +0,0 @@ -# Plasmic setup - -## HypercertImage - -### Props - -hideImpact - -``` -$ctx.currentForm.impactTimeEnd === "indefinite" && ($ctx.currentForm.impactScopes.length === 0 || ($ctx.currentForm.impactScopes.length === 1 && $ctx.currentForm.impactScopes[0] === "all")) -``` - -color - -``` -$ctx.currentForm.backgroundColor -``` - -vectorart - -``` -$ctx.currentForm.backgroundVectorArt -``` - -### Slots - -logoImage Image URL - -``` -$ctx.currentForm.logoUrl -``` - -title Content - -``` -$ctx.currentForm.name -``` - -workPeriod Content - -``` -`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.workTimeEnd.format ? $ctx.currentForm.workTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.workTimeEnd}` -``` - -bannerImage Image URL - -``` -$ctx.currentForm.bannerUrl -``` - -impactPeriod Content - -``` -`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.impactTimeEnd.format ? $ctx.currentForm.impactTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.impactTimeEnd}` -``` - -#### workScopes: repeated ScopeChip - -Collection - -``` -$ctx.currentForm.workScopes.split(/[,\n]/).map(i => i.trim()).filter(i => !!i) -``` - -Element name: `currentWorkScope` -Index name: `currentIndex` -Color variant: `$ctx.currentForm.backgroundColor` -Content: `currentWorkScope` - -#### impactScopes: repeated ScopeChip - -Collection: `$ctx.currentForm.impactScopes` -Element name: `currentImpactScope` -Index name: `currentIndex` -Color variant: `$ctx.currentForm.backgroundColor` -Content: `currentImpactScope` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md deleted file mode 100644 index afb95296..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md +++ /dev/null @@ -1,41 +0,0 @@ -# Setup - -## Pre-requisites - -1. Install [NodeJS](https://nodejs.org/en/) and [git](https://git-scm.com/) -2. Install [yarn](https://classic.yarnpkg.com/) - -```sh -npm install --global yarn -``` - -3. Clone the repository: - -``` -git clone git@github.com:hypercerts-org/hypercerts.git -cd hypercerts -``` - -4. Install dependancies: - -To install dependencies across all projects in the monorepo workspace: - -```sh -yarn install -``` - -## Setup your wallets - -We need 2 wallets: a multi-sig for administering the contracts, and a hot wallet for setting everything up. - -1. We use a [Gnosis Safe](https://app.safe.global/) multisig for managing and administering the contracts. Set one up with your desired confirmation threshold (e.g. 2 of 3). This wallet will not require any balance. -2. Separately, set up a wallet that we'll use in our developer scripts. - -- If you don't have one, you can goto `contracts/` and run `yarn hardhat generate-address`. -- Make sure there is enough balance in this account to deploy the contract and transfer ownership to the multisig - - [Goerli Faucet](https://goerlifaucet.com/) - - [Optimism Bridge](https://app.optimism.io/bridge/deposit) - -## Next Steps - -Depending on what you want to do (e.g. in `./sdk/` or `./frontend/`), there will be further setup instructions in the respective `README.md` file. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md deleted file mode 100644 index 820255e7..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md +++ /dev/null @@ -1,35 +0,0 @@ -# Upgrading the contract - -## Validate upgrade - -Validate contract upgradeability against deployment. - -For example, for the `goerli` deployment: - -```sh -yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS -``` - -## Propose Upgrade - -Propose an upgrade via OpenZeppelin Defender. For more information, see this -[guide](https://docs.openzeppelin.com/defender/guide-upgrades) - -For example, for the `goerli` deployment: - -```sh -yarn build:hardhat -yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS -``` - -This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. - -## Publish to npm - -After you update the contracts, deploy the `contracts/` package to npm. - -TODO - -Update the dependencies in `frontend/package.json` and `sdk/package.json`. - -If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/faq.md b/docs/versioned_docs/version-1.0.0-alpha.1/faq.md deleted file mode 100644 index b9659b5a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/faq.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Frequently Asked Questions -id: faq ---- - -# FAQs - -### How do I create a hypercert? - -We've created a step-by-step guide in the documents, which you can find [here](minting-guide/minting-guide-start). - -### Who gets to claim my hypercert? - -There are currently two types of users who are eligible to claim your hypercert. - -1. You as the creator of the hypercert are eligible to claim your hypercert. For projects with an allow list, you are eligible to claim 50% of the total tokens. For projects with no allow list, you will receive 100% of the tokens automatically and can do whatever you like with them. - -2. Anyone on the hypercert's allow list will be eligible to claim your hypercert. The allow list is stored and the time of minting and allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions through a separate contract interaction. Creators often use allow lists be used to allocate fractions to previous funders and contributors. - -### How do I claim a hypercert? Can I claim all of the ones I’m eligible for at once? - -After you connect your wallet, you will see a dashboard of hypercerts that you can claim. You can either claim them individually or in a batch transaction. Note that if you perform the batch transaction you will automatically claim _all_ hypercerts you are allow-listed for. (You still pay a gas fee for each claim, however.) If you don't want to claim _all_ at once, then you should claim them one-by-one. - -### What token standard do hypercerts utilize? - -The interface supports both ERC-1155s and 721s. Our current implementation makes use of [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) (a semi-fungible token). - -### What are the required fields to generate a hypercert? - -There are six required fields: - -1. Set of contributors: An ordered list of all contributors, who claim to do or have done the work described by this hypercert. -2. Scope of work: A conjunction of potentially-negated work scope tags, where an empty string means “all”. -3. Time of work: A date range, from the start to the end of the work being claimed by this hypercert. -4. Scope of impact: A conjunction of potentially-negated impact scope tags, where an empty string means “all”. -5. Time of impact: Date ranges from the start to the end of the impact. -6. Rights of the owners: An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. - -Hypercerts also need a name and description. - -### What should I put for my hypercert's work scope? - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -### Are hypercerts the same as impact evaluations? - -No. A hypercert is a claim over a discrete piece of work and the impact that may result from that work. It has no opinion about the legitimacy or quality of the claim. - -An impact evaluation is an opinionated assessment about the legitimacy or quality of a claim. - -For example, a hypercert might represent "Planting trees in the Amazon in 2022". An impact evaluation might point to that hypercert and assert the percent of trees that survived, the amount of CO2 removed by the trees, or the income change among people living around the project. - -Over time, the expectation is that hypercerts that attract multiple, high quality, credibly neutral impact evaluations will be more relevant than ones that do not. - -### What can I do with my hypercert? - -The `rights` dimension specific what an owner can do with their hypercert. Currently, the only `right` that owners have is "Public Display". Over time, we hope the protocol can support various `rights` including transfers, intellectual property, tax-deductibility, carbon offsets, ESG reporting, and more. - -### How is a hypercert different than a POAP or Impact NFT? - -Hypercerts have some things in common with certain POAPs or Impact NFTs, but also a number of crucial differences. - -First, all POAPs and most Impact NFTs are implemented as non-fungible tokens (ERC-721s). Hypercerts are currently being implemented as semi-fungible tokens (ERC-1155s), meaning it is possible to own more than one unit or fraction of a given hypercert. This makes it easy and intuitive to display the share of hypercerts that a given owner has. - -Second, hypercerts have specific metadata requirements and interpretation logic. These include a standard schema for how the six required hypercert dimensions are defined and captured (i.e., work scopes, impact scopes, timeframes, contributors, etc) as well as logic for how to interpret different inputs (e.g., how to include or exclude certain work scopes, create an indefinite time period, etc). POAPs have a completely different schema. Although there is no standard schema for Impact NFTs, an Impact NFT project could choose to adopt the hypercert standard and token interface and thereby achieve compatibility. - -Third, the hypercerts token interface is intended to support several functions that are not possible out of the box with other token standards, chiefly, atomic split and merge capabilities. We also expect other protocols to work with hypercerts for the purposes of prospective and retrospective funding, contributor verification, and impact evaluation. - -For certain use cases, POAPs may be better suited for projects as hypercerts are focused on the funding aspect of impactful work. - -### Where can I purchase a hypercert? - -Currently, it is only possible to purchase a hypercert from a creator or project. This can be facilitated directly by the project or via a third-party marketplace like OpenSea. Currently, hypercerts cannot be resold on secondary markets. - -### What chain(s) is hypercerts running on? - -The hypercerts smart contracts have been deployed on Optimism and Goerli Testnet. We plan to support various EVM chains in the near future. - -### How do I bridge to Optimism? - -There are various bridging services including the official [Optimism Bridge](https://app.optimism.io/bridge/deposit). Note that bridging assets from Ethereum to Optimism will incur a gas fee. - -### How much gas will it cost to create or claim a hypercert? - -In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). Claiming a hypercert should be below 0.0001 ETH or less than $0.10 on Optimism. - -### How do I create a hypercert from a multisig? - -If you are creating a hypercert on Optimism, then you will need an Optimism-based multisig. (Unfortunately, Safe wallets created on Ethereum won't work on Optimism.) - -### Have the smart contracts been audited? - -Yes. The auditor's security report is available [here](https://github.com/pashov/audits/blob/master/solo/Hypercerts-security-review.md). - -### How is the allow list generated? - -For Gitcoin projects, an allow list is generated from a snapshot of all of the on-chain funding received by the project. - -The queries used to generate the allow lists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -Once the snapshot is taken, the formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. - -For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.96 donated --> 1 fraction -- $0.52 donated --> 0 fractions - -### Why am I not on the allow list even though I contributed to the project? - -If you contributed less than $1 DAI to a project, then you will not be eligible to claim a hypercert fraction. - -### I supported a project. Why I don't I see the hypercert in my dashboard? - -In order to your hypercert to appear as "claimable", the project needs to mint the hypercert first. If the project has not minted its hypercert yet, then you will not be able to claim it. We suggest you check back in a few days to see if the project has created the hypercert and is now claimable. - -If the project has created its hypercert, then please try the following solutions: - -1. Confirm the wallet address is correct (some users have multiple wallet addresses and forget which one they donated with) -2. Check that your wallet is included in the Dune Dashboards for each Gitcoin Round - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -3. Confirm you donated more than $1 DAI to the project. - -If the project has created its hypercert, and you have confirmed items 1-3, then please send us a DM over Twitter or Telegram with your wallet address and we will get back to you promptly. - -### How do I retire a hypercert? - -We don't yet have a frontend for retiring hypercerts but you can do this by interacting directly with the smart contract on Etherscan. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md b/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md deleted file mode 100644 index 86c25331..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Further Resources -id: further-resources ---- - -# Papers, Articles, Presentations - -## Writings - -- Feb 14, 2023, Whitepaper draft by [@hypercerts](http://twitter.com/hypercerts): [Hypercerts: A new primitive for impact funding systems (draft v0)](../static/pdf/hypercerts_whitepaper_v0.pdf) -- Aug 24, 2022, Blogpost by [@holkeb](https://twitter.com/holkeb): [Hypercerts: A new primitive for public goods funding](https://protocol.ai/blog/hypercert-new-primitive/) -- Jun 2022, Tech report (draft) by [@davidad](https://twitter.com/davidad): [Hypercerts; an Interoperable Datalayer for Impact-Funding Mechanisms](../static/pdf/hypercerts_Tech_Report_draft.pdf) - -## Talks - -#### Jun 24, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Hypercerts: on-chain primitives for impact markets](https://youtu.be/2hOhOdCbBlU) - - - -#### Jun 23, 2022, Conversation between [@emiyazono](http://twitter.com/emiyazono) and [@owocki](http://twitter.com/owocki) at GreenPill Podcast: [Impact Certificates | Evan Miyazono, Head of Research at Protocol Labs | Green Pill #21](https://youtu.be/kyo5SxtSJ9U) - - - -#### Mar 4, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Interoperable mechanisms for non-rival goods (Hypercerts)](https://youtu.be/acbBeGcevok) - - - -## Other resources - -Overview of some previous writings on impact certificates, retrospective funding and impact markets: - -- Christiano, Paul (2014) Certificates of impact, Rational Altruist, [https://rationalaltruist.com/2014/11/15/certificates-of-impact/](https://rationalaltruist.com/2014/11/15/certificates-of-impact/) -- Christiano, Paul & Katja Grace (2015) The Impact Purchase, [https://impactpurchase.org/why-certificates/](https://impactpurchase.org/why-certificates/) -- Optimism & Buterin, Vitalik (2021) Retroactive Public Goods Funding, [https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c) -- Cotton-Barratt, Owen (2021), Impact Certificates and Impact Markets, Funding the Commons November 2021, [https://youtu.be/ZiDV56o5M7Q](https://youtu.be/ZiDV56o5M7Q) -- Drescher, Denis (2022) Towards Impact Markets, [https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1](https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1) -- Ofer & Cotton-Barratt, Owen (2022) Impact markets may incentivize predictably net-negative projects, [https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6](https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md deleted file mode 100644 index b2451310..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Glossary -id: glossary -sidebar_position: 3 ---- - -# Glossary of Hypercerts Terms - -## Main Terms - -### Allowlist - -A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. - -### Claiming a fraction - -Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. - -### Contributor - -An individual or organization that performs some or all of the work described in a hypercert. - -### Creating a hypercert - -Synonymous to minting a hypercert. - -### Fraction - -A token that represents a quantified proportion of a hypercert denominated in units. - -### Funder - -Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. - -### Hypercert - -A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. - -### Hypercerts interface - -The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. - -### Hypercerts implementation - -An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. - -### Hypercerts standard - -A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. - -### Impact - -Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. - -### Impact evaluation - -A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. - -### Impact Funding System (IFS) - -A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. - -### Impact space - -A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. - -### Merging hypercerts - -An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. - -### Minting a hypercert - -Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. - -### Project - -Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. - -### Prospective funder - -Individual, organization, or algorithm that fund work before it is done. - -### Retrospective funder - -Individual, organization, or algorithm that fund work after it is done. - -### Rights - -An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. - -### Set of contributors - -An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Scope of impact - -A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Scope of work - -A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Splitting hypercerts - -An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. - -### Time of impact - -Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Time of work - -A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Unit - -The smallest possible fraction of a claim. Generally units are grouped in fractions. - -### Work - -Activities that produce impact. - -## Additional Impact Evaluation Terms - -### Auditor - -Individual, organization, or algorithm that evaluates the impact of work after it is done. - -### Beneficiaries - -People or objects that are impacted by work. - -### Evaluator - -Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. - -### Scout - -Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md deleted file mode 100644 index 08eb9fcb..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: Metadata Standard -id: metadata -sidebar_position: 2 ---- - -# Hypercert Metadata Structure - -Hypercerts are represented as [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) tokens. All token instances of a hypercert must share the same ERC-1155 metadata. For sites like OpenSea to pull in off-chain metadata for ERC-1155 assets, your hypercert contract will need to return an IPFS URI that contains all necessary hypercert metadata. - -The hypercert metadata schema follows the [Enjin recommendation](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema) for ERC-1155 metadata. It also includes **six required dimensions** that are necessary to clearly and unambiguously identify the hypercert's impact claim. - -The following are standard ERC-1155 metadata fields. - -## ERC-1155 fields - -| Property | Description | -| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | Name or title of the hypercert. Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. | -| `description` | A human readable description of the hypercert. Markdown is supported. Additional external URLs can be added. | -| `image` | A URI pointing to a resource with mime type image/\* that represents the hypercert's artwork, i.e., `ipfs://`. We recommend images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. | -| `external_url` | [optional] A URL that can be displayed next to the hypercert on webpages like OpenSea and links users to a page that has more information about the project or impact claim. | -| `properties` | [optional] Additional properties (aka attributes) that may be helpful for discovery and curation of hypercerts. Marketplaces like OpenSea will display these properties in the same way as they display rarity traits of NFTs. | - -In order to perform hypercert-specific operations, including split and merge functions, and for your hypercert to robustly claim a set of coordinates in the impact space, there are six additional dimensions that must be included in your metadata. - -## Required Hypercert dimensions - -| Property | Description | -| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `work_scope` | An _ordered list_ of work scope tags. Work scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any work scope that is explicitly excluded from the claim. | -| `work_timeframe` | Date range from the start to the end of the work in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). | -| `impact_scope` | An _ordered list_ of impact scope tags. Impact scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any impact scope that is explicitly excluded from the claim. The default claim is to "all" impact, giving the owner rights to claim all potential impact created by the work that is represented by the hypercert. | -| `impact_timeframe` | Date range from the start to the end of the impact in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). The default claim is from the start date of work until `indefinite` (i.e., the impact may occur at any point in time in the future). | -| `contributors` | An _ordered list_ of all contributors. Contributors should be itemized as wallet addresses or ENS names, but may be names / pseudonyms. The default claim is to the wallet address that created the hypercert contract. A multisig wallet can be used to represent a group of contributors. | -| `rights` | An _unordered list_ of usage rights tags. The default claim is solely to "public display" of the hypercert, i.e., all other rights remain with the contributors. | - -## Examples - -### Example 1: hypercert with minimal bounds - -Here is an example of hypercert dimensions for work on IPFS with minimal bounds: - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["IPFS"], - "excludes": [], - "display_value": "IPFS" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["All"], - "excludes": [], - "display_value": "All" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1380585600, 1388534399], - "display_value": "2013-10-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1380585600, 0], - "display_value": "2013-10-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["Protocol Labs"], - "display_value": "Protocol Labs" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Example 2: hypercert with bounded impact claims - -This hypercert is for a carbon removal project that provides a bounded impact scope. - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["Protecting Trees in Amazon"], - "excludes": [], - "display_value": "Protecting Trees in Amazon" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["CO2 in Atmosphere"], - "excludes": [], - "display_value": "CO2 in Atmosphere" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1356998400, 1388534399], - "display_value": "2013-01-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1356998400, 0], - "display_value": "2013-01-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], - "display_value": "0xa1f...000, Project Forest Conservation" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Example 3: hypercert with excluded impact claims - -Here is an example that explicitly excludes an impact scope to generate a more fine-grained claim. - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["Protecting Trees in Amazon"], - "excludes": [], - "display_value": "Protecting Trees in Amazon" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["All"], - "excludes": ["CO2 in Atmosphere"], - "display_value": "All ∧ ¬CO2 in Atmosphere" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1356998400, 1388534399], - "display_value": "2013-01-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1356998400, 0], - "display_value": "2013-01-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], - "display_value": "0xa1f...000, Project Forest Conservation" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Additional guidelines - -Here are some additional guidelines for defining hypercert dimensions. - -- For most hypercerts, the `work_scope` is best represented as the name of the project or activity. Other information contained in the hypercert, namely, the `contributors` and the `work_timeframe` should provide sufficient context to disambiguate multiple claims from the same project. -- Similarly, for most hypercerts, the `impact_scope` will be most clearly represented as "all" (with an indefinite upper bound on the `impact_timeframe` dimensions). This gives the hypercert creator and its owners the flexibility to make claims about impact that may not have been observable or well-understood when the hypercert was created. - -- It is recommended to browse the `impact_scope` and `work_scope` tags that have already been created and are in use by your or other projects. (We are building a catalog to be available at [hypercerts.org](https://hypercerts.org).) Picking established tags can make it easier for users to discover, curate, and interact with your hypercert. In the long-run, we expect different ontologies to emerge in domains like climate solutions, open source software, etc, and picking more established tags will help prevent overlapping or duplicate claims. -- Tags for work scopes and impact scopes are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. -- Scopes that are explicitly excluded from the hypercert claim are enumerated separately and displayed with the `¬` prefix in the tag. Excluded scopes are not currently displayed on hypercert artwork. -- The order of tags matters only for display purposes. The hypercert artwork will only display a limited number of tags in the `impact_scope` and `work_scope` arrays due to image size and stylistic constraints. -- A `contributor` can be identified using any human-readable string. The base case is to set the `contributors` to the wallet address used to create the hypercert. A multisig wallet can be used to represent a group of contributors. - -### Assigning `rights` - -In version 1.0 of the protocol, only one `rights` tag will be enabled: - -> **Public Display**: owners of the hypercert have the right to publicly display and receive social utility from their hypercert. - -This means that any other rights regarding the work described by the hypercert either remain with the original contributors or are governed by other agreements. - -Additional `rights` including the potential for certain types of transfers to be explicitly enabled will be released in subsequent versions. - -## Optional hidden properties - -Creators may wish to add other fields in their metadata that are not a part of the hypercert claim and are not for display on third-party marketplaces like OpenSea. These can be added by creating a `hidden_properties` field in the metadata. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md deleted file mode 100644 index a767c670..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Token Standard -id: token-standard -sidebar_position: 1 ---- - -### Hypercerts as a semi-fungible token - -In order to make the token identifiable, traceable, and transferable, hypercerts are represented as [ERC-1155 tokens](https://eips.ethereum.org/EIPS/eip-1155). The ERC-1155 standard enables a single deployed contract to store many hypercerts, facilitating simpler creation, transfers, as well as splitting and merging of hypercerts within a single namespace. As a semi-fungible token, each unique token represents a fraction of ownership of a hypercert. Hypercerts are then represented as a group of tokens, where the total ownership sums to 100%. In order to easily identify which hypercert a token belongs to, we utilize the upper 128 bits of a 256-bit token ID to identify the hypercert. All tokens within the same hypercert group should share the same [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). - -![hypercert id](../../static/img/hypercert_id.png) - -For illustrative purposes, let us assume that token IDs are just 2 bytes long, where the first byte represents the hypercert ID and the last byte represents which fraction of ownership. Alice could create a new hypercert token 0x2301, representing 100% of hypercert 0x23. If Alice wanted to transfer 20% to Bob, Alice could perform a split operation by minting token 0x2302 and transferring 20% of value to it, such that tokens 0x2301 and 0x2302 represent 80% and 20% ownership respectively of hypercert 0x23. Then Alice transfers token 0x2302 to Bob. Similarly, they could merge these 2 tokens together, back to form a token that represented 100% ownership. In this case, the value of 0x2301 would be transferred to 0x2302, and then 0x2301 is subsequently burned. - -Alice can also choose to split or merge hypercerts along some dimension of the impact space. For example, Alice may split hypercert 0x23 into two new hypercerts — 0x24 representing work done before the year 2000, and 0x25 representing work done after 2000. The original hypercert 0x23 is burned and the two new hypercerts store a reference to the previous hypercert. When the history of splits and merges are indexed, we can easily trace through the provenance of any individual hypercert. - -### Claim Data - -Hypercert claim data, such as scope of work and the contributor list, is encoded in JSON format into the [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). Claim data can be stored on-chain alongside the token, or in off-chain storage such as IPFS. For details on the JSON schema and how off-chain storage can be utilized, see the [hypercerts-sdk repository](https://github.com/hypercerts-org/hypercerts/tree/main/sdk). - -When considering whether to store hypercert metadata on-chain or off-chain, we can consider the different trade-offs to the user experience and cost, which may differ depending on which blockchain is being used. Storing data off-chain saves on costs, but could lead to on-chain claims without the metadata. Storing data on-chain adds additional security that the claims will not be forgotten but can lead to higher gas fees. - -Beyond the standard fields of hypercerts that locate the hypercert in the impact space, additional fields can be added. This allows for different templates in different impact areas, such as AI safety or biodiversity, as different additional information will be useful. Importantly, however, all hypercerts will be located in a single impact space – the additional fields do not change that. - -### Multi-chain support - -We expect hypercerts to exist in a multi-chain ecosystem, where the local deployment can be used to support the unique funding systems of that community. In order to visualize a single global impact space, we index the different contract deployments across chains and surface any potential hypercert claim conflicts. Because different blockchains support different subsets of programming languages, we do expect different implementations of the hypercert protocol to exist. However, they must adhere to the same hypercert data model to be indexed into the impact space. - -In order to decide which deployments to index into the hypercerts impact space, decentralized governance institutions will be used to govern the list of contract addresses used across all blockchains. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/intro.md deleted file mode 100644 index 0c4d7ca3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/intro.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: What Are Hypercerts? -id: intro ---- - -# What are hypercerts? - -### Hypercerts are a new token standard for tracking and rewarding positive impact. - -Each hypercert represents a unique impact claim capturing the following information: - -- a scope of work and its corresponding scope of impact -- a set of time frames for both the work and its impact -- a set of contributors – the organization or people behind the work -- a set of rights you get by owning a hypercert - -The hypercert itself is an ERC-1155 semi-fungible token with the information above stored as metadata on IPFS. Here’s an example. - -### Hypercert example - -#### Graphic representation - -![hypercert design example](../static/img/hypercert_example.png) - -#### Supplementary information (metadata) - -- **Title of hypercert:** Invention of the InterPlanetary Filesystem (IPFS) -- **Description:** The InterPlanetary File System (IPFS) is a set of composable, peer-to-peer protocols for addressing, routing, and transferring content-addressed data in a decentralized file system. -- **Link:** ipns://ipfs.tech/ - -#### Hypercert dimensions (metadata) - -- **Set of contributors:** 0xb794f5ea0ba39494ce839613fffba74279579268 _(example Ethereum address)_ -- **Scope of work:** IPFS ∧ ¬ go-ipfs -- **Time of work:** 2013-01-01 --> 2013-12-31 -- **Scope of impact:** All -- **Time of impact:** 2013-01-01 --> indefinite -- **Rights:** Public display - -### Why should you care? - -We spend trillions of dollars every year on public goods via governmental agencies, foundations, private donations and corporate spendings; however, we don’t effectively track this work – leaving us in the dark, hoping that it actually has the intended positive impact. - -We believe we can do better: - -- We should start by tracking this work consistently – this is what hypercerts are for. -- We should evaluate how impactful that work was – this is what the open evaluation system of hypercerts supports. -- We should reward the work that was exceptionally impactful – this is what the public display of hypercerts and retrospective funding is for. - -Doing this would unfold powerful incentives. Retrospective funding 1) provides incentives for creators to take on public goods projects with a potentially high, but uncertain, impact, 2) enables feedback loops to learn from successes and failures, and 3) attracts more talent to the public goods sector by improving performance-based compensation. - -While we are excited about the prospects of retrospective funding, hypercerts do not impose any specific funding mechanisms, but start with tracking the work that is supposed to be impactful. As a database for many funding mechanisms this facilitates experimentation and interoperability between funding mechanisms. - -### Next - -Curious and want to learn more? Head over to the [whitepaper](whitepaper/whitepaper-intro.md) to dive deeper into the world of hypercerts. - -Or do you want to get started right away? Head to the [minting guide](minting-guide/minting-guide-start.md). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md deleted file mode 100644 index 1ad2310a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: Gitcoin Alpha Round Instructions -id: gitcoin-round -sidebar_position: 3 ---- - -# Gitcoin Alpha Round Instructions - -## Overview - -- all projects in the Gitcoin Alpha Round are invited to mint a hypercert for their work -- anyone who gave over $1 to a project is automatically allowlisted for that project’s hypercert -- 50% of each hypercert is distributed to the funders, 50% is kept by the project and can be transferred later -- each project has a custom URL to make minting super easy (the link is sent directly to each project) -- everything runs on Optimism (users only need to pay L2 gas costs) - -:::info -If your project participated in the Gitcoin Alpha Round, but you didn't get a message with a custom URL, please reach out to team[at]hypercert.org. -::: - -## Hypercerts x Gitcoin Alpha Round - -Now that Gitcoin’s Alpha Round has officially closed and the funding distribution is finalized, we are inviting all eligible projects that participated to mint a hypercert for their past work and to allocate fractions of their hypercert to a list of supporters. - -We’ve created a dApp that pulls all of the data required to mint your hypercert directly from Gitcoin’s Grant Protocol. You can fine-tune the properties, tweak your artwork, and review the distribution mechanism. Once you’re ready, hit the create button and your hypercert will be released into the ethers! - -Once your hypercert has been minted, the people who supported your project with a contribution of at least $1 DAI on Gitcoin’s Alpha Round will be able to connect and claim their fractions. - -A few important notes about the Alpha Round: - -- The total units of a hypercert is based on the total donations; each funder get awarded units proportional to their donations. -- Transfers will be restricted to one transfer from the project to the supporters. -- There will be no additional rights awarded to the funders except the right to "public display" their support for the project. - -## Instructions - -The following guidance is only for projects that receive a custom URL that pre-populates the hypercerts form based on their Gitcoin Grants' data. - -It explains the default settings in the form and recommends fields that the creator may choose to update or edit. - -:::note -Gitcoin Grant hypercerts are for retrospective work, i.e., they are intended to capture work that happened between Gitcoin Grants Round 15 (September 2022) and the Alpha Round (January 2023). Therefore, the work time period is always set to past dates. (You might need to adjust the name and description to also refer to past work only.) We are focusing solely on retrospective hypercerts for this round as part of broader efforts to promote retrospective funding; you can read more about it [in the whitepaper](whitepaper/retrospective-funding.md). -::: - -### General Fields - -#### Name of Hypercert - -This field is set by default to the name of your project on Gitcoin Grants. You can edit this to be more specific. Given that your project may create numerous hypercerts over time, consider giving each hypercert a name that represents a more discrete phase or output. - -#### Logo - -This field is set to the icon artwork provided for your project on Gitcoin Grants. If there was an error accessing your icon, you will see a generic icon. - -You can update this by providing a new URL and the hypercert artwork should update automatically. - -Logo images look best with an aspect ratio of 1.0 (square-shaped). - -#### Background Banner Image - -This field is set to the banner artwork provided for your project on Gitcoin Grants. If there was an error accessing your banner, you will see a generic Gitcoin banner. - -You can update this by providing a new URL and the hypercert artwork should update automatically. - -Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. - -#### Project Description - -This field is set by default to the description of your project on Gitcoin Grants. Review closely -- a long project description in your Gitcoin Grant description will be truncated. - -You may edit this to provide more details about your work and to remove information that is targeted solely at Gitcoin Grants users. This is also a good place to provide other links, such as Github repos or social media accounts, where the general public can learn more about the work. Please aim for a project description that is less than 500 characters. - -:::note -The project description should refer to **past work**, not future work that you would like to do with additional funding. -::: - -#### Link - -This field is set to the first external URL provided for your project on Gitcoin Grants. You can update this. - -### Hypercert Fields - -#### Work Scope - -This field is set by default to a **shortened version** of the name of your project on Gitcoin Grants. You may edit or add additional work scope tags. - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -#### Work Start/End Dates - -The start date has been set by default to the `2022-09-22` for all projects on Gitcoin Grants. This date coincides with the end of Gitcoin Grants Round 15. - -The end date references the last update to your grant page on Gitcoin Grants. - -You may edit or update these fields, however, the end date may not extend beyond `2023-01-31` (the close of the funding round) as all hypercerts will be retrospective in this round. - -#### Set of Contributors - -This field is set by default to the wallet address that is set as the recipient address for receiving Gitcoin Grants funding. - -:::note -You should review this field closely and – if applicable – provide the addresses of additional contributors. -::: - -### Advanced Fields - -#### Impact Scope - -This field is set by default to `all`. - -Updates are currently disabled on the frontend because funding decisions on Gitcoin Grants were not specific to an impact scope or impact time period. - -#### Impact Start/End Dates - -This field is set by default to the work start date of `2022-09-22` (see above) and a work end date of `indefinite`. Updates are currently disabled on the frontend. - -#### Rights - -This field is set by default to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. - -Updates are currently disabled on the frontend. - -### Distribution - -#### Allowlist - -This field is set by default to a custom allowlist generated for each project based on the funding it received on the Gitcoin Grants Alpha Round. You should not need to update this field. If there is a problem with your allowlist, please contact us. - -50% of the hypercert will be allocated according to this allowlist. The other 50% will be kept by the project, i.e. it is allocated to the address that mints the hypercert. You will be able to transfer or sell these fractions later as long as they are owned by the minter. This means that they can only be transferred or sold once. - -The formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. - -For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.96 donated --> 1 fraction -- $0.52 donated --> 0 fractions - -The queries used to generate the allowlists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -Donors who contributed to the matching pool for each round are also eligible to claim hypercerts. - -:::note -You are free to edit your allowlist. You can do this by following the step-by-step instructions [here](minting-guide/step-by-step.md). Just remember that you will need to upload the new allowlist in a CSV format to a storage site like [web3.storage](https://web3.storage) and then update the link in the allowlist field. Contact team[at]hypercerts.org if you need help. -::: - -### Confirmations - -#### Contributors' permission - -Every contributor needs to agree to have their contribution be represented by a hypercert. This is why the person minting the hypercert has to confirm to have the permission of all listed contributors. - -#### Terms & Conditions - -The terms & Conditions can be found [here](https://hypercerts.org/terms). - -### Final step: Click "Create" - -Make sure your Optimism wallet or multi-sig is connected. Click on "create" and wait for your hypercert to be created. Congratulations! diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md deleted file mode 100644 index 47e8ad7c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Getting Started -id: minting-guide-start -sidebar_position: 1 ---- - -# Getting started - -### How to create a hypercert - -Creating a hypercert is similar to creating an NFT on sites like OpenSea or Zora. - -In this article, we’ll walk through the steps one by one and explain exactly what you need to do to create your first hypercert. - -There are typically two ways of creating a hypercert: - -1. As a project affiliated with a specific funding network (e.g., Gitcoin Grants): In this case, you should receive a custom URL from the funding network that pre-populates most of your hypercert fields. You will still be able to change most of these, so you should review and adjust them as needed to better describe your hypercert. Guidance on how to do so (for Gitcoin Grants projects) is provided at the end of this doc. -2. As a project not affiliated with a specific funding network: In this case, you will be creating a hypercert from scratch and filling in each field on your own. Read on below. - -### Who can create a hypercert? - -Anyone doing work that is intended to have a positive impact can create a hypercert. Your hypercert can be as simple as "I did X on this date and want to claim all future impact from it". - -It can also represent something more, such as a phase in an ongoing team project, an invention or discovery, a research publication, or an important software release. - -Critically, if the work was done by more than one person, then each person should be listed as a contributor to the hypercert and approve the creation of the hypercert. - -_Note: In the future, the approval of each contributor will be verified on-chain._ - -### What do I need to create a hypercert? - -You will need to prepare all of the information required in the form builder (see **Step-by-step instructions for creating a hypercert** below). This includes important metadata, such as a description of the project and the dimensions of your impact claim, as well as a project artwork. You may also want to include an allowlist of wallets that are approved to claim one or more fractions of the hypercert. - -In addition to the information regarding the hypercert itself, you’ll need a crypto wallet to mint your hypercert. “Minting” a hypercert is the process of writing an impact claim to the blockchain. This establishes its immutable record of authenticity and ownership. - -Next, choose a blockchain on which to mint your hypercert. The hypercerts protocol is available on Ethereum, Goerli (testnet), and Optimism. Each of these blockchains has different gas fees associated with transactions on their networks. To reduce gas fees we recommend Optimism for most projects. - -Finally, go ahead and create your hypercert. - -### How much does it cost to create a hypercert? - -You will need enough Ethereum in your wallet to cover gas fees. In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). - -The protocol currently does not offer gas-free or "lazy" minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md deleted file mode 100644 index 9f3b6303..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Step-by-step Instructions -id: step-by-step -sidebar_position: 2 ---- - -# Step-by-step instructions - -First, go to the [Create Hypercert](https://hypercerts.org/app/create) site with a wallet-enabled browser or follow the custom URL you received to access a prepopulated form. - -Although the site works on mobile, it is easier to use on desktop because the browser will display a dynamic preview of the hypercert while you fill out the Create form. - -Next, connect your wallet. You will be prompted to switch to the Ethereum or Optimism network. - -Once you've connected, you will see an empty form for creating a hypercert. - -### General fields - -#### Name of Hypercert - -Enter the name or title of the hypercert. This is the place to be verbose and specific about what the project is doing. You'll see on the preview when your title becomes too long. - -Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. - -Names are restricted to 100 characters but may include emojis (:smile:), accents (é), non-Latin scripts (表情), and other Unicode characters. - -#### Project Description - -Enter a human readable description of the hypercert. This is the place to share more details about the work and the team or individual behind the work. - -The description field supports [Markdown syntax](https://www.markdownguide.org/cheat-sheet/) and has a limit of 10,000 characters. - -In addition to the main link (see next field) you can add further links in the markdown to help others to understand the work of the project. - -#### Link - -A valid URL for the project, beginning with https:// - -This will be displayed next to the hypercert on webpages like OpenSea and should link users to a page that has more information about the project or impact claim. - -#### Logo - -An icon for the top left part of the card. This could be your project logo. It will be automatically masked to the shape of a circle. - -Logo images look best with an aspect ratio of 1.0 (square-shaped). - -The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. - -#### Background Banner Image - -A background image that will extend across the upper half of the artwork. This could be your project masthead or a unique piece of art. - -Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. - -Currently we don't support zoom / cropping, so you will need to test the look and feel on your own. - -The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. - -### Work Scope fields - -#### Work Scope - -One or multiple tags describe the work that the hypercert represents. This work scope will be used to identify the work that is included in the hypercerts and the work that is not included. - -Multiple tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -_Note: In the future, you will be able to specifically exclude work from the hypercert._ - -#### Start and End Date of Work - -The work time period defines when the work was done that the hypercert represents, i.e., only the work in this time period is included in the hypercert. - -The time period of work doesn't need to be the start and end date of a project, but it can be. One project can be split up into multiple hypercerts, e.g. all hypercerts can have the same `work scope`, but different time periods of work. Of course, the time periods are not allowed to overlap. - -### Impact scope fields - -#### Impact Scope - -The impact scope can be used to limit the impact that a hypercert represents, e.g. for the work scope `Planting trees` a hypercert can represent _only_ the impact on biodiversity by including the impact scope tag `Biodiversity`. This would exclude all other impacts, including the impact on CO2 in the atmosphere, which can be useful if that impact is already captured by a carbon credit. - -By default this is set to "`all`" and we strongly recommend keeping it that way. - -Just like the work scope, multiple impact scope tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction). - -#### Start and End Date of Impact - -The impact time period is another way to limit the impact that a hypercert represents, e.g. inventing a new medical treatment has a positive impact over many years, but we might want to capture the positive impact separately for each year. - -By default the `impact start date` is the same as the `work start date` and the `impact end date` is "`indefinite`", i.e., the impact is not restricted time-wise. We strongly recommend keeping it that way. - -### Set of Contributors - -Provide a list of contributors, one per line, or comma-separated. - -The list should include _all_ contributors that performed the described work. - -Contributors are generally itemized as wallet addresses or ENS names, but can also be names / pseudonyms. Groups of contributors can be represented by a multisig or name of an organization. - -### Owners - -#### Allowlist - -The allowlist allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions afterwards. For example, it can be used to allocate fractions to previous funders and contributors. - -The allowlist is implemented as a CSV file specifying `index,address,price,fractions` headers. - -| index | address | price | fractions | -| ----- | ------------------------------------------ | ----- | --------- | -| 0 | 0x5dee7b340764c49a827c60d2b8729e49405fbefc | 0.0 | 100 | -| 1 | 0x1e2dbb9ca3f6d48e085384a821b7259abfdc7d65 | 0.0 | 50 | -| ... | ... | ... | ... | -| 999 | 0x436bad18642f45d3fa5fcaad0a2d81764a9cba85 | 0.0 | 1 | - -The `price` field is denominated in ETH. This should remain at 0.0 for all hypercerts, as primary sales are not currently supported through the app and the secondary sale/transfer of hypercerts is currently not allowed. - -You can store your allowlists on IPFS using [web3.storage](https://web3.storage/). - -:::note -If your allowlist is not properly formatted, you will be unable to mint your hypercert. If you do not include an allowlist, then the creator of the hypercert will receive 100% of the hypercert (set to a default of 10,000 units), which you can then sell or transfer to another wallet a maximum of one time. -::: - -#### Rights - -This field defines the rights that owners of the hypercert have over the work being claimed by this hypercert. - -By default this is set to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. - -_Note: In the future, additional rights can be included for different hypercerts._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md deleted file mode 100644 index 87fb9194..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Open Impact Evaluations -id: evaluation -sidebar_position: 5 ---- - -A key design element is that hypercerts themselves do not make a claim about the size of the impact, but only account for the work that is supposed to be impactful. The figure below shows this contrast in a simplified illustration of the example that we introduced above. The open evaluation system allows multiple evaluations to point at the same area of the impact space that a hypercert claims. The evaluations can include self-evaluation from the contributors themselves. Funders observe these and make their funding decisions based on this richer set of information. - -![hypercert evaluations](../../static/img/hypercert_evaluations.png) - -The open evaluation system is also used to provide additional information, e.g. an evaluator or the project itself provides information about the health of the trees. This information can then be used transparently by other evaluators to evaluate the impact on CO2 in the atmosphere. - -An important feature is that the evaluations do not directly point at a hypercert, but rather at an area in the impact space. In practice this area will mostly be the exact same area that a hypercert claims, such that it can be considered an evaluation of the hypercert, but it does not have to. This feature ensures that, if hypercerts are merged or split, previous evaluations will continue to be linked appropriately. - -The form of evaluations can be standardized to simplify handling and comparing multiple evaluations from multiple evaluators. The open evaluation system allows for templates to be created and used by any evaluators. Similar to the emerging ontologies, these are not enforced centrally, but should emerge as useful standards – potentially steered by decentralized governance institutions. - -Important characteristics of the open evaluation system are: - -- Evaluators can submit multiple evaluations of the same area in the impact space as more information becomes available -- Evaluations can challenge other evaluations -- Evaluation methodologies can evolve over time - -These features allow the whole evaluation system to be dynamically improved by each actor. The relevant incentives for this improvement will stem from the funders who will value the signals from some evaluators more than others and evaluators are able to build up reputation. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md deleted file mode 100644 index 8acc11d1..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: "Hypercerts: a New Primitive for Impact Funding Systems" -id: hypercerts-intro -sidebar_position: 3 ---- - -### Defining hypercerts - -A hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and represents all or parts of that impact. A hypercert has the following fields (one for each dimension): - -1. **Set of contributors:** An ordered list of all contributors, who claim to do or have done the work described by this hypercert. -2. **Scope of work:** A conjunction of potentially-negated work scope tags, where an empty string means “all”: - -``` - ::= AND | " " - ::= | NOT -``` - -3. **Time of work:** A date range, from the start to the end of the work being claimed by this hypercert. -4. **Scope of impact:** A conjunction of potentially-negated impact scope tags, where an empty string means “all”: - -``` - ::= AND | " " - ::= | NOT -``` - -5. **Time of impact:** Date ranges from the start to the end of the impact. -6. **Rights of the owners:** An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. - -Implementing hypercerts as a semi-fungible token allows multiple contributors and funders to own parts of hypercerts. For instance the original contributors can award 10% of a hypercert to a funder, while keeping 90%, which they can award to other funders later. This is why hypercerts are fractionalizable. - -### Examples - -In the simplest cases of hypercerts, the scope of work and impact as well as the time of impact are not restricted and no rights are transferred to owners of the hypercerts, i.e. the hypercerts just define the who (set of contributors) and when (time of work) of the claimed work. Scope of work and impact would be set to all, time of impact to “indefinite” and the rights to only “public display of support”. The latter is always included as the hypercert is a public record, such that owners will always automatically display their support of the work. - -Take for example hypercert 1 below: It represents all work that contributor 1 has performed in 2013 with all the impact that the work had from the beginning of the work; the hypercert doesn’t give any additional rights to the owners of the hypercert. - -The other fields – except the rights field – can be used to limit the work or impact that is represented by the hypercert. Hypercert 2 limits this to the work on IPFS in 2013, i.e. any other work besides IPFS that contributor 1 performed is not included. Hypercert 3 limits it even further as it excludes a specific aspect of IPFS, the go-ipfs implementation. - -| | **Hypercert 1** | **Hypercert 2** | **Hypercert 3** | -| ----------------------- | ------------------------- | ------------------------- | ------------------------- | -| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | -| **Scope of work** | all | IPFS | IPFS ∧ ¬ go-ipfs | -| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | -| **Scope of impact** | all | all | all | -| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → 2013-12-31 | -| **Rights** | Public display of support | Public display of support | Public display of support | - -In the table below we illustrate a use case for limiting the scope of impact. Suppose contributor 1 protects trees in a certain area. This work has positive effects on the CO2 in the atmosphere and could turn into carbon credits; however, the trees have additional positive impacts, such as protecting biodiversity. Instead of including all positive impacts in one hypercert (hypercert 4), the impact can be split between the impact on CO2 in the atmosphere (hypercert 5) and all other positive impacts (hypercert 6). If funders are willing to pay for biodiversity, this would be a new income opportunity. And it would account for the additional positive impact that other methods of reducing CO2 might not have, like industrial carbon capture. Importantly, negative impacts can not be excluded from a hypercert. - -| | **Hypercert 4** | **Hypercert 5** | **Hypercert 6** | -| ----------------------- | -------------------------- | -------------------------- | -------------------------- | -| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | -| **Scope of work** | Protecting trees in area X | Protecting trees in area X | Protecting trees in area X | -| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | -| **Scope of impact** | all | CO2 in atmosphere | all ∧ ¬ CO2 in atmosphere | -| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → indefinite | -| **Rights** | Public display of support | Public display of support | Public display of support | - -Importantly a hypercert does not specify the “size” of the impact, e.g. a hypercert does not state “5 tons of CO2 removed from the atmosphere.” Instead the hypercert only defines the work, e.g. “200 trees protected” (scope of work) in 2022 (time of work). The size of the impact is then left to the evaluations of the “CO2 in the atmosphere” (scope of impact) in 2022 (time of impact) that point towards the covered region of the hypercert. For instance: This allows a self evaluation to claim that 5 tons of CO2 were removed in a given year as well as one or multiple evaluations from independent auditors to confirm or challenge how much CO2 has been removed. An evaluator could detect that some of the trees were not healthy and hence only 4 tons of CO2 were removed. Allowing for multiple evaluation is a defining characteristic of the open evaluation system. - -### Functions of hypercerts - -#### 1. Identifiability - -Hypercerts clearly define the work that is supposed to be impactful by creating a record of who (set of contributors) claims to do or have done what (scope of work) in what time period (time of work). They also allow the creation of multiple records of the same work to identify separate impacts that this work had or will have (scope of impact) over specified time periods (time of impact). - -#### 2. Traceability - -As these records are public and logically monotonic (immutable, except to split or merge hypercerts), records are durable and permanent. - -#### 3. Transferability - -The records are a digital object that can be owned and ownership can be transferred (under specific conditions). As hypercerts can be created as fractionalizable, it is also possible to transfer only a specified fraction of the hypercert. Each hypercert defines the rights over the defined work that owners have, such as rights to retrospective rewards, rights to public display of the support (“bragging rights”) or rights to passive income from intellectual property. - -:::note Transferability restrictions - -Hypercerts are generally transferable. However, there are use cases, in which minters of hypercerts want to restrict how their hypercerts can be transferred. The protocol allows the minter to restrict who can transfer the hypercert and/or to whom the hypercert can be transferred. For instance, by specifying that only the original owner can transfer the hypercert, any future owner is prohibited from selling it, i.e. a secondary market would not exist for this hypercert. - -::: - -### Merging hypercerts - -Besides the fungible dimension, hypercerts can be merged and split on any of the six dimensions as shown in box 1. Let us take the hypercert 1 from the section "Hypercerts definition" and focus only on two of the dimensions, scope of work and time of work. These two dimensions create a simplified impact space. The figure below shows how work on IPFS (InterPlanetary File System) could have been minted over time in separate hypercerts, one for each quarter of work. - -![minting hypercerts example](../../static/img/creating.png) - -We created five hypercerts, one for each quarter of work. As the resulting work of all of these together is IPFS 0.1, the merged hypercert in total is more meaningful and more valuable than just the five individual hypercerts. In this case the proverb is true, the whole is greater than the sum of its parts. Hence, we want to merge them as shown in the next figure. - -![merging hypercerts example](../../static/img/merging.png) - -### Splitting hypercerts - -Conversely, splitting can increase the meaningfulness and value of hypercerts as well. We can split the work on IPFS 0.1 into the conceptual work “invention of IPFS” and the implementation via “go-ipfs 0.1” as shown in the next figure. - -![splitting hypercerts examples](../../static/img/splitting.png) - -Other use cases are where multiple contributors want to combine their work on the same scope of work (merging) or disentangle their work (splitting). Ultimately, splitting and merging allows users to repackage the digital representation of their work and impact. - -Importantly, splitting and merging are the only operations that are permitted to change hypercerts. Once an area in the impact space is claimed, it can not be unclaimed. This ensures that claims are never forgotten. - -### Retiring hypercerts - -While a claim in the impact space can not be unclaimed, it can be retired. Retiring a hypercert means that owners can not transfer and sell it anymore. This way owners prove that they are the final buyers of the impact. Technically retiring hypercerts means that they are sent to a specific null address, which ensures that the retired hypercerts are recorded and traceable. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md deleted file mode 100644 index 6f71ac50..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: The Need for Interoperable Impact Funding Systems (IFSs) -id: ifs ---- - -# The Need for Interoperable Impact Funding Systems (IFSs) - -### An IFS consists of - -- **Actors:** Contributors, funders, evaluators, and beneficiaries -- **Funding mechanisms:** Grants, bounties, retrospective funding, etc. -- **Coordination mechanisms:** Roadmapping, communication forums, etc. -- **A goal:** Maximize the domain-specific positive value created (impact) - -The goal will be specific to the impact area, e.g. prevent existential risks from artificial intelligence (AI) would be the goal for the impact area “AI safety.” To achieve these goals, skilled contributors must work with high effort on promising projects. Additionally, for those projects that create impact continuously, sufficient income streams are necessary to cover both their ongoing operating expenses and contributors’ upside incentives. - -#### Actors in IFSs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeSubtypeDescription
    ContributorsPeople or organizations who do the work
    FundersProspective fundersPeople or organizations who fund work before it is done
    Retrospective fundersPeople or organizations who fund work after it is done
    EvaluatorsScoutsPeople or organizations who evaluate the potential impact of work before it is done
    AuditorsPeople or organizations who evaluate the impact of work after it is done
    BeneficiariesPeople or objects that are impacted by the work
    - -### Guiding questions for designing IFSs - -1. **Projects:** How can we improve the chances that the most promising projects are worked on? -2. **Talent & resources:** How can we attract top talent to contribute to the most promising projects and provide them with the necessary resources? -3. **Effort:** How can we reward contributors for their impact on outcomes? -4. **Sustainable income:** How can we create recurring income streams and financial sustainability for impactful projects? - -Markets have been proven very powerful in answering these questions if they are directed towards maximizing profits. As we are directing systems towards maximizing impact, these answers become more challenging. In particular, in an IFS we are facing coordination and incentive problems in funding impact, such as the free-rider problem. - -### Example dynamics between actors in an IFS - -In order for impact funding systems to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources and (3) evaluations. In the diagram below you see a potential dynamic between the actors of an IFS. In that scenario hypercerts can account for the prospective funding (steps 2-3) as well as for the retrospective funding (steps 8-9) from different funders. Evaluations are made public and can be discovered through the hypercerts for all funders (steps 5-7). Retrospective funders can reward not only the contributors but also the prospective funders (steps 10-11). - -```mermaid -sequenceDiagram - autonumber - participant Beneficiaries - participant Contributors - participant Prospective funders - participant Retrospective funders - participant Evaluators - Contributors ->> Contributors: Mint hypercerts - Prospective funders ->> Contributors: Award funding - Contributors ->> Prospective funders: Award fractions of
    the hypercert - Contributors ->> Beneficiaries: Create impact - Retrospective funders ->> Evaluators: Fund evaluation - Evaluators ->> Beneficiaries: Evaluate impact on beneficiaries - Evaluators ->> Retrospective funders: Make evaluations public,
    esp. for retrospective
    funders - Retrospective funders ->> Contributors: Award funding - Contributors ->> Retrospective funders: Award fractions of hypercerts - opt - Retrospective funders ->> Prospective funders: Award funding - Prospective funders ->> Retrospective funders: Transfer fractions
    of hypercert - end -``` - -### Hypercerts as a data layer for IFSs - -By serving as a single, open, shared, decentralized database hypercerts lower the transaction costs to coordinate and fund impactful work together. This is important because the optimal funding decisions of a single funder depends on the funding decision of all other funders. For instance, some work is only impactful if a minimum funding is provided: The impact is non-linear in the funding amount, e.g. half a bridge is not half as impactful as a full bridge. Other work might be over-funded, i.e. the impact of an additional dollar is basically zero. Ultimately, funders want to find the highest impact for each additional dollar spend (cf. S-process as in Critch, 2021). Today multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Through hypercerts the funding becomes more transparent and the credits for funding impactful work can be easily shared. Coordinating funding becomes easier. - -Hypercerts don’t solve this coordination problem by themselves, but build the basis for different decision and funding mechanisms as shown below. Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. Hypercerts do not lock in any particular decision-making scheme for funders. - -![Hypercerts as a data layer for an IFS](../../static/img/hypercert_data_layer.png) - -Looking farther into the future: If a large majority of funding across an entire IFS ends up flowing through hypercerts, funders have created the transparency that enables each of them to make the best decisions given the funding decision of everyone else. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md deleted file mode 100644 index f8fed762..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: A Consistent Impact Space -id: impact-space -sidebar_position: 4 ---- - -Every hypercert represents a claim in the impact space, which itself represents all possible claims. Above we illustrated the impact space with two dimensions, scope and time of work. The complete impact space is spanned by the six dimensions introduced in the definition of hypercerts. - -### Consistency of the impact space - -Every point in the impact space should either be claimed or not be claimed. No point must be claimed twice, or equivalently: - -- If the impact of some work is represented in one hypercert, it must not be part of any other hypercert. -- Hypercerts must not overlap with each other. - -The table below shows two hypercerts that were illustrated in the section on "Hypercerts operations", but now with all six fields. The two hypercerts can represent the exact same work by the same contributor, but they do not overlap because of the difference in the time of work. - -| | **Hypercert 7** | **Hypercert 8** | -| ----------------------- | ------------------------ | ------------------------ | -| **Set of contributors** | Contributor 1 | Contributor 1 | -| **Scope of work** | IPFS | IPFS | -| **Time of work** | 2013-10-01 to 2013-12-31 | 2014-01-01 to 2014-03-31 | -| **Scope of impact** | all | all | -| **Time of impact** | 2013-10-01 → indefinite | 2014-01-01 → indefinite | -| **Rights** | None | None | - -The consistency of the impact space is crucial as it ensures that no rights to an impact claim are sold twice. If for example someone owns the right to retrospective rewards for the impact of some work, the owners must be identifiable unambiguously. - -Because users can create hypercerts with arbitrary data on any chain, on which a hypercert contract is deployed, we provide ways to help users detect collisions in the impact space. For example, if one hypercert on Ethereum points to the work on “IPFS”, and another hypercert on Filecoin points to the work on “https://github.com/ipfs/go-ipfs” both with the same contributor and time of work, which of these overlapping hypercerts is the correct one to support? To surface such overlapping hypercerts, the hypercerts protocol and SDK will support mechanisms to index, search, and visualize neighbors in the impact space. With these tools evaluators can quickly detect potential conflicts and submit the results as evaluations to help disambiguate proper credit and attribution. - -### Emerging ontologies - -Common ontologies for the scope of work and scope of impact are useful to create transparency and improve discoverability. Such ontologies need to be created from the practices and should be adapted over time. They are like emerging norms, instead of fixed rules. However, some larger players or a group of smaller players could enforce certain ontologies, e.g. if multiple funders agree that they only fund projects that follow a specified ontology. - -As some ontologies might be more useful than others, we would ideally see a consensus emerge between participants and experts in each impact area. Decentralized governance institutions can help facilitate this; however, further details on the design are out of the scope of this paper and are left for future work. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md deleted file mode 100644 index 57444581..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Retrospective Impact Funding -id: retrospective-funding -sidebar_position: 6 ---- - -### Introducing retrospective funding - -While hypercerts do not impose any specific funding mechanisms, they are especially useful for retrospective funding. The core idea, from the perspective of contributors building impactful goods, is this: if you can reasonably expect to get funded retrospectively for your work once you produce a positive impact, then you can work now, in expectation of a probabilistic future cash flow. In another conception, you are effectively “borrowing” money from this anticipated future cash flow to fund the work in the first place; the expectation of future funding “retro-causes” the impactful work. Retrospective funding may be able to 1) provide incentives for contributors to take on impactful goods projects with a potentially high, but uncertain, impact and 2) create a more efficient IFS by back-propagating signals on what outcomes were impactful post-hoc. - -In addition, contributors are able to receive fair compensation by providing outsized impact that will be highly valued. It incentivizes you to create a positive impact, beyond your intrinsic motivation. This does not mean that the most successful contributors to impactful goods automatically have potential upside comparable to some for-profit startup founders (or that they should), just that their potential upside does depend on how much funders later value their past work. This will attract more talent to the impact sector by improving performance-based compensation. - -The crucial aspect for this to work: funders need to retrospectively fund impact, and send credible signals that they will do so in the future. Based on these signals contributors form expectations about future retrospective rewards and can start working today to receive them in the future. - -Hypercerts facilitate retrospective funding as the impact claims are identifiable, traceable and transferable. Contributors can sell parts of their hypercerts to prospective funders to receive the necessary funding for their project (“activity” in the figure below). The project delivers impact to a larger group (“beneficiaries”), which retrospectively buys the hypercerts from the prospective funder, and from the contributors if they retained some fraction of their hypercerts (the latter is not represented in the figure). - -![Retrospective funding with hypercerts](../../static/img/retrospective_funding.png) - -### Increasing rewards - -Retrospective funding allows us to increase rewards as more impact is created because impact is easier to observe, measure and prove retrospectively. Increasing rewards – as shown in the next figure – incentivizes contributors to put in their highest effort to produce impact and enables contributors to be rewarded for their talent. Moreover, prospective funders are incentivized to select, fund and support the projects with the highest expected impact, if they also receive retrospective rewards. - -![Increasing rewards](../../static/img/increasing_rewards.png) - -Note that retrospective funding should not be used in cases where a significant negative impact is possible since a nongovernmental, permissionless framework can not impose retrospective penalties for negative externalities. See Ofer & Cotton-Barratt (2022) for a discussion of this limitation of retrospective funding. - -In some cases we do not expect the retrospective evaluation to be any different than the prospective evaluation, i.e. there is no uncertainty resolved over time as the impact of an activity is already “known” prospectively. In these cases retrospective funding would only complicate the funding mechanism and funding via grants or milestone bounties would be preferable. Retrospective funding is preferable only if uncertainty is resolved over time. - -### Impact evaluations - -The relevance of impact evaluations will depend on how much their signals influence the funding decisions of retrospective funders (see the potential dynamics in the section on "IFSs"). This is a critical difference to many impact reports today: If a project was funded by a grant, the funders as well as the project want to receive a positive evaluation. If, however, the funding decisions of the retrospective funders are outstanding, they are interested in truthful signals about the impact. Hence, funders value improvements in evaluation methodologies and can fund independent evaluators. Evaluators in turn would build up a reputation for their evaluation methodologies and improve the strength of their signals to retrospective funders. - -Impact evaluators can take on a range of forms ranging forms, such as - -- Voting by relevant communities or beneficiaries -- Expert panels -- Professional evaluators similar to financial rating agencies -- Automatic monitoring and data collection by sensors and oracles - -The most useful form or combinations thereof will depend on the specific requirements of the impact area. For a generalized framework on impact evaluators see Protocol Labs (2023). - -While retrospective funding makes impact evaluations financially relevant for funders and contributors, hypercerts enable to pre-commit funding for those evaluations: As impact claims are never forgotten, any actor can at any time commit funding to a future evaluation of these claims. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md deleted file mode 100644 index 4d4648ba..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Introduction -id: whitepaper-intro ---- - -# Vision & Whitepaper - -:::note - -If you prefer to read the draft whitepaper (v0) as a pdf, you can find it [here](../../static/pdf/hypercerts_whitepaper_v0.pdf). The content is mostly identical to the following pages. - -::: - -#### The world faces unprecedented challenges, from climate change to safe artificial intelligence, that require billions to trillions of dollars of public goods funding. - -High-upside/high-uncertainty endeavors are often overlooked due to the absence of strong incentives to pursue them in the dominant public goods funding framework of at-cost grants or even a milestone-bounty framework (which directly exposes small contributors to aversive risk levels). Yet these should be pursued when the expected positive value is very high, as it often is. New impact funding mechanisms can address this. One such mechanism is retrospective funding, which rewards projects based on the impact they create after the impact is observable. If projects can reasonably expect such retrospective rewards, they are incentivized to maximize their impact and – together with prospective funders – take risky bets when the expected positive value is high. - -#### In order for Impact Funding Systems (IFSs) to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources, and (3) evaluations. - -Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. We do not wish to lock in any particular decision-making scheme for funders. Without mechanisms like these, multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Funders should be able to easily collaborate with other funders or to intentionally fund different projects to diversify the funded approaches. Evaluators should be able to evaluate the same impact with different methodologies – potentially with conflicting results, to foster rigor and progress of evaluation methodologies. - -#### Hypercerts create this interoperability by serving as a single, open, shared, decentralized database for impact funding mechanisms. - -A single hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and whose ownership is fractionizable and transferable (under specific conditions). Hypercerts do not impose any specific funding mechanisms but provide baseline invariant guarantees such that claims will not be forgotten as different mechanisms come into and out of fashion. This is also why hypercerts are especially useful for any retrospective funding mechanisms – funding can be applied to claims of the past. diff --git a/docs/versioned_docs/version-0.0.1/about.md b/docs/versioned_docs/version-1.0.0/about.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/about.md rename to docs/versioned_docs/version-1.0.0/about.md diff --git a/docs/versioned_docs/version-0.3.0/developer/allowlists.md b/docs/versioned_docs/version-1.0.0/developer/allowlists.md similarity index 91% rename from docs/versioned_docs/version-0.3.0/developer/allowlists.md rename to docs/versioned_docs/version-1.0.0/developer/allowlists.md index bc65b116..61200236 100644 --- a/docs/versioned_docs/version-0.3.0/developer/allowlists.md +++ b/docs/versioned_docs/version-1.0.0/developer/allowlists.md @@ -16,8 +16,8 @@ import { } from "@hypercerts-org/sdk"; const allowlist: Allowlist = [ - { address: "0x123", units: 100 }, - { address: "0xabc", units: 100 }, + { address: "0x123....asfcnaes", units: 100n }, + { address: "0xabc....w2dwqwef", units: 100n }, ]; ``` @@ -25,10 +25,10 @@ Then, call `createAllowlist` with the metadata and allowlist. ```js const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; +const totalUnits = 10000n; const transferRestrictions = TransferRestrictions.FromCreatorOnly -const { claimId } = await hypercerts.createAllowlist({ +const txHash = await hypercerts.createAllowlist({ allowList, metaData, totalUnits, @@ -50,11 +50,11 @@ Finally, the method invokes the `createAllowlist` function on the contract with Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: -| Variable | Type | Source | -| -------- | ------------ | ------------ | -| claimId | BigNumberish | Hypercert ID | -| units | BigNumberish | Allowlist | -| proof | BytesLike[] | Merkle tree | +| Variable | Type | Source | +| -------- | ------ | ------------- | ----------- | +| claimId | bigint | Hypercert ID | +| units | bigint | Allowlist | +| proof | `(Hex | ByteArray)[]` | Merkle tree | We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/CurrencyManager.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/CurrencyManager.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/ExecutionManager.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/ExecutionManager.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/InheritedStrategy.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/InheritedStrategy.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/LooksRareProtocol.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/LooksRareProtocol.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/NonceManager.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/NonceManager.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/StrategyManager.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/StrategyManager.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/TransferManager.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/TransferManager.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/TransferSelectorNFT.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/TransferSelectorNFT.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md similarity index 78% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md index daa427e4..43f14059 100644 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -4,7 +4,7 @@ _LooksRare protocol team (👀,💎); bitbeckers;_ > StrategyHypercertFractionOffer -This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. +This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10000 // Total amount for sale; in `amounts` array - minUnitAmount: 100 // Minimum amount to buy; in `additionalParameters` - maxUnitAmount: 1000 // Maximum amount to buy; in `additionalParameters` - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. _Use cases can include tiered pricing; think early bird tickets._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/INonceManager.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/INonceManager.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/IStrategy.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/IStrategy.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/libraries/OrderStructs.md similarity index 100% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/marketplace/libraries/OrderStructs.md diff --git a/docs/docs/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/AllowlistMinter.md similarity index 100% rename from docs/docs/developer/api/contracts/AllowlistMinter.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/AllowlistMinter.md diff --git a/docs/docs/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/HypercertMinter.md similarity index 100% rename from docs/docs/developer/api/contracts/HypercertMinter.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/HypercertMinter.md diff --git a/docs/docs/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/SemiFungible1155.md similarity index 100% rename from docs/docs/developer/api/contracts/SemiFungible1155.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/SemiFungible1155.md diff --git a/docs/docs/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/interfaces/IAllowlist.md similarity index 100% rename from docs/docs/developer/api/contracts/interfaces/IAllowlist.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/interfaces/IAllowlist.md diff --git a/docs/docs/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md similarity index 100% rename from docs/docs/developer/api/contracts/interfaces/IHypercertToken.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md diff --git a/docs/docs/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/libs/Errors.md similarity index 100% rename from docs/docs/developer/api/contracts/libs/Errors.md rename to docs/versioned_docs/version-1.0.0/developer/api/contracts/protocol/libs/Errors.md diff --git a/docs/versioned_docs/version-1.0.0/developer/api/index.md b/docs/versioned_docs/version-1.0.0/developer/api/index.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/_category_.yml b/docs/versioned_docs/version-1.0.0/developer/api/sdk/_category_.yml new file mode 100644 index 00000000..5c4b05b1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/_category_.yml @@ -0,0 +1,3 @@ +label: "API SDK" +position: 0 +collapsed: false \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ClientError.md new file mode 100644 index 00000000..a0c9b619 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ClientError.md @@ -0,0 +1,198 @@ +--- +id: "ClientError" +title: "Class: ClientError" +sidebar_label: "ClientError" +sidebar_position: 0 +custom_edit_url: null +--- + +An error that is caused by a problem with the client. + +## Hierarchy + +- `Error` + + ↳ **`ClientError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Constructors + +### constructor + +• **new ClientError**(`message`, `payload?`): [`ClientError`](ClientError.md) + +Creates a new instance of the ClientError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Returns + +[`ClientError`](ClientError.md) + +#### Overrides + +Error.constructor + +#### Defined in + +sdk/src/types/errors.ts:27 + +## Properties + +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +sdk/src/types/errors.ts:20 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ConfigurationError.md new file mode 100644 index 00000000..aa28ba72 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ConfigurationError.md @@ -0,0 +1,196 @@ +--- +id: "ConfigurationError" +title: "Class: ConfigurationError" +sidebar_label: "ConfigurationError" +sidebar_position: 0 +custom_edit_url: null +--- + +The configuration was invalid + +## Hierarchy + +- `Error` + + ↳ **`ConfigurationError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Constructors + +### constructor + +• **new ConfigurationError**(`message`, `payload?`): [`ConfigurationError`](ConfigurationError.md) + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `message` | `string` | +| `payload?` | `Object` | + +#### Returns + +[`ConfigurationError`](ConfigurationError.md) + +#### Overrides + +Error.constructor + +#### Defined in + +sdk/src/types/errors.ts:188 + +## Properties + +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +sdk/src/types/errors.ts:187 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ContractError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ContractError.md new file mode 100644 index 00000000..8561bfa7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ContractError.md @@ -0,0 +1,197 @@ +--- +id: "ContractError" +title: "Class: ContractError" +sidebar_label: "ContractError" +sidebar_position: 0 +custom_edit_url: null +--- + +An error that is returned by the contract + +## Hierarchy + +- `Error` + + ↳ **`ContractError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Constructors + +### constructor + +• **new ContractError**(`errorName?`, `payload?`): [`ContractError`](ContractError.md) + +#### Parameters + +| Name | Type | +| :------------- | :------------------------------ | +| `errorName?` | `string` | +| `payload?` | `Object` | +| `payload.data` | \`0x$\{string}\` \| `BaseError` | + +#### Returns + +[`ContractError`](ContractError.md) + +#### Overrides + +Error.constructor + +#### Defined in + +sdk/src/types/errors.ts:43 + +## Properties + +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +sdk/src/types/errors.ts:41 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/FetchError.md new file mode 100644 index 00000000..75c55a8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/FetchError.md @@ -0,0 +1,198 @@ +--- +id: "FetchError" +title: "Class: FetchError" +sidebar_label: "FetchError" +sidebar_position: 0 +custom_edit_url: null +--- + +Fails fetching a remote resource + +## Hierarchy + +- `Error` + + ↳ **`FetchError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Constructors + +### constructor + +• **new FetchError**(`message`, `payload?`): [`FetchError`](FetchError.md) + +Creates a new instance of the FetchError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Returns + +[`FetchError`](FetchError.md) + +#### Overrides + +Error.constructor + +#### Defined in + +sdk/src/types/errors.ts:65 + +## Properties + +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +sdk/src/types/errors.ts:58 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertClient.md new file mode 100644 index 00000000..0ef53914 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertClient.md @@ -0,0 +1,818 @@ +--- +id: "HypercertClient" +title: "Class: HypercertClient" +sidebar_label: "HypercertClient" +sidebar_position: 0 +custom_edit_url: null +--- + +The `HypercertClient` is a core class in the hypercerts SDK, providing a high-level interface to interact with the hypercerts system. + +It encapsulates the logic for storage, evaluation, indexing, and wallet interactions, abstracting the complexity and providing a simple API for users. +The client is read-only if the storage is read-only (no nft.storage/web3.storage keys) or if no walletClient was found. + +**`Example`** + +```ts +const config: Partial = { + chain: { id: 5 }, +}; +const client = new HypercertClient(config); +``` + +**`Param`** + +The configuration options for the client. + +## Implements + +- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) + +## Constructors + +### constructor + +• **new HypercertClient**(`config`): [`HypercertClient`](HypercertClient.md) + +Creates a new instance of the `HypercertClient` class. + +This constructor takes a `config` parameter that is used to configure the client. The `config` parameter should be a `HypercertClientConfig` object. If the public client cannot be connected, it throws a `ClientError`. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | + +#### Returns + +[`HypercertClient`](HypercertClient.md) + +**`Throws`** + +Will throw a `ClientError` if the public client cannot be connected. + +#### Defined in + +sdk/src/client.ts:55 + +## Properties + +### \_config + +• `Readonly` **\_config**: `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> + +#### Defined in + +sdk/src/client.ts:38 + +--- + +### \_evaluator + +• `Private` `Optional` **\_evaluator**: `HypercertEvaluator` + +#### Defined in + +sdk/src/client.ts:41 + +--- + +### \_indexer + +• `Private` **\_indexer**: `HypercertIndexer` + +#### Defined in + +sdk/src/client.ts:42 + +--- + +### \_publicClient + +• `Private` **\_publicClient**: `Object` + +#### Type declaration + +| Name | Type | Description | +| :------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `account` | `undefined` | The Account of the Client. | +| `batch?` | \{ `multicall?`: `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } } | Flags for batch settings. | +| `batch.multicall?` | `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } | Toggle to enable `eth_call` multicall aggregation. | +| `cacheTime` | `number` | Time (in ms) that cached data will remain in memory. | +| `call` | (`parameters`: `CallParameters`<`undefined` \| `Chain`\>) => `Promise`<`CallReturnType`\> | Executes a new message call immediately without submitting a transaction to the network. - Docs: https://viem.sh/docs/actions/public/call.html - JSON-RPC Methods: [`eth_call`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const data = await client.call({ account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', }) ` | +| `chain` | `undefined` \| `Chain` | Chain for the client. | +| `createBlockFilter` | () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"block"` }\> | Creates a Filter to listen for new block hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createBlockFilter.html - JSON-RPC Methods: [`eth_newBlockFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newBlockFilter) **`Example`** `ts import { createPublicClient, createBlockFilter, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await createBlockFilter(client) // { id: "0x345a6572337856574a76364e457a4366", type: 'block' } ` | +| `createContractEventFilter` | (`args`: `CreateContractEventFilterParameters`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`CreateContractEventFilterReturnType`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Creates a Filter to retrieve event logs that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html) or [`getFilterLogs`](https://viem.sh/docs/actions/public/getFilterLogs.html). - Docs: https://viem.sh/docs/contract/createContractEventFilter.html **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createContractEventFilter({ abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']), }) ` | +| `createEventFilter` | (`args?`: `CreateEventFilterParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`, `_EventName`, `_Args`\>) => `Promise`<\{ [K in keyof Filter<"event", TAbiEvents, \_EventName, \_Args, TStrict, TFromBlock, TToBlock\>]: Filter<"event", TAbiEvents, ... 4 more ..., TToBlock\>[K]; }\> | Creates a [`Filter`](https://viem.sh/docs/glossary/types.html#filter) to listen for new events that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createEventFilter.html - JSON-RPC Methods: [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2', }) ` | +| `createPendingTransactionFilter` | () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"transaction"` }\> | Creates a Filter to listen for new pending transaction hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createPendingTransactionFilter.html - JSON-RPC Methods: [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createPendingTransactionFilter() // { id: "0x345a6572337856574a76364e457a4366", type: 'transaction' } ` | +| `estimateContractGas` | (`args`: `EstimateContractGasParameters`<`TAbi`, `TFunctionName`, `TChain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> | Estimates the gas required to successfully execute a contract write function call. - Docs: https://viem.sh/docs/contract/estimateContractGas.html **`Remarks`** Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`estimateGas` action](https://viem.sh/docs/actions/public/estimateGas.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gas = await client.estimateContractGas({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint() public']), functionName: 'mint', account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', }) ` | +| `estimateFeesPerGas` | (`args?`: `EstimateFeesPerGasParameters`<`undefined` \| `Chain`, `TChainOverride`, `TType`\>) => `Promise`<`EstimateFeesPerGasReturnType`\> | Returns an estimate for the fees per gas for a transaction to be included in the next block. - Docs: https://viem.sh/docs/actions/public/estimateFeesPerGas.html **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const maxPriorityFeePerGas = await client.estimateFeesPerGas() // { maxFeePerGas: ..., maxPriorityFeePerGas: ... } ` | +| `estimateGas` | (`args`: `EstimateGasParameters`<`undefined` \| `Chain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> | Estimates the gas necessary to complete a transaction without submitting it to the network. - Docs: https://viem.sh/docs/actions/public/estimateGas.html - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas) **`Example`** `ts import { createPublicClient, http, parseEther } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gasEstimate = await client.estimateGas({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: parseEther('1'), }) ` | +| `estimateMaxPriorityFeePerGas` | (`args?`: \{ `chain`: `null` \| `TChainOverride` }) => `Promise`<`bigint`\> | Returns an estimate for the max priority fee per gas (in wei) for a transaction to be included in the next block. - Docs: https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas.html **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const maxPriorityFeePerGas = await client.estimateMaxPriorityFeePerGas() // 10000000n ` | +| `extend` | (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, `PublicActions`<`Transport`, `undefined` \| `Chain`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, \{ [K in keyof client]: client[K]; } & `PublicActions`<`Transport`, `undefined` \| `Chain`\>\> | - | +| `getBalance` | (`args`: `GetBalanceParameters`) => `Promise`<`bigint`\> | Returns the balance of an address in wei. - Docs: https://viem.sh/docs/actions/public/getBalance.html - JSON-RPC Methods: [`eth_getBalance`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance) **`Remarks`** You can convert the balance to ether units with [`formatEther`](https://viem.sh/docs/utilities/formatEther.html). `ts const balance = await getBalance(client, { address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', blockTag: 'safe' }) const balanceAsEther = formatEther(balance) // "6.942" ` **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const balance = await client.getBalance({ address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) // 10000000000000000000000n (wei) ` | +| `getBlock` | (`args?`: `GetBlockParameters`<`TIncludeTransactions`, `TBlockTag`\>) => `Promise`<`GetBlockReturnType`<`undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>\> | Returns information about a block at a block number, hash, or tag. - Docs: https://viem.sh/docs/actions/public/getBlock.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/fetching-blocks - JSON-RPC Methods: - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) for `blockNumber` & `blockTag`. - Calls [`eth_getBlockByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbyhash) for `blockHash`. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const block = await client.getBlock() ` | +| `getBlockNumber` | (`args?`: `GetBlockNumberParameters`) => `Promise`<`bigint`\> | Returns the number of the most recent block seen. - Docs: https://viem.sh/docs/actions/public/getBlockNumber.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/fetching-blocks - JSON-RPC Methods: [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const blockNumber = await client.getBlockNumber() // 69420n ` | +| `getBlockTransactionCount` | (`args?`: `GetBlockTransactionCountParameters`) => `Promise`<`number`\> | Returns the number of Transactions at a block number, hash, or tag. - Docs: https://viem.sh/docs/actions/public/getBlockTransactionCount.html - JSON-RPC Methods: - Calls [`eth_getBlockTransactionCountByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbynumber) for `blockNumber` & `blockTag`. - Calls [`eth_getBlockTransactionCountByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbyhash) for `blockHash`. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const count = await client.getBlockTransactionCount() ` | +| `getBytecode` | (`args`: `GetBytecodeParameters`) => `Promise`<`GetBytecodeReturnType`\> | Retrieves the bytecode at an address. - Docs: https://viem.sh/docs/contract/getBytecode.html - JSON-RPC Methods: [`eth_getCode`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getcode) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const code = await client.getBytecode({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', }) ` | +| `getChainId` | () => `Promise`<`number`\> | Returns the chain ID associated with the current network. - Docs: https://viem.sh/docs/actions/public/getChainId.html - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const chainId = await client.getChainId() // 1 ` | +| `getContractEvents` | (`args`: `GetContractEventsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetContractEventsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs emitted by a contract. - Docs: https://viem.sh/docs/actions/public/getContractEvents.html - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { wagmiAbi } from './abi' const client = createPublicClient({ chain: mainnet, transport: http(), }) const logs = await client.getContractEvents(client, { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: wagmiAbi, eventName: 'Transfer' }) ` | +| `getEnsAddress` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; coinType?: number \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsAddressReturnType`\> | Gets address for ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsAddress.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensAddress = await client.getEnsAddress({ name: normalize('wagmi-dev.eth'), }) // '0xd2135CfB216b74109775236E36d4b433F1DF507B' ` | +| `getEnsAvatar` | (`args`: \{ name: string; blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; universalResolverAddress?: \`0x$\{string}\` \| undefined; gatewayUrls?: AssetGatewayUrls \| undefined; }) => `Promise`<`GetEnsAvatarReturnType`\> | Gets the avatar of an ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsAvatar.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText.html) with `key` set to `'avatar'`. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensAvatar = await client.getEnsAvatar({ name: normalize('wagmi-dev.eth'), }) // 'https://ipfs.io/ipfs/Qma8mnp6xV3J2cRNf3mTth5C8nV11CAnceVinc3y8jSbio' ` | +| `getEnsName` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; address: \`0x$\{string}\`; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsNameReturnType`\> | Gets primary name for specified address. - Docs: https://viem.sh/docs/ens/actions/getEnsName.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `reverse(bytes)` on ENS Universal Resolver Contract to "reverse resolve" the address to the primary ENS name. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensName = await client.getEnsName({ address: '0xd2135CfB216b74109775236E36d4b433F1DF507B', }) // 'wagmi-dev.eth' ` | +| `getEnsResolver` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<\`0x$\{string}\`\> | Gets resolver for ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsResolver.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `findResolver(bytes)` on ENS Universal Resolver Contract to retrieve the resolver of an ENS name. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const resolverAddress = await client.getEnsResolver({ name: normalize('wagmi-dev.eth'), }) // '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41' ` | +| `getEnsText` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; key: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsTextReturnType`\> | Gets a text record for specified ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsResolver.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const twitterRecord = await client.getEnsText({ name: normalize('wagmi-dev.eth'), key: 'com.twitter', }) // 'wagmi_sh' ` | +| `getFeeHistory` | (`args`: `GetFeeHistoryParameters`) => `Promise`<`GetFeeHistoryReturnType`\> | Returns a collection of historical gas information. - Docs: https://viem.sh/docs/actions/public/getFeeHistory.html - JSON-RPC Methods: [`eth_feeHistory`](https://docs.alchemy.com/reference/eth-feehistory) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const feeHistory = await client.getFeeHistory({ blockCount: 4, rewardPercentiles: [25, 75], }) ` | +| `getFilterChanges` | (`args`: `GetFilterChangesParameters`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterChangesReturnType`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of logs or hashes based on a [Filter](/docs/glossary/terms#filter) since the last time it was called. - Docs: https://viem.sh/docs/actions/public/getFilterChanges.html - JSON-RPC Methods: [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges) **`Remarks`** A Filter can be created from the following actions: - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter.html) - [`createContractEventFilter`](https://viem.sh/docs/contract/createContractEventFilter.html) - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter.html) - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter.html) Depending on the type of filter, the return value will be different: - If the filter was created with `createContractEventFilter` or `createEventFilter`, it returns a list of logs. - If the filter was created with `createPendingTransactionFilter`, it returns a list of transaction hashes. - If the filter was created with `createBlockFilter`, it returns a list of block hashes. **`Example`** `ts // Blocks import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createBlockFilter() const hashes = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Contract Events import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createContractEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']), eventName: 'Transfer', }) const logs = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Raw Events import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'), }) const logs = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Transactions import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createPendingTransactionFilter() const hashes = await client.getFilterChanges({ filter }) ` | +| `getFilterLogs` | (`args`: `GetFilterLogsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterLogsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs since the filter was created. - Docs: https://viem.sh/docs/actions/public/getFilterLogs.html - JSON-RPC Methods: [`eth_getFilterLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterlogs) **`Remarks`** `getFilterLogs` is only compatible with **event filters**. **`Example`** `ts import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'), }) const logs = await client.getFilterLogs({ filter }) ` | +| `getGasPrice` | () => `Promise`<`bigint`\> | Returns the current price of gas (in wei). - Docs: https://viem.sh/docs/actions/public/getGasPrice.html - JSON-RPC Methods: [`eth_gasPrice`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gasprice) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gasPrice = await client.getGasPrice() ` | +| `getLogs` | (`args?`: `GetLogsParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetLogsReturnType`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs matching the provided parameters. - Docs: https://viem.sh/docs/actions/public/getLogs.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/filters-and-logs/event-logs - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) **`Example`** `ts import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const logs = await client.getLogs() ` | +| `getProof` | (`args`: `GetProofParameters`) => `Promise`<`GetProofReturnType`\> | Returns the account and storage values of the specified account including the Merkle-proof. - Docs: https://viem.sh/docs/actions/public/getProof.html - JSON-RPC Methods: - Calls [`eth_getProof`](https://eips.ethereum.org/EIPS/eip-1186) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const block = await client.getProof({ address: '0x...', storageKeys: ['0x...'], }) ` | +| `getStorageAt` | (`args`: `GetStorageAtParameters`) => `Promise`<`GetStorageAtReturnType`\> | Returns the value from a storage slot at a given address. - Docs: https://viem.sh/docs/contract/getStorageAt.html - JSON-RPC Methods: [`eth_getStorageAt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { getStorageAt } from 'viem/contract' const client = createPublicClient({ chain: mainnet, transport: http(), }) const code = await client.getStorageAt({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', slot: toHex(0), }) ` | +| `getTransaction` | (`args`: `GetTransactionParameters`<`TBlockTag`\>) => `Promise`<`GetTransactionReturnType`<`undefined` \| `Chain`, `TBlockTag`\>\> | Returns information about a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) given a hash or block identifier. - Docs: https://viem.sh/docs/actions/public/getTransaction.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionByHash) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transaction = await client.getTransaction({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `getTransactionConfirmations` | (`args`: `GetTransactionConfirmationsParameters`<`undefined` \| `Chain`\>) => `Promise`<`bigint`\> | Returns the number of blocks passed (confirmations) since the transaction was processed on a block. - Docs: https://viem.sh/docs/actions/public/getTransactionConfirmations.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionConfirmations`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionConfirmations) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const confirmations = await client.getTransactionConfirmations({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `getTransactionCount` | (`args`: `GetTransactionCountParameters`) => `Promise`<`number`\> | Returns the number of [Transactions](https://viem.sh/docs/glossary/terms.html#transaction) an Account has broadcast / sent. - Docs: https://viem.sh/docs/actions/public/getTransactionCount.html - JSON-RPC Methods: [`eth_getTransactionCount`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactioncount) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionCount = await client.getTransactionCount({ address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) ` | +| `getTransactionReceipt` | (`args`: `GetTransactionReceiptParameters`) => `Promise`<`TransactionReceipt`\> | Returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) hash. - Docs: https://viem.sh/docs/actions/public/getTransactionReceipt.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionReceipt = await client.getTransactionReceipt({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `key` | `string` | A key for the client. | +| `multicall` | (`args`: `MulticallParameters`<`TContracts`, `TAllowFailure`\>) => `Promise`<`MulticallReturnType`<`TContracts`, `TAllowFailure`\>\> | Similar to [`readContract`](https://viem.sh/docs/contract/readContract.html), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall). - Docs: https://viem.sh/docs/contract/multicall.html **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const abi = parseAbi([ 'function balanceOf(address) view returns (uint256)', 'function totalSupply() view returns (uint256)', ]) const result = await client.multicall({ contracts: [ { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi, functionName: 'balanceOf', args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'], }, { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi, functionName: 'totalSupply', }, ], }) // [{ result: 424122n, status: 'success' }, { result: 1000000n, status: 'success' }] ` | +| `name` | `string` | A name for the client. | +| `pollingInterval` | `number` | Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. | +| `prepareTransactionRequest` | (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> | Prepares a transaction request for signing. - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest.html **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` | +| `readContract` | (`args`: `ReadContractParameters`<`TAbi`, `TFunctionName`\>) => `Promise`<`ReadContractReturnType`<`TAbi`, `TFunctionName`\>\> | Calls a read-only function on a contract, and returns the response. - Docs: https://viem.sh/docs/contract/readContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/reading-contracts **`Remarks`** A "read-only" function (constant function) on a Solidity contract is denoted by a `view` or `pure` keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas. Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' import { readContract } from 'viem/contract' const client = createPublicClient({ chain: mainnet, transport: http(), }) const result = await client.readContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function balanceOf(address) view returns (uint256)']), functionName: 'balanceOf', args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'], }) // 424122n ` | +| `request` | `EIP1193RequestFn`<`PublicRpcSchema`\> | Request function wrapped with friendly error handling | +| `sendRawTransaction` | (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> | Sends a **signed** transaction to the network - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction.html - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' import { sendRawTransaction } from 'viem/wallet' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendRawTransaction({ serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33' }) ` | +| `simulateContract` | (`args`: `SimulateContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>) => `Promise`<`SimulateContractReturnType`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>\> | Simulates/validates a contract interaction. This is useful for retrieving **return data** and **revert reasons** of contract write functions. - Docs: https://viem.sh/docs/contract/simulateContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/writing-to-contracts **`Remarks`** This function does not require gas to execute and _**does not**_ change the state of the blockchain. It is almost identical to [`readContract`](https://viem.sh/docs/contract/readContract.html), but also supports contract write functions. Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const result = await client.simulateContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32) view returns (uint32)']), functionName: 'mint', args: ['69420'], account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) ` | +| `transport` | `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> | The RPC transport | +| `type` | `string` | The type of client. | +| `uid` | `string` | A unique ID for the client. | +| `uninstallFilter` | (`args`: `UninstallFilterParameters`) => `Promise`<`boolean`\> | Destroys a Filter that was created from one of the following Actions: - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter.html) - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter.html) - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter.html) - Docs: https://viem.sh/docs/actions/public/uninstallFilter.html - JSON-RPC Methods: [`eth_uninstallFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_uninstallFilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { createPendingTransactionFilter, uninstallFilter } from 'viem/public' const filter = await client.createPendingTransactionFilter() const uninstalled = await client.uninstallFilter({ filter }) // true ` | +| `verifyMessage` | (`args`: `VerifyMessageParameters`) => `Promise`<`boolean`\> | - | +| `verifyTypedData` | (`args`: `VerifyTypedDataParameters`) => `Promise`<`boolean`\> | - | +| `waitForTransactionReceipt` | (`args`: `WaitForTransactionReceiptParameters`<`undefined` \| `Chain`\>) => `Promise`<`TransactionReceipt`\> | Waits for the [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) to be included on a [Block](https://viem.sh/docs/glossary/terms.html#block) (one confirmation), and then returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt). If the Transaction reverts, then the action will throw an error. - Docs: https://viem.sh/docs/actions/public/waitForTransactionReceipt.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/sending-transactions - JSON-RPC Methods: - Polls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) on each block until it has been processed. - If a Transaction has been replaced: - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) and extracts the transactions - Checks if one of the Transactions is a replacement - If so, calls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt). **`Remarks`** The `waitForTransactionReceipt` action additionally supports Replacement detection (e.g. sped up Transactions). Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel). Transactions are replaced when they are sent from the same nonce. There are 3 types of Transaction Replacement reasons: - `repriced`: The gas price has been modified (e.g. different `maxFeePerGas`) - `cancelled`: The Transaction has been cancelled (e.g. `value === 0n`) - `replaced`: The Transaction has been replaced (e.g. different `value` or `data`) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionReceipt = await client.waitForTransactionReceipt({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `watchBlockNumber` | (`args`: `WatchBlockNumberParameters`) => `WatchBlockNumberReturnType` | Watches and returns incoming block numbers. - Docs: https://viem.sh/docs/actions/public/watchBlockNumber.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/watching-blocks - JSON-RPC Methods: - When `poll: true`, calls [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchBlockNumber({ onBlockNumber: (blockNumber) => console.log(blockNumber), }) ` | +| `watchBlocks` | (`args`: `WatchBlocksParameters`<`Transport`, `undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>) => `WatchBlocksReturnType` | Watches and returns information for incoming blocks. - Docs: https://viem.sh/docs/actions/public/watchBlocks.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/watching-blocks - JSON-RPC Methods: - When `poll: true`, calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getBlockByNumber) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchBlocks({ onBlock: (block) => console.log(block), }) ` | +| `watchContractEvent` | (`args`: `WatchContractEventParameters`<`TAbi`, `TEventName`, `TStrict`\>) => `WatchContractEventReturnType` | Watches and returns emitted contract event logs. - Docs: https://viem.sh/docs/contract/watchContractEvent.html **`Remarks`** This Action will batch up all the event logs found within the [`pollingInterval`](https://viem.sh/docs/contract/watchContractEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/contract/watchContractEvent.html#onLogs). `watchContractEvent` will attempt to create an [Event Filter](https://viem.sh/docs/contract/createContractEventFilter.html) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchContractEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs.html) instead. **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = client.watchContractEvent({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['event Transfer(address indexed from, address indexed to, uint256 value)']), eventName: 'Transfer', args: { from: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b' }, onLogs: (logs) => console.log(logs), }) ` | +| `watchEvent` | (`args`: `WatchEventParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`\>) => `WatchEventReturnType` | Watches and returns emitted [Event Logs](https://viem.sh/docs/glossary/terms.html#event-log). - Docs: https://viem.sh/docs/actions/public/watchEvent.html - JSON-RPC Methods: - **RPC Provider supports `eth_newFilter`:** - Calls [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) to create a filter (called on initialize). - On a polling interval, it will call [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges). - **RPC Provider does not support `eth_newFilter`:** - Calls [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) for each block between the polling interval. **`Remarks`** This Action will batch up all the Event Logs found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/actions/public/watchEvent.html#onLogs). `watchEvent` will attempt to create an [Event Filter](https://viem.sh/docs/actions/public/createEventFilter.html) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs.html) instead. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = client.watchEvent({ onLogs: (logs) => console.log(logs), }) ` | +| `watchPendingTransactions` | (`args`: `WatchPendingTransactionsParameters`<`Transport`\>) => `WatchPendingTransactionsReturnType` | Watches and returns pending transaction hashes. - Docs: https://viem.sh/docs/actions/public/watchPendingTransactions.html - JSON-RPC Methods: - When `poll: true` - Calls [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) to initialize the filter. - Calls [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getFilterChanges) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newPendingTransactions"` event. **`Remarks`** This Action will batch up all the pending transactions found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchPendingTransactions.html#pollinginterval-optional), and invoke them via [`onTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions.html#ontransactions). **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchPendingTransactions({ onTransactions: (hashes) => console.log(hashes), }) ` | + +#### Defined in + +sdk/src/client.ts:43 + +--- + +### \_storage + +• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +sdk/src/client.ts:39 + +--- + +### \_walletClient + +• `Private` `Optional` **\_walletClient**: `Object` + +#### Type declaration + +| Name | Type | Description | +| :-------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `account` | `undefined` \| `Account` | The Account of the Client. | +| `addChain` | (`args`: `AddChainParameters`) => `Promise`<`void`\> | Adds an EVM chain to the wallet. - Docs: https://viem.sh/docs/actions/wallet/addChain.html - JSON-RPC Methods: [`eth_addEthereumChain`](https://eips.ethereum.org/EIPS/eip-3085) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { optimism } from 'viem/chains' const client = createWalletClient({ transport: custom(window.ethereum), }) await client.addChain({ chain: optimism }) ` | +| `batch?` | \{ `multicall?`: `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } } | Flags for batch settings. | +| `batch.multicall?` | `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } | Toggle to enable `eth_call` multicall aggregation. | +| `cacheTime` | `number` | Time (in ms) that cached data will remain in memory. | +| `chain` | `undefined` \| `Chain` | Chain for the client. | +| `deployContract` | (`args`: `DeployContractParameters`<`TAbi`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Deploys a contract to the network, given bytecode and constructor arguments. - Docs: https://viem.sh/docs/contract/deployContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/deploying-contracts **`Example`** `ts import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const hash = await client.deployContract({ abi: [], account: '0x…, bytecode: '0x608060405260405161083e38038061083e833981016040819052610...', }) ` | +| `extend` | (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, \{ [K in keyof client]: client[K]; } & `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\> | - | +| `getAddresses` | () => `Promise`<`GetAddressesReturnType`\> | Returns a list of account addresses owned by the wallet or client. - Docs: https://viem.sh/docs/actions/wallet/getAddresses.html - JSON-RPC Methods: [`eth_accounts`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_accounts) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const accounts = await client.getAddresses() ` | +| `getChainId` | () => `Promise`<`number`\> | Returns the chain ID associated with the current network. - Docs: https://viem.sh/docs/actions/public/getChainId.html - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid) **`Example`** `ts import { createWalletClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const chainId = await client.getChainId() // 1 ` | +| `getPermissions` | () => `Promise`<`GetPermissionsReturnType`\> | Gets the wallets current permissions. - Docs: https://viem.sh/docs/actions/wallet/getPermissions.html - JSON-RPC Methods: [`wallet_getPermissions`](https://eips.ethereum.org/EIPS/eip-2255) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const permissions = await client.getPermissions() ` | +| `key` | `string` | A key for the client. | +| `name` | `string` | A name for the client. | +| `pollingInterval` | `number` | Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. | +| `prepareTransactionRequest` | (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> | Prepares a transaction request for signing. - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest.html **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` | +| `request` | `EIP1193RequestFn`<`WalletRpcSchema`\> | Request function wrapped with friendly error handling | +| `requestAddresses` | () => `Promise`<`RequestAddressesReturnType`\> | Requests a list of accounts managed by a wallet. - Docs: https://viem.sh/docs/actions/wallet/requestAddresses.html - JSON-RPC Methods: [`eth_requestAccounts`](https://eips.ethereum.org/EIPS/eip-1102) Sends a request to the wallet, asking for permission to access the user's accounts. After the user accepts the request, it will return a list of accounts (addresses). This API can be useful for dapps that need to access the user's accounts in order to execute transactions or interact with smart contracts. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const accounts = await client.requestAddresses() ` | +| `requestPermissions` | (`args`: \{ [x: string]: Record; eth_accounts: Record; }) => `Promise`<`RequestPermissionsReturnType`\> | Requests permissions for a wallet. - Docs: https://viem.sh/docs/actions/wallet/requestPermissions.html - JSON-RPC Methods: [`wallet_requestPermissions`](https://eips.ethereum.org/EIPS/eip-2255) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const permissions = await client.requestPermissions({ eth_accounts: {} }) ` | +| `sendRawTransaction` | (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> | Sends a **signed** transaction to the network - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction.html - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' import { sendRawTransaction } from 'viem/wallet' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendRawTransaction({ serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33' }) ` | +| `sendTransaction` | (`args`: `SendTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Creates, signs, and sends a new transaction to the network. - Docs: https://viem.sh/docs/actions/wallet/sendTransaction.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/sending-transactions - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_sendTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendtransaction) - Local Accounts: [`eth_sendRawTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendrawtransaction) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendTransaction({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: 1000000000000000000n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const hash = await client.sendTransaction({ to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: 1000000000000000000n, }) ` | +| `signMessage` | (`args`: `SignMessageParameters`<`undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | Calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191): `keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))`. - Docs: https://viem.sh/docs/actions/wallet/signMessage.html - JSON-RPC Methods: - JSON-RPC Accounts: [`personal_sign`](https://docs.metamask.io/guide/signing-data.html#personal-sign) - Local Accounts: Signs locally. No JSON-RPC request. With the calculated signature, you can: - use [`verifyMessage`](https://viem.sh/docs/utilities/verifyMessage.html) to verify the signature, - use [`recoverMessageAddress`](https://viem.sh/docs/utilities/recoverMessageAddress.html) to recover the signing address from a signature. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const signature = await client.signMessage({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', message: 'hello world', }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const signature = await client.signMessage({ message: 'hello world', }) ` | +| `signTransaction` | (`args`: `SignTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Signs a transaction. - Docs: https://viem.sh/docs/actions/wallet/signTransaction.html - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_signTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) - Local Accounts: Signs locally. No JSON-RPC request. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) const signature = await client.signTransaction(request) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) const signature = await client.signTransaction(request) ` | +| `signTypedData` | (`args`: `SignTypedDataParameters`<`TTypedData`, `TPrimaryType`, `undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | Signs typed data and calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191): `keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))`. - Docs: https://viem.sh/docs/actions/wallet/signTypedData.html - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_signTypedData_v4`](https://docs.metamask.io/guide/signing-data.html#signtypeddata-v4) - Local Accounts: Signs locally. No JSON-RPC request. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const signature = await client.signTypedData({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', domain: { name: 'Ether Mail', version: '1', chainId: 1, verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', }, types: { Person: [ { name: 'name', type: 'string' }, { name: 'wallet', type: 'address' }, ], Mail: [ { name: 'from', type: 'Person' }, { name: 'to', type: 'Person' }, { name: 'contents', type: 'string' }, ], }, primaryType: 'Mail', message: { from: { name: 'Cow', wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', }, to: { name: 'Bob', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', }, contents: 'Hello, Bob!', }, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const signature = await client.signTypedData({ domain: { name: 'Ether Mail', version: '1', chainId: 1, verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', }, types: { Person: [ { name: 'name', type: 'string' }, { name: 'wallet', type: 'address' }, ], Mail: [ { name: 'from', type: 'Person' }, { name: 'to', type: 'Person' }, { name: 'contents', type: 'string' }, ], }, primaryType: 'Mail', message: { from: { name: 'Cow', wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', }, to: { name: 'Bob', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', }, contents: 'Hello, Bob!', }, }) ` | +| `switchChain` | (`args`: `SwitchChainParameters`) => `Promise`<`void`\> | Switch the target chain in a wallet. - Docs: https://viem.sh/docs/actions/wallet/switchChain.html - JSON-RPC Methods: [`eth_switchEthereumChain`](https://eips.ethereum.org/EIPS/eip-3326) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet, optimism } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) await client.switchChain({ id: optimism.id }) ` | +| `transport` | `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> | The RPC transport | +| `type` | `string` | The type of client. | +| `uid` | `string` | A unique ID for the client. | +| `watchAsset` | (`args`: `WatchAssetParams`) => `Promise`<`boolean`\> | Adds an EVM chain to the wallet. - Docs: https://viem.sh/docs/actions/wallet/watchAsset.html - JSON-RPC Methods: [`eth_switchEthereumChain`](https://eips.ethereum.org/EIPS/eip-747) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const success = await client.watchAsset({ type: 'ERC20', options: { address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', decimals: 18, symbol: 'WETH', }, }) ` | +| `writeContract` | (`args`: `WriteContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Executes a write function on a contract. - Docs: https://viem.sh/docs/contract/writeContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/writing-to-contracts A "write" function on a Solidity contract modifies the state of the blockchain. These types of functions require gas to be executed, and hence a [Transaction](https://viem.sh/docs/glossary/terms.html) is needed to be broadcast in order to change the state. Internally, uses a [Wallet Client](https://viem.sh/docs/clients/wallet.html) to call the [`sendTransaction` action](https://viem.sh/docs/actions/wallet/sendTransaction.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **Warning: The `write` internally sends a transaction – it does not validate if the contract write will succeed (the contract may throw an error). It is highly recommended to [simulate the contract write with `contract.simulate`](https://viem.sh/docs/contract/writeContract.html#usage) before you execute it.** **`Example`** `ts import { createWalletClient, custom, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.writeContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32 tokenId) nonpayable']), functionName: 'mint', args: [69420], }) ` **`Example`** `ts // With Validation import { createWalletClient, custom, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const { request } = await client.simulateContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32 tokenId) nonpayable']), functionName: 'mint', args: [69420], } const hash = await client.writeContract(request) ` | + +#### Defined in + +sdk/src/client.ts:44 + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) + +#### Defined in + +sdk/src/client.ts:45 + +## Accessors + +### config + +• `get` **config**(): `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> + +Gets the config for the client. + +#### Returns + +`Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> + +The client config. + +#### Defined in + +sdk/src/client.ts:79 + +--- + +### contract + +• `get` **contract**(): `GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[]\> + +Gets the HypercertMinter contract used by the client. + +#### Returns + +`GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[]\> + +The contract. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) + +#### Defined in + +sdk/src/client.ts:103 + +--- + +### indexer + +• `get` **indexer**(): `HypercertIndexer` + +Gets the indexer for the client. + +#### Returns + +`HypercertIndexer` + +The indexer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) + +#### Defined in + +sdk/src/client.ts:95 + +--- + +### storage + +• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) + +Gets the storage layer for the client. + +#### Returns + +[`HypercertsStorage`](HypercertsStorage.md) + +The storage layer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) + +#### Defined in + +sdk/src/client.ts:87 + +## Methods + +### batchMintClaimFractionsFromAllowlists + +▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Mints multiple claim fractions from allowlists in a batch. + +This method first retrieves the wallet client and account using the `getWallet` method. If the roots are provided, it verifies each proof using the `verifyMerkleProofs` function. If any of the proofs are invalid, it throws an `InvalidOrMissingError`. +It then simulates a contract call to the `batchMintClaimsFromAllowlists` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------- | :------------------------------------------------------------------------ | +| `claimIds` | `bigint`[] | The IDs of the claims to mint. | +| `units` | `bigint`[] | The units of each claim to mint. | +| `proofs` | (\`0x$\{string}\` \| `Uint8Array`)[][] | The proofs for each claim. | +| `roots?` | (\`0x$\{string}\` \| `Uint8Array`)[] | The roots of each proof. If provided, they are used to verify the proofs. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +**`Throws`** + +Will throw an `InvalidOrMissingError` if any of the proofs are invalid. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[batchMintClaimFractionsFromAllowlists](../interfaces/HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) + +#### Defined in + +sdk/src/client.ts:459 + +--- + +### batchTransferFractions + +▸ **batchTransferFractions**(`fractionIds`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Transfers multiple claim fractions to a new owner. + +This method first retrieves the wallet client and account using the `getWallet` method. +It then simulates a contract call to the `safeBatchTransferFrom` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | +| :------------ | :------------------------------------------------------- | +| `fractionIds` | `bigint`[] | +| `to` | \`0x$\{string}\` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[batchTransferFractions](../interfaces/HypercertClientInterface.md#batchtransferfractions) + +#### Defined in + +sdk/src/client.ts:210 + +--- + +### burnClaimFraction + +▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Burns a claim fraction. + +This method first retrieves the wallet client and account using the `getWallet` method. It then retrieves the owner of the claim using the `ownerOf` method of the read contract. +If the claim is not owned by the account, it throws a `ClientError`. +It then simulates a contract call to the `burnFraction` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------- | :---------------------------------------- | +| `claimId` | `bigint` | The ID of the claim to burn. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +**`Throws`** + +Will throw a `ClientError` if the claim is not owned by the account. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[burnClaimFraction](../interfaces/HypercertClientInterface.md#burnclaimfraction) + +#### Defined in + +sdk/src/client.ts:382 + +--- + +### createAllowlist + +▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Creates an allowlist. + +This method first validates the provided allowlist and metadata using the `validateAllowlist` and `validateMetaData` functions respectively. If either is invalid, it throws a `MalformedDataError`. +It then creates an allowlist from the provided entries and stores it on IPFS using the `storeData` method of the storage client. +After that, it stores the metadata (including the CID of the allowlist) on IPFS using the `storeMetadata` method of the storage client. +Finally, it simulates a contract call to the `createAllowlist` function with the provided parameters and the stored metadata CID, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :---------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The entries for the allowlist. | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `bigint` | The total units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restrictions for the claim. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +**`Throws`** + +Will throw a `MalformedDataError` if the provided allowlist or metadata is invalid. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[createAllowlist](../interfaces/HypercertClientInterface.md#createallowlist) + +#### Defined in + +sdk/src/client.ts:243 + +--- + +### getCleanedOverrides + +▸ **getCleanedOverrides**(`overrides?`): `Object` + +#### Parameters + +| Name | Type | +| :----------- | :------------------------------------------------------- | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | + +#### Returns + +`Object` + +#### Defined in + +sdk/src/client.ts:499 + +--- + +### getContractConfig + +▸ **getContractConfig**(): `GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[], `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`\>, `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`\>, \`0x$\{string}\`, `string`, `string`, `string`, `false`\> + +#### Returns + +`GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[], `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`\>, `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`\>, \`0x$\{string}\`, `string`, `string`, `string`, `false`\> + +#### Defined in + +sdk/src/client.ts:490 + +--- + +### getTransferRestrictions + +▸ **getTransferRestrictions**(`fractionId`): `Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +Gets the TransferRestrictions for a claim. + +This method first retrieves the read contract using the `getContract` method. It then simulates a contract call to the `readTransferRestriction` function with the provided fraction ID. + +#### Parameters + +| Name | Type | +| :----------- | :------- | +| `fractionId` | `bigint` | + +#### Returns + +`Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +a Promise that resolves to the applicable transfer restrictions. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[getTransferRestrictions](../interfaces/HypercertClientInterface.md#gettransferrestrictions) + +#### Defined in + +sdk/src/client.ts:162 + +--- + +### getWallet + +▸ **getWallet**(): `Object` + +#### Returns + +`Object` + +| Name | Type | +| :--------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `account` | `Account` | +| `walletClient` | \{ `account`: `undefined` \| `Account` ; `addChain`: (`args`: `AddChainParameters`) => `Promise`<`void`\> ; `batch?`: \{ `multicall?`: `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } } ; `cacheTime`: `number` ; `chain`: `undefined` \| `Chain` ; `deployContract`: (`args`: `DeployContractParameters`<`TAbi`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> ; `extend`: (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, \{ [K in keyof client]: client[K]; } & `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\> ; `getAddresses`: () => `Promise`<`GetAddressesReturnType`\> ; `getChainId`: () => `Promise`<`number`\> ; `getPermissions`: () => `Promise`<`GetPermissionsReturnType`\> ; `key`: `string` ; `name`: `string` ; `pollingInterval`: `number` ; `prepareTransactionRequest`: (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> ; `request`: `EIP1193RequestFn`<`WalletRpcSchema`\> ; `requestAddresses`: () => `Promise`<`RequestAddressesReturnType`\> ; `requestPermissions`: (`args`: \{ [x: string]: Record; eth\_accounts: Record; }) => `Promise`<`RequestPermissionsReturnType`\> ; `sendRawTransaction`: (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> ; `sendTransaction`: (`args`: `SendTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> ; `signMessage`: (`args`: `SignMessageParameters`<`undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> ; `signTransaction`: (`args`: `SignTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> ; `signTypedData`: (`args`: `SignTypedDataParameters`<`TTypedData`, `TPrimaryType`, `undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> ; `switchChain`: (`args`: `SwitchChainParameters`) => `Promise`<`void`\> ; `transport`: `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> ; `type`: `string` ; `uid`: `string` ; `watchAsset`: (`args`: `WatchAssetParams`) => `Promise`<`boolean`\> ; `writeContract`: (`args`: `WriteContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> } | +| `walletClient.account` | `undefined` \| `Account` | +| `walletClient.addChain` | (`args`: `AddChainParameters`) => `Promise`<`void`\> | +| `walletClient.batch?` | \{ `multicall?`: `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } } | +| `walletClient.batch.multicall?` | `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } | +| `walletClient.cacheTime` | `number` | +| `walletClient.chain` | `undefined` \| `Chain` | +| `walletClient.deployContract` | (`args`: `DeployContractParameters`<`TAbi`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.extend` | (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, \{ [K in keyof client]: client[K]; } & `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\> | +| `walletClient.getAddresses` | () => `Promise`<`GetAddressesReturnType`\> | +| `walletClient.getChainId` | () => `Promise`<`number`\> | +| `walletClient.getPermissions` | () => `Promise`<`GetPermissionsReturnType`\> | +| `walletClient.key` | `string` | +| `walletClient.name` | `string` | +| `walletClient.pollingInterval` | `number` | +| `walletClient.prepareTransactionRequest` | (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> | +| `walletClient.request` | `EIP1193RequestFn`<`WalletRpcSchema`\> | +| `walletClient.requestAddresses` | () => `Promise`<`RequestAddressesReturnType`\> | +| `walletClient.requestPermissions` | (`args`: \{ [x: string]: Record; eth_accounts: Record; }) => `Promise`<`RequestPermissionsReturnType`\> | +| `walletClient.sendRawTransaction` | (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.sendTransaction` | (`args`: `SendTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.signMessage` | (`args`: `SignMessageParameters`<`undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.signTransaction` | (`args`: `SignTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.signTypedData` | (`args`: `SignTypedDataParameters`<`TTypedData`, `TPrimaryType`, `undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | +| `walletClient.switchChain` | (`args`: `SwitchChainParameters`) => `Promise`<`void`\> | +| `walletClient.transport` | `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> | +| `walletClient.type` | `string` | +| `walletClient.uid` | `string` | +| `walletClient.watchAsset` | (`args`: `WatchAssetParams`) => `Promise`<`boolean`\> | +| `walletClient.writeContract` | (`args`: `WriteContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | + +#### Defined in + +sdk/src/client.ts:509 + +--- + +### mergeFractionUnits + +▸ **mergeFractionUnits**(`fractionIds`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Merges multiple fractions into a single fraction. + +This method first retrieves the wallet client and account using the `getWallet` method. It then retrieves the owner of each fraction using the `ownerOf` method of the read contract. +If any of the fractions are not owned by the account, it throws a `ClientError`. +It then simulates a contract call to the `mergeFractions` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | Description | +| :------------ | :------------------------------------------------------- | :---------------------------------------- | +| `fractionIds` | `bigint`[] | The IDs of the fractions to merge. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +**`Throws`** + +Will throw a `ClientError` if any of the fractions are not owned by the account. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[mergeFractionUnits](../interfaces/HypercertClientInterface.md#mergefractionunits) + +#### Defined in + +sdk/src/client.ts:341 + +--- + +### mintClaim + +▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Mints a new claim. + +This method first validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. +It then stores the metadata on IPFS using the `storeMetadata` method of the storage client. +After that, it simulates a contract call to the `mintClaim` function with the provided parameters and the stored metadata CID to validate the transaction. +Finally, it submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :---------------------------------------- | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `bigint` | The total units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restrictions for the claim. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +**`Throws`** + +Will throw a `MalformedDataError` if the provided metadata is invalid. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[mintClaim](../interfaces/HypercertClientInterface.md#mintclaim) + +#### Defined in + +sdk/src/client.ts:127 + +--- + +### mintClaimFractionFromAllowlist + +▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Mints a claim fraction from an allowlist. + +This method first retrieves the wallet client and account using the `getWallet` method. It then verifies the provided proof using the `verifyMerkleProof` function. If the proof is invalid, it throws an `InvalidOrMissingError`. +It then simulates a contract call to the `mintClaimFromAllowlist` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------- | :------------------------------------------------------------------ | +| `claimId` | `bigint` | The ID of the claim to mint. | +| `units` | `bigint` | The units of the claim to mint. | +| `proof` | (\`0x$\{string}\` \| `Uint8Array`)[] | The proof for the claim. | +| `root?` | \`0x$\{string}\` \| `Uint8Array` | The root of the proof. If provided, it is used to verify the proof. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +**`Throws`** + +Will throw an `InvalidOrMissingError` if the proof is invalid. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[mintClaimFractionFromAllowlist](../interfaces/HypercertClientInterface.md#mintclaimfractionfromallowlist) + +#### Defined in + +sdk/src/client.ts:415 + +--- + +### simulateRequest + +▸ **simulateRequest**(`account`, `functionName`, `args`, `overrides?`): `Promise`<\{ `abi`: `Narrow`<\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" }\>[] ; `accessList?`: `AccessList` ; `account`: \`0x$\{string}\` \| `Account` ; `address`: \`0x$\{string}\` ; `args?`: readonly `unknown`[] ; `chain`: `undefined` ; `dataSuffix?`: \`0x$\{string}\` ; `functionName`: `string` ; `gas?`: `bigint` ; `gasPrice?`: `bigint` ; `maxFeePerGas?`: `bigint` ; `maxPriorityFeePerGas?`: `bigint` ; `nonce?`: `number` ; `type?`: `"legacy"` \| `"eip2930"` \| `"eip1559"` ; `value?`: `bigint` }\> + +#### Parameters + +| Name | Type | +| :------------- | :------------------------------------------------------- | +| `account` | `Account` | +| `functionName` | `string` | +| `args` | `unknown`[] | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | + +#### Returns + +`Promise`<\{ `abi`: `Narrow`<\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" }\>[] ; `accessList?`: `AccessList` ; `account`: \`0x$\{string}\` \| `Account` ; `address`: \`0x$\{string}\` ; `args?`: readonly `unknown`[] ; `chain`: `undefined` ; `dataSuffix?`: \`0x$\{string}\` ; `functionName`: `string` ; `gas?`: `bigint` ; `gasPrice?`: `bigint` ; `maxFeePerGas?`: `bigint` ; `maxPriorityFeePerGas?`: `bigint` ; `nonce?`: `number` ; `type?`: `"legacy"` \| `"eip2930"` \| `"eip1559"` ; `value?`: `bigint` }\> + +#### Defined in + +sdk/src/client.ts:519 + +--- + +### splitFractionUnits + +▸ **splitFractionUnits**(`fractionId`, `fractions`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Splits a fraction into multiple fractions. + +This method first retrieves the wallet client and account using the `getWallet` method. It then retrieves the owner and total units of the fraction using the `ownerOf` and `unitsOf` methods of the read contract. +If the fraction is not owned by the account, it throws a `ClientError`. +It then checks if the sum of the provided fractions is equal to the total units of the fraction. If not, it throws a `ClientError`. +Finally, it simulates a contract call to the `splitFraction` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------- | :---------------------------------------- | +| `fractionId` | `bigint` | The ID of the fraction to split. | +| `fractions` | `bigint`[] | The fractions to split the fraction into. | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | Optional overrides for the contract call. | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +**`Throws`** + +Will throw a `ClientError` if the fraction is not owned by the account or if the sum of the fractions is not equal to the total units of the fraction. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[splitFractionUnits](../interfaces/HypercertClientInterface.md#splitfractionunits) + +#### Defined in + +sdk/src/client.ts:296 + +--- + +### submitRequest + +▸ **submitRequest**(`request`): `Promise`<\`0x$\{string}\`\> + +Submits a contract request. + +This method submits a contract request using the `writeContract` method of the wallet client. If the request fails, it throws a `ClientError`. + +#### Parameters + +| Name | Type | Description | +| :-------- | :---- | :------------------------------ | +| `request` | `any` | The contract request to submit. | + +#### Returns + +`Promise`<\`0x$\{string}\`\> + +A promise that resolves to the hash of the submitted request. + +**`Throws`** + +Will throw a `ClientError` if the request fails. + +#### Defined in + +sdk/src/client.ts:550 + +--- + +### transferFraction + +▸ **transferFraction**(`fractionId`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Transfers a claim fraction to a new owner. + +This method first retrieves the wallet client and account using the `getWallet` method. +It then simulates a contract call to the `safeTransferFrom` function with the provided parameters and the account, and submits the request using the `submitRequest` method. + +#### Parameters + +| Name | Type | +| :----------- | :------------------------------------------------------- | +| `fractionId` | `bigint` | +| `to` | `string` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | + +#### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A promise that resolves to the transaction hash. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[transferFraction](../interfaces/HypercertClientInterface.md#transferfraction) + +#### Defined in + +sdk/src/client.ts:182 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertsStorage.md new file mode 100644 index 00000000..6105ec7c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertsStorage.md @@ -0,0 +1,243 @@ +--- +id: "HypercertsStorage" +title: "Class: HypercertsStorage" +sidebar_label: "HypercertsStorage" +sidebar_position: 0 +custom_edit_url: null +--- + +A class that provides storage functionality for Hypercerts. + +This class implements the `HypercertStorageInterface` and provides methods for storing and retrieving Hypercerts. It uses the NFT Storage and Web3 Storage APIs for storage, and can be configured to be read-only. + +**`Example`** + +```ts +const storage = new HypercertsStorage({ + nftStorageToken: "your-nft-storage-token", + web3StorageToken: "your-web3-storage-token", +}); +const metadata = await storage.getMetadata("your-hypercert-id"); +``` + +## Implements + +- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) + +## Constructors + +### constructor + +• **new HypercertsStorage**(`overrides`): [`HypercertsStorage`](HypercertsStorage.md) + +Creates a new instance of the `HypercertsStorage` class. + +This constructor takes an optional `overrides` parameter that can be used to override the default configuration. If the NFT Storage or Web3 Storage API keys are missing or invalid, the storage will be read-only. + +#### Parameters + +| Name | Type | Description | +| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | +| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | + +#### Returns + +[`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +sdk/src/storage.ts:47 + +## Properties + +### nftStorageClient + +• `Optional` **nftStorageClient**: `NFTStorage` + +The NFT Storage client used for storing and retrieving Hypercerts. + +#### Defined in + +sdk/src/storage.ts:36 + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +Whether the storage is read-only. If true, the storage methods will not perform any write operations. + +#### Defined in + +sdk/src/storage.ts:34 + +--- + +### web3StorageClient + +• `Optional` **web3StorageClient**: `Web3Storage` + +The Web3 Storage client used for storing and retrieving Hypercerts. + +#### Defined in + +sdk/src/storage.ts:38 + +## Methods + +### getData + +▸ **getData**(`cidOrIpfsUri`): `Promise`<`unknown`\> + +Retrieves data from IPFS using the provided CID or IPFS URI. + +This method first retrieves the data from IPFS using the `getFromIPFS` function. It then parses the retrieved data as JSON and returns it. + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | + +#### Returns + +`Promise`<`unknown`\> + +A promise that resolves to the retrieved data. + +**`Throws`** + +Will throw a `FetchError` if the retrieval operation fails. + +**`Throws`** + +Will throw a `MalformedDataError` if the retrieved data is not a single file. + +**`Remarkts`** + +Note: The original implementation using the Web3 Storage client is currently commented out due to issues with upstream repos. This will be replaced once those issues are resolved. + +#### Implementation of + +[HypercertStorageInterface](../interfaces/HypercertStorageInterface.md).[getData](../interfaces/HypercertStorageInterface.md#getdata) + +#### Defined in + +sdk/src/storage.ts:167 + +--- + +### getMetadata + +▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +Retrieves Hypercert metadata from IPFS using the provided CID or IPFS URI. + +This method first retrieves the data from IPFS using the `getFromIPFS` function. It then validates the retrieved data using the `validateMetaData` function. If the data is invalid, it throws a `MalformedDataError`. +If the data is valid, it returns the data as a `HypercertMetadata` object. + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :----------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | + +#### Returns + +`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +A promise that resolves to the retrieved metadata. + +**`Throws`** + +Will throw a `MalformedDataError` if the retrieved data is invalid. + +#### Implementation of + +[HypercertStorageInterface](../interfaces/HypercertStorageInterface.md).[getMetadata](../interfaces/HypercertStorageInterface.md#getmetadata) + +#### Defined in + +sdk/src/storage.ts:114 + +--- + +### storeData + +▸ **storeData**(`data`): `Promise`<`CIDString`\> + +Stores data using the Web3 Storage client. + +This method first checks if the storage is read-only or if the Web3 Storage client is not configured. If either of these conditions is true, it throws a `StorageError`. +It then creates a new Blob from the provided data and stores it using the Web3 Storage client. If the storage operation fails, it throws a `StorageError`. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------------------------------------- | +| `data` | `unknown` | The data to store. This can be any type of data. | + +#### Returns + +`Promise`<`CIDString`\> + +A promise that resolves to the CID of the stored data. + +**`Throws`** + +Will throw a `StorageError` if the storage is read-only, if the Web3 Storage client is not configured, or if the storage operation fails. + +**`Remarks`** + +Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Implementation of + +[HypercertStorageInterface](../interfaces/HypercertStorageInterface.md).[storeData](../interfaces/HypercertStorageInterface.md#storedata) + +#### Defined in + +sdk/src/storage.ts:139 + +--- + +### storeMetadata + +▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> + +Stores Hypercert metadata using the NFT Storage client. + +This method first checks if the storage is read-only or if the NFT Storage client is not configured. If either of these conditions is true, it throws a `StorageError`. +It then validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. +If the metadata is valid, it creates a new Blob from the metadata and stores it using the NFT Storage client. If the storage operation fails, it throws a `StorageError`. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------------------------------------------------------- | :----------------------------------------------------------------------------------------------------- | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The Hypercert metadata to store. This should be an object that conforms to the HypercertMetadata type. | + +#### Returns + +`Promise`<`CIDString`\> + +A promise that resolves to the CID of the stored metadata. + +**`Throws`** + +Will throw a `StorageError` if the storage is read-only, if the NFT Storage client is not configured, or if the storage operation fails. + +**`Throws`** + +Will throw a `MalformedDataError` if the provided metadata is invalid. + +#### Implementation of + +[HypercertStorageInterface](../interfaces/HypercertStorageInterface.md).[storeMetadata](../interfaces/HypercertStorageInterface.md#storemetadata) + +#### Defined in + +sdk/src/storage.ts:81 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/InvalidOrMissingError.md new file mode 100644 index 00000000..ca034a9d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/InvalidOrMissingError.md @@ -0,0 +1,198 @@ +--- +id: "InvalidOrMissingError" +title: "Class: InvalidOrMissingError" +sidebar_label: "InvalidOrMissingError" +sidebar_position: 0 +custom_edit_url: null +--- + +The provided value was undefined or empty + +## Hierarchy + +- `Error` + + ↳ **`InvalidOrMissingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Constructors + +### constructor + +• **new InvalidOrMissingError**(`message`, `payload?`): [`InvalidOrMissingError`](InvalidOrMissingError.md) + +Creates a new instance of the InvalidOrMissingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Returns + +[`InvalidOrMissingError`](InvalidOrMissingError.md) + +#### Overrides + +Error.constructor + +#### Defined in + +sdk/src/types/errors.ts:83 + +## Properties + +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +sdk/src/types/errors.ts:76 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MalformedDataError.md new file mode 100644 index 00000000..826cc8f2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MalformedDataError.md @@ -0,0 +1,198 @@ +--- +id: "MalformedDataError" +title: "Class: MalformedDataError" +sidebar_label: "MalformedDataError" +sidebar_position: 0 +custom_edit_url: null +--- + +Data doesn't conform to expectations + +## Hierarchy + +- `Error` + + ↳ **`MalformedDataError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Constructors + +### constructor + +• **new MalformedDataError**(`message`, `payload?`): [`MalformedDataError`](MalformedDataError.md) + +Creates a new instance of the MalformedDataError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Returns + +[`MalformedDataError`](MalformedDataError.md) + +#### Overrides + +Error.constructor + +#### Defined in + +sdk/src/types/errors.ts:155 + +## Properties + +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +sdk/src/types/errors.ts:148 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MintingError.md new file mode 100644 index 00000000..50d11138 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MintingError.md @@ -0,0 +1,198 @@ +--- +id: "MintingError" +title: "Class: MintingError" +sidebar_label: "MintingError" +sidebar_position: 0 +custom_edit_url: null +--- + +Minting transaction failed + +## Hierarchy + +- `Error` + + ↳ **`MintingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Constructors + +### constructor + +• **new MintingError**(`message`, `payload?`): [`MintingError`](MintingError.md) + +Creates a new instance of the MintingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Returns + +[`MintingError`](MintingError.md) + +#### Overrides + +Error.constructor + +#### Defined in + +sdk/src/types/errors.ts:101 + +## Properties + +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +sdk/src/types/errors.ts:94 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/StorageError.md new file mode 100644 index 00000000..e8fe2baa --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/StorageError.md @@ -0,0 +1,198 @@ +--- +id: "StorageError" +title: "Class: StorageError" +sidebar_label: "StorageError" +sidebar_position: 0 +custom_edit_url: null +--- + +Fails storing to a remote resource + +## Hierarchy + +- `Error` + + ↳ **`StorageError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Constructors + +### constructor + +• **new StorageError**(`message`, `payload?`): [`StorageError`](StorageError.md) + +Creates a new instance of the StorageError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Returns + +[`StorageError`](StorageError.md) + +#### Overrides + +Error.constructor + +#### Defined in + +sdk/src/types/errors.ts:119 + +## Properties + +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +sdk/src/types/errors.ts:112 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnknownSchemaError.md new file mode 100644 index 00000000..2325eb5a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnknownSchemaError.md @@ -0,0 +1,201 @@ +--- +id: "UnknownSchemaError" +title: "Class: UnknownSchemaError" +sidebar_label: "UnknownSchemaError" +sidebar_position: 0 +custom_edit_url: null +--- + +Schema could not be loaded + +## Hierarchy + +- `Error` + + ↳ **`UnknownSchemaError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Constructors + +### constructor + +• **new UnknownSchemaError**(`message`, `payload?`): [`UnknownSchemaError`](UnknownSchemaError.md) + +Creates a new instance of the UnknownSchemaError class. + +#### Parameters + +| Name | Type | Description | +| :------------------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.schemaName` | `string` | - | + +#### Returns + +[`UnknownSchemaError`](UnknownSchemaError.md) + +#### Overrides + +Error.constructor + +#### Defined in + +sdk/src/types/errors.ts:137 + +## Properties + +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :----------- | :------- | +| `schemaName` | `string` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +sdk/src/types/errors.ts:130 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnsupportedChainError.md new file mode 100644 index 00000000..7c02e287 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnsupportedChainError.md @@ -0,0 +1,202 @@ +--- +id: "UnsupportedChainError" +title: "Class: UnsupportedChainError" +sidebar_label: "UnsupportedChainError" +sidebar_position: 0 +custom_edit_url: null +--- + +This blockchain is not yet supported +Please file an issue + +## Hierarchy + +- `Error` + + ↳ **`UnsupportedChainError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Constructors + +### constructor + +• **new UnsupportedChainError**(`message`, `payload?`): [`UnsupportedChainError`](UnsupportedChainError.md) + +Creates a new instance of the UnsupportedChainError class. + +#### Parameters + +| Name | Type | Description | +| :---------------- | :---------------------------------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.chainID` | `undefined` \| `string` \| `number` | - | + +#### Returns + +[`UnsupportedChainError`](UnsupportedChainError.md) + +#### Overrides + +Error.constructor + +#### Defined in + +sdk/src/types/errors.ts:174 + +## Properties + +### cause + +• `Optional` **cause**: `unknown` + +#### Inherited from + +Error.cause + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es2022.error.d.ts:24 + +--- + +### message + +• **message**: `string` + +#### Inherited from + +Error.message + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1076 + +--- + +### name + +• **name**: `string` + +#### Inherited from + +Error.name + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1075 + +--- + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :-------- | :---------------------------------- | +| `chainID` | `undefined` \| `string` \| `number` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +sdk/src/types/errors.ts:167 + +--- + +### stack + +• `Optional` **stack**: `string` + +#### Inherited from + +Error.stack + +#### Defined in + +node_modules/.pnpm/typescript@5.3.2/node_modules/typescript/lib/lib.es5.d.ts:1077 + +--- + +### prepareStackTrace + +▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` + +#### Type declaration + +▸ (`err`, `stackTraces`): `any` + +Optional override for formatting stack traces + +##### Parameters + +| Name | Type | +| :------------ | :----------- | +| `err` | `Error` | +| `stackTraces` | `CallSite`[] | + +##### Returns + +`any` + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +Error.prepareStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:11 + +--- + +### stackTraceLimit + +▪ `Static` **stackTraceLimit**: `number` + +#### Inherited from + +Error.stackTraceLimit + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:13 + +## Methods + +### captureStackTrace + +▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` + +Create .stack property on a target object + +#### Parameters + +| Name | Type | +| :---------------- | :--------- | +| `targetObject` | `object` | +| `constructorOpt?` | `Function` | + +#### Returns + +`void` + +#### Inherited from + +Error.captureStackTrace + +#### Defined in + +node_modules/.pnpm/@types+node@18.18.7/node_modules/@types/node/globals.d.ts:4 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/_category_.yml b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/_category_.yml new file mode 100644 index 00000000..55c7980a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/_category_.yml @@ -0,0 +1,2 @@ +label: "Classes" +position: 3 \ No newline at end of file diff --git a/docs/versioned_docs/version-0.3.0/developer/api/sdk/README.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/index.md similarity index 50% rename from docs/versioned_docs/version-0.3.0/developer/api/sdk/README.md rename to docs/versioned_docs/version-1.0.0/developer/api/sdk/index.md index b1434ab0..408b51f2 100644 --- a/docs/versioned_docs/version-0.3.0/developer/api/sdk/README.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/index.md @@ -1,4 +1,10 @@ -Hypercerts SDK Documentation / [Exports](modules.md) +--- +id: "index" +title: "@hypercerts-org/sdk" +sidebar_label: "Readme" +sidebar_position: 0 +custom_edit_url: null +--- # Hypercert SDK @@ -26,15 +32,13 @@ import { HypercertClient } from "@hypercerts-org/sdk"; ```js const client = new HypercertClient({ - chainId: 5, - provider, - signer, + chain: { id: 5 } // required nftStorageToken, web3StorageToken, }); ``` -> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in +> **Note** If there's no `walletClient`, `nftStorageToken` or `web3StorageToken` provided, the client will run in > [read-only mode](#read-only-mode) 4. Use the client object to interact with the Hypercert network. @@ -67,78 +71,36 @@ environment variables for your NFT.storage and web3.storage API keys in your .en ## Config -The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check -the environment variables. +HypercertClientConfig is a configuration object used when initializing a new instance of the HypercertClient. It allows +you to customize the client by setting your own providers or deployments. At it's simplest, you only need to provide +`chain.id` to initalize the client in `readonly` mode. + +| Field | Type | Description | +| --------------------------- | ------- | ---------------------------------------------------------------------------------------------- | +| `chain` | Object | Partial configuration for the blockchain network. | +| `contractAddress` | String | The address of the deployed contract. | +| `graphUrl` | String | The URL to the subgraph that indexes the contract events. Override for localized testing. | +| `graphName` | String | The name of the subgraph. | +| `nftStorageToken` | String | The API token for NFT.storage. | +| `web3StorageToken` | String | The API token for Web3.storage. | +| `easContractAddress` | String | The address of the EAS contract. | +| `publicClient` | Object | The PublicClient is inherently read-only and is used for reading data from the blockchain. | +| `walletClient` | Object | The WalletClient is used for signing and sending transactions. | +| `unsafeForceOverrideConfig` | Boolean | Boolean to force the use of overridden values. | +| `readOnly` | Boolean | Boolean to assert if the client is in read-only mode. | +| `readOnlyReason` | String | Reason for read-only mode. This is optional and can be used for logging or debugging purposes. | ### Read-only mode The SDK client will be in read-only mode if any of the following conditions are true: -- The client was initialized without a signer or provider. -- The client was initialized with a provider but not a signer. -- The client was initialized with a signer but not a provider. +- The client was initialized without a walletprovider. - The contract address is not set. - The storage layer is in read-only mode. If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. -### Defaults - -The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief -explanation of each constant: - -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - -`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object -contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. - -For example: - -```json -{ - "5": { - "chainId": 5, - "chainName": "goerli", - "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "graphName": "hypercerts-testnet" - } -} -``` - -### Client config properties - -| \| Property | Type | Description | -| ------------------ | -------------------- | -------------------------------------- | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | -| `graphName` | `string` | The name of the Gsubgraph to use. | -| `provider` | `providers.Provider` | A custom provider to use. | -| `signer` | `Signer` | A custom signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | - -### Environment variables - -To determine the missing configuration values the SDK defaults to the following environment variables: - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - ### Logging The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level @@ -154,7 +116,7 @@ HypercertIndexer, and HypercertMinter classes, respectively. ```js const { client: { storage }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and @@ -163,7 +125,7 @@ NFT.storage. It is used by the HypercertClient to store metadata when creating n ```js const { client: { indexer }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. @@ -172,7 +134,7 @@ It is used by the HypercertClient to retrieve event-based data via the subgraph ```js const { client: { contract }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/CustomError.md similarity index 70% rename from docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md rename to docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/CustomError.md index b4af6279..3b0952f8 100644 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/CustomError.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError - -# Interface: CustomError +--- +id: "CustomError" +title: "Interface: CustomError" +sidebar_label: "CustomError" +sidebar_position: 0 +custom_edit_url: null +--- An interface for errors that have a specific type. @@ -8,6 +12,7 @@ An interface for errors that have a specific type. - [`ClientError`](../classes/ClientError.md) - [`ConfigurationError`](../classes/ConfigurationError.md) +- [`ContractError`](../classes/ContractError.md) - [`FetchError`](../classes/FetchError.md) - [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) - [`MalformedDataError`](../classes/MalformedDataError.md) @@ -16,12 +21,6 @@ An interface for errors that have a specific type. - [`UnknownSchemaError`](../classes/UnknownSchemaError.md) - [`UnsupportedChainError`](../classes/UnsupportedChainError.md) -## Table of contents - -### Properties - -- [payload](CustomError.md#payload) - ## Properties ### payload @@ -36,4 +35,4 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) +sdk/src/types/errors.ts:10 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/DuplicateEvaluation.md new file mode 100644 index 00000000..4da8fd22 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -0,0 +1,51 @@ +--- +id: "DuplicateEvaluation" +title: "Interface: DuplicateEvaluation" +sidebar_label: "DuplicateEvaluation" +sidebar_position: 0 +custom_edit_url: null +--- + +## Indexable + +▪ [k: `string`]: `unknown` + +## Properties + +### duplicateHypercerts + +• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] + +#### Defined in + +sdk/src/types/evaluation.d.ts:22 + +--- + +### explanation + +• **explanation**: `string` + +#### Defined in + +sdk/src/types/evaluation.d.ts:24 + +--- + +### realHypercert + +• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +sdk/src/types/evaluation.d.ts:23 + +--- + +### type + +• **type**: `"duplicate"` + +#### Defined in + +sdk/src/types/evaluation.d.ts:21 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/EASEvaluation.md new file mode 100644 index 00000000..9328c6cd --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/EASEvaluation.md @@ -0,0 +1,51 @@ +--- +id: "EASEvaluation" +title: "Interface: EASEvaluation" +sidebar_label: "EASEvaluation" +sidebar_position: 0 +custom_edit_url: null +--- + +## Indexable + +▪ [k: `string`]: `unknown` + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +sdk/src/types/evaluation.d.ts:41 + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +sdk/src/types/evaluation.d.ts:42 + +--- + +### type + +• **type**: `"EAS"` + +#### Defined in + +sdk/src/types/evaluation.d.ts:40 + +--- + +### uid + +• **uid**: `string` + +#### Defined in + +sdk/src/types/evaluation.d.ts:43 diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClaimdata.md similarity index 65% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md rename to docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClaimdata.md index 3dcea656..cc3c8ce2 100644 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata - -# Interface: HypercertClaimdata +--- +id: "HypercertClaimdata" +title: "Interface: HypercertClaimdata" +sidebar_label: "HypercertClaimdata" +sidebar_position: 0 +custom_edit_url: null +--- Properties of an impact claim @@ -8,17 +12,6 @@ Properties of an impact claim ▪ [k: `string`]: `unknown` -## Table of contents - -### Properties - -- [contributors](HypercertClaimdata.md#contributors) -- [impact_scope](HypercertClaimdata.md#impact_scope) -- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) -- [rights](HypercertClaimdata.md#rights) -- [work_scope](HypercertClaimdata.md#work_scope) -- [work_timeframe](HypercertClaimdata.md#work_timeframe) - ## Properties ### contributors @@ -41,7 +34,7 @@ Contributors #### Defined in -[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) +sdk/src/types/claimdata.d.ts:53 --- @@ -66,7 +59,7 @@ Scopes of impact #### Defined in -[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) +sdk/src/types/claimdata.d.ts:15 --- @@ -90,7 +83,7 @@ Impact time period. The value is UNIX time in seconds from epoch. #### Defined in -[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) +sdk/src/types/claimdata.d.ts:44 --- @@ -115,7 +108,7 @@ Rights #### Defined in -[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) +sdk/src/types/claimdata.d.ts:62 --- @@ -140,7 +133,7 @@ Scopes of work #### Defined in -[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) +sdk/src/types/claimdata.d.ts:25 --- @@ -164,4 +157,4 @@ Work time period. The value is UNIX time in seconds from epoch. #### Defined in -[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) +sdk/src/types/claimdata.d.ts:35 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientInterface.md new file mode 100644 index 00000000..9b969ab0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -0,0 +1,427 @@ +--- +id: "HypercertClientInterface" +title: "Interface: HypercertClientInterface" +sidebar_label: "HypercertClientInterface" +sidebar_position: 0 +custom_edit_url: null +--- + +The interface for the Hypercert client. + +## Hierarchy + +- [`HypercertClientMethods`](HypercertClientMethods.md) + +- [`HypercertClientState`](HypercertClientState.md) + + ↳ **`HypercertClientInterface`** + +## Implemented by + +- [`HypercertClient`](../classes/HypercertClient.md) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `bigint`[], `units`: `bigint`[], `proofs`: (\`0x$\{string}\` \| `Uint8Array`)[][]) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Batch mints a claim fraction from an allowlist + +##### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------- | :---------------------------------------------------- | +| `claimIds` | `bigint`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `bigint`[] | Array of the number of units for each fraction. | +| `proofs` | (\`0x$\{string}\` \| `Uint8Array`)[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction hash + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) + +#### Defined in + +sdk/src/types/client.ts:237 + +--- + +### batchTransferFractions + +• **batchTransferFractions**: (`fractionIds`: `bigint`[], `to`: \`0x$\{string}\`, `overrides?`: [`SupportedOverrides`](../modules.md#supportedoverrides)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionIds`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Transfers multiple claim fractions to a new owner. + +##### Parameters + +| Name | Type | +| :------------ | :------------------------------------------------------- | +| `fractionIds` | `bigint`[] | +| `to` | \`0x$\{string}\` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[batchTransferFractions](HypercertClientMethods.md#batchtransferfractions) + +#### Defined in + +sdk/src/types/client.ts:171 + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`fractionId`: `bigint`) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------------------ | +| `fractionId` | `bigint` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) + +#### Defined in + +sdk/src/types/client.ts:212 + +--- + +### contract + +• **contract**: `GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[]\> + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) + +#### Defined in + +sdk/src/types/client.ts:124 + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `bigint`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `bigint` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) + +#### Defined in + +sdk/src/types/client.ts:185 + +--- + +### getTransferRestrictions + +• **getTransferRestrictions**: (`fractionId`: `bigint`) => `Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +Retrieves the TransferRestrictions for a claim. + +##### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------------- | +| `fractionId` | `bigint` | The ID of the claim to retrieve. | + +##### Returns + +`Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +A Promise that resolves to the applicable transfer restrictions. + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[getTransferRestrictions](HypercertClientMethods.md#gettransferrestrictions) + +#### Defined in + +sdk/src/types/client.ts:149 + +--- + +### indexer + +• **indexer**: `HypercertIndexer` + +The indexer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) + +#### Defined in + +sdk/src/types/client.ts:123 + +--- + +### mergeFractionUnits + +• **mergeFractionUnits**: (`fractionIds`: `bigint`[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionIds`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :------------ | :--------- | :--------------------------------------- | +| `fractionIds` | `bigint`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mergeFractionUnits](HypercertClientMethods.md#mergefractionunits) + +#### Defined in + +sdk/src/types/client.ts:205 + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `bigint`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `bigint` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) + +#### Defined in + +sdk/src/types/client.ts:138 + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `bigint`, `units`: `bigint`, `proof`: (\`0x$\{string}\` \| `Uint8Array`)[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :----------------------------------- | :------------------------------------------ | +| `claimId` | `bigint` | The ID of the claim to mint a fraction for. | +| `units` | `bigint` | The number of units for the fraction. | +| `proof` | (\`0x$\{string}\` \| `Uint8Array`)[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) + +#### Defined in + +sdk/src/types/client.ts:221 + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) + +#### Defined in + +sdk/src/types/client.ts:119 + +--- + +### splitFractionUnits + +• **splitFractionUnits**: (`fractionId`: `bigint`, `fractions`: `bigint`[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionId`, `fractions`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :----------- | :--------- | :---------------------------- | +| `fractionId` | `bigint` | The ID of the claim to split. | +| `fractions` | `bigint`[] | - | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[splitFractionUnits](HypercertClientMethods.md#splitfractionunits) + +#### Defined in + +sdk/src/types/client.ts:198 + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) + +#### Defined in + +sdk/src/types/client.ts:121 + +--- + +### transferFraction + +• **transferFraction**: (`fractionId`: `bigint`, `to`: \`0x$\{string}\`, `overrides?`: [`SupportedOverrides`](../modules.md#supportedoverrides)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionId`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Transfers a claim fraction to a new owner. + +##### Parameters + +| Name | Type | +| :----------- | :------------------------------------------------------- | +| `fractionId` | `bigint` | +| `to` | \`0x$\{string}\` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[transferFraction](HypercertClientMethods.md#transferfraction) + +#### Defined in + +sdk/src/types/client.ts:158 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientMethods.md new file mode 100644 index 00000000..c6f4aa3c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -0,0 +1,319 @@ +--- +id: "HypercertClientMethods" +title: "Interface: HypercertClientMethods" +sidebar_label: "HypercertClientMethods" +sidebar_position: 0 +custom_edit_url: null +--- + +The methods for the Hypercert client. + +## Hierarchy + +- **`HypercertClientMethods`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `bigint`[], `units`: `bigint`[], `proofs`: (\`0x$\{string}\` \| `Uint8Array`)[][]) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Batch mints a claim fraction from an allowlist + +##### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------- | :---------------------------------------------------- | +| `claimIds` | `bigint`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `bigint`[] | Array of the number of units for each fraction. | +| `proofs` | (\`0x$\{string}\` \| `Uint8Array`)[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction hash + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +#### Defined in + +sdk/src/types/client.ts:237 + +--- + +### batchTransferFractions + +• **batchTransferFractions**: (`fractionIds`: `bigint`[], `to`: \`0x$\{string}\`, `overrides?`: [`SupportedOverrides`](../modules.md#supportedoverrides)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionIds`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Transfers multiple claim fractions to a new owner. + +##### Parameters + +| Name | Type | +| :------------ | :------------------------------------------------------- | +| `fractionIds` | `bigint`[] | +| `to` | \`0x$\{string}\` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Defined in + +sdk/src/types/client.ts:171 + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`fractionId`: `bigint`) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------------------ | +| `fractionId` | `bigint` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Defined in + +sdk/src/types/client.ts:212 + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `bigint`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `bigint` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Defined in + +sdk/src/types/client.ts:185 + +--- + +### getTransferRestrictions + +• **getTransferRestrictions**: (`fractionId`: `bigint`) => `Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +Retrieves the TransferRestrictions for a claim. + +##### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------------- | +| `fractionId` | `bigint` | The ID of the claim to retrieve. | + +##### Returns + +`Promise`<[`TransferRestrictions`](../modules.md#transferrestrictions-1)\> + +A Promise that resolves to the applicable transfer restrictions. + +#### Defined in + +sdk/src/types/client.ts:149 + +--- + +### mergeFractionUnits + +• **mergeFractionUnits**: (`fractionIds`: `bigint`[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionIds`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :------------ | :--------- | :--------------------------------------- | +| `fractionIds` | `bigint`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Defined in + +sdk/src/types/client.ts:205 + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `bigint`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `bigint` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Defined in + +sdk/src/types/client.ts:138 + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `bigint`, `units`: `bigint`, `proof`: (\`0x$\{string}\` \| `Uint8Array`)[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :----------------------------------- | :------------------------------------------ | +| `claimId` | `bigint` | The ID of the claim to mint a fraction for. | +| `units` | `bigint` | The number of units for the fraction. | +| `proof` | (\`0x$\{string}\` \| `Uint8Array`)[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Defined in + +sdk/src/types/client.ts:221 + +--- + +### splitFractionUnits + +• **splitFractionUnits**: (`fractionId`: `bigint`, `fractions`: `bigint`[]) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionId`, `fractions`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :----------- | :--------- | :---------------------------- | +| `fractionId` | `bigint` | The ID of the claim to split. | +| `fractions` | `bigint`[] | - | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Defined in + +sdk/src/types/client.ts:198 + +--- + +### transferFraction + +• **transferFraction**: (`fractionId`: `bigint`, `to`: \`0x$\{string}\`, `overrides?`: [`SupportedOverrides`](../modules.md#supportedoverrides)) => `Promise`<`undefined` \| \`0x$\{string}\`\> + +#### Type declaration + +▸ (`fractionId`, `to`, `overrides?`): `Promise`<`undefined` \| \`0x$\{string}\`\> + +Transfers a claim fraction to a new owner. + +##### Parameters + +| Name | Type | +| :----------- | :------------------------------------------------------- | +| `fractionId` | `bigint` | +| `to` | \`0x$\{string}\` | +| `overrides?` | [`SupportedOverrides`](../modules.md#supportedoverrides) | + +##### Returns + +`Promise`<`undefined` \| \`0x$\{string}\`\> + +A Promise that resolves to the transaction hash + +#### Defined in + +sdk/src/types/client.ts:158 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientState.md new file mode 100644 index 00000000..69a38d6f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientState.md @@ -0,0 +1,61 @@ +--- +id: "HypercertClientState" +title: "Interface: HypercertClientState" +sidebar_label: "HypercertClientState" +sidebar_position: 0 +custom_edit_url: null +--- + +The state of the Hypercert client. + +## Hierarchy + +- **`HypercertClientState`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Properties + +### contract + +• **contract**: `GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[]\> + +#### Defined in + +sdk/src/types/client.ts:124 + +--- + +### indexer + +• **indexer**: `HypercertIndexer` + +The indexer used by the client. + +#### Defined in + +sdk/src/types/client.ts:123 + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Defined in + +sdk/src/types/client.ts:119 + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Defined in + +sdk/src/types/client.ts:121 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md new file mode 100644 index 00000000..59e77fde --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -0,0 +1,43 @@ +--- +id: "HypercertEvaluationSchema" +title: "Interface: HypercertEvaluationSchema" +sidebar_label: "HypercertEvaluationSchema" +sidebar_position: 0 +custom_edit_url: null +--- + +Schema for evaluating Hypercerts across different sources and evaluation types + +## Indexable + +▪ [k: `string`]: `unknown` + +## Properties + +### creator + +• **creator**: `string` + +#### Defined in + +sdk/src/types/evaluation.d.ts:15 + +--- + +### evaluationData + +• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) + +#### Defined in + +sdk/src/types/evaluation.d.ts:16 + +--- + +### evaluationSource + +• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) + +#### Defined in + +sdk/src/types/evaluation.d.ts:17 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md new file mode 100644 index 00000000..dcda3dd2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -0,0 +1,164 @@ +--- +id: "HypercertIndexerInterface" +title: "Interface: HypercertIndexerInterface" +sidebar_label: "HypercertIndexerInterface" +sidebar_position: 0 +custom_edit_url: null +--- + +## Properties + +### claimById + +• **claimById**: (`id`: `string`) => `Promise`<`undefined` \| `ClaimByIdQuery`\> + +#### Type declaration + +▸ (`id`): `Promise`<`undefined` \| `ClaimByIdQuery`\> + +##### Parameters + +| Name | Type | +| :--- | :------- | +| `id` | `string` | + +##### Returns + +`Promise`<`undefined` \| `ClaimByIdQuery`\> + +#### Defined in + +sdk/src/types/indexer.ts:20 + +--- + +### claimsByOwner + +• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimsByOwnerQuery`\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<`undefined` \| `ClaimsByOwnerQuery`\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<`undefined` \| `ClaimsByOwnerQuery`\> + +#### Defined in + +sdk/src/types/indexer.ts:19 + +--- + +### firstClaims + +• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `RecentClaimsQuery`\> + +#### Type declaration + +▸ (`params?`): `Promise`<`undefined` \| `RecentClaimsQuery`\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<`undefined` \| `RecentClaimsQuery`\> + +#### Defined in + +sdk/src/types/indexer.ts:21 + +--- + +### fractionById + +• **fractionById**: (`fractionId`: `string`) => `Promise`<`undefined` \| `ClaimTokenByIdQuery`\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<`undefined` \| `ClaimTokenByIdQuery`\> + +##### Parameters + +| Name | Type | +| :----------- | :------- | +| `fractionId` | `string` | + +##### Returns + +`Promise`<`undefined` \| `ClaimTokenByIdQuery`\> + +#### Defined in + +sdk/src/types/indexer.ts:24 + +--- + +### fractionsByClaim + +• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> + +#### Type declaration + +▸ (`claimId`, `params?`): `Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `claimId` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> + +#### Defined in + +sdk/src/types/indexer.ts:23 + +--- + +### fractionsByOwner + +• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> + +#### Defined in + +sdk/src/types/indexer.ts:22 + +--- + +### graphClient + +• **graphClient**: `Client` + +#### Defined in + +sdk/src/types/indexer.ts:18 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertMetadata.md new file mode 100644 index 00000000..c0a9cbf8 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertMetadata.md @@ -0,0 +1,113 @@ +--- +id: "HypercertMetadata" +title: "Interface: HypercertMetadata" +sidebar_label: "HypercertMetadata" +sidebar_position: 0 +custom_edit_url: null +--- + +Claim data for hypercert. ERC1155 Metadata compliant + +## Properties + +### allowList + +• `Optional` **allowList**: `string` + +A CID pointer to the merke tree proof json on ipfs + +#### Defined in + +sdk/src/types/metadata.d.ts:39 + +--- + +### description + +• **description**: `string` + +Describes the asset to which this token represents + +#### Defined in + +sdk/src/types/metadata.d.ts:19 + +--- + +### external_url + +• `Optional` **external_url**: `string` + +An url pointing to the external website of the project + +#### Defined in + +sdk/src/types/metadata.d.ts:23 + +--- + +### hypercert + +• `Optional` **hypercert**: `HypercertClaimdata` + +#### Defined in + +sdk/src/types/metadata.d.ts:45 + +--- + +### image + +• **image**: `string` + +A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. + +#### Defined in + +sdk/src/types/metadata.d.ts:27 + +--- + +### name + +• **name**: `string` + +Identifies the asset to which this token represents + +#### Defined in + +sdk/src/types/metadata.d.ts:15 + +--- + +### properties + +• `Optional` **properties**: \{ `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] + +#### Defined in + +sdk/src/types/metadata.d.ts:40 + +--- + +### ref + +• `Optional` **ref**: `string` + +Describes the asset to which this token represents + +#### Defined in + +sdk/src/types/metadata.d.ts:35 + +--- + +### version + +• `Optional` **version**: `string` + +The version of Hypercert schema used to describe this hypercert + +#### Defined in + +sdk/src/types/metadata.d.ts:31 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertPointer.md new file mode 100644 index 00000000..f97b5d26 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertPointer.md @@ -0,0 +1,41 @@ +--- +id: "HypercertPointer" +title: "Interface: HypercertPointer" +sidebar_label: "HypercertPointer" +sidebar_position: 0 +custom_edit_url: null +--- + +## Indexable + +▪ [k: `string`]: `unknown` + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +sdk/src/types/evaluation.d.ts:28 + +--- + +### claimId + +• **claimId**: `string` + +#### Defined in + +sdk/src/types/evaluation.d.ts:30 + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +sdk/src/types/evaluation.d.ts:29 diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertStorageInterface.md similarity index 74% rename from docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md rename to docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertStorageInterface.md index 8ffda51e..ba0a2551 100644 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -1,6 +1,10 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface - -# Interface: HypercertStorageInterface +--- +id: "HypercertStorageInterface" +title: "Interface: HypercertStorageInterface" +sidebar_label: "HypercertStorageInterface" +sidebar_position: 0 +custom_edit_url: null +--- The interface for the Hypercert storage layer. @@ -8,15 +12,6 @@ The interface for the Hypercert storage layer. - [`HypercertsStorage`](../classes/HypercertsStorage.md) -## Table of contents - -### Properties - -- [getData](HypercertStorageInterface.md#getdata) -- [getMetadata](HypercertStorageInterface.md#getmetadata) -- [storeData](HypercertStorageInterface.md#storedata) -- [storeMetadata](HypercertStorageInterface.md#storemetadata) - ## Properties ### getData @@ -43,7 +38,7 @@ A Promise that resolves to the retrieved data. #### Defined in -[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) +sdk/src/types/client.ts:98 --- @@ -71,7 +66,7 @@ A Promise that resolves to the retrieved metadata. #### Defined in -[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) +sdk/src/types/client.ts:84 --- @@ -99,7 +94,7 @@ A Promise that resolves to the CID of the stored data. #### Defined in -[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) +sdk/src/types/client.ts:91 --- @@ -127,4 +122,4 @@ A Promise that resolves to the CID of the stored metadata. #### Defined in -[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) +sdk/src/types/client.ts:77 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/IPFSEvaluation.md new file mode 100644 index 00000000..15835a1e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -0,0 +1,31 @@ +--- +id: "IPFSEvaluation" +title: "Interface: IPFSEvaluation" +sidebar_label: "IPFSEvaluation" +sidebar_position: 0 +custom_edit_url: null +--- + +## Indexable + +▪ [k: `string`]: `unknown` + +## Properties + +### cid + +• **cid**: `string` + +#### Defined in + +sdk/src/types/evaluation.d.ts:48 + +--- + +### type + +• **type**: `"IPFS"` + +#### Defined in + +sdk/src/types/evaluation.d.ts:47 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md new file mode 100644 index 00000000..0ad3d38f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -0,0 +1,41 @@ +--- +id: "SimpleTextEvaluation" +title: "Interface: SimpleTextEvaluation" +sidebar_label: "SimpleTextEvaluation" +sidebar_position: 0 +custom_edit_url: null +--- + +## Indexable + +▪ [k: `string`]: `unknown` + +## Properties + +### hypercert + +• **hypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +sdk/src/types/evaluation.d.ts:35 + +--- + +### text + +• **text**: `string` + +#### Defined in + +sdk/src/types/evaluation.d.ts:36 + +--- + +### type + +• **type**: `"simpleText"` + +#### Defined in + +sdk/src/types/evaluation.d.ts:34 diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/_category_.yml b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/_category_.yml new file mode 100644 index 00000000..43bec88c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/_category_.yml @@ -0,0 +1,2 @@ +label: "Interfaces" +position: 4 \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/modules.md new file mode 100644 index 00000000..0d5aa920 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/modules.md @@ -0,0 +1,818 @@ +--- +id: "modules" +title: "@hypercerts-org/sdk" +sidebar_label: "Exports" +sidebar_position: 0.5 +custom_edit_url: null +--- + +## Classes + +- [ClientError](classes/ClientError.md) +- [ConfigurationError](classes/ConfigurationError.md) +- [ContractError](classes/ContractError.md) +- [FetchError](classes/FetchError.md) +- [HypercertClient](classes/HypercertClient.md) +- [HypercertsStorage](classes/HypercertsStorage.md) +- [InvalidOrMissingError](classes/InvalidOrMissingError.md) +- [MalformedDataError](classes/MalformedDataError.md) +- [MintingError](classes/MintingError.md) +- [StorageError](classes/StorageError.md) +- [UnknownSchemaError](classes/UnknownSchemaError.md) +- [UnsupportedChainError](classes/UnsupportedChainError.md) + +## Interfaces + +- [CustomError](interfaces/CustomError.md) +- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) +- [EASEvaluation](interfaces/EASEvaluation.md) +- [HypercertClaimdata](interfaces/HypercertClaimdata.md) +- [HypercertClientInterface](interfaces/HypercertClientInterface.md) +- [HypercertClientMethods](interfaces/HypercertClientMethods.md) +- [HypercertClientState](interfaces/HypercertClientState.md) +- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) +- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) +- [HypercertMetadata](interfaces/HypercertMetadata.md) +- [HypercertPointer](interfaces/HypercertPointer.md) +- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) +- [IPFSEvaluation](interfaces/IPFSEvaluation.md) +- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) + +## Type Aliases + +### AllowlistEntry + +Ƭ **AllowlistEntry**: `Object` + +Represents an entry in an allowlist. + +#### Type declaration + +| Name | Type | +| :-------- | :------- | +| `address` | `string` | +| `units` | `bigint` | + +#### Defined in + +sdk/src/types/hypercerts.ts:24 + +--- + +### Deployment + +Ƭ **Deployment**: `Object` + +Represents a deployment of a contract on a specific network. + +#### Type declaration + +| Name | Type | Description | +| :---------------- | :------------------ | :--------------------------------------------------------------------------------------- | +| `chain` | `Partial`<`Chain`\> | - | +| `contractAddress` | `string` | The address of the deployed contract. | +| `graphName` | `string` | - | +| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | + +#### Defined in + +sdk/src/types/client.ts:23 + +--- + +### EvaluationData + +Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) + +This file was automatically generated by json-schema-to-typescript. +DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +and run json-schema-to-typescript to regenerate this file. + +#### Defined in + +sdk/src/types/evaluation.d.ts:8 + +--- + +### EvaluationSource + +Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) + +#### Defined in + +sdk/src/types/evaluation.d.ts:9 + +--- + +### HypercertClientConfig + +Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & \{ `publicClient`: `PublicClient` ; `readOnly`: `boolean` ; `readOnlyReason?`: `string` ; `unsafeForceOverrideConfig?`: `boolean` ; `walletClient`: `WalletClient` } + +Configuration options for the Hypercert client. + +#### Defined in + +sdk/src/types/client.ts:35 + +--- + +### HypercertClientProps + +Ƭ **HypercertClientProps**: `Object` + +The props for the Hypercert client. + +#### Type declaration + +| Name | Type | Description | +| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | +| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | + +#### Defined in + +sdk/src/types/client.ts:104 + +--- + +### HypercertEvaluatorConfig + +Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & \{ `easContractAddress`: `string` } + +Configuration options for the Hypercert evaluator. + +**`Note`** + +The signer is required for submitting evaluations. + +#### Defined in + +sdk/src/types/client.ts:64 + +--- + +### HypercertStorageConfig + +Ƭ **HypercertStorageConfig**: `Object` + +Configuration options for the Hypercert storage layer. + +**`Note`** + +The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. + +#### Type declaration + +| Name | Type | Description | +| :------------------ | :------- | :------------------------------ | +| `nftStorageToken?` | `string` | The API token for NFT.storage. | +| `web3StorageToken?` | `string` | The API token for Web3.storage. | + +#### Defined in + +sdk/src/types/client.ts:53 + +--- + +### HypercertsSdkError + +Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) + +#### Defined in + +sdk/src/types/errors.ts:195 + +--- + +### QueryParams + +Ƭ **QueryParams**: `Object` + +#### Index signature + +▪ [key: `string`]: `string` \| `number` \| `undefined` + +#### Type declaration + +| Name | Type | +| :---------------- | :------------------ | +| `first` | `number` | +| `orderDirections` | `"asc"` \| `"desc"` | +| `skip` | `number` | + +#### Defined in + +sdk/src/types/indexer.ts:10 + +--- + +### SupportedChainIds + +Ƭ **SupportedChainIds**: `5` \| `10` \| `42220` \| `11155111` + +#### Defined in + +sdk/src/types/client.ts:13 + +--- + +### SupportedOverrides + +Ƭ **SupportedOverrides**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :------- | +| `gasLimit?` | `bigint` | +| `gasPrice?` | `bigint` | +| `value?` | `bigint` | + +#### Defined in + +sdk/src/types/client.ts:14 + +--- + +### TransferRestrictions + +Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] + +#### Defined in + +sdk/src/types/hypercerts.ts:9 + +sdk/src/types/hypercerts.ts:15 + +## Variables + +### HypercertExchangeAbi + +• **HypercertExchangeAbi**: (\{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "\_owner"; `type`: `string` = "address" }[] ; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = "length"; `type`: `string` = "uint256" }[] ; `name`: `string` = "MerkleProofTooLarge"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: (\{ `components`: \{ `internalType`: `string` = "bytes32"; `name`: `string` = "orderHash"; `type`: `string` = "bytes32" }[] ; `indexed`: `boolean` = false; `internalType`: `string` = "struct ILooksRareProtocol.NonceInvalidationParameters"; `name`: `string` = "nonceInvalidationParameters"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "askUser"; `type`: `string` = "address" })[] ; `name`: `string` = "TakerAsk"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: (\{ `components?`: `undefined` ; `internalType`: `string` = "bytes[]"; `name`: `string` = "makerSignatures"; `type`: `string` = "bytes[]" } \| \{ `components`: (\{ `components?`: `undefined` ; `internalType`: `string` = "bytes32"; `name`: `string` = "root"; `type`: `string` = "bytes32" } \| \{ `components`: \{ `internalType`: `string` = "bytes32"; `name`: `string` = "value"; `type`: `string` = "bytes32" }[] ; `internalType`: `string` = "struct OrderStructs.MerkleTreeNode[]"; `name`: `string` = "proof"; `type`: `string` = "tuple[]" })[] ; `internalType`: `string` = "struct OrderStructs.MerkleTree[]"; `name`: `string` = "merkleTrees"; `type`: `string` = "tuple[]" })[] ; `name`: `string` = "executeMultipleTakerBids"; `outputs`: `never`[] = []; `stateMutability`: `string` = "payable"; `type`: `string` = "function" } \| \{ `anonymous?`: `undefined` = false; `inputs`: (\{ `components`: \{ `internalType`: `string` = "address"; `name`: `string` = "recipient"; `type`: `string` = "address" }[] ; `internalType`: `string` = "struct OrderStructs.Taker"; `name`: `string` = "takerBid"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `internalType`: `string` = "address"; `name`: `string` = "sender"; `type`: `string` = "address" })[] ; `name`: `string` = "restrictedExecuteTakerBid"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = "protocolFeeAmount"; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.0.0-alpha.6_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:1524 + +--- + +### HypercertMinterAbi + +• **HypercertMinterAbi**: (\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.0.0-alpha.6_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:352 + +--- + +### TransferRestrictions + +• `Const` **TransferRestrictions**: `Object` + +Represents the possible transfer restrictions of a claim matching the hypercerts protocol. + +#### Type declaration + +| Name | Type | +| :---------------- | :--- | +| `AllowAll` | `0` | +| `DisallowAll` | `1` | +| `FromCreatorOnly` | `2` | + +#### Defined in + +sdk/src/types/hypercerts.ts:9 + +sdk/src/types/hypercerts.ts:15 + +--- + +### deployments + +• `Const` **deployments**: \{ [key in SupportedChainIds]: Partial } + +#### Defined in + +sdk/src/constants.ts:10 + +--- + +### logger + +• `Const` **logger**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :-------------------------------------------------------------------------- | +| `debug` | (`message`: `string`, `label?`: `string`, ...`data`: `unknown`[]) => `void` | +| `error` | (`error`: `Error`, `label?`: `string`) => `void` | +| `info` | (`message`: `string`, `label?`: `string`, ...`data`: `unknown`[]) => `void` | +| `warn` | (`message`: `string`, `label?`: `string`, ...`data`: `unknown`[]) => `void` | + +#### Defined in + +sdk/src/utils/logger.ts:24 + +## Functions + +### formatHypercertData + +▸ **formatHypercertData**(`«destructured»`): `FormatResult` + +Formats input data to an object containing HypercertMetadata including appropriate labels + +#### Parameters + +| Name | Type | +| :----------------------- | :------------------------------------------------ | +| `«destructured»` | `Object` | +| › `contributors` | `string`[] | +| › `description` | `string` | +| › `excludedImpactScope` | `string`[] | +| › `excludedRights` | `string`[] | +| › `excludedWorkScope` | `string`[] | +| › `external_url?` | `string` | +| › `image` | `string` | +| › `impactScope` | `string`[] | +| › `impactTimeframeEnd` | `number` | +| › `impactTimeframeStart` | `number` | +| › `name` | `string` | +| › `properties?` | \{ `trait_type`: `string` ; `value`: `string` }[] | +| › `rights` | `string`[] | +| › `version` | `string` | +| › `workScope` | `string`[] | +| › `workTimeframeEnd` | `number` | +| › `workTimeframeStart` | `number` | + +#### Returns + +`FormatResult` + +#### Defined in + +sdk/src/utils/formatter.ts:27 + +--- + +### getFromIPFS + +▸ **getFromIPFS**(`cidOrIpfsUri`, `timeout?`): `Promise`<`unknown`\> + +Fetches data from IPFS using either the NFT Storage gateway or the Web3 Storage gateway. + +This function attempts to fetch data from the NFT Storage gateway first. If the request times out, it then tries to fetch the data from the Web3 Storage gateway. +If the data cannot be fetched from either gateway, it throws a `StorageError`. + +#### Parameters + +| Name | Type | Default value | Description | +| :------------- | :------- | :------------ | :---------------------------------------------------------------------- | +| `cidOrIpfsUri` | `string` | `undefined` | The CID or IPFS URI of the data to fetch. | +| `timeout?` | `number` | `10000` | The timeout for the fetch request in milliseconds. Defaults to 10000ms. | + +#### Returns + +`Promise`<`unknown`\> + +The data fetched from IPFS. + +**`Throws`** + +Will throw a `StoragjeError` if the data cannot be fetched from either gateway. + +**`Async`** + +#### Defined in + +sdk/src/utils/fetchers.ts:17 + +--- + +### getProofsFromAllowlist + +▸ **getProofsFromAllowlist**(`cidOrIpfsUri`, `account`): `Promise`<`undefined` \| \{ `proof`: `string`[] ; `root`: `string` = tree.root }\> + +This function retrieves proofs from an allowlist. + +It fetches a Merkle tree from IPFS using a given CID or IPFS URI, then iterates over the tree to find an account. +When the account is found, it generates a proof for that account and logs the account, index, and proof as debug. +It returns the proof and the root of the Merkle tree. + +#### Parameters + +| Name | Type | Description | +| :------------- | :--------------- | :------------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI to fetch the Merkle tree from. | +| `account` | \`0x$\{string}\` | The account to find in the Merkle tree. | + +#### Returns + +`Promise`<`undefined` \| \{ `proof`: `string`[] ; `root`: `string` = tree.root }\> + +An object containing the proof for the account and the root of the Merkle tree. + +**`Throws`** + +Will throw an error if the Merkle tree cannot be fetched. + +**`Async`** + +#### Defined in + +sdk/src/utils/allowlist.ts:35 + +--- + +### handleContractError + +▸ **handleContractError**(`data`): [`ContractError`](classes/ContractError.md) + +#### Parameters + +| Name | Type | +| :----- | :--------------- | +| `data` | \`0x$\{string}\` | + +#### Returns + +[`ContractError`](classes/ContractError.md) + +#### Defined in + +sdk/src/utils/errors.ts:39 + +--- + +### handleSdkError + +▸ **handleSdkError**(`err`): `void` + +Method to catch errors and log them + +#### Parameters + +| Name | Type | Description | +| :---- | :---------------------------------------------------- | :-------------------------------------------- | +| `err` | [`HypercertsSdkError`](modules.md#hypercertssdkerror) | Error to handle defined in HypercertsSdkError | + +#### Returns + +`void` + +#### Defined in + +sdk/src/utils/errors.ts:22 + +--- + +### publicClientToProvider + +▸ **publicClientToProvider**(`publicClient`): `undefined` \| `FallbackProvider` \| `JsonRpcProvider` + +This function converts a `PublicClient` instance to an ethers.js `Provider` to faciliate compatibility between ethers and viem. + +It extracts the chain and transport from the `PublicClient` and creates a network object. +If no chain is found in the `PublicClient`, it logs a warning and stops the signature request. +If the transport type is "fallback", it creates a `FallbackProvider` with multiple transports. +Otherwise, it creates a `JsonRpcProvider` with a single transport. + +Ref: https://viem.sh/docs/ethers-migration.html + +#### Parameters + +| Name | Type | Description | +| :-------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `publicClient` | `Object` | The `PublicClient` instance to convert. | +| `publicClient.account` | `undefined` | The Account of the Client. | +| `publicClient.batch?` | `Object` | Flags for batch settings. | +| `publicClient.batch.multicall?` | `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } | Toggle to enable `eth_call` multicall aggregation. | +| `publicClient.cacheTime` | `number` | Time (in ms) that cached data will remain in memory. | +| `publicClient.call` | (`parameters`: `CallParameters`<`undefined` \| `Chain`\>) => `Promise`<`CallReturnType`\> | Executes a new message call immediately without submitting a transaction to the network. - Docs: https://viem.sh/docs/actions/public/call.html - JSON-RPC Methods: [`eth_call`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const data = await client.call({ account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', }) ` | +| `publicClient.chain` | `undefined` \| `Chain` | Chain for the client. | +| `publicClient.createBlockFilter` | () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"block"` }\> | Creates a Filter to listen for new block hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createBlockFilter.html - JSON-RPC Methods: [`eth_newBlockFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newBlockFilter) **`Example`** `ts import { createPublicClient, createBlockFilter, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await createBlockFilter(client) // { id: "0x345a6572337856574a76364e457a4366", type: 'block' } ` | +| `publicClient.createContractEventFilter` | (`args`: `CreateContractEventFilterParameters`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`CreateContractEventFilterReturnType`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Creates a Filter to retrieve event logs that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html) or [`getFilterLogs`](https://viem.sh/docs/actions/public/getFilterLogs.html). - Docs: https://viem.sh/docs/contract/createContractEventFilter.html **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createContractEventFilter({ abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']), }) ` | +| `publicClient.createEventFilter` | (`args?`: `CreateEventFilterParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`, `_EventName`, `_Args`\>) => `Promise`<\{ [K in keyof Filter<"event", TAbiEvents, \_EventName, \_Args, TStrict, TFromBlock, TToBlock\>]: Filter<"event", TAbiEvents, ... 4 more ..., TToBlock\>[K]; }\> | Creates a [`Filter`](https://viem.sh/docs/glossary/types.html#filter) to listen for new events that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createEventFilter.html - JSON-RPC Methods: [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2', }) ` | +| `publicClient.createPendingTransactionFilter` | () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"transaction"` }\> | Creates a Filter to listen for new pending transaction hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createPendingTransactionFilter.html - JSON-RPC Methods: [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createPendingTransactionFilter() // { id: "0x345a6572337856574a76364e457a4366", type: 'transaction' } ` | +| `publicClient.estimateContractGas` | (`args`: `EstimateContractGasParameters`<`TAbi`, `TFunctionName`, `TChain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> | Estimates the gas required to successfully execute a contract write function call. - Docs: https://viem.sh/docs/contract/estimateContractGas.html **`Remarks`** Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`estimateGas` action](https://viem.sh/docs/actions/public/estimateGas.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gas = await client.estimateContractGas({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint() public']), functionName: 'mint', account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', }) ` | +| `publicClient.estimateFeesPerGas` | (`args?`: `EstimateFeesPerGasParameters`<`undefined` \| `Chain`, `TChainOverride`, `TType`\>) => `Promise`<`EstimateFeesPerGasReturnType`\> | Returns an estimate for the fees per gas for a transaction to be included in the next block. - Docs: https://viem.sh/docs/actions/public/estimateFeesPerGas.html **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const maxPriorityFeePerGas = await client.estimateFeesPerGas() // { maxFeePerGas: ..., maxPriorityFeePerGas: ... } ` | +| `publicClient.estimateGas` | (`args`: `EstimateGasParameters`<`undefined` \| `Chain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> | Estimates the gas necessary to complete a transaction without submitting it to the network. - Docs: https://viem.sh/docs/actions/public/estimateGas.html - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas) **`Example`** `ts import { createPublicClient, http, parseEther } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gasEstimate = await client.estimateGas({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: parseEther('1'), }) ` | +| `publicClient.estimateMaxPriorityFeePerGas` | (`args?`: \{ `chain`: `null` \| `TChainOverride` }) => `Promise`<`bigint`\> | Returns an estimate for the max priority fee per gas (in wei) for a transaction to be included in the next block. - Docs: https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas.html **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const maxPriorityFeePerGas = await client.estimateMaxPriorityFeePerGas() // 10000000n ` | +| `publicClient.extend` | (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, `PublicActions`<`Transport`, `undefined` \| `Chain`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, \{ [K in keyof client]: client[K]; } & `PublicActions`<`Transport`, `undefined` \| `Chain`\>\> | - | +| `publicClient.getBalance` | (`args`: `GetBalanceParameters`) => `Promise`<`bigint`\> | Returns the balance of an address in wei. - Docs: https://viem.sh/docs/actions/public/getBalance.html - JSON-RPC Methods: [`eth_getBalance`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance) **`Remarks`** You can convert the balance to ether units with [`formatEther`](https://viem.sh/docs/utilities/formatEther.html). `ts const balance = await getBalance(client, { address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', blockTag: 'safe' }) const balanceAsEther = formatEther(balance) // "6.942" ` **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const balance = await client.getBalance({ address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) // 10000000000000000000000n (wei) ` | +| `publicClient.getBlock` | (`args?`: `GetBlockParameters`<`TIncludeTransactions`, `TBlockTag`\>) => `Promise`<`GetBlockReturnType`<`undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>\> | Returns information about a block at a block number, hash, or tag. - Docs: https://viem.sh/docs/actions/public/getBlock.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/fetching-blocks - JSON-RPC Methods: - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) for `blockNumber` & `blockTag`. - Calls [`eth_getBlockByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbyhash) for `blockHash`. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const block = await client.getBlock() ` | +| `publicClient.getBlockNumber` | (`args?`: `GetBlockNumberParameters`) => `Promise`<`bigint`\> | Returns the number of the most recent block seen. - Docs: https://viem.sh/docs/actions/public/getBlockNumber.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/fetching-blocks - JSON-RPC Methods: [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const blockNumber = await client.getBlockNumber() // 69420n ` | +| `publicClient.getBlockTransactionCount` | (`args?`: `GetBlockTransactionCountParameters`) => `Promise`<`number`\> | Returns the number of Transactions at a block number, hash, or tag. - Docs: https://viem.sh/docs/actions/public/getBlockTransactionCount.html - JSON-RPC Methods: - Calls [`eth_getBlockTransactionCountByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbynumber) for `blockNumber` & `blockTag`. - Calls [`eth_getBlockTransactionCountByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbyhash) for `blockHash`. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const count = await client.getBlockTransactionCount() ` | +| `publicClient.getBytecode` | (`args`: `GetBytecodeParameters`) => `Promise`<`GetBytecodeReturnType`\> | Retrieves the bytecode at an address. - Docs: https://viem.sh/docs/contract/getBytecode.html - JSON-RPC Methods: [`eth_getCode`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getcode) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const code = await client.getBytecode({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', }) ` | +| `publicClient.getChainId` | () => `Promise`<`number`\> | Returns the chain ID associated with the current network. - Docs: https://viem.sh/docs/actions/public/getChainId.html - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const chainId = await client.getChainId() // 1 ` | +| `publicClient.getContractEvents` | (`args`: `GetContractEventsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetContractEventsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs emitted by a contract. - Docs: https://viem.sh/docs/actions/public/getContractEvents.html - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { wagmiAbi } from './abi' const client = createPublicClient({ chain: mainnet, transport: http(), }) const logs = await client.getContractEvents(client, { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: wagmiAbi, eventName: 'Transfer' }) ` | +| `publicClient.getEnsAddress` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; coinType?: number \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsAddressReturnType`\> | Gets address for ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsAddress.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensAddress = await client.getEnsAddress({ name: normalize('wagmi-dev.eth'), }) // '0xd2135CfB216b74109775236E36d4b433F1DF507B' ` | +| `publicClient.getEnsAvatar` | (`args`: \{ name: string; blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; universalResolverAddress?: \`0x$\{string}\` \| undefined; gatewayUrls?: AssetGatewayUrls \| undefined; }) => `Promise`<`GetEnsAvatarReturnType`\> | Gets the avatar of an ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsAvatar.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText.html) with `key` set to `'avatar'`. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensAvatar = await client.getEnsAvatar({ name: normalize('wagmi-dev.eth'), }) // 'https://ipfs.io/ipfs/Qma8mnp6xV3J2cRNf3mTth5C8nV11CAnceVinc3y8jSbio' ` | +| `publicClient.getEnsName` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; address: \`0x$\{string}\`; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsNameReturnType`\> | Gets primary name for specified address. - Docs: https://viem.sh/docs/ens/actions/getEnsName.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `reverse(bytes)` on ENS Universal Resolver Contract to "reverse resolve" the address to the primary ENS name. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensName = await client.getEnsName({ address: '0xd2135CfB216b74109775236E36d4b433F1DF507B', }) // 'wagmi-dev.eth' ` | +| `publicClient.getEnsResolver` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<\`0x$\{string}\`\> | Gets resolver for ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsResolver.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `findResolver(bytes)` on ENS Universal Resolver Contract to retrieve the resolver of an ENS name. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const resolverAddress = await client.getEnsResolver({ name: normalize('wagmi-dev.eth'), }) // '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41' ` | +| `publicClient.getEnsText` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; key: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsTextReturnType`\> | Gets a text record for specified ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsResolver.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/ens **`Remarks`** Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const twitterRecord = await client.getEnsText({ name: normalize('wagmi-dev.eth'), key: 'com.twitter', }) // 'wagmi_sh' ` | +| `publicClient.getFeeHistory` | (`args`: `GetFeeHistoryParameters`) => `Promise`<`GetFeeHistoryReturnType`\> | Returns a collection of historical gas information. - Docs: https://viem.sh/docs/actions/public/getFeeHistory.html - JSON-RPC Methods: [`eth_feeHistory`](https://docs.alchemy.com/reference/eth-feehistory) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const feeHistory = await client.getFeeHistory({ blockCount: 4, rewardPercentiles: [25, 75], }) ` | +| `publicClient.getFilterChanges` | (`args`: `GetFilterChangesParameters`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterChangesReturnType`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of logs or hashes based on a [Filter](/docs/glossary/terms#filter) since the last time it was called. - Docs: https://viem.sh/docs/actions/public/getFilterChanges.html - JSON-RPC Methods: [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges) **`Remarks`** A Filter can be created from the following actions: - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter.html) - [`createContractEventFilter`](https://viem.sh/docs/contract/createContractEventFilter.html) - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter.html) - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter.html) Depending on the type of filter, the return value will be different: - If the filter was created with `createContractEventFilter` or `createEventFilter`, it returns a list of logs. - If the filter was created with `createPendingTransactionFilter`, it returns a list of transaction hashes. - If the filter was created with `createBlockFilter`, it returns a list of block hashes. **`Example`** `ts // Blocks import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createBlockFilter() const hashes = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Contract Events import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createContractEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']), eventName: 'Transfer', }) const logs = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Raw Events import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'), }) const logs = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Transactions import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createPendingTransactionFilter() const hashes = await client.getFilterChanges({ filter }) ` | +| `publicClient.getFilterLogs` | (`args`: `GetFilterLogsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterLogsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs since the filter was created. - Docs: https://viem.sh/docs/actions/public/getFilterLogs.html - JSON-RPC Methods: [`eth_getFilterLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterlogs) **`Remarks`** `getFilterLogs` is only compatible with **event filters**. **`Example`** `ts import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'), }) const logs = await client.getFilterLogs({ filter }) ` | +| `publicClient.getGasPrice` | () => `Promise`<`bigint`\> | Returns the current price of gas (in wei). - Docs: https://viem.sh/docs/actions/public/getGasPrice.html - JSON-RPC Methods: [`eth_gasPrice`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gasprice) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gasPrice = await client.getGasPrice() ` | +| `publicClient.getLogs` | (`args?`: `GetLogsParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetLogsReturnType`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs matching the provided parameters. - Docs: https://viem.sh/docs/actions/public/getLogs.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/filters-and-logs/event-logs - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) **`Example`** `ts import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const logs = await client.getLogs() ` | +| `publicClient.getProof` | (`args`: `GetProofParameters`) => `Promise`<`GetProofReturnType`\> | Returns the account and storage values of the specified account including the Merkle-proof. - Docs: https://viem.sh/docs/actions/public/getProof.html - JSON-RPC Methods: - Calls [`eth_getProof`](https://eips.ethereum.org/EIPS/eip-1186) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const block = await client.getProof({ address: '0x...', storageKeys: ['0x...'], }) ` | +| `publicClient.getStorageAt` | (`args`: `GetStorageAtParameters`) => `Promise`<`GetStorageAtReturnType`\> | Returns the value from a storage slot at a given address. - Docs: https://viem.sh/docs/contract/getStorageAt.html - JSON-RPC Methods: [`eth_getStorageAt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { getStorageAt } from 'viem/contract' const client = createPublicClient({ chain: mainnet, transport: http(), }) const code = await client.getStorageAt({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', slot: toHex(0), }) ` | +| `publicClient.getTransaction` | (`args`: `GetTransactionParameters`<`TBlockTag`\>) => `Promise`<`GetTransactionReturnType`<`undefined` \| `Chain`, `TBlockTag`\>\> | Returns information about a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) given a hash or block identifier. - Docs: https://viem.sh/docs/actions/public/getTransaction.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionByHash) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transaction = await client.getTransaction({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `publicClient.getTransactionConfirmations` | (`args`: `GetTransactionConfirmationsParameters`<`undefined` \| `Chain`\>) => `Promise`<`bigint`\> | Returns the number of blocks passed (confirmations) since the transaction was processed on a block. - Docs: https://viem.sh/docs/actions/public/getTransactionConfirmations.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionConfirmations`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionConfirmations) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const confirmations = await client.getTransactionConfirmations({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `publicClient.getTransactionCount` | (`args`: `GetTransactionCountParameters`) => `Promise`<`number`\> | Returns the number of [Transactions](https://viem.sh/docs/glossary/terms.html#transaction) an Account has broadcast / sent. - Docs: https://viem.sh/docs/actions/public/getTransactionCount.html - JSON-RPC Methods: [`eth_getTransactionCount`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactioncount) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionCount = await client.getTransactionCount({ address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) ` | +| `publicClient.getTransactionReceipt` | (`args`: `GetTransactionReceiptParameters`) => `Promise`<`TransactionReceipt`\> | Returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) hash. - Docs: https://viem.sh/docs/actions/public/getTransactionReceipt.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionReceipt = await client.getTransactionReceipt({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `publicClient.key` | `string` | A key for the client. | +| `publicClient.multicall` | (`args`: `MulticallParameters`<`TContracts`, `TAllowFailure`\>) => `Promise`<`MulticallReturnType`<`TContracts`, `TAllowFailure`\>\> | Similar to [`readContract`](https://viem.sh/docs/contract/readContract.html), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall). - Docs: https://viem.sh/docs/contract/multicall.html **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const abi = parseAbi([ 'function balanceOf(address) view returns (uint256)', 'function totalSupply() view returns (uint256)', ]) const result = await client.multicall({ contracts: [ { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi, functionName: 'balanceOf', args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'], }, { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi, functionName: 'totalSupply', }, ], }) // [{ result: 424122n, status: 'success' }, { result: 1000000n, status: 'success' }] ` | +| `publicClient.name` | `string` | A name for the client. | +| `publicClient.pollingInterval` | `number` | Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. | +| `publicClient.prepareTransactionRequest` | (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> | Prepares a transaction request for signing. - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest.html **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` | +| `publicClient.readContract` | (`args`: `ReadContractParameters`<`TAbi`, `TFunctionName`\>) => `Promise`<`ReadContractReturnType`<`TAbi`, `TFunctionName`\>\> | Calls a read-only function on a contract, and returns the response. - Docs: https://viem.sh/docs/contract/readContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/reading-contracts **`Remarks`** A "read-only" function (constant function) on a Solidity contract is denoted by a `view` or `pure` keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas. Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' import { readContract } from 'viem/contract' const client = createPublicClient({ chain: mainnet, transport: http(), }) const result = await client.readContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function balanceOf(address) view returns (uint256)']), functionName: 'balanceOf', args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'], }) // 424122n ` | +| `publicClient.request` | `EIP1193RequestFn`<`PublicRpcSchema`\> | Request function wrapped with friendly error handling | +| `publicClient.sendRawTransaction` | (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> | Sends a **signed** transaction to the network - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction.html - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' import { sendRawTransaction } from 'viem/wallet' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendRawTransaction({ serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33' }) ` | +| `publicClient.simulateContract` | (`args`: `SimulateContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>) => `Promise`<`SimulateContractReturnType`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>\> | Simulates/validates a contract interaction. This is useful for retrieving **return data** and **revert reasons** of contract write functions. - Docs: https://viem.sh/docs/contract/simulateContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/writing-to-contracts **`Remarks`** This function does not require gas to execute and _**does not**_ change the state of the blockchain. It is almost identical to [`readContract`](https://viem.sh/docs/contract/readContract.html), but also supports contract write functions. Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const result = await client.simulateContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32) view returns (uint32)']), functionName: 'mint', args: ['69420'], account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) ` | +| `publicClient.transport` | `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> | The RPC transport | +| `publicClient.type` | `string` | The type of client. | +| `publicClient.uid` | `string` | A unique ID for the client. | +| `publicClient.uninstallFilter` | (`args`: `UninstallFilterParameters`) => `Promise`<`boolean`\> | Destroys a Filter that was created from one of the following Actions: - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter.html) - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter.html) - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter.html) - Docs: https://viem.sh/docs/actions/public/uninstallFilter.html - JSON-RPC Methods: [`eth_uninstallFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_uninstallFilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { createPendingTransactionFilter, uninstallFilter } from 'viem/public' const filter = await client.createPendingTransactionFilter() const uninstalled = await client.uninstallFilter({ filter }) // true ` | +| `publicClient.verifyMessage` | (`args`: `VerifyMessageParameters`) => `Promise`<`boolean`\> | - | +| `publicClient.verifyTypedData` | (`args`: `VerifyTypedDataParameters`) => `Promise`<`boolean`\> | - | +| `publicClient.waitForTransactionReceipt` | (`args`: `WaitForTransactionReceiptParameters`<`undefined` \| `Chain`\>) => `Promise`<`TransactionReceipt`\> | Waits for the [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) to be included on a [Block](https://viem.sh/docs/glossary/terms.html#block) (one confirmation), and then returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt). If the Transaction reverts, then the action will throw an error. - Docs: https://viem.sh/docs/actions/public/waitForTransactionReceipt.html - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/sending-transactions - JSON-RPC Methods: - Polls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) on each block until it has been processed. - If a Transaction has been replaced: - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) and extracts the transactions - Checks if one of the Transactions is a replacement - If so, calls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt). **`Remarks`** The `waitForTransactionReceipt` action additionally supports Replacement detection (e.g. sped up Transactions). Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel). Transactions are replaced when they are sent from the same nonce. There are 3 types of Transaction Replacement reasons: - `repriced`: The gas price has been modified (e.g. different `maxFeePerGas`) - `cancelled`: The Transaction has been cancelled (e.g. `value === 0n`) - `replaced`: The Transaction has been replaced (e.g. different `value` or `data`) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionReceipt = await client.waitForTransactionReceipt({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `publicClient.watchBlockNumber` | (`args`: `WatchBlockNumberParameters`) => `WatchBlockNumberReturnType` | Watches and returns incoming block numbers. - Docs: https://viem.sh/docs/actions/public/watchBlockNumber.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/watching-blocks - JSON-RPC Methods: - When `poll: true`, calls [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchBlockNumber({ onBlockNumber: (blockNumber) => console.log(blockNumber), }) ` | +| `publicClient.watchBlocks` | (`args`: `WatchBlocksParameters`<`Transport`, `undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>) => `WatchBlocksReturnType` | Watches and returns information for incoming blocks. - Docs: https://viem.sh/docs/actions/public/watchBlocks.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/watching-blocks - JSON-RPC Methods: - When `poll: true`, calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getBlockByNumber) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchBlocks({ onBlock: (block) => console.log(block), }) ` | +| `publicClient.watchContractEvent` | (`args`: `WatchContractEventParameters`<`TAbi`, `TEventName`, `TStrict`\>) => `WatchContractEventReturnType` | Watches and returns emitted contract event logs. - Docs: https://viem.sh/docs/contract/watchContractEvent.html **`Remarks`** This Action will batch up all the event logs found within the [`pollingInterval`](https://viem.sh/docs/contract/watchContractEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/contract/watchContractEvent.html#onLogs). `watchContractEvent` will attempt to create an [Event Filter](https://viem.sh/docs/contract/createContractEventFilter.html) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchContractEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs.html) instead. **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = client.watchContractEvent({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['event Transfer(address indexed from, address indexed to, uint256 value)']), eventName: 'Transfer', args: { from: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b' }, onLogs: (logs) => console.log(logs), }) ` | +| `publicClient.watchEvent` | (`args`: `WatchEventParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`\>) => `WatchEventReturnType` | Watches and returns emitted [Event Logs](https://viem.sh/docs/glossary/terms.html#event-log). - Docs: https://viem.sh/docs/actions/public/watchEvent.html - JSON-RPC Methods: - **RPC Provider supports `eth_newFilter`:** - Calls [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) to create a filter (called on initialize). - On a polling interval, it will call [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges). - **RPC Provider does not support `eth_newFilter`:** - Calls [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) for each block between the polling interval. **`Remarks`** This Action will batch up all the Event Logs found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/actions/public/watchEvent.html#onLogs). `watchEvent` will attempt to create an [Event Filter](https://viem.sh/docs/actions/public/createEventFilter.html) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs.html) instead. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = client.watchEvent({ onLogs: (logs) => console.log(logs), }) ` | +| `publicClient.watchPendingTransactions` | (`args`: `WatchPendingTransactionsParameters`<`Transport`\>) => `WatchPendingTransactionsReturnType` | Watches and returns pending transaction hashes. - Docs: https://viem.sh/docs/actions/public/watchPendingTransactions.html - JSON-RPC Methods: - When `poll: true` - Calls [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) to initialize the filter. - Calls [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getFilterChanges) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newPendingTransactions"` event. **`Remarks`** This Action will batch up all the pending transactions found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchPendingTransactions.html#pollinginterval-optional), and invoke them via [`onTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions.html#ontransactions). **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchPendingTransactions({ onTransactions: (hashes) => console.log(hashes), }) ` | + +#### Returns + +`undefined` \| `FallbackProvider` \| `JsonRpcProvider` + +An ethers.js `Provider` instance, or `undefined` if no chain is found in the `PublicClient`. + +#### Defined in + +sdk/src/utils/adapters.ts:19 + +--- + +### validateAllowlist + +▸ **validateAllowlist**(`data`, `units`): `ValidationResult` + +Validates an array of allowlist entries. + +This function checks that the total units in the allowlist match the expected total units, that the total units are greater than 0, +and that all addresses in the allowlist are valid Ethereum addresses. It returns an object that includes a validity flag and any errors that occurred during validation. + +#### Parameters + +| Name | Type | Description | +| :------ | :---------------------------------------------- | :---------------------------------------------------------------------------------------------------------------- | +| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The allowlist entries to validate. Each entry should be an object that includes an address and a number of units. | +| `units` | `bigint` | The expected total units in the allowlist. | + +#### Returns + +`ValidationResult` + +An object that includes a validity flag and any errors that occurred during validation. The keys in the errors object are the names of the invalid properties, and the values are the error messages. + +#### Defined in + +sdk/src/validator/index.ts:108 + +--- + +### validateClaimData + +▸ **validateClaimData**(`data`): `ValidationResult` + +Validates Hypercert claim data. + +This function uses the AJV library to validate the claim data. It first retrieves the schema for the claim data, +then validates the data against the schema. If the schema is not found, it returns an error. If the data does not +conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------- | :------------------------------------------------------------------------------------------------- | +| `data` | `unknown` | The claim data to validate. This should be an object that conforms to the HypercertClaimdata type. | + +#### Returns + +`ValidationResult` + +An object that includes a validity flag and any errors that occurred during validation. + +#### Defined in + +sdk/src/validator/index.ts:77 + +--- + +### validateDuplicateEvaluationData + +▸ **validateDuplicateEvaluationData**(`data`): `ValidationResult` + +Validates duplicate evaluation data. + +This function uses the AJV library to validate the duplicate evaluation data. It first retrieves the schema for the duplicate evaluation data, +then validates the data against the schema. If the schema is not found, it returns an error. If the data does not +conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. + +#### Parameters + +| Name | Type | Description | +| :----- | :--------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------- | +| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The duplicate evaluation data to validate. This should be an object that conforms to the DuplicateEvaluation type. | + +#### Returns + +`ValidationResult` + +An object that includes a validity flag and any errors that occurred during validation. + +#### Defined in + +sdk/src/validator/index.ts:139 + +--- + +### validateMetaData + +▸ **validateMetaData**(`data`): `ValidationResult` + +Validates Hypercert metadata. + +This function uses the AJV library to validate the metadata. It first retrieves the schema for the metadata, +then validates the data against the schema. If the schema is not found, it returns an error. If the data does not +conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------- | :---------------------------------------------------------------------------------------------- | +| `data` | `unknown` | The metadata to validate. This should be an object that conforms to the HypercertMetadata type. | + +#### Returns + +`ValidationResult` + +An object that includes a validity flag and any errors that occurred during validation. + +#### Defined in + +sdk/src/validator/index.ts:46 + +--- + +### validateSimpleTextEvaluationData + +▸ **validateSimpleTextEvaluationData**(`data`): `ValidationResult` + +Validates simple text evaluation data against a predefined schema. + +This function uses the AJV library to validate the simple text evaluation data. It first retrieves the schema for the simple text evaluation data, +then validates the data against the schema. If the schema is not found, it returns an error. If the data does not +conform to the schema, it returns the validation errors. If the data is valid, it returns a success message. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The simple text evaluation data to validate. This should be an object that conforms to the SimpleTextEvaluation type. | + +#### Returns + +`ValidationResult` + +An object that includes a validity flag and any errors that occurred during validation. + +#### Defined in + +sdk/src/validator/index.ts:169 + +--- + +### verifyMerkleProof + +▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` + +Verifies a Merkle proof for a given root, signer address, units, and proof. + +This function first checks if the signer address is a valid Ethereum address. If it's not, it throws a `MintingError`. +It then verifies the Merkle proof using the `StandardMerkleTree.verify` method. If the verification fails, it throws a `MintingError`. + +#### Parameters + +| Name | Type | Description | +| :-------------- | :--------- | :----------------------------- | +| `root` | `string` | The root of the Merkle tree. | +| `signerAddress` | `string` | The signer's Ethereum address. | +| `units` | `bigint` | The number of units. | +| `proof` | `string`[] | The Merkle proof to verify. | + +#### Returns + +`void` + +**`Throws`** + +Will throw a `MintingError` if the signer address is invalid or if the Merkle proof verification fails. + +#### Defined in + +sdk/src/validator/index.ts:201 + +--- + +### verifyMerkleProofs + +▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` + +Verifies multiple Merkle proofs for given roots, a signer address, units, and proofs. + +This function first checks if the lengths of the roots, units, and proofs arrays are equal. If they're not, it throws a `MintingError`. +It then iterates over the arrays and verifies each Merkle proof using the `verifyMerkleProof` function. If any verification fails, it throws a `MintingError`. + +#### Parameters + +| Name | Type | Description | +| :-------------- | :----------- | :----------------------------- | +| `roots` | `string`[] | The roots of the Merkle trees. | +| `signerAddress` | `string` | The signer's Ethereum address. | +| `units` | `bigint`[] | The numbers of units. | +| `proofs` | `string`[][] | The Merkle proofs to verify. | + +#### Returns + +`void` + +**`Throws`** + +Will throw a `MintingError` if the lengths of the input arrays are not equal or if any Merkle proof verification fails. + +#### Defined in + +sdk/src/validator/index.ts:224 + +--- + +### walletClientToSigner + +▸ **walletClientToSigner**(`walletClient`): `undefined` \| `Signer` & `TypedDataSigner` + +This function converts a `WalletClient` instance to an ethers.js `Signer` to faciliate compatibility between ethers and viem. + +It extracts the account, chain, and transport from the `WalletClient` and creates a network object. +If no chain is found in the `WalletClient`, it logs a warning and stops the signature request. +It then creates a `Web3Provider` with the transport and network, and gets a `Signer` from the provider using the account's address. + +Ref: https://viem.sh/docs/ethers-migration.html + +#### Parameters + +| Name | Type | Description | +| :--------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `walletClient` | `Object` | The `WalletClient` instance to convert. | +| `walletClient.account` | `undefined` \| `Account` | The Account of the Client. | +| `walletClient.addChain` | (`args`: `AddChainParameters`) => `Promise`<`void`\> | Adds an EVM chain to the wallet. - Docs: https://viem.sh/docs/actions/wallet/addChain.html - JSON-RPC Methods: [`eth_addEthereumChain`](https://eips.ethereum.org/EIPS/eip-3085) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { optimism } from 'viem/chains' const client = createWalletClient({ transport: custom(window.ethereum), }) await client.addChain({ chain: optimism }) ` | +| `walletClient.batch?` | `Object` | Flags for batch settings. | +| `walletClient.batch.multicall?` | `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } | Toggle to enable `eth_call` multicall aggregation. | +| `walletClient.cacheTime` | `number` | Time (in ms) that cached data will remain in memory. | +| `walletClient.chain` | `undefined` \| `Chain` | Chain for the client. | +| `walletClient.deployContract` | (`args`: `DeployContractParameters`<`TAbi`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Deploys a contract to the network, given bytecode and constructor arguments. - Docs: https://viem.sh/docs/contract/deployContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/deploying-contracts **`Example`** `ts import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const hash = await client.deployContract({ abi: [], account: '0x…, bytecode: '0x608060405260405161083e38038061083e833981016040819052610...', }) ` | +| `walletClient.extend` | (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`, `WalletRpcSchema`, \{ [K in keyof client]: client[K]; } & `WalletActions`<`undefined` \| `Chain`, `undefined` \| `Account`\>\> | - | +| `walletClient.getAddresses` | () => `Promise`<`GetAddressesReturnType`\> | Returns a list of account addresses owned by the wallet or client. - Docs: https://viem.sh/docs/actions/wallet/getAddresses.html - JSON-RPC Methods: [`eth_accounts`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_accounts) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const accounts = await client.getAddresses() ` | +| `walletClient.getChainId` | () => `Promise`<`number`\> | Returns the chain ID associated with the current network. - Docs: https://viem.sh/docs/actions/public/getChainId.html - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid) **`Example`** `ts import { createWalletClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const chainId = await client.getChainId() // 1 ` | +| `walletClient.getPermissions` | () => `Promise`<`GetPermissionsReturnType`\> | Gets the wallets current permissions. - Docs: https://viem.sh/docs/actions/wallet/getPermissions.html - JSON-RPC Methods: [`wallet_getPermissions`](https://eips.ethereum.org/EIPS/eip-2255) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const permissions = await client.getPermissions() ` | +| `walletClient.key` | `string` | A key for the client. | +| `walletClient.name` | `string` | A name for the client. | +| `walletClient.pollingInterval` | `number` | Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. | +| `walletClient.prepareTransactionRequest` | (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> | Prepares a transaction request for signing. - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest.html **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` | +| `walletClient.request` | `EIP1193RequestFn`<`WalletRpcSchema`\> | Request function wrapped with friendly error handling | +| `walletClient.requestAddresses` | () => `Promise`<`RequestAddressesReturnType`\> | Requests a list of accounts managed by a wallet. - Docs: https://viem.sh/docs/actions/wallet/requestAddresses.html - JSON-RPC Methods: [`eth_requestAccounts`](https://eips.ethereum.org/EIPS/eip-1102) Sends a request to the wallet, asking for permission to access the user's accounts. After the user accepts the request, it will return a list of accounts (addresses). This API can be useful for dapps that need to access the user's accounts in order to execute transactions or interact with smart contracts. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const accounts = await client.requestAddresses() ` | +| `walletClient.requestPermissions` | (`args`: \{ [x: string]: Record; eth_accounts: Record; }) => `Promise`<`RequestPermissionsReturnType`\> | Requests permissions for a wallet. - Docs: https://viem.sh/docs/actions/wallet/requestPermissions.html - JSON-RPC Methods: [`wallet_requestPermissions`](https://eips.ethereum.org/EIPS/eip-2255) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const permissions = await client.requestPermissions({ eth_accounts: {} }) ` | +| `walletClient.sendRawTransaction` | (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> | Sends a **signed** transaction to the network - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction.html - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' import { sendRawTransaction } from 'viem/wallet' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendRawTransaction({ serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33' }) ` | +| `walletClient.sendTransaction` | (`args`: `SendTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Creates, signs, and sends a new transaction to the network. - Docs: https://viem.sh/docs/actions/wallet/sendTransaction.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/sending-transactions - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_sendTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendtransaction) - Local Accounts: [`eth_sendRawTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendrawtransaction) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendTransaction({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: 1000000000000000000n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const hash = await client.sendTransaction({ to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: 1000000000000000000n, }) ` | +| `walletClient.signMessage` | (`args`: `SignMessageParameters`<`undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | Calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191): `keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))`. - Docs: https://viem.sh/docs/actions/wallet/signMessage.html - JSON-RPC Methods: - JSON-RPC Accounts: [`personal_sign`](https://docs.metamask.io/guide/signing-data.html#personal-sign) - Local Accounts: Signs locally. No JSON-RPC request. With the calculated signature, you can: - use [`verifyMessage`](https://viem.sh/docs/utilities/verifyMessage.html) to verify the signature, - use [`recoverMessageAddress`](https://viem.sh/docs/utilities/recoverMessageAddress.html) to recover the signing address from a signature. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const signature = await client.signMessage({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', message: 'hello world', }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const signature = await client.signMessage({ message: 'hello world', }) ` | +| `walletClient.signTransaction` | (`args`: `SignTransactionParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Signs a transaction. - Docs: https://viem.sh/docs/actions/wallet/signTransaction.html - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_signTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) - Local Accounts: Signs locally. No JSON-RPC request. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) const signature = await client.signTransaction(request) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) const signature = await client.signTransaction(request) ` | +| `walletClient.signTypedData` | (`args`: `SignTypedDataParameters`<`TTypedData`, `TPrimaryType`, `undefined` \| `Account`\>) => `Promise`<\`0x$\{string}\`\> | Signs typed data and calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191): `keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))`. - Docs: https://viem.sh/docs/actions/wallet/signTypedData.html - JSON-RPC Methods: - JSON-RPC Accounts: [`eth_signTypedData_v4`](https://docs.metamask.io/guide/signing-data.html#signtypeddata-v4) - Local Accounts: Signs locally. No JSON-RPC request. **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const signature = await client.signTypedData({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', domain: { name: 'Ether Mail', version: '1', chainId: 1, verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', }, types: { Person: [ { name: 'name', type: 'string' }, { name: 'wallet', type: 'address' }, ], Mail: [ { name: 'from', type: 'Person' }, { name: 'to', type: 'Person' }, { name: 'contents', type: 'string' }, ], }, primaryType: 'Mail', message: { from: { name: 'Cow', wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', }, to: { name: 'Bob', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', }, contents: 'Hello, Bob!', }, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: http(), }) const signature = await client.signTypedData({ domain: { name: 'Ether Mail', version: '1', chainId: 1, verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', }, types: { Person: [ { name: 'name', type: 'string' }, { name: 'wallet', type: 'address' }, ], Mail: [ { name: 'from', type: 'Person' }, { name: 'to', type: 'Person' }, { name: 'contents', type: 'string' }, ], }, primaryType: 'Mail', message: { from: { name: 'Cow', wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', }, to: { name: 'Bob', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', }, contents: 'Hello, Bob!', }, }) ` | +| `walletClient.switchChain` | (`args`: `SwitchChainParameters`) => `Promise`<`void`\> | Switch the target chain in a wallet. - Docs: https://viem.sh/docs/actions/wallet/switchChain.html - JSON-RPC Methods: [`eth_switchEthereumChain`](https://eips.ethereum.org/EIPS/eip-3326) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet, optimism } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) await client.switchChain({ id: optimism.id }) ` | +| `walletClient.transport` | `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> | The RPC transport | +| `walletClient.type` | `string` | The type of client. | +| `walletClient.uid` | `string` | A unique ID for the client. | +| `walletClient.watchAsset` | (`args`: `WatchAssetParams`) => `Promise`<`boolean`\> | Adds an EVM chain to the wallet. - Docs: https://viem.sh/docs/actions/wallet/watchAsset.html - JSON-RPC Methods: [`eth_switchEthereumChain`](https://eips.ethereum.org/EIPS/eip-747) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const success = await client.watchAsset({ type: 'ERC20', options: { address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', decimals: 18, symbol: 'WETH', }, }) ` | +| `walletClient.writeContract` | (`args`: `WriteContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<\`0x$\{string}\`\> | Executes a write function on a contract. - Docs: https://viem.sh/docs/contract/writeContract.html - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/writing-to-contracts A "write" function on a Solidity contract modifies the state of the blockchain. These types of functions require gas to be executed, and hence a [Transaction](https://viem.sh/docs/glossary/terms.html) is needed to be broadcast in order to change the state. Internally, uses a [Wallet Client](https://viem.sh/docs/clients/wallet.html) to call the [`sendTransaction` action](https://viem.sh/docs/actions/wallet/sendTransaction.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **Warning: The `write` internally sends a transaction – it does not validate if the contract write will succeed (the contract may throw an error). It is highly recommended to [simulate the contract write with `contract.simulate`](https://viem.sh/docs/contract/writeContract.html#usage) before you execute it.** **`Example`** `ts import { createWalletClient, custom, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.writeContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32 tokenId) nonpayable']), functionName: 'mint', args: [69420], }) ` **`Example`** `ts // With Validation import { createWalletClient, custom, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const { request } = await client.simulateContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32 tokenId) nonpayable']), functionName: 'mint', args: [69420], } const hash = await client.writeContract(request) ` | + +#### Returns + +`undefined` \| `Signer` & `TypedDataSigner` + +An ethers.js `Signer` instance, or `undefined` if no chain is found in the `WalletClient`. + +#### Defined in + +sdk/src/utils/adapters.ts:51 diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md b/docs/versioned_docs/version-1.0.0/developer/burning.md similarity index 84% rename from docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md rename to docs/versioned_docs/version-1.0.0/developer/burning.md index b591d11d..331ebc52 100644 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md +++ b/docs/versioned_docs/version-1.0.0/developer/burning.md @@ -8,5 +8,5 @@ You can only burn fraction tokens that you own. Hypercert claims cannot be burne You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). ```js -const txn = await hypercerts.burnFraction({ tokenId }); +const txHash = await hypercerts.burnClaimFraction({ claimId }); ``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md b/docs/versioned_docs/version-1.0.0/developer/config.md similarity index 53% rename from docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md rename to docs/versioned_docs/version-1.0.0/developer/config.md index 0be153cb..e69050c3 100644 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md +++ b/docs/versioned_docs/version-1.0.0/developer/config.md @@ -35,11 +35,6 @@ If any of these conditions are true, the read-only property of the `HypercertCli The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - `DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. @@ -48,48 +43,40 @@ For example: ```json { "5": { - "chainId": 5, - "chainName": "goerli", "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphName": "hypercerts-testnet", "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" } } ``` -You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. +You can select which deployment to use by passing in a `chainId` configuration parameter. We also allow for `overrides` +when creating the SDK by passing configuration variables. ### Client config properties -| Property | Type | Description | -| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `graphUrl` | `string` | The url of the subgraph to use. | -| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | +HypercertClientConfig is a configuration object used when initializing a new instance of the HypercertClient. It allows +you to customize the client by setting your own providers or deployments. At it's simplest, you only need to provide +`chain.id` to initalize the client in `readonly` mode. + +| Field | Type | Description | +| --------------------------- | ------- | ---------------------------------------------------------------------------------------------- | +| `chain` | Object | Partial configuration for the blockchain network. | +| `contractAddress` | String | The address of the deployed contract. | +| `graphUrl` | String | The URL to the subgraph that indexes the contract events. Override for localized testing. | +| `graphName` | String | The name of the subgraph. | +| `nftStorageToken` | String | The API token for NFT.storage. | +| `web3StorageToken` | String | The API token for Web3.storage. | +| `easContractAddress` | String | The address of the EAS contract. | +| `publicClient` | Object | The PublicClient is inherently read-only and is used for reading data from the blockchain. | +| `walletClient` | Object | The WalletClient is used for signing and sending transactions. | +| `unsafeForceOverrideConfig` | Boolean | Boolean to force the use of overridden values. | +| `readOnly` | Boolean | Boolean to assert if the client is in read-only mode. | +| `readOnlyReason` | String | Reason for read-only mode. This is optional and can be used for logging or debugging purposes. | - [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) - [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) -### Environment variables - -You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. - -We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - ### Logging The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level diff --git a/docs/versioned_docs/version-1.0.0/developer/errors.md b/docs/versioned_docs/version-1.0.0/developer/errors.md new file mode 100644 index 00000000..291bb9f0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/errors.md @@ -0,0 +1,20 @@ +# Errors in the SDK + +Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. + +### Handling Errors + +To support debugging we've implemented some custom errors. + +| Error | Description | Payload | +| ----------------------- | ---------------------------------------------------- | ---------------------------- | +| `ClientError` | An error that is caused by a problem with the client | `{ "key": "value" }` | +| `ContractError` | An error that is returned by the contract | \`{ "data": "BaseError | +| `FetchError` | Fails fetching a remote resource | `{ "key": "value" }` | +| `InvalidOrMissingError` | The provided value was undefined or empty | `{ "key": "value" }` | +| `MintingError` | Minting transaction failed | `{ "key": "value" }` | +| `StorageError` | Fails storing to a remote resource | `{ "key": "value" }` | +| `UnknownSchemaError` | Schema could not be loaded | `{ "schemaName": "string" }` | +| `MalformedDataError` | Data doesn't conform to expectations | `{ "key": "value" }` | +| `UnsupportedChainError` | This blockchain is not yet supported | \`{ "chainID": "string | +| `ConfigurationError` | The configuration was invalid | `{ "key": "value" }` | diff --git a/docs/versioned_docs/version-1.0.0/developer/index.md b/docs/versioned_docs/version-1.0.0/developer/index.md new file mode 100644 index 00000000..1baebcca --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/index.md @@ -0,0 +1,49 @@ +# Developer Documentation for Hypercerts + +Welcome to the developer documentation for Hypercerts! This guide will provide you with all the information you need to get started with developing applications using Hypercerts. + +## API Documentation + +The API documentation section contains detailed information about the hypercerts SDK and contracts. You will find everything you need to integrate Hypercerts into your applications. + +## NPM packages + +We provide the following NPM packages for you to use in your applications: + +- [SDK](https://www.npmjs.com/package/@hypercerts-org/sdk) +- [Contracts](https://www.npmjs.com/package/@hypercerts-org/contracts) + +## Starter app + +The starter app repo contains a sample application that demonstrates how to use the Hypercerts SDK to create a simple web application based on Next.js, Chakra UI, and the Hypercerts SDK. + +[Starter app repository](https://github.com/hypercerts-org/hypercert-nextjs-chakra-starter) + +--- + +**NOTE** + +The starter app is a template to feel free to fork it and get started quickly. + +--- + +## Demo Apps + +In the demo apps repo, you will find a collection of sample applications that show the bare minimum to implement hypercerts. These apps serve as a starting point for your own development and can be used as a reference to understand how to implement the SDK. + +[Demo apps repository](https://github.com/hypercerts-org/demo-apps) + +## Issue Tracking + +If you encounter any issues or have questions while working with hypercerts, the issue tracking is the place to go. Here, you can find a list of known issues, report new issues, and participate in discussions with the hypercerts community. + +[Issues on GitHub](https://github.com/hypercerts-org/hypercerts/issues) + +## Quickstarts + +The quickstarts section provides step-by-step guides to help you quickly get up and running with Hypercerts. Whether you are a beginner or an experienced developer, these guides will walk you through the process of setting up your development environment and creating your first Hypercerts application. + +[Quickstart Javascript](./quickstart-javascript.md) +[Quickstart Solidity](./quickstart-solidity.md) + +We hope you find this developer documentation helpful in your journey with Hypercerts. Happy coding! diff --git a/docs/versioned_docs/version-0.3.0/developer/minting.md b/docs/versioned_docs/version-1.0.0/developer/minting.md similarity index 95% rename from docs/versioned_docs/version-0.3.0/developer/minting.md rename to docs/versioned_docs/version-1.0.0/developer/minting.md index d5ff1226..0acd42f0 100644 --- a/docs/versioned_docs/version-0.3.0/developer/minting.md +++ b/docs/versioned_docs/version-1.0.0/developer/minting.md @@ -17,9 +17,9 @@ The resulting hypercert will be wholly owned by the creator. import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; +const totalUnits = 10000n; -const tx: Promise = await hypercerts.mintClaim({ +const txHash = await hypercerts.mintClaim({ metadata, totalUnits, transferRestrictions: TransferRestrictions.FromCreatorOnly, diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md b/docs/versioned_docs/version-1.0.0/developer/querying.md similarity index 66% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md rename to docs/versioned_docs/version-1.0.0/developer/querying.md index 98ebbb83..760c34c8 100644 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md +++ b/docs/versioned_docs/version-1.0.0/developer/querying.md @@ -9,7 +9,7 @@ HypercertIndexer, and HypercertMinter classes, respectively. ```js const { client: { storage }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. @@ -17,7 +17,7 @@ The `storage` is a utility class that provides methods for storing and retrievin ```js const { client: { indexer }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. @@ -26,7 +26,7 @@ It is used by the HypercertClient to retrieve event-based data via the subgraph. ```js const { client: { contract }, -} = new HypercertClient({}); +} = new HypercertClient({ chain: { id: 5 } }); ``` Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used @@ -37,7 +37,7 @@ For example, a developer could use the storage instance to store metadata for a ## Indexer -For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. +For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we provide a client that wraps [urql](https://formidable.com/open-source/urql/) into an opiniated set of queries. ### Live graph playground @@ -56,7 +56,7 @@ Here's one example from our frontend where we let [react-query](https://www.npmj import { useHypercertClient } from "./hypercerts-client"; import { useQuery } from "@tanstack/react-query"; -export const useFractionsByOwner = (owner: string) => { +export const useFractionsByOwner = (owner: `0x${string}`) => { const { client: { indexer }, } = useHypercertClient(); @@ -93,16 +93,15 @@ The query takes the following input parameters: The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | +| Field | Type | Description | +| ------------ | -------- | ------------------------------ | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | #### `RecentClaims` @@ -122,16 +121,15 @@ The query takes the following input parameters: The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | +| Field | Type | Description | +| ------------ | -------- | ------------------------------ | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | #### `ClaimByID` @@ -149,16 +147,15 @@ The query takes the following input parameters: The query returns a claim object that matches the input parameter. The claim object has the following fields: -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | +| Field | Type | Description | +| ------------ | -------- | ------------------------------ | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | ### Queries: Fractions @@ -184,14 +181,13 @@ The query takes the following input parameters: The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: -| Field | Type | Description | -| ----------- | -------- | ------------------------------------------ | -| `chainName` | `String` | The name of the chain. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | +| Field | Type | Description | +| --------- | -------- | ------------------------------------------ | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | The Claim object has the following fields: @@ -221,13 +217,12 @@ The query takes the following input parameters: The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | +| Field | Type | Description | +| --------- | -------- | -------------------------- | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | #### `ClaimTokenById` Query @@ -245,14 +240,13 @@ The query takes the following input parameters: The query returns a claim token object that matches the input parameter. The claim token object has the following fields: -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | +| Field | Type | Description | +| --------- | -------- | ------------------------------------------ | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | The Claim object has the following fields: @@ -277,30 +271,3 @@ const claimById = await indexer.claimById(claimId); // Get the off-chain metadata const metadata = await storage.getMetadata(claimById.claim.uri); ``` - -## Contract - -### Typechain bindings - -We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, -which you can import and use from your TypeScript/JavaScript codebase. - -For example: - -```js -import { ethers } from "ethers"; -import { - HyperCertMinterFactory, - HypercertMinterABI, - IHypercertTokenABI, -} from "@hypercerts-org/sdk"; - -const provider = new ethers.getDefaultProvider(network); -const contractInterface = new ethers.utils.Interface(HypercertMinterABI); -const contract = new ethers.Contract( - contractAddress, - HypercertMinterABI, - provider, -); -const metadataUri = await contract.functions.uri(tokenId); -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md b/docs/versioned_docs/version-1.0.0/developer/quickstart-javascript.md similarity index 88% rename from docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md rename to docs/versioned_docs/version-1.0.0/developer/quickstart-javascript.md index 936cc05b..eee1f333 100644 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md +++ b/docs/versioned_docs/version-1.0.0/developer/quickstart-javascript.md @@ -28,15 +28,20 @@ Import the SDK into your project and create a new instance of `HypercertClient` ```js import { HypercertClient } from "@hypercerts-org/sdk"; -import { ethers } from "ethers"; +import { createWalletClient, custom } from "viem"; +import { mainnet } from "viem/chains"; + +const walletClient = createWalletClient({ + chain: mainnet, + transport: custom(window.ethereum), +}); // NOTE: you should replace this with your own JSON-RPC provider to the network // This should have signing abilities and match the `chainId` passed into HypercertClient -const operator = ethers.providers.getDefaultProvider("goerli"); const client = new HypercertClient({ chainId: 5, // goerli testnet - operator, + walletClient, nftStorageToken, web3StorageToken, }); @@ -45,7 +50,7 @@ const client = new HypercertClient({ Hypercerts is a multi-chain protocol. See [here](./supported-networks.md) for a list of currently supported networks. -> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). +> **Note** If there's no `walletClient`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). ## Make a Hypercert @@ -69,7 +74,7 @@ if (!valid) { } // Set the total amount of units available -const totalUnits: BigNumberish = 10_000_000 +const totalUnits: bigint = 10000n // Define the transfer restriction const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly diff --git a/docs/versioned_docs/version-0.3.0/developer/quickstart-solidity.md b/docs/versioned_docs/version-1.0.0/developer/quickstart-solidity.md similarity index 100% rename from docs/versioned_docs/version-0.3.0/developer/quickstart-solidity.md rename to docs/versioned_docs/version-1.0.0/developer/quickstart-solidity.md diff --git a/docs/versioned_docs/version-1.0.0/developer/split-merge.md b/docs/versioned_docs/version-1.0.0/developer/split-merge.md new file mode 100644 index 00000000..1335884f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/split-merge.md @@ -0,0 +1,15 @@ +# Split and Merge + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## By Token Value + +### Split / merge token values + +```js +const { tokenIds } = await hypercerts.splitFractionUnits({ + fractionId, + units: [10n, 12n, 15n], +}); +const { tokenId } = await hypercerts.mergeFractionUnits({ fractionIds }); +``` diff --git a/docs/versioned_docs/version-1.0.0/developer/supported-networks.md b/docs/versioned_docs/version-1.0.0/developer/supported-networks.md new file mode 100644 index 00000000..e8585291 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/developer/supported-networks.md @@ -0,0 +1,15 @@ +# Supported networks + +Hypercerts is developed in public and released under [dual MIT and Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: `Goerli` and `Sepolia` for testing, `Optimism` and `Celo` as the production deployment. + +We want to support every network that wants to support positive impact! +If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Overview + +| Network | HypercertMinter (UUPS Proxy) | Safe | +| -------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| Goerli | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [0x8CD35a62fF56A91485eBF97491612F1552dbc1c9](https://goerli.etherscan.io/address/0x8CD35a62fF56A91485eBF97491612F1552dbc1c9) | +| Sepolia | [0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941](https://goerli.etherscan.io/address/0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941) | TBD | +| Celo | [0x16bA53B74c234C870c61EFC04cD418B8f2865959](https://celoscan.io/address/0x16bA53B74c234C870c61EFC04cD418B8f2865959) | TBD | +| Optimism | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [0x560adA72a80b4707e493cA8c3B7B7528930E7Be5](https://optimistic.etherscan.io/address/0x560adA72a80b4707e493cA8c3B7B7528930E7Be5) | diff --git a/docs/versioned_docs/version-0.3.0/devops/deploy-proxy.md b/docs/versioned_docs/version-1.0.0/devops/deploy-proxy.md similarity index 80% rename from docs/versioned_docs/version-0.3.0/devops/deploy-proxy.md rename to docs/versioned_docs/version-1.0.0/devops/deploy-proxy.md index 72b3ee2d..4ed58fc0 100644 --- a/docs/versioned_docs/version-0.3.0/devops/deploy-proxy.md +++ b/docs/versioned_docs/version-1.0.0/devops/deploy-proxy.md @@ -15,10 +15,18 @@ Navigate to `contracts/`. Configure your `.env` file by following the instructio ### Build and deploy the smart contracts +--- + +**NOTE** + +While we use foundry for developement and testing, we use hardhat for deployment. This is because hardhat is more flexible and allows us to easily integrate with OpenZeppelin tools for upgradeable contracts. + +--- + If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. ```javascript - "optimism-goeri": getChainConfig("optimism-goerli"), + "sepolia": getChainConfig("sepolia"), ``` Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. @@ -49,13 +57,23 @@ to get set up. Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). -Now deploy the subgraph +To separate test from production, we use a different subgraph for each network. This means that we need to deploy a new subgraph for each network; but we group the deployments in the scripts. + +- Create a new deploy script for the network in the `package.json` of the `graph/` directory. For example, if you are deploying to the `sepolia` network, you would add the following script: + +````json + "deploy:sepolia": "graph deploy --node https://api.thegraph.com/deploy/ --network sepolia hypercerts-admin/hypercerts-sepolia" + ``` + +* Add the deploy script to `deploy:test` or `deploy:prod` depending on whether you are deploying to a test or production network. + +* Now deploy the subgraph ```sh # Run in graph/ yarn build -yarn deploy:hosted -``` +yarn deploy:test +```` ## OpenZeppelin Defender diff --git a/docs/versioned_docs/version-0.0.1/devops/errors.md b/docs/versioned_docs/version-1.0.0/devops/errors.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/devops/errors.md rename to docs/versioned_docs/version-1.0.0/devops/errors.md diff --git a/docs/versioned_docs/version-0.3.0/devops/index.md b/docs/versioned_docs/version-1.0.0/devops/index.md similarity index 100% rename from docs/versioned_docs/version-0.3.0/devops/index.md rename to docs/versioned_docs/version-1.0.0/devops/index.md diff --git a/docs/versioned_docs/version-0.0.1/devops/pause.md b/docs/versioned_docs/version-1.0.0/devops/pause.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/devops/pause.md rename to docs/versioned_docs/version-1.0.0/devops/pause.md diff --git a/docs/versioned_docs/version-0.0.1/devops/plasmic.md b/docs/versioned_docs/version-1.0.0/devops/plasmic.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/devops/plasmic.md rename to docs/versioned_docs/version-1.0.0/devops/plasmic.md diff --git a/docs/versioned_docs/version-0.0.1/devops/setup.md b/docs/versioned_docs/version-1.0.0/devops/setup.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/devops/setup.md rename to docs/versioned_docs/version-1.0.0/devops/setup.md diff --git a/docs/versioned_docs/version-0.0.1/devops/upgrade.md b/docs/versioned_docs/version-1.0.0/devops/upgrade.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/devops/upgrade.md rename to docs/versioned_docs/version-1.0.0/devops/upgrade.md diff --git a/docs/versioned_docs/version-0.0.1/faq.md b/docs/versioned_docs/version-1.0.0/faq.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/faq.md rename to docs/versioned_docs/version-1.0.0/faq.md diff --git a/docs/versioned_docs/version-0.0.1/further-resources.md b/docs/versioned_docs/version-1.0.0/further-resources.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/further-resources.md rename to docs/versioned_docs/version-1.0.0/further-resources.md diff --git a/docs/versioned_docs/version-0.3.0/implementation/glossary.md b/docs/versioned_docs/version-1.0.0/implementation/glossary.md similarity index 96% rename from docs/versioned_docs/version-0.3.0/implementation/glossary.md rename to docs/versioned_docs/version-1.0.0/implementation/glossary.md index b2451310..b35d4405 100644 --- a/docs/versioned_docs/version-0.3.0/implementation/glossary.md +++ b/docs/versioned_docs/version-1.0.0/implementation/glossary.md @@ -38,7 +38,7 @@ A token that (1) accounts for work by specified contributors that is supposed to ### Hypercerts interface -The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. +The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/protocol/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. ### Hypercerts implementation diff --git a/docs/versioned_docs/version-0.0.1/implementation/metadata.md b/docs/versioned_docs/version-1.0.0/implementation/metadata.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/implementation/metadata.md rename to docs/versioned_docs/version-1.0.0/implementation/metadata.md diff --git a/docs/versioned_docs/version-0.0.1/implementation/token-standard.md b/docs/versioned_docs/version-1.0.0/implementation/token-standard.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/implementation/token-standard.md rename to docs/versioned_docs/version-1.0.0/implementation/token-standard.md diff --git a/docs/versioned_docs/version-0.0.1/intro.md b/docs/versioned_docs/version-1.0.0/intro.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/intro.md rename to docs/versioned_docs/version-1.0.0/intro.md diff --git a/docs/versioned_docs/version-0.0.1/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-1.0.0/minting-guide/gitcoin-round.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/minting-guide/gitcoin-round.md rename to docs/versioned_docs/version-1.0.0/minting-guide/gitcoin-round.md diff --git a/docs/versioned_docs/version-0.0.1/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-1.0.0/minting-guide/minting-guide-start.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/minting-guide/minting-guide-start.md rename to docs/versioned_docs/version-1.0.0/minting-guide/minting-guide-start.md diff --git a/docs/versioned_docs/version-0.0.1/minting-guide/step-by-step.md b/docs/versioned_docs/version-1.0.0/minting-guide/step-by-step.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/minting-guide/step-by-step.md rename to docs/versioned_docs/version-1.0.0/minting-guide/step-by-step.md diff --git a/docs/versioned_docs/version-0.0.1/whitepaper/evaluation.md b/docs/versioned_docs/version-1.0.0/whitepaper/evaluation.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/whitepaper/evaluation.md rename to docs/versioned_docs/version-1.0.0/whitepaper/evaluation.md diff --git a/docs/versioned_docs/version-0.0.1/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-1.0.0/whitepaper/hypercerts-intro.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/whitepaper/hypercerts-intro.md rename to docs/versioned_docs/version-1.0.0/whitepaper/hypercerts-intro.md diff --git a/docs/versioned_docs/version-0.0.1/whitepaper/ifs.md b/docs/versioned_docs/version-1.0.0/whitepaper/ifs.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/whitepaper/ifs.md rename to docs/versioned_docs/version-1.0.0/whitepaper/ifs.md diff --git a/docs/versioned_docs/version-0.0.1/whitepaper/impact-space.md b/docs/versioned_docs/version-1.0.0/whitepaper/impact-space.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/whitepaper/impact-space.md rename to docs/versioned_docs/version-1.0.0/whitepaper/impact-space.md diff --git a/docs/versioned_docs/version-0.0.1/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-1.0.0/whitepaper/retrospective-funding.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/whitepaper/retrospective-funding.md rename to docs/versioned_docs/version-1.0.0/whitepaper/retrospective-funding.md diff --git a/docs/versioned_docs/version-0.0.1/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-1.0.0/whitepaper/whitepaper-intro.md similarity index 100% rename from docs/versioned_docs/version-0.0.1/whitepaper/whitepaper-intro.md rename to docs/versioned_docs/version-1.0.0/whitepaper/whitepaper-intro.md diff --git a/docs/versioned_sidebars/version-0.0.1-sidebars.json b/docs/versioned_sidebars/version-0.0.1-sidebars.json deleted file mode 100644 index f0b7b119..00000000 --- a/docs/versioned_sidebars/version-0.0.1-sidebars.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "mySidebar": [ - { - "type": "doc", - "id": "intro" - }, - { - "type": "category", - "label": "Vision & Whitepaper", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "whitepaper/whitepaper-intro" - }, - { - "type": "doc", - "id": "whitepaper/ifs" - }, - { - "type": "doc", - "id": "whitepaper/hypercerts-intro" - }, - { - "type": "doc", - "id": "whitepaper/impact-space" - }, - { - "type": "doc", - "id": "whitepaper/evaluation" - }, - { - "type": "doc", - "id": "whitepaper/retrospective-funding" - } - ] - }, - { - "type": "category", - "label": "Minting Guide", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "minting-guide/minting-guide-start" - }, - { - "type": "doc", - "id": "minting-guide/step-by-step" - }, - { - "type": "doc", - "id": "minting-guide/gitcoin-round" - } - ] - }, - { - "type": "category", - "label": "Implementation", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "implementation/token-standard" - }, - { - "type": "doc", - "id": "implementation/metadata" - }, - { - "type": "doc", - "id": "implementation/glossary" - } - ] - }, - { - "type": "doc", - "id": "faq" - }, - { - "type": "doc", - "id": "further-resources" - } - ] -} diff --git a/docs/versioned_sidebars/version-0.3.0-sidebars.json b/docs/versioned_sidebars/version-0.3.0-sidebars.json deleted file mode 100644 index 33a5ba79..00000000 --- a/docs/versioned_sidebars/version-0.3.0-sidebars.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "mySidebar": [ - { - "type": "doc", - "id": "intro" - }, - { - "type": "category", - "label": "Vision & Whitepaper", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "whitepaper/whitepaper-intro" - }, - { - "type": "doc", - "id": "whitepaper/ifs" - }, - { - "type": "doc", - "id": "whitepaper/hypercerts-intro" - }, - { - "type": "doc", - "id": "whitepaper/impact-space" - }, - { - "type": "doc", - "id": "whitepaper/evaluation" - }, - { - "type": "doc", - "id": "whitepaper/retrospective-funding" - } - ] - }, - { - "type": "category", - "label": "Developer Guide", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "developer/quickstart-javascript" - }, - { - "type": "doc", - "id": "developer/quickstart-solidity" - }, - { - "type": "doc", - "id": "developer/minting" - }, - { - "type": "doc", - "id": "developer/allowlists" - }, - { - "type": "doc", - "id": "developer/querying" - }, - { - "type": "doc", - "id": "developer/split-merge" - }, - { - "type": "doc", - "id": "developer/evaluations" - }, - { - "type": "doc", - "id": "developer/burning" - }, - { - "type": "doc", - "id": "developer/supported-networks" - }, - { - "type": "doc", - "id": "devops/index" - }, - { - "type": "category", - "label": "API Reference", - "collapsed": true, - "items": [ - { - "type": "category", - "label": "Contracts", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "developer/api/contracts/HypercertMinter" - }, - { - "type": "doc", - "id": "developer/api/contracts/SemiFungible1155" - }, - { - "type": "doc", - "id": "developer/api/contracts/AllowlistMinter" - } - ] - }, - { - "type": "doc", - "id": "developer/api/sdk/modules" - } - ] - } - ] - }, - { - "type": "category", - "label": "Minting Guide", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "minting-guide/minting-guide-start" - }, - { - "type": "doc", - "id": "minting-guide/step-by-step" - }, - { - "type": "doc", - "id": "minting-guide/gitcoin-round" - } - ] - }, - { - "type": "category", - "label": "Implementation", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "implementation/token-standard" - }, - { - "type": "doc", - "id": "implementation/metadata" - }, - { - "type": "doc", - "id": "implementation/glossary" - } - ] - }, - { - "type": "doc", - "id": "faq" - }, - { - "type": "doc", - "id": "further-resources" - } - ] -} diff --git a/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json b/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json deleted file mode 100644 index 33a5ba79..00000000 --- a/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "mySidebar": [ - { - "type": "doc", - "id": "intro" - }, - { - "type": "category", - "label": "Vision & Whitepaper", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "whitepaper/whitepaper-intro" - }, - { - "type": "doc", - "id": "whitepaper/ifs" - }, - { - "type": "doc", - "id": "whitepaper/hypercerts-intro" - }, - { - "type": "doc", - "id": "whitepaper/impact-space" - }, - { - "type": "doc", - "id": "whitepaper/evaluation" - }, - { - "type": "doc", - "id": "whitepaper/retrospective-funding" - } - ] - }, - { - "type": "category", - "label": "Developer Guide", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "developer/quickstart-javascript" - }, - { - "type": "doc", - "id": "developer/quickstart-solidity" - }, - { - "type": "doc", - "id": "developer/minting" - }, - { - "type": "doc", - "id": "developer/allowlists" - }, - { - "type": "doc", - "id": "developer/querying" - }, - { - "type": "doc", - "id": "developer/split-merge" - }, - { - "type": "doc", - "id": "developer/evaluations" - }, - { - "type": "doc", - "id": "developer/burning" - }, - { - "type": "doc", - "id": "developer/supported-networks" - }, - { - "type": "doc", - "id": "devops/index" - }, - { - "type": "category", - "label": "API Reference", - "collapsed": true, - "items": [ - { - "type": "category", - "label": "Contracts", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "developer/api/contracts/HypercertMinter" - }, - { - "type": "doc", - "id": "developer/api/contracts/SemiFungible1155" - }, - { - "type": "doc", - "id": "developer/api/contracts/AllowlistMinter" - } - ] - }, - { - "type": "doc", - "id": "developer/api/sdk/modules" - } - ] - } - ] - }, - { - "type": "category", - "label": "Minting Guide", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "minting-guide/minting-guide-start" - }, - { - "type": "doc", - "id": "minting-guide/step-by-step" - }, - { - "type": "doc", - "id": "minting-guide/gitcoin-round" - } - ] - }, - { - "type": "category", - "label": "Implementation", - "collapsed": true, - "items": [ - { - "type": "doc", - "id": "implementation/token-standard" - }, - { - "type": "doc", - "id": "implementation/metadata" - }, - { - "type": "doc", - "id": "implementation/glossary" - } - ] - }, - { - "type": "doc", - "id": "faq" - }, - { - "type": "doc", - "id": "further-resources" - } - ] -} diff --git a/docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json b/docs/versioned_sidebars/version-1.0.0-sidebars.json similarity index 86% rename from docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json rename to docs/versioned_sidebars/version-1.0.0-sidebars.json index 91fbd94e..a17aed17 100644 --- a/docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json +++ b/docs/versioned_sidebars/version-1.0.0-sidebars.json @@ -25,10 +25,6 @@ "type": "doc", "id": "whitepaper/impact-space" }, - { - "type": "doc", - "id": "whitepaper/evaluation" - }, { "type": "doc", "id": "whitepaper/retrospective-funding" @@ -64,10 +60,6 @@ "type": "doc", "id": "developer/split-merge" }, - { - "type": "doc", - "id": "developer/evaluations" - }, { "type": "doc", "id": "developer/burning" @@ -87,29 +79,25 @@ "items": [ { "type": "category", - "label": "Protocol", + "label": "Contracts", "collapsed": true, "items": [ { "type": "autogenerated", - "dirName": "developer/api/contracts/protocol" + "dirName": "developer/api/contracts" } ] }, { "type": "category", - "label": "Exchange", + "label": "SDK", "collapsed": true, "items": [ { "type": "autogenerated", - "dirName": "developer/api/contracts/marketplace" + "dirName": "developer/api/sdk" } ] - }, - { - "type": "doc", - "id": "developer/api/sdk/modules" } ] } diff --git a/docs/versions.json b/docs/versions.json index df2daf73..64de05e1 100644 --- a/docs/versions.json +++ b/docs/versions.json @@ -1,2 +1 @@ -["1.0.0-alpha.1", "0.3.0", "0.0.1"] - +["1.0.0"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5bb52755..bc9502a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -263,32 +263,35 @@ importers: docs: dependencies: '@docusaurus/core': - specifier: ^2.4.1 - version: 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + specifier: ^3.0.0 + version: 3.0.1(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) '@docusaurus/preset-classic': - specifier: ^2.4.1 - version: 2.4.3(@algolia/client-search@4.20.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5) + specifier: ^3.0.0 + version: 3.0.1(@algolia/client-search@4.20.0)(@types/react@18.2.33)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.3.2) '@docusaurus/theme-mermaid': - specifier: ^2.4.1 - version: 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + specifier: ^3.0.0 + version: 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) '@mdx-js/react': - specifier: ^1.6.22 - version: 1.6.22(react@18.2.0) + specifier: ^3.0.0 + version: 3.0.0(@types/react@18.2.33)(react@18.2.0) clsx: specifier: ^1.2.1 version: 1.2.1 docusaurus-plugin-remote-content: specifier: ^3.1.0 - version: 3.1.0(@docusaurus/core@2.4.3) + version: 3.1.0(@docusaurus/core@3.0.1) + docusaurus-plugin-typedoc: + specifier: ^0.21.0 + version: 0.21.0(typedoc-plugin-markdown@3.17.1)(typedoc@0.25.4) mdx-mermaid: - specifier: ^1.3.2 - version: 1.3.2(mermaid@9.4.3)(react@18.2.0)(unist-util-visit@2.0.3) + specifier: ^2.0.0 + version: 2.0.0(mermaid@9.4.3)(react@18.2.0)(unist-util-visit@4.1.2) mermaid: specifier: ^9.3.0 version: 9.4.3 prism-react-renderer: - specifier: ^1.3.5 - version: 1.3.5(react@18.2.0) + specifier: ^2.1.0 + version: 2.3.0(react@18.2.0) react: specifier: ^18.2.0 version: 18.2.0 @@ -297,17 +300,20 @@ importers: version: 18.2.0(react@18.2.0) devDependencies: '@docusaurus/eslint-plugin': - specifier: ^2.4.1 - version: 2.4.3(eslint@8.52.0)(typescript@4.9.5) + specifier: ^3.0.0 + version: 3.0.1(eslint@8.52.0)(typescript@5.3.2) '@docusaurus/module-type-aliases': - specifier: ^2.4.1 - version: 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@tsconfig/docusaurus': - specifier: ^1.0.6 - version: 1.0.7 + specifier: ^3.0.0 + version: 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/tsconfig': + specifier: 3.0.0 + version: 3.0.0 + '@docusaurus/types': + specifier: 3.0.0 + version: 3.0.0(react-dom@18.2.0)(react@18.2.0) typescript: - specifier: ^4.9.4 - version: 4.9.5 + specifier: ^5.0.0 + version: 5.3.2 frontend: dependencies: @@ -682,15 +688,6 @@ importers: ts-node: specifier: ^10.9.1 version: 10.9.1(@types/node@18.18.7)(typescript@5.3.2) - typedoc: - specifier: ^0.25.4 - version: 0.25.4(typescript@5.3.2) - typedoc-plugin-markdown: - specifier: ^3.17.1 - version: 3.17.1(typedoc@0.25.4) - typedoc-plugin-missing-exports: - specifier: ^2.0.0 - version: 2.1.0(typedoc@0.25.4) typescript: specifier: 5.3.2 version: 5.3.2 @@ -969,11 +966,11 @@ packages: graphql: '*' dependencies: '@babel/core': 7.23.5 - '@babel/generator': 7.23.0 - '@babel/parser': 7.23.0 + '@babel/generator': 7.23.5 + '@babel/parser': 7.23.5 '@babel/runtime': 7.23.2 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 babel-preset-fbjs: 3.4.0(@babel/core@7.23.5) chalk: 4.1.2 fb-watchman: 2.0.2 @@ -1051,30 +1048,6 @@ packages: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - /@babel/core@7.12.9: - resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.12.9) - '@babel/helpers': 7.23.2 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 - convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - lodash: 4.17.21 - resolve: 1.22.8 - semver: 5.7.2 - source-map: 0.5.7 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/core@7.17.8: resolution: {integrity: sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==} engines: {node: '>=6.9.0'} @@ -1098,29 +1071,6 @@ packages: - supports-color dev: true - /@babel/core@7.23.2: - resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) - '@babel/helpers': 7.23.2 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 - convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/core@7.23.5: resolution: {integrity: sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==} engines: {node: '>=6.9.0'} @@ -1160,6 +1110,7 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 + dev: true /@babel/generator@7.23.5: resolution: {integrity: sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==} @@ -1192,24 +1143,6 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - dev: false - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.5): resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} engines: {node: '>=6.9.0'} @@ -1244,18 +1177,6 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: false - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.5): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} @@ -1267,21 +1188,6 @@ packages: regexpu-core: 5.3.2 semver: 6.3.1 - /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2): - resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.5): resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} peerDependencies: @@ -1325,20 +1231,6 @@ packages: dependencies: '@babel/types': 7.23.0 - /@babel/helper-module-transforms@7.23.0(@babel/core@7.12.9): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: false - /@babel/helper-module-transforms@7.23.0(@babel/core@7.17.8): resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} @@ -1353,33 +1245,6 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: false - - /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.5): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} @@ -1399,26 +1264,10 @@ packages: dependencies: '@babel/types': 7.23.0 - /@babel/helper-plugin-utils@7.10.4: - resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} - dev: false - /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.2): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 - dev: false - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.5): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} @@ -1430,18 +1279,6 @@ packages: '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2): - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - dev: false - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.5): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} @@ -1508,6 +1345,7 @@ packages: '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color + dev: true /@babel/helpers@7.23.5: resolution: {integrity: sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==} @@ -1541,6 +1379,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.23.0 + dev: true /@babel/parser@7.23.5: resolution: {integrity: sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==} @@ -1549,16 +1388,6 @@ packages: dependencies: '@babel/types': 7.23.5 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} engines: {node: '>=6.9.0'} @@ -1568,18 +1397,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) - dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} engines: {node: '>=6.9.0'} @@ -1661,18 +1478,6 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.5) dev: false - /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9): - resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.12.9) - dev: false - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.5): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} @@ -1680,12 +1485,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.2 + '@babel/compat-data': 7.23.5 '@babel/core': 7.23.5 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.5) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.5) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.5) /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.5): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} @@ -1712,15 +1517,6 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.5) dev: false - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - dev: false - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.5): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} @@ -1729,15 +1525,6 @@ packages: dependencies: '@babel/core': 7.23.5 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.5): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -1755,15 +1542,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.5): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -1772,16 +1550,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.5): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -1791,15 +1559,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.5): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -1818,15 +1577,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.5): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -1844,26 +1594,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} engines: {node: '>=6.9.0'} @@ -1873,16 +1603,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} engines: {node: '>=6.9.0'} @@ -1892,15 +1612,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.5): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -1909,15 +1620,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.5): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -1926,25 +1628,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx@7.12.1(@babel/core@7.12.9): - resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} @@ -1953,6 +1636,7 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 + dev: true /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} @@ -1963,15 +1647,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.5): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -1980,15 +1655,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.5): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -1997,15 +1663,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.5): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -2014,24 +1671,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.12.9): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.5): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -2040,15 +1679,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.5): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -2057,15 +1687,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.5): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -2074,16 +1695,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.5): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -2093,16 +1704,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.5): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -2112,16 +1713,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} @@ -2141,17 +1732,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.5): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -2162,25 +1742,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} engines: {node: '>=6.9.0'} @@ -2190,19 +1751,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2): - resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==} engines: {node: '>=6.9.0'} @@ -2215,18 +1763,6 @@ packages: '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.5) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.5) - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} engines: {node: '>=6.9.0'} @@ -2238,25 +1774,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.5) - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} engines: {node: '>=6.9.0'} @@ -2266,25 +1783,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.5): - resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} engines: {node: '>=6.9.0'} @@ -2294,17 +1792,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} engines: {node: '>=6.9.0'} @@ -2315,18 +1802,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2): - resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} engines: {node: '>=6.9.0'} @@ -2338,41 +1813,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.5) - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - dev: false - - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.5): - resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.5): resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} engines: {node: '>=6.9.0'} @@ -2390,27 +1830,6 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 - dev: false - - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} engines: {node: '>=6.9.0'} @@ -2421,25 +1840,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.15 - /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.5): - resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} engines: {node: '>=6.9.0'} @@ -2449,17 +1849,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} engines: {node: '>=6.9.0'} @@ -2470,16 +1859,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} engines: {node: '>=6.9.0'} @@ -2489,17 +1868,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2): - resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} engines: {node: '>=6.9.0'} @@ -2510,17 +1878,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.5) - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} engines: {node: '>=6.9.0'} @@ -2531,17 +1888,6 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2): - resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} engines: {node: '>=6.9.0'} @@ -2562,25 +1908,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.5) - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.5): - resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-for-of@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==} engines: {node: '>=6.9.0'} @@ -2590,29 +1917,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} engines: {node: '>=6.9.0'} @@ -2624,17 +1928,6 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.2): - resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} engines: {node: '>=6.9.0'} @@ -2645,25 +1938,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.5) - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} engines: {node: '>=6.9.0'} @@ -2673,17 +1947,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2): - resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} engines: {node: '>=6.9.0'} @@ -2694,25 +1957,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.5) - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} engines: {node: '>=6.9.0'} @@ -2722,17 +1966,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} engines: {node: '>=6.9.0'} @@ -2743,29 +1976,6 @@ packages: '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.5): - resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} engines: {node: '>=6.9.0'} @@ -2777,19 +1987,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - dev: false - /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} engines: {node: '>=6.9.0'} @@ -2802,17 +1999,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} engines: {node: '>=6.9.0'} @@ -2823,17 +2009,6 @@ packages: '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} @@ -2844,16 +2019,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} engines: {node: '>=6.9.0'} @@ -2863,17 +2028,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2): - resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} engines: {node: '>=6.9.0'} @@ -2884,17 +2038,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.5) - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2): - resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} engines: {node: '>=6.9.0'} @@ -2905,20 +2048,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.5) - /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.23.2 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} engines: {node: '>=6.9.0'} @@ -2932,27 +2061,6 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.5) '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.5) - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) - dev: false - - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} engines: {node: '>=6.9.0'} @@ -2963,17 +2071,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2): - resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} engines: {node: '>=6.9.0'} @@ -2984,18 +2081,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.5) - /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} engines: {node: '>=6.9.0'} @@ -3007,35 +2092,6 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.5) - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.12.9): - resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.5): - resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} engines: {node: '>=6.9.0'} @@ -3045,17 +2101,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} engines: {node: '>=6.9.0'} @@ -3066,19 +2111,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2): - resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} engines: {node: '>=6.9.0'} @@ -3091,25 +2123,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.5) - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} engines: {node: '>=6.9.0'} @@ -3129,16 +2142,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} engines: {node: '>=6.9.0'} @@ -3148,16 +2151,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} @@ -3188,20 +2181,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - '@babel/types': 7.23.0 - dev: false - /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.5): resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} engines: {node: '>=6.9.0'} @@ -3212,19 +2191,8 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.5) - '@babel/types': 7.23.0 - - /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: false + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.5) + '@babel/types': 7.23.5 /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} @@ -3237,17 +2205,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.2): - resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 - dev: false - /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} engines: {node: '>=6.9.0'} @@ -3258,16 +2215,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} engines: {node: '>=6.9.0'} @@ -3277,23 +2224,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.23.2): - resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) - babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.2) - babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.23.5): resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} engines: {node: '>=6.9.0'} @@ -3311,25 +2241,6 @@ packages: - supports-color dev: false - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} engines: {node: '>=6.9.0'} @@ -3339,27 +2250,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: false - - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} engines: {node: '>=6.9.0'} @@ -3370,16 +2260,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} engines: {node: '>=6.9.0'} @@ -3389,25 +2269,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.5): - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} engines: {node: '>=6.9.0'} @@ -3417,16 +2278,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} engines: {node: '>=6.9.0'} @@ -3436,19 +2287,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) - dev: false - /@babel/plugin-transform-typescript@7.23.5(@babel/core@7.23.5): resolution: {integrity: sha512-2fMkXEJkrmwgu2Bsv1Saxgj30IXZdJ+84lQcKKI7sm719oXs0BBw2ZENKdJdR1PjWndgLCEBNXJOri0fk7RYQA==} engines: {node: '>=6.9.0'} @@ -3461,16 +2299,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.5) - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.2): - resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} engines: {node: '>=6.9.0'} @@ -3480,17 +2308,6 @@ packages: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} engines: {node: '>=6.9.0'} @@ -3501,17 +2318,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} engines: {node: '>=6.9.0'} @@ -3522,17 +2328,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} engines: {node: '>=6.9.0'} @@ -3543,97 +2338,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - /@babel/preset-env@7.23.2(@babel/core@7.23.2): - resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.23.2 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.2) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.23.2) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.2) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.2) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.2) - '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.2) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.2) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.2) - '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.2) - '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.2) - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.2) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.2) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.2) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.2) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.2) - '@babel/types': 7.23.0 - babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) - babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.2) - babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) - core-js-compat: 3.33.1 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/preset-env@7.23.5(@babel/core@7.23.5): resolution: {integrity: sha512-0d/uxVD6tFGWXGDSfyMD1p2otoaKmu6+GD+NfAx0tMaH+dxORnp7T9TaVQ6mKyya7iBtCIVxHjWT7MuzzM9z+A==} engines: {node: '>=6.9.0'} @@ -3736,17 +2440,6 @@ packages: '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.5) dev: false - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.0 - esutils: 2.0.3 - dev: false - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.5): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: @@ -3757,21 +2450,6 @@ packages: '@babel/types': 7.23.0 esutils: 2.0.3 - /@babel/preset-react@7.22.15(@babel/core@7.23.2): - resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.2) - dev: false - /@babel/preset-react@7.22.15(@babel/core@7.23.5): resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} engines: {node: '>=6.9.0'} @@ -3780,27 +2458,13 @@ packages: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 + '@babel/helper-validator-option': 7.23.5 '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.5) '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.5) '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.5) '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.5) dev: false - /@babel/preset-typescript@7.23.2(@babel/core@7.23.2): - resolution: {integrity: sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) - '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.2) - dev: false - /@babel/preset-typescript@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} engines: {node: '>=6.9.0'} @@ -3886,6 +2550,7 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: true /@babel/traverse@7.23.5: resolution: {integrity: sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==} @@ -4530,7 +3195,7 @@ packages: resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} dev: false - /@docsearch/react@3.5.2(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0): + /@docsearch/react@3.5.2(@algolia/client-search@4.20.0)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0): resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -4550,6 +3215,7 @@ packages: '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0) '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) '@docsearch/css': 3.5.2 + '@types/react': 18.2.33 algoliasearch: 4.20.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4558,35 +3224,35 @@ packages: - '@algolia/client-search' dev: false - /@docusaurus/core@2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA==} - engines: {node: '>=16.14'} + /@docusaurus/core@3.0.1(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-CXrLpOnW+dJdSv8M5FAJ3JBwXtL6mhUWxFA8aS0ozK6jBG/wgxERk5uvH28fCeFxOGbAT9v1e9dOMo1X2IEVhQ==} + engines: {node: '>=18.0'} hasBin: true peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@babel/core': 7.23.2 - '@babel/generator': 7.23.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) - '@babel/preset-env': 7.23.2(@babel/core@7.23.2) - '@babel/preset-react': 7.22.15(@babel/core@7.23.2) - '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) + '@babel/core': 7.23.5 + '@babel/generator': 7.23.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.5) + '@babel/preset-env': 7.23.5(@babel/core@7.23.5) + '@babel/preset-react': 7.22.15(@babel/core@7.23.5) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.5) '@babel/runtime': 7.23.2 '@babel/runtime-corejs3': 7.23.2 - '@babel/traverse': 7.23.2 - '@docusaurus/cssnano-preset': 2.4.3 - '@docusaurus/logger': 2.4.3 - '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) + '@babel/traverse': 7.23.5 + '@docusaurus/cssnano-preset': 3.0.1 + '@docusaurus/logger': 3.0.1 + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) '@docusaurus/react-loadable': 5.5.2(react@18.2.0) - '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-common': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.0) + '@docusaurus/utils-common': 3.0.1(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.0) '@slorber/static-site-generator-webpack-plugin': 4.0.7 '@svgr/webpack': 6.5.1 - autoprefixer: 10.4.16(postcss@8.4.31) - babel-loader: 8.3.0(@babel/core@7.23.2)(webpack@5.89.0) + autoprefixer: 10.4.16(postcss@8.4.32) + babel-loader: 9.1.3(@babel/core@7.23.5)(webpack@5.89.0) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -4599,25 +3265,24 @@ packages: core-js: 3.33.1 css-loader: 6.8.1(webpack@5.89.0) css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.2)(webpack@5.89.0) - cssnano: 5.1.15(postcss@8.4.31) + cssnano: 5.1.15(postcss@8.4.32) del: 6.1.1 detect-port: 1.5.1 escape-html: 1.0.3 eta: 2.2.0 file-loader: 6.2.0(webpack@5.89.0) - fs-extra: 10.1.0 - html-minifier-terser: 6.1.0 + fs-extra: 11.1.1 + html-minifier-terser: 7.2.0 html-tags: 3.3.1 html-webpack-plugin: 5.5.3(webpack@5.89.0) - import-fresh: 3.3.0 leven: 3.1.0 lodash: 4.17.21 mini-css-extract-plugin: 2.7.6(webpack@5.89.0) - postcss: 8.4.31 - postcss-loader: 7.3.3(postcss@8.4.31)(typescript@4.9.5)(webpack@5.89.0) + postcss: 8.4.32 + postcss-loader: 7.3.3(postcss@8.4.32)(typescript@5.3.2)(webpack@5.89.0) prompts: 2.4.2 react: 18.2.0 - react-dev-utils: 12.0.1(eslint@8.52.0)(typescript@4.9.5)(webpack@5.89.0) + react-dev-utils: 12.0.1(eslint@8.52.0)(typescript@5.3.2)(webpack@5.89.0) react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) @@ -4631,9 +3296,8 @@ packages: shelljs: 0.8.5 terser-webpack-plugin: 5.3.9(webpack@5.89.0) tslib: 2.6.2 - update-notifier: 5.1.0 + update-notifier: 6.0.2 url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) - wait-on: 6.0.1 webpack: 5.89.0(webpack-cli@5.1.4) webpack-bundle-analyzer: 4.9.1 webpack-dev-server: 4.15.1(debug@4.3.4)(webpack@5.89.0) @@ -4658,23 +3322,121 @@ packages: - webpack-cli dev: false - /@docusaurus/cssnano-preset@2.4.3: - resolution: {integrity: sha512-ZvGSRCi7z9wLnZrXNPG6DmVPHdKGd8dIn9pYbEOFiYihfv4uDR3UtxogmKf+rT8ZlKFf5Lqne8E8nt08zNM8CA==} - engines: {node: '>=16.14'} + /@docusaurus/core@3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-CXrLpOnW+dJdSv8M5FAJ3JBwXtL6mhUWxFA8aS0ozK6jBG/wgxERk5uvH28fCeFxOGbAT9v1e9dOMo1X2IEVhQ==} + engines: {node: '>=18.0'} + hasBin: true + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - cssnano-preset-advanced: 5.3.10(postcss@8.4.31) - postcss: 8.4.31 - postcss-sort-media-queries: 4.4.1(postcss@8.4.31) + '@babel/core': 7.23.5 + '@babel/generator': 7.23.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.5) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.5) + '@babel/preset-env': 7.23.5(@babel/core@7.23.5) + '@babel/preset-react': 7.22.15(@babel/core@7.23.5) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.5) + '@babel/runtime': 7.23.2 + '@babel/runtime-corejs3': 7.23.2 + '@babel/traverse': 7.23.5 + '@docusaurus/cssnano-preset': 3.0.1 + '@docusaurus/logger': 3.0.1 + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/react-loadable': 5.5.2(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-common': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + '@slorber/static-site-generator-webpack-plugin': 4.0.7 + '@svgr/webpack': 6.5.1 + autoprefixer: 10.4.16(postcss@8.4.32) + babel-loader: 9.1.3(@babel/core@7.23.5)(webpack@5.89.0) + babel-plugin-dynamic-import-node: 2.3.3 + boxen: 6.2.1 + chalk: 4.1.2 + chokidar: 3.5.3 + clean-css: 5.3.2 + cli-table3: 0.6.3 + combine-promises: 1.2.0 + commander: 5.1.0 + copy-webpack-plugin: 11.0.0(webpack@5.89.0) + core-js: 3.33.1 + css-loader: 6.8.1(webpack@5.89.0) + css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.2)(webpack@5.89.0) + cssnano: 5.1.15(postcss@8.4.32) + del: 6.1.1 + detect-port: 1.5.1 + escape-html: 1.0.3 + eta: 2.2.0 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.1.1 + html-minifier-terser: 7.2.0 + html-tags: 3.3.1 + html-webpack-plugin: 5.5.3(webpack@5.89.0) + leven: 3.1.0 + lodash: 4.17.21 + mini-css-extract-plugin: 2.7.6(webpack@5.89.0) + postcss: 8.4.32 + postcss-loader: 7.3.3(postcss@8.4.32)(typescript@5.3.2)(webpack@5.89.0) + prompts: 2.4.2 + react: 18.2.0 + react-dev-utils: 12.0.1(eslint@8.52.0)(typescript@5.3.2)(webpack@5.89.0) + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) + react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0) + react-router: 5.3.4(react@18.2.0) + react-router-config: 5.1.1(react-router@5.3.4)(react@18.2.0) + react-router-dom: 5.3.4(react@18.2.0) + rtl-detect: 1.1.2 + semver: 7.5.4 + serve-handler: 6.1.5 + shelljs: 0.8.5 + terser-webpack-plugin: 5.3.9(webpack@5.89.0) tslib: 2.6.2 + update-notifier: 6.0.2 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + webpack: 5.89.0(webpack-cli@5.1.4) + webpack-bundle-analyzer: 4.9.1 + webpack-dev-server: 4.15.1(debug@4.3.4)(webpack@5.89.0) + webpack-merge: 5.10.0 + webpackbar: 5.0.2(webpack@5.89.0) + transitivePeerDependencies: + - '@docusaurus/types' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli dev: false - /@docusaurus/eslint-plugin@2.4.3(eslint@8.52.0)(typescript@4.9.5): - resolution: {integrity: sha512-CckN1JCU7biEP4JMDCNGJf6VcmaCqqIruYrvSU91pKYrFuYi0gblfkljagkHc9+mw1ZX2jtoTm4XfoZ/Q9WDCA==} - engines: {node: '>=16.14'} + /@docusaurus/cssnano-preset@3.0.1: + resolution: {integrity: sha512-wjuXzkHMW+ig4BD6Ya1Yevx9UJadO4smNZCEljqBoQfIQrQskTswBs7lZ8InHP7mCt273a/y/rm36EZhqJhknQ==} + engines: {node: '>=18.0'} + dependencies: + cssnano-preset-advanced: 5.3.10(postcss@8.4.32) + postcss: 8.4.32 + postcss-sort-media-queries: 4.4.1(postcss@8.4.32) + tslib: 2.6.2 + dev: false + + /@docusaurus/eslint-plugin@3.0.1(eslint@8.52.0)(typescript@5.3.2): + resolution: {integrity: sha512-6t32uK6MQwm4G3di2tiAq6vHclLt6qyBqXW9rPI1scwJV+PJUxZTob4Ivf7UYH3jeOLH9YJM9L9QIhnhmabQmQ==} + engines: {node: '>=18.0'} peerDependencies: eslint: '>=6' dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.52.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.52.0)(typescript@5.3.2) eslint: 8.52.0 tslib: 2.6.2 transitivePeerDependencies: @@ -4682,39 +3444,92 @@ packages: - typescript dev: true - /@docusaurus/logger@2.4.3: - resolution: {integrity: sha512-Zxws7r3yLufk9xM1zq9ged0YHs65mlRmtsobnFkdZTxWXdTYlWWLWdKyNKAsVC+D7zg+pv2fGbyabdOnyZOM3w==} - engines: {node: '>=16.14'} + /@docusaurus/logger@3.0.1: + resolution: {integrity: sha512-I5L6Nk8OJzkVA91O2uftmo71LBSxe1vmOn9AMR6JRCzYeEBrqneWMH02AqMvjJ2NpMiviO+t0CyPjyYV7nxCWQ==} + engines: {node: '>=18.0'} dependencies: chalk: 4.1.2 tslib: 2.6.2 dev: false - /@docusaurus/mdx-loader@2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-b1+fDnWtl3GiqkL0BRjYtc94FZrcDDBV1j8446+4tptB9BAOlePwG2p/pK6vGvfL53lkOsszXMghr2g67M0vCw==} - engines: {node: '>=16.14'} + /@docusaurus/mdx-loader@3.0.1(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ldnTmvnvlrONUq45oKESrpy+lXtbnTcTsFkOTIDswe5xx5iWJjt6eSa0f99ZaWlnm24mlojcIGoUWNCS53qVlQ==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@babel/parser': 7.23.0 - '@babel/traverse': 7.23.2 - '@docusaurus/logger': 2.4.3 - '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) - '@mdx-js/mdx': 1.6.22 + '@babel/parser': 7.23.5 + '@babel/traverse': 7.23.5 + '@docusaurus/logger': 3.0.1 + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.0) + '@mdx-js/mdx': 3.0.0 + '@slorber/remark-comment': 1.0.0 + escape-html: 1.0.3 + estree-util-value-to-estree: 3.0.1 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.1.1 + image-size: 1.0.2 + mdast-util-mdx: 3.0.0 + mdast-util-to-string: 4.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rehype-raw: 7.0.0 + remark-directive: 3.0.0 + remark-emoji: 4.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.0 + stringify-object: 3.3.0 + tslib: 2.6.2 + unified: 11.0.4 + unist-util-visit: 5.0.0 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + vfile: 6.0.1 + webpack: 5.89.0(webpack-cli@5.1.4) + transitivePeerDependencies: + - '@docusaurus/types' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@docusaurus/mdx-loader@3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ldnTmvnvlrONUq45oKESrpy+lXtbnTcTsFkOTIDswe5xx5iWJjt6eSa0f99ZaWlnm24mlojcIGoUWNCS53qVlQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@babel/parser': 7.23.5 + '@babel/traverse': 7.23.5 + '@docusaurus/logger': 3.0.1 + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + '@mdx-js/mdx': 3.0.0 + '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 + estree-util-value-to-estree: 3.0.1 file-loader: 6.2.0(webpack@5.89.0) - fs-extra: 10.1.0 + fs-extra: 11.1.1 image-size: 1.0.2 - mdast-util-to-string: 2.0.0 + mdast-util-mdx: 3.0.0 + mdast-util-to-string: 4.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - remark-emoji: 2.2.0 + rehype-raw: 7.0.0 + remark-directive: 3.0.0 + remark-emoji: 4.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.0 stringify-object: 3.3.0 tslib: 2.6.2 - unified: 9.2.2 - unist-util-visit: 2.0.3 + unified: 11.0.4 + unist-util-visit: 5.0.0 url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + vfile: 6.0.1 webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@docusaurus/types' @@ -4725,14 +3540,14 @@ packages: - webpack-cli dev: false - /@docusaurus/module-type-aliases@2.4.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-cwkBkt1UCiduuvEAo7XZY01dJfRn7UR/75mBgOdb1hKknhrabJZ8YH+7savd/y9kLExPyrhe0QwdS9GuzsRRIA==} + /@docusaurus/module-type-aliases@3.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-DEHpeqUDsLynl3AhQQiO7AbC7/z/lBra34jTcdYuvp9eGm01pfH1wTVq8YqWZq6Jyx0BgcVl/VJqtE9StRd9Ag==} peerDependencies: react: '*' react-dom: '*' dependencies: '@docusaurus/react-loadable': 5.5.2(react@18.2.0) - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) '@types/history': 4.7.11 '@types/react': 18.2.33 '@types/react-router-config': 5.0.9 @@ -4747,29 +3562,30 @@ packages: - uglify-js - webpack-cli - /@docusaurus/plugin-content-blog@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-PVhypqaA0t98zVDpOeTqWUTvRqCEjJubtfFUQ7zJNYdbYTbS/E/ytq6zbLVsN/dImvemtO/5JQgjLxsh8XLo8Q==} - engines: {node: '>=16.14'} + /@docusaurus/plugin-content-blog@3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-cLOvtvAyaMQFLI8vm4j26svg3ktxMPSXpuUJ7EERKoGbfpJSsgtowNHcRsaBVmfuCsRSk1HZ/yHBsUkTmHFEsg==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/logger': 2.4.3 - '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-common': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/logger': 3.0.1 + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-common': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) cheerio: 1.0.0-rc.12 feed: 4.2.2 - fs-extra: 10.1.0 + fs-extra: 11.1.1 lodash: 4.17.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) reading-time: 1.5.0 + srcset: 4.0.0 tslib: 2.6.2 - unist-util-visit: 2.0.3 + unist-util-visit: 5.0.0 utility-types: 3.10.0 webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: @@ -4790,24 +3606,23 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-content-docs@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-N7Po2LSH6UejQhzTCsvuX5NOzlC+HiXOVvofnEPj0WhMu1etpLEXE6a4aTxrtg95lQ5kf0xUIdjX9sh3d3G76A==} - engines: {node: '>=16.14'} + /@docusaurus/plugin-content-docs@3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-dRfAOA5Ivo+sdzzJGXEu33yAtvGg8dlZkvt/NEJ7nwi1F2j4LEdsxtfX2GKeETB2fP6XoGNSQnFXqa2NYGrHFg==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/logger': 2.4.3 - '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/logger': 3.0.1 + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) '@types/react-router-config': 5.0.9 combine-promises: 1.2.0 - fs-extra: 10.1.0 - import-fresh: 3.3.0 + fs-extra: 11.1.1 js-yaml: 4.1.0 lodash: 4.17.21 react: 18.2.0 @@ -4833,19 +3648,19 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-content-pages@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-txtDVz7y3zGk67q0HjG0gRttVPodkHqE0bpJ+7dOaTH40CQFLSh7+aBeGnPOTl+oCPG+hxkim4SndqPqXjQ8Bg==} - engines: {node: '>=16.14'} + /@docusaurus/plugin-content-pages@3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-oP7PoYizKAXyEttcvVzfX3OoBIXEmXTMzCdfmC4oSwjG4SPcJsRge3mmI6O8jcZBgUPjIzXD21bVGWEE1iu8gg==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) - fs-extra: 10.1.0 + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + fs-extra: 11.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 @@ -4868,30 +3683,28 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-debug@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-LkUbuq3zCmINlFb+gAd4ZvYr+bPAzMC0hwND4F7V9bZ852dCX8YoWyovVUBKq4er1XsOwSQaHmNGtObtn8Av8Q==} - engines: {node: '>=16.14'} + /@docusaurus/plugin-debug@3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-09dxZMdATky4qdsZGzhzlUvvC+ilQ2hKbYF+wez+cM2mGo4qHbv8+qKXqxq0CQZyimwlAOWQLoSozIXU0g0i7g==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) - fs-extra: 10.1.0 + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + fs-extra: 11.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-json-view: 1.21.3(react-dom@18.2.0)(react@18.2.0) + react-json-view-lite: 1.2.1(react@18.2.0) tslib: 2.6.2 transitivePeerDependencies: - '@parcel/css' - '@swc/core' - '@swc/css' - - '@types/react' - bufferutil - csso - debug - - encoding - esbuild - eslint - lightningcss @@ -4903,16 +3716,16 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-analytics@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-KzBV3k8lDkWOhg/oYGxlK5o9bOwX7KpPc/FTWoB+SfKhlHfhq7qcQdMi1elAaVEIop8tgK6gD1E58Q+XC6otSQ==} - engines: {node: '>=16.14'} + /@docusaurus/plugin-google-analytics@3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-jwseSz1E+g9rXQwDdr0ZdYNjn8leZBnKPjjQhMBEiwDoenL3JYFcNW0+p0sWoVF/f2z5t7HkKA+cYObrUh18gg==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 @@ -4934,16 +3747,17 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-gtag@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA==} - engines: {node: '>=16.14'} + /@docusaurus/plugin-google-gtag@3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-UFTDvXniAWrajsulKUJ1DB6qplui1BlKLQZjX4F7qS/qfJ+qkKqSkhJ/F4VuGQ2JYeZstYb+KaUzUzvaPK1aRQ==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + '@types/gtag.js': 0.0.12 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 @@ -4965,16 +3779,16 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-tag-manager@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-1jTzp71yDGuQiX9Bi0pVp3alArV0LSnHXempvQTxwCGAEzUWWaBg4d8pocAlTpbP9aULQQqhgzrs8hgTRPOM0A==} - engines: {node: '>=16.14'} + /@docusaurus/plugin-google-tag-manager@3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-IPFvuz83aFuheZcWpTlAdiiX1RqWIHM+OH8wS66JgwAKOiQMR3+nLywGjkLV4bp52x7nCnwhNk1rE85Cpy/CIw==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 @@ -4996,20 +3810,20 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-sitemap@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-LRQYrK1oH1rNfr4YvWBmRzTL0LN9UAPxBbghgeFRBm5yloF6P+zv1tm2pe2hQTX/QP5bSKdnajCvfnScgKXMZQ==} - engines: {node: '>=16.14'} + /@docusaurus/plugin-sitemap@3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-xARiWnjtVvoEniZudlCq5T9ifnhCu/GAZ5nA7XgyLfPcNpHQa241HZdsTlLtVcecEVVdllevBKOp7qknBBaMGw==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/logger': 2.4.3 - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-common': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) - fs-extra: 10.1.0 + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/logger': 3.0.1 + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-common': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + fs-extra: 11.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) sitemap: 7.1.1 @@ -5032,26 +3846,26 @@ packages: - webpack-cli dev: false - /@docusaurus/preset-classic@2.4.3(@algolia/client-search@4.20.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5): - resolution: {integrity: sha512-tRyMliepY11Ym6hB1rAFSNGwQDpmszvWYJvlK1E+md4SW8i6ylNHtpZjaYFff9Mdk3i/Pg8ItQq9P0daOJAvQw==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-blog': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-docs': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-pages': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-debug': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-google-analytics': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-google-gtag': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-google-tag-manager': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-sitemap': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-classic': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-search-algolia': 2.4.3(@algolia/client-search@4.20.0)(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5) - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) + /@docusaurus/preset-classic@3.0.1(@algolia/client-search@4.20.0)(@types/react@18.2.33)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.3.2): + resolution: {integrity: sha512-il9m9xZKKjoXn6h0cRcdnt6wce0Pv1y5t4xk2Wx7zBGhKG1idu4IFHtikHlD0QPuZ9fizpXspXcTzjL5FXc1Gw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-content-blog': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-content-docs': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-content-pages': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-debug': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-google-analytics': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-google-gtag': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-google-tag-manager': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-sitemap': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/theme-classic': 3.0.1(@types/react@18.2.33)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/theme-common': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/theme-search-algolia': 3.0.1(@algolia/client-search@4.20.0)(@docusaurus/types@3.0.1)(@types/react@18.2.33)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.3.2) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -5063,7 +3877,6 @@ packages: - bufferutil - csso - debug - - encoding - esbuild - eslint - lightningcss @@ -5085,44 +3898,45 @@ packages: prop-types: 15.8.1 react: 18.2.0 - /@docusaurus/theme-classic@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-QKRAJPSGPfDY2yCiPMIVyr+MqwZCIV2lxNzqbyUW0YkrlmdzzP3WuQJPMGLCjWgQp/5c9kpWMvMxjhpZx1R32Q==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/plugin-content-blog': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-docs': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-pages': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-translations': 2.4.3 - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-common': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) - '@mdx-js/react': 1.6.22(react@18.2.0) - clsx: 1.2.1 + /@docusaurus/theme-classic@3.0.1(@types/react@18.2.33)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-XD1FRXaJiDlmYaiHHdm27PNhhPboUah9rqIH0lMpBt5kYtsGjJzhqa27KuZvHLzOP2OEpqd2+GZ5b6YPq7Q05Q==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-content-docs': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-content-pages': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/theme-common': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/theme-translations': 3.0.1 + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-common': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + '@mdx-js/react': 3.0.0(@types/react@18.2.33)(react@18.2.0) + clsx: 2.0.0 copy-text-to-clipboard: 3.2.0 infima: 0.2.0-alpha.43 lodash: 4.17.21 nprogress: 0.2.0 - postcss: 8.4.31 - prism-react-renderer: 1.3.5(react@18.2.0) + postcss: 8.4.32 + prism-react-renderer: 2.3.0(react@18.2.0) prismjs: 1.29.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-router-dom: 5.3.4(react@18.2.0) - rtlcss: 3.5.0 + rtlcss: 4.1.1 tslib: 2.6.2 utility-types: 3.10.0 transitivePeerDependencies: - '@parcel/css' - '@swc/core' - '@swc/css' + - '@types/react' - bufferutil - csso - debug @@ -5137,30 +3951,29 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-common@2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-7KaDJBXKBVGXw5WOVt84FtN8czGWhM0lbyWEZXGp8AFfL6sZQfRTluFp4QriR97qwzSyOfQb+nzcDZZU4tezUw==} - engines: {node: '>=16.14'} + /@docusaurus/theme-common@3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-cr9TOWXuIOL0PUfuXv6L5lPlTgaphKP+22NdVBOYah5jSq5XAAulJTjfe+IfLsEG4L7lJttLbhW7LXDFSAI7Ag==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@docusaurus/mdx-loader': 2.4.3(@docusaurus/types@2.4.3)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/plugin-content-blog': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-docs': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/plugin-content-pages': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-common': 2.4.3(@docusaurus/types@2.4.3) + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-content-docs': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/plugin-content-pages': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-common': 3.0.1(@docusaurus/types@3.0.1) '@types/history': 4.7.11 '@types/react': 18.2.33 '@types/react-router-config': 5.0.9 - clsx: 1.2.1 + clsx: 2.0.0 parse-numeric-range: 1.3.0 - prism-react-renderer: 1.3.5(react@18.2.0) + prism-react-renderer: 2.3.0(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 - use-sync-external-store: 1.2.0(react@18.2.0) utility-types: 3.10.0 transitivePeerDependencies: - '@docusaurus/types' @@ -5181,20 +3994,19 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-mermaid@2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-S1tZ3xpowtFiTrpTKmvVbRHUYGOlEG5CnPzWlO4huJT1sAwLR+pD6f9DYUlPv2+9NezF3EfUrUyW9xLH0UP58w==} - engines: {node: '>=16.14'} + /@docusaurus/theme-mermaid@3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2): + resolution: {integrity: sha512-jquSDnZfazABnC5i+02GzRIvufXKruKgvbYkQjKbI7/LWo0XvBs0uKAcCDGgHhth0t/ON5+Sn27joRfpeSk3Lw==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/module-type-aliases': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) - '@mdx-js/react': 1.6.22(react@18.2.0) - mermaid: 9.4.3 + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/module-type-aliases': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/theme-common': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + mermaid: 10.6.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 @@ -5216,26 +4028,26 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-search-algolia@2.4.3(@algolia/client-search@4.20.0)(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@4.9.5): - resolution: {integrity: sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q==} - engines: {node: '>=16.14'} + /@docusaurus/theme-search-algolia@3.0.1(@algolia/client-search@4.20.0)(@docusaurus/types@3.0.1)(@types/react@18.2.33)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.3.2): + resolution: {integrity: sha512-DDiPc0/xmKSEdwFkXNf1/vH1SzJPzuJBar8kMcBbDAZk/SAmo/4lf6GU2drou4Ae60lN2waix+jYWTWcJRahSA==} + engines: {node: '>=18.0'} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@docsearch/react': 3.5.2(@algolia/client-search@4.20.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0) - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/logger': 2.4.3 - '@docusaurus/plugin-content-docs': 2.4.3(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-common': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@docusaurus/theme-translations': 2.4.3 - '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) - '@docusaurus/utils-validation': 2.4.3(@docusaurus/types@2.4.3) + '@docsearch/react': 3.5.2(@algolia/client-search@4.20.0)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0) + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/logger': 3.0.1 + '@docusaurus/plugin-content-docs': 3.0.1(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/theme-common': 3.0.1(@docusaurus/types@3.0.1)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) + '@docusaurus/theme-translations': 3.0.1 + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) algoliasearch: 4.20.0 algoliasearch-helper: 3.15.0(algoliasearch@4.20.0) - clsx: 1.2.1 + clsx: 2.0.0 eta: 2.2.0 - fs-extra: 10.1.0 + fs-extra: 11.1.1 lodash: 4.17.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -5263,19 +4075,45 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-translations@2.4.3: - resolution: {integrity: sha512-H4D+lbZbjbKNS/Zw1Lel64PioUAIT3cLYYJLUf3KkuO/oc9e0QCVhIYVtUI2SfBCF2NNdlyhBDQEEMygsCedIg==} - engines: {node: '>=16.14'} + /@docusaurus/theme-translations@3.0.1: + resolution: {integrity: sha512-6UrbpzCTN6NIJnAtZ6Ne9492vmPVX+7Fsz4kmp+yor3KQwA1+MCzQP7ItDNkP38UmVLnvB/cYk/IvehCUqS3dg==} + engines: {node: '>=18.0'} dependencies: - fs-extra: 10.1.0 + fs-extra: 11.1.1 tslib: 2.6.2 dev: false - /@docusaurus/types@2.4.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-W6zNLGQqfrp/EoPD0bhb9n7OobP+RHpmvVzpA+Z/IuU3Q63njJM24hmT0GYboovWcDtFmnIJC9wcyx4RVPQscw==} + /@docusaurus/tsconfig@3.0.0: + resolution: {integrity: sha512-yR9sng4izFudS+v1xV5yboNfc1hATMDpYp9iYfWggbBDwKSm0J1IdIgkygRnqC/AWs1ARUQUpG0gFotPCE/4Ew==} + dev: true + + /@docusaurus/types@3.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Qb+l/hmCOVemReuzvvcFdk84bUmUFyD0Zi81y651ie3VwMrXqC7C0E7yZLKMOsLj/vkqsxHbtkAuYMI89YzNzg==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.33 + commander: 5.1.0 + joi: 17.11.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) + utility-types: 3.10.0 + webpack: 5.89.0(webpack-cli@5.1.4) + webpack-merge: 5.10.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + + /@docusaurus/types@3.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==} peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: '@types/history': 4.7.11 '@types/react': 18.2.33 @@ -5293,25 +4131,56 @@ packages: - uglify-js - webpack-cli - /@docusaurus/utils-common@2.4.3(@docusaurus/types@2.4.3): - resolution: {integrity: sha512-/jascp4GbLQCPVmcGkPzEQjNaAk3ADVfMtudk49Ggb+131B1WDD6HqlSmDf8MxGdy7Dja2gc+StHf01kiWoTDQ==} - engines: {node: '>=16.14'} + /@docusaurus/utils-common@3.0.1(@docusaurus/types@3.0.0): + resolution: {integrity: sha512-W0AxD6w6T8g6bNro8nBRWf7PeZ/nn7geEWM335qHU2DDDjHuV4UZjgUGP1AQsdcSikPrlIqTJJbKzer1lRSlIg==} + engines: {node: '>=18.0'} peerDependencies: '@docusaurus/types': '*' peerDependenciesMeta: '@docusaurus/types': optional: true dependencies: - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) tslib: 2.6.2 dev: false - /@docusaurus/utils-validation@2.4.3(@docusaurus/types@2.4.3): - resolution: {integrity: sha512-G2+Vt3WR5E/9drAobP+hhZQMaswRwDlp6qOMi7o7ZypB+VO7N//DZWhZEwhcRGepMDJGQEwtPv7UxtYwPL9PBw==} - engines: {node: '>=16.14'} + /@docusaurus/utils-common@3.0.1(@docusaurus/types@3.0.1): + resolution: {integrity: sha512-W0AxD6w6T8g6bNro8nBRWf7PeZ/nn7geEWM335qHU2DDDjHuV4UZjgUGP1AQsdcSikPrlIqTJJbKzer1lRSlIg==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/types': '*' + peerDependenciesMeta: + '@docusaurus/types': + optional: true dependencies: - '@docusaurus/logger': 2.4.3 - '@docusaurus/utils': 2.4.3(@docusaurus/types@2.4.3) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + tslib: 2.6.2 + dev: false + + /@docusaurus/utils-validation@3.0.1(@docusaurus/types@3.0.0): + resolution: {integrity: sha512-ujTnqSfyGQ7/4iZdB4RRuHKY/Nwm58IIb+41s5tCXOv/MBU2wGAjOHq3U+AEyJ8aKQcHbxvTKJaRchNHYUVUQg==} + engines: {node: '>=18.0'} + dependencies: + '@docusaurus/logger': 3.0.1 + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.0) + joi: 17.11.0 + js-yaml: 4.1.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@docusaurus/types' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@docusaurus/utils-validation@3.0.1(@docusaurus/types@3.0.1): + resolution: {integrity: sha512-ujTnqSfyGQ7/4iZdB4RRuHKY/Nwm58IIb+41s5tCXOv/MBU2wGAjOHq3U+AEyJ8aKQcHbxvTKJaRchNHYUVUQg==} + engines: {node: '>=18.0'} + dependencies: + '@docusaurus/logger': 3.0.1 + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) joi: 17.11.0 js-yaml: 4.1.0 tslib: 2.6.2 @@ -5324,24 +4193,60 @@ packages: - webpack-cli dev: false - /@docusaurus/utils@2.4.3(@docusaurus/types@2.4.3): - resolution: {integrity: sha512-fKcXsjrD86Smxv8Pt0TBFqYieZZCPh4cbf9oszUq/AMhZn3ujwpKaVYZACPX8mmjtYx0JOgNx52CREBfiGQB4A==} - engines: {node: '>=16.14'} + /@docusaurus/utils@3.0.1(@docusaurus/types@3.0.0): + resolution: {integrity: sha512-TwZ33Am0q4IIbvjhUOs+zpjtD/mXNmLmEgeTGuRq01QzulLHuPhaBTTAC/DHu6kFx3wDgmgpAlaRuCHfTcXv8g==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/types': '*' + peerDependenciesMeta: + '@docusaurus/types': + optional: true + dependencies: + '@docusaurus/logger': 3.0.1 + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@svgr/webpack': 6.5.1 + escape-string-regexp: 4.0.0 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.1.1 + github-slugger: 1.5.0 + globby: 11.1.0 + gray-matter: 4.0.3 + jiti: 1.20.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + micromatch: 4.0.5 + resolve-pathname: 3.0.0 + shelljs: 0.8.5 + tslib: 2.6.2 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + webpack: 5.89.0(webpack-cli@5.1.4) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@docusaurus/utils@3.0.1(@docusaurus/types@3.0.1): + resolution: {integrity: sha512-TwZ33Am0q4IIbvjhUOs+zpjtD/mXNmLmEgeTGuRq01QzulLHuPhaBTTAC/DHu6kFx3wDgmgpAlaRuCHfTcXv8g==} + engines: {node: '>=18.0'} peerDependencies: '@docusaurus/types': '*' peerDependenciesMeta: '@docusaurus/types': optional: true dependencies: - '@docusaurus/logger': 2.4.3 - '@docusaurus/types': 2.4.3(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/logger': 3.0.1 + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) '@svgr/webpack': 6.5.1 escape-string-regexp: 4.0.0 file-loader: 6.2.0(webpack@5.89.0) - fs-extra: 10.1.0 + fs-extra: 11.1.1 github-slugger: 1.5.0 globby: 11.1.0 gray-matter: 4.0.3 + jiti: 1.20.0 js-yaml: 4.1.0 lodash: 4.17.21 micromatch: 4.0.5 @@ -8279,10 +7184,10 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@babel/parser': 7.23.0 - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.5) - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/parser': 7.23.5 + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.5) + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 '@graphql-tools/utils': 9.2.1(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -10118,44 +9023,47 @@ packages: engines: {node: '>=8.3.0'} dev: true - /@mdx-js/mdx@1.6.22: - resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==} + /@mdx-js/mdx@3.0.0: + resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} dependencies: - '@babel/core': 7.12.9 - '@babel/plugin-syntax-jsx': 7.12.1(@babel/core@7.12.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) - '@mdx-js/util': 1.6.22 - babel-plugin-apply-mdx-type-prop: 1.6.22(@babel/core@7.12.9) - babel-plugin-extract-import-names: 1.6.22 - camelcase-css: 2.0.1 - detab: 2.0.4 - hast-util-raw: 6.0.1 - lodash.uniq: 4.5.0 - mdast-util-to-hast: 10.0.1 - remark-footnotes: 2.0.0 - remark-mdx: 1.6.22 - remark-parse: 8.0.3 - remark-squeeze-paragraphs: 4.0.0 - style-to-object: 0.3.0 - unified: 9.2.0 - unist-builder: 2.0.3 - unist-util-visit: 2.0.3 + '@types/estree': 1.0.3 + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdx': 2.0.10 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.0.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 transitivePeerDependencies: - supports-color dev: false - /@mdx-js/react@1.6.22(react@18.2.0): - resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} + /@mdx-js/react@3.0.0(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==} peerDependencies: - react: ^16.13.1 || ^17.0.0 + '@types/react': '>=16' + react: '>=16' dependencies: + '@types/mdx': 2.0.10 + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@mdx-js/util@1.6.22: - resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==} - dev: false - /@metamask/eth-sig-util@4.0.1: resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} engines: {node: '>=12.0.0'} @@ -11906,6 +10814,27 @@ packages: playwright: 1.39.0 dev: true + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: false + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: false + + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: false + /@polka/url@1.0.0-next.23: resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==} dev: false @@ -12914,11 +11843,6 @@ packages: /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - /@sindresorhus/is@0.14.0: - resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} - engines: {node: '>=6'} - dev: false - /@sindresorhus/is@0.7.0: resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==} engines: {node: '>=4'} @@ -12927,7 +11851,6 @@ packages: /@sindresorhus/is@4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - dev: true /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} @@ -12963,6 +11886,14 @@ packages: resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} dev: true + /@slorber/remark-comment@1.0.0: + resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + dev: false + /@slorber/static-site-generator-webpack-plugin@4.0.7: resolution: {integrity: sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==} engines: {node: '>=14'} @@ -13302,7 +12233,7 @@ packages: resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.5 entities: 4.5.0 dev: false @@ -13408,13 +12339,6 @@ packages: - zod dev: true - /@szmarczak/http-timer@1.1.2: - resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} - engines: {node: '>=6'} - dependencies: - defer-to-connect: 1.1.3 - dev: false - /@szmarczak/http-timer@4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} @@ -13427,7 +12351,6 @@ packages: engines: {node: '>=14.16'} dependencies: defer-to-connect: 2.0.1 - dev: true /@tanstack/match-sorter-utils@8.8.4: resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==} @@ -13614,10 +12537,6 @@ packages: engines: {node: '>=10.13.0'} dev: false - /@tsconfig/docusaurus@1.0.7: - resolution: {integrity: sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg==} - dev: true - /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} @@ -13659,6 +12578,12 @@ packages: typechain: 8.3.2(typescript@4.9.5) dev: true + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.3 + dev: false + /@types/aria-query@4.2.2: resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} dev: true @@ -13730,7 +12655,6 @@ packages: '@types/keyv': 3.1.4 '@types/node': 18.18.7 '@types/responselike': 1.0.2 - dev: true /@types/chai-as-promised@7.1.7: resolution: {integrity: sha512-APucaP5rlmTRYKtRA6FE5QPP87x76ejw5t5guRJ4y5OgMnwtsvigw7HHhKZlx2MGXLeZd6R/GNZR/IqDHcbtQw==} @@ -13781,6 +12705,20 @@ packages: dependencies: '@types/node': 18.18.7 + /@types/d3-scale-chromatic@3.0.3: + resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + dev: false + + /@types/d3-scale@4.0.8: + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + dependencies: + '@types/d3-time': 3.0.3 + dev: false + + /@types/d3-time@3.0.3: + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + dev: false + /@types/debug@4.1.10: resolution: {integrity: sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==} dependencies: @@ -13805,6 +12743,12 @@ packages: '@types/estree': 1.0.3 '@types/json-schema': 7.0.14 + /@types/estree-jsx@1.0.3: + resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + dependencies: + '@types/estree': 1.0.3 + dev: false + /@types/estree@1.0.3: resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} @@ -13849,12 +12793,22 @@ packages: '@types/node': 18.18.7 dev: true + /@types/gtag.js@0.0.12: + resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} + dev: false + /@types/hast@2.3.7: resolution: {integrity: sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw==} dependencies: '@types/unist': 2.0.9 dev: false + /@types/hast@3.0.3: + resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} + dependencies: + '@types/unist': 2.0.9 + dev: false + /@types/history@4.7.11: resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} @@ -13874,7 +12828,6 @@ packages: /@types/http-cache-semantics@4.0.4: resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: true /@types/http-errors@2.0.3: resolution: {integrity: sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==} @@ -13952,6 +12905,16 @@ packages: '@types/unist': 2.0.9 dev: false + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + dependencies: + '@types/unist': 2.0.9 + dev: false + + /@types/mdx@2.0.10: + resolution: {integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==} + dev: false + /@types/mime@1.3.4: resolution: {integrity: sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==} @@ -14026,10 +12989,6 @@ packages: /@types/parse-json@4.0.1: resolution: {integrity: sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==} - /@types/parse5@5.0.3: - resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} - dev: false - /@types/pbkdf2@3.1.1: resolution: {integrity: sha512-4HCoGwR3221nOc7G0Z/6KgTNGgaaFGkbGrtUJsB+zlKX2LBVjFHHIUkieMBgHHXgBH5Gq6dZHJKdBYdtlhBQvw==} dependencies: @@ -14043,6 +13002,10 @@ packages: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} dev: true + /@types/prismjs@1.26.3: + resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==} + dev: false + /@types/prop-types@15.7.9: resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} @@ -14214,6 +13177,10 @@ packages: resolution: {integrity: sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==} dev: false + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + dev: false + /@types/webpack-sources@3.2.2: resolution: {integrity: sha512-acCzhuVe+UJy8abiSFQWXELhhNMZjQjQKpLNEi1pKGgKXZj0ul614ATcx4kkhunPost6Xw+aCq8y8cn1/WwAiA==} dependencies: @@ -14273,7 +13240,6 @@ packages: requiresBuild: true dependencies: '@types/node': 18.18.7 - dev: true optional: true /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.19.0)(typescript@5.1.6): @@ -14467,6 +13433,27 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.2): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.3.2) + typescript: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@5.62.0(eslint@8.19.0)(typescript@5.1.6): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -14507,6 +13494,26 @@ packages: - typescript dev: true + /@typescript-eslint/utils@5.62.0(eslint@8.52.0)(typescript@5.3.2): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@types/json-schema': 7.0.14 + '@types/semver': 7.5.4 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.2) + eslint: 8.52.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys@5.62.0: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -15818,7 +14825,6 @@ packages: /acorn-walk@8.3.1: resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} engines: {node: '>=0.4.0'} - dev: true /acorn@8.10.0: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} @@ -16042,7 +15048,7 @@ packages: /ansi-sequence-parser@1.1.1: resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - dev: true + dev: false /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} @@ -16386,6 +15392,11 @@ packages: engines: {node: '>=8'} dev: true + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: false + /async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} @@ -16440,7 +15451,7 @@ packages: resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} engines: {node: '>=8'} - /autoprefixer@10.4.16(postcss@8.4.31): + /autoprefixer@10.4.16(postcss@8.4.32): resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -16452,7 +15463,7 @@ packages: fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false @@ -16481,14 +15492,6 @@ packages: - debug dev: true - /axios@0.25.0: - resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} - dependencies: - follow-redirects: 1.15.3(debug@4.3.4) - transitivePeerDependencies: - - debug - dev: false - /axios@0.26.1: resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} dependencies: @@ -16566,21 +15569,6 @@ packages: - supports-color dev: true - /babel-loader@8.3.0(@babel/core@7.23.2)(webpack@5.89.0): - resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - dependencies: - '@babel/core': 7.23.2 - find-cache-dir: 3.3.2 - loader-utils: 2.0.4 - make-dir: 3.1.0 - schema-utils: 2.7.1 - webpack: 5.89.0(webpack-cli@5.1.4) - dev: false - /babel-loader@9.1.3(@babel/core@7.23.5)(webpack@5.89.0): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} @@ -16592,17 +15580,6 @@ packages: find-cache-dir: 4.0.0 schema-utils: 4.2.0 webpack: 5.89.0(webpack-cli@5.1.4) - dev: true - - /babel-plugin-apply-mdx-type-prop@1.6.22(@babel/core@7.12.9): - resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==} - peerDependencies: - '@babel/core': ^7.11.6 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.10.4 - '@mdx-js/util': 1.6.22 - dev: false /babel-plugin-dynamic-import-node@2.3.3: resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} @@ -16610,12 +15587,6 @@ packages: object.assign: 4.1.4 dev: false - /babel-plugin-extract-import-names@1.6.22: - resolution: {integrity: sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==} - dependencies: - '@babel/helper-plugin-utils': 7.10.4 - dev: false - /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} @@ -16648,19 +15619,6 @@ packages: resolve: 1.22.8 dev: false - /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2): - resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.23.2 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.5): resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} peerDependencies: @@ -16673,18 +15631,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.23.2): - resolution: {integrity: sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) - core-js-compat: 3.33.1 - transitivePeerDependencies: - - supports-color - dev: false - /babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.23.5): resolution: {integrity: sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==} peerDependencies: @@ -16696,17 +15642,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2): - resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) - transitivePeerDependencies: - - supports-color - dev: false - /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.5): resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} peerDependencies: @@ -16787,28 +15722,28 @@ packages: '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.5) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.5) '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.5) '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.5) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.5) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.5) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.5) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.23.5) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.5) '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.5) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.5) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.5) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-for-of': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.5) '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.5) '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.5) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.5) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 /babel-preset-jest@29.6.3(@babel/core@7.23.5): @@ -16838,10 +15773,6 @@ packages: to-fast-properties: 1.0.3 dev: true - /bail@1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} - dev: false - /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: false @@ -16858,10 +15789,6 @@ packages: dependencies: safe-buffer: 5.2.1 - /base16@1.0.0: - resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} - dev: false - /base64-arraybuffer@1.0.2: resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} engines: {node: '>= 0.6.0'} @@ -17088,20 +16015,6 @@ packages: text-encoding-utf-8: 1.0.2 dev: false - /boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - string-width: 4.2.3 - type-fest: 0.20.2 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - dev: false - /boxen@6.2.1: resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -17218,7 +16131,6 @@ packages: /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true /buffer-fill@1.0.0: resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} @@ -17321,7 +16233,6 @@ packages: /cacheable-lookup@6.1.0: resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} engines: {node: '>=10.6.0'} - dev: true /cacheable-request@2.1.4: resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==} @@ -17335,19 +16246,6 @@ packages: responselike: 1.0.2 dev: true - /cacheable-request@6.1.0: - resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 3.1.0 - lowercase-keys: 2.0.0 - normalize-url: 4.5.1 - responselike: 1.0.2 - dev: false - /cacheable-request@7.0.4: resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} @@ -17359,7 +16257,6 @@ packages: lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 - dev: true /cachedir@2.3.0: resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} @@ -17421,11 +16318,6 @@ packages: pascal-case: 3.1.2 tslib: 2.6.2 - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - dev: false - /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -17518,8 +16410,8 @@ packages: hasBin: true dev: false - /ccount@1.1.0: - resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: false /chai-as-promised@7.1.1(chai@4.3.10): @@ -17647,22 +16539,24 @@ packages: /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - dev: true - /character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + requiresBuild: true dev: false - /character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + requiresBuild: true dev: false /character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} dev: false - /character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + requiresBuild: true dev: false /chardet@0.7.0: @@ -17724,7 +16618,6 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -17802,11 +16695,6 @@ packages: escape-string-regexp: 4.0.0 dev: true - /cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} - dev: false - /cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} @@ -17974,8 +16862,8 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collapse-white-space@1.0.6: - resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} + /collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} dev: false /collect-v8-coverage@1.0.2: @@ -18025,10 +16913,6 @@ packages: dependencies: delayed-stream: 1.0.0 - /comma-separated-tokens@1.0.8: - resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - dev: false - /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false @@ -18128,7 +17012,6 @@ packages: /common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: true /common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} @@ -18181,16 +17064,22 @@ packages: typedarray: 0.0.6 dev: true - /configstore@5.0.1: - resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} - engines: {node: '>=8'} + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} dependencies: - dot-prop: 5.3.0 + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + + /configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + dependencies: + dot-prop: 6.0.1 graceful-fs: 4.2.11 - make-dir: 3.1.0 - unique-string: 2.0.0 + unique-string: 3.0.0 write-file-atomic: 3.0.3 - xdg-basedir: 4.0.0 + xdg-basedir: 5.1.0 dev: false /connect-history-api-fallback@2.0.0: @@ -18456,6 +17345,7 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 typescript: 4.9.5 + dev: true /cosmiconfig@8.3.6(typescript@5.3.2): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} @@ -18530,6 +17420,16 @@ packages: cross-spawn: 7.0.3 dev: true + /cross-fetch@3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + requiresBuild: true + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: false + optional: true + /cross-fetch@3.1.8: resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} dependencies: @@ -18563,18 +17463,20 @@ packages: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} dev: true - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 dev: false - /css-declaration-sorter@6.4.1(postcss@8.4.31): + /css-declaration-sorter@6.4.1(postcss@8.4.32): resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: false /css-in-js-utils@3.1.0: @@ -18595,12 +17497,12 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) - postcss-modules-scope: 3.0.0(postcss@8.4.31) - postcss-modules-values: 4.0.0(postcss@8.4.31) + icss-utils: 5.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.32) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.32) + postcss-modules-scope: 3.0.0(postcss@8.4.32) + postcss-modules-values: 4.0.0(postcss@8.4.32) postcss-value-parser: 4.2.0 semver: 7.5.4 webpack: 5.89.0(webpack-cli@5.1.4) @@ -18632,9 +17534,9 @@ packages: optional: true dependencies: clean-css: 5.3.2 - cssnano: 5.1.15(postcss@8.4.31) + cssnano: 5.1.15(postcss@8.4.32) jest-worker: 29.7.0 - postcss: 8.4.31 + postcss: 8.4.32 schema-utils: 4.2.0 serialize-javascript: 6.0.1 source-map: 0.6.1 @@ -18687,77 +17589,77 @@ packages: hasBin: true dev: false - /cssnano-preset-advanced@5.3.10(postcss@8.4.31): + /cssnano-preset-advanced@5.3.10(postcss@8.4.32): resolution: {integrity: sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - autoprefixer: 10.4.16(postcss@8.4.31) - cssnano-preset-default: 5.2.14(postcss@8.4.31) - postcss: 8.4.31 - postcss-discard-unused: 5.1.0(postcss@8.4.31) - postcss-merge-idents: 5.1.1(postcss@8.4.31) - postcss-reduce-idents: 5.2.0(postcss@8.4.31) - postcss-zindex: 5.1.0(postcss@8.4.31) + autoprefixer: 10.4.16(postcss@8.4.32) + cssnano-preset-default: 5.2.14(postcss@8.4.32) + postcss: 8.4.32 + postcss-discard-unused: 5.1.0(postcss@8.4.32) + postcss-merge-idents: 5.1.1(postcss@8.4.32) + postcss-reduce-idents: 5.2.0(postcss@8.4.32) + postcss-zindex: 5.1.0(postcss@8.4.32) dev: false - /cssnano-preset-default@5.2.14(postcss@8.4.31): + /cssnano-preset-default@5.2.14(postcss@8.4.32): resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.4.1(postcss@8.4.31) - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-calc: 8.2.4(postcss@8.4.31) - postcss-colormin: 5.3.1(postcss@8.4.31) - postcss-convert-values: 5.1.3(postcss@8.4.31) - postcss-discard-comments: 5.1.2(postcss@8.4.31) - postcss-discard-duplicates: 5.1.0(postcss@8.4.31) - postcss-discard-empty: 5.1.1(postcss@8.4.31) - postcss-discard-overridden: 5.1.0(postcss@8.4.31) - postcss-merge-longhand: 5.1.7(postcss@8.4.31) - postcss-merge-rules: 5.1.4(postcss@8.4.31) - postcss-minify-font-values: 5.1.0(postcss@8.4.31) - postcss-minify-gradients: 5.1.1(postcss@8.4.31) - postcss-minify-params: 5.1.4(postcss@8.4.31) - postcss-minify-selectors: 5.2.1(postcss@8.4.31) - postcss-normalize-charset: 5.1.0(postcss@8.4.31) - postcss-normalize-display-values: 5.1.0(postcss@8.4.31) - postcss-normalize-positions: 5.1.1(postcss@8.4.31) - postcss-normalize-repeat-style: 5.1.1(postcss@8.4.31) - postcss-normalize-string: 5.1.0(postcss@8.4.31) - postcss-normalize-timing-functions: 5.1.0(postcss@8.4.31) - postcss-normalize-unicode: 5.1.1(postcss@8.4.31) - postcss-normalize-url: 5.1.0(postcss@8.4.31) - postcss-normalize-whitespace: 5.1.1(postcss@8.4.31) - postcss-ordered-values: 5.1.3(postcss@8.4.31) - postcss-reduce-initial: 5.1.2(postcss@8.4.31) - postcss-reduce-transforms: 5.1.0(postcss@8.4.31) - postcss-svgo: 5.1.0(postcss@8.4.31) - postcss-unique-selectors: 5.1.1(postcss@8.4.31) - dev: false - - /cssnano-utils@3.1.0(postcss@8.4.31): + css-declaration-sorter: 6.4.1(postcss@8.4.32) + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-calc: 8.2.4(postcss@8.4.32) + postcss-colormin: 5.3.1(postcss@8.4.32) + postcss-convert-values: 5.1.3(postcss@8.4.32) + postcss-discard-comments: 5.1.2(postcss@8.4.32) + postcss-discard-duplicates: 5.1.0(postcss@8.4.32) + postcss-discard-empty: 5.1.1(postcss@8.4.32) + postcss-discard-overridden: 5.1.0(postcss@8.4.32) + postcss-merge-longhand: 5.1.7(postcss@8.4.32) + postcss-merge-rules: 5.1.4(postcss@8.4.32) + postcss-minify-font-values: 5.1.0(postcss@8.4.32) + postcss-minify-gradients: 5.1.1(postcss@8.4.32) + postcss-minify-params: 5.1.4(postcss@8.4.32) + postcss-minify-selectors: 5.2.1(postcss@8.4.32) + postcss-normalize-charset: 5.1.0(postcss@8.4.32) + postcss-normalize-display-values: 5.1.0(postcss@8.4.32) + postcss-normalize-positions: 5.1.1(postcss@8.4.32) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.32) + postcss-normalize-string: 5.1.0(postcss@8.4.32) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.32) + postcss-normalize-unicode: 5.1.1(postcss@8.4.32) + postcss-normalize-url: 5.1.0(postcss@8.4.32) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.32) + postcss-ordered-values: 5.1.3(postcss@8.4.32) + postcss-reduce-initial: 5.1.2(postcss@8.4.32) + postcss-reduce-transforms: 5.1.0(postcss@8.4.32) + postcss-svgo: 5.1.0(postcss@8.4.32) + postcss-unique-selectors: 5.1.1(postcss@8.4.32) + dev: false + + /cssnano-utils@3.1.0(postcss@8.4.32): resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: false - /cssnano@5.1.15(postcss@8.4.31): + /cssnano@5.1.15(postcss@8.4.32): resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.14(postcss@8.4.31) + cssnano-preset-default: 5.2.14(postcss@8.4.32) lilconfig: 2.1.0 - postcss: 8.4.31 + postcss: 8.4.32 yaml: 1.10.2 dev: false @@ -18883,6 +17785,12 @@ packages: - typescript dev: true + /d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + dependencies: + internmap: 1.0.1 + dev: false + /d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} @@ -19000,6 +17908,10 @@ packages: d3-color: 3.1.0 dev: false + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: false + /d3-path@3.1.0: resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} engines: {node: '>=12'} @@ -19024,6 +17936,13 @@ packages: resolution: {integrity: sha512-XaNc2azaAwXhGjmCMtxlD+AowpMfLimVsAoTMpqrvb8CWoA4QqyV12mc4Ue6KSoDvfuS831tsumfhDYxGd4FGA==} dev: false + /d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + dev: false + /d3-scale-chromatic@3.0.0: resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} engines: {node: '>=12'} @@ -19048,6 +17967,12 @@ packages: engines: {node: '>=12'} dev: false + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + dependencies: + d3-path: 1.0.9 + dev: false + /d3-shape@3.2.0: resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} engines: {node: '>=12'} @@ -19148,6 +18073,13 @@ packages: multiformats: 10.0.3 dev: false + /dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + dependencies: + d3: 7.8.5 + lodash-es: 4.17.21 + dev: false + /dagre-d3-es@7.0.9: resolution: {integrity: sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==} dependencies: @@ -19343,13 +18275,13 @@ packages: engines: {node: '>=4'} dependencies: mimic-response: 1.0.1 + dev: true /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 - dev: true /decompress-tar@4.1.1: resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} @@ -19492,14 +18424,9 @@ packages: dependencies: clone: 1.0.4 - /defer-to-connect@1.1.3: - resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} - dev: false - /defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} - dev: true /define-data-property@1.1.1: resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} @@ -19597,12 +18524,6 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - /detab@2.0.4: - resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==} - dependencies: - repeat-string: 1.6.1 - dev: false - /detect-browser@5.3.0: resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} dev: false @@ -19649,6 +18570,18 @@ packages: transitivePeerDependencies: - supports-color + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + + /devtools-protocol@0.0.1045489: + resolution: {integrity: sha512-D+PTmWulkuQW4D1NTiCRCFxF7pQPn0hgp4YyX4wAQ6xYXKOadSWPR3ENGDQ47MW/Ewc9v2rpC/UEEGahgBYpSQ==} + requiresBuild: true + dev: false + optional: true + /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -19767,13 +18700,13 @@ packages: dependencies: esutils: 2.0.3 - /docusaurus-plugin-remote-content@3.1.0(@docusaurus/core@2.4.3): + /docusaurus-plugin-remote-content@3.1.0(@docusaurus/core@3.0.1): resolution: {integrity: sha512-859WYmC75l9hRYa1f/2FNF+FLcKbkHCM/0dehN1Wl1fIuoFzEPf3tcWs4jcEobRHYnoMjyupqAhmu0q5j3JoIg==} engines: {node: '>=12'} peerDependencies: '@docusaurus/core': 2.x dependencies: - '@docusaurus/core': 2.4.3(@docusaurus/types@2.4.3)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2) axios: 0.26.1 picocolors: 1.0.0 pretty-ms: 7.0.1 @@ -19782,6 +18715,16 @@ packages: - debug dev: false + /docusaurus-plugin-typedoc@0.21.0(typedoc-plugin-markdown@3.17.1)(typedoc@0.25.4): + resolution: {integrity: sha512-7DLFrf0JP+L5vSRQHVKIbndjbksd2MlxPqNmmdxzLFiRINgrY23s9waduWM9t24PUsf5JZ0tlGKlE3sK4uZ72Q==} + peerDependencies: + typedoc: '>=0.24.0' + typedoc-plugin-markdown: '>=3.15.0' + dependencies: + typedoc: 0.25.4(typescript@5.3.2) + typedoc-plugin-markdown: 3.17.1(typedoc@0.25.4) + dev: false + /dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} dev: true @@ -19844,6 +18787,10 @@ packages: resolution: {integrity: sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==} dev: false + /dompurify@3.0.6: + resolution: {integrity: sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==} + dev: false + /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: @@ -19870,6 +18817,14 @@ packages: engines: {node: '>=8'} dependencies: is-obj: 2.0.0 + dev: true + + /dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dependencies: + is-obj: 2.0.0 + dev: false /dotenv-parse-variables@2.0.0: resolution: {integrity: sha512-/Tezlx6xpDqR6zKg1V4vLCeQtHWiELhWoBz5A/E0+A1lXN9iIkNbbfc4THSymS0LQUo8F1PMiIwVG8ai/HrnSA==} @@ -19912,6 +18867,7 @@ packages: /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + dev: true /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -19994,12 +18950,16 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + /emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + dev: false + /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - /emoticon@3.2.0: - resolution: {integrity: sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==} + /emoticon@4.0.1: + resolution: {integrity: sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==} dev: false /encode-utf8@1.0.3: @@ -20343,9 +19303,9 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-goat@2.1.1: - resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} - engines: {node: '>=8'} + /escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} dev: false /escape-html@1.0.3: @@ -20363,6 +19323,11 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + /escodegen@1.8.1: resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} engines: {node: '>=0.12.0'} @@ -20754,6 +19719,81 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + /estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + requiresBuild: true + dependencies: + '@types/estree': 1.0.3 + dev: false + optional: true + + /estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + dependencies: + '@types/estree': 1.0.3 + dev: false + + /estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + dependencies: + '@types/estree-jsx': 1.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + dev: false + + /estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + requiresBuild: true + dev: false + optional: true + + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + + /estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + requiresBuild: true + dependencies: + '@types/estree-jsx': 1.0.3 + astring: 1.8.6 + source-map: 0.7.4 + dev: false + optional: true + + /estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + dependencies: + '@types/estree-jsx': 1.0.3 + astring: 1.8.6 + source-map: 0.7.4 + dev: false + + /estree-util-value-to-estree@3.0.1: + resolution: {integrity: sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==} + engines: {node: '>=16.0.0'} + dependencies: + '@types/estree': 1.0.3 + is-plain-obj: 4.1.0 + dev: false + + /estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + requiresBuild: true + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/unist': 2.0.9 + dev: false + optional: true + + /estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/unist': 3.0.2 + dev: false + /estree-walker@0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} dev: true @@ -20761,6 +19801,12 @@ packages: /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.3 + dev: false + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -21286,7 +20332,6 @@ packages: '@types/yauzl': 2.10.2 transitivePeerDependencies: - supports-color - dev: true /extsprintf@1.3.0: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} @@ -21398,6 +20443,12 @@ packages: dependencies: reusify: 1.0.4 + /fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + dependencies: + format: 0.2.2 + dev: false + /faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} @@ -21409,14 +20460,6 @@ packages: dependencies: bser: 2.1.1 - /fbemitter@3.0.0: - resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} - dependencies: - fbjs: 3.0.5 - transitivePeerDependencies: - - encoding - dev: false - /fbjs-css-vars@1.0.2: resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} @@ -21437,7 +20480,6 @@ packages: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} dependencies: pend: 1.2.0 - dev: true /feed@4.2.2: resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} @@ -21629,6 +20671,7 @@ packages: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 + dev: true /find-cache-dir@4.0.0: resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} @@ -21636,7 +20679,6 @@ packages: dependencies: common-path-prefix: 3.0.0 pkg-dir: 7.0.0 - dev: true /find-config@1.0.0: resolution: {integrity: sha512-Z+suHH+7LSE40WfUeZPIxSxypCWvrzdVc60xAjUShZeT5eMWM0/FQUduq3HjluyfAHWvC/aOBkT1pTZktyF/jg==} @@ -21695,7 +20737,6 @@ packages: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 - dev: true /findup-sync@4.0.0: resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} @@ -21731,18 +20772,6 @@ packages: engines: {node: '>=0.4.0'} dev: false - /flux@4.0.4(react@18.2.0): - resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} - peerDependencies: - react: ^15.0.2 || ^16.0.0 || ^17.0.0 - dependencies: - fbemitter: 3.0.0 - fbjs: 3.0.5 - react: 18.2.0 - transitivePeerDependencies: - - encoding - dev: false - /fmix@0.1.0: resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} dependencies: @@ -21792,7 +20821,7 @@ packages: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.52.0)(typescript@4.9.5)(webpack@5.89.0): + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.52.0)(typescript@5.3.2)(webpack@5.89.0): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -21820,13 +20849,12 @@ packages: schema-utils: 2.7.0 semver: 7.5.4 tapable: 1.1.3 - typescript: 4.9.5 + typescript: 5.3.2 webpack: 5.89.0(webpack-cli@5.1.4) dev: false /form-data-encoder@1.7.1: resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} - dev: true /form-data@2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} @@ -21854,6 +20882,11 @@ packages: combined-stream: 1.0.8 mime-types: 2.1.35 + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: false + /formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -21949,7 +20982,6 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true /fs-extra@0.30.0: resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} @@ -21960,15 +20992,6 @@ packages: path-is-absolute: 1.0.1 rimraf: 2.7.1 - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: false - /fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} @@ -21976,7 +20999,6 @@ packages: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - dev: true /fs-extra@4.0.3: resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} @@ -22156,6 +21178,7 @@ packages: engines: {node: '>=6'} dependencies: pump: 3.0.0 + dev: true /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} @@ -22553,7 +21576,6 @@ packages: lowercase-keys: 3.0.0 p-cancelable: 3.0.0 responselike: 2.0.1 - dev: true /got@8.3.2: resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==} @@ -22580,23 +21602,8 @@ packages: url-to-options: 1.0.1 dev: true - /got@9.6.0: - resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} - engines: {node: '>=8.6'} - dependencies: - '@sindresorhus/is': 0.14.0 - '@szmarczak/http-timer': 1.1.2 - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.2 - cacheable-request: 6.1.0 - decompress-response: 3.3.0 - duplexer3: 0.1.5 - get-stream: 4.1.0 - lowercase-keys: 1.0.1 - mimic-response: 1.0.1 - p-cancelable: 1.1.0 - to-readable-stream: 1.0.0 - url-parse-lax: 3.0.0 + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: false /graceful-fs@4.2.11: @@ -22791,7 +21798,6 @@ packages: wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.17.4 - dev: true /har-schema@2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} @@ -23230,9 +22236,9 @@ packages: dependencies: has-symbols: 1.0.3 - /has-yarn@2.1.0: - resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} - engines: {node: '>=8'} + /has-yarn@3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false /has@1.0.4: @@ -23276,70 +22282,188 @@ packages: dependencies: function-bind: 1.1.2 - /hast-to-hyperscript@9.0.1: - resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} + /hast-util-from-html@1.0.2: + resolution: {integrity: sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==} + requiresBuild: true + dependencies: + '@types/hast': 2.3.7 + hast-util-from-parse5: 7.1.2 + parse5: 7.1.2 + vfile: 5.3.7 + vfile-message: 3.1.4 + dev: false + optional: true + + /hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + requiresBuild: true dependencies: + '@types/hast': 2.3.7 '@types/unist': 2.0.9 - comma-separated-tokens: 1.0.8 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 - style-to-object: 0.3.0 - unist-util-is: 4.1.0 - web-namespaces: 1.1.4 + hastscript: 7.2.0 + property-information: 6.3.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 dev: false + optional: true - /hast-util-from-parse5@6.0.1: - resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==} + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} dependencies: - '@types/parse5': 5.0.3 - hastscript: 6.0.0 - property-information: 5.6.0 - vfile: 4.2.1 - vfile-location: 3.2.0 - web-namespaces: 1.1.4 + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.3.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 dev: false - /hast-util-parse-selector@2.2.5: - resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + /hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + requiresBuild: true + dependencies: + '@types/hast': 2.3.7 dev: false + optional: true - /hast-util-raw@6.0.1: - resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==} + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} dependencies: + '@types/hast': 3.0.3 + dev: false + + /hast-util-raw@9.0.1: + resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + dependencies: + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + requiresBuild: true + dependencies: + '@types/estree': 1.0.3 + '@types/estree-jsx': 1.0.3 '@types/hast': 2.3.7 - hast-util-from-parse5: 6.0.1 - hast-util-to-parse5: 6.0.0 - html-void-elements: 1.0.5 - parse5: 6.0.1 - unist-util-position: 3.1.0 - vfile: 4.2.1 - web-namespaces: 1.1.4 - xtend: 4.0.2 - zwitch: 1.0.5 + '@types/unist': 2.0.9 + comma-separated-tokens: 2.0.3 + estree-util-attach-comments: 2.1.1 + estree-util-is-identifier-name: 2.1.0 + hast-util-whitespace: 2.0.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdxjs-esm: 1.3.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 4.0.4 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color dev: false + optional: true - /hast-util-to-parse5@6.0.0: - resolution: {integrity: sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==} + /hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} dependencies: - hast-to-hyperscript: 9.0.1 - property-information: 5.6.0 - web-namespaces: 1.1.4 - xtend: 4.0.2 - zwitch: 1.0.5 + '@types/estree': 1.0.3 + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + dependencies: + '@types/estree': 1.0.3 + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + dependencies: + '@types/hast': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 dev: false /hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} dev: false - /hastscript@6.0.0: - resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.3 + dev: false + + /hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + requiresBuild: true dependencies: '@types/hast': 2.3.7 - comma-separated-tokens: 1.0.8 - hast-util-parse-selector: 2.2.5 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + dev: false + optional: true + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.3 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 dev: false /he@1.2.0: @@ -23470,6 +22594,20 @@ packages: relateurl: 0.2.7 terser: 5.22.0 + /html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.2 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.22.0 + dev: false + /html-rewriter-wasm@0.4.1: resolution: {integrity: sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q==} dev: true @@ -23479,8 +22617,8 @@ packages: engines: {node: '>=8'} dev: false - /html-void-elements@1.0.5: - resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} dev: false /html-webpack-plugin@4.5.2(webpack@5.89.0): @@ -23672,7 +22810,6 @@ packages: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - dev: true /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} @@ -23757,13 +22894,13 @@ packages: dependencies: safer-buffer: 2.1.2 - /icss-utils@5.1.0(postcss@8.4.31): + /icss-utils@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: false /idb-keyval@6.2.1: @@ -23829,9 +22966,9 @@ packages: resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} engines: {node: '>=12.2'} - /import-lazy@2.1.0: - resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} - engines: {node: '>=4'} + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} dev: false /import-local@3.1.0: @@ -23887,6 +23024,10 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false + /inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + dev: false + /inline-style-prefixer@6.0.4: resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} dependencies: @@ -23975,6 +23116,10 @@ packages: side-channel: 1.0.4 dev: true + /internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + dev: false + /internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} @@ -24655,15 +23800,17 @@ packages: is-relative: 1.0.0 is-windows: 1.0.2 - /is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + requiresBuild: true dev: false - /is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + requiresBuild: true dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 dev: false /is-arguments@1.1.1: @@ -24726,19 +23873,11 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - /is-ci@2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true - dependencies: - ci-info: 2.0.0 - dev: false - /is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true dependencies: ci-info: 3.9.0 - dev: true /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} @@ -24752,8 +23891,9 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + requiresBuild: true dev: false /is-directory@0.3.1: @@ -24826,8 +23966,9 @@ packages: resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} engines: {node: '>=6.5.0', npm: '>=3'} - /is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + requiresBuild: true dev: false /is-installed-globally@0.4.0: @@ -24886,9 +24027,9 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-npm@5.0.0: - resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} - engines: {node: '>=10'} + /is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false /is-number-object@1.0.7: @@ -24979,6 +24120,12 @@ packages: dependencies: '@types/estree': 1.0.3 + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + dependencies: + '@types/estree': 1.0.3 + dev: false + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -25113,18 +24260,10 @@ packages: engines: {node: '>=12.13'} dev: false - /is-whitespace-character@1.0.4: - resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} - dev: false - /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - /is-word-character@1.0.4: - resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==} - dev: false - /is-wsl@1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} @@ -25136,8 +24275,9 @@ packages: dependencies: is-docker: 2.2.1 - /is-yarn-global@0.3.0: - resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + /is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} dev: false /isarray@0.0.1: @@ -26313,6 +25453,7 @@ packages: /json-buffer@3.0.0: resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + dev: true /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -26438,7 +25579,6 @@ packages: /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true /jsonfile@2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} @@ -26544,12 +25684,6 @@ packages: json-buffer: 3.0.0 dev: true - /keyv@3.1.0: - resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} - dependencies: - json-buffer: 3.0.0 - dev: false - /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -26590,11 +25724,11 @@ packages: language-subtag-registry: 0.3.22 dev: true - /latest-version@5.1.0: - resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} - engines: {node: '>=8'} + /latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} dependencies: - package-json: 6.5.0 + package-json: 8.1.1 dev: false /launch-editor@2.6.1: @@ -26961,7 +26095,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-locate: 6.0.0 - dev: true /lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} @@ -26979,10 +26112,6 @@ packages: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} dev: true - /lodash.curry@4.1.1: - resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - dev: false - /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -26998,10 +26127,6 @@ packages: resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} dev: true - /lodash.flow@3.5.0: - resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} - dev: false - /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} @@ -27190,6 +26315,10 @@ packages: uint8arraylist: 2.4.3 dev: false + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + /longest@2.0.1: resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} engines: {node: '>=0.10.0'} @@ -27225,6 +26354,7 @@ packages: /lowercase-keys@1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} + dev: true /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} @@ -27233,7 +26363,6 @@ packages: /lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true /lru-cache@10.0.1: resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} @@ -27266,7 +26395,7 @@ packages: /lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - dev: true + dev: false /lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} @@ -27311,6 +26440,7 @@ packages: engines: {node: '>=8'} dependencies: semver: 6.3.1 + dev: true /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -27343,19 +26473,24 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} - /markdown-escapes@1.0.4: - resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} + /markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} dev: false /markdown-table@1.1.3: resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} dev: true + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + /marked@4.3.0: resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} hasBin: true - dev: true + dev: false /matchstick-as@0.6.0: resolution: {integrity: sha512-E36fWsC1AbCkBFt05VsDDRoFvGSdcZg6oZJrtIe/YDBbuFh8SKbR5FcoqDhNWqSN+F7bN/iS2u8Md0SM+4pUpw==} @@ -27374,24 +26509,36 @@ packages: inherits: 2.0.4 safe-buffer: 5.2.1 - /mdast-squeeze-paragraphs@4.0.0: - resolution: {integrity: sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==} + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: - unist-util-remove: 2.1.0 + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 + unist-util-visit: 4.1.2 dev: false - /mdast-util-definitions@4.0.0: - resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + /mdast-util-directive@3.0.0: + resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} dependencies: - unist-util-visit: 2.0.3 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color dev: false - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + /mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} dependencies: - '@types/mdast': 3.0.14 - '@types/unist': 2.0.9 - unist-util-visit: 4.1.2 + '@types/mdast': 4.0.3 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 dev: false /mdast-util-from-markdown@1.3.1: @@ -27413,17 +26560,242 @@ packages: - supports-color dev: false - /mdast-util-to-hast@10.0.1: - resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + dependencies: + '@types/mdast': 4.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 + dev: false + + /mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + requiresBuild: true + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.7 + '@types/mdast': 3.0.14 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + requiresBuild: true + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.7 '@types/mdast': 3.0.14 '@types/unist': 2.0.9 - mdast-util-definitions: 4.0.0 - mdurl: 1.0.1 - unist-builder: 2.0.3 - unist-util-generated: 1.1.6 - unist-util-position: 3.1.0 - unist-util-visit: 2.0.3 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /mdast-util-mdx-jsx@3.0.0: + resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + requiresBuild: true + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + requiresBuild: true + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.7 + '@types/mdast': 3.0.14 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + requiresBuild: true + dependencies: + '@types/mdast': 3.0.14 + unist-util-is: 5.2.1 + dev: false + optional: true + + /mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 dev: false /mdast-util-to-hast@12.3.0: @@ -27439,8 +26811,45 @@ packages: unist-util-visit: 4.1.2 dev: false - /mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + /mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + dependencies: + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + dev: false + + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + requiresBuild: true + dependencies: + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + dev: false + optional: true + + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.0.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 dev: false /mdast-util-to-string@3.2.0: @@ -27449,24 +26858,40 @@ packages: '@types/mdast': 3.0.14 dev: false - /mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.3 dev: false - /mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: false - /mdx-mermaid@1.3.2(mermaid@9.4.3)(react@18.2.0)(unist-util-visit@2.0.3): - resolution: {integrity: sha512-8kw0tg3isKKBFzFwoe2DhIaEgKYtVeJXQtxZCCrdTPO0CTpXHnTHT0atDqsp7YkXi5iUCp/zAZPZu1cmr68T3w==} + /mdx-mermaid@2.0.0(mermaid@9.4.3)(react@18.2.0)(unist-util-visit@4.1.2): + resolution: {integrity: sha512-vmkh4yg/EgkhAWxdFsyol5Tgk9aTnM16njgGIYk3R3SdbejPt8YV+HRYycAOstR1TJefMNAmjAyqkRjukLP7qg==} peerDependencies: mermaid: '>=8.11.0' react: ^16.8.4 || ^17.0.0 || ^18.0.0 - unist-util-visit: ^2.0.0 + unist-util-visit: ^4.1.0 dependencies: mermaid: 9.4.3 react: 18.2.0 - unist-util-visit: 2.0.3 + unist-util-visit: 4.1.2 + optionalDependencies: + estree-util-to-js: 1.2.0 + estree-util-visit: 1.2.1 + hast-util-from-html: 1.0.2 + hast-util-to-estree: 2.3.3 + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + puppeteer: 18.2.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate dev: false /media-query-parser@2.0.2: @@ -27569,6 +26994,33 @@ packages: resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} dev: true + /mermaid@10.6.1: + resolution: {integrity: sha512-Hky0/RpOw/1il9X8AvzOEChfJtVvmXm+y7JML5C//ePYMy0/9jCEmW1E1g86x9oDfW9+iVEdTV/i+M6KWRNs4A==} + dependencies: + '@braintree/sanitize-url': 6.0.4 + '@types/d3-scale': 4.0.8 + '@types/d3-scale-chromatic': 3.0.3 + cytoscape: 3.26.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.26.0) + cytoscape-fcose: 2.2.0(cytoscape@3.26.0) + d3: 7.8.5 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.10 + dayjs: 1.11.10 + dompurify: 3.0.6 + elkjs: 0.8.2 + khroma: 2.1.0 + lodash-es: 4.17.21 + mdast-util-from-markdown: 1.3.1 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.3.0 + ts-dedent: 2.2.0 + uuid: 9.0.1 + web-worker: 1.2.0 + transitivePeerDependencies: + - supports-color + dev: false + /mermaid@9.4.3: resolution: {integrity: sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw==} dependencies: @@ -27937,6 +27389,252 @@ packages: uvu: 0.5.6 dev: false + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-directive@3.0.0: + resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + parse-entities: 4.0.1 + dev: false + + /micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + dependencies: + fault: 2.0.1 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + requiresBuild: true + dependencies: + '@types/estree': 1.0.3 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + optional: true + + /micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + dependencies: + '@types/estree': 1.0.3 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + requiresBuild: true + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.3 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + optional: true + + /micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + requiresBuild: true + dependencies: + micromark-util-types: 1.1.0 + dev: false + optional: true + + /micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + requiresBuild: true + dependencies: + '@types/estree': 1.0.3 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + optional: true + + /micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + dependencies: + '@types/estree': 1.0.3 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + requiresBuild: true + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + optional: true + + /micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + /micromark-factory-destination@1.1.0: resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} dependencies: @@ -27945,6 +27643,14 @@ packages: micromark-util-types: 1.1.0 dev: false + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + /micromark-factory-label@1.1.0: resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} dependencies: @@ -27954,6 +27660,43 @@ packages: uvu: 0.5.6 dev: false + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + requiresBuild: true + dependencies: + '@types/estree': 1.0.3 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + optional: true + + /micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + dependencies: + '@types/estree': 1.0.3 + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + /micromark-factory-space@1.1.0: resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} dependencies: @@ -27961,6 +27704,13 @@ packages: micromark-util-types: 1.1.0 dev: false + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 + dev: false + /micromark-factory-title@1.1.0: resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} dependencies: @@ -27970,6 +27720,15 @@ packages: micromark-util-types: 1.1.0 dev: false + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + /micromark-factory-whitespace@1.1.0: resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} dependencies: @@ -27979,6 +27738,15 @@ packages: micromark-util-types: 1.1.0 dev: false + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + /micromark-util-character@1.2.0: resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} dependencies: @@ -27986,12 +27754,25 @@ packages: micromark-util-types: 1.1.0 dev: false + /micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + /micromark-util-chunked@1.1.0: resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} dependencies: micromark-util-symbol: 1.1.0 dev: false + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + /micromark-util-classify-character@1.1.0: resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} dependencies: @@ -28000,6 +27781,14 @@ packages: micromark-util-types: 1.1.0 dev: false + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + /micromark-util-combine-extensions@1.1.0: resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} dependencies: @@ -28007,12 +27796,25 @@ packages: micromark-util-types: 1.1.0 dev: false + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + /micromark-util-decode-numeric-character-reference@1.1.0: resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} dependencies: micromark-util-symbol: 1.1.0 dev: false + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + /micromark-util-decode-string@1.1.0: resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} dependencies: @@ -28022,26 +27824,83 @@ packages: micromark-util-symbol: 1.1.0 dev: false + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + dev: false + /micromark-util-encode@1.1.0: resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} dev: false + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + dev: false + + /micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + requiresBuild: true + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.3 + '@types/unist': 2.0.9 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + optional: true + + /micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.3 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + /micromark-util-html-tag-name@1.2.0: resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} dev: false + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + dev: false + /micromark-util-normalize-identifier@1.1.0: resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} dependencies: micromark-util-symbol: 1.1.0 dev: false + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + /micromark-util-resolve-all@1.1.0: resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} dependencies: micromark-util-types: 1.1.0 dev: false + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + /micromark-util-sanitize-uri@1.2.0: resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} dependencies: @@ -28050,6 +27909,14 @@ packages: micromark-util-symbol: 1.1.0 dev: false + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: false + /micromark-util-subtokenize@1.1.0: resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} dependencies: @@ -28059,14 +27926,31 @@ packages: uvu: 0.5.6 dev: false + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + /micromark-util-symbol@1.1.0: resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} dev: false + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + dev: false + /micromark-util-types@1.1.0: resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} dev: false + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + dev: false + /micromark@3.2.0: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: @@ -28091,6 +27975,30 @@ packages: - supports-color dev: false + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.10 + debug: 4.3.4(supports-color@8.1.1) + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -28151,7 +28059,6 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - dev: true /min-document@2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} @@ -28315,6 +28222,12 @@ packages: yallist: 4.0.0 dev: true + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + requiresBuild: true + dev: false + optional: true + /mkdirp-promise@5.0.1: resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} engines: {node: '>=4'} @@ -28597,7 +28510,6 @@ packages: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true /nanoid@4.0.2: resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} @@ -28767,6 +28679,31 @@ packages: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: lodash: 4.17.21 + dev: true + + /node-emoji@2.1.3: + resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + dev: false + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + requiresBuild: true + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + optional: true /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -28870,11 +28807,6 @@ packages: sort-keys: 2.0.0 dev: true - /normalize-url@4.5.1: - resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} - engines: {node: '>=8'} - dev: false - /normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} @@ -29236,11 +29168,6 @@ packages: engines: {node: '>=4'} dev: true - /p-cancelable@1.1.0: - resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} - engines: {node: '>=6'} - dev: false - /p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -29249,7 +29176,6 @@ packages: /p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} - dev: true /p-defer@3.0.0: resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} @@ -29351,7 +29277,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-limit: 4.0.0 - dev: true /p-map@3.0.0: resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} @@ -29437,14 +29362,14 @@ packages: release-zalgo: 1.0.0 dev: true - /package-json@6.5.0: - resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} - engines: {node: '>=8'} + /package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} dependencies: - got: 9.6.0 - registry-auth-token: 4.2.2 - registry-url: 5.1.0 - semver: 6.3.1 + got: 12.1.0 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.5.4 dev: false /pako@1.0.11: @@ -29477,15 +29402,17 @@ packages: /parse-duration@1.1.0: resolution: {integrity: sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==} - /parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 + '@types/unist': 2.0.9 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 dev: false /parse-filepath@1.0.2: @@ -29541,10 +29468,6 @@ packages: parse5: 7.1.2 dev: false - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false - /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: @@ -29592,7 +29515,6 @@ packages: /path-exists@5.0.0: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} @@ -29693,12 +29615,19 @@ packages: /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.3 + estree-walker: 3.0.3 + is-reference: 3.0.2 + dev: false + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -29792,7 +29721,6 @@ packages: engines: {node: '>=14.16'} dependencies: find-up: 6.3.0 - dev: true /pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} @@ -29839,17 +29767,17 @@ packages: engines: {node: '>=10.13.0'} dev: false - /postcss-calc@8.2.4(postcss@8.4.31): + /postcss-calc@8.2.4(postcss@8.4.32): resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 dev: false - /postcss-colormin@5.3.1(postcss@8.4.31): + /postcss-colormin@5.3.1(postcss@8.4.32): resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -29858,106 +29786,106 @@ packages: browserslist: 4.22.1 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-convert-values@5.1.3(postcss@8.4.31): + /postcss-convert-values@5.1.3(postcss@8.4.32): resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.22.1 - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-discard-comments@5.1.2(postcss@8.4.31): + /postcss-discard-comments@5.1.2(postcss@8.4.32): resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: false - /postcss-discard-duplicates@5.1.0(postcss@8.4.31): + /postcss-discard-duplicates@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: false - /postcss-discard-empty@5.1.1(postcss@8.4.31): + /postcss-discard-empty@5.1.1(postcss@8.4.32): resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: false - /postcss-discard-overridden@5.1.0(postcss@8.4.31): + /postcss-discard-overridden@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: false - /postcss-discard-unused@5.1.0(postcss@8.4.31): + /postcss-discard-unused@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: false - /postcss-loader@7.3.3(postcss@8.4.31)(typescript@4.9.5)(webpack@5.89.0): + /postcss-loader@7.3.3(postcss@8.4.32)(typescript@5.3.2)(webpack@5.89.0): resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} engines: {node: '>= 14.15.0'} peerDependencies: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 dependencies: - cosmiconfig: 8.3.6(typescript@4.9.5) + cosmiconfig: 8.3.6(typescript@5.3.2) jiti: 1.20.0 - postcss: 8.4.31 + postcss: 8.4.32 semver: 7.5.4 webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - typescript dev: false - /postcss-merge-idents@5.1.1(postcss@8.4.31): + /postcss-merge-idents@5.1.1(postcss@8.4.32): resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-merge-longhand@5.1.7(postcss@8.4.31): + /postcss-merge-longhand@5.1.7(postcss@8.4.32): resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.4.31) + stylehacks: 5.1.1(postcss@8.4.32) dev: false - /postcss-merge-rules@5.1.4(postcss@8.4.31): + /postcss-merge-rules@5.1.4(postcss@8.4.32): resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -29965,209 +29893,209 @@ packages: dependencies: browserslist: 4.22.1 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: false - /postcss-minify-font-values@5.1.0(postcss@8.4.31): + /postcss-minify-font-values@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-gradients@5.1.1(postcss@8.4.31): + /postcss-minify-gradients@5.1.1(postcss@8.4.32): resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-params@5.1.4(postcss@8.4.31): + /postcss-minify-params@5.1.4(postcss@8.4.32): resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.22.1 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-selectors@5.2.1(postcss@8.4.31): + /postcss-minify-selectors@5.2.1(postcss@8.4.32): resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: false - /postcss-modules-extract-imports@3.0.0(postcss@8.4.31): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.32): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: false - /postcss-modules-local-by-default@4.0.3(postcss@8.4.31): + /postcss-modules-local-by-default@4.0.3(postcss@8.4.32): resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 + icss-utils: 5.1.0(postcss@8.4.32) + postcss: 8.4.32 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 dev: false - /postcss-modules-scope@3.0.0(postcss@8.4.31): + /postcss-modules-scope@3.0.0(postcss@8.4.32): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: false - /postcss-modules-values@4.0.0(postcss@8.4.31): + /postcss-modules-values@4.0.0(postcss@8.4.32): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 + icss-utils: 5.1.0(postcss@8.4.32) + postcss: 8.4.32 dev: false - /postcss-normalize-charset@5.1.0(postcss@8.4.31): + /postcss-normalize-charset@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: false - /postcss-normalize-display-values@5.1.0(postcss@8.4.31): + /postcss-normalize-display-values@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-positions@5.1.1(postcss@8.4.31): + /postcss-normalize-positions@5.1.1(postcss@8.4.32): resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-repeat-style@5.1.1(postcss@8.4.31): + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.32): resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-string@5.1.0(postcss@8.4.31): + /postcss-normalize-string@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-timing-functions@5.1.0(postcss@8.4.31): + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-unicode@5.1.1(postcss@8.4.31): + /postcss-normalize-unicode@5.1.1(postcss@8.4.32): resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.22.1 - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-url@5.1.0(postcss@8.4.31): + /postcss-normalize-url@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-whitespace@5.1.1(postcss@8.4.31): + /postcss-normalize-whitespace@5.1.1(postcss@8.4.32): resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-ordered-values@5.1.3(postcss@8.4.31): + /postcss-ordered-values@5.1.3(postcss@8.4.32): resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-reduce-idents@5.2.0(postcss@8.4.31): + /postcss-reduce-idents@5.2.0(postcss@8.4.32): resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false - /postcss-reduce-initial@5.1.2(postcss@8.4.31): + /postcss-reduce-initial@5.1.2(postcss@8.4.32): resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -30175,16 +30103,16 @@ packages: dependencies: browserslist: 4.22.1 caniuse-api: 3.0.0 - postcss: 8.4.31 + postcss: 8.4.32 dev: false - /postcss-reduce-transforms@5.1.0(postcss@8.4.31): + /postcss-reduce-transforms@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: false @@ -30196,34 +30124,34 @@ packages: util-deprecate: 1.0.2 dev: false - /postcss-sort-media-queries@4.4.1(postcss@8.4.31): + /postcss-sort-media-queries@4.4.1(postcss@8.4.32): resolution: {integrity: sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.4.16 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 sort-css-media-queries: 2.1.0 dev: false - /postcss-svgo@5.1.0(postcss@8.4.31): + /postcss-svgo@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 svgo: 2.8.0 dev: false - /postcss-unique-selectors@5.1.1(postcss@8.4.31): + /postcss-unique-selectors@5.1.1(postcss@8.4.32): resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: false @@ -30231,13 +30159,13 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: false - /postcss-zindex@5.1.0(postcss@8.4.31): + /postcss-zindex@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: false /postcss@8.4.31: @@ -30255,7 +30183,6 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true /preact@10.18.1: resolution: {integrity: sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==} @@ -30273,6 +30200,7 @@ packages: /prepend-http@2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} engines: {node: '>=4'} + dev: true /prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} @@ -30378,11 +30306,13 @@ packages: react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) dev: false - /prism-react-renderer@1.3.5(react@18.2.0): - resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} + /prism-react-renderer@2.3.0(react@18.2.0): + resolution: {integrity: sha512-UYRg2TkVIaI6tRVHC5OJ4/BxqPUxJkJvq/odLT/ykpt1zGYXooNperUxQcCvi87LyRnR4nCh81ceOA+e7nrydg==} peerDependencies: - react: '>=0.14.9' + react: '>=16.0.0' dependencies: + '@types/prismjs': 1.26.3 + clsx: 2.0.0 react: 18.2.0 dev: false @@ -30467,16 +30397,14 @@ packages: resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} dev: false - /property-information@5.6.0: - resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} - dependencies: - xtend: 4.0.2 - dev: false - /property-information@6.3.0: resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==} dev: false + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: false + /protobufjs@6.11.4: resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} hasBin: true @@ -30579,16 +30507,53 @@ packages: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} - /pupa@2.1.1: - resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} - engines: {node: '>=8'} + /pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} dependencies: - escape-goat: 2.1.1 + escape-goat: 4.0.0 dev: false - /pure-color@1.3.0: - resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} + /puppeteer-core@18.2.1: + resolution: {integrity: sha512-MRtTAZfQTluz3U2oU/X2VqVWPcR1+94nbA2V6ZrSZRVEwLqZ8eclZ551qGFQD/vD2PYqHJwWOW/fpC721uznVw==} + engines: {node: '>=14.1.0'} + requiresBuild: true + dependencies: + cross-fetch: 3.1.5 + debug: 4.3.4(supports-color@8.1.1) + devtools-protocol: 0.0.1045489 + extract-zip: 2.0.1(supports-color@8.1.1) + https-proxy-agent: 5.0.1 + proxy-from-env: 1.1.0 + rimraf: 3.0.2 + tar-fs: 2.1.1 + unbzip2-stream: 1.4.3 + ws: 8.9.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate dev: false + optional: true + + /puppeteer@18.2.1: + resolution: {integrity: sha512-7+UhmYa7wxPh2oMRwA++k8UGVDxh3YdWFB52r9C3tM81T6BU7cuusUSxImz0GEYSOYUKk/YzIhkQ6+vc0gHbxQ==} + engines: {node: '>=14.1.0'} + deprecated: < 21.3.7 is no longer supported + requiresBuild: true + dependencies: + https-proxy-agent: 5.0.1 + progress: 2.0.3 + proxy-from-env: 1.1.0 + puppeteer-core: 18.2.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + optional: true /pure-rand@6.0.4: resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} @@ -30708,7 +30673,6 @@ packages: /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - dev: true /quick-lru@6.1.2: resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} @@ -30786,16 +30750,7 @@ packages: strip-json-comments: 2.0.1 dev: false - /react-base16-styling@0.6.0: - resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} - dependencies: - base16: 1.0.0 - lodash.curry: 4.1.1 - lodash.flow: 3.5.0 - pure-color: 1.3.0 - dev: false - - /react-dev-utils@12.0.1(eslint@8.52.0)(typescript@4.9.5)(webpack@5.89.0): + /react-dev-utils@12.0.1(eslint@8.52.0)(typescript@5.3.2)(webpack@5.89.0): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -30814,7 +30769,7 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.52.0)(typescript@4.9.5)(webpack@5.89.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.52.0)(typescript@5.3.2)(webpack@5.89.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -30829,7 +30784,7 @@ packages: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - typescript: 4.9.5 + typescript: 5.3.2 webpack: 5.89.0(webpack-cli@5.1.4) transitivePeerDependencies: - eslint @@ -30903,25 +30858,13 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - /react-json-view@1.21.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} + /react-json-view-lite@1.2.1(react@18.2.0): + resolution: {integrity: sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ==} + engines: {node: '>=14'} peerDependencies: - react: ^17.0.0 || ^16.3.0 || ^15.5.4 - react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 + react: ^16.13.1 || ^17.0.0 || ^18.0.0 dependencies: - flux: 4.0.4(react@18.2.0) react: 18.2.0 - react-base16-styling: 0.6.0 - react-dom: 18.2.0(react@18.2.0) - react-lifecycles-compat: 3.0.4 - react-textarea-autosize: 8.5.3(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - encoding - dev: false - - /react-lifecycles-compat@3.0.4: - resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} dev: false /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0): @@ -31149,20 +31092,6 @@ packages: tslib: 2.6.2 dev: false - /react-textarea-autosize@8.5.3(react@18.2.0): - resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} - engines: {node: '>=10'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@babel/runtime': 7.23.2 - react: 18.2.0 - use-composed-ref: 1.3.0(react@18.2.0) - use-latest: 1.2.1(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - dev: false - /react-toastify@9.1.3(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==} peerDependencies: @@ -31432,11 +31361,11 @@ packages: safe-buffer: 5.2.1 dev: false - /registry-auth-token@4.2.2: - resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} - engines: {node: '>=6.0.0'} + /registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} dependencies: - rc: 1.2.8 + '@pnpm/npm-conf': 2.2.2 dev: false /registry-url@3.1.0: @@ -31446,9 +31375,9 @@ packages: rc: 1.2.8 dev: false - /registry-url@5.1.0: - resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} - engines: {node: '>=8'} + /registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} dependencies: rc: 1.2.8 dev: false @@ -31459,6 +31388,14 @@ packages: dependencies: jsesc: 0.5.0 + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + dependencies: + '@types/hast': 3.0.3 + hast-util-raw: 9.0.1 + vfile: 6.0.1 + dev: false + /relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} @@ -31479,29 +31416,57 @@ packages: es6-error: 4.1.1 dev: true - /remark-emoji@2.2.0: - resolution: {integrity: sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==} + /remark-directive@3.0.0: + resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} dependencies: - emoticon: 3.2.0 - node-emoji: 1.11.0 - unist-util-visit: 2.0.3 + '@types/mdast': 4.0.3 + mdast-util-directive: 3.0.0 + micromark-extension-directive: 3.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color dev: false - /remark-footnotes@2.0.0: - resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==} + /remark-emoji@4.0.1: + resolution: {integrity: sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + '@types/mdast': 4.0.3 + emoticon: 4.0.1 + mdast-util-find-and-replace: 3.0.1 + node-emoji: 2.1.3 + unified: 11.0.4 dev: false - /remark-mdx@1.6.22: - resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==} + /remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.10.4 - '@babel/plugin-proposal-object-rest-spread': 7.12.1(@babel/core@7.12.9) - '@babel/plugin-syntax-jsx': 7.12.1(@babel/core@7.12.9) - '@mdx-js/util': 1.6.22 - is-alphabetical: 1.0.4 - remark-parse: 8.0.3 - unified: 9.2.0 + '@types/mdast': 4.0.3 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-mdx@3.0.0: + resolution: {integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==} + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 transitivePeerDependencies: - supports-color dev: false @@ -31516,25 +31481,15 @@ packages: - supports-color dev: false - /remark-parse@8.0.3: - resolution: {integrity: sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==} + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} dependencies: - ccount: 1.1.0 - collapse-white-space: 1.0.6 - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - is-whitespace-character: 1.0.4 - is-word-character: 1.0.4 - markdown-escapes: 1.0.4 - parse-entities: 2.0.0 - repeat-string: 1.6.1 - state-toggle: 1.0.3 - trim: 0.0.1 - trim-trailing-lines: 1.1.4 - unherit: 1.1.3 - unist-util-remove-position: 2.0.1 - vfile-location: 3.2.0 - xtend: 4.0.2 + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color dev: false /remark-rehype@10.1.0: @@ -31546,10 +31501,22 @@ packages: unified: 10.1.2 dev: false - /remark-squeeze-paragraphs@4.0.0: - resolution: {integrity: sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==} + /remark-rehype@11.0.0: + resolution: {integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==} + dependencies: + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.0.2 + unified: 11.0.4 + vfile: 6.0.1 + dev: false + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} dependencies: - mdast-squeeze-paragraphs: 4.0.0 + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 dev: false /remedial@1.0.8: @@ -31586,11 +31553,6 @@ packages: lodash: 4.17.21 strip-ansi: 6.0.1 - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: false - /req-cwd@2.0.0: resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} engines: {node: '>=4'} @@ -31662,7 +31624,6 @@ packages: /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} @@ -31746,12 +31707,12 @@ packages: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} dependencies: lowercase-keys: 1.0.1 + dev: true /responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} dependencies: lowercase-keys: 2.0.0 - dev: true /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} @@ -32038,13 +31999,14 @@ packages: resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} dev: false - /rtlcss@3.5.0: - resolution: {integrity: sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==} + /rtlcss@4.1.1: + resolution: {integrity: sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==} + engines: {node: '>=12.0.0'} hasBin: true dependencies: - find-up: 5.0.0 + escalade: 3.1.1 picocolors: 1.0.0 - postcss: 8.4.31 + postcss: 8.4.32 strip-json-comments: 3.1.1 dev: false @@ -32081,6 +32043,7 @@ packages: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: tslib: 2.6.2 + dev: true /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} @@ -32186,15 +32149,6 @@ packages: ajv-keywords: 3.5.2(ajv@6.12.6) dev: false - /schema-utils@2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} - dependencies: - '@types/json-schema': 7.0.14 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: false - /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -32270,11 +32224,11 @@ packages: engines: {node: '>=6'} dev: true - /semver-diff@3.1.1: - resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} - engines: {node: '>=8'} + /semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} dependencies: - semver: 6.3.1 + semver: 7.5.4 dev: false /semver@5.7.2: @@ -32520,7 +32474,7 @@ packages: jsonc-parser: 3.2.0 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 - dev: true + dev: false /shx@0.3.4: resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} @@ -32608,6 +32562,13 @@ packages: sax: 1.3.0 dev: false + /skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + dependencies: + unicode-emoji-modifier-base: 1.0.0 + dev: false + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -32875,10 +32836,6 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - /space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - dev: false - /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} dev: false @@ -32988,6 +32945,11 @@ packages: engines: {node: '>=6.0.0'} dev: true + /srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + dev: false + /sshpk@1.18.0: resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} @@ -33054,10 +33016,6 @@ packages: dependencies: type-fest: 0.7.1 - /state-toggle@1.0.3: - resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} - dev: false - /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -33068,10 +33026,10 @@ packages: /std-env@3.4.3: resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} + dev: true /std-env@3.6.0: resolution: {integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==} - dev: true /stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} @@ -33218,6 +33176,13 @@ packages: dependencies: safe-buffer: 5.2.1 + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + /stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} @@ -33325,16 +33290,16 @@ packages: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} dev: false - /style-to-object@0.3.0: - resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} dependencies: inline-style-parser: 0.1.1 dev: false - /style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + /style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} dependencies: - inline-style-parser: 0.1.1 + inline-style-parser: 0.2.2 dev: false /styled-jsx@5.1.1(@babel/core@7.23.5)(react@18.2.0): @@ -33355,14 +33320,14 @@ packages: react: 18.2.0 dev: false - /stylehacks@5.1.1(postcss@8.4.31): + /stylehacks@5.1.1(postcss@8.4.32): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.22.1 - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: false @@ -33545,6 +33510,17 @@ packages: tar-stream: 1.6.2 dev: true + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + requiresBuild: true + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + optional: true + /tar-stream@1.6.2: resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} engines: {node: '>= 0.8.0'} @@ -33558,6 +33534,19 @@ packages: xtend: 4.0.2 dev: true + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + optional: true + /tar@4.4.19: resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} engines: {node: '>=4.5'} @@ -33853,11 +33842,6 @@ packages: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - /to-readable-stream@1.0.0: - resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} - engines: {node: '>=6'} - dev: false - /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -33924,19 +33908,6 @@ packages: escape-string-regexp: 1.0.5 dev: true - /trim-trailing-lines@1.1.4: - resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} - dev: false - - /trim@0.0.1: - resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} - deprecated: Use String.prototype.trim() instead - dev: false - - /trough@1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - dev: false - /trough@2.1.0: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: false @@ -34163,6 +34134,16 @@ packages: typescript: 5.1.6 dev: true + /tsutils@3.21.0(typescript@5.3.2): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.3.2 + dev: true + /tsx@3.14.0: resolution: {integrity: sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==} hasBin: true @@ -34294,7 +34275,6 @@ packages: /type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} - dev: true /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} @@ -34389,15 +34369,7 @@ packages: dependencies: handlebars: 4.7.8 typedoc: 0.25.4(typescript@5.3.2) - dev: true - - /typedoc-plugin-missing-exports@2.1.0(typedoc@0.25.4): - resolution: {integrity: sha512-+1DhqZCEu7Vu5APnrqpPwl31D+hXpt1fV0Le9ycCRL1eLVdatdl6KVt4SEVwPxnEpKwgOn2dNX6I9+0F1aO2aA==} - peerDependencies: - typedoc: 0.24.x || 0.25.x - dependencies: - typedoc: 0.25.4(typescript@5.3.2) - dev: true + dev: false /typedoc@0.25.4(typescript@5.3.2): resolution: {integrity: sha512-Du9ImmpBCw54bX275yJrxPVnjdIyJO/84co0/L9mwe0R3G4FSR6rQ09AlXVRvZEGMUg09+z/usc8mgygQ1aidA==} @@ -34411,7 +34383,7 @@ packages: minimatch: 9.0.3 shiki: 0.14.5 typescript: 5.3.2 - dev: true + dev: false /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} @@ -34460,7 +34432,6 @@ packages: engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true - dev: true optional: true /uint8-varint@1.0.8: @@ -34515,7 +34486,6 @@ packages: dependencies: buffer: 5.7.1 through: 2.3.8 - dev: true /unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} @@ -34542,17 +34512,15 @@ packages: /unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} - /unherit@1.1.3: - resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} - dependencies: - inherits: 2.0.4 - xtend: 4.0.2 - dev: false - /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} + /unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + dev: false + /unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} @@ -34580,61 +34548,53 @@ packages: vfile: 5.3.7 dev: false - /unified@9.2.0: - resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==} - dependencies: - '@types/unist': 2.0.9 - bail: 1.0.5 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 2.1.0 - trough: 1.0.5 - vfile: 4.2.1 - dev: false - - /unified@9.2.2: - resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} dependencies: - '@types/unist': 2.0.9 - bail: 1.0.5 + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 2.1.0 - trough: 1.0.5 - vfile: 4.2.1 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 dev: false - /unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} dependencies: - crypto-random-string: 2.0.0 - dev: false - - /unist-builder@2.0.3: - resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} - dev: false - - /unist-util-generated@1.1.6: - resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} + crypto-random-string: 4.0.0 dev: false /unist-util-generated@2.0.1: resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} dev: false - /unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - dev: false - /unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} dependencies: '@types/unist': 2.0.9 dev: false - /unist-util-position@3.1.0: - resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + requiresBuild: true + dependencies: + '@types/unist': 2.0.9 + dev: false + optional: true + + /unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + dependencies: + '@types/unist': 3.0.2 dev: false /unist-util-position@4.0.4: @@ -34643,22 +34603,26 @@ packages: '@types/unist': 2.0.9 dev: false - /unist-util-remove-position@2.0.1: - resolution: {integrity: sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==} + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} dependencies: - unist-util-visit: 2.0.3 + '@types/unist': 3.0.2 dev: false - /unist-util-remove@2.1.0: - resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==} + /unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + requiresBuild: true dependencies: - unist-util-is: 4.1.0 + '@types/unist': 2.0.9 + unist-util-visit: 4.1.2 dev: false + optional: true - /unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} dependencies: - '@types/unist': 2.0.9 + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 dev: false /unist-util-stringify-position@3.0.3: @@ -34667,11 +34631,10 @@ packages: '@types/unist': 2.0.9 dev: false - /unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: - '@types/unist': 2.0.9 - unist-util-is: 4.1.0 + '@types/unist': 3.0.2 dev: false /unist-util-visit-parents@5.1.3: @@ -34681,12 +34644,11 @@ packages: unist-util-is: 5.2.1 dev: false - /unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} dependencies: - '@types/unist': 2.0.9 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 dev: false /unist-util-visit@4.1.2: @@ -34697,6 +34659,14 @@ packages: unist-util-visit-parents: 5.1.3 dev: false + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -34742,24 +34712,24 @@ packages: registry-url: 3.1.0 dev: false - /update-notifier@5.1.0: - resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} - engines: {node: '>=10'} + /update-notifier@6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} dependencies: - boxen: 5.1.2 - chalk: 4.1.2 - configstore: 5.0.1 - has-yarn: 2.1.0 - import-lazy: 2.1.0 - is-ci: 2.0.0 + boxen: 7.0.0 + chalk: 5.3.0 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 is-installed-globally: 0.4.0 - is-npm: 5.0.0 - is-yarn-global: 0.3.0 - latest-version: 5.1.0 - pupa: 2.1.1 + is-npm: 6.0.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.1.0 semver: 7.5.4 - semver-diff: 3.1.1 - xdg-basedir: 4.0.0 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 dev: false /upper-case-first@2.0.2: @@ -34799,6 +34769,7 @@ packages: engines: {node: '>=4'} dependencies: prepend-http: 2.0.0 + dev: true /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -34853,39 +34824,6 @@ packages: tslib: 2.6.2 dev: false - /use-composed-ref@1.3.0(react@18.2.0): - resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - dev: false - - /use-isomorphic-layout-effect@1.1.2(react@18.2.0): - resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - react: 18.2.0 - dev: false - - /use-latest@1.2.1(react@18.2.0): - resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - react: 18.2.0 - use-isomorphic-layout-effect: 1.1.2(react@18.2.0) - dev: false - /use-sidecar@1.1.2(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} @@ -35087,15 +35025,20 @@ packages: extsprintf: 1.3.0 dev: true - /vfile-location@3.2.0: - resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} + /vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + requiresBuild: true + dependencies: + '@types/unist': 2.0.9 + vfile: 5.3.7 dev: false + optional: true - /vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} dependencies: - '@types/unist': 2.0.9 - unist-util-stringify-position: 2.0.3 + '@types/unist': 3.0.2 + vfile: 6.0.1 dev: false /vfile-message@3.1.4: @@ -35105,13 +35048,11 @@ packages: unist-util-stringify-position: 3.0.3 dev: false - /vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} dependencies: - '@types/unist': 2.0.9 - is-buffer: 2.0.5 - unist-util-stringify-position: 2.0.3 - vfile-message: 2.0.4 + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 dev: false /vfile@5.3.7: @@ -35123,6 +35064,14 @@ packages: vfile-message: 3.1.4 dev: false + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + /viem@0.3.50(typescript@5.3.2): resolution: {integrity: sha512-s+LxCYZTR9F/qPk1/n1YDVAX9vSeVz7GraqBZWGrDuenCJxo9ArCoIceJ6ksI0WwSeNzcZ0VVbD/kWRzTxkipw==} dependencies: @@ -35447,11 +35396,11 @@ packages: /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: true + dev: false /vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - dev: true + dev: false /w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} @@ -35512,20 +35461,6 @@ packages: - zod dev: false - /wait-on@6.0.1: - resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} - engines: {node: '>=10.0.0'} - hasBin: true - dependencies: - axios: 0.25.0 - joi: 17.11.0 - lodash: 4.17.21 - minimist: 1.2.8 - rxjs: 7.8.1 - transitivePeerDependencies: - - debug - dev: false - /wait-on@7.0.1(debug@4.3.4): resolution: {integrity: sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==} engines: {node: '>=12.0.0'} @@ -35570,8 +35505,8 @@ packages: '@zxing/text-encoding': 0.9.0 dev: false - /web-namespaces@1.1.4: - resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} dev: false /web-streams-polyfill@3.2.1: @@ -35929,7 +35864,7 @@ packages: dependencies: '@discoveryjs/json-ext': 0.5.7 acorn: 8.10.0 - acorn-walk: 8.2.0 + acorn-walk: 8.3.1 commander: 7.2.0 escape-string-regexp: 4.0.0 gzip-size: 6.0.0 @@ -36105,7 +36040,7 @@ packages: chalk: 4.1.2 consola: 2.15.3 pretty-time: 1.1.0 - std-env: 3.4.3 + std-env: 3.6.0 webpack: 5.89.0(webpack-cli@5.1.4) dev: false @@ -36248,6 +36183,7 @@ packages: engines: {node: '>=8'} dependencies: string-width: 4.2.3 + dev: true /widest-line@4.0.1: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} @@ -36274,7 +36210,6 @@ packages: /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true /wordwrapjs@4.0.1: resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} @@ -36487,6 +36422,21 @@ packages: utf-8-validate: optional: true + /ws@8.9.0: + resolution: {integrity: sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==} + engines: {node: '>=10.0.0'} + requiresBuild: true + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + optional: true + /xdeployer@2.1.13(@nomicfoundation/hardhat-ethers@3.0.4)(ethers@6.8.0)(hardhat@2.18.3): resolution: {integrity: sha512-QxVsQ+zz+cnhzCIs7/e5F06nKjOD2Lb47nW52Jw3IzFQVeYv6NfvokhZiez+y8jkzwvHDwVru+fCVlml0GQGkw==} engines: {node: '>=14.0.0'} @@ -36500,9 +36450,9 @@ packages: hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) dev: true - /xdg-basedir@4.0.0: - resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} - engines: {node: '>=8'} + /xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} dev: false /xhr-request-promise@0.1.3: @@ -36685,7 +36635,6 @@ packages: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - dev: true /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} @@ -36765,6 +36714,6 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /zwitch@1.0.5: - resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false diff --git a/sdk/package.json b/sdk/package.json index 9e88d3fd..347941d1 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -70,16 +70,12 @@ "sinon": "^17.0.1", "sinon-chai": "^3.7.0", "ts-node": "^10.9.1", - "typedoc": "^0.25.4", - "typedoc-plugin-markdown": "^3.17.1", - "typedoc-plugin-missing-exports": "^2.0.0", "typescript": "5.3.2", "vitest": "^1.0.1" }, "scripts": { "build": "pnpm types:json && pnpm codegen && rollup -c", "codegen": "graphql-codegen", - "docs": "typedoc", "clean": "rm -rf ./dist", "prebuild": "pnpm clean", "prepack": "pnpm build", diff --git a/sdk/src/indexer/gql/graphql.ts b/sdk/src/indexer/gql/graphql.ts index 26091837..eb7fef8c 100644 --- a/sdk/src/indexer/gql/graphql.ts +++ b/sdk/src/indexer/gql/graphql.ts @@ -24,85 +24,6 @@ export type Scalars = { Int8: { input: any; output: any }; }; -export type AcceptedToken = { - __typename?: "AcceptedToken"; - accepted: Scalars["Boolean"]["output"]; - id: Scalars["String"]["output"]; - minimumAmountPerUnit: Scalars["BigInt"]["output"]; - token: Token; -}; - -export type AcceptedToken_Filter = { - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - accepted?: InputMaybe; - accepted_in?: InputMaybe>; - accepted_not?: InputMaybe; - accepted_not_in?: InputMaybe>; - and?: InputMaybe>>; - id?: InputMaybe; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_gt?: InputMaybe; - id_gte?: InputMaybe; - id_in?: InputMaybe>; - id_lt?: InputMaybe; - id_lte?: InputMaybe; - id_not?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - id_not_in?: InputMaybe>; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - minimumAmountPerUnit?: InputMaybe; - minimumAmountPerUnit_gt?: InputMaybe; - minimumAmountPerUnit_gte?: InputMaybe; - minimumAmountPerUnit_in?: InputMaybe>; - minimumAmountPerUnit_lt?: InputMaybe; - minimumAmountPerUnit_lte?: InputMaybe; - minimumAmountPerUnit_not?: InputMaybe; - minimumAmountPerUnit_not_in?: InputMaybe>; - or?: InputMaybe>>; - token?: InputMaybe; - token_?: InputMaybe; - token_contains?: InputMaybe; - token_contains_nocase?: InputMaybe; - token_ends_with?: InputMaybe; - token_ends_with_nocase?: InputMaybe; - token_gt?: InputMaybe; - token_gte?: InputMaybe; - token_in?: InputMaybe>; - token_lt?: InputMaybe; - token_lte?: InputMaybe; - token_not?: InputMaybe; - token_not_contains?: InputMaybe; - token_not_contains_nocase?: InputMaybe; - token_not_ends_with?: InputMaybe; - token_not_ends_with_nocase?: InputMaybe; - token_not_in?: InputMaybe>; - token_not_starts_with?: InputMaybe; - token_not_starts_with_nocase?: InputMaybe; - token_starts_with?: InputMaybe; - token_starts_with_nocase?: InputMaybe; -}; - -export enum AcceptedToken_OrderBy { - Accepted = "accepted", - Id = "id", - MinimumAmountPerUnit = "minimumAmountPerUnit", - Token = "token", - TokenDecimals = "token__decimals", - TokenId = "token__id", - TokenName = "token__name", - TokenSymbol = "token__symbol", -} - export type Allowlist = { __typename?: "Allowlist"; claim: Claim; @@ -209,20 +130,11 @@ export type ClaimToken = { __typename?: "ClaimToken"; claim: Claim; id: Scalars["String"]["output"]; - offers?: Maybe>; owner: Scalars["Bytes"]["output"]; tokenID: Scalars["BigInt"]["output"]; units: Scalars["BigInt"]["output"]; }; -export type ClaimTokenOffersArgs = { - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - skip?: InputMaybe; - where?: InputMaybe; -}; - export type ClaimToken_Filter = { /** Filter for the block changed event. */ _change_block?: InputMaybe; @@ -268,7 +180,6 @@ export type ClaimToken_Filter = { id_not_starts_with_nocase?: InputMaybe; id_starts_with?: InputMaybe; id_starts_with_nocase?: InputMaybe; - offers_?: InputMaybe; or?: InputMaybe>>; owner?: InputMaybe; owner_contains?: InputMaybe; @@ -309,7 +220,6 @@ export enum ClaimToken_OrderBy { ClaimTotalUnits = "claim__totalUnits", ClaimUri = "claim__uri", Id = "id", - Offers = "offers", Owner = "owner", TokenId = "tokenID", Units = "units", @@ -461,128 +371,6 @@ export enum Claim_OrderBy { Uri = "uri", } -export type Offer = { - __typename?: "Offer"; - acceptedTokens: Array; - fractionID: ClaimToken; - id: Scalars["String"]["output"]; - maxUnitsPerTrade: Scalars["BigInt"]["output"]; - minUnitsPerTrade: Scalars["BigInt"]["output"]; - status: OfferStatus; - unitsAvailable: Scalars["BigInt"]["output"]; -}; - -export type OfferAcceptedTokensArgs = { - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - skip?: InputMaybe; - where?: InputMaybe; -}; - -export enum OfferStatus { - Cancelled = "Cancelled", - Fulfilled = "Fulfilled", - Open = "Open", -} - -export type Offer_Filter = { - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - acceptedTokens?: InputMaybe>; - acceptedTokens_?: InputMaybe; - acceptedTokens_contains?: InputMaybe>; - acceptedTokens_contains_nocase?: InputMaybe>; - acceptedTokens_not?: InputMaybe>; - acceptedTokens_not_contains?: InputMaybe>; - acceptedTokens_not_contains_nocase?: InputMaybe>; - and?: InputMaybe>>; - fractionID?: InputMaybe; - fractionID_?: InputMaybe; - fractionID_contains?: InputMaybe; - fractionID_contains_nocase?: InputMaybe; - fractionID_ends_with?: InputMaybe; - fractionID_ends_with_nocase?: InputMaybe; - fractionID_gt?: InputMaybe; - fractionID_gte?: InputMaybe; - fractionID_in?: InputMaybe>; - fractionID_lt?: InputMaybe; - fractionID_lte?: InputMaybe; - fractionID_not?: InputMaybe; - fractionID_not_contains?: InputMaybe; - fractionID_not_contains_nocase?: InputMaybe; - fractionID_not_ends_with?: InputMaybe; - fractionID_not_ends_with_nocase?: InputMaybe; - fractionID_not_in?: InputMaybe>; - fractionID_not_starts_with?: InputMaybe; - fractionID_not_starts_with_nocase?: InputMaybe; - fractionID_starts_with?: InputMaybe; - fractionID_starts_with_nocase?: InputMaybe; - id?: InputMaybe; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_gt?: InputMaybe; - id_gte?: InputMaybe; - id_in?: InputMaybe>; - id_lt?: InputMaybe; - id_lte?: InputMaybe; - id_not?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - id_not_in?: InputMaybe>; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - maxUnitsPerTrade?: InputMaybe; - maxUnitsPerTrade_gt?: InputMaybe; - maxUnitsPerTrade_gte?: InputMaybe; - maxUnitsPerTrade_in?: InputMaybe>; - maxUnitsPerTrade_lt?: InputMaybe; - maxUnitsPerTrade_lte?: InputMaybe; - maxUnitsPerTrade_not?: InputMaybe; - maxUnitsPerTrade_not_in?: InputMaybe>; - minUnitsPerTrade?: InputMaybe; - minUnitsPerTrade_gt?: InputMaybe; - minUnitsPerTrade_gte?: InputMaybe; - minUnitsPerTrade_in?: InputMaybe>; - minUnitsPerTrade_lt?: InputMaybe; - minUnitsPerTrade_lte?: InputMaybe; - minUnitsPerTrade_not?: InputMaybe; - minUnitsPerTrade_not_in?: InputMaybe>; - or?: InputMaybe>>; - status?: InputMaybe; - status_in?: InputMaybe>; - status_not?: InputMaybe; - status_not_in?: InputMaybe>; - unitsAvailable?: InputMaybe; - unitsAvailable_gt?: InputMaybe; - unitsAvailable_gte?: InputMaybe; - unitsAvailable_in?: InputMaybe>; - unitsAvailable_lt?: InputMaybe; - unitsAvailable_lte?: InputMaybe; - unitsAvailable_not?: InputMaybe; - unitsAvailable_not_in?: InputMaybe>; -}; - -export enum Offer_OrderBy { - AcceptedTokens = "acceptedTokens", - FractionId = "fractionID", - FractionIdId = "fractionID__id", - FractionIdOwner = "fractionID__owner", - FractionIdTokenId = "fractionID__tokenID", - FractionIdUnits = "fractionID__units", - Id = "id", - MaxUnitsPerTrade = "maxUnitsPerTrade", - MinUnitsPerTrade = "minUnitsPerTrade", - Status = "status", - UnitsAvailable = "unitsAvailable", -} - /** Defines the order direction, either ascending or descending */ export enum OrderDirection { Asc = "asc", @@ -593,42 +381,18 @@ export type Query = { __typename?: "Query"; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; - acceptedToken?: Maybe; - acceptedTokens: Array; allowlist?: Maybe; allowlists: Array; claim?: Maybe; claimToken?: Maybe; claimTokens: Array; claims: Array; - offer?: Maybe; - offers: Array; - token?: Maybe; - tokens: Array; - trade?: Maybe; - trades: Array; }; export type Query_MetaArgs = { block?: InputMaybe; }; -export type QueryAcceptedTokenArgs = { - block?: InputMaybe; - id: Scalars["ID"]["input"]; - subgraphError?: _SubgraphErrorPolicy_; -}; - -export type QueryAcceptedTokensArgs = { - block?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - skip?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; - where?: InputMaybe; -}; - export type QueryAllowlistArgs = { block?: InputMaybe; id: Scalars["ID"]["input"]; @@ -677,94 +441,22 @@ export type QueryClaimsArgs = { where?: InputMaybe; }; -export type QueryOfferArgs = { - block?: InputMaybe; - id: Scalars["ID"]["input"]; - subgraphError?: _SubgraphErrorPolicy_; -}; - -export type QueryOffersArgs = { - block?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - skip?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; - where?: InputMaybe; -}; - -export type QueryTokenArgs = { - block?: InputMaybe; - id: Scalars["ID"]["input"]; - subgraphError?: _SubgraphErrorPolicy_; -}; - -export type QueryTokensArgs = { - block?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - skip?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; - where?: InputMaybe; -}; - -export type QueryTradeArgs = { - block?: InputMaybe; - id: Scalars["ID"]["input"]; - subgraphError?: _SubgraphErrorPolicy_; -}; - -export type QueryTradesArgs = { - block?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - skip?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; - where?: InputMaybe; -}; - export type Subscription = { __typename?: "Subscription"; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; - acceptedToken?: Maybe; - acceptedTokens: Array; allowlist?: Maybe; allowlists: Array; claim?: Maybe; claimToken?: Maybe; claimTokens: Array; claims: Array; - offer?: Maybe; - offers: Array; - token?: Maybe; - tokens: Array; - trade?: Maybe; - trades: Array; }; export type Subscription_MetaArgs = { block?: InputMaybe; }; -export type SubscriptionAcceptedTokenArgs = { - block?: InputMaybe; - id: Scalars["ID"]["input"]; - subgraphError?: _SubgraphErrorPolicy_; -}; - -export type SubscriptionAcceptedTokensArgs = { - block?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - skip?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; - where?: InputMaybe; -}; - export type SubscriptionAllowlistArgs = { block?: InputMaybe; id: Scalars["ID"]["input"]; @@ -813,267 +505,6 @@ export type SubscriptionClaimsArgs = { where?: InputMaybe; }; -export type SubscriptionOfferArgs = { - block?: InputMaybe; - id: Scalars["ID"]["input"]; - subgraphError?: _SubgraphErrorPolicy_; -}; - -export type SubscriptionOffersArgs = { - block?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - skip?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; - where?: InputMaybe; -}; - -export type SubscriptionTokenArgs = { - block?: InputMaybe; - id: Scalars["ID"]["input"]; - subgraphError?: _SubgraphErrorPolicy_; -}; - -export type SubscriptionTokensArgs = { - block?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - skip?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; - where?: InputMaybe; -}; - -export type SubscriptionTradeArgs = { - block?: InputMaybe; - id: Scalars["ID"]["input"]; - subgraphError?: _SubgraphErrorPolicy_; -}; - -export type SubscriptionTradesArgs = { - block?: InputMaybe; - first?: InputMaybe; - orderBy?: InputMaybe; - orderDirection?: InputMaybe; - skip?: InputMaybe; - subgraphError?: _SubgraphErrorPolicy_; - where?: InputMaybe; -}; - -export type Token = { - __typename?: "Token"; - decimals?: Maybe; - id: Scalars["String"]["output"]; - name: Scalars["String"]["output"]; - symbol?: Maybe; -}; - -export type Token_Filter = { - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - and?: InputMaybe>>; - decimals?: InputMaybe; - decimals_gt?: InputMaybe; - decimals_gte?: InputMaybe; - decimals_in?: InputMaybe>; - decimals_lt?: InputMaybe; - decimals_lte?: InputMaybe; - decimals_not?: InputMaybe; - decimals_not_in?: InputMaybe>; - id?: InputMaybe; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_gt?: InputMaybe; - id_gte?: InputMaybe; - id_in?: InputMaybe>; - id_lt?: InputMaybe; - id_lte?: InputMaybe; - id_not?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - id_not_in?: InputMaybe>; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - name?: InputMaybe; - name_contains?: InputMaybe; - name_contains_nocase?: InputMaybe; - name_ends_with?: InputMaybe; - name_ends_with_nocase?: InputMaybe; - name_gt?: InputMaybe; - name_gte?: InputMaybe; - name_in?: InputMaybe>; - name_lt?: InputMaybe; - name_lte?: InputMaybe; - name_not?: InputMaybe; - name_not_contains?: InputMaybe; - name_not_contains_nocase?: InputMaybe; - name_not_ends_with?: InputMaybe; - name_not_ends_with_nocase?: InputMaybe; - name_not_in?: InputMaybe>; - name_not_starts_with?: InputMaybe; - name_not_starts_with_nocase?: InputMaybe; - name_starts_with?: InputMaybe; - name_starts_with_nocase?: InputMaybe; - or?: InputMaybe>>; - symbol?: InputMaybe; - symbol_contains?: InputMaybe; - symbol_contains_nocase?: InputMaybe; - symbol_ends_with?: InputMaybe; - symbol_ends_with_nocase?: InputMaybe; - symbol_gt?: InputMaybe; - symbol_gte?: InputMaybe; - symbol_in?: InputMaybe>; - symbol_lt?: InputMaybe; - symbol_lte?: InputMaybe; - symbol_not?: InputMaybe; - symbol_not_contains?: InputMaybe; - symbol_not_contains_nocase?: InputMaybe; - symbol_not_ends_with?: InputMaybe; - symbol_not_ends_with_nocase?: InputMaybe; - symbol_not_in?: InputMaybe>; - symbol_not_starts_with?: InputMaybe; - symbol_not_starts_with_nocase?: InputMaybe; - symbol_starts_with?: InputMaybe; - symbol_starts_with_nocase?: InputMaybe; -}; - -export enum Token_OrderBy { - Decimals = "decimals", - Id = "id", - Name = "name", - Symbol = "symbol", -} - -export type Trade = { - __typename?: "Trade"; - amountPerUnit: Scalars["BigInt"]["output"]; - buyer: Scalars["Bytes"]["output"]; - id: Scalars["String"]["output"]; - offerID: Offer; - token: Token; - unitsSold: Scalars["BigInt"]["output"]; -}; - -export type Trade_Filter = { - /** Filter for the block changed event. */ - _change_block?: InputMaybe; - amountPerUnit?: InputMaybe; - amountPerUnit_gt?: InputMaybe; - amountPerUnit_gte?: InputMaybe; - amountPerUnit_in?: InputMaybe>; - amountPerUnit_lt?: InputMaybe; - amountPerUnit_lte?: InputMaybe; - amountPerUnit_not?: InputMaybe; - amountPerUnit_not_in?: InputMaybe>; - and?: InputMaybe>>; - buyer?: InputMaybe; - buyer_contains?: InputMaybe; - buyer_gt?: InputMaybe; - buyer_gte?: InputMaybe; - buyer_in?: InputMaybe>; - buyer_lt?: InputMaybe; - buyer_lte?: InputMaybe; - buyer_not?: InputMaybe; - buyer_not_contains?: InputMaybe; - buyer_not_in?: InputMaybe>; - id?: InputMaybe; - id_contains?: InputMaybe; - id_contains_nocase?: InputMaybe; - id_ends_with?: InputMaybe; - id_ends_with_nocase?: InputMaybe; - id_gt?: InputMaybe; - id_gte?: InputMaybe; - id_in?: InputMaybe>; - id_lt?: InputMaybe; - id_lte?: InputMaybe; - id_not?: InputMaybe; - id_not_contains?: InputMaybe; - id_not_contains_nocase?: InputMaybe; - id_not_ends_with?: InputMaybe; - id_not_ends_with_nocase?: InputMaybe; - id_not_in?: InputMaybe>; - id_not_starts_with?: InputMaybe; - id_not_starts_with_nocase?: InputMaybe; - id_starts_with?: InputMaybe; - id_starts_with_nocase?: InputMaybe; - offerID?: InputMaybe; - offerID_?: InputMaybe; - offerID_contains?: InputMaybe; - offerID_contains_nocase?: InputMaybe; - offerID_ends_with?: InputMaybe; - offerID_ends_with_nocase?: InputMaybe; - offerID_gt?: InputMaybe; - offerID_gte?: InputMaybe; - offerID_in?: InputMaybe>; - offerID_lt?: InputMaybe; - offerID_lte?: InputMaybe; - offerID_not?: InputMaybe; - offerID_not_contains?: InputMaybe; - offerID_not_contains_nocase?: InputMaybe; - offerID_not_ends_with?: InputMaybe; - offerID_not_ends_with_nocase?: InputMaybe; - offerID_not_in?: InputMaybe>; - offerID_not_starts_with?: InputMaybe; - offerID_not_starts_with_nocase?: InputMaybe; - offerID_starts_with?: InputMaybe; - offerID_starts_with_nocase?: InputMaybe; - or?: InputMaybe>>; - token?: InputMaybe; - token_?: InputMaybe; - token_contains?: InputMaybe; - token_contains_nocase?: InputMaybe; - token_ends_with?: InputMaybe; - token_ends_with_nocase?: InputMaybe; - token_gt?: InputMaybe; - token_gte?: InputMaybe; - token_in?: InputMaybe>; - token_lt?: InputMaybe; - token_lte?: InputMaybe; - token_not?: InputMaybe; - token_not_contains?: InputMaybe; - token_not_contains_nocase?: InputMaybe; - token_not_ends_with?: InputMaybe; - token_not_ends_with_nocase?: InputMaybe; - token_not_in?: InputMaybe>; - token_not_starts_with?: InputMaybe; - token_not_starts_with_nocase?: InputMaybe; - token_starts_with?: InputMaybe; - token_starts_with_nocase?: InputMaybe; - unitsSold?: InputMaybe; - unitsSold_gt?: InputMaybe; - unitsSold_gte?: InputMaybe; - unitsSold_in?: InputMaybe>; - unitsSold_lt?: InputMaybe; - unitsSold_lte?: InputMaybe; - unitsSold_not?: InputMaybe; - unitsSold_not_in?: InputMaybe>; -}; - -export enum Trade_OrderBy { - AmountPerUnit = "amountPerUnit", - Buyer = "buyer", - Id = "id", - OfferId = "offerID", - OfferIdId = "offerID__id", - OfferIdMaxUnitsPerTrade = "offerID__maxUnitsPerTrade", - OfferIdMinUnitsPerTrade = "offerID__minUnitsPerTrade", - OfferIdStatus = "offerID__status", - OfferIdUnitsAvailable = "offerID__unitsAvailable", - Token = "token", - TokenDecimals = "token__decimals", - TokenId = "token__id", - TokenName = "token__name", - TokenSymbol = "token__symbol", - UnitsSold = "unitsSold", -} - export type _Block_ = { __typename?: "_Block_"; /** The hash of the block */ diff --git a/sdk/src/utils/resolvers.ts b/sdk/src/utils/resolvers.ts deleted file mode 100644 index 7e096e05..00000000 --- a/sdk/src/utils/resolvers.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Resolvers } from "../../.graphclient"; - -const resolvers: Resolvers = { - Claim: { - graphName: (root, args, context) => root.graphName || context.graphName || "hypercerts-testnet", // The value we provide in the config - }, - ClaimToken: { - graphName: (root, args, context) => root.graphName || context.graphName || "hypercerts-testnet", // The value we provide in the config - }, -}; - -export { resolvers }; diff --git a/sdk/test/utils/errors.test.ts b/sdk/test/utils/errors.test.ts index 15ac9281..a69cc8e0 100644 --- a/sdk/test/utils/errors.test.ts +++ b/sdk/test/utils/errors.test.ts @@ -2,7 +2,6 @@ import { describe, it, beforeEach, afterAll, beforeAll } from "vitest"; import chai from "chai"; import assertionsCount from "chai-assertions-count"; import sinon from "sinon"; -import sinonChai from "sinon-chai"; import { ContractError, FetchError, MalformedDataError, UnsupportedChainError } from "../../src/types/errors"; import { handleSdkError } from "../../src/utils/errors"; @@ -18,7 +17,6 @@ import { parseEther, encodeErrorResult } from "viem"; chai.use(assertionsCount); const expect = chai.expect; -chai.use(sinonChai); describe("SDK Error handler", () => { it("handles SDK errors", () => { diff --git a/sdk/typedoc.json b/sdk/typedoc.json deleted file mode 100644 index b77283a1..00000000 --- a/sdk/typedoc.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "entryPoints": ["./src/index.ts"], - "out": "../docs/docs/developer/api/sdk", - "name": "Hypercerts SDK Documentation", - "tsconfig": "./tsconfig.json", - "cleanOutputDir": true, - "readme": "README.md", - "excludeExternals": true, - "exclude": ["**/hypercerts/contracts/**"], - "internalModule": "internal" -} From f1de3d6cc70b941c866da6dd21dfdbc088aa9952 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Fri, 8 Dec 2023 22:04:06 +0100 Subject: [PATCH 043/118] Feat/sdk npm docs release 1 (#1228) * chore(bump): released contracts 1.0.0 * chore(bump): update graph testnet deploy * chore(bump): sdk version 1.0.0 * chore(bump): update deps in fe * chore(bump): sdk 1.0.3 in fe * fix(lint): test type lint --- contracts/package.json | 2 +- .../interfaces/HypercertIndexerInterface.md | 36 +- docs/docs/developer/api/sdk/modules.md | 412 ++- .../merge-all-claim-fractions-button.tsx | 6 +- frontend/hooks/burnFraction.ts | 9 +- frontend/hooks/hypercerts-client.ts | 15 +- frontend/hooks/mergeFractionUnits.ts | 9 +- frontend/hooks/mintClaim.ts | 9 +- frontend/hooks/mintClaimAllowlist.ts | 9 +- frontend/hooks/mintFractionAllowlist.ts | 9 +- frontend/hooks/mintFractionAllowlistBatch.ts | 9 +- frontend/hooks/splitClaimUnits.ts | 9 +- frontend/lib/hypercert.test.ts | 3 - frontend/lib/hypercert.ts | 5 +- frontend/package.json | 4 +- graph/subgraph.yaml | 12 +- pnpm-lock.yaml | 3090 +---------------- sdk/package.json | 4 +- sdk/src/index.ts | 15 + 19 files changed, 598 insertions(+), 3069 deletions(-) diff --git a/contracts/package.json b/contracts/package.json index bd79c463..a8fa9340 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@hypercerts-org/contracts", "description": "EVM compatible protocol for managing impact claims", - "version": "1.0.0-alpha.7", + "version": "1.0.0", "author": { "name": "Hypercerts Foundation", "url": "https://github.com/hypercerts-org/hypercerts" diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md index dcda3dd2..351025e3 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -10,11 +10,11 @@ custom_edit_url: null ### claimById -• **claimById**: (`id`: `string`) => `Promise`<`undefined` \| `ClaimByIdQuery`\> +• **claimById**: (`id`: `string`) => `Promise`<`undefined` \| [`ClaimByIdQuery`](../modules.md#claimbyidquery)\> #### Type declaration -▸ (`id`): `Promise`<`undefined` \| `ClaimByIdQuery`\> +▸ (`id`): `Promise`<`undefined` \| [`ClaimByIdQuery`](../modules.md#claimbyidquery)\> ##### Parameters @@ -24,7 +24,7 @@ custom_edit_url: null ##### Returns -`Promise`<`undefined` \| `ClaimByIdQuery`\> +`Promise`<`undefined` \| [`ClaimByIdQuery`](../modules.md#claimbyidquery)\> #### Defined in @@ -34,11 +34,11 @@ sdk/src/types/indexer.ts:20 ### claimsByOwner -• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimsByOwnerQuery`\> +• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| [`ClaimsByOwnerQuery`](../modules.md#claimsbyownerquery)\> #### Type declaration -▸ (`owner`, `params?`): `Promise`<`undefined` \| `ClaimsByOwnerQuery`\> +▸ (`owner`, `params?`): `Promise`<`undefined` \| [`ClaimsByOwnerQuery`](../modules.md#claimsbyownerquery)\> ##### Parameters @@ -49,7 +49,7 @@ sdk/src/types/indexer.ts:20 ##### Returns -`Promise`<`undefined` \| `ClaimsByOwnerQuery`\> +`Promise`<`undefined` \| [`ClaimsByOwnerQuery`](../modules.md#claimsbyownerquery)\> #### Defined in @@ -59,11 +59,11 @@ sdk/src/types/indexer.ts:19 ### firstClaims -• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `RecentClaimsQuery`\> +• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| [`RecentClaimsQuery`](../modules.md#recentclaimsquery)\> #### Type declaration -▸ (`params?`): `Promise`<`undefined` \| `RecentClaimsQuery`\> +▸ (`params?`): `Promise`<`undefined` \| [`RecentClaimsQuery`](../modules.md#recentclaimsquery)\> ##### Parameters @@ -73,7 +73,7 @@ sdk/src/types/indexer.ts:19 ##### Returns -`Promise`<`undefined` \| `RecentClaimsQuery`\> +`Promise`<`undefined` \| [`RecentClaimsQuery`](../modules.md#recentclaimsquery)\> #### Defined in @@ -83,11 +83,11 @@ sdk/src/types/indexer.ts:21 ### fractionById -• **fractionById**: (`fractionId`: `string`) => `Promise`<`undefined` \| `ClaimTokenByIdQuery`\> +• **fractionById**: (`fractionId`: `string`) => `Promise`<`undefined` \| [`ClaimTokenByIdQuery`](../modules.md#claimtokenbyidquery)\> #### Type declaration -▸ (`fractionId`): `Promise`<`undefined` \| `ClaimTokenByIdQuery`\> +▸ (`fractionId`): `Promise`<`undefined` \| [`ClaimTokenByIdQuery`](../modules.md#claimtokenbyidquery)\> ##### Parameters @@ -97,7 +97,7 @@ sdk/src/types/indexer.ts:21 ##### Returns -`Promise`<`undefined` \| `ClaimTokenByIdQuery`\> +`Promise`<`undefined` \| [`ClaimTokenByIdQuery`](../modules.md#claimtokenbyidquery)\> #### Defined in @@ -107,11 +107,11 @@ sdk/src/types/indexer.ts:24 ### fractionsByClaim -• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> +• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| [`ClaimTokensByClaimQuery`](../modules.md#claimtokensbyclaimquery)\> #### Type declaration -▸ (`claimId`, `params?`): `Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> +▸ (`claimId`, `params?`): `Promise`<`undefined` \| [`ClaimTokensByClaimQuery`](../modules.md#claimtokensbyclaimquery)\> ##### Parameters @@ -122,7 +122,7 @@ sdk/src/types/indexer.ts:24 ##### Returns -`Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> +`Promise`<`undefined` \| [`ClaimTokensByClaimQuery`](../modules.md#claimtokensbyclaimquery)\> #### Defined in @@ -132,11 +132,11 @@ sdk/src/types/indexer.ts:23 ### fractionsByOwner -• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> +• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| [`ClaimTokensByOwnerQuery`](../modules.md#claimtokensbyownerquery)\> #### Type declaration -▸ (`owner`, `params?`): `Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> +▸ (`owner`, `params?`): `Promise`<`undefined` \| [`ClaimTokensByOwnerQuery`](../modules.md#claimtokensbyownerquery)\> ##### Parameters @@ -147,7 +147,7 @@ sdk/src/types/indexer.ts:23 ##### Returns -`Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> +`Promise`<`undefined` \| [`ClaimTokensByOwnerQuery`](../modules.md#claimtokensbyownerquery)\> #### Defined in diff --git a/docs/docs/developer/api/sdk/modules.md b/docs/docs/developer/api/sdk/modules.md index 0d5aa920..74f892af 100644 --- a/docs/docs/developer/api/sdk/modules.md +++ b/docs/docs/developer/api/sdk/modules.md @@ -59,6 +59,137 @@ sdk/src/types/hypercerts.ts:24 --- +### Claim + +Ƭ **Claim**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :-------------------------------------------- | +| `__typename?` | `"Claim"` | +| `allowlist?` | `Maybe`<`Allowlist`\> | +| `contract` | `Scalars`[`"String"`][``"output"``] | +| `creation` | `Scalars`[`"BigInt"`][``"output"``] | +| `creator?` | `Maybe`<`Scalars`[`"Bytes"`][``"output"``]\> | +| `id` | `Scalars`[`"String"`][``"output"``] | +| `owner?` | `Maybe`<`Scalars`[`"Bytes"`][``"output"``]\> | +| `tokenID` | `Scalars`[`"BigInt"`][``"output"``] | +| `totalUnits?` | `Maybe`<`Scalars`[`"BigInt"`][``"output"``]\> | +| `uri?` | `Maybe`<`Scalars`[`"String"`][``"output"``]\> | + +#### Defined in + +sdk/src/indexer/gql/graphql.ts:116 + +--- + +### ClaimByIdQuery + +Ƭ **ClaimByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claim?` | \{ `__typename?`: `"Claim"` ; `contract`: `string` ; `creator?`: `any` \| `null` ; `id`: `string` ; `owner?`: `any` \| `null` ; `tokenID`: `any` ; `totalUnits?`: `any` \| `null` ; `uri?`: `string` \| `null` } \| `null` | + +#### Defined in + +sdk/src/indexer/gql/graphql.ts:580 + +--- + +### ClaimToken + +Ƭ **ClaimToken**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------- | +| `__typename?` | `"ClaimToken"` | +| `claim` | [`Claim`](modules.md#claim) | +| `id` | `Scalars`[`"String"`][``"output"``] | +| `owner` | `Scalars`[`"Bytes"`][``"output"``] | +| `tokenID` | `Scalars`[`"BigInt"`][``"output"``] | +| `units` | `Scalars`[`"BigInt"`][``"output"``] | + +#### Defined in + +sdk/src/indexer/gql/graphql.ts:129 + +--- + +### ClaimTokenByIdQuery + +Ƭ **ClaimTokenByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claimToken?` | \{ `__typename?`: `"ClaimToken"` ; `claim`: \{ `__typename?`: `"Claim"` ; `creation`: `any` ; `id`: `string` ; `totalUnits?`: `any` \| `null` ; `uri?`: `string` \| `null` } ; `id`: `string` ; `owner`: `any` ; `tokenID`: `any` ; `units`: `any` } \| `null` | + +#### Defined in + +sdk/src/indexer/gql/graphql.ts:607 + +--- + +### ClaimTokensByClaimQuery + +Ƭ **ClaimTokensByClaimQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :--------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claimTokens` | \{ `__typename?`: `"ClaimToken"` ; `id`: `string` ; `owner`: `any` ; `tokenID`: `any` ; `units`: `any` }[] | + +#### Defined in + +sdk/src/indexer/gql/graphql.ts:600 + +--- + +### ClaimTokensByOwnerQuery + +Ƭ **ClaimTokensByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claimTokens` | \{ `__typename?`: `"ClaimToken"` ; `claim`: \{ `__typename?`: `"Claim"` ; `creation`: `any` ; `id`: `string` ; `totalUnits?`: `any` \| `null` ; `uri?`: `string` \| `null` } ; `id`: `string` ; `owner`: `any` ; `tokenID`: `any` ; `units`: `any` }[] | + +#### Defined in + +sdk/src/indexer/gql/graphql.ts:590 + +--- + +### ClaimsByOwnerQuery + +Ƭ **ClaimsByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claims` | \{ `__typename?`: `"Claim"` ; `contract`: `string` ; `creator?`: `any` \| `null` ; `id`: `string` ; `owner?`: `any` \| `null` ; `tokenID`: `any` ; `totalUnits?`: `any` \| `null` ; `uri?`: `string` \| `null` }[] | + +#### Defined in + +sdk/src/indexer/gql/graphql.ts:564 + +--- + ### Deployment Ƭ **Deployment**: `Object` @@ -80,6 +211,22 @@ sdk/src/types/client.ts:23 --- +### DocumentType + +Ƭ **DocumentType**<`TDocumentNode`\>: `TDocumentNode` extends `DocumentNode` ? `TType` : `never` + +#### Type parameters + +| Name | Type | +| :-------------- | :------------------------------------ | +| `TDocumentNode` | extends `DocumentNode`<`any`, `any`\> | + +#### Defined in + +sdk/src/indexer/gql/gql.ts:47 + +--- + ### EvaluationData Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) @@ -104,6 +251,22 @@ sdk/src/types/evaluation.d.ts:9 --- +### FragmentType + +Ƭ **FragmentType**<`TDocumentType`\>: `TDocumentType` extends `DocumentTypeDecoration` ? [`TType`] extends [\{ ` $fragmentName?`: infer TKey }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in TKey]: TType } } : `never` : `never` : `never` + +#### Type parameters + +| Name | Type | +| :-------------- | :---------------------------------------------- | +| `TDocumentType` | extends `DocumentTypeDecoration`<`any`, `any`\> | + +#### Defined in + +sdk/src/indexer/gql/fragment-masking.ts:6 + +--- + ### HypercertClientConfig Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & \{ `publicClient`: `PublicClient` ; `readOnly`: `boolean` ; `readOnlyReason?`: `string` ; `unsafeForceOverrideConfig?`: `boolean` ; `walletClient`: `WalletClient` } @@ -205,6 +368,23 @@ sdk/src/types/indexer.ts:10 --- +### RecentClaimsQuery + +Ƭ **RecentClaimsQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claims` | \{ `__typename?`: `"Claim"` ; `contract`: `string` ; `creator?`: `any` \| `null` ; `id`: `string` ; `owner?`: `any` \| `null` ; `tokenID`: `any` ; `totalUnits?`: `any` \| `null` ; `uri?`: `string` \| `null` }[] | + +#### Defined in + +sdk/src/indexer/gql/graphql.ts:573 + +--- + ### SupportedChainIds Ƭ **SupportedChainIds**: `5` \| `10` \| `42220` \| `11155111` @@ -251,7 +431,7 @@ sdk/src/types/hypercerts.ts:15 #### Defined in -node_modules/.pnpm/@hypercerts-org+contracts@1.0.0-alpha.6_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:1524 +node_modules/.pnpm/@hypercerts-org+contracts@1.0.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:1524 --- @@ -261,7 +441,7 @@ node_modules/.pnpm/@hypercerts-org+contracts@1.0.0-alpha.6_ts-node@10.9.1_typesc #### Defined in -node_modules/.pnpm/@hypercerts-org+contracts@1.0.0-alpha.6_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:352 +node_modules/.pnpm/@hypercerts-org+contracts@1.0.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:352 --- @@ -424,6 +604,81 @@ sdk/src/utils/allowlist.ts:35 --- +### graphql + +▸ **graphql**(`source`): `unknown` + +The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `source` | `string` | + +#### Returns + +`unknown` + +**`Example`** + +```ts +const query = graphql( + ` + query GetUser($id: ID!) { + user(id: $id) { + name + } + } + `, +); +``` + +The query argument is unknown! +Please regenerate the types. + +#### Defined in + +sdk/src/indexer/gql/gql.ts:32 + +▸ **graphql**(`source`): typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}"``] + +The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + +#### Parameters + +| Name | Type | +| :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `source` | `"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}"` | + +#### Returns + +typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}"``] + +#### Defined in + +sdk/src/indexer/gql/gql.ts:37 + +▸ **graphql**(`source`): typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}"``] + +The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + +#### Parameters + +| Name | Type | +| :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `source` | `"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}"` | + +#### Returns + +typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}"``] + +#### Defined in + +sdk/src/indexer/gql/gql.ts:41 + +--- + ### handleContractError ▸ **handleContractError**(`data`): [`ContractError`](classes/ContractError.md) @@ -466,6 +721,63 @@ sdk/src/utils/errors.ts:22 --- +### isFragmentReady + +▸ **isFragmentReady**<`TQuery`, `TFrag`\>(`queryNode`, `fragmentNode`, `data`): data is [TFrag] extends [Object] ? TKey extends string ? Object : never : never + +#### Type parameters + +| Name | +| :------- | +| `TQuery` | +| `TFrag` | + +#### Parameters + +| Name | Type | +| :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `queryNode` | `DocumentTypeDecoration`<`TQuery`, `any`\> | +| `fragmentNode` | `TypedDocumentNode`<`TFrag`, \{ `[key: string]`: `any`; }\> | +| `data` | `undefined` \| `null` \| [`Incremental`<`TFrag`\>] extends [\{ ` $fragmentName?`: `TKey` }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in string]: Object } } : `never` : `never` | + +#### Returns + +data is [TFrag] extends [Object] ? TKey extends string ? Object : never : never + +#### Defined in + +sdk/src/indexer/gql/fragment-masking.ts:51 + +--- + +### makeFragmentData + +▸ **makeFragmentData**<`F`, `FT`\>(`data`, `_fragment`): [`FragmentType`](modules.md#fragmenttype)<`F`\> + +#### Type parameters + +| Name | Type | +| :--- | :---------------------------------------------- | +| `F` | extends `DocumentTypeDecoration`<`any`, `any`\> | +| `FT` | extends `any` | + +#### Parameters + +| Name | Type | +| :---------- | :--- | +| `data` | `FT` | +| `_fragment` | `F` | + +#### Returns + +[`FragmentType`](modules.md#fragmenttype)<`F`\> + +#### Defined in + +sdk/src/indexer/gql/fragment-masking.ts:45 + +--- + ### publicClientToProvider ▸ **publicClientToProvider**(`publicClient`): `undefined` \| `FallbackProvider` \| `JsonRpcProvider` @@ -556,6 +868,102 @@ sdk/src/utils/adapters.ts:19 --- +### useFragment + +▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `TType` + +#### Type parameters + +| Name | +| :------ | +| `TType` | + +#### Parameters + +| Name | Type | +| :-------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- | +| `_documentNode` | `DocumentTypeDecoration`<`TType`, `any`\> | +| `fragmentType` | [`TType`] extends [\{ ` $fragmentName?`: `TKey` }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in string]: TType } } : `never` : `never` | + +#### Returns + +`TType` + +#### Defined in + +sdk/src/indexer/gql/fragment-masking.ts:18 + +▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `TType` \| `null` \| `undefined` + +#### Type parameters + +| Name | +| :------ | +| `TType` | + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `_documentNode` | `DocumentTypeDecoration`<`TType`, `any`\> | +| `fragmentType` | `undefined` \| `null` \| [`TType`] extends [\{ ` $fragmentName?`: `TKey` }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in string]: TType } } : `never` : `never` | + +#### Returns + +`TType` \| `null` \| `undefined` + +#### Defined in + +sdk/src/indexer/gql/fragment-masking.ts:23 + +▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> + +#### Type parameters + +| Name | +| :------ | +| `TType` | + +#### Parameters + +| Name | Type | +| :-------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `_documentNode` | `DocumentTypeDecoration`<`TType`, `any`\> | +| `fragmentType` | readonly [`TType`] extends [\{ ` $fragmentName?`: `TKey` }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in string]: TType } } : `never` : `never`[] | + +#### Returns + +`ReadonlyArray`<`TType`\> + +#### Defined in + +sdk/src/indexer/gql/fragment-masking.ts:28 + +▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> \| `null` \| `undefined` + +#### Type parameters + +| Name | +| :------ | +| `TType` | + +#### Parameters + +| Name | Type | +| :-------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `_documentNode` | `DocumentTypeDecoration`<`TType`, `any`\> | +| `fragmentType` | `undefined` \| `null` \| readonly [`TType`] extends [\{ ` $fragmentName?`: `TKey` }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in string]: TType } } : `never` : `never`[] | + +#### Returns + +`ReadonlyArray`<`TType`\> \| `null` \| `undefined` + +#### Defined in + +sdk/src/indexer/gql/fragment-masking.ts:33 + +--- + ### validateAllowlist ▸ **validateAllowlist**(`data`, `units`): `ValidationResult` diff --git a/frontend/components/merge-all-claim-fractions-button.tsx b/frontend/components/merge-all-claim-fractions-button.tsx index 55dd5a12..5aed1d2d 100644 --- a/frontend/components/merge-all-claim-fractions-button.tsx +++ b/frontend/components/merge-all-claim-fractions-button.tsx @@ -57,7 +57,7 @@ export function MergeAllClaimFractionsButton({ console.log("Fraction units", fractionUnits); const myFractions = fractionUnits.claimTokens.filter( - (fraction) => fraction.owner === address, + (fraction: { owner: string }) => fraction.owner === address, ); console.log("address", address); @@ -68,7 +68,9 @@ export function MergeAllClaimFractionsButton({ return; } - await write(myFractions.map((fraction) => fraction.tokenID)); + await write( + myFractions.map((fraction: { tokenID: any }) => fraction.tokenID), + ); }; const isDisabled = disabled || txPending || readOnly || isLoading; diff --git a/frontend/hooks/burnFraction.ts b/frontend/hooks/burnFraction.ts index 277d0632..bd896208 100644 --- a/frontend/hooks/burnFraction.ts +++ b/frontend/hooks/burnFraction.ts @@ -40,10 +40,17 @@ export const useBurnFraction = ({ const hash = await client.burnClaimFraction(claimId); + if (!hash) { + toast("No tx hash returned", { + type: "error", + }); + return; + } + const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, - hash: hash, + hash, }); setStep("waiting"); diff --git a/frontend/hooks/hypercerts-client.ts b/frontend/hooks/hypercerts-client.ts index 4ca52dda..ca7a63af 100644 --- a/frontend/hooks/hypercerts-client.ts +++ b/frontend/hooks/hypercerts-client.ts @@ -4,6 +4,11 @@ import { NFT_STORAGE_TOKEN, WEB3_STORAGE_TOKEN } from "../lib/config"; import { HypercertClient, HypercertClientConfig } from "@hypercerts-org/sdk"; import { useWalletClient, useNetwork } from "wagmi"; +const isSupportedChain = (chainId: number) => { + const supportedChainIds = [5, 10, 42220, 11155111]; // Replace with actual chain IDs + + return supportedChainIds.includes(chainId); +}; export const useHypercertClient = ({ overrideChainId, }: { @@ -16,7 +21,7 @@ export const useHypercertClient = ({ web3StorageToken: WEB3_STORAGE_TOKEN, }; const [client, setClient] = React.useState(() => { - if (clientConfig.chain?.id) { + if (clientConfig.chain?.id && isSupportedChain(clientConfig.chain.id)) { return new HypercertClient(clientConfig); } return null; @@ -31,7 +36,13 @@ export const useHypercertClient = ({ useEffect(() => { const chainId = overrideChainId || chain?.id; - if (chainId && !walletClientLoading && !isError && walletClient) { + if ( + chainId && + isSupportedChain(chainId) && + !walletClientLoading && + !isError && + walletClient + ) { setIsLoading(true); try { diff --git a/frontend/hooks/mergeFractionUnits.ts b/frontend/hooks/mergeFractionUnits.ts index 2a1e131b..4ad8a250 100644 --- a/frontend/hooks/mergeFractionUnits.ts +++ b/frontend/hooks/mergeFractionUnits.ts @@ -38,10 +38,17 @@ export const useMergeFractionUnits = ({ const hash = await client.mergeFractionUnits(ids); + if (!hash) { + toast("No tx hash returned", { + type: "error", + }); + return; + } + const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, - hash: hash, + hash, }); setStep("waiting"); diff --git a/frontend/hooks/mintClaim.ts b/frontend/hooks/mintClaim.ts index 75cbbf8c..30c13296 100644 --- a/frontend/hooks/mintClaim.ts +++ b/frontend/hooks/mintClaim.ts @@ -43,10 +43,17 @@ export const useMintClaim = ({ onComplete }: { onComplete?: () => void }) => { transferRestrictions, ); + if (!hash) { + toast("No tx hash returned", { + type: "error", + }); + return; + } + const receipt = await client.config.publicClient?.waitForTransactionReceipt({ confirmations: 3, - hash: hash, + hash, }); setStep("waiting"); diff --git a/frontend/hooks/mintClaimAllowlist.ts b/frontend/hooks/mintClaimAllowlist.ts index 6d8343e7..6e3536cd 100644 --- a/frontend/hooks/mintClaimAllowlist.ts +++ b/frontend/hooks/mintClaimAllowlist.ts @@ -136,10 +136,17 @@ export const useMintClaimAllowlist = ({ transferRestrictions, ); + if (!hash) { + toast("No tx hash returned", { + type: "error", + }); + return; + } + const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, - hash: hash, + hash, }); setStep("writing"); diff --git a/frontend/hooks/mintFractionAllowlist.ts b/frontend/hooks/mintFractionAllowlist.ts index f02a6980..457e17a3 100644 --- a/frontend/hooks/mintFractionAllowlist.ts +++ b/frontend/hooks/mintFractionAllowlist.ts @@ -49,10 +49,17 @@ export const useMintFractionAllowlist = ({ proof, ); + if (!hash) { + toast("No tx hash returned", { + type: "error", + }); + return; + } + const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, - hash: hash, + hash, }); setStep("waiting"); diff --git a/frontend/hooks/mintFractionAllowlistBatch.ts b/frontend/hooks/mintFractionAllowlistBatch.ts index 0b31564b..d8a84471 100644 --- a/frontend/hooks/mintFractionAllowlistBatch.ts +++ b/frontend/hooks/mintFractionAllowlistBatch.ts @@ -80,10 +80,17 @@ export const useMintFractionAllowlistBatch = ({ proofs, ); + if (!hash) { + toast("No tx hash returned", { + type: "error", + }); + return; + } + const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, - hash: hash, + hash, }); setStep("waiting"); diff --git a/frontend/hooks/splitClaimUnits.ts b/frontend/hooks/splitClaimUnits.ts index e1688969..06d2a19a 100644 --- a/frontend/hooks/splitClaimUnits.ts +++ b/frontend/hooks/splitClaimUnits.ts @@ -37,11 +37,18 @@ export const useSplitFractionUnits = ({ const hash = await client.splitFractionUnits(fractionId, fractions); + if (!hash) { + toast("No tx hash returned", { + type: "error", + }); + return; + } + setStep("waiting"); const publicClient = client.config.publicClient; const receipt = await publicClient?.waitForTransactionReceipt({ confirmations: 3, - hash: hash, + hash, }); if (receipt?.status === "reverted") { diff --git a/frontend/lib/hypercert.test.ts b/frontend/lib/hypercert.test.ts index a2d4c549..2ab8a21f 100644 --- a/frontend/lib/hypercert.test.ts +++ b/frontend/lib/hypercert.test.ts @@ -5,7 +5,6 @@ import { ClaimToken, Claim } from "@hypercerts-org/sdk"; type GenClaimTokenOptions = { contract?: string; owner?: string; - chainName?: string; units?: string; }; @@ -23,7 +22,6 @@ function genClaimTokens( id: id, tokenID: tokenID, owner: owner, - graphName: options?.chainName ?? "test", units: options?.units ?? "100", }); } @@ -37,7 +35,6 @@ function genClaim(totalUnits: string): Claim { contract: randomAddress(), tokenID: randomTokenID(), totalUnits: totalUnits, - graphName: "test", }; } diff --git a/frontend/lib/hypercert.ts b/frontend/lib/hypercert.ts index 379d7837..934c64f2 100644 --- a/frontend/lib/hypercert.ts +++ b/frontend/lib/hypercert.ts @@ -1,12 +1,11 @@ import { - ClaimByIdQuery, - ClaimTokensByClaimQuery, HypercertMetadata, HypercertClient, + ClaimByIdQuery, + ClaimTokensByClaimQuery, } from "@hypercerts-org/sdk"; import BN from "bn.js"; import { formatExternalUrl } from "./formatting"; - export interface Hypercert { getTokensFor(owner: string): HypercertTokens; metadata?: HypercertMetadata & { external_uri_formatted?: string }; diff --git a/frontend/package.json b/frontend/package.json index 1d944407..6b2a9172 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,9 +23,9 @@ "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@graphprotocol/client-cli": "^2.2.16", - "@hypercerts-org/contracts": "1.0.0-alpha.2", + "@hypercerts-org/contracts": "1.0.0", "@hypercerts-org/observabletreemap": "workspace: *", - "@hypercerts-org/sdk": "1.0.0-alpha.10", + "@hypercerts-org/sdk": "1.0.3", "@mui/icons-material": "^5.11.9", "@mui/material": "^5.11.2", "@mui/x-date-pickers": "^5.0.12", diff --git a/graph/subgraph.yaml b/graph/subgraph.yaml index 6b664dde..38924776 100644 --- a/graph/subgraph.yaml +++ b/graph/subgraph.yaml @@ -4,11 +4,11 @@ schema: dataSources: - kind: ethereum/contract name: HypercertMinter - network: celo + network: sepolia source: abi: HypercertMinter - address: "0x16ba53b74c234c870c61efc04cd418b8f2865959" - startBlock: 22079542 + address: "0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941" + startBlock: 4421942 mapping: kind: ethereum/events apiVersion: 0.0.7 @@ -33,9 +33,11 @@ dataSources: handler: handleLeafClaimed - event: OwnershipTransferred(indexed address,indexed address) handler: handleOwnershipTransferred - - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) + - event: TransferBatch(indexed address,indexed address,indexed + address,uint256[],uint256[]) handler: handleTransferBatch - - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) + - event: TransferSingle(indexed address,indexed address,indexed + address,uint256,uint256) handler: handleTransferSingle - event: URI(string,indexed uint256) handler: handleURI diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc9502a2..273da490 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -333,14 +333,14 @@ importers: specifier: ^2.2.16 version: 2.2.22(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': - specifier: 1.0.0-alpha.2 - version: 1.0.0-alpha.2(typescript@5.1.6) + specifier: 1.0.0 + version: 1.0.0(typescript@5.1.6) '@hypercerts-org/observabletreemap': specifier: 'workspace: *' version: link:../vendor/observabletreemap '@hypercerts-org/sdk': - specifier: 1.0.0-alpha.10 - version: 1.0.0-alpha.10(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4) + specifier: 1.0.3 + version: 1.0.3(node-fetch@3.3.2)(react@18.2.0)(typescript@5.1.6)(zod@3.22.4) '@mui/icons-material': specifier: ^5.11.9 version: 5.14.15(@mui/material@5.14.15)(@types/react@18.2.33)(react@18.2.0) @@ -556,8 +556,8 @@ importers: specifier: ^3.2.0 version: 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': - specifier: 1.0.0-alpha.6 - version: 1.0.0-alpha.6(ts-node@10.9.1)(typescript@5.3.2) + specifier: 1.0.0 + version: 1.0.0(ts-node@10.9.1)(typescript@5.3.2) '@openzeppelin/merkle-tree': specifier: ^1.0.5 version: 1.0.5 @@ -718,38 +718,6 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - /@achingbrain/ip-address@8.1.0: - resolution: {integrity: sha512-Zus4vMKVRDm+R1o0QJNhD0PD/8qRGO3Zx8YPsFG5lANt5utVtGg3iHVGBSAF80TfQmhi8rP+Kg/OigdxY0BXHw==} - engines: {node: '>= 12'} - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.2 - dev: false - - /@achingbrain/nat-port-mapper@1.0.12: - resolution: {integrity: sha512-rU4G75TEOTIPlkeDnPEVwx/VmMMFta42kY2SMmVobRkrtNLnxtU08Yhriu6tSBc9oO0wXdfNNeuLnNnEnL7w/A==} - dependencies: - '@achingbrain/ssdp': 4.0.6 - '@libp2p/logger': 3.0.4 - default-gateway: 7.2.2 - err-code: 3.0.1 - it-first: 3.0.3 - p-defer: 4.0.0 - p-timeout: 6.1.2 - xml2js: 0.6.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@achingbrain/ssdp@4.0.6: - resolution: {integrity: sha512-Y4JE2L9150i50V6lg/Y8+ilhxRpUZKKv+PKo68Aj7MjPfaUAar6ZHilF9h4/Zb3q0fqGMXNc9o11cQLNI8J8bA==} - dependencies: - event-iterator: 2.0.0 - freeport-promise: 2.0.0 - merge-options: 3.0.4 - xml2js: 0.6.2 - dev: false - /@adobe/css-tools@4.3.1: resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} dev: true @@ -2652,74 +2620,6 @@ packages: /@chainsafe/as-sha256@0.3.1: resolution: {integrity: sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==} - /@chainsafe/is-ip@2.0.2: - resolution: {integrity: sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA==} - dev: false - - /@chainsafe/libp2p-gossipsub@4.1.1: - resolution: {integrity: sha512-W3z52uTVm48qvwTAcE+tz6ML2CPWA4ErmuL2aCWAW8S7ce6iH8anqo+xI9rcedyIOChWMWLLD4Gtaj4TMrWacw==} - engines: {npm: '>=8.7.0'} - dependencies: - '@libp2p/components': 2.1.1 - '@libp2p/crypto': 1.0.17 - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interface-keys': 1.0.8 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-pubsub': 2.1.0 - '@libp2p/interface-registrar': 2.0.12 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-id': 1.1.18 - '@libp2p/peer-record': 4.0.5 - '@libp2p/pubsub': 3.1.3 - '@libp2p/topology': 3.0.2 - abortable-iterator: 4.0.3 - denque: 1.5.1 - err-code: 3.0.1 - it-length-prefixed: 8.0.4 - it-pipe: 2.0.5 - it-pushable: 3.2.1 - multiformats: 9.9.0 - protobufjs: 6.11.4 - uint8arraylist: 2.4.3 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@chainsafe/libp2p-noise@10.2.0: - resolution: {integrity: sha512-nXw09UwSE5JCiB5Dte6j0b0Qe+KbtepJvaPz/f5JyxcoyUfLE/t7XWRZAZmcuWBeVWWpOItnK5WmW8uocoiwCQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/crypto': 1.0.17 - '@libp2p/interface-connection-encrypter': 3.0.6 - '@libp2p/interface-keys': 1.0.8 - '@libp2p/interface-metrics': 4.0.8 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-id': 1.1.18 - '@stablelib/chacha20poly1305': 1.0.1 - '@stablelib/hkdf': 1.0.1 - '@stablelib/sha256': 1.0.1 - '@stablelib/x25519': 1.0.3 - it-length-prefixed: 8.0.4 - it-pair: 2.0.6 - it-pb-stream: 2.0.4 - it-pipe: 2.0.5 - it-stream-types: 1.0.5 - protons-runtime: 4.0.2(uint8arraylist@2.4.3) - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@chainsafe/netmask@2.0.0: - resolution: {integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==} - dependencies: - '@chainsafe/is-ip': 2.0.2 - dev: false - /@chainsafe/persistent-merkle-tree@0.4.2: resolution: {integrity: sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==} dependencies: @@ -4397,14 +4297,6 @@ packages: tslib: 2.6.2 dev: false - /@envelop/core@5.0.0: - resolution: {integrity: sha512-aJdnH/ptv+cvwfvciCBe7TSvccBwo9g0S5f6u35TBVzRVqIGkK03lFlIL+x1cnfZgN9EfR2b1PH2galrT1CdCQ==} - engines: {node: '>=18.0.0'} - dependencies: - '@envelop/types': 5.0.0 - tslib: 2.6.2 - dev: false - /@envelop/extended-validation@2.0.6(@envelop/core@3.0.6)(graphql@16.8.1): resolution: {integrity: sha512-aXAf1bg5Z71YfEKLCZ8OMUZAOYPGHV/a+7avd5TIMFNDxl5wJTmIonep3T+kdMpwRInDphfNPGFD0GcGdGxpHg==} peerDependencies: @@ -4417,46 +4309,12 @@ packages: tslib: 2.6.2 dev: false - /@envelop/extended-validation@4.0.0(@envelop/core@5.0.0)(graphql@16.8.1): - resolution: {integrity: sha512-pvJ/OL+C+lpNiiCXezHT+vP3PTq37MQicoOB1l5MdgOOZZWRAp0NDOgvEKcXUY7AWNpvNHgSE0QFSRfGwsfwFQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@envelop/core': ^5.0.0 - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@envelop/core': 5.0.0 - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - - /@envelop/graphql-jit@8.0.1(@envelop/core@5.0.0)(graphql@16.8.1): - resolution: {integrity: sha512-91AcH3W9qGaY3B2ynCLdAbOzPBqLIcsTOzjFUfbKPBxe4d18qKpgjnBPrZ7s0XcN0DD5SDRq61bkvowg2E2BGQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@envelop/core': ^5.0.0 - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@envelop/core': 5.0.0 - graphql: 16.8.1 - graphql-jit: 0.8.2(graphql@16.8.1) - tslib: 2.6.2 - value-or-promise: 1.0.12 - dev: false - /@envelop/types@3.0.2: resolution: {integrity: sha512-pOFea9ha0EkURWxJ/35axoH9fDGP5S2cUu/5Mmo9pb8zUf+TaEot8vB670XXihFEn/92759BMjLJNWBKmNhyng==} dependencies: tslib: 2.6.2 dev: false - /@envelop/types@5.0.0: - resolution: {integrity: sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA==} - engines: {node: '>=18.0.0'} - dependencies: - tslib: 2.6.2 - dev: false - /@envelop/validation-cache@5.1.3(@envelop/core@3.0.6)(graphql@16.8.1): resolution: {integrity: sha512-MkzcScQHJJQ/9YCAPdWShEi3xZv4F4neTs+NszzSrZOdlU8z/THuRt7gZ0sO0y2be+sx+SKjHQP8Gq3VXXcTTg==} peerDependencies: @@ -5180,10 +5038,10 @@ packages: - utf-8-validate dev: true - /@ethereum-attestation-service/eas-contracts@1.2.0-beta.1(typescript@5.1.6): - resolution: {integrity: sha512-NOicVFjm3UOY6HHmMPIpFTZJ7ieuETl7GRJyceW/CPPXxMMBBu9tf9eDVbVrDn6D7fYX3NMDIR39RoK5BhpWYA==} + /@ethereum-attestation-service/eas-contracts@1.3.7(ts-node@10.9.1)(typescript@5.3.2): + resolution: {integrity: sha512-msCKGDhqSjfkx0lbs0PPkf/Z6bWxaYT9ze/uLoRh1tM7W8N27mobX4g6AsjATqGC+eWHRfliK9eCwJQj7TU8WA==} dependencies: - hardhat: 2.18.2(typescript@5.1.6) + hardhat: 2.19.1(ts-node@10.9.1)(typescript@5.3.2) transitivePeerDependencies: - bufferutil - supports-color @@ -5192,10 +5050,10 @@ packages: - utf-8-validate dev: false - /@ethereum-attestation-service/eas-contracts@1.3.7(ts-node@10.9.1)(typescript@5.3.2): + /@ethereum-attestation-service/eas-contracts@1.3.7(typescript@5.1.6): resolution: {integrity: sha512-msCKGDhqSjfkx0lbs0PPkf/Z6bWxaYT9ze/uLoRh1tM7W8N27mobX4g6AsjATqGC+eWHRfliK9eCwJQj7TU8WA==} dependencies: - hardhat: 2.19.1(ts-node@10.9.1)(typescript@5.3.2) + hardhat: 2.19.1(typescript@5.1.6) transitivePeerDependencies: - bufferutil - supports-color @@ -5204,11 +5062,11 @@ packages: - utf-8-validate dev: false - /@ethereum-attestation-service/eas-sdk@1.2.2-beta.0(typescript@5.1.6): - resolution: {integrity: sha512-penkXiCKvHY8jN9UVV3B9IX001YnwWCNjbrBNE5e8Wy1rAzcPv7tqTBuvqXzjqmHfcASv7UFOIbfPEc5hd9mpA==} + /@ethereum-attestation-service/eas-sdk@1.3.7(ts-node@10.9.1)(typescript@5.3.2): + resolution: {integrity: sha512-7dmy3w/hIeUYGTvkoFIo/JSviiTK8qhjr0BKf7qK+xSPYt9rW9Qksw1njqC5G3OXyp5teaXCH05v75NOASYoSQ==} dependencies: - '@ethereum-attestation-service/eas-contracts': 1.2.0-beta.1(typescript@5.1.6) - ethers: 6.8.0 + '@ethereum-attestation-service/eas-contracts': 1.3.7(ts-node@10.9.1)(typescript@5.3.2) + ethers: 6.9.0 js-base64: 3.7.5 lodash: 4.17.21 multiformats: 9.9.0 @@ -5222,10 +5080,10 @@ packages: - utf-8-validate dev: false - /@ethereum-attestation-service/eas-sdk@1.3.7(ts-node@10.9.1)(typescript@5.3.2): + /@ethereum-attestation-service/eas-sdk@1.3.7(typescript@5.1.6): resolution: {integrity: sha512-7dmy3w/hIeUYGTvkoFIo/JSviiTK8qhjr0BKf7qK+xSPYt9rW9Qksw1njqC5G3OXyp5teaXCH05v75NOASYoSQ==} dependencies: - '@ethereum-attestation-service/eas-contracts': 1.3.7(ts-node@10.9.1)(typescript@5.3.2) + '@ethereum-attestation-service/eas-contracts': 1.3.7(typescript@5.1.6) ethers: 6.9.0 js-base64: 3.7.5 lodash: 4.17.21 @@ -5644,24 +5502,6 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): - resolution: {integrity: sha512-JJ++BVg4fhNCbLej105uHpabZesLsCSo9p43ZKSTT1VUdbuZtarzyIHC3uUmbvCfWQMVTCJEBZGx4l41oooOiw==} - peerDependencies: - '@graphql-mesh/types': ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 - '@graphql-tools/delegate': ^9.0.32 - '@graphql-tools/utils': ^9.2.1 - '@graphql-tools/wrap': ^9.4.2 - graphql: ^15.2.0 || ^16.0.0 - dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 9.0.35(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-tools/wrap': 9.4.2(graphql@16.8.1) - graphql: 16.8.1 - lodash: 4.17.21 - tslib: 2.6.2 - dev: false - /@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1): resolution: {integrity: sha512-p8eEyeBcqxCXLxC7CNgIhLSCd7bjiKToKnrwYPShVb26gIG2JdAmD3/mpjuR+QaMA4chN/EO5t+TGvq6KnFx9g==} peerDependencies: @@ -5760,21 +5600,6 @@ packages: tslib: 2.6.2 dev: false - /@graphprotocol/client-polling-live@2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1): - resolution: {integrity: sha512-JQ0sKiFCX+ErR0fynBNUg/WDiVaaEndlS12fkgrFZrQA2vVpSyow9pW0nKMGVZJa4cN+VDskgwqK5BWXMvdeRA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@envelop/core': ^2.4.2 || ^3.0.0 || ^4.0.0 - '@graphql-tools/merge': ^8.3.14 || ^9.0.0 - graphql: ^15.2.0 || ^16.0.0 - dependencies: - '@envelop/core': 3.0.6 - '@graphql-tools/merge': 8.4.2(graphql@16.8.1) - '@repeaterjs/repeater': 3.0.4 - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphprotocol/graph-cli@0.60.0(@types/node@18.18.7)(node-fetch@3.3.2)(typescript@4.9.5): resolution: {integrity: sha512-8tGaQJ0EzAPtkDXCAijFGoVdJXM+pKFlGxjiU31TdG5bS4cIUoSB6yWojVsFFod0yETAwf+giel/0/8sudYsDw==} engines: {node: '>=14'} @@ -6238,18 +6063,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-inspector/core@5.0.1(graphql@16.8.1): - resolution: {integrity: sha512-1CWfFYucnRdULGiN1NDSinlNlpucBT+0x4i4AIthKe5n5jD9RIVyJtkA8zBbujUFrP++YE3l+TQifwbN1yTQsw==} - engines: {node: '>=16.0.0'} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - dependency-graph: 0.11.0 - graphql: 16.8.1 - object-inspect: 1.12.3 - tslib: 2.6.0 - dev: false - /@graphql-mesh/cache-localforage@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-cY/LJ+XC8kiyPoLxqPAMlOAvaeB81CZafdadLNyNDFuu66qDiZqWTYPw/lnhp2nyeukC8o/P69oP7d2OqVaCZA==} peerDependencies: @@ -6265,22 +6078,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/cache-localforage@0.95.8(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-PgCTHh1dLwjmusWEWAMQkglL7gR8VyyT9pzTcYBVFhGYNXysepCrl85QtaqtEMnR/YijgpCWaKGIYK+bosQZsg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - graphql: 16.8.1 - localforage: 1.10.0 - tslib: 2.6.2 - dev: false - /@graphql-mesh/cli@0.82.35(@babel/core@7.23.5)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6): resolution: {integrity: sha512-5IuXpk+Zpg05u6qNPX19VzC5/HCiLdDRF6EPZ3ze57FIRgGA3YsB1CUGga6Ky3inalURYwx0kWqmdjbdKZYx1w==} hasBin: true @@ -6387,18 +6184,6 @@ packages: - react-native-windows dev: false - /@graphql-mesh/cross-helpers@0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1): - resolution: {integrity: sha512-NkLzFuY72tmmKO7gKWoDzoYcRVf3lLoCdlw30fSNKFKEWDAV3Tyh4v0fPvU3SEmoTJio7v0TIYZqtVt3dBBDFw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - dependencies: - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - path-browserify: 1.0.1 - dev: false - /@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: @@ -6429,41 +6214,6 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2): - resolution: {integrity: sha512-mEbz2XYSgRTdNidUBWB7FT3QzLliJwxJIoqipSbZNputJqSbUZZ6QD/oI1IrdPXqVl/ELE2CuLiogkOSO24C1Q==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/store': ^0.95.8 - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/federation': 1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) - '@graphql-tools/url-loader': 8.0.0(@types/node@18.18.7)(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - lodash.get: 4.4.2 - tslib: 2.6.2 - transitivePeerDependencies: - - '@types/node' - - bufferutil - - encoding - - graphql-ws - - react - - react-dom - - subscriptions-transport-ws - - utf-8-validate - dev: false - /@graphql-mesh/http@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-tdGEvijb3w2YJsncoh59ZobWLWpYPDmTd07XOYroJTg3m95zloFRJr/IzklKOsAa57zVIuRLCOfDju5m1m47CQ==} peerDependencies: @@ -6484,27 +6234,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/http@0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-38Mxw2K2RABBBO0IiXKZDu2o+jlM4vcUSEg+9h2Dz67oOJZHpKeId6z1PFb7uYMzAs29yoMcqXIEnews+HVhrQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/runtime': ^0.96.13 - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@whatwg-node/server': 0.9.16 - graphql: 16.8.1 - graphql-yoga: 5.0.0(graphql@16.8.1) - tslib: 2.6.2 - dev: false - /@graphql-mesh/merger-bare@0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-S/G3WSSa4+9YT320iRL/tODK4hTvepkQNUSzmddf3oz10xeyQD7hPJyOAnB6D+2dGVhaOTwmXJIueqevcAcP6Q==} peerDependencies: @@ -6525,27 +6254,6 @@ packages: - '@graphql-mesh/store' dev: false - /@graphql-mesh/merger-bare@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-E5R8Sv5Dkp+eswYKEDHgu8puwSeolPX1j9IHwBVe1npRRCXc3CjMsQJ9+kcTln453vbSBcM1a3fQspIaKA1Tcg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/merger-stitching': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/schema': 10.0.0(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - transitivePeerDependencies: - - '@graphql-mesh/store' - dev: false - /@graphql-mesh/merger-stitching@0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-8km5UFhKQGd0XY8bTBpHoBhVx/7qCkflPHLoTAguIWN8nJrcXJoqPamodci/U+2hudLAtRqhWosHu/8z7ctZpg==} peerDependencies: @@ -6568,28 +6276,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/merger-stitching@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-eAukU8AsjK8jIT3vFhalGoERh98xZgzKkTCQL7w2wPpFXveSDMn+9fVvCJ1EBKTsLa7SkNXqzAFkfYp21hW0ng==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/store': ^0.95.8 - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/schema': 10.0.0(graphql@16.8.1) - '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-8z9ag3jZLmkzawMzF6+i/+P1nQai+HmSZzNeJJen6fRkwprSM1Z7B4lfYBYhdiCbK11HHubDfw4LYwRuBcISMQ==} peerDependencies: @@ -6616,35 +6302,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@envelop/core': 5.0.0 - '@envelop/extended-validation': 4.0.0(@envelop/core@5.0.0)(graphql@16.8.1) - '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) - '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/executor': 1.2.0(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) - '@whatwg-node/fetch': 0.9.14 - graphql: 16.8.1 - graphql-jit: 0.8.2(graphql@16.8.1) - tslib: 2.6.2 - dev: false - /@graphql-mesh/store@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-OEljVuaZn2htU1rt4Yll/aJmynw3/Kvhd6eE8V0/del0u9iuLJqiKkzFJl8HUSMh0IkO10OnficJnTM0tCmxRw==} peerDependencies: @@ -6664,26 +6321,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/store@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-29lpMcvqS1DM9alUOCyj6he2V7ZzG/DZxkerRefT8Mo5FexwJZI3LeI0YHNSY9Cq0x8KzRoH1TWcTTN/1PDRRw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.8 - '@graphql-mesh/utils': ^0.95.8 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-inspector/core': 5.0.1(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphql-mesh/string-interpolation@0.4.4(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-IotswBYZRaPswOebcr2wuOFuzD3dHIJxVEkPiiQubqjUIR8HhQI22XHJv0WNiQZ65z8NR9+GYWwEDIc2JRCNfQ==} peerDependencies: @@ -6697,20 +6334,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/string-interpolation@0.5.3(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-/R4kj3M1uqUie/7RZ58zgRrT8RBrDsCCR6ii00s62DbLsl+jZYOZFyTqHGsFbP7L7aHnl0fo1dwhEJIs+rjCLg==} - engines: {node: '>=16.0.0'} - peerDependencies: - graphql: '*' - tslib: ^2.4.0 - dependencies: - dayjs: 1.11.10 - graphql: 16.8.1 - json-pointer: 0.6.2 - lodash.get: 4.4.2 - tslib: 2.6.2 - dev: false - /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} peerDependencies: @@ -6744,24 +6367,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/types@0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-H2xh5KGc3+Ly3VdAPnRdKTibZpW9zEFgUzsozL9MQhCs6WLX+/kOADb0uIDqYFKX5c/2axmcy87BFNOausXYig==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/store': ^0.95.8 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false - /@graphql-mesh/utils@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-U+VytfSoqPofH/pmYZHFY10SkIFtHKrvE7Isxv1d0DiweVjdH3Qtojw13DWFpu/EKtgJY5bqoVnlcsZJYlKQoA==} peerDependencies: @@ -6785,31 +6390,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/utils@0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): - resolution: {integrity: sha512-gH2/kXvxMHVWMX8DppIIZpFfSUaoKDJ6eQHFoAAsdabGE+vLtVk0OEYqMGVGtD/8ZDFa/P6CmwXc6hBzoLY6Kg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@graphql-mesh/cross-helpers': ^0.4.1 - '@graphql-mesh/types': ^0.95.8 - '@graphql-tools/utils': ^9.2.1 || ^10.0.0 - graphql: '*' - tslib: ^2.4.0 - dependencies: - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - '@whatwg-node/fetch': 0.9.14 - dset: 3.1.3 - graphql: 16.8.1 - js-yaml: 4.1.0 - lodash.get: 4.4.2 - lodash.topath: 4.5.2 - tiny-lru: 11.2.3 - tslib: 2.6.2 - dev: false - /@graphql-tools/apollo-engine-loader@8.0.0(graphql@16.8.1): resolution: {integrity: sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg==} engines: {node: '>=16.0.0'} @@ -6838,20 +6418,6 @@ packages: value-or-promise: 1.0.12 dev: false - /@graphql-tools/batch-delegate@9.0.0(graphql@16.8.1): - resolution: {integrity: sha512-23NmxcHQeKcfhMQyrRPTZfW4/+bSpAyR/qAhRjx+/hikDIa1Uv2XVgV9jIitSgM0OEk/KGPB4VQv+LCOWvAYiw==} - engines: {node: '>=16.0.0'} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - dependencies: - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/utils': 10.0.7(graphql@16.8.1) - dataloader: 2.2.2 - graphql: 16.8.1 - tslib: 2.6.2 - value-or-promise: 1.0.12 - dev: false - /@graphql-tools/batch-execute@8.5.22(graphql@16.8.1): resolution: {integrity: sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A==} peerDependencies: @@ -6875,6 +6441,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: true /@graphql-tools/code-file-loader@7.3.23(@babel/core@7.23.5)(graphql@16.8.1): resolution: {integrity: sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==} @@ -6921,6 +6488,7 @@ packages: dataloader: 2.2.2 graphql: 16.8.1 tslib: 2.6.2 + dev: true /@graphql-tools/delegate@9.0.35(graphql@16.8.1): resolution: {integrity: sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA==} @@ -6982,6 +6550,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true /@graphql-tools/executor-http@0.1.10(@types/node@18.18.7)(graphql@16.8.1): resolution: {integrity: sha512-hnAfbKv0/lb9s31LhWzawQ5hghBfHS+gYWtqxME6Rl0Aufq9GltiiLBcl7OVVOnkLF0KhwgbYP1mB5VKmgTGpg==} @@ -7017,6 +6586,7 @@ packages: value-or-promise: 1.0.12 transitivePeerDependencies: - '@types/node' + dev: true /@graphql-tools/executor-legacy-ws@0.0.11(graphql@16.8.1): resolution: {integrity: sha512-4ai+NnxlNfvIQ4c70hWFvOZlSUN8lt7yc+ZsrwtNFbFPH/EroIzFMapAxM9zwyv9bH38AdO3TQxZ5zNxgBdvUw==} @@ -7049,6 +6619,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true /@graphql-tools/executor@0.0.18(graphql@16.8.1): resolution: {integrity: sha512-xZC0C+/npXoSHBB5bsJdwxDLgtl1Gu4fL9J2TPQmXoZC3L2N506KJoppf9LgWdHU/xK04luJrhP6WjhfkIN0pQ==} @@ -7088,32 +6659,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - - /@graphql-tools/federation@1.1.10(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-H51qTYwbtfIYBO1uHXlImRWzo9tknSoIGBgJckDh+hdxJx43sZaMjJiLHc2DjRc/A8d2Bf0bi0HbH++HqOos/w==} - engines: {node: '>=16.0.0'} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - dependencies: - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/executor-http': 1.0.3(@types/node@18.18.7)(graphql@16.8.1) - '@graphql-tools/merge': 9.0.1(graphql@16.8.1) - '@graphql-tools/schema': 10.0.0(graphql@16.8.1) - '@graphql-tools/stitch': 9.0.3(graphql@16.8.1) - '@graphql-tools/utils': 10.0.11(graphql@16.8.1) - '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - value-or-promise: 1.0.12 - optionalDependencies: - '@apollo/client': 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) - transitivePeerDependencies: - - '@types/node' - - graphql-ws - - react - - react-dom - - subscriptions-transport-ws - dev: false + dev: true /@graphql-tools/git-loader@8.0.3(graphql@16.8.1): resolution: {integrity: sha512-Iz9KbRUAkuOe8JGTS0qssyJ+D5Snle17W+z9anwWrLFrkBhHrRFUy5AdjZqgJuhls0x30QkZBnnCtnHDBdQ4nA==} @@ -7294,6 +6840,7 @@ packages: '@graphql-tools/utils': 10.0.11(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 + dev: true /@graphql-tools/optimize@1.4.0(graphql@16.8.1): resolution: {integrity: sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==} @@ -7387,6 +6934,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: true /@graphql-tools/schema@10.0.2(graphql@16.8.1): resolution: {integrity: sha512-TbPsIZnWyDCLhgPGnDjt4hosiNU2mF/rNtSk5BVaXWnZqvKJ6gzJV4fcHcvhRIwtscDMW2/YTnK6dLVnk8pc4w==} @@ -7399,6 +6947,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: true /@graphql-tools/schema@9.0.19(graphql@16.8.1): resolution: {integrity: sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==} @@ -7429,24 +6978,6 @@ packages: value-or-promise: 1.0.12 dev: false - /@graphql-tools/stitch@9.0.3(graphql@16.8.1): - resolution: {integrity: sha512-G03XahiHDu1pnaS8z2GNfsV/5BribMEUATT5dCHBAqj13Te5y1amZNQePrmw8DLtbf5qDbU6CO7kGHPxv0XO9A==} - engines: {node: '>=16.0.0'} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - dependencies: - '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) - '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) - '@graphql-tools/executor': 1.2.0(graphql@16.8.1) - '@graphql-tools/merge': 9.0.1(graphql@16.8.1) - '@graphql-tools/schema': 10.0.2(graphql@16.8.1) - '@graphql-tools/utils': 10.0.11(graphql@16.8.1) - '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - value-or-promise: 1.0.12 - dev: false - /@graphql-tools/stitching-directives@2.3.34(graphql@16.8.1): resolution: {integrity: sha512-DVlo1/SW9jN6jN1IL279c7voEJiEHsLbYRD7tYsAW472zrHqn0rpB6jRzZDzLOlCpm7JRWPsegXVlkqf0qvqFQ==} peerDependencies: @@ -7509,6 +7040,7 @@ packages: - bufferutil - encoding - utf-8-validate + dev: true /@graphql-tools/utils@10.0.11(graphql@16.8.1): resolution: {integrity: sha512-vVjXgKn6zjXIlYBd7yJxCVMYGb5j18gE3hx3Qw3mNsSEsYQXbJbPdlwb7Fc9FogsJei5AaqiQerqH4kAosp1nQ==} @@ -7521,6 +7053,7 @@ packages: dset: 3.1.3 graphql: 16.8.1 tslib: 2.6.2 + dev: true /@graphql-tools/utils@10.0.7(graphql@16.8.1): resolution: {integrity: sha512-KOdeMj6Hd/MENDaqPbws3YJl3wVy0DeYnL7PyUms5Skyf7uzI9INynDwPMhLXfSb0/ph6BXTwMd5zBtWbF8tBQ==} @@ -7532,6 +7065,7 @@ packages: dset: 3.1.3 graphql: 16.8.1 tslib: 2.6.2 + dev: true /@graphql-tools/utils@8.13.1(graphql@16.8.1): resolution: {integrity: sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==} @@ -7564,6 +7098,7 @@ packages: graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 + dev: true /@graphql-tools/wrap@9.4.2(graphql@16.8.1): resolution: {integrity: sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA==} @@ -7591,13 +7126,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-yoga/logger@2.0.0: - resolution: {integrity: sha512-Mg8psdkAp+YTG1OGmvU+xa6xpsAmSir0hhr3yFYPyLNwzUj95DdIwsMpKadDj9xDpYgJcH3Hp/4JMal9DhQimA==} - engines: {node: '>=18.0.0'} - dependencies: - tslib: 2.6.2 - dev: false - /@graphql-yoga/subscription@3.1.0: resolution: {integrity: sha512-Vc9lh8KzIHyS3n4jBlCbz7zCjcbtQnOBpsymcRvHhFr2cuH+knmRn0EmzimMQ58jQ8kxoRXXC3KJS3RIxSdPIg==} dependencies: @@ -7607,16 +7135,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-yoga/subscription@5.0.0: - resolution: {integrity: sha512-Ri7sK8hmxd/kwaEa0YT8uqQUb2wOLsmBMxI90QDyf96lzOMJRgBuNYoEkU1pSgsgmW2glceZ96sRYfaXqwVxUw==} - engines: {node: '>=18.0.0'} - dependencies: - '@graphql-yoga/typed-event-target': 3.0.0 - '@repeaterjs/repeater': 3.0.4 - '@whatwg-node/events': 0.1.1 - tslib: 2.6.2 - dev: false - /@graphql-yoga/typed-event-target@1.0.0: resolution: {integrity: sha512-Mqni6AEvl3VbpMtKw+TIjc9qS9a8hKhiAjFtqX488yq5oJtj9TkNlFTIacAVS3vnPiswNsmDiQqvwUOcJgi1DA==} dependencies: @@ -7624,14 +7142,6 @@ packages: tslib: 2.6.2 dev: false - /@graphql-yoga/typed-event-target@3.0.0: - resolution: {integrity: sha512-w+liuBySifrstuHbFrHoHAEyVnDFVib+073q8AeAJ/qqJfvFvAwUPLLtNohR/WDVRgSasfXtl3dcNuVJWN+rjg==} - engines: {node: '>=18.0.0'} - dependencies: - '@repeaterjs/repeater': 3.0.4 - tslib: 2.6.2 - dev: false - /@hapi/hoek@9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -7676,10 +7186,10 @@ packages: resolution: {integrity: sha512-n6fwMsaoR50VITM2upR4OOi4EZJmZvU6vvXrHWCSakP9e1OeDuAOk+kHiK+egqDRYj6uKtg9VTUFKZBYvu3jRg==} dev: false - /@hypercerts-org/contracts@1.0.0-alpha.2(typescript@5.1.6): - resolution: {integrity: sha512-I9TMEyN4cKW3Gfv3Wysk9xoZzwpUjI+dgCECJVjBlInRiCxnaUdahBSqhVvKg1gViWaPMDvDGe5v9jVknZIN/A==} + /@hypercerts-org/contracts@1.0.0(ts-node@10.9.1)(typescript@5.3.2): + resolution: {integrity: sha512-pGdG3BGDz93IZXAAHcvwzRQOMgi9dOzy2ZLdRFKIdWMBoVz8uCQL03HCYutT5DOtVm2g+j2dcor+zSV5yUM5Dg==} dependencies: - hardhat: 2.18.3(typescript@5.1.6) + hardhat: 2.19.1(ts-node@10.9.1)(typescript@5.3.2) transitivePeerDependencies: - bufferutil - supports-color @@ -7688,10 +7198,10 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/contracts@1.0.0-alpha.6(ts-node@10.9.1)(typescript@5.3.2): - resolution: {integrity: sha512-8XV9jlj5P+WL+hFX56OP+cYpLDwicZoGteN3ZAPHc1Y07fy7I2tpx1/MU7Sg2GX2nVO46Xix1MblQxVzx0Xy8Q==} + /@hypercerts-org/contracts@1.0.0(typescript@5.1.6): + resolution: {integrity: sha512-pGdG3BGDz93IZXAAHcvwzRQOMgi9dOzy2ZLdRFKIdWMBoVz8uCQL03HCYutT5DOtVm2g+j2dcor+zSV5yUM5Dg==} dependencies: - hardhat: 2.18.3(ts-node@10.9.1)(typescript@5.3.2) + hardhat: 2.19.1(typescript@5.1.6) transitivePeerDependencies: - bufferutil - supports-color @@ -7700,57 +7210,35 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/sdk@1.0.0-alpha.10(@envelop/core@3.0.6)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(node-fetch@3.3.2)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2)(typescript@5.1.6)(uint8arraylist@2.4.3)(zod@3.22.4): - resolution: {integrity: sha512-PEGKxzxhGZuz0cjYCCj90+bBmbfU4n1mP+q911Kx6jZ0g5sQyj+m685x0cq8OIL4JnYNPShZ2OWDjcX93KzbBA==} + /@hypercerts-org/sdk@1.0.3(node-fetch@3.3.2)(react@18.2.0)(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-drZy1kVFuSbelIBgM51ScJNOyahDKTrNIALO9ApIA7ZnoBC5hr3zsMwzpUCmq3AvPQTu6PssPoeJY28Hru40+A==} dependencies: - '@ethereum-attestation-service/eas-sdk': 1.2.2-beta.0(typescript@5.1.6) + '@ethereum-attestation-service/eas-sdk': 1.3.7(typescript@5.1.6) '@ethersproject/abstract-signer': 5.7.0 - '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.95.8)(@graphql-tools/delegate@9.0.35)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(graphql@16.8.1) - '@graphprotocol/client-polling-live': 2.0.0(@envelop/core@3.0.6)(@graphql-tools/merge@8.4.2)(graphql@16.8.1) - '@graphql-mesh/cache-localforage': 0.95.8(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/graphql': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) - '@graphql-mesh/http': 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/merger-bare': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@hypercerts-org/contracts': 1.0.0-alpha.2(typescript@5.1.6) + '@hypercerts-org/contracts': 1.0.0(typescript@5.1.6) '@openzeppelin/merkle-tree': 1.0.5 + '@urql/core': 4.2.0(graphql@16.8.1) '@whatwg-node/fetch': 0.9.14 ajv: 8.12.0 - axios: 1.5.1(debug@4.3.4) + axios: 1.6.2(debug@4.3.4) dotenv: 16.3.1 ethers: 5.7.2 graphql: 16.8.1 - ipfs-core: 0.17.0(uint8arraylist@2.4.3) loglevel: 1.8.1 - mime: 3.0.0 nft.storage: 7.1.1(node-fetch@3.3.2) + urql: 4.0.6(graphql@16.8.1)(react@18.2.0) viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) web3.storage: 4.5.5(node-fetch@3.3.2) transitivePeerDependencies: - - '@envelop/core' - - '@graphql-tools/delegate' - - '@graphql-tools/merge' - - '@graphql-tools/utils' - - '@graphql-tools/wrap' - - '@types/node' - bufferutil - debug - encoding - - graphql-ws - node-fetch - react - - react-dom - - subscriptions-transport-ws - supports-color - ts-node - - tslib - typescript - - uint8arraylist - utf-8-validate - zod dev: false @@ -7767,16 +7255,6 @@ packages: varint: 6.0.0 dev: false - /@ipld/car@5.2.4: - resolution: {integrity: sha512-YoVXE/o5HLXKi/Oqh9Nhcn423sdn9brRFKnbUid68/1D332/XINcoyCTvBluFcCw/9IeiTx+sEAV+onXZ/A4eA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@ipld/dag-cbor': 9.0.6 - cborg: 4.0.5 - multiformats: 12.1.3 - varint: 6.0.0 - dev: false - /@ipld/dag-cbor@6.0.15: resolution: {integrity: sha512-Vm3VTSTwlmGV92a3C5aeY+r2A18zbH2amehNhsX8PBa3muXICaWrN8Uri85A5hLH7D7ElhE8PdjxD6kNqUmTZA==} dependencies: @@ -7790,22 +7268,6 @@ packages: cborg: 1.10.2 multiformats: 9.9.0 - /@ipld/dag-cbor@8.0.1: - resolution: {integrity: sha512-mHRuzgGXNk0Y5W7nNQdN37qJiig1Kdgf92icBVFRUNtBc9Ezl5DIdWfiGWBucHBrhqPBncxoH3As9cHPIRozxA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - cborg: 1.10.2 - multiformats: 11.0.2 - dev: false - - /@ipld/dag-cbor@9.0.6: - resolution: {integrity: sha512-3kNab5xMppgWw6DVYx2BzmFq8t7I56AGWfp5kaU1fIPkwHVpBRglJJTYsGtbVluCi/s/q97HZM3bC+aDW4sxbQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - cborg: 4.0.5 - multiformats: 12.1.3 - dev: false - /@ipld/dag-json@8.0.11: resolution: {integrity: sha512-Pea7JXeYHTWXRTIhBqBlhw7G53PJ7yta3G/sizGEZyzdeEwhZRr0od5IQ0r2ZxOt1Do+2czddjeEPp+YTxDwCA==} dependencies: @@ -7813,26 +7275,11 @@ packages: multiformats: 9.9.0 dev: true - /@ipld/dag-json@9.1.1: - resolution: {integrity: sha512-L0l+Osi8zAWUw2L/fWJjeZ75l7XojD0Mud1Xvo32q8AJeVuqvCQFdqqIFBiq8MwuqC8qS8kbysro3w5mphUiDQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - cborg: 1.10.2 - multiformats: 11.0.2 - dev: false - /@ipld/dag-pb@2.1.18: resolution: {integrity: sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg==} dependencies: multiformats: 9.9.0 - /@ipld/dag-pb@3.0.2: - resolution: {integrity: sha512-ge+llKU/CNc6rX5ZcUhCrPXJjKjN1DsolDOJ99zOsousGOhepoIgvT01iAP8s7QN9QFciOE+a1jHdccs+CyhBA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - multiformats: 11.0.2 - dev: false - /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -8146,868 +7593,6 @@ packages: /@leichtgewicht/ip-codec@2.0.4: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - /@libp2p/bootstrap@5.0.2: - resolution: {integrity: sha512-AOr/uCjHpkfVWFylYXn7KRa1oIGmyZpadoMUr09nAEG0S3ejTda3TMFu90SXApMDnfSsaWyrnsfxNlH8HbfdSg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-discovery': 1.1.1 - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interface-peer-store': 1.2.9 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-id': 1.1.18 - '@multiformats/mafmt': 11.1.2 - '@multiformats/multiaddr': 11.6.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/components@2.1.1: - resolution: {integrity: sha512-/XtfEdBHaNhwiaf9RowiSYnyVFIl+shuZNGQlCsJmOnn5X490TMo9GJ9PVfrTRnRn3ZXPBLS5Vp0s6++ShSv7g==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-address-manager': 1.0.3 - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interface-connection-manager': 1.5.0 - '@libp2p/interface-content-routing': 1.0.7 - '@libp2p/interface-dht': 1.0.5 - '@libp2p/interface-metrics': 3.0.0 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-peer-routing': 1.1.1 - '@libp2p/interface-peer-store': 1.2.9 - '@libp2p/interface-pubsub': 2.1.0 - '@libp2p/interface-registrar': 2.0.12 - '@libp2p/interface-transport': 1.0.4 - '@libp2p/interfaces': 3.3.2 - err-code: 3.0.1 - interface-datastore: 7.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/connection@4.0.2: - resolution: {integrity: sha512-l/mvmcA7QkAC/0qRmTpuD5CeMaiy4DuKCsutaY3PpwJbMegTOjxuZh0uzk3z94d0wJBnhquVZ0e4Yqvd+QGlng==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@multiformats/multiaddr': 11.6.1 - err-code: 3.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/crypto@1.0.17: - resolution: {integrity: sha512-Oeg0Eb/EvAho0gVkOgemXEgrVxWaT3x/DpFgkBdZ9qGxwq75w/E/oPc7souqBz+l1swfz37GWnwV7bIb4Xv5Ag==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-keys': 1.0.8 - '@libp2p/interfaces': 3.3.2 - '@noble/ed25519': 1.7.3 - '@noble/secp256k1': 1.7.1 - multiformats: 11.0.2 - node-forge: 1.3.1 - protons-runtime: 5.1.0 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - dev: false - - /@libp2p/delegated-content-routing@3.0.1: - resolution: {integrity: sha512-KEj6g0Ag0hjVzj8ljjVlf47nNbZuRtwMPH4sjySOwfnpvtQjPtjT8Lz7PkANtQeL+qG0Zd15CNFxD88gIwmVCg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-content-routing': 1.0.7 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - any-signal: 3.0.1 - err-code: 3.0.1 - it-drain: 2.0.1 - multiformats: 10.0.3 - p-defer: 4.0.0 - p-queue: 7.4.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/delegated-peer-routing@3.0.1: - resolution: {integrity: sha512-qD082tKPThlKNYVmmLV95uRQzDJkekTKp96J7NZjrUEFx7S6a2l7kVvxvh+cGNF3l5lqvVnA35VSE4pljcxPzA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interface-peer-routing': 1.1.1 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-id': 1.1.18 - any-signal: 3.0.1 - err-code: 3.0.1 - multiformats: 10.0.3 - p-defer: 4.0.0 - p-queue: 7.4.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/floodsub@5.0.0: - resolution: {integrity: sha512-B39UW/AWgfVVUl2yJDardmL2kKo1Zd4E+11/rkyjnjbygh944DTLcp3B2gSarqRlyN+x4ChUTKiN75UGajOaog==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-pubsub': 3.0.7 - '@libp2p/logger': 2.1.1 - '@libp2p/pubsub': 5.0.1 - protons-runtime: 4.0.2(uint8arraylist@2.4.3) - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-address-manager@1.0.3: - resolution: {integrity: sha512-/DNGUQEXA0Ks+EOp0IVv3TsWq1H+4ZlSnyBozzNGDmufz6wG+EvUDBbwIXieHR898bj4pHfmmogK+Vwz5s5Kdw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 11.6.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-address-manager@2.0.5: - resolution: {integrity: sha512-e2vLstKkYlAG2PZe6SEBpnnP2Y/ej6URue+zAiyjJPuXoOGNzHyLaqcv7MKye171OEf9dg5wv1gFphWcUJJbSA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 12.1.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-connection-encrypter@3.0.6: - resolution: {integrity: sha512-LwyYBN/aSa3IPCe7gBxffx/vaC0rFxAXlCbx4QGaWGtg6qK80Ouj89LEDWb3HkMbecNVWaV4TEqJIM5WnAAx1Q==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 2.0.2 - it-stream-types: 1.0.5 - uint8arraylist: 2.4.3 - dev: false - - /@libp2p/interface-connection-manager@1.5.0: - resolution: {integrity: sha512-luqYVMH3yip12JlSwVmBdo5/qG4YnXQXp2AV4lvxWK0sUhCnI2r3YL4e9ne8o3LAA5CkH3lPqTQ2HSRpmOruFg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 4.0.0 - '@libp2p/interface-peer-id': 2.0.2 - '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 12.1.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-connection@3.1.1: - resolution: {integrity: sha512-+hxfYLv4jf+MruQEJiJeIyo/wI33/53wRL0XJTkxwQQPAkLHfZWCUY4kY9sXALd3+ASjXAENvJj9VvzZTlkRDQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 2.0.2 - '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 12.1.7 - it-stream-types: 1.0.5 - uint8arraylist: 2.4.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-connection@4.0.0: - resolution: {integrity: sha512-6xx/NmEc84HX7QmsjSC3hHredQYjHv4Dkf4G27adAPf+qN+vnPxmQ7gaTnk243a0++DOFTbZ2gKX/15G2B6SRg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 2.0.2 - '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 12.1.7 - it-stream-types: 1.0.5 - uint8arraylist: 2.4.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-connection@5.1.1: - resolution: {integrity: sha512-ytknMbuuNW72LYMmTP7wFGP5ZTaUSGBCmV9f+uQ55XPcFHtKXLtKWVU/HE8IqPmwtyU8AO7veGoJ/qStMHNRVA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 2.0.2 - '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 12.1.7 - it-stream-types: 2.0.1 - uint8arraylist: 2.4.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-content-routing@1.0.7: - resolution: {integrity: sha512-10MgDDwhS3uBaEppViBtJEVjgZohAKNLaGnzHPej0ByfnESI8DFlgpMOZVOMUlW/NpLOXxqrYuHALefuDWfqmw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interfaces': 3.3.2 - multiformats: 10.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-dht@1.0.5: - resolution: {integrity: sha512-kqcHpv0VlhZbHNXVou6qOFw3UUtJBlsJi641Jh6BUZouoej8b2wp/TacOuiHvC6Uy8ACanzprzVG1Rk01mgZwA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-discovery': 1.1.1 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interfaces': 3.3.2 - multiformats: 10.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-keychain@1.0.8: - resolution: {integrity: sha512-JqI7mMthIafP8cGhhsmIs/M0Ey+ivHLcpzqbVVzMFiFVi1dC03R7EHlalcaPn8yaLSvlmI0MqjC8lJYuvlFjfw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - multiformats: 10.0.3 - dev: false - - /@libp2p/interface-keys@1.0.8: - resolution: {integrity: sha512-CJ1SlrwuoHMquhEEWS77E+4vv7hwB7XORkqzGQrPQmA9MRdIEZRS64bA4JqCLUDa4ltH0l+U1vp0oZHLT67NEA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /@libp2p/interface-metrics@3.0.0: - resolution: {integrity: sha512-TxK63BrDalv0yW544608xfmg3rsbh31ykZzf7I1yjMCZpyIFOqLTH1WN4YQwXKNlMz/XURux99UTpGSRYl3nOA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 1.1.2 - it-stream-types: 1.0.5 - dev: false - - /@libp2p/interface-metrics@4.0.8: - resolution: {integrity: sha512-1b9HjYyJH0m35kvPHipuoz2EtYCxyq34NUhuV8VK1VNtrouMpA3uCKp5FI7yHCA6V6+ux1R3UriKgNFOSGbIXQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 5.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-peer-discovery@1.1.1: - resolution: {integrity: sha512-tjbt5DquTyP/JDskasPbIB3lk+zPVL8J9UPfrELZqlslJo9ufsMKyEXcTMMABclTvUsh6uSDgC0JUpUHTeCn8A==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interfaces': 3.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-peer-id@1.1.2: - resolution: {integrity: sha512-S5iyVzG2EUgxm4NLe8W4ya9kpKuGfHs7Wbbos0wOUB4GXsbIKgOOxIr4yf+xGFgtEBaoximvlLkpob6dn8VFgA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - multiformats: 10.0.3 - dev: false - - /@libp2p/interface-peer-id@2.0.2: - resolution: {integrity: sha512-9pZp9zhTDoVwzRmp0Wtxw0Yfa//Yc0GqBCJi3EznBDE6HGIAVvppR91wSh2knt/0eYg0AQj7Y35VSesUTzMCUg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - multiformats: 11.0.2 - dev: false - - /@libp2p/interface-peer-info@1.0.10: - resolution: {integrity: sha512-HQlo8NwQjMyamCHJrnILEZz+YwEOXCB2sIIw3slIrhVUYeYlTaia1R6d9umaAeLHa255Zmdm4qGH8rJLRqhCcg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 2.0.2 - '@multiformats/multiaddr': 12.1.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-peer-routing@1.1.1: - resolution: {integrity: sha512-/XEhwob9qXjdmI8PBcc+qFin32xmtyoC58nRpq8RliqHY5uOVWiHfZoNtdOXIsNvzVvq5FqlHOWt71ofxXTtlg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 2.0.2 - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interfaces': 3.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-peer-store@1.2.9: - resolution: {integrity: sha512-jAAlbP1NXpEJOG6Dbr0QdP71TBYjHBc/65Ulwdn4J4f04PW1bI4JIMQeq6+/sLfaGVryvvUT/a52io8UUtB21Q==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 2.0.2 - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interface-record': 2.0.7 - '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 12.1.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-peer-store@2.0.4: - resolution: {integrity: sha512-jNvBK3O1JPJqSiDN2vkb+PV8bTPnYdP54nxsLtut1BWukNm610lwzwleV7CetFI4bJCn6g+BgBvvq8fdADy0tA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 2.0.2 - '@multiformats/multiaddr': 12.1.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-pubsub@2.1.0: - resolution: {integrity: sha512-X+SIqzfeCO8ZDGrFTzH9EMwMf8ojW5nk20rxv3h1sCXEdfvyJCARZ51r9UlwJcnucnHqvFChfkbubAkrr3R4Cw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interfaces': 3.3.2 - it-pushable: 3.2.1 - uint8arraylist: 2.4.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-pubsub@3.0.7: - resolution: {integrity: sha512-+c74EVUBTfw2sx1GE/z/IjsYO6dhur+ukF0knAppeZsRQ1Kgg6K5R3eECtT28fC6dBWLjFpAvW/7QGfiDAL4RA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 4.0.0 - '@libp2p/interface-peer-id': 2.0.2 - '@libp2p/interfaces': 3.3.2 - it-pushable: 3.2.1 - uint8arraylist: 2.4.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-record@2.0.7: - resolution: {integrity: sha512-AFPytZWI+p8FJWP0xuK5zbSjalLAOIMzEed2lBKdRWvdGBQUHt9ENLTkfkI9G7p/Pp3hlhVzzBXdIErKd+0GxQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 2.0.2 - uint8arraylist: 2.4.3 - dev: false - - /@libp2p/interface-registrar@2.0.12: - resolution: {integrity: sha512-EyCi2bycC2rn3oPB4Swr7EqBsvcaWd6RcqR6zsImNIG9BKc4/R1gl6iaF861JaELYgYmzBMS31x1rQpVz5UekQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 5.1.1 - '@libp2p/interface-peer-id': 2.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-stream-muxer@3.0.6: - resolution: {integrity: sha512-wbLrH/bdF8qe0CpPd3BFMSmUs085vc3/8zx5uhXJySD672enAc8Jw9gmAYd1pIqELdqJqBDg9EI0y1XMRxvVkw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 4.0.0 - '@libp2p/interfaces': 3.3.2 - it-stream-types: 1.0.5 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-transport@1.0.4: - resolution: {integrity: sha512-MOkhtykUrrbgHC1CcAFe/6QTz/BEBbHfu5sf+go6dhBlHXeHI+AcV8Fic5zTZNz71E1SRi2UR+5TVi7ORPL57Q==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 11.6.1 - it-stream-types: 1.0.5 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface-transport@2.1.3: - resolution: {integrity: sha512-ez+0X+w2Wyw3nJY6mP0DHFgrRnln/miAH4TJLcRfUSJHjGXH5ZfpuK1TnRxXpEUiqOezSbwke06/znI27KpRiQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 4.0.0 - '@libp2p/interface-stream-muxer': 3.0.6 - '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 12.1.7 - it-stream-types: 1.0.5 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interface@0.1.4: - resolution: {integrity: sha512-Pk8mzit/w7PbTh28n77RDLTU1CQBBzLygiNC07MvcEjaIwqXdNPN3Vuzr/5qiF6aDsbM9fA1W5dWoCif9xBdxg==} - dependencies: - '@multiformats/multiaddr': 12.1.7 - abortable-iterator: 5.0.1 - it-pushable: 3.2.1 - it-stream-types: 2.0.1 - multiformats: 12.1.3 - p-defer: 4.0.0 - race-signal: 1.0.1 - uint8arraylist: 2.4.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/interfaces@3.3.2: - resolution: {integrity: sha512-p/M7plbrxLzuQchvNwww1Was7ZeGE2NaOFulMaZBYIihU8z3fhaV+a033OqnC/0NTX/yhfdNOG7znhYq3XoR/g==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /@libp2p/kad-dht@5.0.2: - resolution: {integrity: sha512-Z9f1d3DlYnt3tfF6EBSqPvsB9pnm0qs7zvIk2CdRX5vdLy//IOenepcYfgaC4nDnD/ambELq7VSdGQizGG8S5w==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/crypto': 1.0.17 - '@libp2p/interface-address-manager': 2.0.5 - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interface-connection-manager': 1.5.0 - '@libp2p/interface-dht': 1.0.5 - '@libp2p/interface-metrics': 3.0.0 - '@libp2p/interface-peer-discovery': 1.1.1 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interface-peer-store': 1.2.9 - '@libp2p/interface-registrar': 2.0.12 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-collections': 2.2.2 - '@libp2p/peer-id': 1.1.18 - '@libp2p/record': 2.0.4 - '@libp2p/topology': 3.0.2 - '@multiformats/multiaddr': 11.6.1 - abortable-iterator: 4.0.3 - any-signal: 3.0.1 - datastore-core: 8.0.4 - err-code: 3.0.1 - hashlru: 2.3.0 - interface-datastore: 7.0.4 - it-all: 2.0.1 - it-drain: 2.0.1 - it-first: 2.0.1 - it-length: 2.0.1 - it-length-prefixed: 8.0.4 - it-map: 2.0.1 - it-merge: 2.0.1 - it-parallel: 3.0.4 - it-pipe: 2.0.5 - it-stream-types: 1.0.5 - it-take: 2.0.1 - k-bucket: 5.1.0 - multiformats: 10.0.3 - p-defer: 4.0.0 - p-queue: 7.4.1 - private-ip: 2.3.4 - protons-runtime: 4.0.2(uint8arraylist@2.4.3) - timeout-abort-controller: 3.0.0 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - varint: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/logger@2.1.1: - resolution: {integrity: sha512-2UbzDPctg3cPupF6jrv6abQnAUTrbLybNOj0rmmrdGm1cN2HJ1o/hBu0sXuq4KF9P1h/eVRn1HIRbVIEKnEJrA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 2.0.2 - '@multiformats/multiaddr': 12.1.7 - debug: 4.3.4(supports-color@8.1.1) - interface-datastore: 8.2.5 - multiformats: 11.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/logger@3.0.4: - resolution: {integrity: sha512-MF42c7SOJIx5YmHhIsFaSYfaC266YYmMbAJHjjH8Zl5unFsqW82M+Xr7sGVj9/WXrWAd37ts8xJaQrkIXc3OZQ==} - dependencies: - '@libp2p/interface': 0.1.4 - '@multiformats/multiaddr': 12.1.7 - debug: 4.3.4(supports-color@8.1.1) - interface-datastore: 8.2.5 - multiformats: 12.1.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/mdns@5.1.1: - resolution: {integrity: sha512-fLNcKHtJ1VfAdUHrqLHMiCLrpsWGk8OkZYQN8spwZ1MiX38jqEh5jbPF/m6YmMxnj7UGmaFOnaMhHdhMXWJSvQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-discovery': 1.1.1 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-id': 1.1.18 - '@multiformats/multiaddr': 11.6.1 - '@types/multicast-dns': 7.2.3 - multicast-dns: 7.2.5 - multiformats: 10.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/mplex@7.1.7: - resolution: {integrity: sha512-8eJ6HUL3bM8ck0rb/NJ04+phBUVBMocxH/kuc2Nypn8RX9ezihV7srGGhG5N7muaMwJrRbYkFhIV4GH+8WTZUg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 4.0.0 - '@libp2p/interface-stream-muxer': 3.0.6 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - abortable-iterator: 4.0.3 - any-signal: 4.1.1 - benchmark: 2.1.4 - it-batched-bytes: 1.0.1 - it-pushable: 3.2.1 - it-stream-types: 1.0.5 - rate-limiter-flexible: 2.4.2 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - varint: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/multistream-select@3.1.9: - resolution: {integrity: sha512-iSNqr8jXvOrkNTyA43h/ARs4wd0Rd55/D6oFRndLcV4yQSUMmfjl7dUcbC5MAw+5/sgskfDx9TMawSwNq47Qwg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - abortable-iterator: 5.0.1 - it-first: 3.0.3 - it-handshake: 4.1.3 - it-length-prefixed: 9.0.3 - it-merge: 3.0.2 - it-pipe: 3.0.1 - it-pushable: 3.2.1 - it-reader: 6.0.4 - it-stream-types: 2.0.1 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/peer-collections@2.2.2: - resolution: {integrity: sha512-sL1A0LBHJAlvqROe+OT61Y6Rg7ff+B+YNDZj+3f/LGvDssyffAQX78cXU+lWKPsT+AwHt7Sk7sO4CsYJbdOScQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/peer-id': 1.1.18 - dev: false - - /@libp2p/peer-id-factory@1.0.20: - resolution: {integrity: sha512-+fHhbmDK9Ws6Dmj2ZmfrQouQTZEbTS3FCi3nUDJnnjIS95+radaP085IVkNJYJeeWpxJV90D4EUwtoy83PaoCw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/crypto': 1.0.17 - '@libp2p/interface-keys': 1.0.8 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/peer-id': 1.1.18 - multiformats: 10.0.3 - protons-runtime: 4.0.2(uint8arraylist@2.4.3) - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - dev: false - - /@libp2p/peer-id@1.1.18: - resolution: {integrity: sha512-Zh3gzbrQZKDMLpoJAJB8gdGtyYFSBKV0dU5vflQ18/7MJDJmjsgKO+sJTYi72yN5sWREs1eGKMhxLo+N1ust5w==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 1.1.2 - err-code: 3.0.1 - multiformats: 10.0.3 - uint8arrays: 4.0.6 - dev: false - - /@libp2p/peer-record@4.0.5: - resolution: {integrity: sha512-o4v6N5B0hsx94TnSkLD7v8GmyQ/pNJbhy+pY8YDsmPhcwAGTnpRdlxWZraMBz8ut+vGoD7E34IdMMgJX/tgAJA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/crypto': 1.0.17 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-record': 2.0.7 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-id': 1.1.18 - '@libp2p/utils': 3.0.13 - '@multiformats/multiaddr': 11.6.1 - err-code: 3.0.1 - interface-datastore: 7.0.4 - it-all: 2.0.1 - it-filter: 2.0.2 - it-foreach: 1.0.1 - it-map: 2.0.1 - it-pipe: 2.0.5 - multiformats: 10.0.3 - protons-runtime: 4.0.2(uint8arraylist@2.4.3) - uint8-varint: 1.0.8 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - varint: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/peer-store@5.0.1: - resolution: {integrity: sha512-TeHxy5Qv+KzajbEZH1wdE6ubk8G7IUyU+Dyl4W06unZpxq6rD+OTnCkvYuEdglROUxmvSBEkFqJnxV6xgVBWJA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interface-peer-store': 1.2.9 - '@libp2p/interface-record': 2.0.7 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-id': 1.1.18 - '@libp2p/peer-record': 4.0.5 - '@multiformats/multiaddr': 11.6.1 - err-code: 3.0.1 - interface-datastore: 7.0.4 - it-all: 2.0.1 - it-filter: 2.0.2 - it-foreach: 1.0.1 - it-map: 2.0.1 - it-pipe: 2.0.5 - mortice: 3.0.1 - multiformats: 10.0.3 - protons-runtime: 4.0.2(uint8arraylist@2.4.3) - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/pubsub@3.1.3: - resolution: {integrity: sha512-lo3Ay3NHdll2Wt0kzs2RNyWagyECGDx7d4dyKwGQgzhZyoy3FnYQW8vbMLyLLX1FV9DSiWEbFsBxX2MKJXUMyQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/components': 2.1.1 - '@libp2p/crypto': 1.0.17 - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-pubsub': 2.1.0 - '@libp2p/interface-registrar': 2.0.12 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-collections': 2.2.2 - '@libp2p/peer-id': 1.1.18 - '@libp2p/topology': 3.0.2 - '@multiformats/multiaddr': 11.6.1 - abortable-iterator: 4.0.3 - err-code: 3.0.1 - it-length-prefixed: 8.0.4 - it-pipe: 2.0.5 - it-pushable: 3.2.1 - multiformats: 9.9.0 - p-queue: 7.4.1 - uint8arraylist: 2.4.3 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/pubsub@5.0.1: - resolution: {integrity: sha512-pQNpUC6KWDKCm7A9bv4tT2t3a7a4IpJdfzHsRBjAaKEcIRgP/s/q0Xn8ySdcggg1fvdjMp5VY6NfuuRbSCu9LA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/crypto': 1.0.17 - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-pubsub': 3.0.7 - '@libp2p/interface-registrar': 2.0.12 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-collections': 2.2.2 - '@libp2p/peer-id': 1.1.18 - '@libp2p/topology': 3.0.2 - '@multiformats/multiaddr': 11.6.1 - abortable-iterator: 4.0.3 - err-code: 3.0.1 - it-length-prefixed: 8.0.4 - it-pipe: 2.0.5 - it-pushable: 3.2.1 - multiformats: 10.0.3 - p-queue: 7.4.1 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/record@2.0.4: - resolution: {integrity: sha512-BLdw/zDh4Nq65nKD/BRKad7++h2pPwY7IxoZNyEN4uvCo6knmfTSlKwqlw4NCYaH27YcupXrhKZ2WAoYjt5ACw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-dht': 1.0.5 - err-code: 3.0.1 - multiformats: 10.0.3 - protons-runtime: 4.0.2(uint8arraylist@2.4.3) - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/tcp@5.0.2: - resolution: {integrity: sha512-Lm8RhqfvqJ7SffeausXNHeRT8QC5HXWWI6X9HuLVgl/jZDGKhI0FUWv3J48lUhpvmH4wQyMFLVuZrTukS4F/6g==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interface-transport': 2.1.3 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/utils': 3.0.13 - '@multiformats/mafmt': 11.1.2 - '@multiformats/multiaddr': 11.6.1 - abortable-iterator: 4.0.3 - err-code: 3.0.1 - stream-to-it: 0.2.4 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/topology@3.0.2: - resolution: {integrity: sha512-RDMmA8Us5uxl7sSWGoTIYyzdthjs6xQD1P/vBQPHlqTAjpjPWuCY019cbqK8lP1JCldCB/n2ljSxDJs1J4cweQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-registrar': 2.0.12 - '@libp2p/logger': 2.1.1 - err-code: 3.0.1 - it-all: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/tracked-map@2.0.2: - resolution: {integrity: sha512-y5UnoB5NR+i7Xp/wPrHYyJxiNRS0/3ee8chphTG8GptdTWqWcZ+UALKXMb9neMtFL9pivNrOY+A0d+M60eI+RA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-metrics': 3.0.0 - dev: false - - /@libp2p/utils@3.0.13: - resolution: {integrity: sha512-SNwIcQq/FvLpqVsjHHzbxSq7VgbbUK9EB7/865Re4NoLfqgE/6oTUpyPEDlrcJb4aTPFWbVPQzE85cA3raHIIw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@achingbrain/ip-address': 8.1.0 - '@libp2p/interface-connection': 5.1.1 - '@libp2p/interface-peer-store': 2.0.4 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@multiformats/multiaddr': 12.1.7 - abortable-iterator: 5.0.1 - is-loopback-addr: 2.0.2 - it-stream-types: 2.0.1 - private-ip: 3.0.1 - uint8arraylist: 2.4.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/webrtc-peer@2.0.2: - resolution: {integrity: sha512-FozliUqHO1CIzrL8hPc5uT+5AGUWf5Dw3HncL9tte/CoDNVpj6O59ITIRWefssp3oIGEAIjpcebNu1d+mYfVug==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - delay: 5.0.0 - err-code: 3.0.1 - iso-random-stream: 2.0.2 - it-pushable: 3.2.1 - it-stream-types: 1.0.5 - p-defer: 4.0.0 - p-event: 5.0.1 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/webrtc-star-protocol@2.0.1: - resolution: {integrity: sha512-7pOQHWhfCfEQXVdLPqhi0cC0eyYVklzNtNZlEEXcAQ3zRFpAeZsMwg5wowXs1Udu7oxKwog3w3FbgHmvwqStMg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@multiformats/multiaddr': 11.6.1 - socket.io-client: 4.7.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /@libp2p/webrtc-star@5.0.3: - resolution: {integrity: sha512-tGH72ARnuHaj5FlLMrdU4B2PIZMgUKdS40YqlIu5w9zo4csZ8n07oRHt0B+gRnahLd8wY80uiS6CnmTC5c0skg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interface-peer-discovery': 1.1.1 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-transport': 2.1.3 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-id': 1.1.18 - '@libp2p/utils': 3.0.13 - '@libp2p/webrtc-peer': 2.0.2 - '@libp2p/webrtc-star-protocol': 2.0.1 - '@multiformats/mafmt': 11.1.2 - '@multiformats/multiaddr': 11.6.1 - abortable-iterator: 4.0.3 - delay: 5.0.0 - err-code: 3.0.1 - iso-random-stream: 2.0.2 - multiformats: 10.0.3 - p-defer: 4.0.0 - socket.io-client: 4.7.2 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /@libp2p/websockets@5.0.10: - resolution: {integrity: sha512-q8aKm0rhDxZjc4TzDpB0quog4pViFnz+Ok+UbGEk3xXxHwT3QCxaDVPKMemMqN/1N3OahVvcodpcvFSuWmus+A==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 4.0.0 - '@libp2p/interface-transport': 2.1.3 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/utils': 3.0.13 - '@multiformats/mafmt': 12.1.6 - '@multiformats/multiaddr': 12.1.7 - '@multiformats/multiaddr-to-uri': 9.0.7 - abortable-iterator: 4.0.3 - it-ws: 5.0.6 - p-defer: 4.0.0 - p-timeout: 6.1.2 - wherearewe: 2.0.1 - ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - /@lit-labs/ssr-dom-shim@1.1.2: resolution: {integrity: sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g==} dev: false @@ -9582,61 +8167,6 @@ packages: - '@types/react' dev: false - /@multiformats/mafmt@11.1.2: - resolution: {integrity: sha512-3n1o5eLU7WzTAPLuz3AodV7Iql6NWf7Ws8fqVaGT7o5nDDabUPYGBm2cZuh3OrqmwyCY61LrNUIsjzivU6UdpQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@multiformats/multiaddr': 12.1.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@multiformats/mafmt@12.1.6: - resolution: {integrity: sha512-tlJRfL21X+AKn9b5i5VnaTD6bNttpSpcqwKVmDmSHLwxoz97fAHaepqFOk/l1fIu94nImIXneNbhsJx/RQNIww==} - dependencies: - '@multiformats/multiaddr': 12.1.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@multiformats/multiaddr-to-uri@9.0.7: - resolution: {integrity: sha512-i3ldtPMN6XJt+MCi34hOl0wGuGEHfWWMw6lmNag5BpckPwPTf9XGOOFMmh7ed/uO3Vjah/g173iOe61HTQVoBA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@multiformats/multiaddr': 12.1.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@multiformats/multiaddr@11.6.1: - resolution: {integrity: sha512-doST0+aB7/3dGK9+U5y3mtF3jq85KGbke1QiH0KE1F5mGQ9y56mFebTeu2D9FNOm+OT6UHb8Ss8vbSnpGjeLNw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@chainsafe/is-ip': 2.0.2 - dns-over-http-resolver: 2.1.2 - err-code: 3.0.1 - multiformats: 11.0.2 - uint8arrays: 4.0.6 - varint: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@multiformats/multiaddr@12.1.7: - resolution: {integrity: sha512-MZRj+uUrtF2WqgByrsPolrdyPDSFstw7Fe0ewabWgWl27fcOmfDOSrEt2aUVkSzapXbyCG7JQh0QvimmTF4aMA==} - engines: {node: '>=18.0.0', npm: '>=8.6.0'} - dependencies: - '@chainsafe/is-ip': 2.0.2 - '@chainsafe/netmask': 2.0.0 - '@libp2p/interface': 0.1.4 - dns-over-http-resolver: 2.1.2 - multiformats: 12.1.3 - uint8-varint: 2.0.1 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - /@multiformats/murmur3@1.1.3: resolution: {integrity: sha512-wAPLUErGR8g6Lt+bAZn6218k9YQPym+sjszsXL6o4zfxbA22P+gxWZuuD9wDbwL55xrKO5idpcuQUX7/E3oHcw==} dependencies: @@ -9644,14 +8174,6 @@ packages: murmurhash3js-revisited: 3.0.0 dev: false - /@multiformats/murmur3@2.1.7: - resolution: {integrity: sha512-Yf0UpAaONjed+8PTt5NM/GG4Z4Ai4m1qfT7bqevjnkwRQ12K+0jxtRomirz+VJx4PokpA2St1ZSD1iMkZTqPRQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - multiformats: 12.1.3 - murmurhash3js-revisited: 3.0.0 - dev: false - /@next/env@13.5.6: resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} dev: false @@ -12725,12 +11247,6 @@ packages: '@types/ms': 0.7.33 dev: false - /@types/dns-packet@5.6.2: - resolution: {integrity: sha512-vgUZ0ilYvpnTDx7tBmmAUn1HsyzK3huAtulHaDbBBCW5UdaDrEei5XJjWHnD4s8r9/MSL1hJ8s+nvJdcvNKgMA==} - dependencies: - '@types/node': 18.18.7 - dev: false - /@types/eslint-scope@3.7.6: resolution: {integrity: sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==} dependencies: @@ -12939,13 +11455,6 @@ packages: resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} dev: false - /@types/multicast-dns@7.2.3: - resolution: {integrity: sha512-2SZ079yRhuhDn5BssqkQGp07vErjm3PD8S/JAlduWXacZ8SVHF0q6R2m0PwjjgTDU1vE3kibNPlmnr1iKbP/Sw==} - dependencies: - '@types/dns-packet': 5.6.2 - '@types/node': 18.18.7 - dev: false - /@types/node@10.17.60: resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} dev: true @@ -13072,10 +11581,6 @@ packages: /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - /@types/retry@0.12.1: - resolution: {integrity: sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==} - dev: false - /@types/sax@1.2.6: resolution: {integrity: sha512-A1mpYCYu1aHFayy8XKN57ebXeAbh9oQIZ1wXcno6b1ESUAfMBDMx7mf/QGlYwcMRaFryh9YBuH03i/3FlPGDkQ==} dependencies: @@ -13568,10 +12073,6 @@ packages: '@vanilla-extract/css': 1.9.1 dev: false - /@vascosantos/moving-average@1.1.0: - resolution: {integrity: sha512-MVEJ4vWAPNbrGLjz7ITnHYg+YXZ6ijAqtH5/cHwSoCpbvuJ98aLXwFfPKAUfZpJMQR5uXB58UJajbY130IRF/w==} - dev: false - /@viem/anvil@0.0.5(debug@4.3.4): resolution: {integrity: sha512-aGgbwBNmCcxp08WcYwyL+n01HLLFYuhIczQLy6BPcomQ2CG4ngfTed8K73EOpsBTmvCxAcek0APcVS7UUWNALw==} dependencies: @@ -14596,14 +13097,6 @@ packages: tslib: 2.6.2 dev: false - /@whatwg-node/server@0.9.16: - resolution: {integrity: sha512-gktQkRyONEw2EGpx7UZaC6zNlUm21CGlqAHQXU3QC6W0zlLM5ZQNDCeD66q/nsPHDV08X2NTHlABsuAEk5rh/w==} - engines: {node: '>=16.0.0'} - dependencies: - '@whatwg-node/fetch': 0.9.14 - tslib: 2.6.2 - dev: false - /@wry/context@0.7.4: resolution: {integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==} engines: {node: '>=8'} @@ -14759,21 +13252,6 @@ packages: dependencies: event-target-shim: 5.0.1 - /abortable-iterator@4.0.3: - resolution: {integrity: sha512-GJ5fyS9O0hK/TMf+weR+WMEwSEBWVuStHqHmUYWbfHPULyVf7QdUnAvh41+1cUWtHVf0Z/qtQynidxz4ZFDPOg==} - dependencies: - get-iterator: 2.0.1 - it-stream-types: 1.0.5 - dev: false - - /abortable-iterator@5.0.1: - resolution: {integrity: sha512-hlZ5Z8UwqrKsJcelVPEqDduZowJPBQJ9ZhBC2FXpja3lXy8X6MoI5uMzIgmrA8+3jcVnp8TF/tx+IBBqYJNUrg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - get-iterator: 2.0.1 - it-stream-types: 2.0.1 - dev: false - /abortcontroller-polyfill@1.7.5: resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} dev: true @@ -15096,11 +13574,6 @@ packages: /any-signal@3.0.1: resolution: {integrity: sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==} - /any-signal@4.1.1: - resolution: {integrity: sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -15223,11 +13696,6 @@ packages: is-string: 1.0.7 dev: true - /array-shuffle@3.0.0: - resolution: {integrity: sha512-rogEGxHOQPhslOhpg12LJkB+bbAl484/s2AJq0BxtzQDQfKl76fS2u9zWgg3p3b9ENcuvE7K8A7l5ddiPjCRnw==} - engines: {node: '>=12.20'} - dev: false - /array-union@1.0.2: resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} @@ -15809,13 +14277,6 @@ packages: /bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - /benchmark@2.1.4: - resolution: {integrity: sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==} - dependencies: - lodash: 4.17.21 - platform: 1.3.6 - dev: false - /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -15903,12 +14364,6 @@ packages: dependencies: browser-readablestream-to-it: 1.0.3 - /blob-to-it@2.0.4: - resolution: {integrity: sha512-1z2a98yY7v855TreA3HzwJs/j7ecMzes6U1ty8fJ93S1XbiETsup+h5DA/XBMwK3tBu+CWx4WJjR3b8S13TKeQ==} - dependencies: - browser-readablestream-to-it: 2.0.4 - dev: false - /blob-util@2.0.2: resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} dev: true @@ -15926,33 +14381,6 @@ packages: multiformats: 9.9.0 dev: false - /blockstore-core@2.0.2: - resolution: {integrity: sha512-ALry3rBp2pTEi4F/usjCJGRluAKYFWI9Np7uE0pZHfDeScMJSj/fDkHEWvY80tPYu4kj03sLKRDGJlZH+V7VzQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - err-code: 3.0.1 - interface-blockstore: 3.0.2 - interface-store: 3.0.4 - it-all: 1.0.6 - it-drain: 1.0.5 - it-filter: 1.0.3 - it-take: 1.0.2 - multiformats: 10.0.3 - dev: false - - /blockstore-datastore-adapter@4.0.0: - resolution: {integrity: sha512-vzy2lgLb7PQ0qopuZk6B+syRULdUt9w/ffNl7EXcvGZLS5+VoUmh4Agdp1OVuoaMEfXoEqIvCaPXi/v3829vBg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - blockstore-core: 2.0.2 - err-code: 3.0.1 - interface-blockstore: 3.0.2 - interface-datastore: 7.0.4 - it-drain: 2.0.1 - it-pushable: 3.2.1 - multiformats: 10.0.3 - dev: false - /bluebird@3.7.1: resolution: {integrity: sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==} dev: true @@ -16074,10 +14502,6 @@ packages: /browser-readablestream-to-it@1.0.3: resolution: {integrity: sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==} - /browser-readablestream-to-it@2.0.4: - resolution: {integrity: sha512-EOjEEA+tJInvKg/Pml6QYxVY6gD8lka/ceLmkUbEeuWlzZx/a5k5ugupVFUUKSfI/88+v0VFs7JSFi5iYpp3IA==} - dev: false - /browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} @@ -16200,13 +14624,6 @@ packages: dependencies: streamsearch: 1.1.0 - /byte-access@1.0.1: - resolution: {integrity: sha512-GKYa+lvxnzhgHWj9X+LCsQ4s2/C5uvib573eAOiQKywXMkzFFErY2+yQdzmdE5iWVpmqecsRx3bOtOY4/1eINw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - uint8arraylist: 2.4.3 - dev: false - /bytes32@0.0.3: resolution: {integrity: sha512-uQM5zGcelcBEk0R7vkIRVN7GnrDd2S5EeWrxv7dSFLPVoI5FwYiSYOOLaFwnsav0oSr3hZQ6mFq6QNi8Vt6n8w==} hasBin: true @@ -16405,11 +14822,6 @@ packages: resolution: {integrity: sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==} hasBin: true - /cborg@4.0.5: - resolution: {integrity: sha512-q8TAjprr8pn9Fp53rOIGp/UFDdFY6os2Nq62YogPSIzczJD9M6g2b6igxMkpCiZZKJ0kn/KzDLDvG+EqBIEeCg==} - hasBin: true - dev: false - /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: false @@ -17450,6 +15862,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: tslib: 2.6.2 + dev: true /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -18066,13 +16479,6 @@ packages: es5-ext: 0.10.62 type: 1.2.0 - /dag-jose@3.0.1: - resolution: {integrity: sha512-HUdzCqM4ukT168fgFl1IgOVf5J9I7WSbvBovOhOsQWIJZ+LGGVEd/Dg4f1ZirslsBZzLEeXU8LBuPpf4he5CKg==} - dependencies: - '@ipld/dag-cbor': 8.0.1 - multiformats: 10.0.3 - dev: false - /dagre-d3-es@7.0.10: resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} dependencies: @@ -18124,74 +16530,6 @@ packages: /dataloader@2.2.2: resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} - /datastore-core@8.0.4: - resolution: {integrity: sha512-oBA6a024NFXJOTu+w9nLAimfy4wCYUhdE/5XQGtdKt1BmCVtPYW10GORvVT3pdZBcse6k/mVcBl+hjkXIlm65A==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/logger': 2.1.1 - err-code: 3.0.1 - interface-datastore: 7.0.4 - it-all: 2.0.1 - it-drain: 2.0.1 - it-filter: 2.0.2 - it-map: 2.0.1 - it-merge: 2.0.1 - it-pipe: 2.0.5 - it-pushable: 3.2.1 - it-take: 2.0.1 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - - /datastore-fs@8.0.0: - resolution: {integrity: sha512-yXPf+d08RL9wdWqZbLaJxbS0FMkKNCoYYXW6MausrFAF03hCWvap62bvPC7fX415PF0v/8JOw1aSJyGJ9WjtHA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - datastore-core: 8.0.4 - fast-write-atomic: 0.2.1 - interface-datastore: 7.0.4 - it-glob: 1.0.2 - it-map: 1.0.6 - it-parallel-batch: 1.0.11 - mkdirp: 1.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /datastore-level@9.0.4: - resolution: {integrity: sha512-HKf2tVVWywdidI+94z0B5NLx4J94wTLCT1tYXXxJ58MK/Y5rdX8WVRp9XmZaODS70uxpNC8/UrvWr0iTBZwkUA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - abstract-level: 1.0.3 - datastore-core: 8.0.4 - interface-datastore: 7.0.4 - it-filter: 2.0.2 - it-map: 2.0.1 - it-sort: 2.0.1 - it-take: 2.0.1 - level: 8.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /datastore-pubsub@6.0.0: - resolution: {integrity: sha512-HvzzDwfquX9zFaBsoj1Ue9ewlYX4dqneTTW2fRoKYsG4LQWwMXAU925qiki31kUe//QjYFN/Mi2xuwdk65PQog==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-dht': 1.0.5 - '@libp2p/interface-pubsub': 3.0.7 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - datastore-core: 8.0.4 - debug: 4.3.4(supports-color@8.1.1) - err-code: 3.0.1 - interface-datastore: 7.0.4 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - /dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} @@ -18405,13 +16743,6 @@ packages: dependencies: execa: 5.1.1 - /default-gateway@7.2.2: - resolution: {integrity: sha512-AD7TrdNNPXRZIGw63dw+lnGmT4v7ggZC5NHNJgAYWm5njrwoze1q5JSAW9YuLy2tjnoLUG/r8FEB93MCh9QJPg==} - engines: {node: '>= 16'} - dependencies: - execa: 7.2.0 - dev: false - /default-require-extensions@3.0.1: resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} engines: {node: '>=8'} @@ -18491,11 +16822,6 @@ packages: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} dev: false - /denque@1.5.1: - resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==} - engines: {node: '>=0.10'} - dev: false - /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -18615,10 +16941,6 @@ packages: dependencies: path-type: 4.0.0 - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: false - /dns-equal@1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} @@ -18632,18 +16954,6 @@ packages: - node-fetch - supports-color - /dns-over-http-resolver@2.1.2: - resolution: {integrity: sha512-Bjbf6aZjr3HMnwGslZnoW3MJVqgbTsh39EZWpikx2yLl9xEjw4eZhlOHCFhkOu89zoWaS4rqe2Go53TXW4Byiw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - native-fetch: 4.0.2(undici@5.26.5) - receptacle: 1.3.2 - undici: 5.26.5 - transitivePeerDependencies: - - supports-color - dev: false - /dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} @@ -20040,6 +18350,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true /ethers@6.9.0: resolution: {integrity: sha512-pmfNyQzc2mseLe91FnT2vmNaTt8dDzhxZ/xItAV7uGsF4dI4ek2ufMu3rAkgQETL/TIs0GS5A+U05g9QyWnv3Q==} @@ -20097,10 +18408,6 @@ packages: es5-ext: 0.10.62 dev: true - /event-iterator@2.0.0: - resolution: {integrity: sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ==} - dev: false - /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -20118,6 +18425,7 @@ packages: /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} @@ -20186,6 +18494,7 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 + dev: true /execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} @@ -20371,14 +18680,6 @@ packages: /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - /fast-json-stringify@1.21.0: - resolution: {integrity: sha512-xY6gyjmHN3AK1Y15BCbMpeO9+dea5ePVsp3BouHCdukcx0hOHbXwFhRodhcI0NpZIgDChSeAKkHW9YjKvhwKBA==} - dependencies: - ajv: 6.12.6 - deepmerge: 4.3.1 - string-similarity: 4.0.4 - dev: false - /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -20419,10 +18720,6 @@ packages: dependencies: punycode: 1.4.1 - /fast-write-atomic@0.2.1: - resolution: {integrity: sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw==} - dev: false - /fast-xml-parser@4.3.2: resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} hasBin: true @@ -20778,10 +19075,6 @@ packages: imul: 1.0.1 dev: true - /fnv1a@1.1.1: - resolution: {integrity: sha512-S2HviLR9UyNbt8R+vU6YeQtL8RliPwez9DQEVba5MAvN3Od+RSgKUSL2+qveOMt3owIeBukKoRu2enoOck5uag==} - dev: false - /follow-redirects@1.15.3(debug@4.3.4): resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} engines: {node: '>=4.0'} @@ -20960,11 +19253,6 @@ packages: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: false - /freeport-promise@2.0.0: - resolution: {integrity: sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -21098,12 +19386,6 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /generate-function@2.3.1: - resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} - dependencies: - is-property: 1.0.2 - dev: false - /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -21127,10 +19409,6 @@ packages: /get-iterator@1.0.2: resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==} - /get-iterator@2.0.1: - resolution: {integrity: sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg==} - dev: false - /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -21649,21 +19927,6 @@ packages: dependencies: graphql: 16.8.1 - /graphql-jit@0.8.2(graphql@16.8.1): - resolution: {integrity: sha512-P9KtM/UY4JTtHVRqRlZzFXPmDEtps1Bd27Mvj/naQIa5d0j83zPxAx4jewq1wueF3UEZu1JFZwX1XVBBkoo1Mg==} - peerDependencies: - graphql: '>=15' - dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - fast-json-stringify: 1.21.0 - generate-function: 2.3.1 - graphql: 16.8.1 - json-schema: 0.4.0 - lodash.memoize: 4.1.2 - lodash.merge: 4.6.2 - lodash.mergewith: 4.6.2 - dev: false - /graphql-request@6.1.0(graphql@16.8.1): resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} peerDependencies: @@ -21722,26 +19985,6 @@ packages: tslib: 2.6.2 dev: false - /graphql-yoga@5.0.0(graphql@16.8.1): - resolution: {integrity: sha512-ZvZlO8MHMDWuLRoDhvJQnXg8SOJD0iDaCA+M/zWuD26AlhEugOEbpnhw/645oqXTYtvHsM91WyxtV7p5XJWYMg==} - engines: {node: '>=18.0.0'} - peerDependencies: - graphql: ^15.2.0 || ^16.0.0 - dependencies: - '@envelop/core': 5.0.0 - '@graphql-tools/executor': 1.2.0(graphql@16.8.1) - '@graphql-tools/schema': 10.0.0(graphql@16.8.1) - '@graphql-tools/utils': 10.0.11(graphql@16.8.1) - '@graphql-yoga/logger': 2.0.0 - '@graphql-yoga/subscription': 5.0.0 - '@whatwg-node/fetch': 0.9.14 - '@whatwg-node/server': 0.9.16 - dset: 3.1.3 - graphql: 16.8.1 - lru-cache: 10.0.1 - tslib: 2.6.2 - dev: false - /graphql@15.5.0: resolution: {integrity: sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA==} engines: {node: '>= 10.x'} @@ -21776,14 +20019,6 @@ packages: uint8arrays: 3.1.1 dev: false - /hamt-sharding@3.0.2: - resolution: {integrity: sha512-f0DzBD2tSmLFdFsLAvOflIBqFPjerbA7BfmwO8mVho/5hXwgyyYhv+ijIzidQf/DpDX3bRjAQvhGoBFj+DBvPw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - sparse-array: 1.3.2 - uint8arrays: 4.0.6 - dev: false - /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -21853,73 +20088,6 @@ packages: murmur-128: 0.2.1 dev: true - /hardhat@2.18.2(typescript@5.1.6): - resolution: {integrity: sha512-lUVmJg7DsKcUCDpqv57CJl6vHqo/1PeHSfM3+WIa8UtRKmXyVTj1qQK01TDiuetkZBVg9Dn52qU+ZwaJQynaKA==} - hasBin: true - peerDependencies: - ts-node: '*' - typescript: '*' - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - dependencies: - '@ethersproject/abi': 5.7.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-blockchain': 7.0.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-evm': 2.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-statemanager': 2.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - '@nomicfoundation/ethereumjs-vm': 7.0.2 - '@nomicfoundation/solidity-analyzer': 0.1.1 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.3 - '@types/lru-cache': 5.1.1 - adm-zip: 0.4.16 - aggregate-error: 3.1.0 - ansi-escapes: 4.3.2 - chalk: 2.4.2 - chokidar: 3.5.3 - ci-info: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - enquirer: 2.4.1 - env-paths: 2.2.1 - ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 - find-up: 2.1.0 - fp-ts: 1.19.3 - fs-extra: 7.0.1 - glob: 7.2.0 - immutable: 4.3.4 - io-ts: 1.10.4 - keccak: 3.0.4 - lodash: 4.17.21 - mnemonist: 0.38.5 - mocha: 10.2.0 - p-map: 4.0.0 - raw-body: 2.5.2 - resolve: 1.17.0 - semver: 6.3.1 - solc: 0.7.3(debug@4.3.4) - source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 - tsort: 0.0.1 - typescript: 5.1.6 - undici: 5.26.5 - uuid: 8.3.2 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - /hardhat@2.18.3(ts-node@10.9.1)(typescript@4.9.5): resolution: {integrity: sha512-JuYaTG+4ZHVjEHCW5Hn6jCHH3LpO75dtgznZpM/dLv12RcSlw/xHbeQh3FAsGahQr1epKryZcZEMHvztVZHe0g==} hasBin: true @@ -21987,8 +20155,8 @@ packages: - supports-color - utf-8-validate - /hardhat@2.18.3(ts-node@10.9.1)(typescript@5.3.2): - resolution: {integrity: sha512-JuYaTG+4ZHVjEHCW5Hn6jCHH3LpO75dtgznZpM/dLv12RcSlw/xHbeQh3FAsGahQr1epKryZcZEMHvztVZHe0g==} + /hardhat@2.19.1(ts-node@10.9.1)(typescript@5.3.2): + resolution: {integrity: sha512-bsWa63g1GB78ZyMN08WLhFElLPA+J+pShuKD1BFO2+88g3l+BL3R07vj9deIi9dMbssxgE714Gof1dBEDGqnCw==} hasBin: true peerDependencies: ts-node: '*' @@ -22055,74 +20223,7 @@ packages: - utf-8-validate dev: false - /hardhat@2.18.3(typescript@5.1.6): - resolution: {integrity: sha512-JuYaTG+4ZHVjEHCW5Hn6jCHH3LpO75dtgznZpM/dLv12RcSlw/xHbeQh3FAsGahQr1epKryZcZEMHvztVZHe0g==} - hasBin: true - peerDependencies: - ts-node: '*' - typescript: '*' - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - dependencies: - '@ethersproject/abi': 5.7.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-blockchain': 7.0.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-evm': 2.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-statemanager': 2.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - '@nomicfoundation/ethereumjs-vm': 7.0.2 - '@nomicfoundation/solidity-analyzer': 0.1.1 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.3 - '@types/lru-cache': 5.1.1 - adm-zip: 0.4.16 - aggregate-error: 3.1.0 - ansi-escapes: 4.3.2 - chalk: 2.4.2 - chokidar: 3.5.3 - ci-info: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - enquirer: 2.4.1 - env-paths: 2.2.1 - ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 - find-up: 2.1.0 - fp-ts: 1.19.3 - fs-extra: 7.0.1 - glob: 7.2.0 - immutable: 4.3.4 - io-ts: 1.10.4 - keccak: 3.0.4 - lodash: 4.17.21 - mnemonist: 0.38.5 - mocha: 10.2.0 - p-map: 4.0.0 - raw-body: 2.5.2 - resolve: 1.17.0 - semver: 6.3.1 - solc: 0.7.3(debug@4.3.4) - source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 - tsort: 0.0.1 - typescript: 5.1.6 - undici: 5.26.5 - uuid: 8.3.2 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /hardhat@2.19.1(ts-node@10.9.1)(typescript@5.3.2): + /hardhat@2.19.1(typescript@5.1.6): resolution: {integrity: sha512-bsWa63g1GB78ZyMN08WLhFElLPA+J+pShuKD1BFO2+88g3l+BL3R07vj9deIi9dMbssxgE714Gof1dBEDGqnCw==} hasBin: true peerDependencies: @@ -22178,9 +20279,8 @@ packages: solc: 0.7.3(debug@4.3.4) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.3.2) tsort: 0.0.1 - typescript: 5.3.2 + typescript: 5.1.6 undici: 5.26.5 uuid: 8.3.2 ws: 7.5.9 @@ -22272,10 +20372,6 @@ packages: type-fest: 0.8.1 dev: true - /hashlru@2.3.0: - resolution: {integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==} - dev: false - /hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} @@ -22847,6 +20943,7 @@ packages: /human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} + dev: true /human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} @@ -23063,14 +21160,6 @@ packages: multiformats: 9.9.0 dev: false - /interface-blockstore@3.0.2: - resolution: {integrity: sha512-lJXCyu3CwidOvNjkJARwCmoxl/HNX/mrfMxtyq5e/pVZA1SrlTj5lvb4LBYbfoynzewGUPcUU4DEUaXoLKliHQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - interface-store: 3.0.4 - multiformats: 10.0.3 - dev: false - /interface-datastore@6.1.1: resolution: {integrity: sha512-AmCS+9CT34pp2u0QQVXjKztkuq3y5T+BIciuiHDDtDZucZD8VudosnSdUyXJV6IsRkN5jc4RFDhCk1O6Q3Gxjg==} dependencies: @@ -23078,35 +21167,9 @@ packages: nanoid: 3.3.6 uint8arrays: 3.1.1 - /interface-datastore@7.0.4: - resolution: {integrity: sha512-Q8LZS/jfFFHz6XyZazLTAc078SSCoa27ZPBOfobWdpDiFO7FqPA2yskitUJIhaCgxNK8C+/lMBUTBNfVIDvLiw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - interface-store: 3.0.4 - nanoid: 4.0.2 - uint8arrays: 4.0.6 - dev: false - - /interface-datastore@8.2.5: - resolution: {integrity: sha512-kvLGJMz3RPoJF/g5DbEvfWWempIiSBLVMf63b0PBsziVcSkj0ofzHYI86v8vqpGedkQ81DtPCUKyvX9W7zWvrQ==} - dependencies: - interface-store: 5.1.4 - nanoid: 4.0.2 - uint8arrays: 4.0.6 - dev: false - /interface-store@2.0.2: resolution: {integrity: sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg==} - /interface-store@3.0.4: - resolution: {integrity: sha512-OjHUuGXbH4eXSBx1TF1tTySvjLldPLzRSYYXJwrEQI+XfH5JWYZofr0gVMV4F8XTwC+4V7jomDYkvGRmDSRKqQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /interface-store@5.1.4: - resolution: {integrity: sha512-SI2co5IAxAybBc9egRM2bXvHOa1RPh5SQQkO6di6t/aX92RbtzP4t8raB0l3GTzQmJADaBbzz8Tfa1QLgfMdGQ==} - dev: false - /internal-slot@1.0.6: resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} @@ -23155,11 +21218,6 @@ packages: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} - /ip-regex@5.0.0: - resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false - /ip@1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} dev: false @@ -23172,37 +21230,6 @@ packages: resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} engines: {node: '>= 10'} - /ipfs-bitswap@13.0.0: - resolution: {integrity: sha512-dTDRrXJmg27d/Z2V7bGo7zO6bPvLJrLpVyZldRSTUQgkd8pkrnM9Gs9S3hJyZS8n5BdFrGXBa4/tTMJwJ9d4lg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-peer-store': 1.2.9 - '@libp2p/topology': 3.0.2 - '@libp2p/tracked-map': 2.0.2 - '@multiformats/multiaddr': 11.6.1 - '@vascosantos/moving-average': 1.1.0 - abortable-iterator: 4.0.3 - any-signal: 3.0.1 - blockstore-core: 2.0.2 - debug: 4.3.4(supports-color@8.1.1) - err-code: 3.0.1 - interface-blockstore: 3.0.2 - it-length-prefixed: 8.0.4 - it-pipe: 2.0.5 - just-debounce-it: 3.2.0 - multiformats: 10.0.3 - protobufjs: 7.2.5 - readable-stream: 4.4.2 - timeout-abort-controller: 3.0.0 - uint8arrays: 4.0.6 - varint: 6.0.0 - varint-decoder: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - /ipfs-car@0.6.2(node-fetch@3.3.2): resolution: {integrity: sha512-tliuakkKKtCa4TTnFT3zJKjq/aD8EGKX8Y0ybCyrAW0fo/n2koZpxiLjBvtTs47Rqyji6ggXo+atPbJJ60hJmg==} hasBin: true @@ -23265,58 +21292,6 @@ packages: - supports-color dev: false - /ipfs-core-config@0.6.0: - resolution: {integrity: sha512-ga2rzjH2vtZRsDir4zjVh+gi6zlGno/yjfHhQn9GYUcKUL0HQ/aBG7XcLw8w7KgVMc93VMVGqfM3ueEGGW9X4Q==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details - dependencies: - '@chainsafe/libp2p-gossipsub': 4.1.1 - '@libp2p/floodsub': 5.0.0 - '@libp2p/logger': 2.1.1 - '@libp2p/mdns': 5.1.1 - '@libp2p/tcp': 5.0.2 - '@libp2p/webrtc-star': 5.0.3 - blockstore-datastore-adapter: 4.0.0 - datastore-core: 8.0.4 - datastore-fs: 8.0.0 - datastore-level: 9.0.4 - err-code: 3.0.1 - hashlru: 2.3.0 - interface-datastore: 7.0.4 - ipfs-repo: 16.0.0 - ipfs-utils: 9.0.14 - is-ipfs: 7.0.3 - it-all: 2.0.1 - it-drain: 2.0.1 - it-foreach: 1.0.1 - p-queue: 7.4.1 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - - /ipfs-core-types@0.13.0: - resolution: {integrity: sha512-IIKS9v2D5KIqReZMbyuCStI4FRyIbRA9nD3fji1KgKJPiic1N3iGe2jL4hy4Y3FQ30VbheWJ9jAROwMyvqxYNA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details - dependencies: - '@ipld/dag-pb': 3.0.2 - '@libp2p/interface-keychain': 1.0.8 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interface-pubsub': 3.0.7 - '@multiformats/multiaddr': 11.6.1 - '@types/node': 18.18.7 - interface-datastore: 7.0.4 - ipfs-unixfs: 8.0.0 - multiformats: 10.0.3 - transitivePeerDependencies: - - supports-color - dev: false - /ipfs-core-types@0.8.4(node-fetch@3.3.2): resolution: {integrity: sha512-sbRZA1QX3xJ6ywTiVQZMOxhlhp4osAZX2SXx3azOLxAtxmGWDMkHYt722VV4nZ2GyJy8qyk5GHQIZ0uvQnpaTg==} deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details @@ -23401,120 +21376,6 @@ packages: - supports-color dev: true - /ipfs-core-utils@0.17.0: - resolution: {integrity: sha512-mZbQ9ZkLGGR988hO0iCsB6FXDb0fS0vYRue07Ia8O3ODdKjZ69Jx7zYoYqpjTQQCgEN6RrX98aCTOw+ifziGvw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details - dependencies: - '@libp2p/logger': 2.1.1 - '@multiformats/multiaddr': 11.6.1 - '@multiformats/multiaddr-to-uri': 9.0.7 - any-signal: 3.0.1 - blob-to-it: 2.0.4 - browser-readablestream-to-it: 2.0.4 - err-code: 3.0.1 - ipfs-core-types: 0.13.0 - ipfs-unixfs: 8.0.0 - ipfs-utils: 9.0.14 - it-all: 2.0.1 - it-map: 2.0.1 - it-peekable: 2.0.1 - it-to-stream: 1.0.0 - merge-options: 3.0.4 - multiformats: 10.0.3 - nanoid: 4.0.2 - parse-duration: 1.1.0 - timeout-abort-controller: 3.0.0 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /ipfs-core@0.17.0(uint8arraylist@2.4.3): - resolution: {integrity: sha512-mngpgSIO14n3U2iZzjxUn/AQ8LVVxrN/VRRXbJArxtSJuz1anx2kgtemRaUZt4q5juWHjk8tLtVdNDlS0bXGkg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details - dependencies: - '@chainsafe/libp2p-noise': 10.2.0 - '@ipld/car': 5.2.4 - '@ipld/dag-cbor': 8.0.1 - '@ipld/dag-json': 9.1.1 - '@ipld/dag-pb': 3.0.2 - '@libp2p/bootstrap': 5.0.2 - '@libp2p/crypto': 1.0.17 - '@libp2p/delegated-content-routing': 3.0.1 - '@libp2p/delegated-peer-routing': 3.0.1 - '@libp2p/interface-dht': 1.0.5 - '@libp2p/interface-keys': 1.0.8 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-transport': 2.1.3 - '@libp2p/interfaces': 3.3.2 - '@libp2p/kad-dht': 5.0.2 - '@libp2p/logger': 2.1.1 - '@libp2p/mplex': 7.1.7 - '@libp2p/peer-id': 1.1.18 - '@libp2p/peer-id-factory': 1.0.20 - '@libp2p/record': 2.0.4 - '@libp2p/websockets': 5.0.10 - '@multiformats/mafmt': 11.1.2 - '@multiformats/multiaddr': 11.6.1 - '@multiformats/multiaddr-to-uri': 9.0.7 - '@multiformats/murmur3': 2.1.7 - any-signal: 3.0.1 - array-shuffle: 3.0.0 - blockstore-core: 2.0.2 - dag-jose: 3.0.1 - datastore-core: 8.0.4 - datastore-pubsub: 6.0.0 - dlv: 1.1.3 - err-code: 3.0.1 - hamt-sharding: 3.0.2 - hashlru: 2.3.0 - interface-blockstore: 3.0.2 - interface-datastore: 7.0.4 - ipfs-bitswap: 13.0.0 - ipfs-core-config: 0.6.0 - ipfs-core-types: 0.13.0 - ipfs-core-utils: 0.17.0 - ipfs-http-client: 59.0.0 - ipfs-repo: 16.0.0 - ipfs-unixfs: 8.0.0 - ipfs-unixfs-exporter: 9.0.2 - ipfs-unixfs-importer: 11.0.1 - ipfs-utils: 9.0.14 - ipns: 4.0.0(uint8arraylist@2.4.3) - is-domain-name: 1.0.1 - is-ipfs: 7.0.3 - it-drain: 2.0.1 - it-filter: 2.0.2 - it-first: 2.0.1 - it-last: 2.0.1 - it-map: 2.0.1 - it-merge: 2.0.1 - it-parallel: 3.0.4 - it-peekable: 2.0.1 - it-pipe: 2.0.5 - it-pushable: 3.2.1 - it-tar: 6.0.1 - it-to-buffer: 3.0.1 - just-safe-set: 4.2.1 - libp2p: 0.40.0 - merge-options: 3.0.4 - mortice: 3.0.1 - multiformats: 10.0.3 - pako: 2.1.0 - parse-duration: 1.1.0 - timeout-abort-controller: 3.0.0 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - uint8arraylist - - utf-8-validate - dev: false - /ipfs-http-client@55.0.0(node-fetch@3.3.2): resolution: {integrity: sha512-GpvEs7C7WL9M6fN/kZbjeh4Y8YN7rY8b18tVWZnKxRsVwM25cIFrRI8CwNt3Ugin9yShieI3i9sPyzYGMrLNnQ==} engines: {node: '>=14.0.0', npm: '>=3.0.0'} @@ -23545,91 +21406,6 @@ packages: - supports-color dev: true - /ipfs-http-client@59.0.0: - resolution: {integrity: sha512-cFMU8ykKgxK2/uAw4Hthy2Kd+UuoFBno89DOdUqHYvmilKrmfV5vrYwviVWLYveIpkkaj8FB5x4TBxsiU99y0Q==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details - dependencies: - '@ipld/dag-cbor': 8.0.1 - '@ipld/dag-json': 9.1.1 - '@ipld/dag-pb': 3.0.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-id': 1.1.18 - '@multiformats/multiaddr': 11.6.1 - any-signal: 3.0.1 - dag-jose: 3.0.1 - err-code: 3.0.1 - ipfs-core-types: 0.13.0 - ipfs-core-utils: 0.17.0 - ipfs-utils: 9.0.14 - it-first: 2.0.1 - it-last: 2.0.1 - merge-options: 3.0.4 - multiformats: 10.0.3 - parse-duration: 1.1.0 - stream-to-it: 0.2.4 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /ipfs-repo-migrations@14.0.1: - resolution: {integrity: sha512-wE22g05hzxegCWMhNj7deagCLsKPcNf8KmK1QN4WMob0kuZ4kDxCg7fusM68tGrOnhE+Ll/AVHseFlzmoU/ZbQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@ipld/dag-pb': 3.0.2 - '@multiformats/multiaddr': 11.6.1 - cborg: 1.10.2 - datastore-core: 8.0.4 - debug: 4.3.4(supports-color@8.1.1) - fnv1a: 1.1.1 - interface-blockstore: 3.0.2 - interface-datastore: 7.0.4 - it-length: 2.0.1 - multiformats: 10.0.3 - protobufjs: 7.2.5 - uint8arrays: 4.0.6 - varint: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /ipfs-repo@16.0.0: - resolution: {integrity: sha512-CYlHO3MK1CNfuCkRyLxXB9pKj2nx4yomH92DilhwDW+Et4rQ/8279RgmEh5nFNf7BgvIvYPE+3hVErGbVytS5Q==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@ipld/dag-pb': 3.0.2 - bytes: 3.1.2 - cborg: 1.10.2 - datastore-core: 8.0.4 - debug: 4.3.4(supports-color@8.1.1) - err-code: 3.0.1 - interface-blockstore: 3.0.2 - interface-datastore: 7.0.4 - ipfs-repo-migrations: 14.0.1 - it-drain: 2.0.1 - it-filter: 2.0.2 - it-first: 2.0.1 - it-map: 2.0.1 - it-merge: 2.0.1 - it-parallel-batch: 2.0.1 - it-pipe: 2.0.5 - it-pushable: 3.2.1 - just-safe-get: 4.2.0 - just-safe-set: 4.2.1 - merge-options: 3.0.4 - mortice: 3.0.1 - multiformats: 10.0.3 - p-queue: 7.4.1 - proper-lockfile: 4.1.2 - quick-lru: 6.1.2 - sort-keys: 5.0.0 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - /ipfs-unixfs-exporter@7.0.11: resolution: {integrity: sha512-qTYa69J7HbI2EIYNUddKPg9Y3rHkYZV0bNdmzZKA5+ZbwRVoUEuBW/cguEqTp22zHygh3sMnzYZFm0naVIdMgQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -23646,51 +21422,6 @@ packages: uint8arrays: 3.1.1 dev: false - /ipfs-unixfs-exporter@9.0.2: - resolution: {integrity: sha512-CoktRT+MgS3H06/IXrmtJpuLQcux7ff30y0ndDRYnZLCvnqD2Fr3YicoY1sDb8JluIPZ70Pmwovb6Du4NfKk+w==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@ipld/dag-cbor': 8.0.1 - '@ipld/dag-pb': 3.0.2 - '@multiformats/murmur3': 2.1.7 - err-code: 3.0.1 - hamt-sharding: 3.0.2 - interface-blockstore: 3.0.2 - ipfs-unixfs: 8.0.0 - it-last: 2.0.1 - it-map: 2.0.1 - it-parallel: 3.0.4 - it-pipe: 2.0.5 - it-pushable: 3.2.1 - multiformats: 10.0.3 - p-queue: 7.4.1 - uint8arrays: 4.0.6 - dev: false - - /ipfs-unixfs-importer@11.0.1: - resolution: {integrity: sha512-e7Ca5zj8MMcQAqQR1YQrEicgZEiUf0xoBLMmu/6g/PtZ0U1oZBFsaIHcbDIjjjrEXxxhK6IcAvqSfqqUBnGfBg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@ipld/dag-pb': 3.0.2 - '@multiformats/murmur3': 2.1.7 - err-code: 3.0.1 - hamt-sharding: 3.0.2 - interface-blockstore: 3.0.2 - ipfs-unixfs: 8.0.0 - it-all: 2.0.1 - it-batch: 2.0.1 - it-first: 2.0.1 - it-parallel-batch: 2.0.1 - merge-options: 3.0.4 - multiformats: 10.0.3 - rabin-wasm: 0.1.5 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - /ipfs-unixfs-importer@9.0.10: resolution: {integrity: sha512-W+tQTVcSmXtFh7FWYWwPBGXJ1xDgREbIyI1E5JzDcimZLIyT5gGMfxR3oKPxxWj+GKMpP5ilvMQrbsPzWcm3Fw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -23722,14 +21453,6 @@ packages: err-code: 3.0.1 protobufjs: 6.11.4 - /ipfs-unixfs@8.0.0: - resolution: {integrity: sha512-PAHtfyjiFs2PZBbeft5QRyXpVOvZ2zsGqID+zVRla7fjC1zRTqJkrGY9h6dF03ldGv/mSmFlNZh479qPC6aZKg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - err-code: 3.0.1 - protobufjs: 7.2.5 - dev: false - /ipfs-utils@9.0.14: resolution: {integrity: sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -23771,28 +21494,6 @@ packages: - supports-color dev: false - /ipns@4.0.0(uint8arraylist@2.4.3): - resolution: {integrity: sha512-I+it3SkkQ8oYF7tT1Yphipau+3KEyJ72r6BDNWaVlQM+nTu28Zz1v5NoQCH9lqkh2nUpW02nSFOQJ3S4lqAyzg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/crypto': 1.0.17 - '@libp2p/interface-dht': 1.0.5 - '@libp2p/interface-keys': 1.0.8 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/logger': 2.1.1 - '@libp2p/peer-id': 1.1.18 - cborg: 1.10.2 - err-code: 3.0.1 - interface-datastore: 7.0.4 - multiformats: 10.0.3 - protons-runtime: 4.0.2(uint8arraylist@2.4.3) - timestamp-nano: 1.0.1 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - - uint8arraylist - dev: false - /is-absolute@1.0.0: resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} engines: {node: '>=0.10.0'} @@ -23906,10 +21607,6 @@ packages: engines: {node: '>=8'} hasBin: true - /is-domain-name@1.0.1: - resolution: {integrity: sha512-52ToNggHmkZGPl8yLFNrk+cKHUUnkhS0l2jh+yMLq6kj9C5IMLSztvJsW5WO5eMy0OS0jdu4o2tptT9dN0hAFg==} - dev: false - /is-electron@2.2.2: resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} @@ -23988,23 +21685,6 @@ packages: dependencies: ip-regex: 4.3.0 - /is-ipfs@7.0.3: - resolution: {integrity: sha512-IwjmN5DYrWQgk75dPX9WOFDbGpStJg6SLMLXXlxwpI3/SnwAIz3PwrdnxB+s2k+RjOTn9ueFIbGWxF2VMUYmLQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@multiformats/mafmt': 11.1.2 - '@multiformats/multiaddr': 11.6.1 - iso-url: 1.2.1 - multiformats: 10.0.3 - uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color - dev: false - - /is-loopback-addr@2.0.2: - resolution: {integrity: sha512-26POf2KRCno/KTNL5Q0b/9TYnL00xEsSaLfiFRmjM7m7Lw7ZMmFybzzuX4CcsLAluZGd+niLUiMRxEooVE3aqg==} - dev: false - /is-lower-case@2.0.2: resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} dependencies: @@ -24111,10 +21791,6 @@ packages: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} dev: true - /is-property@1.0.2: - resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - dev: false - /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: @@ -24177,6 +21853,7 @@ packages: /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true /is-string-and-not-blank@0.0.2: resolution: {integrity: sha512-FyPGAbNVyZpTeDCTXnzuwbu9/WpNXbCfbHXLpCRpN4GANhS00eEIP5Ef+k5HYSNIzIhdN9zRDoBj6unscECvtQ==} @@ -24293,12 +21970,6 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /iso-constants@0.1.2: - resolution: {integrity: sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ==} - engines: {node: '>=10'} - requiresBuild: true - dev: false - /iso-random-stream@2.0.2: resolution: {integrity: sha512-yJvs+Nnelic1L2vH2JzWvvPQFA4r7kSTnpST/+LkAQjSz0hos2oqLD+qIVi9Qk38Hoe7mNDt3j0S27R58MVjLQ==} engines: {node: '>=10'} @@ -24474,11 +22145,6 @@ packages: /it-all@1.0.6: resolution: {integrity: sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==} - /it-all@2.0.1: - resolution: {integrity: sha512-9UuJcCRZsboz+HBQTNOau80Dw+ryGaHYFP/cPYzFBJBFcfDathMYnhHk4t52en9+fcyDGPTdLB+lFc1wzQIroA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /it-all@3.0.4: resolution: {integrity: sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==} dev: true @@ -24487,55 +22153,17 @@ packages: resolution: {integrity: sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA==} dev: false - /it-batch@2.0.1: - resolution: {integrity: sha512-2gWFuPzamh9Dh3pW+OKjc7UwJ41W4Eu2AinVAfXDMfrC5gXfm3b1TF+1UzsygBUgKBugnxnGP+/fFRyn+9y1mQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /it-batched-bytes@1.0.1: - resolution: {integrity: sha512-ptBiZ0Mh3kJYySpG0pCS7JgvWhaAW1fGfKDVFtNIuNTA+bpSlXINvD5H3b14ZlJbnJFzFzRSCSZ10E1nH4z/WQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-stream-types: 1.0.5 - p-defer: 4.0.0 - uint8arraylist: 2.4.3 - dev: false - /it-drain@1.0.5: resolution: {integrity: sha512-r/GjkiW1bZswC04TNmUnLxa6uovme7KKwPhc+cb1hHU65E3AByypHH6Pm91WHuvqfFsm+9ws0kPtDBV3/8vmIg==} dev: false - /it-drain@2.0.1: - resolution: {integrity: sha512-ESuHV6MLUNxuSy0vGZpKhSRjW0ixczN1FhbVy7eGJHjX6U2qiiXTyMvDc0z/w+nifOOwPyI5DT9Rc3o9IaGqEQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /it-filter@1.0.3: resolution: {integrity: sha512-EI3HpzUrKjTH01miLHWmhNWy3Xpbx4OXMXltgrNprL5lDpF3giVpHIouFpr5l+evXw6aOfxhnt01BIB+4VQA+w==} dev: false - /it-filter@2.0.2: - resolution: {integrity: sha512-gocw1F3siqupegsOzZ78rAc9C+sYlQbI2af/TmzgdrR613MyEJHbvfwBf12XRekGG907kqXSOGKPlxzJa6XV1Q==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /it-first@1.0.7: resolution: {integrity: sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==} - /it-first@2.0.1: - resolution: {integrity: sha512-noC1oEQcWZZMUwq7VWxHNLML43dM+5bviZpfmkxkXlvBe60z7AFRqpZSga9uQBo792jKv9otnn1IjA4zwgNARw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /it-first@3.0.3: - resolution: {integrity: sha512-RC8tplctsDpoBUljwsp1viiyaR5fPvMe+FgbbcU0sFjKkJa7iwbB4CCPhHtVYSdjsrREfr0QEotfQrBoGyt7Dw==} - dev: false - - /it-foreach@1.0.1: - resolution: {integrity: sha512-eaVFhKxU+uwPs7+DKYxjuL6pj6c50/MBlAH+XPMgPWRRVIChVoyEIsdUQkkC0Ad6oTUmJbKRTnJxEY6o2aIs7A==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /it-glob@0.0.13: resolution: {integrity: sha512-0Hcd5BraJUPzL28NWiFbdNrcdyNxNTKKdU3sjdFiYynNTQpwlG2UKW31X7bp+XhJwux/oPzIquo5ioztVmc2RQ==} dependencies: @@ -24549,202 +22177,29 @@ packages: '@types/minimatch': 3.0.5 minimatch: 3.1.2 - /it-handshake@4.1.3: - resolution: {integrity: sha512-V6Lt9A9usox9iduOX+edU1Vo94E6v9Lt9dOvg3ubFaw1qf5NCxXLi93Ao4fyCHWDYd8Y+DUhadwNtWVyn7qqLg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-pushable: 3.2.1 - it-reader: 6.0.4 - it-stream-types: 2.0.1 - p-defer: 4.0.0 - uint8arraylist: 2.4.3 - dev: false - /it-last@1.0.6: resolution: {integrity: sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q==} - /it-last@2.0.1: - resolution: {integrity: sha512-uVMedYW0wa2Cx0TAmcOCLbfuLLII7+vyURmhKa8Zovpd+aBTMsmINtsta2n364wJ5qsEDBH+akY1sUtAkaYBlg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /it-length-prefixed@8.0.4: - resolution: {integrity: sha512-5OJ1lxH+IaqJB7lxe8IAIwt9UfSfsmjKJoAI/RO9djYoBDt1Jfy9PeVHUmOfqhqyu/4kJvWBFAJUaG1HhLQ12A==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - err-code: 3.0.1 - it-stream-types: 1.0.5 - uint8-varint: 1.0.8 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - dev: false - - /it-length-prefixed@9.0.3: - resolution: {integrity: sha512-YAu424ceYpXctxtjcLOqn7vJq082CaoP8J646ZusYISfQc3bpzQErgTUqMFj81V262KG2W9/YMBHsy6A/4yvmg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - err-code: 3.0.1 - it-reader: 6.0.4 - it-stream-types: 2.0.1 - uint8-varint: 2.0.1 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - dev: false - - /it-length@2.0.1: - resolution: {integrity: sha512-BynaPOK4UwcQX2Z+kqsQygXUNW9NZswfTnscfP7MLhFvVhRYbYJv8XH+09/Qwf8ktk65QdsGoVnDmQUCUGCyvg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /it-map@1.0.6: resolution: {integrity: sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ==} - /it-map@2.0.1: - resolution: {integrity: sha512-a2GcYDHiAh/eSU628xlvB56LA98luXZnniH2GlD0IdBzf15shEq9rBeb0Rg3o1SWtNILUAwqmQxEXcewGCdvmQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /it-merge@2.0.1: - resolution: {integrity: sha512-ItoBy3dPlNKnhjHR8e7nfabfZzH4Jy2OMPvayYH3XHy4YNqSVKmWTIxhz7KX4UMBsLChlIJZ+5j6csJgrYGQtw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-pushable: 3.2.1 - dev: false - - /it-merge@3.0.2: - resolution: {integrity: sha512-bMk2km8lTz+Rwv30hzDUdGIcqQkOemFJqmGT2wqQZ6/zHKCsYqdRunPrteCqHLV/nIVhUK8nZZkDA2eJ4MJZiA==} - dependencies: - it-pushable: 3.2.1 - dev: false - - /it-pair@2.0.6: - resolution: {integrity: sha512-5M0t5RAcYEQYNG5BV7d7cqbdwbCAp5yLdzvkxsZmkuZsLbTdZzah6MQySYfaAQjNDCq6PUnDt0hqBZ4NwMfW6g==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-stream-types: 2.0.1 - p-defer: 4.0.0 - dev: false - /it-parallel-batch@1.0.11: resolution: {integrity: sha512-UWsWHv/kqBpMRmyZJzlmZeoAMA0F3SZr08FBdbhtbe+MtoEBgr/ZUAKrnenhXCBrsopy76QjRH2K/V8kNdupbQ==} dependencies: it-batch: 1.0.9 dev: false - /it-parallel-batch@2.0.1: - resolution: {integrity: sha512-tXh567/JfDGJ90Zi//H9HkL7kY27ARp0jf2vu2jUI6PUVBWfsoT+gC4eT41/b4+wkJXSGgT8ZHnivAOlMfcNjA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-batch: 2.0.1 - dev: false - - /it-parallel@3.0.4: - resolution: {integrity: sha512-fuA+SysGxbZc+Yl7EUvzQqZ8bNYQghZ0Mq9zA+fxMQ5eQYzatNg6oJk1y1PvPvNqLgKJMzEInpRO6PbLC3hGAg==} - dependencies: - p-defer: 4.0.0 - dev: false - - /it-pb-stream@2.0.4: - resolution: {integrity: sha512-p0chBIT3HrZt3hIqvBEi+NgZxxT25MTJ362nKoHmzA/k/WsUPPbeSz7Ad+wRcGxZn2O5JEXCS5lOGRjSDSnlNg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-handshake: 4.1.3 - it-length-prefixed: 8.0.4 - it-stream-types: 1.0.5 - uint8arraylist: 2.4.3 - dev: false - /it-peekable@1.0.3: resolution: {integrity: sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ==} - /it-peekable@2.0.1: - resolution: {integrity: sha512-fJ/YTU9rHRhGJOM2hhQKKEfRM6uKB9r4yGGFLBHqp72ACC8Yi6+7/FhuBAMG8cpN6mLoj9auVX7ZJ3ul6qFpTA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /it-pipe@1.1.0: resolution: {integrity: sha512-lF0/3qTVeth13TOnHVs0BTFaziwQF7m5Gg+E6JV0BXcLKutC92YjSi7bASgkPOXaLEb+YvNZrPorGMBIJvZfxg==} dev: false - /it-pipe@2.0.5: - resolution: {integrity: sha512-y85nW1N6zoiTnkidr2EAyC+ZVzc7Mwt2p+xt2a2ooG1ThFakSpNw1Kxm+7F13Aivru96brJhjQVRQNU+w0yozw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-merge: 2.0.1 - it-pushable: 3.2.1 - it-stream-types: 1.0.5 - dev: false - - /it-pipe@3.0.1: - resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-merge: 3.0.2 - it-pushable: 3.2.1 - it-stream-types: 2.0.1 - dev: false - - /it-pushable@3.2.1: - resolution: {integrity: sha512-sLFz2Q0oyDCJpTciZog7ipP4vSftfPy3e6JnH6YyztRa1XqkpGQaafK3Jw/JlfEBtCXfnX9uVfcpu3xpSAqCVQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - p-defer: 4.0.0 - dev: false - - /it-reader@6.0.4: - resolution: {integrity: sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-stream-types: 2.0.1 - uint8arraylist: 2.4.3 - dev: false - - /it-sort@2.0.1: - resolution: {integrity: sha512-9f4jKOTHfxc/FJpg/wwuQ+j+88i+sfNGKsu2HukAKymm71/XDnBFtOAOzaimko3YIhmn/ERwnfEKrsYLykxw9A==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-all: 2.0.1 - dev: false - - /it-stream-types@1.0.5: - resolution: {integrity: sha512-I88Ka1nHgfX62e5mi5LLL+oueqz7Ltg0bUdtsUKDe9SoUqbQPf2Mp5kxDTe9pNhHQGs4pvYPAINwuZ1HAt42TA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /it-stream-types@2.0.1: - resolution: {integrity: sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /it-take@1.0.2: resolution: {integrity: sha512-u7I6qhhxH7pSevcYNaMECtkvZW365ARqAIt9K+xjdK1B2WUDEjQSfETkOCT8bxFq/59LqrN3cMLUtTgmDBaygw==} dev: false - /it-take@2.0.1: - resolution: {integrity: sha512-DL7kpZNjuoeSTnB9dMAJ0Z3m2T29LRRAU+HIgkiQM+1jH3m8l9e/1xpWs8JHTlbKivbqSFrQMTc8KVcaQNmsaA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /it-tar@6.0.1: - resolution: {integrity: sha512-KMKNqYQr/m3mJE0ERg6F2Snlk1d68tEMeOP0bPf5vboka1y0L7CZD2nlf57H+C9R31TA0SbtiOqkblRxEIONfg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - iso-constants: 0.1.2 - it-reader: 6.0.4 - it-stream-types: 1.0.5 - it-to-buffer: 3.0.1 - p-defer: 4.0.0 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - dev: false - - /it-to-buffer@3.0.1: - resolution: {integrity: sha512-TiMudfypF2yW+HdNfhDgbkNQ42yuK1MizB716kwnzIJSQa8AM15zh+VZG2L/xQWaqyWfra1dr9neWO55xsYolA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - uint8arrays: 4.0.6 - dev: false - /it-to-stream@1.0.0: resolution: {integrity: sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==} dependencies: @@ -24755,20 +22210,6 @@ packages: p-fifo: 1.0.0 readable-stream: 3.6.2 - /it-ws@5.0.6: - resolution: {integrity: sha512-TEEJQaGtkxgP/nGVq8dq48nPT85Afu8kwwvtDFLj4rQLWRhZcb26RWdXLdn9qhXkWPiWbK5H7JWBW1Bebj/SuQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - event-iterator: 2.0.0 - iso-url: 1.2.1 - it-stream-types: 1.0.5 - uint8arrays: 4.0.6 - ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - /iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: @@ -25355,10 +22796,6 @@ packages: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} dev: true - /jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - dev: false - /jsc-android@250231.0.0: resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} dev: false @@ -25533,6 +22970,7 @@ packages: /json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -25647,28 +23085,10 @@ packages: readable-stream: 2.3.8 setimmediate: 1.0.5 - /just-debounce-it@3.2.0: - resolution: {integrity: sha512-WXzwLL0745uNuedrCsCs3rpmfD6DBaf7uuVwaq98/8dafURfgQaBsSpjiPp5+CW6Vjltwy9cOGI6qE71b3T8iQ==} - dev: false - /just-extend@4.2.1: resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} dev: true - /just-safe-get@4.2.0: - resolution: {integrity: sha512-+tS4Bvgr/FnmYxOGbwziJ8I2BFk+cP1gQHm6rm7zo61w1SbxBwWGEq/Ryy9Gb6bvnloPq6pz7Bmm4a0rjTNlXA==} - dev: false - - /just-safe-set@4.2.1: - resolution: {integrity: sha512-La5CP41Ycv52+E4g7w1sRV8XXk7Sp8a/TwWQAYQKn6RsQz1FD4Z/rDRRmqV3wJznS1MDF3YxK7BCudX1J8FxLg==} - dev: false - - /k-bucket@5.1.0: - resolution: {integrity: sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==} - dependencies: - randombytes: 2.1.0 - dev: false - /keccak@3.0.4: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} @@ -25801,83 +23221,6 @@ packages: uint8arrays: 3.1.1 dev: false - /libp2p@0.40.0: - resolution: {integrity: sha512-AeLaA+8KIhUhjpXZcs20+Pnf2wIBp+zdSYPD1IgGCF0PlMbTdCvaIqhPzpTSd3+e5k7NZlgpd/BvCOLgQbfm5Q==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@achingbrain/nat-port-mapper': 1.0.12 - '@libp2p/connection': 4.0.2 - '@libp2p/crypto': 1.0.17 - '@libp2p/interface-address-manager': 2.0.5 - '@libp2p/interface-connection': 3.1.1 - '@libp2p/interface-connection-encrypter': 3.0.6 - '@libp2p/interface-connection-manager': 1.5.0 - '@libp2p/interface-content-routing': 1.0.7 - '@libp2p/interface-dht': 1.0.5 - '@libp2p/interface-metrics': 3.0.0 - '@libp2p/interface-peer-discovery': 1.1.1 - '@libp2p/interface-peer-id': 1.1.2 - '@libp2p/interface-peer-info': 1.0.10 - '@libp2p/interface-peer-routing': 1.1.1 - '@libp2p/interface-peer-store': 1.2.9 - '@libp2p/interface-pubsub': 3.0.7 - '@libp2p/interface-registrar': 2.0.12 - '@libp2p/interface-stream-muxer': 3.0.6 - '@libp2p/interface-transport': 2.1.3 - '@libp2p/interfaces': 3.3.2 - '@libp2p/logger': 2.1.1 - '@libp2p/multistream-select': 3.1.9 - '@libp2p/peer-collections': 2.2.2 - '@libp2p/peer-id': 1.1.18 - '@libp2p/peer-id-factory': 1.0.20 - '@libp2p/peer-record': 4.0.5 - '@libp2p/peer-store': 5.0.1 - '@libp2p/tracked-map': 2.0.2 - '@libp2p/utils': 3.0.13 - '@multiformats/mafmt': 11.1.2 - '@multiformats/multiaddr': 11.6.1 - abortable-iterator: 4.0.3 - any-signal: 3.0.1 - datastore-core: 8.0.4 - err-code: 3.0.1 - events: 3.3.0 - hashlru: 2.3.0 - interface-datastore: 7.0.4 - it-all: 2.0.1 - it-drain: 2.0.1 - it-filter: 2.0.2 - it-first: 2.0.1 - it-foreach: 1.0.1 - it-handshake: 4.1.3 - it-length-prefixed: 8.0.4 - it-map: 2.0.1 - it-merge: 2.0.1 - it-pair: 2.0.6 - it-pipe: 2.0.5 - it-sort: 2.0.1 - it-stream-types: 1.0.5 - merge-options: 3.0.4 - multiformats: 10.0.3 - mutable-proxy: 1.0.0 - node-forge: 1.3.1 - p-fifo: 1.0.0 - p-retry: 5.1.2 - p-settle: 5.1.1 - private-ip: 2.3.4 - protons-runtime: 4.0.2(uint8arraylist@2.4.3) - rate-limiter-flexible: 2.4.2 - retimer: 3.0.0 - sanitize-filename: 1.6.3 - set-delayed-interval: 1.0.0 - timeout-abort-controller: 3.0.0 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - wherearewe: 2.0.1 - xsalsa20: 1.2.0 - transitivePeerDependencies: - - supports-color - dev: false - /lie@3.1.1: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} dependencies: @@ -26173,6 +23516,7 @@ packages: /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true /lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} @@ -26306,14 +23650,7 @@ packages: /long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - - /longbits@1.1.0: - resolution: {integrity: sha512-22U2exkkYy7sr7nuQJYx2NEZ2kEMsC69+BxM5h8auLvkVIJa+LwAB5mFIExnuW2dFuYXFOWsFMKXjaWiq/htYQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - byte-access: 1.0.1 - uint8arraylist: 2.4.3 - dev: false + dev: true /longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -28043,6 +25380,7 @@ packages: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} hasBin: true + dev: true /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -28051,6 +25389,7 @@ packages: /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + dev: true /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} @@ -28246,6 +25585,7 @@ packages: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true + dev: true /mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} @@ -28301,16 +25641,6 @@ packages: resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} engines: {node: '>=10'} - /mortice@3.0.1: - resolution: {integrity: sha512-eyDUsl1nCR9+JtNksKnaESLP9MgAXCA4w1LTtsmOSQNsThnv++f36rrBu5fC/fdGIwTJZmbiaR/QewptH93pYA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - nanoid: 4.0.2 - observable-webworkers: 2.0.1 - p-queue: 7.4.1 - p-timeout: 6.1.2 - dev: false - /motion@10.16.2: resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} dependencies: @@ -28409,21 +25739,6 @@ packages: varint: 5.0.2 dev: true - /multiformats@10.0.3: - resolution: {integrity: sha512-K2yGSmstS/oEmYiEIieHb53jJCaqp4ERPDQAYrm5sV3UUrVDZeshJQCK6GHAKyIGufU1vAcbS0PdAAZmC7Tzcw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /multiformats@11.0.2: - resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /multiformats@12.1.3: - resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} @@ -28453,11 +25768,6 @@ packages: hasBin: true dev: true - /mutable-proxy@1.0.0: - resolution: {integrity: sha512-4OvNRr1DJpy2QuDUV74m+BWZ//n4gG4bmd21MzDSPqHEidIDWqwyOjcadU1LBMO3vXYGurVKjfBrxrSQIHFu9A==} - engines: {node: '>=6.X.X', npm: '>=3.X.X'} - dev: false - /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true @@ -28511,12 +25821,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /nanoid@4.0.2: - resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} - engines: {node: ^14 || ^16 || >=18} - hasBin: true - dev: false - /napi-macros@2.2.2: resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} @@ -28541,14 +25845,6 @@ packages: dependencies: node-fetch: 3.3.2 - /native-fetch@4.0.2(undici@5.26.5): - resolution: {integrity: sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==} - peerDependencies: - undici: '*' - dependencies: - undici: 5.26.5 - dev: false - /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -28567,11 +25863,6 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - dev: false - /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} @@ -28822,6 +26113,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 + dev: true /nprogress@0.2.0: resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} @@ -28909,10 +26201,6 @@ packages: resolution: {integrity: sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==} dev: false - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: false - /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -29005,11 +26293,6 @@ packages: http-https: 1.0.0 dev: true - /observable-webworkers@2.0.1: - resolution: {integrity: sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} @@ -29050,6 +26333,7 @@ packages: engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 + dev: true /open@6.4.0: resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} @@ -29181,11 +26465,6 @@ packages: resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} engines: {node: '>=8'} - /p-defer@4.0.0: - resolution: {integrity: sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==} - engines: {node: '>=12'} - dev: false - /p-event@2.3.1: resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==} engines: {node: '>=6'} @@ -29193,13 +26472,6 @@ packages: p-timeout: 2.0.1 dev: true - /p-event@5.0.1: - resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-timeout: 5.1.0 - dev: false - /p-fifo@1.0.0: resolution: {integrity: sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==} dependencies: @@ -29291,19 +26563,6 @@ packages: dependencies: aggregate-error: 3.1.0 - /p-queue@7.4.1: - resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==} - engines: {node: '>=12'} - dependencies: - eventemitter3: 5.0.1 - p-timeout: 5.1.0 - dev: false - - /p-reflect@3.1.0: - resolution: {integrity: sha512-3sG3UlpisPSaX+o7u2q01hIQmrpkvdl5GSO1ZwL7pfc5kHB2bPF0eFNCfYTrW1/LTUdgmPwBAvmT0Zr8eSmaAQ==} - engines: {node: '>=12'} - dev: false - /p-retry@4.6.2: resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} engines: {node: '>=8'} @@ -29311,22 +26570,6 @@ packages: '@types/retry': 0.12.0 retry: 0.13.1 - /p-retry@5.1.2: - resolution: {integrity: sha512-couX95waDu98NfNZV+i/iLt+fdVxmI7CbrrdC2uDWfPdUAApyxT4wmDlyOtR5KtTDmkDO0zDScDjDou9YHhd9g==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - '@types/retry': 0.12.1 - retry: 0.13.1 - dev: false - - /p-settle@5.1.1: - resolution: {integrity: sha512-VLgSBpA71aMncPVP5Es4nhQYxcxN0lit8hGlobJke8YTAhtwdRDu/s4KePP5gCT5LFfZty3qosBFYMgD5rFpCg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-limit: 4.0.0 - p-reflect: 3.1.0 - dev: false - /p-timeout@2.0.1: resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==} engines: {node: '>=4'} @@ -29334,16 +26577,6 @@ packages: p-finally: 1.0.0 dev: true - /p-timeout@5.1.0: - resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} - engines: {node: '>=12'} - dev: false - - /p-timeout@6.1.2: - resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} - engines: {node: '>=14.16'} - dev: false - /p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} @@ -29531,6 +26764,7 @@ packages: /path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} + dev: true /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -29737,10 +26971,6 @@ packages: find-up: 3.0.0 dev: false - /platform@1.3.6: - resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} - dev: false - /playwright-core@1.39.0: resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} engines: {node: '>=16'} @@ -30321,25 +27551,6 @@ packages: engines: {node: '>=6'} dev: false - /private-ip@2.3.4: - resolution: {integrity: sha512-ts/YFVwfBeLq61f9+KsOhXW6RH0wvY0gU50R6QZYzgFhggyyLK6WDFeYdjfi/HMnBm2hecLvsR3PB3JcRxDk+A==} - dependencies: - ip-regex: 4.3.0 - ipaddr.js: 2.1.0 - is-ip: 3.1.0 - netmask: 2.0.2 - dev: false - - /private-ip@3.0.1: - resolution: {integrity: sha512-Ezc16ANuhSHmWAE6lbXUKburNzGpR0J5X0Zh5Um/PZ/s57Fp+HYqYe6BYPH2QbqKr/5WebfzJQ1jq6Kj5dbRmA==} - engines: {node: '>=14.16'} - dependencies: - '@chainsafe/is-ip': 2.0.2 - ip-regex: 5.0.0 - ipaddr.js: 2.1.0 - netmask: 2.0.2 - dev: false - /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -30357,6 +27568,7 @@ packages: /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + dev: true /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} @@ -30392,6 +27604,7 @@ packages: graceful-fs: 4.2.11 retry: 0.12.0 signal-exit: 3.0.7 + dev: true /property-expr@2.0.6: resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} @@ -30424,42 +27637,6 @@ packages: '@types/node': 18.18.7 long: 4.0.0 - /protobufjs@7.2.5: - resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 18.18.7 - long: 5.2.3 - dev: false - - /protons-runtime@4.0.2(uint8arraylist@2.4.3): - resolution: {integrity: sha512-R4N6qKHgz8T2Gl45CTcZfITzXPQY9ym8lbLb4VyFMS4ag1KusCRZwkQXTBRhxQ+93ck3K3aDhK1wIk98AMtNyw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - peerDependencies: - uint8arraylist: ^2.3.2 - dependencies: - protobufjs: 7.2.5 - uint8arraylist: 2.4.3 - dev: false - - /protons-runtime@5.1.0: - resolution: {integrity: sha512-9zUaikdZj2u9Z/lFKH+qmtewvQdB1fIKTyN5Iytpdlt0rsHrfw8a14CqXKMWY4ow25HyGuu4D8+7wUbjmI/sdA==} - dependencies: - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - dev: false - /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -30674,11 +27851,6 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - /quick-lru@6.1.2: - resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} - engines: {node: '>=12'} - dev: false - /rabin-wasm@0.1.5: resolution: {integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==} hasBin: true @@ -30694,10 +27866,6 @@ packages: - supports-color dev: false - /race-signal@1.0.1: - resolution: {integrity: sha512-a5un4dInIWoB7+76DieVE+Xv+wmyochKJ3P2GVs9dUKIzGuPyFR5iU3gEWJvztde/15fSOGkslbIsPxi+Loosw==} - dev: false - /random-words@2.0.0: resolution: {integrity: sha512-uqpnDqFnYrZajgmvgjmBrSZL2V1UA/9bNPGrilo12CmBeBszoff/avElutUlwWxG12gvmCk/8dUhvHefYxzYjw==} dependencies: @@ -30718,10 +27886,6 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - /rate-limiter-flexible@2.4.2: - resolution: {integrity: sha512-rMATGGOdO1suFyf/mI5LYhts71g1sbdhmd6YvdiXO2gJnd42Tt6QS4JUKJKSWVVkMtBacm6l40FR7Trjo6Iruw==} - dev: false - /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} @@ -31211,17 +28375,6 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.4.2: - resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - dev: false - /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -31735,10 +28888,12 @@ packages: /retimer@3.0.0: resolution: {integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==} + dev: true /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} + dev: true /retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} @@ -32092,12 +29247,6 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sanitize-filename@1.6.3: - resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} - dependencies: - truncate-utf8-bytes: 1.0.2 - dev: false - /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} dev: false @@ -32386,10 +29535,6 @@ packages: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: true - /set-delayed-interval@1.0.0: - resolution: {integrity: sha512-29fhAwuZlLcuBnW/EwxvLcg2D3ELX+VBDNhnavs3YYkab72qmrcSeQNVdzl8EcPPahGQXhBM6MKdPLCQGMDakw==} - dev: false - /set-function-length@1.1.1: resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} engines: {node: '>= 0.4'} @@ -32782,13 +29927,6 @@ packages: is-plain-obj: 1.1.0 dev: true - /sort-keys@5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} - dependencies: - is-plain-obj: 4.1.0 - dev: false - /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -32936,10 +30074,6 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - /sprintf-js@1.1.2: - resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} - dev: false - /squirrelly@8.0.8: resolution: {integrity: sha512-7dyZJ9Gw86MmH0dYLiESsjGOTj6KG8IWToTaqBuB6LwPI+hyNb6mbQaZwrfnAQ4cMDnSWMUvX/zAYDLTSWLk/w==} engines: {node: '>=6.0.0'} @@ -33094,11 +30228,6 @@ packages: strip-ansi: 6.0.1 dev: true - /string-similarity@4.0.4: - resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: false - /string-width@2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} @@ -33251,6 +30380,7 @@ packages: /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + dev: true /strip-hex-prefix@1.0.0: resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} @@ -33742,12 +30872,6 @@ packages: retimer: 3.0.0 dev: true - /timeout-abort-controller@3.0.0: - resolution: {integrity: sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==} - dependencies: - retimer: 3.0.0 - dev: false - /timers-ext@0.1.7: resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} dependencies: @@ -33764,11 +30888,6 @@ packages: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: false - /tiny-lru@11.2.3: - resolution: {integrity: sha512-mF9jPTrvN7UHk0bekOk3RlFdFwfyS4CJYVsGc7nInL3pVgUCYj5r9X6GpZBFQgLr0TKJo8Dp+F3oRvYzxU9xiA==} - engines: {node: '>=12'} - dev: false - /tiny-lru@8.0.2: resolution: {integrity: sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg==} engines: {node: '>=6'} @@ -33912,12 +31031,6 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: false - /truncate-utf8-bytes@1.0.2: - resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - dependencies: - utf8-byte-length: 1.0.4 - dev: false - /ts-algebra@1.2.2: resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} dev: false @@ -34104,10 +31217,6 @@ packages: /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - /tslib@2.6.0: - resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} - dev: false - /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -34434,40 +31543,11 @@ packages: requiresBuild: true optional: true - /uint8-varint@1.0.8: - resolution: {integrity: sha512-QS03THS87Wlc0fBCC3xP5sqScDwfvVZLUrTCeMAQbQxQUWJosPC7C8uTNhpVUEgpTbV1Ut2Fer9Se3kI1KbnlQ==} - dependencies: - byte-access: 1.0.1 - longbits: 1.1.0 - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - dev: false - - /uint8-varint@2.0.1: - resolution: {integrity: sha512-euvmpuulJstK5+xNuI4S1KfnxJnbI5QP52RXIR3GZ3/ZMkOsEK2AgCtFpNvEQLXMxMx2o0qcyevK1fJwOZJagQ==} - dependencies: - uint8arraylist: 2.4.3 - uint8arrays: 4.0.6 - dev: false - - /uint8arraylist@2.4.3: - resolution: {integrity: sha512-oEVZr4/GrH87K0kjNce6z8pSCzLEPqHNLNR5sj8cJOySrTP8Vb/pMIbZKLJGhQKxm1TiZ31atNrpn820Pyqpow==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - uint8arrays: 4.0.6 - dev: false - /uint8arrays@3.1.1: resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} dependencies: multiformats: 9.9.0 - /uint8arrays@4.0.6: - resolution: {integrity: sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw==} - dependencies: - multiformats: 12.1.3 - dev: false - /ultron@1.1.1: resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} dev: true @@ -34862,10 +31942,6 @@ packages: dependencies: node-gyp-build: 4.6.1 - /utf8-byte-length@1.0.4: - resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} - dev: false - /utf8@3.0.0: resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} @@ -34999,15 +32075,9 @@ packages: resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} engines: {node: '>=12'} - /varint-decoder@1.0.0: - resolution: {integrity: sha512-JkOvdztASWGUAsXshCFHrB9f6AgR2Q8W08CEyJ+43b1qtFocmI8Sp1R/M0E/hDOY2FzVIqk63tOYLgDYWuJ7IQ==} - engines: {node: '>=4.0.0', npm: '>=3.0.0'} - dependencies: - varint: 5.0.2 - dev: false - /varint@5.0.2: resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + dev: true /varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} @@ -36099,13 +33169,6 @@ packages: tr46: 0.0.3 webidl-conversions: 3.0.1 - /wherearewe@2.0.1: - resolution: {integrity: sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - is-electron: 2.2.2 - dev: false - /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -36494,19 +33557,6 @@ packages: engines: {node: '>=12'} dev: true - /xml2js@0.6.2: - resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} - engines: {node: '>=4.0.0'} - dependencies: - sax: 1.3.0 - xmlbuilder: 11.0.1 - dev: false - - /xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - dev: false - /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true @@ -36516,10 +33566,6 @@ packages: engines: {node: '>=0.4.0'} dev: false - /xsalsa20@1.2.0: - resolution: {integrity: sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==} - dev: false - /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} diff --git a/sdk/package.json b/sdk/package.json index 347941d1..ba1f5749 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.0.0-alpha.19", + "version": "1.0.3", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -24,7 +24,7 @@ "@ethereum-attestation-service/eas-sdk": "1.3.7", "@ethersproject/abstract-signer": "^5.7.0", "@graphql-typed-document-node/core": "^3.2.0", - "@hypercerts-org/contracts": "1.0.0-alpha.6", + "@hypercerts-org/contracts": "1.0.0", "@openzeppelin/merkle-tree": "^1.0.5", "@urql/core": "^4.2.0", "@whatwg-node/fetch": "^0.9.13", diff --git a/sdk/src/index.ts b/sdk/src/index.ts index fbe0bacd..9e798de5 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -34,3 +34,18 @@ export * from "./validator"; * Utils */ export * from "./utils"; + +/** + * Graph + */ +export * from "./indexer/gql"; +export type { + ClaimByIdQuery, + ClaimTokenByIdQuery, + ClaimToken, + Claim, + ClaimTokensByClaimQuery, + ClaimTokensByOwnerQuery, + ClaimsByOwnerQuery, + RecentClaimsQuery, +} from "./indexer/gql/graphql"; From 210c167422f2d028eee9c4fccdcfe4bedd74469a Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Fri, 8 Dec 2023 22:23:33 +0100 Subject: [PATCH 044/118] Feat/sdk npm docs release 1 (#1231) * [Prod]:Deployed to Celo, updated Defender, version bumps for everyone (#1137) * Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop * Feat/deploy to celo (#1135) * Add HC contracts to OpenZeppelin Defender (#1134) * Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop * feat(defender): use hc packages in oz defender * feat(celo): graph deploy, sdk and defender config * chore(bump): SDK 0.8.14 Celo deployment * feat(celo): add celo support to frontend * chore(graph): fix turbo test flow * chore(graph): add comment to p.json * fix(gha): use pnpm cache in graph gha (#1138) * chore: add wrapper components for split and merge functionality (#1148) * format external url in case it is a direct ipfs link (#1181) * Chore/lets merge together (#1221) * Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop * Feat/deploy to celo (#1135) * Add HC contracts to OpenZeppelin Defender (#1134) * Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop * feat(defender): use hc packages in oz defender * feat(celo): graph deploy, sdk and defender config * chore(bump): SDK 0.8.14 Celo deployment * feat(celo): add celo support to frontend * chore(graph): fix turbo test flow * chore(graph): add comment to p.json * fix(gha): use pnpm cache in graph gha (#1138) * chore: add wrapper components for split and merge functionality * Fix/handle batch transfers graph (#1149) * feat(batch): add batch transfers to grap * SDK remove default chainID dependency (#1146) * Feat/batch burn (#1051) * feat(batch_burn): add batch burn function * fix(docs): update SemiFungible1155 docs * chore(lint): cleanup lint ignores * chore(lint): defender lint errors * chore(deploy): reduce optimizer run for kb limit * chore(script): update upgrade script * feat(gha): split graph deploy develop-main * chore(lint): line length rule to warn from err * chore(gha): run CI on PR to develop * chore(gha): run e2e,ci on pr,push to develop * feat(graph): update graph for burn methods * chore(turbo): split graph deploys (#1055) * Fix/workspace label (#1060) chore(yarn): update workspace label * 1052 subgraph a claimed token should indicate whether it was claimed from an allowlist (#1058) * fix(graph): link claim with allowlist * chore(tweak): yada * fix(graph): update mapping to claim (#1061) * nitial trader implementation (#1063) * feat(iface): draft of trader interface * feat(trader): simple offer, buy, cancel flow * feat(db): update allowlist query (#1057) * feat(test): tweaks and initial tests for Trader * chore(gha): remove hardcoded foundry nightly * feat(test): add initial test for trader sales * feat(test): sales tests * feat(deploy): deployed to goerli * chore(ci): updated hh scripts for trader contract * feat(pause): pausable controls and tests * feat(trader): init trader graph * feat(tokens): surface accepted tokens (#1065) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * Feat/accepted tokens (#1066) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * chore(address): update trader address graph * fix(import): add bigint to import * Feat/accepted tokens (#1067) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * chore(address): update trader address graph * fix(import): add bigint to import * fix(log): add logging to trader mapping * [Prod]:Deployed to Celo, updated Defender, version bumps for everyone (#1137) * Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop * Feat/deploy to celo (#1135) * Add HC contracts to OpenZeppelin Defender (#1134) * Fix/package build (#1124) * chore(npm): sdk to workspace to stop link: * chore(npm): contracts in workspace, no link: * chore(bump): 0.8.7 * chore(bump): contracts 0.8.7 into sdk 0.8.8 * fix(ci): linting errors from updated ws * fix(doc): optimism chainId to 10 from 100 * chore(build): remove type module from package.json * chore(contracts): package sol files * chore(pack): add sol files to contracts package * chore(bump): contract 0.8.9 * chore(pack): exports setup * chore(pack): contracts dir in package * chore(pack): cleanup build scripts * chore(bump): contracts 0.8.10 * chore(pack): add all contracts for inheritence * chore(bump): contracts 0.8.11 * chore(bump): sdk 0.8.10 with updated contracts package * chore(bump): updated packages in frontend * chore(gha): run action on pr and push to develop * feat(defender): use hc packages in oz defender * feat(celo): graph deploy, sdk and defender config * chore(bump): SDK 0.8.14 Celo deployment * feat(celo): add celo support to frontend * chore(graph): fix turbo test flow * chore(graph): add comment to p.json * fix(gha): use pnpm cache in graph gha (#1138) * chore(prep): protocol contracts to protocol dir * chore(prep): tests to protocol dir and remappings * chore(license): MIT license * Feat/init marketplace (#1139) * chore(prep): protocol contracts to protocol dir * chore(prep): tests to protocol dir and remappings * chore(license): MIT license * feat(marketplace): inject, build, refactor, test * chore(gha): run gha on push and develop-branches * fix(build): build and lint errors * chore(pnpm): refresh lock file * chore(build): reduce turbo concurrency * fix(build): whac a mole * chore(build): restore prettier in solhint * chore(build): env.template vars * chore(dist): clean and remap output contracts * chore(clean): last tests * fix(build): ignore cors-proxy type errors * chore(gha): add rpc env vars for fork testing --------- Co-authored-by: jipstavenuiter * chore(lint): cleanup config and affiliate flows (#1140) * chore(license): dual licensing contracts + repo (#1141) * feat(config): updated sdk init config * feat(tests): fix all tests to use updated init * feat(test): uncommented all SDK tests * fix(log): remove result logging * [Test] Release marketplace contracts on testnet and add to contracts package (#1150) * feat(deploy): deploy to testnets * chore(build): hardhat build * feat(pack): release, test, bump updated contracts * chore(gha): updated env vars * chore(pnpm): updated lock file * fix(build): build error, replaced util with viem * fix(pnpm): root dir ethers resolution * chore(pnpm): updated lockfile * fix(pnpm): overrides * chore(build): resolving build issues sdk * chore(refactor): dep resolution bug - del eth v5 * fix(test): mock ipfs in minting, remove timeout * chore(build): fresh build * chore(clean): remove contracts/contracts dir * fix(gha): non-next env var in gha for sdk * chore(run): kick * fix(jest): forceExit hanging async call * chore(build): fresh run for sanity * fix(lint): ignore **/abi instead of **/src/abi * feat(fe): integrate in FE and SDK 0.9.1 * chore(bump): sdk 0.9.1-viem * feat(fe): update FE to use SDK 0.9.1 * chore(cleanup): code cleanup SDK * chore(bump): sdk version bump * chore(fe): update SDK dep version * fix(sdk): chainId config * chore(parse): fix parse calc * fix parse allowlist csv tests * fix injected chain id in config * update component config.tsx * chore(bump): updated sdk alpha * chore(run): sanity check passed * chore(build): graphSDK * feat(fe): plasmic rendering issues. * feat(sdk): web3 token * chore(defender): removed api_key sep network conf * chore(defender): remove verbose log batch action * chore(gha): deduplicate runs - now on all push * chore(lint): lint fe lib * chore(gha): cleaned up env vars --------- Co-authored-by: jipstavenuiter * Fix/gha graph (#1165) * Feat/allowlist proof util (#1168) * feat(util): allowlist utils and updated docs * feat(test): updated test and docs * chore(bump): alpha-7 * feat(merkle): test merkleProof fetcher * chore(bump): 1.0.0-alpha.8 * fix(import): allowlist default export * chore(run): local validation run * Add hypercerts to marketplace functionality (#1170) * Feat/batch burn (#1051) * feat(batch_burn): add batch burn function * fix(docs): update SemiFungible1155 docs * chore(lint): cleanup lint ignores * chore(lint): defender lint errors * chore(deploy): reduce optimizer run for kb limit * chore(script): update upgrade script * feat(gha): split graph deploy develop-main * chore(lint): line length rule to warn from err * chore(gha): run CI on PR to develop * chore(gha): run e2e,ci on pr,push to develop * feat(graph): update graph for burn methods * chore(turbo): split graph deploys (#1055) * Fix/workspace label (#1060) chore(yarn): update workspace label * 1052 subgraph a claimed token should indicate whether it was claimed from an allowlist (#1058) * fix(graph): link claim with allowlist * chore(tweak): yada * fix(graph): update mapping to claim (#1061) * nitial trader implementation (#1063) * feat(iface): draft of trader interface * feat(trader): simple offer, buy, cancel flow * feat(db): update allowlist query (#1057) * feat(test): tweaks and initial tests for Trader * chore(gha): remove hardcoded foundry nightly * feat(test): add initial test for trader sales * feat(test): sales tests * feat(deploy): deployed to goerli * chore(ci): updated hh scripts for trader contract * feat(pause): pausable controls and tests * feat(trader): init trader graph * feat(tokens): surface accepted tokens (#1065) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * Feat/accepted tokens (#1066) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * chore(address): update trader address graph * fix(import): add bigint to import * Feat/accepted tokens (#1067) * feat(tokens): surface accepted tokens * fix(tokens): acceptedTokens test and fix * chore(address): update trader address graph * fix(import): add bigint to import * fix(log): add logging to trader mapping * chore(prep): protocol contracts to protocol dir * chore(prep): tests to protocol dir and remappings * chore(license): MIT license * Feat/init marketplace (#1139) * chore(prep): protocol contracts to protocol dir * chore(prep): tests to protocol dir and remappings * chore(license): MIT license * feat(marketplace): inject, build, refactor, test * chore(gha): run gha on push and develop-branches * fix(build): build and lint errors * chore(pnpm): refresh lock file * chore(build): reduce turbo concurrency * fix(build): whac a mole * chore(build): restore prettier in solhint * chore(build): env.template vars * chore(dist): clean and remap output contracts * chore(clean): last tests * fix(build): ignore cors-proxy type errors * chore(gha): add rpc env vars for fork testing --------- Co-authored-by: jipstavenuiter * chore(lint): cleanup config and affiliate flows (#1140) * chore(license): dual licensing contracts + repo (#1141) * [Test] Release marketplace contracts on testnet and add to contracts package (#1150) * feat(deploy): deploy to testnets * chore(build): hardhat build * feat(pack): release, test, bump updated contracts * chore(gha): updated env vars * chore(pnpm): updated lock file * fix(build): build error, replaced util with viem * fix(pnpm): root dir ethers resolution * chore(pnpm): updated lockfile * fix(pnpm): overrides * chore(build): resolving build issues sdk * chore(refactor): dep resolution bug - del eth v5 * fix(test): mock ipfs in minting, remove timeout * Direct Hypercert fraction sale (#1142) * feat(tranfer): transfer single hypercert fraction * feat(transfer): batch transfers and across collections * feat(transfer): reduce cyclomatic complexity * feat(offers): hypercert offer signatures * feat(transfer): standard txs tests hypercerts * chore(gha): only run on every push * fix(merge): merge artifacts --------- Co-authored-by: jipstavenuiter * feat(restriction): add transfer restriction to fe (#1173) * feat(metadata): add application name (#1174) * feat(deployments): typed deployment contracts * fix(props): props from plas to form (#1176) * format external url in case it is a direct ipfs link (#1182) * fix(fix formatting of ipfs urls on hypercert page) (#1183) * Feat/split and merge (#1185) * Add split and merge functionality to plasmic and add component logic. * Feat/hardhat deploy script (#1177) * feat(init): first pass hh script marketplace * feat(deploy): marketplace deploy and verify script * chore(deploy): add feerecipient to deploy * chore(scripts): remove scripts * feat(pack): deployment data and fresh pack * 1.0.0-alpha.0 * chore(npm): release 1.0.0-alpha.0 contracts * chore(npm): update contracts and sdk releases * fix(build): viem update fe * fix(default): remove default_chain_id * remove usage of NEXT_PUBLIC_DEFAULT_CHAIN_ID * fix build error --------- Co-authored-by: jipstavenuiter * feat(merkle): account allowlist strategy (#1186) * Added strategy and tests for hypercert functionality (#1188) * feat(fractions): added strategy and tests * feat(tests): update tests and tweak strat * feat(test): fix all the test and clean comms * fix(dist): moar contracts * fix(tweak): little cleanups * chore(lint): fix lint errors * fix(lint): updated foundry lint * Feat/partial fraction sale (#1190) * feat(fractions): added strategy and tests * feat(tests): update tests and tweak strat * feat(test): fix all the test and clean comms * fix(dist): moar contracts * fix(tweak): little cleanups * chore(lint): fix lint errors * fix(lint): updated foundry lint * feat(test): uncomment unused tests * Feat/sdk common js (#1191) * feat(fractions): added strategy and tests * feat(tests): update tests and tweak strat * feat(test): fix all the test and clean comms * fix(dist): moar contracts * fix(tweak): little cleanups * chore(lint): fix lint errors * fix(lint): updated foundry lint * feat(test): uncomment unused tests * feat(bugs): cjs build and import alpha.13 * fix(only): unexpected only in sdk test * feat(abis): updated SDK abis and restored tests (#1193) * feat(abis): updated SDK abis and restored tests * chore(bump): viem in fe * fix(test): add currency admin to test (#1197) * fix build error - set output:export in next config (#1199) * fix build error * lock nextjs version to 13.x.x * add placeholder for transfer fraction button (#1201) * add placeholder for transfer fraction button * remove unnecessary logic from transfer-fraction-button.tsx * change next build back to next export (#1202) remove unnecessary logic from transfer-fraction-button.tsx * Feature/transfer fraction button (#1203) * add transfer fraction button inside split fraction button * add confirmation dialog when transferring fraction * use override chain id in hypercert fetcher within plasmic * add reading of transfer restrictions to transfer fraction button * add override chain id functionality for plasmic editing (#1204) * Bugfix/add override chain id for plasmit editing (#1205) * add override chain id functionality for plasmic editing * add override chain id to effect dependencies * remove transfer fraction button from split fraction button (#1206) * Bugfix/only show transfer button for fraction owned (#1207) * only show transfer button for fractions owned * only show transfer button for fractions owned * Feat/more robust split transfer logic with hc strategy (#1208) * feat(hc): split NFT HC flow * feat(hc): hypercert order routing and validation * fix(e2e): disable faulty E2E tests * Feat/docs tests cleanup (#1210) * feat(checks): checkValidityHC, error code, 0.8.17 * feat(validator): overvalidator HC tests * fix(clean): remove hyperboard references * fix(lint): pragma protocol tests * fix(pragma): restore FeeManagerRoy.. pragma * feat(docs): updated version * feat(build): docs 1.0.0-alpha * Feat/docs tests cleanup (#1211) * feat(checks): checkValidityHC, error code, 0.8.17 * feat(validator): overvalidator HC tests * fix(clean): remove hyperboard references * fix(lint): pragma protocol tests * fix(pragma): restore FeeManagerRoy.. pragma * feat(docs): updated version * feat(build): docs 1.0.0-alpha * chore(docs): natspec tweaks * Feat/docs tests cleanup (#1212) * feat(checks): checkValidityHC, error code, 0.8.17 * feat(validator): overvalidator HC tests * fix(clean): remove hyperboard references * fix(lint): pragma protocol tests * fix(pragma): restore FeeManagerRoy.. pragma * feat(docs): updated version * feat(build): docs 1.0.0-alpha * chore(docs): natspec tweaks * feat(docs): docs sidebar * Feat/add batch transfer method to client methods (#1215) * feat(transfer): add method to client and type * feat(err): simulation and tx error handlers * feat(err): error handling test * chore(pack): dep cleanup and updates * merge fixes --------- Co-authored-by: bitbeckers * chore(bump): released contracts 1.0.0 * chore(bump): update graph testnet deploy * chore(bump): sdk version 1.0.0 * chore(bump): update deps in fe * chore(bump): sdk 1.0.3 in fe * fix(lint): test type lint --------- Co-authored-by: Jip Stavenuiter --- docs/docs/developer/api/sdk/modules.md | 39 +- .../version-1.0.0-alpha.0/about.md | 24 + .../developer/allowlists.md | 101 ++ .../api/contracts/AllowlistMinter.md | 84 ++ .../api/contracts/HypercertMinter.md | 895 +++++++++++++ .../api/contracts/HypercertTrader.md | 434 +++++++ .../api/contracts/IHypercertMinter.md | 39 + .../api/contracts/SemiFungible1155.md | 457 +++++++ .../v0.8/interfaces/AggregatorV3Interface.md | 77 ++ .../api/contracts/forge-std/src/console.md | 1 + .../api/contracts/forge-std/src/console2.md | 3 + .../api/contracts/interfaces/IAllowlist.md | 29 + .../contracts/interfaces/IHypercertToken.md | 192 +++ .../contracts/interfaces/IHypercertTrader.md | 133 ++ .../developer/api/contracts/libs/Errors.md | 59 + .../marketplace/BatchOrderTypehashRegistry.md | 46 + .../CreatorFeeManagerWithRebates.md | 76 ++ .../CreatorFeeManagerWithRoyalties.md | 64 + .../contracts/marketplace/CurrencyManager.md | 250 ++++ .../contracts/marketplace/ExecutionManager.md | 751 +++++++++++ .../marketplace/InheritedStrategy.md | 9 + .../marketplace/LooksRareProtocol.md | 1157 +++++++++++++++++ .../api/contracts/marketplace/NonceManager.md | 193 +++ .../marketplace/ProtocolFeeRecipient.md | 75 ++ .../contracts/marketplace/StrategyManager.md | 391 ++++++ .../contracts/marketplace/TransferManager.md | 553 ++++++++ .../marketplace/TransferSelectorNFT.md | 779 +++++++++++ .../executionStrategies/BaseStrategy.md | 41 + .../BaseStrategyChainlinkPriceLatency.md | 212 +++ .../StrategyChainlinkUSDDynamicAsk.md | 342 +++++ .../StrategyCollectionOffer.md | 127 ++ .../StrategyDutchAuction.md | 83 ++ .../StrategyHypercertFractionOffer.md | 123 ++ .../StrategyItemIdsRange.md | 75 ++ .../marketplace/helpers/OrderValidatorV2A.md | 215 +++ .../marketplace/helpers/ProtocolHelpers.md | 159 +++ .../interfaces/ICreatorFeeManager.md | 60 + .../interfaces/ICurrencyManager.md | 22 + .../interfaces/IExecutionManager.md | 99 ++ .../interfaces/IImmutableCreate2Factory.md | 41 + .../interfaces/ILooksRareProtocol.md | 157 +++ .../marketplace/interfaces/INonceManager.md | 53 + .../interfaces/IRoyaltyFeeRegistry.md | 29 + .../marketplace/interfaces/IStrategy.md | 41 + .../interfaces/IStrategyManager.md | 84 ++ .../interfaces/ITransferManager.md | 111 ++ .../libraries/CurrencyValidator.md | 7 + .../libraries/LowLevelHypercertCaller.md | 21 + .../MerkleProofCalldataWithNodes.md | 7 + .../OpenZeppelin/MerkleProofMemory.md | 7 + .../marketplace/libraries/OrderStructs.md | 7 + .../api/contracts/protocol/AllowlistMinter.md | 84 ++ .../api/contracts/protocol/HypercertMinter.md | 895 +++++++++++++ .../contracts/protocol/SemiFungible1155.md | 457 +++++++ .../protocol/interfaces/IAllowlist.md | 29 + .../protocol/interfaces/IHypercertToken.md | 192 +++ .../api/contracts/protocol/libs/Errors.md | 59 + .../developer/api/sdk/.nojekyll | 1 + .../developer/api/sdk/README.md | 185 +++ .../developer/api/sdk/classes/ClientError.md | 68 + .../api/sdk/classes/ConfigurationError.md | 66 + .../developer/api/sdk/classes/FetchError.md | 68 + .../api/sdk/classes/HypercertClient.md | 493 +++++++ .../api/sdk/classes/HypercertsStorage.md | 250 ++++ .../api/sdk/classes/InvalidOrMissingError.md | 68 + .../api/sdk/classes/MalformedDataError.md | 68 + .../developer/api/sdk/classes/MintingError.md | 68 + .../developer/api/sdk/classes/StorageError.md | 68 + .../api/sdk/classes/UnknownSchemaError.md | 71 + .../api/sdk/classes/UnsupportedChainError.md | 72 + .../api/sdk/classes/internal.default-1.md | 278 ++++ .../api/sdk/classes/internal.default-2.md | 131 ++ .../api/sdk/classes/internal.default.md | 110 ++ .../api/sdk/interfaces/CustomError.md | 39 + .../api/sdk/interfaces/DuplicateEvaluation.md | 56 + .../api/sdk/interfaces/EASEvaluation.md | 56 + .../api/sdk/interfaces/HypercertClaimdata.md | 167 +++ .../interfaces/HypercertClientInterface.md | 341 +++++ .../sdk/interfaces/HypercertClientMethods.md | 239 ++++ .../sdk/interfaces/HypercertClientState.md | 68 + .../interfaces/HypercertEvaluationSchema.md | 47 + .../interfaces/HypercertIndexerInterface.md | 176 +++ .../api/sdk/interfaces/HypercertMetadata.md | 123 ++ .../api/sdk/interfaces/HypercertPointer.md | 45 + .../interfaces/HypercertStorageInterface.md | 130 ++ .../api/sdk/interfaces/IPFSEvaluation.md | 34 + .../sdk/interfaces/SimpleTextEvaluation.md | 45 + .../interfaces/internal.EvaluatorInterface.md | 43 + .../interfaces/internal.HypercertClaimdata.md | 169 +++ .../interfaces/internal.HypercertMinter.md | 17 + .../developer/api/sdk/modules.md | 638 +++++++++ .../developer/api/sdk/modules/internal.md | 307 +++++ .../developer/burning.md | 12 + .../version-1.0.0-alpha.0/developer/config.md | 112 ++ .../version-1.0.0-alpha.0/developer/errors.md | 18 + .../developer/evaluations.md | 13 + .../developer/minting.md | 57 + .../developer/querying.md | 306 +++++ .../developer/quickstart-javascript.md | 101 ++ .../developer/quickstart-solidity.md | 41 + .../developer/split-merge.md | 29 + .../developer/supported-networks.md | 13 + .../devops/deploy-proxy.md | 120 ++ .../version-1.0.0-alpha.0/devops/errors.md | 45 + .../version-1.0.0-alpha.0/devops/index.md | 18 + .../version-1.0.0-alpha.0/devops/pause.md | 29 + .../version-1.0.0-alpha.0/devops/plasmic.md | 76 ++ .../version-1.0.0-alpha.0/devops/setup.md | 41 + .../version-1.0.0-alpha.0/devops/upgrade.md | 35 + .../version-1.0.0-alpha.0/faq.md | 139 ++ .../further-resources.md | 37 + .../implementation/glossary.md | 139 ++ .../implementation/metadata.md | 188 +++ .../implementation/token-standard.md | 29 + .../version-1.0.0-alpha.0/intro.md | 58 + .../minting-guide/gitcoin-round.md | 166 +++ .../minting-guide/minting-guide-start.md | 44 + .../minting-guide/step-by-step.md | 130 ++ .../whitepaper/evaluation.md | 23 + .../whitepaper/hypercerts-intro.md | 104 ++ .../version-1.0.0-alpha.0/whitepaper/ifs.md | 103 ++ .../whitepaper/impact-space.md | 35 + .../whitepaper/retrospective-funding.md | 42 + .../whitepaper/whitepaper-intro.md | 24 + .../version-1.0.0-alpha.1/about.md | 24 + .../developer/allowlists.md | 101 ++ .../api/contracts/AllowlistMinter.md | 84 ++ .../api/contracts/HypercertMinter.md | 895 +++++++++++++ .../api/contracts/HypercertTrader.md | 434 +++++++ .../api/contracts/IHypercertMinter.md | 39 + .../api/contracts/SemiFungible1155.md | 457 +++++++ .../v0.8/interfaces/AggregatorV3Interface.md | 77 ++ .../api/contracts/forge-std/src/console.md | 1 + .../api/contracts/forge-std/src/console2.md | 3 + .../api/contracts/interfaces/IAllowlist.md | 29 + .../contracts/interfaces/IHypercertToken.md | 192 +++ .../contracts/interfaces/IHypercertTrader.md | 133 ++ .../developer/api/contracts/libs/Errors.md | 59 + .../marketplace/BatchOrderTypehashRegistry.md | 46 + .../CreatorFeeManagerWithRebates.md | 76 ++ .../CreatorFeeManagerWithRoyalties.md | 64 + .../contracts/marketplace/CurrencyManager.md | 250 ++++ .../contracts/marketplace/ExecutionManager.md | 751 +++++++++++ .../marketplace/InheritedStrategy.md | 9 + .../marketplace/LooksRareProtocol.md | 1157 +++++++++++++++++ .../api/contracts/marketplace/NonceManager.md | 193 +++ .../marketplace/ProtocolFeeRecipient.md | 75 ++ .../contracts/marketplace/StrategyManager.md | 391 ++++++ .../contracts/marketplace/TransferManager.md | 553 ++++++++ .../marketplace/TransferSelectorNFT.md | 779 +++++++++++ .../executionStrategies/BaseStrategy.md | 41 + .../BaseStrategyChainlinkPriceLatency.md | 212 +++ .../StrategyChainlinkUSDDynamicAsk.md | 342 +++++ .../StrategyCollectionOffer.md | 127 ++ .../StrategyDutchAuction.md | 83 ++ .../StrategyHypercertFractionOffer.md | 123 ++ .../StrategyItemIdsRange.md | 75 ++ .../marketplace/helpers/OrderValidatorV2A.md | 215 +++ .../marketplace/helpers/ProtocolHelpers.md | 159 +++ .../interfaces/ICreatorFeeManager.md | 60 + .../interfaces/ICurrencyManager.md | 22 + .../interfaces/IExecutionManager.md | 99 ++ .../interfaces/IImmutableCreate2Factory.md | 41 + .../interfaces/ILooksRareProtocol.md | 157 +++ .../marketplace/interfaces/INonceManager.md | 53 + .../interfaces/IRoyaltyFeeRegistry.md | 29 + .../marketplace/interfaces/IStrategy.md | 41 + .../interfaces/IStrategyManager.md | 84 ++ .../interfaces/ITransferManager.md | 111 ++ .../libraries/CurrencyValidator.md | 7 + .../libraries/LowLevelHypercertCaller.md | 21 + .../MerkleProofCalldataWithNodes.md | 7 + .../OpenZeppelin/MerkleProofMemory.md | 7 + .../marketplace/libraries/OrderStructs.md | 7 + .../api/contracts/protocol/AllowlistMinter.md | 84 ++ .../api/contracts/protocol/HypercertMinter.md | 895 +++++++++++++ .../contracts/protocol/SemiFungible1155.md | 457 +++++++ .../protocol/interfaces/IAllowlist.md | 29 + .../protocol/interfaces/IHypercertToken.md | 192 +++ .../api/contracts/protocol/libs/Errors.md | 59 + .../developer/api/sdk/.nojekyll | 1 + .../developer/api/sdk/README.md | 185 +++ .../developer/api/sdk/classes/ClientError.md | 68 + .../api/sdk/classes/ConfigurationError.md | 66 + .../developer/api/sdk/classes/FetchError.md | 68 + .../api/sdk/classes/HypercertClient.md | 493 +++++++ .../api/sdk/classes/HypercertsStorage.md | 250 ++++ .../api/sdk/classes/InvalidOrMissingError.md | 68 + .../api/sdk/classes/MalformedDataError.md | 68 + .../developer/api/sdk/classes/MintingError.md | 68 + .../developer/api/sdk/classes/StorageError.md | 68 + .../api/sdk/classes/UnknownSchemaError.md | 71 + .../api/sdk/classes/UnsupportedChainError.md | 72 + .../api/sdk/classes/internal.default-1.md | 278 ++++ .../api/sdk/classes/internal.default-2.md | 131 ++ .../api/sdk/classes/internal.default.md | 110 ++ .../api/sdk/interfaces/CustomError.md | 39 + .../api/sdk/interfaces/DuplicateEvaluation.md | 56 + .../api/sdk/interfaces/EASEvaluation.md | 56 + .../api/sdk/interfaces/HypercertClaimdata.md | 167 +++ .../interfaces/HypercertClientInterface.md | 341 +++++ .../sdk/interfaces/HypercertClientMethods.md | 239 ++++ .../sdk/interfaces/HypercertClientState.md | 68 + .../interfaces/HypercertEvaluationSchema.md | 47 + .../interfaces/HypercertIndexerInterface.md | 176 +++ .../api/sdk/interfaces/HypercertMetadata.md | 123 ++ .../api/sdk/interfaces/HypercertPointer.md | 45 + .../interfaces/HypercertStorageInterface.md | 130 ++ .../api/sdk/interfaces/IPFSEvaluation.md | 34 + .../sdk/interfaces/SimpleTextEvaluation.md | 45 + .../interfaces/internal.EvaluatorInterface.md | 43 + .../interfaces/internal.HypercertClaimdata.md | 169 +++ .../interfaces/internal.HypercertMinter.md | 17 + .../developer/api/sdk/modules.md | 638 +++++++++ .../developer/api/sdk/modules/internal.md | 307 +++++ .../developer/burning.md | 12 + .../version-1.0.0-alpha.1/developer/config.md | 110 ++ .../version-1.0.0-alpha.1/developer/errors.md | 18 + .../developer/evaluations.md | 13 + .../developer/minting.md | 57 + .../developer/querying.md | 306 +++++ .../developer/quickstart-javascript.md | 101 ++ .../developer/quickstart-solidity.md | 41 + .../developer/split-merge.md | 29 + .../developer/supported-networks.md | 13 + .../devops/deploy-proxy.md | 120 ++ .../version-1.0.0-alpha.1/devops/errors.md | 45 + .../version-1.0.0-alpha.1/devops/index.md | 18 + .../version-1.0.0-alpha.1/devops/pause.md | 29 + .../version-1.0.0-alpha.1/devops/plasmic.md | 76 ++ .../version-1.0.0-alpha.1/devops/setup.md | 41 + .../version-1.0.0-alpha.1/devops/upgrade.md | 35 + .../version-1.0.0-alpha.1/faq.md | 139 ++ .../further-resources.md | 37 + .../implementation/glossary.md | 139 ++ .../implementation/metadata.md | 188 +++ .../implementation/token-standard.md | 29 + .../version-1.0.0-alpha.1/intro.md | 58 + .../minting-guide/gitcoin-round.md | 166 +++ .../minting-guide/minting-guide-start.md | 44 + .../minting-guide/step-by-step.md | 130 ++ .../whitepaper/evaluation.md | 23 + .../whitepaper/hypercerts-intro.md | 104 ++ .../version-1.0.0-alpha.1/whitepaper/ifs.md | 103 ++ .../whitepaper/impact-space.md | 35 + .../whitepaper/retrospective-funding.md | 42 + .../whitepaper/whitepaper-intro.md | 24 + .../version-1.0.0-alpha.0-sidebars.json | 162 +++ .../version-1.0.0-alpha.1-sidebars.json | 165 +++ graph/generated/schema.ts | 413 ++++++ graph/schema.graphql | 40 + graph/tests/.latest.json | 2 +- 252 files changed, 36488 insertions(+), 17 deletions(-) create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/about.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/faq.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/about.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/faq.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md create mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md create mode 100644 docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json create mode 100644 docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json diff --git a/docs/docs/developer/api/sdk/modules.md b/docs/docs/developer/api/sdk/modules.md index 74f892af..7d71a207 100644 --- a/docs/docs/developer/api/sdk/modules.md +++ b/docs/docs/developer/api/sdk/modules.md @@ -97,7 +97,9 @@ sdk/src/indexer/gql/graphql.ts:116 #### Defined in -sdk/src/indexer/gql/graphql.ts:580 + +sdk/src/indexer/gql/graphql.ts:587 + --- @@ -135,7 +137,7 @@ sdk/src/indexer/gql/graphql.ts:129 #### Defined in -sdk/src/indexer/gql/graphql.ts:607 +sdk/src/indexer/gql/graphql.ts:636 --- @@ -152,7 +154,7 @@ sdk/src/indexer/gql/graphql.ts:607 #### Defined in -sdk/src/indexer/gql/graphql.ts:600 +sdk/src/indexer/gql/graphql.ts:627 --- @@ -169,7 +171,8 @@ sdk/src/indexer/gql/graphql.ts:600 #### Defined in -sdk/src/indexer/gql/graphql.ts:590 +sdk/src/indexer/gql/graphql.ts:608 + --- @@ -186,8 +189,7 @@ sdk/src/indexer/gql/graphql.ts:590 #### Defined in -sdk/src/indexer/gql/graphql.ts:564 - +sdk/src/indexer/gql/graphql.ts:549 --- ### Deployment @@ -223,7 +225,8 @@ sdk/src/types/client.ts:23 #### Defined in -sdk/src/indexer/gql/gql.ts:47 +sdk/src/indexer/gql/gql.ts:53 + --- @@ -263,7 +266,8 @@ sdk/src/types/evaluation.d.ts:9 #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:6 +sdk/src/indexer/gql/fragment-masking.ts:5 + --- @@ -381,7 +385,7 @@ sdk/src/types/indexer.ts:10 #### Defined in -sdk/src/indexer/gql/graphql.ts:573 +sdk/src/indexer/gql/graphql.ts:569 --- @@ -639,7 +643,7 @@ Please regenerate the types. #### Defined in -sdk/src/indexer/gql/gql.ts:32 +sdk/src/indexer/gql/gql.ts:34 ▸ **graphql**(`source`): typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}"``] @@ -657,7 +661,7 @@ typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: #### Defined in -sdk/src/indexer/gql/gql.ts:37 +sdk/src/indexer/gql/gql.ts:39 ▸ **graphql**(`source`): typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}"``] @@ -675,7 +679,7 @@ typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirec #### Defined in -sdk/src/indexer/gql/gql.ts:41 +sdk/src/indexer/gql/gql.ts:45 --- @@ -891,7 +895,7 @@ sdk/src/utils/adapters.ts:19 #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:18 +sdk/src/indexer/gql/fragment-masking.ts:15 ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `TType` \| `null` \| `undefined` @@ -914,7 +918,8 @@ sdk/src/indexer/gql/fragment-masking.ts:18 #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:23 +sdk/src/indexer/gql/fragment-masking.ts:20 + ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> @@ -937,7 +942,8 @@ sdk/src/indexer/gql/fragment-masking.ts:23 #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:28 +sdk/src/indexer/gql/fragment-masking.ts:25 + ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> \| `null` \| `undefined` @@ -960,7 +966,8 @@ sdk/src/indexer/gql/fragment-masking.ts:28 #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:33 +sdk/src/indexer/gql/fragment-masking.ts:30 + --- diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/about.md b/docs/versioned_docs/version-1.0.0-alpha.0/about.md new file mode 100644 index 00000000..e2d4eb79 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/about.md @@ -0,0 +1,24 @@ +--- +title: The Hypercerts Foundation +id: about +--- + +# The Hypercerts Foundation + +### Mission + +The mission of the Hypercerts Foundation is to advance the development and adoption of open-source protocols for funding and rewarding positive impact. + +### Organization + +The Hypercerts Foundation is a fully independent organisation working closely with stakeholders in the open source, scientific research, and cryptography communities to develop and promote additional protocols that are decentralized, secure, and transparent. The Foundation will also provide support and resources to help drive the wider adoption of these protocols. + +### History + +Research on hypercerts was first presented to the public by David A. Dalrymple at the conference series Funding the Commons in March 2022. However, the concept of “impact certificates” has been a recurring theme at conferences and in online discussion forums since at least 2014. In late 2022, a small team of research scientists, developers, and practitioners began implementing hypercerts as a set of Ethereum-based smart contracts that could be used to assert and fund impact claims. The Hypercerts Foundation will now serve as the long-term home for this work. + +The new foundation is supported in part by Protocol Labs and is part of the broader Protocol Labs Network of hundreds of companies and organizations. The Foundation will complement Protocol Labs Network’s mission of enabling a more secure, open, and accessible internet. The Hypercerts Foundation, however, is fully independent and will focus on protocol development and cultivating a community of developers and impact entrepreneurs well beyond the Protocol Labs Network. + +### Further links + +Read the full [announcement of the Hypercerts Foundation](https://hypercerts.notion.site/Introducing-the-Hypercerts-Foundation-d956203fe0fc4792980da138015e770a). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md new file mode 100644 index 00000000..bc65b116 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md @@ -0,0 +1,101 @@ +# Allowlists + +Allowlists are an efficient way to enable distribution of hypercert fractions amongst a group. +First, the creator will create the hypercert with the metadata and an immutable allowlist. +With the `claimId`, every account specified in the allowlist can later mint their fraction token from that allowlist. + +## Create an allowlist + +First specify an allowlist, mapping addresses to the number of units they should receive. + +```js +import { + TransferRestrictions, + formatHypercertData, + Allowlist, +} from "@hypercerts-org/sdk"; + +const allowlist: Allowlist = [ + { address: "0x123", units: 100 }, + { address: "0xabc", units: 100 }, +]; +``` + +Then, call `createAllowlist` with the metadata and allowlist. + +```js +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; +const transferRestrictions = TransferRestrictions.FromCreatorOnly + +const { claimId } = await hypercerts.createAllowlist({ + allowList, + metaData, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **note** We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree generation and data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree) + +It first checks if the client is writable and if the operator is a signer. If the operator is not a signer, it throws an `InvalidOrMissingError`. + +Next, it validates the allowlist and metadata by calling the `validateAllowlist` and `validateMetaData` functions respectively. If either the allowlist or metadata is invalid, it throws a `MalformedDataError`. + +Once the allowlist and metadata are validated, the method creates a Merkle tree from the allowlist and stores it on IPFS. It then stores the metadata on IPFS as well. + +Finally, the method invokes the `createAllowlist` function on the contract with the signer's `address`, the total number of `units`, the Merkle tree `root`, the metadata `CID`, and the `transfer restrictions`. If the method is called with `overrides`, it passes them to the createAllowlist function. + +## Claiming a fraction token + +Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: + +| Variable | Type | Source | +| -------- | ------------ | ------------ | +| claimId | BigNumberish | Hypercert ID | +| units | BigNumberish | Allowlist | +| proof | BytesLike[] | Merkle tree | + +We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. + +Then, call `mintClaimFractionFromAllowlist` with the required data. The contracts will also verify the proofs. However, when providing the `root` in the function input, the proofs will be verified before a transaction is submitted. + +```js +import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; + +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const address = "0xc0ffee254729296a45a3885639AC7E10F9d54979"; + +const { indexer, storage } = hypercertsClient; +const claimById = await indexer.claimById(claimId); +const { uri, tokenID: _id } = claimById.claim; +const metadata = await storage.getMetadata(uri || ""); +const treeResponse = await storage.getData(metadata.allowList); +const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); + +let args; +// Find the proof in the allowlist +for (const [leaf, value] of tree.entries()) { + if (value[0] === address) { + args = { + proofs: tree.getProof(leaf), + units: Number(value[1]), + claimId: _id, + }; + break; + } +} + +// Mint fraction token +const tx = await hypercerts.mintClaimFractionFromAllowlist({ + ...args, +}); +``` + +Let's see what happens under the hood: + +First, the method checks that the client is not `read only` and that the operator is a signer. If not, it throws an `InvalidOrMissingError`. + +Next, the method verifies the Merkle `proof` using the OpenZeppelin Merkle tree library. If a `root` is provided, the method uses it to verify the proof. If the proof is invalid, it throws an error. + +Finally, the method calls the `mintClaimFromAllowlist` function on the contract with the signer `address`, Merkle `proof`, `claim ID`, and number of `units` as parameters. If overrides are provided, the method uses them to send the transaction. Otherwise, it sends the transaction without overrides. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md new file mode 100644 index 00000000..e31e8840 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md @@ -0,0 +1,434 @@ +# HypercertTrader + +_bitbeckers_ + +> Contract for managing hypercert trades + +Implementation of the HypercertTrader Interface + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsForSale | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +### getOffer + +```solidity +function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------- | ----------- | +| \_0 | IHypercertTrader.Offer | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### offers + +```solidity +function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | --------------------------------- | ----------- | +| offerer | address | undefined | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsAvailable | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| offerType | enum IHypercertTrader.OfferType | undefined | +| status | enum IHypercertTrader.OfferStatus | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### totalUnitsForSale + +```solidity +function totalUnitsForSale(address, uint256) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +## Errors + +### InvalidBuy + +```solidity +error InvalidBuy(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### InvalidOffer + +```solidity +error InvalidOffer(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### NotAllowed + +```solidity +error NotAllowed() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md new file mode 100644 index 00000000..13a84632 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md @@ -0,0 +1,39 @@ +# IHypercertMinter + +## Methods + +### ownerOf + +```solidity +function ownerOf(uint256 id) external view returns (address) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 id) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md new file mode 100644 index 00000000..6be07157 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md @@ -0,0 +1,77 @@ +# AggregatorV3Interface + +## Methods + +### decimals + +```solidity +function decimals() external view returns (uint8) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ----- | ----------- | +| \_0 | uint8 | undefined | + +### description + +```solidity +function description() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### getRoundData + +```solidity +function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------ | ----------- | +| \_roundId | uint80 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### latestRoundData + +```solidity +function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### version + +```solidity +function version() external view returns (uint256) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md new file mode 100644 index 00000000..8d14ad8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md @@ -0,0 +1 @@ +# console diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md new file mode 100644 index 00000000..cb666cd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md @@ -0,0 +1,3 @@ +# console2 + +_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md new file mode 100644 index 00000000..06fb700c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md @@ -0,0 +1,133 @@ +# IHypercertTrader + +_bitbeckers_ + +> Interface for hypercert token trading + +This interface declares the required functionality to interact with the hypercert marketplace + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| units | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +## Events + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md new file mode 100644 index 00000000..4cb96bfc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md @@ -0,0 +1,46 @@ +# BatchOrderTypehashRegistry + +_LooksRare protocol team (👀,💎)_ + +> BatchOrderTypehashRegistry + +The contract generates the batch order hash that is used to compute the digest for signature verification. + +## Methods + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +## Errors + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md new file mode 100644 index 00000000..a32aef65 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md @@ -0,0 +1,76 @@ +# CreatorFeeManagerWithRebates + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRebates + +This contract returns the creator fee address and the creator rebate amount. + +## Methods + +### STANDARD_ROYALTY_FEE_BP + +```solidity +function STANDARD_ROYALTY_FEE_BP() external view returns (uint256) +``` + +Standard royalty fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md new file mode 100644 index 00000000..41cab900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md @@ -0,0 +1,64 @@ +# CreatorFeeManagerWithRoyalties + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRoyalties + +This contract returns the creator fee address and the creator fee amount. + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +_There are two on-chain sources for the royalty fee to distribute. 1. RoyaltyFeeRegistry: It is an on-chain registry where creator fee is defined for all items of a collection. 2. ERC2981: The NFT Royalty Standard where royalty fee is defined at a itemId level in a collection. The on-chain logic looks up the registry first. If it does not find anything, it checks if a collection is ERC2981. If so, it fetches the proper royalty information for the itemId. For a bundle that contains multiple itemIds (for a collection using ERC2981), if the royalty fee/recipient differ among the itemIds part of the bundle, the trade reverts. This contract DOES NOT enforce any restriction for extremely high creator fee, nor verifies the creator fee fetched is inferior to the total price. If any contract relies on it to build an on-chain royalty logic, it should implement protection against: (1) high royalties (2) potential unexpected royalty changes that can occur after the creation of the order._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md new file mode 100644 index 00000000..9ff1c0fc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md @@ -0,0 +1,250 @@ +# CurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> CurrencyManager + +This contract manages the list of valid fungible currencies. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md new file mode 100644 index 00000000..83eefc37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md @@ -0,0 +1,751 @@ +# ExecutionManager + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> ExecutionManager + +This contract handles the execution and resolution of transactions. A transaction is executed on-chain when an off-chain maker order is matched by on-chain taker order of a different kind. For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md new file mode 100644 index 00000000..022cce57 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md @@ -0,0 +1,9 @@ +# InheritedStrategy + +_LooksRare protocol team (👀,💎)_ + +> InheritedStrategy + +This contract handles the verification of parameters for standard transactions. It does not verify the taker struct's itemIds and amounts array as well as minPrice (taker ask) / maxPrice (taker bid) because before the taker executes the transaction and the maker itemIds/amounts/price should have already been confirmed off-chain. + +_A standard transaction (bid or ask) is mapped to strategyId = 0._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md new file mode 100644 index 00000000..cc542c7e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -0,0 +1,1157 @@ +# LooksRareProtocol + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> LooksRareProtocol + +This contract is the core smart contract of the LooksRare protocol ("v2"). It is the main entry point for users to initiate transactions with taker orders and manage the cancellation of maker orders, which exist off-chain. ~~~~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~- ~~~~~~~~ ~~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~~ ~~~~~~~~ ~~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~~~~ + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ETH. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### chainId + +```solidity +function chainId() external view returns (uint256) +``` + +Current chainId. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +Current domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### restrictedExecuteTakerBid + +```solidity +function restrictedExecuteTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, address sender, bytes32 orderHash) external nonpayable returns (uint256 protocolFeeAmount) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| sender | address | undefined | +| orderHash | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| protocolFeeAmount | uint256 | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateDomainSeparator + +```solidity +function updateDomainSeparator() external nonpayable +``` + +This function allows the owner to update the domain separator (if possible). + +_Only callable by owner. If there is a fork of the network with a new chainId, it allows the owner to reset the domain separator for the new chain id._ + +### updateETHGasLimitForTransfer + +```solidity +function updateETHGasLimitForTransfer(uint256 newGasLimitETHTransfer) external nonpayable +``` + +This function allows the owner to update the maximum ETH gas limit for a standard transfer. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------ | +| newGasLimitETHTransfer | uint256 | New gas limit for ETH transfer | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------- | +| gasLimitETHTransfer | uint256 | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| askUser | address | undefined | +| bidUser | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| bidUser | address | undefined | +| bidRecipient | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +## Errors + +### CallerInvalid + +```solidity +error CallerInvalid() +``` + +It is returned if the function cannot be called by the sender. + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### CurrencyInvalid + +```solidity +error CurrencyInvalid() +``` + +It is returned if the currency is invalid. + +### ERC20TransferFromFail + +```solidity +error ERC20TransferFromFail() +``` + +It is emitted if the ERC20 transferFrom fails. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### QuoteTypeInvalid + +```solidity +error QuoteTypeInvalid() +``` + +It is returned if the maker quote type is invalid. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md new file mode 100644 index 00000000..fea95495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md @@ -0,0 +1,193 @@ +# NonceManager + +_LooksRare protocol team (👀,💎)_ + +> NonceManager + +This contract handles the nonce logic that is used for invalidating maker orders that exist off-chain. The nonce logic revolves around three parts at the user level: - order nonce (orders sharing an order nonce are conditional, OCO-like) - subset (orders can be grouped under a same subset) - bid/ask (all orders can be executed only if the bid/ask nonce matches the user's one on-chain) Only the order nonce is invalidated at the time of the execution of a maker order that contains it. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md new file mode 100644 index 00000000..36f6a35c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md @@ -0,0 +1,75 @@ +# ProtocolFeeRecipient + +_LooksRare protocol team (👀,💎)_ + +> ProtocolFeeRecipient + +This contract is used to receive protocol fees and transfer them to the fee sharing setter. Fee sharing setter cannot receive ETH directly, so we need to use this contract as a middleman to convert ETH into WETH before sending it. + +## Methods + +### FEE_SHARING_SETTER + +```solidity +function FEE_SHARING_SETTER() external view returns (address) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### WETH + +```solidity +function WETH() external view returns (contract IWETH) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------- | ----------- | +| \_0 | contract IWETH | undefined | + +### transferERC20 + +```solidity +function transferERC20(address currency) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------------- | +| currency | address | ERC20 currency address | + +### transferETH + +```solidity +function transferETH() external nonpayable +``` + +## Errors + +### ERC20TransferFail + +```solidity +error ERC20TransferFail() +``` + +It is emitted if the ERC20 transfer fails. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NothingToTransfer + +```solidity +error NothingToTransfer() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md new file mode 100644 index 00000000..a55f3985 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md @@ -0,0 +1,391 @@ +# StrategyManager + +_LooksRare protocol team (👀,💎)_ + +> StrategyManager + +This contract handles the addition and the update of execution strategies. + +## Methods + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md new file mode 100644 index 00000000..c6766114 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md @@ -0,0 +1,553 @@ +# TransferManager + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> TransferManager + +This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. + +_"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ + +## Methods + +### allowOperator + +```solidity +function allowOperator(address operator) external nonpayable +``` + +This function allows an operator to be added for the shared transfer system. Once the operator is allowed, users can grant NFT approvals to this operator. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------------- | +| operator | address | Operator address to allow | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### grantApprovals + +```solidity +function grantApprovals(address[] operators) external nonpayable +``` + +This function allows a user to grant approvals for an array of operators. Users cannot grant approvals if the operator is not allowed by this contract's owner. + +_Each operator address must be globally allowed to be approved._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### hasUserApprovedOperator + +```solidity +function hasUserApprovedOperator(address, address) external view returns (bool) +``` + +This returns whether the user has approved the operator address. The first address is the user and the second address is the operator (e.g. LooksRareProtocol). + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isOperatorAllowed + +```solidity +function isOperatorAllowed(address) external view returns (bool) +``` + +This returns whether the operator address is allowed by this contract's owner. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### removeOperator + +```solidity +function removeOperator(address operator) external nonpayable +``` + +This function allows the user to remove an operator for the shared transfer system. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | -------------------------- | +| operator | address | Operator address to remove | + +### revokeApprovals + +```solidity +function revokeApprovals(address[] operators) external nonpayable +``` + +This function allows a user to revoke existing approvals for an array of operators. + +_Each operator address must be approved at the user level to be revoked._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### splitItemsHypercert + +```solidity +function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function splits and transfers a fraction of a hypercert. + +_It does not allow batch transferring._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferBatchItemsAcrossCollections + +```solidity +function transferBatchItemsAcrossCollections(ITransferManager.BatchTransferItem[] items, address from, address to) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------------------------ | ----------- | +| items | ITransferManager.BatchTransferItem[] | undefined | +| from | address | undefined | +| to | address | undefined | + +### transferItemsERC1155 + +```solidity +function transferItemsERC1155(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC1155 collection. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsERC721 + +```solidity +function transferItemsERC721(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC721 collection. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsHypercert + +```solidity +function transferItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single Hypercert. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### ERC1155SafeBatchTransferFromFail + +```solidity +error ERC1155SafeBatchTransferFromFail() +``` + +It is emitted if the ERC1155 safeBatchTransferFrom fails. + +### ERC1155SafeTransferFromFail + +```solidity +error ERC1155SafeTransferFromFail() +``` + +It is emitted if the ERC1155 safeTransferFrom fails. + +### ERC721TransferFromFail + +```solidity +error ERC721TransferFromFail() +``` + +It is emitted if the ERC721 transferFrom fails. + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md new file mode 100644 index 00000000..9011bd50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md @@ -0,0 +1,779 @@ +# TransferSelectorNFT + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> TransferSelectorNFT + +This contract handles the logic for transferring non-fungible items. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md new file mode 100644 index 00000000..37866658 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md @@ -0,0 +1,41 @@ +# BaseStrategy + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md new file mode 100644 index 00000000..c9503939 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md @@ -0,0 +1,212 @@ +# BaseStrategyChainlinkPriceLatency + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategyChainlinkPriceLatency + +This contract allows the owner to define the maximum acceptable Chainlink price latency. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md new file mode 100644 index 00000000..e2d77dd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md @@ -0,0 +1,342 @@ +# StrategyChainlinkUSDDynamicAsk + +_LooksRare protocol team (👀,💎)_ + +> StrategyChainlinkUSDDynamicAsk + +This contract allows a seller to sell an NFT priced in USD and the receivable amount to be in ETH. + +## Methods + +### ETH_USD_PRICE_FEED_DECIMALS + +```solidity +function ETH_USD_PRICE_FEED_DECIMALS() external view returns (uint256) +``` + +_It is possible to call priceFeed.decimals() to get the decimals, but to save gas, it is hard coded instead._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ether (WETH) address. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### priceFeed + +```solidity +function priceFeed() external view returns (contract AggregatorV3Interface) +``` + +ETH/USD Chainlink price feed + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------------ | ----------- | +| \_0 | contract AggregatorV3Interface | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### ChainlinkPriceInvalid + +```solidity +error ChainlinkPriceInvalid() +``` + +It is returned if the Chainlink price is invalid (e.g. negative). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. + +### PriceNotRecentEnough + +```solidity +error PriceNotRecentEnough() +``` + +It is returned if the current block time relative to the latest price's update time is greater than the latency tolerance. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md new file mode 100644 index 00000000..ddec4495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md @@ -0,0 +1,127 @@ +# StrategyCollectionOffer + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> StrategyCollectionOffer + +This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount must be 1 (fractions are NFTs) + +## Methods + +### executeCollectionStrategyWithTakerAsk + +```solidity +function executeCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithAllowlist + +```solidity +function executeCollectionStrategyWithTakerAskWithAllowlist(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithProof + +```solidity +function executeCollectionStrategyWithTakerAskWithProof(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md new file mode 100644 index 00000000..1227878d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md @@ -0,0 +1,83 @@ +# StrategyDutchAuction + +_LooksRare protocol team (👀,💎)_ + +> StrategyDutchAuction + +This contract offers a single execution strategy for users to create Dutch auctions. + +## Methods + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md new file mode 100644 index 00000000..daa427e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -0,0 +1,123 @@ +# StrategyHypercertFractionOffer + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> StrategyHypercertFractionOffer + +This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. + +_Use cases can include tiered pricing; think early bird tickets._ + +## Methods + +### executeHypercertFractionStrategyWithTakerBid + +```solidity +function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeHypercertFractionStrategyWithTakerBidWithAllowlist + +```solidity +function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md new file mode 100644 index 00000000..6a1f0cd5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md @@ -0,0 +1,75 @@ +# StrategyItemIdsRange + +_LooksRare protocol team (👀,💎)_ + +> StrategyItemIdsRange + +This contract offers a single execution strategy for users to bid on a specific amount of items in a range bounded by 2 item ids. + +## Methods + +### executeStrategyWithTakerAsk + +```solidity +function executeStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md new file mode 100644 index 00000000..76918fc5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md @@ -0,0 +1,215 @@ +# OrderValidatorV2A + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderValidatorV2A + +This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) + +_This version does not handle strategies with partial fills._ + +## Methods + +### CRITERIA_GROUPS + +```solidity +function CRITERIA_GROUPS() external view returns (uint256) +``` + +Number of distinct criteria groups checked to evaluate the validity of an order. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### ERC1155_INTERFACE_ID + +```solidity +function ERC1155_INTERFACE_ID() external view returns (bytes4) +``` + +ERC1155 interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_1 + +```solidity +function ERC721_INTERFACE_ID_1() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_2 + +```solidity +function ERC721_INTERFACE_ID_2() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### HYPERCERT_INTERFACE_ID + +```solidity +function HYPERCERT_INTERFACE_ID() external view returns (bytes4) +``` + +Hypercert interfaceId + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### checkMakerOrderValidity + +```solidity +function checkMakerOrderValidity(OrderStructs.Maker makerOrder, bytes signature, OrderStructs.MerkleTree merkleTree) external view returns (uint256[9] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| signature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ---------- | ----------- | +| validationCodes | uint256[9] | undefined | + +### checkMultipleMakerOrderValidities + +```solidity +function checkMultipleMakerOrderValidities(OrderStructs.Maker[] makerOrders, bytes[] signatures, OrderStructs.MerkleTree[] merkleTrees) external view returns (uint256[9][] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------------------------- | ----------- | +| makerOrders | OrderStructs.Maker[] | undefined | +| signatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------------ | ----------- | +| validationCodes | uint256[9][] | undefined | + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +CreatorFeeManager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### deriveProtocolParameters + +```solidity +function deriveProtocolParameters() external nonpayable +``` + +Derive protocol parameters. Anyone can call this function. + +_It allows adjusting if the domain separator or creator fee manager address were to change._ + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +LooksRareProtocol domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +LooksRareProtocol. + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint256) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +TransferManager + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md new file mode 100644 index 00000000..91be29a9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md @@ -0,0 +1,159 @@ +# ProtocolHelpers + +_LooksRare protocol team (👀,💎)_ + +> ProtocolHelpers + +This contract contains helper view functions for order creation. + +## Methods + +### computeDigestMerkleTree + +```solidity +function computeDigestMerkleTree(OrderStructs.MerkleTree merkleTree) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### computeMakerDigest + +```solidity +function computeMakerDigest(OrderStructs.Maker maker) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### verifyMakerSignature + +```solidity +function verifyMakerSignature(OrderStructs.Maker maker, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### verifyMerkleTree + +```solidity +function verifyMerkleTree(OrderStructs.MerkleTree merkleTree, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Errors + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md new file mode 100644 index 00000000..b832744e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md @@ -0,0 +1,60 @@ +# ICreatorFeeManager + +_LooksRare protocol team (👀,💎)_ + +> ICreatorFeeManager + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry royaltyFeeRegistry) +``` + +It returns the royalty fee registry address/interface. + +#### Returns + +| Name | Type | Description | +| ------------------ | ---------------------------- | ------------------------------------- | +| royaltyFeeRegistry | contract IRoyaltyFeeRegistry | Interface of the royalty fee registry | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md new file mode 100644 index 00000000..da683d8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md @@ -0,0 +1,22 @@ +# ICurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> ICurrencyManager + +## Events + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------------------------------- | +| currency | address | Currency address (address(0) = ETH) | +| isAllowed | bool | Whether the currency is allowed | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md new file mode 100644 index 00000000..0e86c75b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md @@ -0,0 +1,99 @@ +# IExecutionManager + +_LooksRare protocol team (👀,💎)_ + +> IExecutionManager + +## Events + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | -------------------------------------- | +| creatorFeeManager | address | Address of the new creator fee manager | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ---------------------------------------- | +| maxCreatorFeeBp | uint256 | New maximum creator fee (in basis point) | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------------------------------------- | +| protocolFeeRecipient | address | Address of the new protocol fee recipient | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md new file mode 100644 index 00000000..393cb24b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md @@ -0,0 +1,41 @@ +# IImmutableCreate2Factory + +## Methods + +### findCreate2Address + +```solidity +function findCreate2Address(bytes32 salt, bytes initializationCode) external view returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | + +### safeCreate2 + +```solidity +function safeCreate2(bytes32 salt, bytes initializationCode) external payable returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md new file mode 100644 index 00000000..e7414f54 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md @@ -0,0 +1,157 @@ +# ILooksRareProtocol + +_LooksRare protocol team (👀,💎)_ + +> ILooksRareProtocol + +## Methods + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +## Events + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------------------------- | +| gasLimitETHTransfer | uint256 | Gas limit for an ETH transfer | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| askUser | address | Address of the ask user | +| bidUser | address | Address of the bid user | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it can be the taker ask user or different) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| bidUser | address | Address of the bid user | +| bidRecipient | address | Address of the recipient of the bid | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it is the maker ask user) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +## Errors + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md new file mode 100644 index 00000000..eaa3f977 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md @@ -0,0 +1,53 @@ +# INonceManager + +_LooksRare protocol team (👀,💎)_ + +> INonceManager + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------- | +| user | address | Address of the user | +| bidNonce | uint256 | New bid nonce | +| askNonce | uint256 | New ask nonce | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ------------------------------- | +| user | address | Address of the user | +| orderNonces | uint256[] | Array of order nonces cancelled | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | -------------------------------- | +| user | address | Address of the user | +| subsetNonces | uint256[] | Array of subset nonces cancelled | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md new file mode 100644 index 00000000..5ed0ef6c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md @@ -0,0 +1,29 @@ +# IRoyaltyFeeRegistry + +_LooksRare protocol team (👀,💎)_ + +> IRoyaltyFeeRegistry + +## Methods + +### royaltyInfo + +```solidity +function royaltyInfo(address collection, uint256 price) external view returns (address receiver, uint256 royaltyFee) +``` + +This function returns the royalty information for a collection at a given transaction price. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | + +#### Returns + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| receiver | address | Receiver address | +| royaltyFee | uint256 | Royalty fee amount | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md new file mode 100644 index 00000000..2b4a45bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md @@ -0,0 +1,41 @@ +# IStrategy + +_LooksRare protocol team (👀,💎)_ + +> IStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool isStrategy) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---------- | ---- | ---------------------------------------------- | +| isStrategy | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md new file mode 100644 index 00000000..ae6ea7b1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md @@ -0,0 +1,84 @@ +# IStrategyManager + +_LooksRare protocol team (👀,💎)_ + +> IStrategyManager + +## Events + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------------- | +| strategyId | uint256 | Id of the new strategy | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the transaction to be executed | +| isMakerBid | bool | Whether the strategyId is for maker bid | +| implementation | address | Address of the implementation of the strategy | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | -------------------------------------------------------- | +| strategyId | uint256 | Id of the strategy | +| isActive | bool | Whether the strategy is active (or not) after the update | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | + +## Errors + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md new file mode 100644 index 00000000..3ba8ca81 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md @@ -0,0 +1,111 @@ +# ITransferManager + +_LooksRare protocol team (👀,💎)_ + +> ITransferManager + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +## Errors + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md new file mode 100644 index 00000000..1b1f41a2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md @@ -0,0 +1,7 @@ +# CurrencyValidator + +_LooksRare protocol team (👀,💎)_ + +> CurrencyValidator + +This library validates the order currency to be the chain's native currency or the specified ERC20 token. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md new file mode 100644 index 00000000..5951cc56 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md @@ -0,0 +1,21 @@ +# LowLevelHypercertCaller + +_bitbeckers_ + +> LowLevelHypercertCaller + +This contract contains low-level calls to transfer ERC1155 tokens. + +## Errors + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### NotAContract + +```solidity +error NotAContract() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md new file mode 100644 index 00000000..943a54cd --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md @@ -0,0 +1,7 @@ +# MerkleProofCalldataWithNodes + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofCalldataWithNodes + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md new file mode 100644 index 00000000..37529181 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md @@ -0,0 +1,7 @@ +# MerkleProofMemory + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofMemory + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md new file mode 100644 index 00000000..6ffa83e2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md @@ -0,0 +1,7 @@ +# OrderStructs + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderStructs + +This library contains all order struct types for the LooksRare protocol (v2). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll new file mode 100644 index 00000000..e2ac6616 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md new file mode 100644 index 00000000..b1434ab0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md @@ -0,0 +1,185 @@ +Hypercerts SDK Documentation / [Exports](modules.md) + +# Hypercert SDK + +## Quickstart Guide + +1. Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +``` + +or + +```bash + yarn add @hypercerts-org/sdk +``` + +2. Import the SDK into your project: + +```bash +import { HypercertClient } from "@hypercerts-org/sdk"; +``` + +3. Create a new instance of the HypercertClient class with your configuration options: + +```js +const client = new HypercertClient({ + chainId: 5, + provider, + signer, + nftStorageToken, + web3StorageToken, +}); +``` + +> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in +> [read-only mode](#read-only-mode) + +4. Use the client object to interact with the Hypercert network. + +For example, you can use the `client.mintClaim` method to create a new claim: + +```js +const tx = await client.mintClaim( + metaData, + totalUnits, + transferRestriction, + overrides, +); +``` + +This will validate the metadata, store it on IPFS, create a new hypercert on-chain and return a transaction receipt. + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more information on how to use the SDK, check out the +[developer documentation](https://hypercerts.org/docs/developer/) and the +[Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. Don't forget to set your +environment variables for your NFT.storage and web3.storage API keys in your .env file. + +## Config + +The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check +the environment variables. + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without a signer or provider. +- The client was initialized with a provider but not a signer. +- The client was initialized with a signer but not a provider. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a +warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief +explanation of each constant: + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphName": "hypercerts-testnet" + } +} +``` + +### Client config properties + +| \| Property | Type | Description | +| ------------------ | -------------------- | -------------------------------------- | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | +| `graphName` | `string` | The name of the Gsubgraph to use. | +| `provider` | `providers.Provider` | A custom provider to use. | +| `signer` | `Signer` | A custom signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +### Environment variables + +To determine the missing configuration values the SDK defaults to the following environment variables: + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +## Client modules + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and +NFT.storage. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the storage, indexer, and contract getters, the HypercertClient allows +developers to easily interact with the various components of the Hypercert system. For example, a developer could use +the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based +on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the +contract. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md new file mode 100644 index 00000000..89f2105f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError + +# Class: ClientError + +An error that is caused by a problem with the client. + +## Hierarchy + +- `Error` + + ↳ **`ClientError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ClientError.md#constructor) + +### Properties + +- [payload](ClientError.md#payload) + +## Constructors + +### constructor + +• **new ClientError**(`message`, `payload?`) + +Creates a new instance of the ClientError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md new file mode 100644 index 00000000..03813867 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md @@ -0,0 +1,66 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError + +# Class: ConfigurationError + +The configuration was invalid + +## Hierarchy + +- `Error` + + ↳ **`ConfigurationError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ConfigurationError.md#constructor) + +### Properties + +- [payload](ConfigurationError.md#payload) + +## Constructors + +### constructor + +• **new ConfigurationError**(`message`, `payload?`) + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `message` | `string` | +| `payload?` | `Object` | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md new file mode 100644 index 00000000..d4c9f7c9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError + +# Class: FetchError + +Fails fetching a remote resource + +## Hierarchy + +- `Error` + + ↳ **`FetchError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](FetchError.md#constructor) + +### Properties + +- [payload](FetchError.md#payload) + +## Constructors + +### constructor + +• **new FetchError**(`message`, `payload?`) + +Creates a new instance of the FetchError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md new file mode 100644 index 00000000..a5a0e900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md @@ -0,0 +1,493 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient + +# Class: HypercertClient + +Hypercerts client factory + +**`Dev`** + +Creates a Hypercerts client instance + +**`Notice`** + +The client is readonly if no signer is set or if the contract address is not set + +**`Param`** + +Hypercerts client configuration + +**`Param`** + +Hypercerts storage object + +## Implements + +- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertClient.md#constructor) + +### Properties + +- [\_config](HypercertClient.md#_config) +- [\_contract](HypercertClient.md#_contract) +- [\_evaluator](HypercertClient.md#_evaluator) +- [\_indexer](HypercertClient.md#_indexer) +- [\_operator](HypercertClient.md#_operator) +- [\_storage](HypercertClient.md#_storage) +- [readonly](HypercertClient.md#readonly) + +### Accessors + +- [contract](HypercertClient.md#contract) +- [indexer](HypercertClient.md#indexer) +- [storage](HypercertClient.md#storage) + +### Methods + +- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClient.md#burnclaimfraction) +- [checkWritable](HypercertClient.md#checkwritable) +- [createAllowlist](HypercertClient.md#createallowlist) +- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) +- [mintClaim](HypercertClient.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClient.md#splitclaimunits) + +## Constructors + +### constructor + +• **new HypercertClient**(`config?`) + +Creates a new instance of the `HypercertClient` class. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | + +#### Defined in + +[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) + +## Properties + +### \_config + +• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) + +#### Defined in + +[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) + +--- + +### \_contract + +• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +#### Defined in + +[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) + +--- + +### \_evaluator + +• `Private` **\_evaluator**: [`default`](internal.default.md) + +#### Defined in + +[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) + +--- + +### \_indexer + +• `Private` **\_indexer**: [`default`](internal.default-1.md) + +#### Defined in + +[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) + +--- + +### \_operator + +• `Private` **\_operator**: `Provider` \| `Signer` + +#### Defined in + +[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) + +--- + +### \_storage + +• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) + +#### Defined in + +[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) + +## Accessors + +### contract + +• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +Gets the HypercertMinter contract used by the client. + +#### Returns + +[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +The contract. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) + +#### Defined in + +[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) + +--- + +### indexer + +• `get` **indexer**(): [`default`](internal.default-1.md) + +Gets the indexer for the client. + +#### Returns + +[`default`](internal.default-1.md) + +The indexer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) + +#### Defined in + +[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) + +--- + +### storage + +• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) + +Gets the storage layer for the client. + +#### Returns + +[`HypercertsStorage`](HypercertsStorage.md) + +The storage layer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) + +#### Defined in + +[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) + +## Methods + +### batchMintClaimFractionsFromAllowlists + +▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | +| `roots?` | `BytesLike`[] | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Implementation of + +HypercertClientInterface.batchMintClaimFractionsFromAllowlists + +#### Defined in + +[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) + +--- + +### burnClaimFraction + +▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> + +Burn a Hypercert claim by providing the claim id + +**`Dev`** + +Burns a Hypercert claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :----------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.burnClaimFraction + +#### Defined in + +[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) + +--- + +### checkWritable + +▸ `Private` **checkWritable**(): `boolean` + +#### Returns + +`boolean` + +#### Defined in + +[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) + +--- + +### createAllowlist + +▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Create a Hypercert claim with an allowlist + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist + +**`Notice`** + +The total number of units in the allowlist must match the total number of units for the Hypercert + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.createAllowlist + +#### Defined in + +[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) + +--- + +### mergeClaimUnits + +▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> + +Merge multiple Hypercert claims fractions into one + +**`Dev`** + +Merges multiple Hypercert claims into one + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :------------------ | +| `claimIds` | `BigNumberish`[] | Hypercert claim ids | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mergeClaimUnits + +#### Defined in + +[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) + +--- + +### mintClaim + +▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units and transfer restrictions + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaim + +#### Defined in + +[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) + +--- + +### mintClaimFractionFromAllowlist + +▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim fraction from an allowlist. + +**`Dev`** + +Verifies the claim proof and mints the claim fraction + +**`Notice`** + +If known, provide the root for client side verification + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `units` | `BigNumberish` | Number of units to mint | +| `proof` | `BytesLike`[] | Merkle proof for the claim | +| `root?` | `BytesLike` | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaimFractionFromAllowlist + +#### Defined in + +[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) + +--- + +### splitClaimUnits + +▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> + +Split a Hypercert's unit into multiple claims with the given fractions + +**`Dev`** + +Submit the ID of the claim to split and new fraction values. + +**`Notice`** + +The sum of the fractions must be equal to the total units of the claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.splitClaimUnits + +#### Defined in + +[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md new file mode 100644 index 00000000..706c14fe --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md @@ -0,0 +1,250 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage + +# Class: HypercertsStorage + +A class that provides storage functionality for Hypercerts. + +## Implements + +- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertsStorage.md#constructor) + +### Properties + +- [nftStorageClient](HypercertsStorage.md#nftstorageclient) +- [readonly](HypercertsStorage.md#readonly) +- [web3StorageClient](HypercertsStorage.md#web3storageclient) + +### Methods + +- [getData](HypercertsStorage.md#getdata) +- [getMetadata](HypercertsStorage.md#getmetadata) +- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) +- [storeData](HypercertsStorage.md#storedata) +- [storeMetadata](HypercertsStorage.md#storemetadata) + +## Constructors + +### constructor + +• **new HypercertsStorage**(`overrides`) + +Creates a new instance of the `HypercertsStorage` class. + +#### Parameters + +| Name | Type | Description | +| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | +| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | + +#### Defined in + +[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) + +## Properties + +### nftStorageClient + +• `Optional` **nftStorageClient**: `NFTStorage` + +The NFT storage client. + +#### Defined in + +[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +Whether the storage is read-only. + +#### Defined in + +[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) + +--- + +### web3StorageClient + +• `Optional` **web3StorageClient**: `any` + +The Web3 storage client. + +#### Defined in + +[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) + +## Methods + +### getData + +▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> + +Gets arbitrary data from Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the data cannot be retrieved. + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :-------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | + +#### Returns + +`Promise`<`any`\> + +A Promise that resolves to the data. + +#### Implementation of + +HypercertStorageInterface.getData + +#### Defined in + +[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) + +--- + +### getMetadata + +▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +Gets metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. E.g. unknown schema + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------ | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | + +#### Returns + +`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +A Promise that resolves to the metadata. + +#### Implementation of + +HypercertStorageInterface.getMetadata + +#### Defined in + +[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) + +--- + +### getNftStorageGatewayUri + +▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` + +#### Parameters + +| Name | Type | +| :------------- | :------- | +| `cidOrIpfsUri` | `string` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) + +--- + +### storeData + +▸ **storeData**(`data`): `Promise`<`CIDString`\> + +Stores arbitrary data in Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Notice`** + +Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Implementation of + +HypercertStorageInterface.storeData + +#### Defined in + +[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) + +--- + +### storeMetadata + +▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> + +Stores metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. + +**`Notice`** + +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------------------------------------------------------- | :--------------------- | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Implementation of + +HypercertStorageInterface.storeMetadata + +#### Defined in + +[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md new file mode 100644 index 00000000..d12c0653 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError + +# Class: InvalidOrMissingError + +The provided value was undefined or empty + +## Hierarchy + +- `Error` + + ↳ **`InvalidOrMissingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](InvalidOrMissingError.md#constructor) + +### Properties + +- [payload](InvalidOrMissingError.md#payload) + +## Constructors + +### constructor + +• **new InvalidOrMissingError**(`message`, `payload?`) + +Creates a new instance of the InvalidOrMissingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md new file mode 100644 index 00000000..028129d8 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError + +# Class: MalformedDataError + +Data doesn't conform to expectations + +## Hierarchy + +- `Error` + + ↳ **`MalformedDataError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MalformedDataError.md#constructor) + +### Properties + +- [payload](MalformedDataError.md#payload) + +## Constructors + +### constructor + +• **new MalformedDataError**(`message`, `payload?`) + +Creates a new instance of the MalformedDataError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md new file mode 100644 index 00000000..de284494 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError + +# Class: MintingError + +Minting transaction failed + +## Hierarchy + +- `Error` + + ↳ **`MintingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MintingError.md#constructor) + +### Properties + +- [payload](MintingError.md#payload) + +## Constructors + +### constructor + +• **new MintingError**(`message`, `payload?`) + +Creates a new instance of the MintingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md new file mode 100644 index 00000000..0dcf0291 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError + +# Class: StorageError + +Fails storing to a remote resource + +## Hierarchy + +- `Error` + + ↳ **`StorageError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](StorageError.md#constructor) + +### Properties + +- [payload](StorageError.md#payload) + +## Constructors + +### constructor + +• **new StorageError**(`message`, `payload?`) + +Creates a new instance of the StorageError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md new file mode 100644 index 00000000..5fdb25e0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md @@ -0,0 +1,71 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError + +# Class: UnknownSchemaError + +Schema could not be loaded + +## Hierarchy + +- `Error` + + ↳ **`UnknownSchemaError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnknownSchemaError.md#constructor) + +### Properties + +- [payload](UnknownSchemaError.md#payload) + +## Constructors + +### constructor + +• **new UnknownSchemaError**(`message`, `payload?`) + +Creates a new instance of the UnknownSchemaError class. + +#### Parameters + +| Name | Type | Description | +| :------------------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.schemaName` | `string` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :----------- | :------- | +| `schemaName` | `string` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md new file mode 100644 index 00000000..0964b138 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md @@ -0,0 +1,72 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError + +# Class: UnsupportedChainError + +This blockchain is not yet supported +Please file an issue + +## Hierarchy + +- `Error` + + ↳ **`UnsupportedChainError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnsupportedChainError.md#constructor) + +### Properties + +- [payload](UnsupportedChainError.md#payload) + +## Constructors + +### constructor + +• **new UnsupportedChainError**(`message`, `payload?`) + +Creates a new instance of the UnsupportedChainError class. + +#### Parameters + +| Name | Type | Description | +| :---------------- | :---------------------------------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.chainID` | `undefined` \| `string` \| `number` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :-------- | :---------------------------------- | +| `chainID` | `undefined` \| `string` \| `number` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md new file mode 100644 index 00000000..1b94a629 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md @@ -0,0 +1,278 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +A class that provides indexing functionality for Hypercerts. + +## Implements + +- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default-1.md#constructor) + +### Properties + +- [\_graphClient](internal.default-1.md#_graphclient) + +### Accessors + +- [graphClient](internal.default-1.md#graphclient) + +### Methods + +- [claimById](internal.default-1.md#claimbyid) +- [claimsByOwner](internal.default-1.md#claimsbyowner) +- [firstClaims](internal.default-1.md#firstclaims) +- [fractionById](internal.default-1.md#fractionbyid) +- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) +- [fractionsByOwner](internal.default-1.md#fractionsbyowner) + +## Constructors + +### constructor + +• **new default**(`options`) + +Creates a new instance of the `HypercertIndexer` class. + +#### Parameters + +| Name | Type | Description | +| :------------------ | :------- | :----------------------------------------- | +| `options` | `Object` | The configuration options for the indexer. | +| `options.graphUrl?` | `string` | - | + +#### Defined in + +[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) + +## Properties + +### \_graphClient + +• `Private` **\_graphClient**: `Object` + +The Graph client used by the indexer. + +#### Type declaration + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Defined in + +[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) + +## Accessors + +### graphClient + +• `get` **graphClient**(): `Object` + +Gets the Graph client used by the indexer. + +#### Returns + +`Object` + +The Graph client. + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Implementation of + +[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) + +#### Defined in + +[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) + +## Methods + +### claimById + +▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +Gets a claim by its ID. + +#### Parameters + +| Name | Type | Description | +| :--- | :------- | :------------------- | +| `id` | `string` | The ID of the claim. | + +#### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +A Promise that resolves to the claim. + +#### Implementation of + +HypercertIndexerInterface.claimById + +#### Defined in + +[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) + +--- + +### claimsByOwner + +▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +Gets the claims owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.claimsByOwner + +#### Defined in + +[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) + +--- + +### firstClaims + +▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +Gets the most recent claims. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :-------------------- | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.firstClaims + +#### Defined in + +[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) + +--- + +### fractionById + +▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +Gets a claim token by its ID. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------- | +| `fractionId` | `string` | The ID of the claim token. | + +#### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +A Promise that resolves to the claim token. + +#### Implementation of + +HypercertIndexerInterface.fractionById + +#### Defined in + +[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) + +--- + +### fractionsByClaim + +▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +Gets the claim tokens for a given claim. + +#### Parameters + +| Name | Type | Default value | Description | +| :-------- | :----------------------------------------- | :------------------- | :-------------------- | +| `claimId` | `string` | `undefined` | The ID of the claim. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByClaim + +#### Defined in + +[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) + +--- + +### fractionsByOwner + +▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +Gets the claim tokens owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByOwner + +#### Defined in + +[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md new file mode 100644 index 00000000..1538ce61 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md @@ -0,0 +1,131 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +The EasEvaluator class provides methods for signing off-chain attestations of evaluations. +Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. + +## Table of contents + +### Constructors + +- [constructor](internal.default-2.md#constructor) + +### Properties + +- [offChain](internal.default-2.md#offchain) +- [readonly](internal.default-2.md#readonly) +- [signer](internal.default-2.md#signer) + +### Methods + +- [getSignature](internal.default-2.md#getsignature) +- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) + +## Constructors + +### constructor + +• **new default**(`config`) + +Creates a new EasEvaluator instance. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | + +#### Defined in + +[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) + +## Properties + +### offChain + +• **offChain**: `Offchain` + +The Offchain instance used for signing off-chain attestations. + +#### Defined in + +[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +The TypedDataSigner instance used for signing typed data. + +#### Defined in + +[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) + +## Methods + +### getSignature + +▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> + +Gets a signature for an off-chain attestation. + +#### Parameters + +| Name | Type | Description | +| :------------ | :------- | :------------------------------------------------ | +| `encodedData` | `string` | The encoded data to sign. | +| `recipient` | `string` | The address of the recipient of the attestation. | +| `schemaUid` | `string` | The UID of the schema to use for the attestation. | + +#### Returns + +`Promise`<`SignedOffchainAttestation`\> + +- The signature for the attestation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) + +--- + +### signOfflineEvaluation + +▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> + +Signs an offline evaluation. + +**`Throws`** + +- If the evaluation data is malformed. + +#### Parameters + +| Name | Type | Description | +| :----------- | :----------------------------------------------- | :--------------------------- | +| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | + +#### Returns + +`Promise`<`undefined` \| `SignedOffchainAttestation`\> + +- The signature for the evaluation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md new file mode 100644 index 00000000..86daa5e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md @@ -0,0 +1,110 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +## Implements + +- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default.md#constructor) + +### Properties + +- [eas](internal.default.md#eas) +- [readonly](internal.default.md#readonly) +- [signer](internal.default.md#signer) +- [storage](internal.default.md#storage) + +### Methods + +- [submitEvaluation](internal.default.md#submitevaluation) + +## Constructors + +### constructor + +• **new default**(`config?`) + +#### Parameters + +| Name | Type | +| :------- | :------------------------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | + +#### Defined in + +[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) + +## Properties + +### eas + +• **eas**: [`default`](internal.default-2.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +#### Defined in + +[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) + +--- + +### storage + +• **storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) + +## Methods + +### submitEvaluation + +▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------------------------ | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | + +#### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Implementation of + +EvaluatorInterface.submitEvaluation + +#### Defined in + +[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md new file mode 100644 index 00000000..b4af6279 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md @@ -0,0 +1,39 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError + +# Interface: CustomError + +An interface for errors that have a specific type. + +## Implemented by + +- [`ClientError`](../classes/ClientError.md) +- [`ConfigurationError`](../classes/ConfigurationError.md) +- [`FetchError`](../classes/FetchError.md) +- [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) +- [`MalformedDataError`](../classes/MalformedDataError.md) +- [`MintingError`](../classes/MintingError.md) +- [`StorageError`](../classes/StorageError.md) +- [`UnknownSchemaError`](../classes/UnknownSchemaError.md) +- [`UnsupportedChainError`](../classes/UnsupportedChainError.md) + +## Table of contents + +### Properties + +- [payload](CustomError.md#payload) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Defined in + +[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md new file mode 100644 index 00000000..4606b46e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation + +# Interface: DuplicateEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) +- [explanation](DuplicateEvaluation.md#explanation) +- [realHypercert](DuplicateEvaluation.md#realhypercert) +- [type](DuplicateEvaluation.md#type) + +## Properties + +### duplicateHypercerts + +• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] + +#### Defined in + +[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) + +--- + +### explanation + +• **explanation**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) + +--- + +### realHypercert + +• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) + +--- + +### type + +• **type**: `"duplicate"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md new file mode 100644 index 00000000..205b7004 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation + +# Interface: EASEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](EASEvaluation.md#chainid) +- [contract](EASEvaluation.md#contract) +- [type](EASEvaluation.md#type) +- [uid](EASEvaluation.md#uid) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) + +--- + +### type + +• **type**: `"EAS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) + +--- + +### uid + +• **uid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md new file mode 100644 index 00000000..3dcea656 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -0,0 +1,167 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](HypercertClaimdata.md#contributors) +- [impact_scope](HypercertClaimdata.md#impact_scope) +- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) +- [rights](HypercertClaimdata.md#rights) +- [work_scope](HypercertClaimdata.md#work_scope) +- [work_timeframe](HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md new file mode 100644 index 00000000..0483b520 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -0,0 +1,341 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface + +# Interface: HypercertClientInterface + +The interface for the Hypercert client. + +## Hierarchy + +- [`HypercertClientMethods`](HypercertClientMethods.md) + +- [`HypercertClientState`](HypercertClientState.md) + + ↳ **`HypercertClientInterface`** + +## Implemented by + +- [`HypercertClient`](../classes/HypercertClient.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) +- [contract](HypercertClientInterface.md#contract) +- [createAllowlist](HypercertClientInterface.md#createallowlist) +- [indexer](HypercertClientInterface.md#indexer) +- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) +- [mintClaim](HypercertClientInterface.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) +- [readonly](HypercertClientInterface.md#readonly) +- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) +- [storage](HypercertClientInterface.md#storage) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md new file mode 100644 index 00000000..734ccbee --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -0,0 +1,239 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods + +# Interface: HypercertClientMethods + +The methods for the Hypercert client. + +## Hierarchy + +- **`HypercertClientMethods`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) +- [createAllowlist](HypercertClientMethods.md#createallowlist) +- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) +- [mintClaim](HypercertClientMethods.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md new file mode 100644 index 00000000..2d90a599 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState + +# Interface: HypercertClientState + +The state of the Hypercert client. + +## Hierarchy + +- **`HypercertClientState`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [contract](HypercertClientState.md#contract) +- [indexer](HypercertClientState.md#indexer) +- [readonly](HypercertClientState.md#readonly) +- [storage](HypercertClientState.md#storage) + +## Properties + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md new file mode 100644 index 00000000..6ebed93a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -0,0 +1,47 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema + +# Interface: HypercertEvaluationSchema + +Schema for evaluating Hypercerts across different sources and evaluation types + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [creator](HypercertEvaluationSchema.md#creator) +- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) +- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) + +## Properties + +### creator + +• **creator**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) + +--- + +### evaluationData + +• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) + +--- + +### evaluationSource + +• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md new file mode 100644 index 00000000..f18c409f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -0,0 +1,176 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface + +# Interface: HypercertIndexerInterface + +## Implemented by + +- [`default`](../classes/internal.default-1.md) + +## Table of contents + +### Properties + +- [claimById](HypercertIndexerInterface.md#claimbyid) +- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) +- [firstClaims](HypercertIndexerInterface.md#firstclaims) +- [fractionById](HypercertIndexerInterface.md#fractionbyid) +- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) +- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) +- [graphClient](HypercertIndexerInterface.md#graphclient) + +## Properties + +### claimById + +• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Type declaration + +▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +##### Parameters + +| Name | Type | +| :--- | :------- | +| `id` | `string` | + +##### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) + +--- + +### claimsByOwner + +• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) + +--- + +### firstClaims + +• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Type declaration + +▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) + +--- + +### fractionById + +• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +##### Parameters + +| Name | Type | +| :----------- | :------- | +| `fractionId` | `string` | + +##### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) + +--- + +### fractionsByClaim + +• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Type declaration + +▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `claimId` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) + +--- + +### fractionsByOwner + +• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) + +--- + +### graphClient + +• **graphClient**: `any` + +#### Defined in + +[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md new file mode 100644 index 00000000..d65362f3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md @@ -0,0 +1,123 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata + +# Interface: HypercertMetadata + +Claim data for hypercert. ERC1155 Metadata compliant + +## Table of contents + +### Properties + +- [allowList](HypercertMetadata.md#allowlist) +- [description](HypercertMetadata.md#description) +- [external_url](HypercertMetadata.md#external_url) +- [hypercert](HypercertMetadata.md#hypercert) +- [image](HypercertMetadata.md#image) +- [name](HypercertMetadata.md#name) +- [properties](HypercertMetadata.md#properties) +- [ref](HypercertMetadata.md#ref) +- [version](HypercertMetadata.md#version) + +## Properties + +### allowList + +• `Optional` **allowList**: `string` + +A CID pointer to the merke tree proof json on ipfs + +#### Defined in + +[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) + +--- + +### description + +• **description**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) + +--- + +### external_url + +• `Optional` **external_url**: `string` + +An url pointing to the external website of the project + +#### Defined in + +[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) + +--- + +### hypercert + +• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) + +#### Defined in + +[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) + +--- + +### image + +• **image**: `string` + +A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. + +#### Defined in + +[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) + +--- + +### name + +• **name**: `string` + +Identifies the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) + +--- + +### properties + +• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] + +#### Defined in + +[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) + +--- + +### ref + +• `Optional` **ref**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) + +--- + +### version + +• `Optional` **version**: `string` + +The version of Hypercert schema used to describe this hypercert + +#### Defined in + +[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md new file mode 100644 index 00000000..773c41d3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer + +# Interface: HypercertPointer + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](HypercertPointer.md#chainid) +- [claimId](HypercertPointer.md#claimid) +- [contract](HypercertPointer.md#contract) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) + +--- + +### claimId + +• **claimId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md new file mode 100644 index 00000000..8ffda51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -0,0 +1,130 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface + +# Interface: HypercertStorageInterface + +The interface for the Hypercert storage layer. + +## Implemented by + +- [`HypercertsStorage`](../classes/HypercertsStorage.md) + +## Table of contents + +### Properties + +- [getData](HypercertStorageInterface.md#getdata) +- [getMetadata](HypercertStorageInterface.md#getmetadata) +- [storeData](HypercertStorageInterface.md#storedata) +- [storeMetadata](HypercertStorageInterface.md#storemetadata) + +## Properties + +### getData + +• **getData**: (`cidOrIpfsUri`: `string`) => `Promise`<`unknown`\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<`unknown`\> + +Retrieves arbitrary data from IPFS. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | + +##### Returns + +`Promise`<`unknown`\> + +A Promise that resolves to the retrieved data. + +#### Defined in + +[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) + +--- + +### getMetadata + +• **getMetadata**: (`cidOrIpfsUri`: `string`) => `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +Retrieves the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :----------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | + +##### Returns + +`Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +A Promise that resolves to the retrieved metadata. + +#### Defined in + +[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) + +--- + +### storeData + +• **storeData**: (`data`: `unknown`) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`data`): `Promise`<`CIDString`\> + +Stores arbitrary data on IPFS. + +##### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Defined in + +[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) + +--- + +### storeMetadata + +• **storeMetadata**: (`metadata`: [`HypercertMetadata`](HypercertMetadata.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`metadata`): `Promise`<`CIDString`\> + +Stores the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------------ | :--------------------- | +| `metadata` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Defined in + +[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md new file mode 100644 index 00000000..5f5871f2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -0,0 +1,34 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation + +# Interface: IPFSEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [cid](IPFSEvaluation.md#cid) +- [type](IPFSEvaluation.md#type) + +## Properties + +### cid + +• **cid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) + +--- + +### type + +• **type**: `"IPFS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md new file mode 100644 index 00000000..3e4b3b92 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation + +# Interface: SimpleTextEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [hypercert](SimpleTextEvaluation.md#hypercert) +- [text](SimpleTextEvaluation.md#text) +- [type](SimpleTextEvaluation.md#type) + +## Properties + +### hypercert + +• **hypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) + +--- + +### text + +• **text**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) + +--- + +### type + +• **type**: `"simpleText"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md new file mode 100644 index 00000000..53ac36ed --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md @@ -0,0 +1,43 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface + +# Interface: EvaluatorInterface + +[internal](../modules/internal.md).EvaluatorInterface + +## Implemented by + +- [`default`](../classes/internal.default.md) + +## Table of contents + +### Properties + +- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) + +## Properties + +### submitEvaluation + +• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +##### Parameters + +| Name | Type | Description | +| :----------- | :---------------------------------------------------------- | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | + +##### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Defined in + +[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md new file mode 100644 index 00000000..273912bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md @@ -0,0 +1,169 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +[internal](../modules/internal.md).HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](internal.HypercertClaimdata.md#contributors) +- [impact_scope](internal.HypercertClaimdata.md#impact_scope) +- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) +- [rights](internal.HypercertClaimdata.md#rights) +- [work_scope](internal.HypercertClaimdata.md#work_scope) +- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md new file mode 100644 index 00000000..3f4ea346 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md @@ -0,0 +1,17 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter + +# Interface: HypercertMinter + +[internal](../modules/internal.md).HypercertMinter + +Hypercert contract interface. + +**`Notice`** + +hacky loop to get typedoc to generate all the docs + +## Hierarchy + +- `HypercertMinter` + + ↳ **`HypercertMinter`** diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md new file mode 100644 index 00000000..15998930 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md @@ -0,0 +1,638 @@ +[Hypercerts SDK Documentation](README.md) / Exports + +# Hypercerts SDK Documentation + +## Table of contents + +### References + +- [Claim](modules.md#claim) +- [ClaimToken](modules.md#claimtoken) +- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) + +### Modules + +- [internal](modules/internal.md) + +### Classes + +- [ClientError](classes/ClientError.md) +- [ConfigurationError](classes/ConfigurationError.md) +- [FetchError](classes/FetchError.md) +- [HypercertClient](classes/HypercertClient.md) +- [HypercertsStorage](classes/HypercertsStorage.md) +- [InvalidOrMissingError](classes/InvalidOrMissingError.md) +- [MalformedDataError](classes/MalformedDataError.md) +- [MintingError](classes/MintingError.md) +- [StorageError](classes/StorageError.md) +- [UnknownSchemaError](classes/UnknownSchemaError.md) +- [UnsupportedChainError](classes/UnsupportedChainError.md) + +### Interfaces + +- [CustomError](interfaces/CustomError.md) +- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) +- [EASEvaluation](interfaces/EASEvaluation.md) +- [HypercertClaimdata](interfaces/HypercertClaimdata.md) +- [HypercertClientInterface](interfaces/HypercertClientInterface.md) +- [HypercertClientMethods](interfaces/HypercertClientMethods.md) +- [HypercertClientState](interfaces/HypercertClientState.md) +- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) +- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) +- [HypercertMetadata](interfaces/HypercertMetadata.md) +- [HypercertPointer](interfaces/HypercertPointer.md) +- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) +- [IPFSEvaluation](interfaces/IPFSEvaluation.md) +- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) + +### Type Aliases + +- [AllowlistEntry](modules.md#allowlistentry) +- [Deployment](modules.md#deployment) +- [EvaluationData](modules.md#evaluationdata) +- [EvaluationSource](modules.md#evaluationsource) +- [HypercertClientConfig](modules.md#hypercertclientconfig) +- [HypercertClientProps](modules.md#hypercertclientprops) +- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) +- [HypercertStorageConfig](modules.md#hypercertstorageconfig) +- [HypercertsSdkError](modules.md#hypercertssdkerror) +- [QueryParams](modules.md#queryparams) +- [SupportedChainIds](modules.md#supportedchainids) +- [TransferRestrictions](modules.md#transferrestrictions) + +### Properties + +- [ClaimByIdQuery](modules.md#claimbyidquery) + +### Variables + +- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) +- [TransferRestrictions](modules.md#transferrestrictions-1) + +### Functions + +- [execute](modules.md#execute) +- [formatDate](modules.md#formatdate) +- [formatHypercertData](modules.md#formathypercertdata) +- [formatUnixTime](modules.md#formatunixtime) +- [validateAllowlist](modules.md#validateallowlist) +- [validateClaimData](modules.md#validateclaimdata) +- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) +- [validateMetaData](modules.md#validatemetadata) +- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) +- [verifyMerkleProof](modules.md#verifymerkleproof) +- [verifyMerkleProofs](modules.md#verifymerkleproofs) + +## References + +### Claim + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimToken + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimTokensByClaimQuery + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +## Type Aliases + +### AllowlistEntry + +Ƭ **AllowlistEntry**: `Object` + +Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol + +**`Param`** + +Address of the recipient + +**`Param`** + +Number of units allocated to the recipient + +#### Type declaration + +| Name | Type | +| :-------- | :------------- | +| `address` | `string` | +| `units` | `BigNumberish` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) + +--- + +### Deployment + +Ƭ **Deployment**: `Object` + +Represents a deployment of a contract on a specific network. + +#### Type declaration + +| Name | Type | Description | +| :---------------- | :------- | :--------------------------------------------------------------------------------------- | +| `chainId` | `number` | The ID of the network on which the contract is deployed. | +| `chainName` | `string` | The name of the network on which the contract is deployed. | +| `contractAddress` | `string` | The address of the deployed contract. | +| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | + +#### Defined in + +[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) + +--- + +### EvaluationData + +Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) + +This file was automatically generated by json-schema-to-typescript. +DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +and run json-schema-to-typescript to regenerate this file. + +#### Defined in + +[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) + +--- + +### EvaluationSource + +Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) + +--- + +### HypercertClientConfig + +Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } + +Configuration options for the Hypercert client. + +#### Defined in + +[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) + +--- + +### HypercertClientProps + +Ƭ **HypercertClientProps**: `Object` + +The props for the Hypercert client. + +#### Type declaration + +| Name | Type | Description | +| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | +| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | + +#### Defined in + +[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) + +--- + +### HypercertEvaluatorConfig + +Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } + +Configuration options for the Hypercert evaluator. + +**`Note`** + +The signer is required for submitting evaluations. + +#### Defined in + +[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) + +--- + +### HypercertStorageConfig + +Ƭ **HypercertStorageConfig**: `Object` + +Configuration options for the Hypercert storage layer. + +**`Note`** + +The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. + +#### Type declaration + +| Name | Type | Description | +| :------------------ | :------- | :------------------------------ | +| `nftStorageToken?` | `string` | The API token for NFT.storage. | +| `web3StorageToken?` | `string` | The API token for Web3.storage. | + +#### Defined in + +[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) + +--- + +### HypercertsSdkError + +Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) + +#### Defined in + +[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) + +--- + +### QueryParams + +Ƭ **QueryParams**: `Object` + +#### Index signature + +▪ [key: `string`]: `any` + +#### Type declaration + +| Name | Type | +| :---------------- | :------------------ | +| `first` | `number` | +| `orderDirections` | `"asc"` \| `"desc"` | +| `skip` | `number` | + +#### Defined in + +[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) + +--- + +### SupportedChainIds + +Ƭ **SupportedChainIds**: `5` \| `10` + +#### Defined in + +[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) + +--- + +### TransferRestrictions + +Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Properties + +### ClaimByIdQuery + +• **ClaimByIdQuery**: `any` + +## Variables + +### INDEFINITE_DATE_STRING + +• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` + +#### Defined in + +[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) + +--- + +### TransferRestrictions + +• `Const` **TransferRestrictions**: `Object` + +Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol + +**`Dev`** + +AllowAll: All transfers are allowed + +**`Dev`** + +DisallowAll: All transfers are disallowed + +**`Dev`** + +FromCreatorOnly: Only the creator can transfer the Hypercert + +#### Type declaration + +| Name | Type | +| :---------------- | :--- | +| `AllowAll` | `0` | +| `DisallowAll` | `1` | +| `FromCreatorOnly` | `2` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Functions + +### execute + +▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------- | +| `document` | `GraphQLOperation`<`any`, `any`\> | +| `variables` | `any` | +| `context?` | `any` | +| `rootValue?` | `any` | +| `operationName?` | `string` | + +#### Returns + +`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Defined in + +node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 + +--- + +### formatDate + +▸ **formatDate**(`date`): `string` + +#### Parameters + +| Name | Type | +| :----- | :----- | +| `date` | `Date` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) + +--- + +### formatHypercertData + +▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) + +Formats input data to an object containing HypercertMetadata including appropriate labels + +#### Parameters + +| Name | Type | +| :----------------------- | :----------------------------------------------- | +| `«destructured»` | `Object` | +| › `contributors` | `string`[] | +| › `description` | `string` | +| › `excludedImpactScope` | `string`[] | +| › `excludedRights` | `string`[] | +| › `excludedWorkScope` | `string`[] | +| › `external_url?` | `string` | +| › `image` | `string` | +| › `impactScope` | `string`[] | +| › `impactTimeframeEnd` | `number` | +| › `impactTimeframeStart` | `number` | +| › `name` | `string` | +| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | +| › `rights` | `string`[] | +| › `version` | `string` | +| › `workScope` | `string`[] | +| › `workTimeframeEnd` | `number` | +| › `workTimeframeStart` | `number` | + +#### Returns + +[`FormatResult`](modules/internal.md#formatresult) + +#### Defined in + +[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) + +--- + +### formatUnixTime + +▸ **formatUnixTime**(`seconds`): `string` + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `seconds` | `number` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) + +--- + +### validateAllowlist + +▸ **validateAllowlist**(`data`, `units`): `Object` + +Validates the data for an allowlist. + +#### Parameters + +| Name | Type | Description | +| :------ | :---------------------------------------------- | :------------------------------------------ | +| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | +| `units` | `BigNumberish` | The total number of units in the allowlist. | + +#### Returns + +`Object` + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +| Name | Type | +| :------- | :------------------------------------------ | +| `errors` | `Record`<`string`, `string` \| `string`[]\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) + +--- + +### validateClaimData + +▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :------------------------------------------------------- | :-------------------- | +| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) + +--- + +### validateDuplicateEvaluationData + +▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a duplicate evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :--------------------------------------------------------- | :-------------------- | +| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) + +--- + +### validateMetaData + +▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------- | :-------------------- | +| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) + +--- + +### validateSimpleTextEvaluationData + +▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------------- | :-------------------- | +| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) + +--- + +### verifyMerkleProof + +▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` + +Verifies a Merkle proof for a given address and units. + +**`Throws`** + +If the Merkle proof verification fails. + +#### Parameters + +| Name | Type | Description | +| :-------------- | :------------- | :-------------------------------------- | +| `root` | `string` | The Merkle root hash to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish` | The units to verify. | +| `proof` | `string`[] | The Merkle proof to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) + +--- + +### verifyMerkleProofs + +▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` + +Batch verifies Merkle proofs for multiple roots, units and proofs for a single address + +**`Throws`** + +If the Merkle proof verification fails. + +**`Notice`** + +Wrapper around `verifyMerkleProof` to batch verify multiple proofs + +#### Parameters + +| Name | Type | Description | +| :-------------- | :--------------- | :---------------------------------------- | +| `roots` | `string`[] | The Merkle root hashes to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish`[] | The units to verify. | +| `proofs` | `string`[][] | The Merkle proofs to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md new file mode 100644 index 00000000..d20a3804 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md @@ -0,0 +1,307 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal + +# Module: internal + +## Table of contents + +### Classes + +- [default](../classes/internal.default.md) +- [default](../classes/internal.default-1.md) +- [default](../classes/internal.default-2.md) + +### Interfaces + +- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) +- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) +- [HypercertMinter](../interfaces/internal.HypercertMinter.md) + +### Type Aliases + +- [Claim](internal.md#claim) +- [ClaimByIdQuery](internal.md#claimbyidquery) +- [ClaimToken](internal.md#claimtoken) +- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) +- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) +- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) +- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) +- [Exact](internal.md#exact) +- [FormatResult](internal.md#formatresult) +- [InputMaybe](internal.md#inputmaybe) +- [Maybe](internal.md#maybe) +- [OrderDirection](internal.md#orderdirection) +- [RecentClaimsQuery](internal.md#recentclaimsquery) +- [Scalars](internal.md#scalars) +- [ValidationResult](internal.md#validationresult) + +## Type Aliases + +### Claim + +Ƭ **Claim**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | +| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | + +#### Defined in + +[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) + +--- + +### ClaimByIdQuery + +Ƭ **ClaimByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | + +#### Defined in + +[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) + +--- + +### ClaimToken + +Ƭ **ClaimToken**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :--------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `claim` | [`Claim`](internal.md#claim) | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | + +#### Defined in + +[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) + +--- + +### ClaimTokenByIdQuery + +Ƭ **ClaimTokenByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | + +#### Defined in + +[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) + +--- + +### ClaimTokensByClaimQuery + +Ƭ **ClaimTokensByClaimQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :------------------------------------------------------------------------------------------------------------------ | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) + +--- + +### ClaimTokensByOwnerQuery + +Ƭ **ClaimTokensByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | + +#### Defined in + +[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) + +--- + +### ClaimsByOwnerQuery + +Ƭ **ClaimsByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) + +--- + +### Exact + +Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } + +#### Type parameters + +| Name | Type | +| :--- | :--------------- | +| `T` | extends `Object` | + +#### Defined in + +[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) + +--- + +### FormatResult + +Ƭ **FormatResult**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------ | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | +| `errors` | `Record`<`string`, `string`\> \| `null` | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) + +--- + +### InputMaybe + +Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) + +--- + +### Maybe + +Ƭ **Maybe**<`T`\>: `T` \| `null` + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) + +--- + +### OrderDirection + +Ƭ **OrderDirection**: `"asc"` \| `"desc"` + +Defines the order direction, either ascending or descending + +#### Defined in + +[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) + +--- + +### RecentClaimsQuery + +Ƭ **RecentClaimsQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) + +--- + +### Scalars + +Ƭ **Scalars**: `Object` + +All built-in and custom scalars, mapped to their actual values + +#### Type declaration + +| Name | Type | +| :----------- | :-------- | +| `BigDecimal` | `any` | +| `BigInt` | `any` | +| `Boolean` | `boolean` | +| `Bytes` | `any` | +| `Float` | `number` | +| `ID` | `string` | +| `Int` | `number` | +| `Int8` | `any` | +| `String` | `string` | + +#### Defined in + +[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) + +--- + +### ValidationResult + +Ƭ **ValidationResult**: `Object` + +The result of a validation. + +**`Property`** + +Whether the data is valid. + +**`Property`** + +A map of errors, where the key is the field that failed validation and the value is the error message. + +#### Type declaration + +| Name | Type | +| :------- | :---------------------------- | +| `errors` | `Record`<`string`, `string`\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md new file mode 100644 index 00000000..b591d11d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md @@ -0,0 +1,12 @@ +# Burning + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Burning fraction tokens + +You can only burn fraction tokens that you own. Hypercert claims cannot be burned once minted. +You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). + +```js +const txn = await hypercerts.burnFraction({ tokenId }); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md new file mode 100644 index 00000000..b26fc0e8 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md @@ -0,0 +1,112 @@ +# Hypercert Client Configuration + +The client provides a high level interface that communicates with the Graph, IPFS and the evm. For easy setup we harmonised the configuration into a flow that allows for configuration with different levels of specificity. + +## Configuration + +### Setup + +The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: + +1. Overrides declared in `Partial` +2. Environment variables exposed via `process.env` + +Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. + +We then process the rest of the overrides and possible environment variables to customise the default configuration. + +To get started quickly you can either: + +- set `process.env.DEFAULT_CHAIN_ID` to 5 or 10 +- initialize a new client by calling `new HypercertClient({chainId: 5})` (or 10) + +Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without an operator. +- The client was initialized with an operator without signing abilities. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the read-only property of the `HypercertClient` instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" + } +} +``` + +You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. + +### Client config properties + +| Property | Type | Description | +| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `graphUrl` | `string` | The url of the subgraph to use. | +| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +### Environment variables + +You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. + +We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +In your `.env` file: + +```bash +LOG_LEVEL="info" +``` + +The SDK logger supports four log levels: `error`, `warn`, `info`, and `debug`. + +- The `error` log level is used to log errors that occur in the SDK. +- The `warn` log level is used to log warnings that do not necessarily indicate an error, but may be important to investigate. +- The `info` log level is used to log general information about the SDK's state or behavior. +- The `debug` log level is used to log detailed information that is useful for debugging purposes. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md new file mode 100644 index 00000000..60f4e5e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md @@ -0,0 +1,18 @@ +# Errors in the SDK + +Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. + +### Handling Errors + +To support debugging we've implemented some custom errors. + +| Error | Reason | Payload | +| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | +| ClientError | An error caused by the client | `{ [key: string]: unknown }` | +| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | +| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | +| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | +| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | +| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | +| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | +| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md new file mode 100644 index 00000000..c5399a4f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md @@ -0,0 +1,13 @@ +# Evaluations + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Respond / or contest an evaluation + +To create an evaluation of a hypercert + +```js +TODO; +``` + +_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md new file mode 100644 index 00000000..d5ff1226 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md @@ -0,0 +1,57 @@ +# Minting + +## Token design + +Hypercerts are semi-fungible tokens. +Thus, each hypercert is represented on-chain by a group of fraction tokens, +each representing a fraction of ownership over the hypercert. +If you want to split your fraction token, or merge multiple tokens into one, +check out the section on [splitting and merging](./split-merge.md). + +## Minting your first hypercert + +To mint a hypercert you need to provide the `metadata`, total amount of `units` and the preferred `TransferRestrictions`. +The resulting hypercert will be wholly owned by the creator. + +```js +import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" + +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; + +const tx: Promise = await hypercerts.mintClaim({ + metadata, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **Note** If you did not initialize your HypercertsClient with an `operator`, `nftStorageToken` and `web3StorageToken`, the client will run in [read-only mode](#read-only-mode) and this will fail. + +Let's see what happens under the hood: + +First, `mintClaim` checks that the client is not `read only` and that the operator is a `Signer`. If not, it throws an `InvalidOrMissingError`. + +Next, the function validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. The function then stores the metadata on `IPFS` using the `storeMetadata` method and returns the `CID` for the metadata. + +Finally, we call the mintClaim function on the contract with the signer `address`, total `units`, `CID`, and `transfer restriction` as parameters. If `overrides` are provided, the function uses them to send the transaction. Otherwise, it sends the transaction without overrides. + +## Transfer restrictions + +When minting a Hypercert, you must pass in a `TransferRestriction` policy. For now there are only 3 implemented policies: + +```js +enum TransferRestrictions { + // Unrestricted + AllowAll, + // All transfers disabled after minting + DisallowAll, + // Only the original creator can transfer + FromCreatorOnly +} +``` + +## Reference + +See the [code](https://github.com/hypercerts-org/hypercerts/tree/main/sdk/src/client.ts) +for more details on how we implement minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md new file mode 100644 index 00000000..98ebbb83 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md @@ -0,0 +1,306 @@ +# Querying + +## Overview + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph. + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the `storage`, `indexer`, and `contract` getters, the HypercertClient allows developers to easily interact with the various components of the Hypercert system directly. +For example, a developer could use the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the contract. + +## Indexer + +For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. + +### Live graph playground + +To inspect the subgraph and explore queries, have a look at the Graph playground for Goerli testnet and Optimism mainnet: + +- [Goerli dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) +- [Optimism dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) + +### Graph client + +Since the client is fully typed, it's easy to explore the functionalities using code completion in IDEs. + +Here's one example from our frontend where we let [react-query](https://www.npmjs.com/package/%2540tanstack/react-query) frequently update the call to the graph: + +```js +import { useHypercertClient } from "./hypercerts-client"; +import { useQuery } from "@tanstack/react-query"; + +export const useFractionsByOwner = (owner: string) => { + const { + client: { indexer }, + } = useHypercertClient(); + + return useQuery( + ["hypercerts", "fractions", "owner", owner], + () => indexer.fractionsByOwner(owner), + { enabled: !!owner, refetchInterval: 5000 }, + ); +}; +``` + +### Queries: Claims + +These tables show the input parameters and output fields for each of the GraphQL queries in [claims.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/claims.graphql). +A claim represents 1 Hypercert and all of the common data across all claim/fraction tokens. + +#### `ClaimsByOwner` + +The `ClaimsByOwner` query retrieves an array of claims that belong to a specific owner. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claims to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `RecentClaims` + +The RecentClaims query retrieves an array of the most recent claims on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | ---------------------------------- | ------------- | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `ClaimByID` + +The ClaimById query retrieves a single claim by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------- | +| `id` | `ID!` | The ID of the claim to retrieve. | + +##### Output + +The query returns a claim object that matches the input parameter. The claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +### Queries: Fractions + +These tables show the input parameters and output fields for each of the GraphQL queries in [fractions.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/fractions.graphql). +A claim token represents a fraction of ownership of a Hypercert. + +#### `ClaimTokensByOwner` + +The `ClaimTokensByOwner` query retrieves an array of claim tokens that belong to a specific owner on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claim tokens to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ------------------------------------------ | +| `chainName` | `String` | The name of the chain. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +#### `ClaimTokensByClaim` + +The `ClaimTokensByClaim` query retrieves an array of claim tokens that belong to a specific claim on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `claimId` | `String!` | The ID of the claim whose claim tokens to retrieve. | None | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | + +#### `ClaimTokenById` Query + +The `ClaimTokenById` query retrieves a single claim token by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------------- | +| `id` | `ID!` | The ID of the claim token to retrieve. | + +##### Output + +The query returns a claim token object that matches the input parameter. The claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +## Storage + +### Hypercert Metadata + +Currently, all metadata is stored off-chain in IPFS. Use the `storage` client to retrieve the metadata + +```js +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const { indexer, storage } = hypercertsClient; +// Get the on-chain claim +const claimById = await indexer.claimById(claimId); +// Get the off-chain metadata +const metadata = await storage.getMetadata(claimById.claim.uri); +``` + +## Contract + +### Typechain bindings + +We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, +which you can import and use from your TypeScript/JavaScript codebase. + +For example: + +```js +import { ethers } from "ethers"; +import { + HyperCertMinterFactory, + HypercertMinterABI, + IHypercertTokenABI, +} from "@hypercerts-org/sdk"; + +const provider = new ethers.getDefaultProvider(network); +const contractInterface = new ethers.utils.Interface(HypercertMinterABI); +const contract = new ethers.Contract( + contractAddress, + HypercertMinterABI, + provider, +); +const metadataUri = await contract.functions.uri(tokenId); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md new file mode 100644 index 00000000..936cc05b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md @@ -0,0 +1,101 @@ +# Getting started with JavaScript + +The Hypercerts SDK makes it easy to integrate Hypercerts into your application or backend with JavaScript/TypeScript. + +## Installation + +Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +# OR yarn add @hypercerts-org/sdk +``` + +## Get storage credentials (only required for minting) + +For now, we store all metadata (e.g. Hypercert claim data) on IPFS using [NFT.Storage](https://nft.storage/) and [web3.storage](https://web3.storage/). + +In order to mint a Hypercert, you will need to create API tokens for both services, which you can learn more about from their respective guides: + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +_Note: In the future, we want to also support other mechanisms for storing off-chain data._ + +## Initialize + +Import the SDK into your project and create a new instance of `HypercertClient` with your configuration options: + +```js +import { HypercertClient } from "@hypercerts-org/sdk"; +import { ethers } from "ethers"; + +// NOTE: you should replace this with your own JSON-RPC provider to the network +// This should have signing abilities and match the `chainId` passed into HypercertClient +const operator = ethers.providers.getDefaultProvider("goerli"); + +const client = new HypercertClient({ + chainId: 5, // goerli testnet + operator, + nftStorageToken, + web3StorageToken, +}); +``` + +Hypercerts is a multi-chain protocol. +See [here](./supported-networks.md) for a list of currently supported networks. + +> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). + +## Make a Hypercert + +Use the client object to interact with the Hypercert network. For example, you can use the `client.mintClaim` method to create a new claim: + +```js +import { + formatHypercertData, + TransferRestrictions, +} from "@hypercerts-org/sdk"; + +// Validate and format your Hypercert metadata +const { data: metadata, valid, errors } = formatHypercertData({ + name, + ... +}) + +// Check on errors +if (!valid) { + return console.error(errors); +} + +// Set the total amount of units available +const totalUnits: BigNumberish = 10_000_000 + +// Define the transfer restriction +const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly + +// Mint your Hypercert! +const tx = await client.mintClaim( + metadata, + totalUnits, + transferRestrictions, +); +``` + +For guidance on how to specify your metadata, see the [minting guide](../minting-guide/step-by-step.md). +This will validate the metadata, store claim metadata on IPFS, create a new hypercert on-chain, and return a transaction receipt. + +For more details, check out the [Minting Guide](./minting.md). + +## Query for Hypercerts + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more details, checkout the [Querying guide](./querying.md) +and our [Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md new file mode 100644 index 00000000..409a1e9d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md @@ -0,0 +1,41 @@ +# Getting started with Solidity + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +If you need the Solidity contracts or interfaces exported from the SDK, +please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Hypercerts deployments + +Hypercerts is a multi-chain protocol and we want to support any network that wants to make positive impact. +We plan to support at most 1 canonical contract deployment per network. +For a complete list of deployments and their contract addresses, see [Supported Networks](./supported-networks.md). + +## Installing the Hypercert contracts + +```bash +npm install @hypercerts-org/contracts +# or yarn add @hypercerts-org/contracts +``` + +## Using the Solidity interface + +If you want to call the Hypercerts contract on your network directly from Solidity, +we export the interface/ABI for you to use from your contract. + +```js +import { IHypercertToken } from "@hypercerts-org/contracts/IHypercertMinter.sol"; + +contract MyContract { + IHypercertToken hypercerts; + + function initialize(address _addr) public virtual initializer { + hypercerts = IHypercertToken(_addr); + } + + function uri(uint256 tokenID) public view returns (string memory _uri) { + _uri = hypercerts.uri(tokenID); + } +} + +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md new file mode 100644 index 00000000..1ac5556e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md @@ -0,0 +1,29 @@ +# Split and Merge + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## By Token Value + +### Split / merge token values + +```js +const { tokenIds } = await hypercerts.splitFraction({ + tokenId, + units: [10, 12, 15], +}); +const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); +``` + +## By Claim Data + +### Split / merge claim data + +```js +const { claimIds } = await hypercerts.splitClaim({ + claimId, + TODO: somehow specify hypercert subregions +}); +const { claimId} = await hypercerts.mergeClaims({ + claimIds, +}); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md new file mode 100644 index 00000000..3bfd0f18 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md @@ -0,0 +1,13 @@ +# Supported networks + +Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. + +We want to support every network that wants to support positive impact! +If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Overview + +| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | +| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | +| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | +| Optimism | 10 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md new file mode 100644 index 00000000..72b3ee2d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md @@ -0,0 +1,120 @@ +# Deploy a new proxy contract + +This should be done only on rare occasions. For example, when: + +- We want to deploy to a new network +- We have updated the contract in a way that is _NOT_ backwards-compatible. + - For most upgrades, please use UUPS [upgrades](./upgrade.md). + +## Smart Contracts + +### Setup the `contracts/` environment + +Navigate to `contracts/`. Configure your `.env` file by following the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/contracts#setup). + +### Build and deploy the smart contracts + +If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. + +```javascript + "optimism-goeri": getChainConfig("optimism-goerli"), +``` + +Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. + +```sh +# Run in contracts/ +yarn build:hardhat +yarn hardhat deploy --network NETWORK +``` + +This will output the new proxy address. Update the root `README.md` with this new address. + +Now transfer ownership over the proxy contract to the multisig: + +```sh +yarn hardhat transfer-owner --network NETWORK --proxy PROXY_CONTRACT_ADDRESS --owner MULTISIG_ADDRESS +``` + +## Subgraph + +### Setup the `graph/` environment + +Navigate to `graph/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/graph#setup) +to get set up. + +### Deploy the subgraph + +Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). + +Now deploy the subgraph + +```sh +# Run in graph/ +yarn build +yarn deploy:hosted +``` + +## OpenZeppelin Defender + +### Create a new Supabase table + +Log into the [Supabase dashboard](https://app.supabase.com/). +We store all data in a single project, but use different tables for each network. +The table name should be suffixed by the network (e.g. `allowlistCache-goerli`). +If you are deploying to a new network, create a new table. You can copy the table schema and RLS policy from another pre-existing table. + +If you are deploying a new proxy contract to a network for which you already have another deployment, you'll have to make a judgement call as to whether you can reuse the existing table, whether you need to clear the existing table, or create another table. + +Note: We want to merge all the tables in this [issue](https://github.com/hypercerts-org/hypercerts/issues/477). + +### Update the OpenZeppelin Defender scripts + +Modify the Defender scripts to support the new network in `defender/src/networks.ts`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. + +Note: The entry point for deployment is in `defender/src/setup.ts`. + +### Setup the `defender/` environment + +Navigate to `defender/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/defender#setup) +to get set up. + +### Deploy defender scripts + +Deploy to OpenZeppelin Defender via + +```sh +# Run in defender/ +yarn deploy +``` + +## Hypercerts SDK + +TODO: Flesh this out + +Run the build in `contracts/`. + +(Soon to be deprecated) Publish `contracts/` to npm + +Configure the SDK to support the new network via the graphclient. + +Publish SDK to npm + +## Deploy the Dapp frontend + +Each frontend build is configured to run on a different network (e.g. `https://testnet.hypercerts.org`). You can use any CDN to serve the site (e.g. Netlify, Vercel, GitHub Pages, Cloudflare Pages, Fleek, Firebase Hosting). + +1. Configure your build environment with the environment variables specified in `frontend/.env.local.example`. + +2. Configure your builds to the following settings: + +- Build command: `yarn build:site` +- Build output directory: `/build` +- Root directory: `/` + +3. Configure the domain that you want for your build. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md new file mode 100644 index 00000000..05dc5b0c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md @@ -0,0 +1,45 @@ +# Errors + +## Deploying + +### Artifact for contract "HypercertMinter" not found + +#### Error message + +`Error HH700: Artifact for contract "HypercertMinter" not found.` + +#### Cause + +Attempting to deploy a contract with `npx hardhat deploy` before the contract has been compiled by hardhat. Contracts compiled by forge are currently not visible to hardhat (this could be a configuration problem). + +### insufficient funds for intrinsic transaction cost + +#### Error message + +`Error: insufficient funds for intrinsic transaction cost` + +#### Cause + +The environment variable `MNEMONIC` is not configured correctly. + +Alternatively, the wallet may not have enough funds for the selected network + +Causing pause twice + +Error: cannot estimate gas; transaction may fail or may require manual gas limit + +reason: 'execution reverted: Pausable: paused', + +#### Etherscan API + +Note: It can take between 5-10 minutes before a newly created etherscan API key becomes valid for queries to goerli. + +When using an etherscan API key that was too recently created, hardhat tasks using etherscan to verify transactions will exit with an error message: + +`Etherscan returned with message: NOTOK, reason: Invalid API Key` + +Despite this error the transaction may have succeeded, the hardhat task just can't confirm it. + +It is unknown if this is a problem for queries to mainnet as well. + +Metamask makes it very difficult to have multiple wallets. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md new file mode 100644 index 00000000..9b208595 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md @@ -0,0 +1,18 @@ +# DevOps + +We use this playbook to encapsulate our practices and current setup. + +## Setup dev environment + +- [Setup guide](./setup.md) +- [Plasmic setup](./plasmic.md) + +## Tasks + +- [Deploy new proxy contract](./deploy-proxy.md) +- [Upgrade contract](./upgrade.md) +- [Pause contract](./pause.md) + +## FAQ + +- [Common errors](./errors.md) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md new file mode 100644 index 00000000..2668f51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md @@ -0,0 +1,29 @@ +# Pause / Unpause + +## Pause + +### Contract owned by an address + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat pause --network NETWORK --address CONTRACT_ADDRESS +``` + +### Contract owned by a multi-sig + +If we transferred ownership to a multisig, we can use +[OpenZeppelin Defender Admin](https://defender.openzeppelin.com/#/admin) +to propose a pause to be approved by the multisig. + +## Unpause + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat unpause --network NETWORK --address CONTRACT_ADDRESS +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md new file mode 100644 index 00000000..10e52f5b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md @@ -0,0 +1,76 @@ +# Plasmic setup + +## HypercertImage + +### Props + +hideImpact + +``` +$ctx.currentForm.impactTimeEnd === "indefinite" && ($ctx.currentForm.impactScopes.length === 0 || ($ctx.currentForm.impactScopes.length === 1 && $ctx.currentForm.impactScopes[0] === "all")) +``` + +color + +``` +$ctx.currentForm.backgroundColor +``` + +vectorart + +``` +$ctx.currentForm.backgroundVectorArt +``` + +### Slots + +logoImage Image URL + +``` +$ctx.currentForm.logoUrl +``` + +title Content + +``` +$ctx.currentForm.name +``` + +workPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.workTimeEnd.format ? $ctx.currentForm.workTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.workTimeEnd}` +``` + +bannerImage Image URL + +``` +$ctx.currentForm.bannerUrl +``` + +impactPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.impactTimeEnd.format ? $ctx.currentForm.impactTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.impactTimeEnd}` +``` + +#### workScopes: repeated ScopeChip + +Collection + +``` +$ctx.currentForm.workScopes.split(/[,\n]/).map(i => i.trim()).filter(i => !!i) +``` + +Element name: `currentWorkScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentWorkScope` + +#### impactScopes: repeated ScopeChip + +Collection: `$ctx.currentForm.impactScopes` +Element name: `currentImpactScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentImpactScope` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md new file mode 100644 index 00000000..afb95296 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md @@ -0,0 +1,41 @@ +# Setup + +## Pre-requisites + +1. Install [NodeJS](https://nodejs.org/en/) and [git](https://git-scm.com/) +2. Install [yarn](https://classic.yarnpkg.com/) + +```sh +npm install --global yarn +``` + +3. Clone the repository: + +``` +git clone git@github.com:hypercerts-org/hypercerts.git +cd hypercerts +``` + +4. Install dependancies: + +To install dependencies across all projects in the monorepo workspace: + +```sh +yarn install +``` + +## Setup your wallets + +We need 2 wallets: a multi-sig for administering the contracts, and a hot wallet for setting everything up. + +1. We use a [Gnosis Safe](https://app.safe.global/) multisig for managing and administering the contracts. Set one up with your desired confirmation threshold (e.g. 2 of 3). This wallet will not require any balance. +2. Separately, set up a wallet that we'll use in our developer scripts. + +- If you don't have one, you can goto `contracts/` and run `yarn hardhat generate-address`. +- Make sure there is enough balance in this account to deploy the contract and transfer ownership to the multisig + - [Goerli Faucet](https://goerlifaucet.com/) + - [Optimism Bridge](https://app.optimism.io/bridge/deposit) + +## Next Steps + +Depending on what you want to do (e.g. in `./sdk/` or `./frontend/`), there will be further setup instructions in the respective `README.md` file. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md new file mode 100644 index 00000000..820255e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md @@ -0,0 +1,35 @@ +# Upgrading the contract + +## Validate upgrade + +Validate contract upgradeability against deployment. + +For example, for the `goerli` deployment: + +```sh +yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS +``` + +## Propose Upgrade + +Propose an upgrade via OpenZeppelin Defender. For more information, see this +[guide](https://docs.openzeppelin.com/defender/guide-upgrades) + +For example, for the `goerli` deployment: + +```sh +yarn build:hardhat +yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS +``` + +This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. + +## Publish to npm + +After you update the contracts, deploy the `contracts/` package to npm. + +TODO + +Update the dependencies in `frontend/package.json` and `sdk/package.json`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/faq.md b/docs/versioned_docs/version-1.0.0-alpha.0/faq.md new file mode 100644 index 00000000..b9659b5a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/faq.md @@ -0,0 +1,139 @@ +--- +title: Frequently Asked Questions +id: faq +--- + +# FAQs + +### How do I create a hypercert? + +We've created a step-by-step guide in the documents, which you can find [here](minting-guide/minting-guide-start). + +### Who gets to claim my hypercert? + +There are currently two types of users who are eligible to claim your hypercert. + +1. You as the creator of the hypercert are eligible to claim your hypercert. For projects with an allow list, you are eligible to claim 50% of the total tokens. For projects with no allow list, you will receive 100% of the tokens automatically and can do whatever you like with them. + +2. Anyone on the hypercert's allow list will be eligible to claim your hypercert. The allow list is stored and the time of minting and allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions through a separate contract interaction. Creators often use allow lists be used to allocate fractions to previous funders and contributors. + +### How do I claim a hypercert? Can I claim all of the ones I’m eligible for at once? + +After you connect your wallet, you will see a dashboard of hypercerts that you can claim. You can either claim them individually or in a batch transaction. Note that if you perform the batch transaction you will automatically claim _all_ hypercerts you are allow-listed for. (You still pay a gas fee for each claim, however.) If you don't want to claim _all_ at once, then you should claim them one-by-one. + +### What token standard do hypercerts utilize? + +The interface supports both ERC-1155s and 721s. Our current implementation makes use of [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) (a semi-fungible token). + +### What are the required fields to generate a hypercert? + +There are six required fields: + +1. Set of contributors: An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. Scope of work: A conjunction of potentially-negated work scope tags, where an empty string means “all”. +3. Time of work: A date range, from the start to the end of the work being claimed by this hypercert. +4. Scope of impact: A conjunction of potentially-negated impact scope tags, where an empty string means “all”. +5. Time of impact: Date ranges from the start to the end of the impact. +6. Rights of the owners: An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Hypercerts also need a name and description. + +### What should I put for my hypercert's work scope? + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +### Are hypercerts the same as impact evaluations? + +No. A hypercert is a claim over a discrete piece of work and the impact that may result from that work. It has no opinion about the legitimacy or quality of the claim. + +An impact evaluation is an opinionated assessment about the legitimacy or quality of a claim. + +For example, a hypercert might represent "Planting trees in the Amazon in 2022". An impact evaluation might point to that hypercert and assert the percent of trees that survived, the amount of CO2 removed by the trees, or the income change among people living around the project. + +Over time, the expectation is that hypercerts that attract multiple, high quality, credibly neutral impact evaluations will be more relevant than ones that do not. + +### What can I do with my hypercert? + +The `rights` dimension specific what an owner can do with their hypercert. Currently, the only `right` that owners have is "Public Display". Over time, we hope the protocol can support various `rights` including transfers, intellectual property, tax-deductibility, carbon offsets, ESG reporting, and more. + +### How is a hypercert different than a POAP or Impact NFT? + +Hypercerts have some things in common with certain POAPs or Impact NFTs, but also a number of crucial differences. + +First, all POAPs and most Impact NFTs are implemented as non-fungible tokens (ERC-721s). Hypercerts are currently being implemented as semi-fungible tokens (ERC-1155s), meaning it is possible to own more than one unit or fraction of a given hypercert. This makes it easy and intuitive to display the share of hypercerts that a given owner has. + +Second, hypercerts have specific metadata requirements and interpretation logic. These include a standard schema for how the six required hypercert dimensions are defined and captured (i.e., work scopes, impact scopes, timeframes, contributors, etc) as well as logic for how to interpret different inputs (e.g., how to include or exclude certain work scopes, create an indefinite time period, etc). POAPs have a completely different schema. Although there is no standard schema for Impact NFTs, an Impact NFT project could choose to adopt the hypercert standard and token interface and thereby achieve compatibility. + +Third, the hypercerts token interface is intended to support several functions that are not possible out of the box with other token standards, chiefly, atomic split and merge capabilities. We also expect other protocols to work with hypercerts for the purposes of prospective and retrospective funding, contributor verification, and impact evaluation. + +For certain use cases, POAPs may be better suited for projects as hypercerts are focused on the funding aspect of impactful work. + +### Where can I purchase a hypercert? + +Currently, it is only possible to purchase a hypercert from a creator or project. This can be facilitated directly by the project or via a third-party marketplace like OpenSea. Currently, hypercerts cannot be resold on secondary markets. + +### What chain(s) is hypercerts running on? + +The hypercerts smart contracts have been deployed on Optimism and Goerli Testnet. We plan to support various EVM chains in the near future. + +### How do I bridge to Optimism? + +There are various bridging services including the official [Optimism Bridge](https://app.optimism.io/bridge/deposit). Note that bridging assets from Ethereum to Optimism will incur a gas fee. + +### How much gas will it cost to create or claim a hypercert? + +In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). Claiming a hypercert should be below 0.0001 ETH or less than $0.10 on Optimism. + +### How do I create a hypercert from a multisig? + +If you are creating a hypercert on Optimism, then you will need an Optimism-based multisig. (Unfortunately, Safe wallets created on Ethereum won't work on Optimism.) + +### Have the smart contracts been audited? + +Yes. The auditor's security report is available [here](https://github.com/pashov/audits/blob/master/solo/Hypercerts-security-review.md). + +### How is the allow list generated? + +For Gitcoin projects, an allow list is generated from a snapshot of all of the on-chain funding received by the project. + +The queries used to generate the allow lists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Once the snapshot is taken, the formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +### Why am I not on the allow list even though I contributed to the project? + +If you contributed less than $1 DAI to a project, then you will not be eligible to claim a hypercert fraction. + +### I supported a project. Why I don't I see the hypercert in my dashboard? + +In order to your hypercert to appear as "claimable", the project needs to mint the hypercert first. If the project has not minted its hypercert yet, then you will not be able to claim it. We suggest you check back in a few days to see if the project has created the hypercert and is now claimable. + +If the project has created its hypercert, then please try the following solutions: + +1. Confirm the wallet address is correct (some users have multiple wallet addresses and forget which one they donated with) +2. Check that your wallet is included in the Dune Dashboards for each Gitcoin Round + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +3. Confirm you donated more than $1 DAI to the project. + +If the project has created its hypercert, and you have confirmed items 1-3, then please send us a DM over Twitter or Telegram with your wallet address and we will get back to you promptly. + +### How do I retire a hypercert? + +We don't yet have a frontend for retiring hypercerts but you can do this by interacting directly with the smart contract on Etherscan. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md b/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md new file mode 100644 index 00000000..86c25331 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md @@ -0,0 +1,37 @@ +--- +title: Further Resources +id: further-resources +--- + +# Papers, Articles, Presentations + +## Writings + +- Feb 14, 2023, Whitepaper draft by [@hypercerts](http://twitter.com/hypercerts): [Hypercerts: A new primitive for impact funding systems (draft v0)](../static/pdf/hypercerts_whitepaper_v0.pdf) +- Aug 24, 2022, Blogpost by [@holkeb](https://twitter.com/holkeb): [Hypercerts: A new primitive for public goods funding](https://protocol.ai/blog/hypercert-new-primitive/) +- Jun 2022, Tech report (draft) by [@davidad](https://twitter.com/davidad): [Hypercerts; an Interoperable Datalayer for Impact-Funding Mechanisms](../static/pdf/hypercerts_Tech_Report_draft.pdf) + +## Talks + +#### Jun 24, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Hypercerts: on-chain primitives for impact markets](https://youtu.be/2hOhOdCbBlU) + + + +#### Jun 23, 2022, Conversation between [@emiyazono](http://twitter.com/emiyazono) and [@owocki](http://twitter.com/owocki) at GreenPill Podcast: [Impact Certificates | Evan Miyazono, Head of Research at Protocol Labs | Green Pill #21](https://youtu.be/kyo5SxtSJ9U) + + + +#### Mar 4, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Interoperable mechanisms for non-rival goods (Hypercerts)](https://youtu.be/acbBeGcevok) + + + +## Other resources + +Overview of some previous writings on impact certificates, retrospective funding and impact markets: + +- Christiano, Paul (2014) Certificates of impact, Rational Altruist, [https://rationalaltruist.com/2014/11/15/certificates-of-impact/](https://rationalaltruist.com/2014/11/15/certificates-of-impact/) +- Christiano, Paul & Katja Grace (2015) The Impact Purchase, [https://impactpurchase.org/why-certificates/](https://impactpurchase.org/why-certificates/) +- Optimism & Buterin, Vitalik (2021) Retroactive Public Goods Funding, [https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c) +- Cotton-Barratt, Owen (2021), Impact Certificates and Impact Markets, Funding the Commons November 2021, [https://youtu.be/ZiDV56o5M7Q](https://youtu.be/ZiDV56o5M7Q) +- Drescher, Denis (2022) Towards Impact Markets, [https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1](https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1) +- Ofer & Cotton-Barratt, Owen (2022) Impact markets may incentivize predictably net-negative projects, [https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6](https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md new file mode 100644 index 00000000..b2451310 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md @@ -0,0 +1,139 @@ +--- +title: Glossary +id: glossary +sidebar_position: 3 +--- + +# Glossary of Hypercerts Terms + +## Main Terms + +### Allowlist + +A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. + +### Claiming a fraction + +Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. + +### Contributor + +An individual or organization that performs some or all of the work described in a hypercert. + +### Creating a hypercert + +Synonymous to minting a hypercert. + +### Fraction + +A token that represents a quantified proportion of a hypercert denominated in units. + +### Funder + +Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. + +### Hypercert + +A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. + +### Hypercerts interface + +The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. + +### Hypercerts implementation + +An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. + +### Hypercerts standard + +A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Impact + +Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. + +### Impact evaluation + +A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. + +### Impact Funding System (IFS) + +A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. + +### Impact space + +A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Merging hypercerts + +An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. + +### Minting a hypercert + +Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. + +### Project + +Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. + +### Prospective funder + +Individual, organization, or algorithm that fund work before it is done. + +### Retrospective funder + +Individual, organization, or algorithm that fund work after it is done. + +### Rights + +An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. + +### Set of contributors + +An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of impact + +A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of work + +A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Splitting hypercerts + +An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. + +### Time of impact + +Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Time of work + +A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Unit + +The smallest possible fraction of a claim. Generally units are grouped in fractions. + +### Work + +Activities that produce impact. + +## Additional Impact Evaluation Terms + +### Auditor + +Individual, organization, or algorithm that evaluates the impact of work after it is done. + +### Beneficiaries + +People or objects that are impacted by work. + +### Evaluator + +Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. + +### Scout + +Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md new file mode 100644 index 00000000..08eb9fcb --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md @@ -0,0 +1,188 @@ +--- +title: Metadata Standard +id: metadata +sidebar_position: 2 +--- + +# Hypercert Metadata Structure + +Hypercerts are represented as [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) tokens. All token instances of a hypercert must share the same ERC-1155 metadata. For sites like OpenSea to pull in off-chain metadata for ERC-1155 assets, your hypercert contract will need to return an IPFS URI that contains all necessary hypercert metadata. + +The hypercert metadata schema follows the [Enjin recommendation](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema) for ERC-1155 metadata. It also includes **six required dimensions** that are necessary to clearly and unambiguously identify the hypercert's impact claim. + +The following are standard ERC-1155 metadata fields. + +## ERC-1155 fields + +| Property | Description | +| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `name` | Name or title of the hypercert. Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. | +| `description` | A human readable description of the hypercert. Markdown is supported. Additional external URLs can be added. | +| `image` | A URI pointing to a resource with mime type image/\* that represents the hypercert's artwork, i.e., `ipfs://`. We recommend images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. | +| `external_url` | [optional] A URL that can be displayed next to the hypercert on webpages like OpenSea and links users to a page that has more information about the project or impact claim. | +| `properties` | [optional] Additional properties (aka attributes) that may be helpful for discovery and curation of hypercerts. Marketplaces like OpenSea will display these properties in the same way as they display rarity traits of NFTs. | + +In order to perform hypercert-specific operations, including split and merge functions, and for your hypercert to robustly claim a set of coordinates in the impact space, there are six additional dimensions that must be included in your metadata. + +## Required Hypercert dimensions + +| Property | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `work_scope` | An _ordered list_ of work scope tags. Work scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any work scope that is explicitly excluded from the claim. | +| `work_timeframe` | Date range from the start to the end of the work in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). | +| `impact_scope` | An _ordered list_ of impact scope tags. Impact scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any impact scope that is explicitly excluded from the claim. The default claim is to "all" impact, giving the owner rights to claim all potential impact created by the work that is represented by the hypercert. | +| `impact_timeframe` | Date range from the start to the end of the impact in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). The default claim is from the start date of work until `indefinite` (i.e., the impact may occur at any point in time in the future). | +| `contributors` | An _ordered list_ of all contributors. Contributors should be itemized as wallet addresses or ENS names, but may be names / pseudonyms. The default claim is to the wallet address that created the hypercert contract. A multisig wallet can be used to represent a group of contributors. | +| `rights` | An _unordered list_ of usage rights tags. The default claim is solely to "public display" of the hypercert, i.e., all other rights remain with the contributors. | + +## Examples + +### Example 1: hypercert with minimal bounds + +Here is an example of hypercert dimensions for work on IPFS with minimal bounds: + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["IPFS"], + "excludes": [], + "display_value": "IPFS" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": [], + "display_value": "All" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1380585600, 1388534399], + "display_value": "2013-10-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1380585600, 0], + "display_value": "2013-10-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["Protocol Labs"], + "display_value": "Protocol Labs" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 2: hypercert with bounded impact claims + +This hypercert is for a carbon removal project that provides a bounded impact scope. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["CO2 in Atmosphere"], + "excludes": [], + "display_value": "CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 3: hypercert with excluded impact claims + +Here is an example that explicitly excludes an impact scope to generate a more fine-grained claim. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": ["CO2 in Atmosphere"], + "display_value": "All ∧ ¬CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Additional guidelines + +Here are some additional guidelines for defining hypercert dimensions. + +- For most hypercerts, the `work_scope` is best represented as the name of the project or activity. Other information contained in the hypercert, namely, the `contributors` and the `work_timeframe` should provide sufficient context to disambiguate multiple claims from the same project. +- Similarly, for most hypercerts, the `impact_scope` will be most clearly represented as "all" (with an indefinite upper bound on the `impact_timeframe` dimensions). This gives the hypercert creator and its owners the flexibility to make claims about impact that may not have been observable or well-understood when the hypercert was created. + +- It is recommended to browse the `impact_scope` and `work_scope` tags that have already been created and are in use by your or other projects. (We are building a catalog to be available at [hypercerts.org](https://hypercerts.org).) Picking established tags can make it easier for users to discover, curate, and interact with your hypercert. In the long-run, we expect different ontologies to emerge in domains like climate solutions, open source software, etc, and picking more established tags will help prevent overlapping or duplicate claims. +- Tags for work scopes and impact scopes are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. +- Scopes that are explicitly excluded from the hypercert claim are enumerated separately and displayed with the `¬` prefix in the tag. Excluded scopes are not currently displayed on hypercert artwork. +- The order of tags matters only for display purposes. The hypercert artwork will only display a limited number of tags in the `impact_scope` and `work_scope` arrays due to image size and stylistic constraints. +- A `contributor` can be identified using any human-readable string. The base case is to set the `contributors` to the wallet address used to create the hypercert. A multisig wallet can be used to represent a group of contributors. + +### Assigning `rights` + +In version 1.0 of the protocol, only one `rights` tag will be enabled: + +> **Public Display**: owners of the hypercert have the right to publicly display and receive social utility from their hypercert. + +This means that any other rights regarding the work described by the hypercert either remain with the original contributors or are governed by other agreements. + +Additional `rights` including the potential for certain types of transfers to be explicitly enabled will be released in subsequent versions. + +## Optional hidden properties + +Creators may wish to add other fields in their metadata that are not a part of the hypercert claim and are not for display on third-party marketplaces like OpenSea. These can be added by creating a `hidden_properties` field in the metadata. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md new file mode 100644 index 00000000..a767c670 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md @@ -0,0 +1,29 @@ +--- +title: Token Standard +id: token-standard +sidebar_position: 1 +--- + +### Hypercerts as a semi-fungible token + +In order to make the token identifiable, traceable, and transferable, hypercerts are represented as [ERC-1155 tokens](https://eips.ethereum.org/EIPS/eip-1155). The ERC-1155 standard enables a single deployed contract to store many hypercerts, facilitating simpler creation, transfers, as well as splitting and merging of hypercerts within a single namespace. As a semi-fungible token, each unique token represents a fraction of ownership of a hypercert. Hypercerts are then represented as a group of tokens, where the total ownership sums to 100%. In order to easily identify which hypercert a token belongs to, we utilize the upper 128 bits of a 256-bit token ID to identify the hypercert. All tokens within the same hypercert group should share the same [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). + +![hypercert id](../../static/img/hypercert_id.png) + +For illustrative purposes, let us assume that token IDs are just 2 bytes long, where the first byte represents the hypercert ID and the last byte represents which fraction of ownership. Alice could create a new hypercert token 0x2301, representing 100% of hypercert 0x23. If Alice wanted to transfer 20% to Bob, Alice could perform a split operation by minting token 0x2302 and transferring 20% of value to it, such that tokens 0x2301 and 0x2302 represent 80% and 20% ownership respectively of hypercert 0x23. Then Alice transfers token 0x2302 to Bob. Similarly, they could merge these 2 tokens together, back to form a token that represented 100% ownership. In this case, the value of 0x2301 would be transferred to 0x2302, and then 0x2301 is subsequently burned. + +Alice can also choose to split or merge hypercerts along some dimension of the impact space. For example, Alice may split hypercert 0x23 into two new hypercerts — 0x24 representing work done before the year 2000, and 0x25 representing work done after 2000. The original hypercert 0x23 is burned and the two new hypercerts store a reference to the previous hypercert. When the history of splits and merges are indexed, we can easily trace through the provenance of any individual hypercert. + +### Claim Data + +Hypercert claim data, such as scope of work and the contributor list, is encoded in JSON format into the [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). Claim data can be stored on-chain alongside the token, or in off-chain storage such as IPFS. For details on the JSON schema and how off-chain storage can be utilized, see the [hypercerts-sdk repository](https://github.com/hypercerts-org/hypercerts/tree/main/sdk). + +When considering whether to store hypercert metadata on-chain or off-chain, we can consider the different trade-offs to the user experience and cost, which may differ depending on which blockchain is being used. Storing data off-chain saves on costs, but could lead to on-chain claims without the metadata. Storing data on-chain adds additional security that the claims will not be forgotten but can lead to higher gas fees. + +Beyond the standard fields of hypercerts that locate the hypercert in the impact space, additional fields can be added. This allows for different templates in different impact areas, such as AI safety or biodiversity, as different additional information will be useful. Importantly, however, all hypercerts will be located in a single impact space – the additional fields do not change that. + +### Multi-chain support + +We expect hypercerts to exist in a multi-chain ecosystem, where the local deployment can be used to support the unique funding systems of that community. In order to visualize a single global impact space, we index the different contract deployments across chains and surface any potential hypercert claim conflicts. Because different blockchains support different subsets of programming languages, we do expect different implementations of the hypercert protocol to exist. However, they must adhere to the same hypercert data model to be indexed into the impact space. + +In order to decide which deployments to index into the hypercerts impact space, decentralized governance institutions will be used to govern the list of contract addresses used across all blockchains. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/intro.md new file mode 100644 index 00000000..0c4d7ca3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/intro.md @@ -0,0 +1,58 @@ +--- +title: What Are Hypercerts? +id: intro +--- + +# What are hypercerts? + +### Hypercerts are a new token standard for tracking and rewarding positive impact. + +Each hypercert represents a unique impact claim capturing the following information: + +- a scope of work and its corresponding scope of impact +- a set of time frames for both the work and its impact +- a set of contributors – the organization or people behind the work +- a set of rights you get by owning a hypercert + +The hypercert itself is an ERC-1155 semi-fungible token with the information above stored as metadata on IPFS. Here’s an example. + +### Hypercert example + +#### Graphic representation + +![hypercert design example](../static/img/hypercert_example.png) + +#### Supplementary information (metadata) + +- **Title of hypercert:** Invention of the InterPlanetary Filesystem (IPFS) +- **Description:** The InterPlanetary File System (IPFS) is a set of composable, peer-to-peer protocols for addressing, routing, and transferring content-addressed data in a decentralized file system. +- **Link:** ipns://ipfs.tech/ + +#### Hypercert dimensions (metadata) + +- **Set of contributors:** 0xb794f5ea0ba39494ce839613fffba74279579268 _(example Ethereum address)_ +- **Scope of work:** IPFS ∧ ¬ go-ipfs +- **Time of work:** 2013-01-01 --> 2013-12-31 +- **Scope of impact:** All +- **Time of impact:** 2013-01-01 --> indefinite +- **Rights:** Public display + +### Why should you care? + +We spend trillions of dollars every year on public goods via governmental agencies, foundations, private donations and corporate spendings; however, we don’t effectively track this work – leaving us in the dark, hoping that it actually has the intended positive impact. + +We believe we can do better: + +- We should start by tracking this work consistently – this is what hypercerts are for. +- We should evaluate how impactful that work was – this is what the open evaluation system of hypercerts supports. +- We should reward the work that was exceptionally impactful – this is what the public display of hypercerts and retrospective funding is for. + +Doing this would unfold powerful incentives. Retrospective funding 1) provides incentives for creators to take on public goods projects with a potentially high, but uncertain, impact, 2) enables feedback loops to learn from successes and failures, and 3) attracts more talent to the public goods sector by improving performance-based compensation. + +While we are excited about the prospects of retrospective funding, hypercerts do not impose any specific funding mechanisms, but start with tracking the work that is supposed to be impactful. As a database for many funding mechanisms this facilitates experimentation and interoperability between funding mechanisms. + +### Next + +Curious and want to learn more? Head over to the [whitepaper](whitepaper/whitepaper-intro.md) to dive deeper into the world of hypercerts. + +Or do you want to get started right away? Head to the [minting guide](minting-guide/minting-guide-start.md). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md new file mode 100644 index 00000000..1ad2310a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md @@ -0,0 +1,166 @@ +--- +title: Gitcoin Alpha Round Instructions +id: gitcoin-round +sidebar_position: 3 +--- + +# Gitcoin Alpha Round Instructions + +## Overview + +- all projects in the Gitcoin Alpha Round are invited to mint a hypercert for their work +- anyone who gave over $1 to a project is automatically allowlisted for that project’s hypercert +- 50% of each hypercert is distributed to the funders, 50% is kept by the project and can be transferred later +- each project has a custom URL to make minting super easy (the link is sent directly to each project) +- everything runs on Optimism (users only need to pay L2 gas costs) + +:::info +If your project participated in the Gitcoin Alpha Round, but you didn't get a message with a custom URL, please reach out to team[at]hypercert.org. +::: + +## Hypercerts x Gitcoin Alpha Round + +Now that Gitcoin’s Alpha Round has officially closed and the funding distribution is finalized, we are inviting all eligible projects that participated to mint a hypercert for their past work and to allocate fractions of their hypercert to a list of supporters. + +We’ve created a dApp that pulls all of the data required to mint your hypercert directly from Gitcoin’s Grant Protocol. You can fine-tune the properties, tweak your artwork, and review the distribution mechanism. Once you’re ready, hit the create button and your hypercert will be released into the ethers! + +Once your hypercert has been minted, the people who supported your project with a contribution of at least $1 DAI on Gitcoin’s Alpha Round will be able to connect and claim their fractions. + +A few important notes about the Alpha Round: + +- The total units of a hypercert is based on the total donations; each funder get awarded units proportional to their donations. +- Transfers will be restricted to one transfer from the project to the supporters. +- There will be no additional rights awarded to the funders except the right to "public display" their support for the project. + +## Instructions + +The following guidance is only for projects that receive a custom URL that pre-populates the hypercerts form based on their Gitcoin Grants' data. + +It explains the default settings in the form and recommends fields that the creator may choose to update or edit. + +:::note +Gitcoin Grant hypercerts are for retrospective work, i.e., they are intended to capture work that happened between Gitcoin Grants Round 15 (September 2022) and the Alpha Round (January 2023). Therefore, the work time period is always set to past dates. (You might need to adjust the name and description to also refer to past work only.) We are focusing solely on retrospective hypercerts for this round as part of broader efforts to promote retrospective funding; you can read more about it [in the whitepaper](whitepaper/retrospective-funding.md). +::: + +### General Fields + +#### Name of Hypercert + +This field is set by default to the name of your project on Gitcoin Grants. You can edit this to be more specific. Given that your project may create numerous hypercerts over time, consider giving each hypercert a name that represents a more discrete phase or output. + +#### Logo + +This field is set to the icon artwork provided for your project on Gitcoin Grants. If there was an error accessing your icon, you will see a generic icon. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +#### Background Banner Image + +This field is set to the banner artwork provided for your project on Gitcoin Grants. If there was an error accessing your banner, you will see a generic Gitcoin banner. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +#### Project Description + +This field is set by default to the description of your project on Gitcoin Grants. Review closely -- a long project description in your Gitcoin Grant description will be truncated. + +You may edit this to provide more details about your work and to remove information that is targeted solely at Gitcoin Grants users. This is also a good place to provide other links, such as Github repos or social media accounts, where the general public can learn more about the work. Please aim for a project description that is less than 500 characters. + +:::note +The project description should refer to **past work**, not future work that you would like to do with additional funding. +::: + +#### Link + +This field is set to the first external URL provided for your project on Gitcoin Grants. You can update this. + +### Hypercert Fields + +#### Work Scope + +This field is set by default to a **shortened version** of the name of your project on Gitcoin Grants. You may edit or add additional work scope tags. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +#### Work Start/End Dates + +The start date has been set by default to the `2022-09-22` for all projects on Gitcoin Grants. This date coincides with the end of Gitcoin Grants Round 15. + +The end date references the last update to your grant page on Gitcoin Grants. + +You may edit or update these fields, however, the end date may not extend beyond `2023-01-31` (the close of the funding round) as all hypercerts will be retrospective in this round. + +#### Set of Contributors + +This field is set by default to the wallet address that is set as the recipient address for receiving Gitcoin Grants funding. + +:::note +You should review this field closely and – if applicable – provide the addresses of additional contributors. +::: + +### Advanced Fields + +#### Impact Scope + +This field is set by default to `all`. + +Updates are currently disabled on the frontend because funding decisions on Gitcoin Grants were not specific to an impact scope or impact time period. + +#### Impact Start/End Dates + +This field is set by default to the work start date of `2022-09-22` (see above) and a work end date of `indefinite`. Updates are currently disabled on the frontend. + +#### Rights + +This field is set by default to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +Updates are currently disabled on the frontend. + +### Distribution + +#### Allowlist + +This field is set by default to a custom allowlist generated for each project based on the funding it received on the Gitcoin Grants Alpha Round. You should not need to update this field. If there is a problem with your allowlist, please contact us. + +50% of the hypercert will be allocated according to this allowlist. The other 50% will be kept by the project, i.e. it is allocated to the address that mints the hypercert. You will be able to transfer or sell these fractions later as long as they are owned by the minter. This means that they can only be transferred or sold once. + +The formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +The queries used to generate the allowlists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Donors who contributed to the matching pool for each round are also eligible to claim hypercerts. + +:::note +You are free to edit your allowlist. You can do this by following the step-by-step instructions [here](minting-guide/step-by-step.md). Just remember that you will need to upload the new allowlist in a CSV format to a storage site like [web3.storage](https://web3.storage) and then update the link in the allowlist field. Contact team[at]hypercerts.org if you need help. +::: + +### Confirmations + +#### Contributors' permission + +Every contributor needs to agree to have their contribution be represented by a hypercert. This is why the person minting the hypercert has to confirm to have the permission of all listed contributors. + +#### Terms & Conditions + +The terms & Conditions can be found [here](https://hypercerts.org/terms). + +### Final step: Click "Create" + +Make sure your Optimism wallet or multi-sig is connected. Click on "create" and wait for your hypercert to be created. Congratulations! diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md new file mode 100644 index 00000000..47e8ad7c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md @@ -0,0 +1,44 @@ +--- +title: Getting Started +id: minting-guide-start +sidebar_position: 1 +--- + +# Getting started + +### How to create a hypercert + +Creating a hypercert is similar to creating an NFT on sites like OpenSea or Zora. + +In this article, we’ll walk through the steps one by one and explain exactly what you need to do to create your first hypercert. + +There are typically two ways of creating a hypercert: + +1. As a project affiliated with a specific funding network (e.g., Gitcoin Grants): In this case, you should receive a custom URL from the funding network that pre-populates most of your hypercert fields. You will still be able to change most of these, so you should review and adjust them as needed to better describe your hypercert. Guidance on how to do so (for Gitcoin Grants projects) is provided at the end of this doc. +2. As a project not affiliated with a specific funding network: In this case, you will be creating a hypercert from scratch and filling in each field on your own. Read on below. + +### Who can create a hypercert? + +Anyone doing work that is intended to have a positive impact can create a hypercert. Your hypercert can be as simple as "I did X on this date and want to claim all future impact from it". + +It can also represent something more, such as a phase in an ongoing team project, an invention or discovery, a research publication, or an important software release. + +Critically, if the work was done by more than one person, then each person should be listed as a contributor to the hypercert and approve the creation of the hypercert. + +_Note: In the future, the approval of each contributor will be verified on-chain._ + +### What do I need to create a hypercert? + +You will need to prepare all of the information required in the form builder (see **Step-by-step instructions for creating a hypercert** below). This includes important metadata, such as a description of the project and the dimensions of your impact claim, as well as a project artwork. You may also want to include an allowlist of wallets that are approved to claim one or more fractions of the hypercert. + +In addition to the information regarding the hypercert itself, you’ll need a crypto wallet to mint your hypercert. “Minting” a hypercert is the process of writing an impact claim to the blockchain. This establishes its immutable record of authenticity and ownership. + +Next, choose a blockchain on which to mint your hypercert. The hypercerts protocol is available on Ethereum, Goerli (testnet), and Optimism. Each of these blockchains has different gas fees associated with transactions on their networks. To reduce gas fees we recommend Optimism for most projects. + +Finally, go ahead and create your hypercert. + +### How much does it cost to create a hypercert? + +You will need enough Ethereum in your wallet to cover gas fees. In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). + +The protocol currently does not offer gas-free or "lazy" minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md new file mode 100644 index 00000000..9f3b6303 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md @@ -0,0 +1,130 @@ +--- +title: Step-by-step Instructions +id: step-by-step +sidebar_position: 2 +--- + +# Step-by-step instructions + +First, go to the [Create Hypercert](https://hypercerts.org/app/create) site with a wallet-enabled browser or follow the custom URL you received to access a prepopulated form. + +Although the site works on mobile, it is easier to use on desktop because the browser will display a dynamic preview of the hypercert while you fill out the Create form. + +Next, connect your wallet. You will be prompted to switch to the Ethereum or Optimism network. + +Once you've connected, you will see an empty form for creating a hypercert. + +### General fields + +#### Name of Hypercert + +Enter the name or title of the hypercert. This is the place to be verbose and specific about what the project is doing. You'll see on the preview when your title becomes too long. + +Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. + +Names are restricted to 100 characters but may include emojis (:smile:), accents (é), non-Latin scripts (表情), and other Unicode characters. + +#### Project Description + +Enter a human readable description of the hypercert. This is the place to share more details about the work and the team or individual behind the work. + +The description field supports [Markdown syntax](https://www.markdownguide.org/cheat-sheet/) and has a limit of 10,000 characters. + +In addition to the main link (see next field) you can add further links in the markdown to help others to understand the work of the project. + +#### Link + +A valid URL for the project, beginning with https:// + +This will be displayed next to the hypercert on webpages like OpenSea and should link users to a page that has more information about the project or impact claim. + +#### Logo + +An icon for the top left part of the card. This could be your project logo. It will be automatically masked to the shape of a circle. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +#### Background Banner Image + +A background image that will extend across the upper half of the artwork. This could be your project masthead or a unique piece of art. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +Currently we don't support zoom / cropping, so you will need to test the look and feel on your own. + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +### Work Scope fields + +#### Work Scope + +One or multiple tags describe the work that the hypercert represents. This work scope will be used to identify the work that is included in the hypercerts and the work that is not included. + +Multiple tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +_Note: In the future, you will be able to specifically exclude work from the hypercert._ + +#### Start and End Date of Work + +The work time period defines when the work was done that the hypercert represents, i.e., only the work in this time period is included in the hypercert. + +The time period of work doesn't need to be the start and end date of a project, but it can be. One project can be split up into multiple hypercerts, e.g. all hypercerts can have the same `work scope`, but different time periods of work. Of course, the time periods are not allowed to overlap. + +### Impact scope fields + +#### Impact Scope + +The impact scope can be used to limit the impact that a hypercert represents, e.g. for the work scope `Planting trees` a hypercert can represent _only_ the impact on biodiversity by including the impact scope tag `Biodiversity`. This would exclude all other impacts, including the impact on CO2 in the atmosphere, which can be useful if that impact is already captured by a carbon credit. + +By default this is set to "`all`" and we strongly recommend keeping it that way. + +Just like the work scope, multiple impact scope tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction). + +#### Start and End Date of Impact + +The impact time period is another way to limit the impact that a hypercert represents, e.g. inventing a new medical treatment has a positive impact over many years, but we might want to capture the positive impact separately for each year. + +By default the `impact start date` is the same as the `work start date` and the `impact end date` is "`indefinite`", i.e., the impact is not restricted time-wise. We strongly recommend keeping it that way. + +### Set of Contributors + +Provide a list of contributors, one per line, or comma-separated. + +The list should include _all_ contributors that performed the described work. + +Contributors are generally itemized as wallet addresses or ENS names, but can also be names / pseudonyms. Groups of contributors can be represented by a multisig or name of an organization. + +### Owners + +#### Allowlist + +The allowlist allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions afterwards. For example, it can be used to allocate fractions to previous funders and contributors. + +The allowlist is implemented as a CSV file specifying `index,address,price,fractions` headers. + +| index | address | price | fractions | +| ----- | ------------------------------------------ | ----- | --------- | +| 0 | 0x5dee7b340764c49a827c60d2b8729e49405fbefc | 0.0 | 100 | +| 1 | 0x1e2dbb9ca3f6d48e085384a821b7259abfdc7d65 | 0.0 | 50 | +| ... | ... | ... | ... | +| 999 | 0x436bad18642f45d3fa5fcaad0a2d81764a9cba85 | 0.0 | 1 | + +The `price` field is denominated in ETH. This should remain at 0.0 for all hypercerts, as primary sales are not currently supported through the app and the secondary sale/transfer of hypercerts is currently not allowed. + +You can store your allowlists on IPFS using [web3.storage](https://web3.storage/). + +:::note +If your allowlist is not properly formatted, you will be unable to mint your hypercert. If you do not include an allowlist, then the creator of the hypercert will receive 100% of the hypercert (set to a default of 10,000 units), which you can then sell or transfer to another wallet a maximum of one time. +::: + +#### Rights + +This field defines the rights that owners of the hypercert have over the work being claimed by this hypercert. + +By default this is set to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +_Note: In the future, additional rights can be included for different hypercerts._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md new file mode 100644 index 00000000..87fb9194 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md @@ -0,0 +1,23 @@ +--- +title: Open Impact Evaluations +id: evaluation +sidebar_position: 5 +--- + +A key design element is that hypercerts themselves do not make a claim about the size of the impact, but only account for the work that is supposed to be impactful. The figure below shows this contrast in a simplified illustration of the example that we introduced above. The open evaluation system allows multiple evaluations to point at the same area of the impact space that a hypercert claims. The evaluations can include self-evaluation from the contributors themselves. Funders observe these and make their funding decisions based on this richer set of information. + +![hypercert evaluations](../../static/img/hypercert_evaluations.png) + +The open evaluation system is also used to provide additional information, e.g. an evaluator or the project itself provides information about the health of the trees. This information can then be used transparently by other evaluators to evaluate the impact on CO2 in the atmosphere. + +An important feature is that the evaluations do not directly point at a hypercert, but rather at an area in the impact space. In practice this area will mostly be the exact same area that a hypercert claims, such that it can be considered an evaluation of the hypercert, but it does not have to. This feature ensures that, if hypercerts are merged or split, previous evaluations will continue to be linked appropriately. + +The form of evaluations can be standardized to simplify handling and comparing multiple evaluations from multiple evaluators. The open evaluation system allows for templates to be created and used by any evaluators. Similar to the emerging ontologies, these are not enforced centrally, but should emerge as useful standards – potentially steered by decentralized governance institutions. + +Important characteristics of the open evaluation system are: + +- Evaluators can submit multiple evaluations of the same area in the impact space as more information becomes available +- Evaluations can challenge other evaluations +- Evaluation methodologies can evolve over time + +These features allow the whole evaluation system to be dynamically improved by each actor. The relevant incentives for this improvement will stem from the funders who will value the signals from some evaluators more than others and evaluators are able to build up reputation. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md new file mode 100644 index 00000000..8acc11d1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md @@ -0,0 +1,104 @@ +--- +title: "Hypercerts: a New Primitive for Impact Funding Systems" +id: hypercerts-intro +sidebar_position: 3 +--- + +### Defining hypercerts + +A hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and represents all or parts of that impact. A hypercert has the following fields (one for each dimension): + +1. **Set of contributors:** An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. **Scope of work:** A conjunction of potentially-negated work scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +3. **Time of work:** A date range, from the start to the end of the work being claimed by this hypercert. +4. **Scope of impact:** A conjunction of potentially-negated impact scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +5. **Time of impact:** Date ranges from the start to the end of the impact. +6. **Rights of the owners:** An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Implementing hypercerts as a semi-fungible token allows multiple contributors and funders to own parts of hypercerts. For instance the original contributors can award 10% of a hypercert to a funder, while keeping 90%, which they can award to other funders later. This is why hypercerts are fractionalizable. + +### Examples + +In the simplest cases of hypercerts, the scope of work and impact as well as the time of impact are not restricted and no rights are transferred to owners of the hypercerts, i.e. the hypercerts just define the who (set of contributors) and when (time of work) of the claimed work. Scope of work and impact would be set to all, time of impact to “indefinite” and the rights to only “public display of support”. The latter is always included as the hypercert is a public record, such that owners will always automatically display their support of the work. + +Take for example hypercert 1 below: It represents all work that contributor 1 has performed in 2013 with all the impact that the work had from the beginning of the work; the hypercert doesn’t give any additional rights to the owners of the hypercert. + +The other fields – except the rights field – can be used to limit the work or impact that is represented by the hypercert. Hypercert 2 limits this to the work on IPFS in 2013, i.e. any other work besides IPFS that contributor 1 performed is not included. Hypercert 3 limits it even further as it excludes a specific aspect of IPFS, the go-ipfs implementation. + +| | **Hypercert 1** | **Hypercert 2** | **Hypercert 3** | +| ----------------------- | ------------------------- | ------------------------- | ------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | all | IPFS | IPFS ∧ ¬ go-ipfs | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | all | all | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → 2013-12-31 | +| **Rights** | Public display of support | Public display of support | Public display of support | + +In the table below we illustrate a use case for limiting the scope of impact. Suppose contributor 1 protects trees in a certain area. This work has positive effects on the CO2 in the atmosphere and could turn into carbon credits; however, the trees have additional positive impacts, such as protecting biodiversity. Instead of including all positive impacts in one hypercert (hypercert 4), the impact can be split between the impact on CO2 in the atmosphere (hypercert 5) and all other positive impacts (hypercert 6). If funders are willing to pay for biodiversity, this would be a new income opportunity. And it would account for the additional positive impact that other methods of reducing CO2 might not have, like industrial carbon capture. Importantly, negative impacts can not be excluded from a hypercert. + +| | **Hypercert 4** | **Hypercert 5** | **Hypercert 6** | +| ----------------------- | -------------------------- | -------------------------- | -------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | Protecting trees in area X | Protecting trees in area X | Protecting trees in area X | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | CO2 in atmosphere | all ∧ ¬ CO2 in atmosphere | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → indefinite | +| **Rights** | Public display of support | Public display of support | Public display of support | + +Importantly a hypercert does not specify the “size” of the impact, e.g. a hypercert does not state “5 tons of CO2 removed from the atmosphere.” Instead the hypercert only defines the work, e.g. “200 trees protected” (scope of work) in 2022 (time of work). The size of the impact is then left to the evaluations of the “CO2 in the atmosphere” (scope of impact) in 2022 (time of impact) that point towards the covered region of the hypercert. For instance: This allows a self evaluation to claim that 5 tons of CO2 were removed in a given year as well as one or multiple evaluations from independent auditors to confirm or challenge how much CO2 has been removed. An evaluator could detect that some of the trees were not healthy and hence only 4 tons of CO2 were removed. Allowing for multiple evaluation is a defining characteristic of the open evaluation system. + +### Functions of hypercerts + +#### 1. Identifiability + +Hypercerts clearly define the work that is supposed to be impactful by creating a record of who (set of contributors) claims to do or have done what (scope of work) in what time period (time of work). They also allow the creation of multiple records of the same work to identify separate impacts that this work had or will have (scope of impact) over specified time periods (time of impact). + +#### 2. Traceability + +As these records are public and logically monotonic (immutable, except to split or merge hypercerts), records are durable and permanent. + +#### 3. Transferability + +The records are a digital object that can be owned and ownership can be transferred (under specific conditions). As hypercerts can be created as fractionalizable, it is also possible to transfer only a specified fraction of the hypercert. Each hypercert defines the rights over the defined work that owners have, such as rights to retrospective rewards, rights to public display of the support (“bragging rights”) or rights to passive income from intellectual property. + +:::note Transferability restrictions + +Hypercerts are generally transferable. However, there are use cases, in which minters of hypercerts want to restrict how their hypercerts can be transferred. The protocol allows the minter to restrict who can transfer the hypercert and/or to whom the hypercert can be transferred. For instance, by specifying that only the original owner can transfer the hypercert, any future owner is prohibited from selling it, i.e. a secondary market would not exist for this hypercert. + +::: + +### Merging hypercerts + +Besides the fungible dimension, hypercerts can be merged and split on any of the six dimensions as shown in box 1. Let us take the hypercert 1 from the section "Hypercerts definition" and focus only on two of the dimensions, scope of work and time of work. These two dimensions create a simplified impact space. The figure below shows how work on IPFS (InterPlanetary File System) could have been minted over time in separate hypercerts, one for each quarter of work. + +![minting hypercerts example](../../static/img/creating.png) + +We created five hypercerts, one for each quarter of work. As the resulting work of all of these together is IPFS 0.1, the merged hypercert in total is more meaningful and more valuable than just the five individual hypercerts. In this case the proverb is true, the whole is greater than the sum of its parts. Hence, we want to merge them as shown in the next figure. + +![merging hypercerts example](../../static/img/merging.png) + +### Splitting hypercerts + +Conversely, splitting can increase the meaningfulness and value of hypercerts as well. We can split the work on IPFS 0.1 into the conceptual work “invention of IPFS” and the implementation via “go-ipfs 0.1” as shown in the next figure. + +![splitting hypercerts examples](../../static/img/splitting.png) + +Other use cases are where multiple contributors want to combine their work on the same scope of work (merging) or disentangle their work (splitting). Ultimately, splitting and merging allows users to repackage the digital representation of their work and impact. + +Importantly, splitting and merging are the only operations that are permitted to change hypercerts. Once an area in the impact space is claimed, it can not be unclaimed. This ensures that claims are never forgotten. + +### Retiring hypercerts + +While a claim in the impact space can not be unclaimed, it can be retired. Retiring a hypercert means that owners can not transfer and sell it anymore. This way owners prove that they are the final buyers of the impact. Technically retiring hypercerts means that they are sent to a specific null address, which ensures that the retired hypercerts are recorded and traceable. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md new file mode 100644 index 00000000..6f71ac50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md @@ -0,0 +1,103 @@ +--- +title: The Need for Interoperable Impact Funding Systems (IFSs) +id: ifs +--- + +# The Need for Interoperable Impact Funding Systems (IFSs) + +### An IFS consists of + +- **Actors:** Contributors, funders, evaluators, and beneficiaries +- **Funding mechanisms:** Grants, bounties, retrospective funding, etc. +- **Coordination mechanisms:** Roadmapping, communication forums, etc. +- **A goal:** Maximize the domain-specific positive value created (impact) + +The goal will be specific to the impact area, e.g. prevent existential risks from artificial intelligence (AI) would be the goal for the impact area “AI safety.” To achieve these goals, skilled contributors must work with high effort on promising projects. Additionally, for those projects that create impact continuously, sufficient income streams are necessary to cover both their ongoing operating expenses and contributors’ upside incentives. + +#### Actors in IFSs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeSubtypeDescription
    ContributorsPeople or organizations who do the work
    FundersProspective fundersPeople or organizations who fund work before it is done
    Retrospective fundersPeople or organizations who fund work after it is done
    EvaluatorsScoutsPeople or organizations who evaluate the potential impact of work before it is done
    AuditorsPeople or organizations who evaluate the impact of work after it is done
    BeneficiariesPeople or objects that are impacted by the work
    + +### Guiding questions for designing IFSs + +1. **Projects:** How can we improve the chances that the most promising projects are worked on? +2. **Talent & resources:** How can we attract top talent to contribute to the most promising projects and provide them with the necessary resources? +3. **Effort:** How can we reward contributors for their impact on outcomes? +4. **Sustainable income:** How can we create recurring income streams and financial sustainability for impactful projects? + +Markets have been proven very powerful in answering these questions if they are directed towards maximizing profits. As we are directing systems towards maximizing impact, these answers become more challenging. In particular, in an IFS we are facing coordination and incentive problems in funding impact, such as the free-rider problem. + +### Example dynamics between actors in an IFS + +In order for impact funding systems to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources and (3) evaluations. In the diagram below you see a potential dynamic between the actors of an IFS. In that scenario hypercerts can account for the prospective funding (steps 2-3) as well as for the retrospective funding (steps 8-9) from different funders. Evaluations are made public and can be discovered through the hypercerts for all funders (steps 5-7). Retrospective funders can reward not only the contributors but also the prospective funders (steps 10-11). + +```mermaid +sequenceDiagram + autonumber + participant Beneficiaries + participant Contributors + participant Prospective funders + participant Retrospective funders + participant Evaluators + Contributors ->> Contributors: Mint hypercerts + Prospective funders ->> Contributors: Award funding + Contributors ->> Prospective funders: Award fractions of
    the hypercert + Contributors ->> Beneficiaries: Create impact + Retrospective funders ->> Evaluators: Fund evaluation + Evaluators ->> Beneficiaries: Evaluate impact on beneficiaries + Evaluators ->> Retrospective funders: Make evaluations public,
    esp. for retrospective
    funders + Retrospective funders ->> Contributors: Award funding + Contributors ->> Retrospective funders: Award fractions of hypercerts + opt + Retrospective funders ->> Prospective funders: Award funding + Prospective funders ->> Retrospective funders: Transfer fractions
    of hypercert + end +``` + +### Hypercerts as a data layer for IFSs + +By serving as a single, open, shared, decentralized database hypercerts lower the transaction costs to coordinate and fund impactful work together. This is important because the optimal funding decisions of a single funder depends on the funding decision of all other funders. For instance, some work is only impactful if a minimum funding is provided: The impact is non-linear in the funding amount, e.g. half a bridge is not half as impactful as a full bridge. Other work might be over-funded, i.e. the impact of an additional dollar is basically zero. Ultimately, funders want to find the highest impact for each additional dollar spend (cf. S-process as in Critch, 2021). Today multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Through hypercerts the funding becomes more transparent and the credits for funding impactful work can be easily shared. Coordinating funding becomes easier. + +Hypercerts don’t solve this coordination problem by themselves, but build the basis for different decision and funding mechanisms as shown below. Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. Hypercerts do not lock in any particular decision-making scheme for funders. + +![Hypercerts as a data layer for an IFS](../../static/img/hypercert_data_layer.png) + +Looking farther into the future: If a large majority of funding across an entire IFS ends up flowing through hypercerts, funders have created the transparency that enables each of them to make the best decisions given the funding decision of everyone else. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md new file mode 100644 index 00000000..f8fed762 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md @@ -0,0 +1,35 @@ +--- +title: A Consistent Impact Space +id: impact-space +sidebar_position: 4 +--- + +Every hypercert represents a claim in the impact space, which itself represents all possible claims. Above we illustrated the impact space with two dimensions, scope and time of work. The complete impact space is spanned by the six dimensions introduced in the definition of hypercerts. + +### Consistency of the impact space + +Every point in the impact space should either be claimed or not be claimed. No point must be claimed twice, or equivalently: + +- If the impact of some work is represented in one hypercert, it must not be part of any other hypercert. +- Hypercerts must not overlap with each other. + +The table below shows two hypercerts that were illustrated in the section on "Hypercerts operations", but now with all six fields. The two hypercerts can represent the exact same work by the same contributor, but they do not overlap because of the difference in the time of work. + +| | **Hypercert 7** | **Hypercert 8** | +| ----------------------- | ------------------------ | ------------------------ | +| **Set of contributors** | Contributor 1 | Contributor 1 | +| **Scope of work** | IPFS | IPFS | +| **Time of work** | 2013-10-01 to 2013-12-31 | 2014-01-01 to 2014-03-31 | +| **Scope of impact** | all | all | +| **Time of impact** | 2013-10-01 → indefinite | 2014-01-01 → indefinite | +| **Rights** | None | None | + +The consistency of the impact space is crucial as it ensures that no rights to an impact claim are sold twice. If for example someone owns the right to retrospective rewards for the impact of some work, the owners must be identifiable unambiguously. + +Because users can create hypercerts with arbitrary data on any chain, on which a hypercert contract is deployed, we provide ways to help users detect collisions in the impact space. For example, if one hypercert on Ethereum points to the work on “IPFS”, and another hypercert on Filecoin points to the work on “https://github.com/ipfs/go-ipfs” both with the same contributor and time of work, which of these overlapping hypercerts is the correct one to support? To surface such overlapping hypercerts, the hypercerts protocol and SDK will support mechanisms to index, search, and visualize neighbors in the impact space. With these tools evaluators can quickly detect potential conflicts and submit the results as evaluations to help disambiguate proper credit and attribution. + +### Emerging ontologies + +Common ontologies for the scope of work and scope of impact are useful to create transparency and improve discoverability. Such ontologies need to be created from the practices and should be adapted over time. They are like emerging norms, instead of fixed rules. However, some larger players or a group of smaller players could enforce certain ontologies, e.g. if multiple funders agree that they only fund projects that follow a specified ontology. + +As some ontologies might be more useful than others, we would ideally see a consensus emerge between participants and experts in each impact area. Decentralized governance institutions can help facilitate this; however, further details on the design are out of the scope of this paper and are left for future work. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md new file mode 100644 index 00000000..57444581 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md @@ -0,0 +1,42 @@ +--- +title: Retrospective Impact Funding +id: retrospective-funding +sidebar_position: 6 +--- + +### Introducing retrospective funding + +While hypercerts do not impose any specific funding mechanisms, they are especially useful for retrospective funding. The core idea, from the perspective of contributors building impactful goods, is this: if you can reasonably expect to get funded retrospectively for your work once you produce a positive impact, then you can work now, in expectation of a probabilistic future cash flow. In another conception, you are effectively “borrowing” money from this anticipated future cash flow to fund the work in the first place; the expectation of future funding “retro-causes” the impactful work. Retrospective funding may be able to 1) provide incentives for contributors to take on impactful goods projects with a potentially high, but uncertain, impact and 2) create a more efficient IFS by back-propagating signals on what outcomes were impactful post-hoc. + +In addition, contributors are able to receive fair compensation by providing outsized impact that will be highly valued. It incentivizes you to create a positive impact, beyond your intrinsic motivation. This does not mean that the most successful contributors to impactful goods automatically have potential upside comparable to some for-profit startup founders (or that they should), just that their potential upside does depend on how much funders later value their past work. This will attract more talent to the impact sector by improving performance-based compensation. + +The crucial aspect for this to work: funders need to retrospectively fund impact, and send credible signals that they will do so in the future. Based on these signals contributors form expectations about future retrospective rewards and can start working today to receive them in the future. + +Hypercerts facilitate retrospective funding as the impact claims are identifiable, traceable and transferable. Contributors can sell parts of their hypercerts to prospective funders to receive the necessary funding for their project (“activity” in the figure below). The project delivers impact to a larger group (“beneficiaries”), which retrospectively buys the hypercerts from the prospective funder, and from the contributors if they retained some fraction of their hypercerts (the latter is not represented in the figure). + +![Retrospective funding with hypercerts](../../static/img/retrospective_funding.png) + +### Increasing rewards + +Retrospective funding allows us to increase rewards as more impact is created because impact is easier to observe, measure and prove retrospectively. Increasing rewards – as shown in the next figure – incentivizes contributors to put in their highest effort to produce impact and enables contributors to be rewarded for their talent. Moreover, prospective funders are incentivized to select, fund and support the projects with the highest expected impact, if they also receive retrospective rewards. + +![Increasing rewards](../../static/img/increasing_rewards.png) + +Note that retrospective funding should not be used in cases where a significant negative impact is possible since a nongovernmental, permissionless framework can not impose retrospective penalties for negative externalities. See Ofer & Cotton-Barratt (2022) for a discussion of this limitation of retrospective funding. + +In some cases we do not expect the retrospective evaluation to be any different than the prospective evaluation, i.e. there is no uncertainty resolved over time as the impact of an activity is already “known” prospectively. In these cases retrospective funding would only complicate the funding mechanism and funding via grants or milestone bounties would be preferable. Retrospective funding is preferable only if uncertainty is resolved over time. + +### Impact evaluations + +The relevance of impact evaluations will depend on how much their signals influence the funding decisions of retrospective funders (see the potential dynamics in the section on "IFSs"). This is a critical difference to many impact reports today: If a project was funded by a grant, the funders as well as the project want to receive a positive evaluation. If, however, the funding decisions of the retrospective funders are outstanding, they are interested in truthful signals about the impact. Hence, funders value improvements in evaluation methodologies and can fund independent evaluators. Evaluators in turn would build up a reputation for their evaluation methodologies and improve the strength of their signals to retrospective funders. + +Impact evaluators can take on a range of forms ranging forms, such as + +- Voting by relevant communities or beneficiaries +- Expert panels +- Professional evaluators similar to financial rating agencies +- Automatic monitoring and data collection by sensors and oracles + +The most useful form or combinations thereof will depend on the specific requirements of the impact area. For a generalized framework on impact evaluators see Protocol Labs (2023). + +While retrospective funding makes impact evaluations financially relevant for funders and contributors, hypercerts enable to pre-commit funding for those evaluations: As impact claims are never forgotten, any actor can at any time commit funding to a future evaluation of these claims. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md new file mode 100644 index 00000000..4d4648ba --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md @@ -0,0 +1,24 @@ +--- +title: Introduction +id: whitepaper-intro +--- + +# Vision & Whitepaper + +:::note + +If you prefer to read the draft whitepaper (v0) as a pdf, you can find it [here](../../static/pdf/hypercerts_whitepaper_v0.pdf). The content is mostly identical to the following pages. + +::: + +#### The world faces unprecedented challenges, from climate change to safe artificial intelligence, that require billions to trillions of dollars of public goods funding. + +High-upside/high-uncertainty endeavors are often overlooked due to the absence of strong incentives to pursue them in the dominant public goods funding framework of at-cost grants or even a milestone-bounty framework (which directly exposes small contributors to aversive risk levels). Yet these should be pursued when the expected positive value is very high, as it often is. New impact funding mechanisms can address this. One such mechanism is retrospective funding, which rewards projects based on the impact they create after the impact is observable. If projects can reasonably expect such retrospective rewards, they are incentivized to maximize their impact and – together with prospective funders – take risky bets when the expected positive value is high. + +#### In order for Impact Funding Systems (IFSs) to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources, and (3) evaluations. + +Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. We do not wish to lock in any particular decision-making scheme for funders. Without mechanisms like these, multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Funders should be able to easily collaborate with other funders or to intentionally fund different projects to diversify the funded approaches. Evaluators should be able to evaluate the same impact with different methodologies – potentially with conflicting results, to foster rigor and progress of evaluation methodologies. + +#### Hypercerts create this interoperability by serving as a single, open, shared, decentralized database for impact funding mechanisms. + +A single hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and whose ownership is fractionizable and transferable (under specific conditions). Hypercerts do not impose any specific funding mechanisms but provide baseline invariant guarantees such that claims will not be forgotten as different mechanisms come into and out of fashion. This is also why hypercerts are especially useful for any retrospective funding mechanisms – funding can be applied to claims of the past. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/about.md b/docs/versioned_docs/version-1.0.0-alpha.1/about.md new file mode 100644 index 00000000..e2d4eb79 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/about.md @@ -0,0 +1,24 @@ +--- +title: The Hypercerts Foundation +id: about +--- + +# The Hypercerts Foundation + +### Mission + +The mission of the Hypercerts Foundation is to advance the development and adoption of open-source protocols for funding and rewarding positive impact. + +### Organization + +The Hypercerts Foundation is a fully independent organisation working closely with stakeholders in the open source, scientific research, and cryptography communities to develop and promote additional protocols that are decentralized, secure, and transparent. The Foundation will also provide support and resources to help drive the wider adoption of these protocols. + +### History + +Research on hypercerts was first presented to the public by David A. Dalrymple at the conference series Funding the Commons in March 2022. However, the concept of “impact certificates” has been a recurring theme at conferences and in online discussion forums since at least 2014. In late 2022, a small team of research scientists, developers, and practitioners began implementing hypercerts as a set of Ethereum-based smart contracts that could be used to assert and fund impact claims. The Hypercerts Foundation will now serve as the long-term home for this work. + +The new foundation is supported in part by Protocol Labs and is part of the broader Protocol Labs Network of hundreds of companies and organizations. The Foundation will complement Protocol Labs Network’s mission of enabling a more secure, open, and accessible internet. The Hypercerts Foundation, however, is fully independent and will focus on protocol development and cultivating a community of developers and impact entrepreneurs well beyond the Protocol Labs Network. + +### Further links + +Read the full [announcement of the Hypercerts Foundation](https://hypercerts.notion.site/Introducing-the-Hypercerts-Foundation-d956203fe0fc4792980da138015e770a). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md new file mode 100644 index 00000000..bc65b116 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md @@ -0,0 +1,101 @@ +# Allowlists + +Allowlists are an efficient way to enable distribution of hypercert fractions amongst a group. +First, the creator will create the hypercert with the metadata and an immutable allowlist. +With the `claimId`, every account specified in the allowlist can later mint their fraction token from that allowlist. + +## Create an allowlist + +First specify an allowlist, mapping addresses to the number of units they should receive. + +```js +import { + TransferRestrictions, + formatHypercertData, + Allowlist, +} from "@hypercerts-org/sdk"; + +const allowlist: Allowlist = [ + { address: "0x123", units: 100 }, + { address: "0xabc", units: 100 }, +]; +``` + +Then, call `createAllowlist` with the metadata and allowlist. + +```js +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; +const transferRestrictions = TransferRestrictions.FromCreatorOnly + +const { claimId } = await hypercerts.createAllowlist({ + allowList, + metaData, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **note** We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree generation and data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree) + +It first checks if the client is writable and if the operator is a signer. If the operator is not a signer, it throws an `InvalidOrMissingError`. + +Next, it validates the allowlist and metadata by calling the `validateAllowlist` and `validateMetaData` functions respectively. If either the allowlist or metadata is invalid, it throws a `MalformedDataError`. + +Once the allowlist and metadata are validated, the method creates a Merkle tree from the allowlist and stores it on IPFS. It then stores the metadata on IPFS as well. + +Finally, the method invokes the `createAllowlist` function on the contract with the signer's `address`, the total number of `units`, the Merkle tree `root`, the metadata `CID`, and the `transfer restrictions`. If the method is called with `overrides`, it passes them to the createAllowlist function. + +## Claiming a fraction token + +Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: + +| Variable | Type | Source | +| -------- | ------------ | ------------ | +| claimId | BigNumberish | Hypercert ID | +| units | BigNumberish | Allowlist | +| proof | BytesLike[] | Merkle tree | + +We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. + +Then, call `mintClaimFractionFromAllowlist` with the required data. The contracts will also verify the proofs. However, when providing the `root` in the function input, the proofs will be verified before a transaction is submitted. + +```js +import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; + +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const address = "0xc0ffee254729296a45a3885639AC7E10F9d54979"; + +const { indexer, storage } = hypercertsClient; +const claimById = await indexer.claimById(claimId); +const { uri, tokenID: _id } = claimById.claim; +const metadata = await storage.getMetadata(uri || ""); +const treeResponse = await storage.getData(metadata.allowList); +const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); + +let args; +// Find the proof in the allowlist +for (const [leaf, value] of tree.entries()) { + if (value[0] === address) { + args = { + proofs: tree.getProof(leaf), + units: Number(value[1]), + claimId: _id, + }; + break; + } +} + +// Mint fraction token +const tx = await hypercerts.mintClaimFractionFromAllowlist({ + ...args, +}); +``` + +Let's see what happens under the hood: + +First, the method checks that the client is not `read only` and that the operator is a signer. If not, it throws an `InvalidOrMissingError`. + +Next, the method verifies the Merkle `proof` using the OpenZeppelin Merkle tree library. If a `root` is provided, the method uses it to verify the proof. If the proof is invalid, it throws an error. + +Finally, the method calls the `mintClaimFromAllowlist` function on the contract with the signer `address`, Merkle `proof`, `claim ID`, and number of `units` as parameters. If overrides are provided, the method uses them to send the transaction. Otherwise, it sends the transaction without overrides. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md new file mode 100644 index 00000000..e31e8840 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md @@ -0,0 +1,434 @@ +# HypercertTrader + +_bitbeckers_ + +> Contract for managing hypercert trades + +Implementation of the HypercertTrader Interface + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsForSale | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +### getOffer + +```solidity +function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------- | ----------- | +| \_0 | IHypercertTrader.Offer | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### offers + +```solidity +function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | --------------------------------- | ----------- | +| offerer | address | undefined | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| unitsAvailable | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| offerType | enum IHypercertTrader.OfferType | undefined | +| status | enum IHypercertTrader.OfferStatus | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### totalUnitsForSale + +```solidity +function totalUnitsForSale(address, uint256) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +## Errors + +### InvalidBuy + +```solidity +error InvalidBuy(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### InvalidOffer + +```solidity +error InvalidOffer(string) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### NotAllowed + +```solidity +error NotAllowed() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md new file mode 100644 index 00000000..13a84632 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md @@ -0,0 +1,39 @@ +# IHypercertMinter + +## Methods + +### ownerOf + +```solidity +function ownerOf(uint256 id) external view returns (address) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 id) external view returns (uint256) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md new file mode 100644 index 00000000..6be07157 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md @@ -0,0 +1,77 @@ +# AggregatorV3Interface + +## Methods + +### decimals + +```solidity +function decimals() external view returns (uint8) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ----- | ----------- | +| \_0 | uint8 | undefined | + +### description + +```solidity +function description() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### getRoundData + +```solidity +function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------ | ----------- | +| \_roundId | uint80 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### latestRoundData + +```solidity +function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +#### Returns + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| roundId | uint80 | undefined | +| answer | int256 | undefined | +| startedAt | uint256 | undefined | +| updatedAt | uint256 | undefined | +| answeredInRound | uint80 | undefined | + +### version + +```solidity +function version() external view returns (uint256) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md new file mode 100644 index 00000000..8d14ad8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md @@ -0,0 +1 @@ +# console diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md new file mode 100644 index 00000000..cb666cd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md @@ -0,0 +1,3 @@ +# console2 + +_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md new file mode 100644 index 00000000..06fb700c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md @@ -0,0 +1,133 @@ +# IHypercertTrader + +_bitbeckers_ + +> Interface for hypercert token trading + +This interface declares the required functionality to interact with the hypercert marketplace + +## Methods + +### batchBuyUnits + +```solidity +function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable +``` + +_Buys Hypercert tokens from multiple existing offers in a single transaction._ + +#### Parameters + +| Name | Type | Description | +| ------------------- | --------- | -------------------------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerIDs | uint256[] | The list of IDs of the offers to buy from. | +| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | +| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | +| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | + +### buyUnits + +```solidity +function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable +``` + +_Buys Hypercert tokens from an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | --------------------------------------------------- | +| recipient | address | The address that will receive the Hypercert tokens. | +| offerID | uint256 | The ID of the offer to buy from. | +| unitAmount | uint256 | The number of units to buy. | +| buyToken | address | The address of the token used for payment. | +| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | + +### cancelOffer + +```solidity +function cancelOffer(uint256 offerID) external nonpayable +``` + +_Cancels an existing offer._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ------------------------------ | +| offerID | uint256 | The ID of the offer to cancel. | + +### createOffer + +```solidity +function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | -------------------------------- | ----------- | +| hypercertContract | address | undefined | +| fractionID | uint256 | undefined | +| units | uint256 | undefined | +| minUnitsPerTrade | uint256 | undefined | +| maxUnitsPerTrade | uint256 | undefined | +| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | ----------- | +| offerID | uint256 | undefined | + +## Events + +### OfferCancelled + +```solidity +event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| creator `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### OfferCreated + +```solidity +event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| offerer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID `indexed` | uint256 | undefined | +| offerID | uint256 | undefined | + +### Trade + +```solidity +event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) +``` + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ------- | ----------- | +| seller `indexed` | address | undefined | +| buyer `indexed` | address | undefined | +| hypercertContract `indexed` | address | undefined | +| fractionID | uint256 | undefined | +| unitsBought | uint256 | undefined | +| buyToken | address | undefined | +| tokenAmountPerUnit | uint256 | undefined | +| offerID | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md new file mode 100644 index 00000000..4cb96bfc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md @@ -0,0 +1,46 @@ +# BatchOrderTypehashRegistry + +_LooksRare protocol team (👀,💎)_ + +> BatchOrderTypehashRegistry + +The contract generates the batch order hash that is used to compute the digest for signature verification. + +## Methods + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +## Errors + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md new file mode 100644 index 00000000..a32aef65 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md @@ -0,0 +1,76 @@ +# CreatorFeeManagerWithRebates + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRebates + +This contract returns the creator fee address and the creator rebate amount. + +## Methods + +### STANDARD_ROYALTY_FEE_BP + +```solidity +function STANDARD_ROYALTY_FEE_BP() external view returns (uint256) +``` + +Standard royalty fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md new file mode 100644 index 00000000..41cab900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md @@ -0,0 +1,64 @@ +# CreatorFeeManagerWithRoyalties + +_LooksRare protocol team (👀,💎)_ + +> CreatorFeeManagerWithRoyalties + +This contract returns the creator fee address and the creator fee amount. + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) +``` + +Royalty fee registry interface. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | contract IRoyaltyFeeRegistry | undefined | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +_There are two on-chain sources for the royalty fee to distribute. 1. RoyaltyFeeRegistry: It is an on-chain registry where creator fee is defined for all items of a collection. 2. ERC2981: The NFT Royalty Standard where royalty fee is defined at a itemId level in a collection. The on-chain logic looks up the registry first. If it does not find anything, it checks if a collection is ERC2981. If so, it fetches the proper royalty information for the itemId. For a bundle that contains multiple itemIds (for a collection using ERC2981), if the royalty fee/recipient differ among the itemIds part of the bundle, the trade reverts. This contract DOES NOT enforce any restriction for extremely high creator fee, nor verifies the creator fee fetched is inferior to the total price. If any contract relies on it to build an on-chain royalty logic, it should implement protection against: (1) high royalties (2) potential unexpected royalty changes that can occur after the creation of the order._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md new file mode 100644 index 00000000..9ff1c0fc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md @@ -0,0 +1,250 @@ +# CurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> CurrencyManager + +This contract manages the list of valid fungible currencies. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md new file mode 100644 index 00000000..83eefc37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md @@ -0,0 +1,751 @@ +# ExecutionManager + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> ExecutionManager + +This contract handles the execution and resolution of transactions. A transaction is executed on-chain when an off-chain maker order is matched by on-chain taker order of a different kind. For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md new file mode 100644 index 00000000..022cce57 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md @@ -0,0 +1,9 @@ +# InheritedStrategy + +_LooksRare protocol team (👀,💎)_ + +> InheritedStrategy + +This contract handles the verification of parameters for standard transactions. It does not verify the taker struct's itemIds and amounts array as well as minPrice (taker ask) / maxPrice (taker bid) because before the taker executes the transaction and the maker itemIds/amounts/price should have already been confirmed off-chain. + +_A standard transaction (bid or ask) is mapped to strategyId = 0._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md new file mode 100644 index 00000000..cc542c7e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -0,0 +1,1157 @@ +# LooksRareProtocol + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> LooksRareProtocol + +This contract is the core smart contract of the LooksRare protocol ("v2"). It is the main entry point for users to initiate transactions with taker orders and manage the cancellation of maker orders, which exist off-chain. ~~~~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~- ~~~~~~~~ ~~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~~ ~~~~~~~~ ~~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~~~~ + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ETH. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### chainId + +```solidity +function chainId() external view returns (uint256) +``` + +Current chainId. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +Current domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### hashBatchOrder + +```solidity +function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) +``` + +This function returns the hash of the concatenation of batch order type hash and merkle root. + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ------------------- | +| root | bytes32 | Merkle root | +| proofLength | uint256 | Merkle proof length | + +#### Returns + +| Name | Type | Description | +| -------------- | ------- | -------------------- | +| batchOrderHash | bytes32 | The batch order hash | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### restrictedExecuteTakerBid + +```solidity +function restrictedExecuteTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, address sender, bytes32 orderHash) external nonpayable returns (uint256 protocolFeeAmount) +``` + +#### Parameters + +| Name | Type | Description | +| --------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| sender | address | undefined | +| orderHash | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| protocolFeeAmount | uint256 | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateDomainSeparator + +```solidity +function updateDomainSeparator() external nonpayable +``` + +This function allows the owner to update the domain separator (if possible). + +_Only callable by owner. If there is a fork of the network with a new chainId, it allows the owner to reset the domain separator for the new chain id._ + +### updateETHGasLimitForTransfer + +```solidity +function updateETHGasLimitForTransfer(uint256 newGasLimitETHTransfer) external nonpayable +``` + +This function allows the owner to update the maximum ETH gas limit for a standard transfer. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------ | +| newGasLimitETHTransfer | uint256 | New gas limit for ETH transfer | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------- | +| gasLimitETHTransfer | uint256 | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| askUser | address | undefined | +| bidUser | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | +| bidUser | address | undefined | +| bidRecipient | address | undefined | +| strategyId | uint256 | undefined | +| currency | address | undefined | +| collection | address | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| feeRecipients | address[2] | undefined | +| feeAmounts | uint256[3] | undefined | + +## Errors + +### CallerInvalid + +```solidity +error CallerInvalid() +``` + +It is returned if the function cannot be called by the sender. + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### CurrencyInvalid + +```solidity +error CurrencyInvalid() +``` + +It is returned if the currency is invalid. + +### ERC20TransferFromFail + +```solidity +error ERC20TransferFromFail() +``` + +It is emitted if the ERC20 transferFrom fails. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### MerkleProofTooLarge + +```solidity +error MerkleProofTooLarge(uint256 length) +``` + +It is returned if the length of the merkle proof provided is greater than tolerated. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ------------ | +| length | uint256 | Proof length | + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### QuoteTypeInvalid + +```solidity +error QuoteTypeInvalid() +``` + +It is returned if the maker quote type is invalid. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md new file mode 100644 index 00000000..fea95495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md @@ -0,0 +1,193 @@ +# NonceManager + +_LooksRare protocol team (👀,💎)_ + +> NonceManager + +This contract handles the nonce logic that is used for invalidating maker orders that exist off-chain. The nonce logic revolves around three parts at the user level: - order nonce (orders sharing an order nonce are conditional, OCO-like) - subset (orders can be grouped under a same subset) - bid/ask (all orders can be executed only if the bid/ask nonce matches the user's one on-chain) Only the order nonce is invalidated at the time of the execution of a maker order that contains it. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md new file mode 100644 index 00000000..36f6a35c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md @@ -0,0 +1,75 @@ +# ProtocolFeeRecipient + +_LooksRare protocol team (👀,💎)_ + +> ProtocolFeeRecipient + +This contract is used to receive protocol fees and transfer them to the fee sharing setter. Fee sharing setter cannot receive ETH directly, so we need to use this contract as a middleman to convert ETH into WETH before sending it. + +## Methods + +### FEE_SHARING_SETTER + +```solidity +function FEE_SHARING_SETTER() external view returns (address) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### WETH + +```solidity +function WETH() external view returns (contract IWETH) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------- | ----------- | +| \_0 | contract IWETH | undefined | + +### transferERC20 + +```solidity +function transferERC20(address currency) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------------- | +| currency | address | ERC20 currency address | + +### transferETH + +```solidity +function transferETH() external nonpayable +``` + +## Errors + +### ERC20TransferFail + +```solidity +error ERC20TransferFail() +``` + +It is emitted if the ERC20 transfer fails. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NothingToTransfer + +```solidity +error NothingToTransfer() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md new file mode 100644 index 00000000..a55f3985 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md @@ -0,0 +1,391 @@ +# StrategyManager + +_LooksRare protocol team (👀,💎)_ + +> StrategyManager + +This contract handles the addition and the update of execution strategies. + +## Methods + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md new file mode 100644 index 00000000..c6766114 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md @@ -0,0 +1,553 @@ +# TransferManager + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> TransferManager + +This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. + +_"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ + +## Methods + +### allowOperator + +```solidity +function allowOperator(address operator) external nonpayable +``` + +This function allows an operator to be added for the shared transfer system. Once the operator is allowed, users can grant NFT approvals to this operator. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------------- | +| operator | address | Operator address to allow | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### grantApprovals + +```solidity +function grantApprovals(address[] operators) external nonpayable +``` + +This function allows a user to grant approvals for an array of operators. Users cannot grant approvals if the operator is not allowed by this contract's owner. + +_Each operator address must be globally allowed to be approved._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### hasUserApprovedOperator + +```solidity +function hasUserApprovedOperator(address, address) external view returns (bool) +``` + +This returns whether the user has approved the operator address. The first address is the user and the second address is the operator (e.g. LooksRareProtocol). + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isOperatorAllowed + +```solidity +function isOperatorAllowed(address) external view returns (bool) +``` + +This returns whether the operator address is allowed by this contract's owner. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### removeOperator + +```solidity +function removeOperator(address operator) external nonpayable +``` + +This function allows the user to remove an operator for the shared transfer system. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | -------------------------- | +| operator | address | Operator address to remove | + +### revokeApprovals + +```solidity +function revokeApprovals(address[] operators) external nonpayable +``` + +This function allows a user to revoke existing approvals for an array of operators. + +_Each operator address must be approved at the user level to be revoked._ + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| operators | address[] | Array of operator addresses | + +### splitItemsHypercert + +```solidity +function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function splits and transfers a fraction of a hypercert. + +_It does not allow batch transferring._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferBatchItemsAcrossCollections + +```solidity +function transferBatchItemsAcrossCollections(ITransferManager.BatchTransferItem[] items, address from, address to) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------------------------ | ----------- | +| items | ITransferManager.BatchTransferItem[] | undefined | +| from | address | undefined | +| to | address | undefined | + +### transferItemsERC1155 + +```solidity +function transferItemsERC1155(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC1155 collection. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsERC721 + +```solidity +function transferItemsERC721(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single ERC721 collection. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +### transferItemsHypercert + +```solidity +function transferItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable +``` + +This function transfers items for a single Hypercert. + +_It does not allow batch transferring if from = msg.sender since native function should be used._ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| from | address | Sender address | +| to | address | Recipient address | +| itemIds | uint256[] | Array of itemIds | +| amounts | uint256[] | Array of amounts | + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | ----------- | +| user | address | undefined | +| operators | address[] | undefined | + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### ERC1155SafeBatchTransferFromFail + +```solidity +error ERC1155SafeBatchTransferFromFail() +``` + +It is emitted if the ERC1155 safeBatchTransferFrom fails. + +### ERC1155SafeTransferFromFail + +```solidity +error ERC1155SafeTransferFromFail() +``` + +It is emitted if the ERC1155 safeTransferFrom fails. + +### ERC721TransferFromFail + +```solidity +error ERC721TransferFromFail() +``` + +It is emitted if the ERC721 transferFrom fails. + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotAContract + +```solidity +error NotAContract() +``` + +It is emitted if the call recipient is not a contract. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md new file mode 100644 index 00000000..9011bd50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md @@ -0,0 +1,779 @@ +# TransferSelectorNFT + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> TransferSelectorNFT + +This contract handles the logic for transferring non-fungible items. + +## Methods + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### addStrategy + +```solidity +function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable +``` + +This function allows the owner to add a new execution strategy to the protocol. + +_Strategies have an id that is incremental. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------- | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the strategy | +| isMakerBid | bool | Whether the function selector is for maker bid | +| implementation | address | Implementation address | + +### cancelOrderNonces + +```solidity +function cancelOrderNonces(uint256[] orderNonces) external nonpayable +``` + +This function allows a user to cancel an array of order nonces. + +_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | --------------------- | +| orderNonces | uint256[] | Array of order nonces | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### cancelSubsetNonces + +```solidity +function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable +``` + +This function allows a user to cancel an array of subset nonces. + +_It does not check the status of the nonces to save gas._ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ---------------------- | +| subsetNonces | uint256[] | Array of subset nonces | + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +Creator fee manager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### incrementBidAskNonces + +```solidity +function incrementBidAskNonces(bool bid, bool ask) external nonpayable +``` + +This function increments a user's bid/ask nonces. + +_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | --------------------------------------- | +| bid | bool | Whether to increment the user bid nonce | +| ask | bool | Whether to increment the user ask nonce | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isCurrencyAllowed + +```solidity +function isCurrencyAllowed(address) external view returns (bool) +``` + +It checks whether the currency is allowed for transacting. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint16) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | uint16 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### protocolFeeRecipient + +```solidity +function protocolFeeRecipient() external view returns (address) +``` + +Protocol fee recipient. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### strategyInfo + +```solidity +function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +This returns the strategy information for a strategy id. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +Transfer manager for ERC721, ERC1155 and Hypercerts. + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | + +### updateCreatorFeeManager + +```solidity +function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable +``` + +This function allows the owner to update the creator fee manager address. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ---------------------------------- | +| newCreatorFeeManager | address | Address of the creator fee manager | + +### updateCurrencyStatus + +```solidity +function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable +``` + +This function allows the owner to update the status of a currency. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | -------------------------------------------------- | +| currency | address | Currency address (address(0) for ETH) | +| isAllowed | bool | Whether the currency should be allowed for trading | + +### updateMaxCreatorFeeBp + +```solidity +function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable +``` + +This function allows the owner to update the maximum creator fee (in basis point). + +_The maximum value that can be set is 25%. Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------ | ---------------------------------------- | +| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | + +### updateProtocolFeeRecipient + +```solidity +function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable +``` + +This function allows the owner to update the protocol fee recipient. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ---------------------------------- | +| newProtocolFeeRecipient | address | New protocol fee recipient address | + +### updateStrategy + +```solidity +function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable +``` + +This function allows the owner to update parameters for an existing execution strategy. + +_Only callable by owner._ + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ------- | ------------------------------------------ | +| strategyId | uint256 | Strategy id | +| isActive | bool | Whether the strategy must be active | +| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | +| newMinTotalFee | uint16 | New minimum total fee (in basis point) | + +### userBidAskNonces + +```solidity +function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) +``` + +This tracks the bid and ask nonces for a user address. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------- | ----------- | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### userOrderNonce + +```solidity +function userOrderNonce(address, uint256) external view returns (bytes32) +``` + +This checks whether the order nonce for a user was executed or cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### userSubsetNonce + +```solidity +function userSubsetNonce(address, uint256) external view returns (bool) +``` + +This checks whether the subset nonce for a user was cancelled. + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| currency | address | undefined | +| isAllowed | bool | undefined | + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| user | address | undefined | +| bidNonce | uint256 | undefined | +| askNonce | uint256 | undefined | + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| creatorFeeManager | address | undefined | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| maxCreatorFeeBp | uint256 | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| protocolFeeRecipient | address | undefined | + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | +| maxProtocolFeeBp | uint16 | undefined | +| selector | bytes4 | undefined | +| isMakerBid | bool | undefined | +| implementation | address | undefined | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ----------- | +| user | address | undefined | +| orderNonces | uint256[] | undefined | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ----------- | +| strategyId | uint256 | undefined | +| isActive | bool | undefined | +| standardProtocolFeeBp | uint16 | undefined | +| minTotalFeeBp | uint16 | undefined | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| user | address | undefined | +| subsetNonces | uint256[] | undefined | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### ReentrancyFail + +```solidity +error ReentrancyFail() +``` + +This is returned when there is a reentrant call. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### UnsupportedCollectionType + +```solidity +error UnsupportedCollectionType() +``` + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md new file mode 100644 index 00000000..37866658 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md @@ -0,0 +1,41 @@ +# BaseStrategy + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md new file mode 100644 index 00000000..c9503939 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md @@ -0,0 +1,212 @@ +# BaseStrategyChainlinkPriceLatency + +_LooksRare protocol team (👀,💎)_ + +> BaseStrategyChainlinkPriceLatency + +This contract allows the owner to define the maximum acceptable Chainlink price latency. + +## Methods + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md new file mode 100644 index 00000000..e2d77dd3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md @@ -0,0 +1,342 @@ +# StrategyChainlinkUSDDynamicAsk + +_LooksRare protocol team (👀,💎)_ + +> StrategyChainlinkUSDDynamicAsk + +This contract allows a seller to sell an NFT priced in USD and the receivable amount to be in ETH. + +## Methods + +### ETH_USD_PRICE_FEED_DECIMALS + +```solidity +function ETH_USD_PRICE_FEED_DECIMALS() external view returns (uint256) +``` + +_It is possible to call priceFeed.decimals() to get the decimals, but to save gas, it is hard coded instead._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### WETH + +```solidity +function WETH() external view returns (address) +``` + +Wrapped ether (WETH) address. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### cancelOwnershipTransfer + +```solidity +function cancelOwnershipTransfer() external nonpayable +``` + +This function is used to cancel the ownership transfer. + +_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ + +### confirmOwnershipRenouncement + +```solidity +function confirmOwnershipRenouncement() external nonpayable +``` + +This function is used to confirm the ownership renouncement. + +### confirmOwnershipTransfer + +```solidity +function confirmOwnershipTransfer() external nonpayable +``` + +This function is used to confirm the ownership transfer. + +_This function can only be called by the current potential owner._ + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### initiateOwnershipRenouncement + +```solidity +function initiateOwnershipRenouncement() external nonpayable +``` + +This function is used to initiate the ownership renouncement. + +### initiateOwnershipTransfer + +```solidity +function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable +``` + +This function is used to initiate the transfer of ownership to a new owner. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------- | +| newPotentialOwner | address | New potential owner address | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +### maxLatency + +```solidity +function maxLatency() external view returns (uint256) +``` + +Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +Address of the current owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownershipStatus + +```solidity +function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) +``` + +Ownership status. + +#### Returns + +| Name | Type | Description | +| ---- | ---------------------------- | ----------- | +| \_0 | enum IOwnableTwoSteps.Status | undefined | + +### potentialOwner + +```solidity +function potentialOwner() external view returns (address) +``` + +Address of the potential owner. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### priceFeed + +```solidity +function priceFeed() external view returns (contract AggregatorV3Interface) +``` + +ETH/USD Chainlink price feed + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------------ | ----------- | +| \_0 | contract AggregatorV3Interface | undefined | + +## Events + +### CancelOwnershipTransfer + +```solidity +event CancelOwnershipTransfer() +``` + +This is emitted if the ownership transfer is cancelled. + +### InitiateOwnershipRenouncement + +```solidity +event InitiateOwnershipRenouncement() +``` + +This is emitted if the ownership renouncement is initiated. + +### InitiateOwnershipTransfer + +```solidity +event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) +``` + +This is emitted if the ownership transfer is initiated. + +#### Parameters + +| Name | Type | Description | +| -------------- | ------- | ----------- | +| previousOwner | address | undefined | +| potentialOwner | address | undefined | + +### NewOwner + +```solidity +event NewOwner(address newOwner) +``` + +This is emitted when there is a new owner. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### ChainlinkPriceInvalid + +```solidity +error ChainlinkPriceInvalid() +``` + +It is returned if the Chainlink price is invalid (e.g. negative). + +### NoOngoingTransferInProgress + +```solidity +error NoOngoingTransferInProgress() +``` + +This is returned when there is no transfer of ownership in progress. + +### NotOwner + +```solidity +error NotOwner() +``` + +This is returned when the caller is not the owner. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. + +### PriceNotRecentEnough + +```solidity +error PriceNotRecentEnough() +``` + +It is returned if the current block time relative to the latest price's update time is greater than the latency tolerance. + +### RenouncementNotInProgress + +```solidity +error RenouncementNotInProgress() +``` + +This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. + +### TransferAlreadyInProgress + +```solidity +error TransferAlreadyInProgress() +``` + +This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. + +### TransferNotInProgress + +```solidity +error TransferNotInProgress() +``` + +This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. + +### WrongPotentialOwner + +```solidity +error WrongPotentialOwner() +``` + +This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md new file mode 100644 index 00000000..ddec4495 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md @@ -0,0 +1,127 @@ +# StrategyCollectionOffer + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> StrategyCollectionOffer + +This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount must be 1 (fractions are NFTs) + +## Methods + +### executeCollectionStrategyWithTakerAsk + +```solidity +function executeCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithAllowlist + +```solidity +function executeCollectionStrategyWithTakerAskWithAllowlist(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeCollectionStrategyWithTakerAskWithProof + +```solidity +function executeCollectionStrategyWithTakerAskWithProof(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md new file mode 100644 index 00000000..1227878d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md @@ -0,0 +1,83 @@ +# StrategyDutchAuction + +_LooksRare protocol team (👀,💎)_ + +> StrategyDutchAuction + +This contract offers a single execution strategy for users to create Dutch auctions. + +## Methods + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md new file mode 100644 index 00000000..daa427e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -0,0 +1,123 @@ +# StrategyHypercertFractionOffer + +_LooksRare protocol team (👀,💎); bitbeckers;_ + +> StrategyHypercertFractionOffer + +This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. + +_Use cases can include tiered pricing; think early bird tickets._ + +## Methods + +### executeHypercertFractionStrategyWithTakerBid + +```solidity +function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeHypercertFractionStrategyWithTakerBidWithAllowlist + +```solidity +function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### AmountInvalid + +```solidity +error AmountInvalid() +``` + +It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + +### LengthsInvalid + +```solidity +error LengthsInvalid() +``` + +It is returned if there is either a mismatch or an error in the length of the array(s). + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md new file mode 100644 index 00000000..6a1f0cd5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md @@ -0,0 +1,75 @@ +# StrategyItemIdsRange + +_LooksRare protocol team (👀,💎)_ + +> StrategyItemIdsRange + +This contract offers a single execution strategy for users to bid on a specific amount of items in a range bounded by 2 item ids. + +## Methods + +### executeStrategyWithTakerAsk + +```solidity +function executeStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md new file mode 100644 index 00000000..76918fc5 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md @@ -0,0 +1,215 @@ +# OrderValidatorV2A + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderValidatorV2A + +This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) + +_This version does not handle strategies with partial fills._ + +## Methods + +### CRITERIA_GROUPS + +```solidity +function CRITERIA_GROUPS() external view returns (uint256) +``` + +Number of distinct criteria groups checked to evaluate the validity of an order. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### ERC1155_INTERFACE_ID + +```solidity +function ERC1155_INTERFACE_ID() external view returns (bytes4) +``` + +ERC1155 interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_1 + +```solidity +function ERC721_INTERFACE_ID_1() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### ERC721_INTERFACE_ID_2 + +```solidity +function ERC721_INTERFACE_ID_2() external view returns (bytes4) +``` + +ERC721 potential interfaceId. + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### HYPERCERT_INTERFACE_ID + +```solidity +function HYPERCERT_INTERFACE_ID() external view returns (bytes4) +``` + +Hypercert interfaceId + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | bytes4 | undefined | + +### MAGIC_VALUE_ORDER_NONCE_EXECUTED + +```solidity +function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) +``` + +Magic value nonce returned if executed (or cancelled). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### checkMakerOrderValidity + +```solidity +function checkMakerOrderValidity(OrderStructs.Maker makerOrder, bytes signature, OrderStructs.MerkleTree merkleTree) external view returns (uint256[9] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| signature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ---------- | ----------- | +| validationCodes | uint256[9] | undefined | + +### checkMultipleMakerOrderValidities + +```solidity +function checkMultipleMakerOrderValidities(OrderStructs.Maker[] makerOrders, bytes[] signatures, OrderStructs.MerkleTree[] merkleTrees) external view returns (uint256[9][] validationCodes) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------------------------- | ----------- | +| makerOrders | OrderStructs.Maker[] | undefined | +| signatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | + +#### Returns + +| Name | Type | Description | +| --------------- | ------------ | ----------- | +| validationCodes | uint256[9][] | undefined | + +### creatorFeeManager + +```solidity +function creatorFeeManager() external view returns (contract ICreatorFeeManager) +``` + +CreatorFeeManager. + +#### Returns + +| Name | Type | Description | +| ---- | --------------------------- | ----------- | +| \_0 | contract ICreatorFeeManager | undefined | + +### deriveProtocolParameters + +```solidity +function deriveProtocolParameters() external nonpayable +``` + +Derive protocol parameters. Anyone can call this function. + +_It allows adjusting if the domain separator or creator fee manager address were to change._ + +### domainSeparator + +```solidity +function domainSeparator() external view returns (bytes32) +``` + +LooksRareProtocol domain separator. + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +LooksRareProtocol. + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### maxCreatorFeeBp + +```solidity +function maxCreatorFeeBp() external view returns (uint256) +``` + +Maximum creator fee (in basis point). + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### transferManager + +```solidity +function transferManager() external view returns (contract TransferManager) +``` + +TransferManager + +#### Returns + +| Name | Type | Description | +| ---- | ------------------------ | ----------- | +| \_0 | contract TransferManager | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md new file mode 100644 index 00000000..91be29a9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md @@ -0,0 +1,159 @@ +# ProtocolHelpers + +_LooksRare protocol team (👀,💎)_ + +> ProtocolHelpers + +This contract contains helper view functions for order creation. + +## Methods + +### computeDigestMerkleTree + +```solidity +function computeDigestMerkleTree(OrderStructs.MerkleTree merkleTree) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### computeMakerDigest + +```solidity +function computeMakerDigest(OrderStructs.Maker maker) external view returns (bytes32 digest) +``` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------ | ------- | ----------- | +| digest | bytes32 | undefined | + +### looksRareProtocol + +```solidity +function looksRareProtocol() external view returns (contract LooksRareProtocol) +``` + +#### Returns + +| Name | Type | Description | +| ---- | -------------------------- | ----------- | +| \_0 | contract LooksRareProtocol | undefined | + +### verifyMakerSignature + +```solidity +function verifyMakerSignature(OrderStructs.Maker maker, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ------------------ | ----------- | +| maker | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### verifyMerkleTree + +```solidity +function verifyMerkleTree(OrderStructs.MerkleTree merkleTree, bytes makerSignature, address signer) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| merkleTree | OrderStructs.MerkleTree | undefined | +| makerSignature | bytes | undefined | +| signer | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +## Errors + +### NullSignerAddress + +```solidity +error NullSignerAddress() +``` + +It is emitted if the signer is null. + +### SignatureEOAInvalid + +```solidity +error SignatureEOAInvalid() +``` + +It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). + +### SignatureERC1271Invalid + +```solidity +error SignatureERC1271Invalid() +``` + +It is emitted if the signature is invalid for a ERC1271 contract signer. + +### SignatureLengthInvalid + +```solidity +error SignatureLengthInvalid(uint256 length) +``` + +It is emitted if the signature's length is neither 64 nor 65 bytes. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| length | uint256 | undefined | + +### SignatureParameterSInvalid + +```solidity +error SignatureParameterSInvalid() +``` + +It is emitted if the signature is invalid due to S parameter. + +### SignatureParameterVInvalid + +```solidity +error SignatureParameterVInvalid(uint8 v) +``` + +It is emitted if the signature is invalid due to V parameter. + +#### Parameters + +| Name | Type | Description | +| ---- | ----- | ----------- | +| v | uint8 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md new file mode 100644 index 00000000..b832744e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md @@ -0,0 +1,60 @@ +# ICreatorFeeManager + +_LooksRare protocol team (👀,💎)_ + +> ICreatorFeeManager + +## Methods + +### royaltyFeeRegistry + +```solidity +function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry royaltyFeeRegistry) +``` + +It returns the royalty fee registry address/interface. + +#### Returns + +| Name | Type | Description | +| ------------------ | ---------------------------- | ------------------------------------- | +| royaltyFeeRegistry | contract IRoyaltyFeeRegistry | Interface of the royalty fee registry | + +### viewCreatorFeeInfo + +```solidity +function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) +``` + +This function returns the creator address and calculates the creator fee amount. + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | +| itemIds | uint256[] | Array of item ids | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ------------------ | +| creator | address | Creator address | +| creatorFeeAmount | uint256 | Creator fee amount | + +## Errors + +### BundleEIP2981NotAllowed + +```solidity +error BundleEIP2981NotAllowed(address collection) +``` + +It is returned if the bundle contains multiple itemIds with different creator fee structure. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md new file mode 100644 index 00000000..da683d8c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md @@ -0,0 +1,22 @@ +# ICurrencyManager + +_LooksRare protocol team (👀,💎)_ + +> ICurrencyManager + +## Events + +### CurrencyStatusUpdated + +```solidity +event CurrencyStatusUpdated(address currency, bool isAllowed) +``` + +It is emitted if the currency status in the allowlist is updated. + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------------------------------- | +| currency | address | Currency address (address(0) = ETH) | +| isAllowed | bool | Whether the currency is allowed | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md new file mode 100644 index 00000000..0e86c75b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md @@ -0,0 +1,99 @@ +# IExecutionManager + +_LooksRare protocol team (👀,💎)_ + +> IExecutionManager + +## Events + +### NewCreatorFeeManager + +```solidity +event NewCreatorFeeManager(address creatorFeeManager) +``` + +It is issued when there is a new creator fee manager. + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | -------------------------------------- | +| creatorFeeManager | address | Address of the new creator fee manager | + +### NewMaxCreatorFeeBp + +```solidity +event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) +``` + +It is issued when there is a new maximum creator fee (in basis point). + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ---------------------------------------- | +| maxCreatorFeeBp | uint256 | New maximum creator fee (in basis point) | + +### NewProtocolFeeRecipient + +```solidity +event NewProtocolFeeRecipient(address protocolFeeRecipient) +``` + +It is issued when there is a new protocol fee recipient address. + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------------------------------------- | +| protocolFeeRecipient | address | Address of the new protocol fee recipient | + +## Errors + +### CreatorFeeBpTooHigh + +```solidity +error CreatorFeeBpTooHigh() +``` + +It is returned if the creator fee (in basis point) is too high. + +### NewProtocolFeeRecipientCannotBeNullAddress + +```solidity +error NewProtocolFeeRecipientCannotBeNullAddress() +``` + +It is returned if the new protocol fee recipient is set to address(0). + +### NoSelectorForStrategy + +```solidity +error NoSelectorForStrategy() +``` + +It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. + +### OutsideOfTimeRange + +```solidity +error OutsideOfTimeRange() +``` + +It is returned if the current block timestamp is not between start and end times in the maker order. + +### StrategyNotAvailable + +```solidity +error StrategyNotAvailable(uint256 strategyId) +``` + +It is returned if the strategy id has no implementation. + +_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ----------- | +| strategyId | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md new file mode 100644 index 00000000..393cb24b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md @@ -0,0 +1,41 @@ +# IImmutableCreate2Factory + +## Methods + +### findCreate2Address + +```solidity +function findCreate2Address(bytes32 salt, bytes initializationCode) external view returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | + +### safeCreate2 + +```solidity +function safeCreate2(bytes32 salt, bytes initializationCode) external payable returns (address deploymentAddress) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| salt | bytes32 | undefined | +| initializationCode | bytes | undefined | + +#### Returns + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| deploymentAddress | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md new file mode 100644 index 00000000..e7414f54 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md @@ -0,0 +1,157 @@ +# ILooksRareProtocol + +_LooksRare protocol team (👀,💎)_ + +> ILooksRareProtocol + +## Methods + +### executeMultipleTakerBids + +```solidity +function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------- | ----------- | +| takerBids | OrderStructs.Taker[] | undefined | +| makerAsks | OrderStructs.Maker[] | undefined | +| makerSignatures | bytes[] | undefined | +| merkleTrees | OrderStructs.MerkleTree[] | undefined | +| isAtomic | bool | undefined | + +### executeTakerAsk + +```solidity +function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +### executeTakerBid + +```solidity +function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable +``` + +#### Parameters + +| Name | Type | Description | +| -------------- | ----------------------- | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | +| makerSignature | bytes | undefined | +| merkleTree | OrderStructs.MerkleTree | undefined | + +## Events + +### NewDomainSeparator + +```solidity +event NewDomainSeparator() +``` + +It is emitted if there is a change in the domain separator. + +### NewGasLimitETHTransfer + +```solidity +event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) +``` + +It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). + +#### Parameters + +| Name | Type | Description | +| ------------------- | ------- | ----------------------------- | +| gasLimitETHTransfer | uint256 | Gas limit for an ETH transfer | + +### TakerAsk + +```solidity +event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker ask transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| askUser | address | Address of the ask user | +| bidUser | address | Address of the bid user | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it can be the taker ask user or different) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +### TakerBid + +```solidity +event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) +``` + +It is emitted when a taker bid transaction is completed. + +#### Parameters + +| Name | Type | Description | +| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | +| bidUser | address | Address of the bid user | +| bidRecipient | address | Address of the recipient of the bid | +| strategyId | uint256 | Id of the strategy | +| currency | address | Address of the currency | +| collection | address | Address of the collection | +| itemIds | uint256[] | Array of item ids | +| amounts | uint256[] | Array of amounts (for item ids) | +| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it is the maker ask user) feeRecipients[1] Creator fee recipient (if none, address(0)) | +| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | + +## Errors + +### ChainIdInvalid + +```solidity +error ChainIdInvalid() +``` + +It is returned if the domain separator should change. + +### NewGasLimitETHTransferTooLow + +```solidity +error NewGasLimitETHTransferTooLow() +``` + +It is returned if the gas limit for a standard ETH transfer is too low. + +### NoncesInvalid + +```solidity +error NoncesInvalid() +``` + +It is returned if the nonces are invalid. + +### SameDomainSeparator + +```solidity +error SameDomainSeparator() +``` + +It is returned if the domain separator cannot be updated (i.e. the chainId is the same). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md new file mode 100644 index 00000000..eaa3f977 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md @@ -0,0 +1,53 @@ +# INonceManager + +_LooksRare protocol team (👀,💎)_ + +> INonceManager + +## Events + +### NewBidAskNonces + +```solidity +event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) +``` + +It is emitted when there is an update of the global bid/ask nonces for a user. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ------------------- | +| user | address | Address of the user | +| bidNonce | uint256 | New bid nonce | +| askNonce | uint256 | New ask nonce | + +### OrderNoncesCancelled + +```solidity +event OrderNoncesCancelled(address user, uint256[] orderNonces) +``` + +It is emitted when order nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ----------- | --------- | ------------------------------- | +| user | address | Address of the user | +| orderNonces | uint256[] | Array of order nonces cancelled | + +### SubsetNoncesCancelled + +```solidity +event SubsetNoncesCancelled(address user, uint256[] subsetNonces) +``` + +It is emitted when subset nonces are cancelled for a user. + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | -------------------------------- | +| user | address | Address of the user | +| subsetNonces | uint256[] | Array of subset nonces cancelled | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md new file mode 100644 index 00000000..5ed0ef6c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md @@ -0,0 +1,29 @@ +# IRoyaltyFeeRegistry + +_LooksRare protocol team (👀,💎)_ + +> IRoyaltyFeeRegistry + +## Methods + +### royaltyInfo + +```solidity +function royaltyInfo(address collection, uint256 price) external view returns (address receiver, uint256 royaltyFee) +``` + +This function returns the royalty information for a collection at a given transaction price. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| collection | address | Collection address | +| price | uint256 | Transaction price | + +#### Returns + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| receiver | address | Receiver address | +| royaltyFee | uint256 | Royalty fee amount | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md new file mode 100644 index 00000000..2b4a45bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md @@ -0,0 +1,41 @@ +# IStrategy + +_LooksRare protocol team (👀,💎)_ + +> IStrategy + +## Methods + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool isStrategy) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---------- | ---- | ---------------------------------------------- | +| isStrategy | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerOrder | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md new file mode 100644 index 00000000..ae6ea7b1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md @@ -0,0 +1,84 @@ +# IStrategyManager + +_LooksRare protocol team (👀,💎)_ + +> IStrategyManager + +## Events + +### NewStrategy + +```solidity +event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) +``` + +It is emitted when a new strategy is added. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | ---------------------------------------------------- | +| strategyId | uint256 | Id of the new strategy | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | +| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | +| selector | bytes4 | Function selector for the transaction to be executed | +| isMakerBid | bool | Whether the strategyId is for maker bid | +| implementation | address | Address of the implementation of the strategy | + +### StrategyUpdated + +```solidity +event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) +``` + +It is emitted when an existing strategy is updated. + +#### Parameters + +| Name | Type | Description | +| --------------------- | ------- | -------------------------------------------------------- | +| strategyId | uint256 | Id of the strategy | +| isActive | bool | Whether the strategy is active (or not) after the update | +| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | +| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | + +## Errors + +### NotV2Strategy + +```solidity +error NotV2Strategy() +``` + +If the strategy has not set properly its implementation contract. + +_It can only be returned for owner operations._ + +### StrategyHasNoSelector + +```solidity +error StrategyHasNoSelector() +``` + +It is returned if the strategy has no selector. + +_It can only be returned for owner operations._ + +### StrategyNotUsed + +```solidity +error StrategyNotUsed() +``` + +It is returned if the strategyId is invalid. + +### StrategyProtocolFeeTooHigh + +```solidity +error StrategyProtocolFeeTooHigh() +``` + +It is returned if the strategy's protocol fee is too high. + +_It can only be returned for owner operations._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md new file mode 100644 index 00000000..3ba8ca81 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md @@ -0,0 +1,111 @@ +# ITransferManager + +_LooksRare protocol team (👀,💎)_ + +> ITransferManager + +## Events + +### ApprovalsGranted + +```solidity +event ApprovalsGranted(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are granted by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### ApprovalsRemoved + +```solidity +event ApprovalsRemoved(address user, address[] operators) +``` + +It is emitted if operators' approvals to transfer NFTs are revoked by a user. + +#### Parameters + +| Name | Type | Description | +| --------- | --------- | --------------------------- | +| user | address | Address of the user | +| operators | address[] | Array of operator addresses | + +### OperatorAllowed + +```solidity +event OperatorAllowed(address operator) +``` + +It is emitted if a new operator is added to the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +### OperatorRemoved + +```solidity +event OperatorRemoved(address operator) +``` + +It is emitted if an operator is removed from the global allowlist. + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ---------------- | +| operator | address | Operator address | + +## Errors + +### OperatorAlreadyAllowed + +```solidity +error OperatorAlreadyAllowed() +``` + +It is returned if the transfer caller is already allowed by the owner. + +_This error can only be returned for owner operations._ + +### OperatorAlreadyApprovedByUser + +```solidity +error OperatorAlreadyApprovedByUser() +``` + +It is returned if the operator to approve has already been approved by the user. + +### OperatorNotAllowed + +```solidity +error OperatorNotAllowed() +``` + +It is returned if the operator to approve is not in the global allowlist defined by the owner. + +_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ + +### OperatorNotApprovedByUser + +```solidity +error OperatorNotApprovedByUser() +``` + +It is returned if the operator to revoke has not been previously approved by the user. + +### TransferCallerInvalid + +```solidity +error TransferCallerInvalid() +``` + +It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md new file mode 100644 index 00000000..1b1f41a2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md @@ -0,0 +1,7 @@ +# CurrencyValidator + +_LooksRare protocol team (👀,💎)_ + +> CurrencyValidator + +This library validates the order currency to be the chain's native currency or the specified ERC20 token. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md new file mode 100644 index 00000000..5951cc56 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md @@ -0,0 +1,21 @@ +# LowLevelHypercertCaller + +_bitbeckers_ + +> LowLevelHypercertCaller + +This contract contains low-level calls to transfer ERC1155 tokens. + +## Errors + +### HypercertSplitFractionError + +```solidity +error HypercertSplitFractionError() +``` + +### NotAContract + +```solidity +error NotAContract() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md new file mode 100644 index 00000000..943a54cd --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md @@ -0,0 +1,7 @@ +# MerkleProofCalldataWithNodes + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofCalldataWithNodes + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md new file mode 100644 index 00000000..37529181 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md @@ -0,0 +1,7 @@ +# MerkleProofMemory + +_OpenZeppelin (adjusted by LooksRare)_ + +> MerkleProofMemory + +This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md new file mode 100644 index 00000000..6ffa83e2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md @@ -0,0 +1,7 @@ +# OrderStructs + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> OrderStructs + +This library contains all order struct types for the LooksRare protocol (v2). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md new file mode 100644 index 00000000..4684053c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md @@ -0,0 +1,84 @@ +# AllowlistMinter + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +## Events + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +## Errors + +### DoesNotExist + +```solidity +error DoesNotExist() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md new file mode 100644 index 00000000..518efa42 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md @@ -0,0 +1,895 @@ +# HypercertMinter + +_bitbeckers_ + +> Contract for managing hypercert claims and whitelists + +Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. + +_Wrapper contract to expose and chain functions._ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### batchBurnFraction + +```solidity +function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenIDs | uint256[] | undefined | + +### batchMintClaimsFromAllowlists + +```solidity +function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable +``` + +Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` + +_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| -------- | ----------- | ----------- | +| account | address | undefined | +| proofs | bytes32[][] | undefined | +| claimIDs | uint256[] | undefined | +| units | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256) external nonpayable +``` + +Burn a claimtoken; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| \_2 | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable +``` + +Batch burn claimtokens; override is needed to update units/values + +_see {ERC1155Burnable}_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| \_2 | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address _account, uint256 _tokenID) external nonpayable +``` + +Burn a claimtoken + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| --------- | ------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | + +### createAllowlist + +```solidity +function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Register a claim and the whitelist for minting token(s) belonging to that claim + +_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| merkleRoot | bytes32 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### hasBeenClaimed + +```solidity +function hasBeenClaimed(uint256, bytes32) external view returns (bool) +``` + +#### Parameters + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | +| \_1 | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### initialize + +```solidity +function initialize() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable +``` + +Merge the value of tokens belonging to the same claim + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------- | --------- | ----------- | +| \_account | address | undefined | +| \_fractionIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint a semi-fungible token for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimFromAllowlist + +```solidity +function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable +``` + +Mint a semi-fungible token representing a fraction of the claim + +_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| proof | bytes32[] | undefined | +| claimID | uint256 | undefined | +| units | uint256 | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +Mint semi-fungible tokens for the impact claim referenced via `uri` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| \_uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### name + +```solidity +function name() external view returns (string) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### pause + +```solidity +function pause() external nonpayable +``` + +PAUSABLE + +### paused + +```solidity +function paused() external view returns (bool) +``` + +_Returns true if the contract is paused, and false otherwise._ + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### readTransferRestriction + +```solidity +function readTransferRestriction(uint256 tokenID) external view returns (string) +``` + +TRANSFER RESTRICTIONS + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------ | ----------- | +| \_0 | string | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### splitFraction + +```solidity +function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable +``` + +Split a claimtokens value into parts with summed value equal to the original + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| -------------- | --------- | ----------- | +| \_account | address | undefined | +| \_tokenID | uint256 | undefined | +| \_newFractions | uint256[] | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_see {IHypercertToken}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unpause + +```solidity +function unpause() external nonpayable +``` + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_see { IHypercertMetadata}_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | ----------- | +| \_uri | string | undefined | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### AllowlistCreated + +```solidity +event AllowlistCreated(uint256 tokenID, bytes32 root) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| root | bytes32 | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### LeafClaimed + +```solidity +event LeafClaimed(uint256 tokenID, bytes32 leaf) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### Paused + +```solidity +event Paused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Unpaused + +```solidity +event Unpaused(address account) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md new file mode 100644 index 00000000..a4086e37 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md @@ -0,0 +1,457 @@ +# SemiFungible1155 + +_bitbeckers_ + +> Contract for minting semi-fungible EIP1155 tokens + +Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` + +_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ + +## Methods + +### \_\_SemiFungible1155_init + +```solidity +function __SemiFungible1155_init() external nonpayable +``` + +_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ + +### balanceOf + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256) +``` + +_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### balanceOfBatch + +```solidity +function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) +``` + +_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| accounts | address[] | undefined | +| ids | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | --------- | ----------- | +| \_0 | uint256[] | undefined | + +### burn + +```solidity +function burn(address account, uint256 id, uint256 value) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### burnBatch + +```solidity +function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| account | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### isApprovedForAll + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool) +``` + +_See {IERC1155-isApprovedForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| account | address | undefined | +| operator | address | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### ownerOf + +```solidity +function ownerOf(uint256 tokenID) external view returns (address _owner) +``` + +_Returns the owner of a given token ID._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------- | +| tokenID | uint256 | The ID of the token to query. | + +#### Returns + +| Name | Type | Description | +| ------- | ------- | -------------------------------------- | +| \_owner | address | The address of the owner of the token. | + +### proxiableUUID + +```solidity +function proxiableUUID() external view returns (bytes32) +``` + +_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | bytes32 | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ + +### safeBatchTransferFrom + +```solidity +function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable +``` + +_See {IERC1155-safeBatchTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| ids | uint256[] | undefined | +| amounts | uint256[] | undefined | +| data | bytes | undefined | + +### safeTransferFrom + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable +``` + +_See {IERC1155-safeTransferFrom}._ + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | ----------- | +| from | address | undefined | +| to | address | undefined | +| id | uint256 | undefined | +| amount | uint256 | undefined | +| data | bytes | undefined | + +### setApprovalForAll + +```solidity +function setApprovalForAll(address operator, bool approved) external nonpayable +``` + +_See {IERC1155-setApprovalForAll}._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| operator | address | undefined | +| approved | bool | undefined | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + +_See {IERC165-supportsInterface}._ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------ | ----------- | +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ----------- | +| \_0 | bool | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### upgradeTo + +```solidity +function upgradeTo(address newImplementation) external nonpayable +``` + +_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | + +### upgradeToAndCall + +```solidity +function upgradeToAndCall(address newImplementation, bytes data) external payable +``` + +_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| newImplementation | address | undefined | +| data | bytes | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string _uri) +``` + +_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------------------------------------------------- | +| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | + +#### Returns + +| Name | Type | Description | +| ----- | ------ | -------------------------------------------- | +| \_uri | string | The metadata URI for the specified token ID. | + +## Events + +### AdminChanged + +```solidity +event AdminChanged(address previousAdmin, address newAdmin) +``` + +#### Parameters + +| Name | Type | Description | +| ------------- | ------- | ----------- | +| previousAdmin | address | undefined | +| newAdmin | address | undefined | + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| account `indexed` | address | undefined | +| operator `indexed` | address | undefined | +| approved | bool | undefined | + +### BatchValueTransfer + +```solidity +event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) +``` + +_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ + +#### Parameters + +| Name | Type | Description | +| ------------ | --------- | ----------- | +| claimIDs | uint256[] | undefined | +| fromTokenIDs | uint256[] | undefined | +| toTokenIDs | uint256[] | undefined | +| values | uint256[] | undefined | + +### BeaconUpgraded + +```solidity +event BeaconUpgraded(address indexed beacon) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| beacon `indexed` | address | undefined | + +### Initialized + +```solidity +event Initialized(uint8 version) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ----- | ----------- | +| version | uint8 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### TransferBatch + +```solidity +event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| ids | uint256[] | undefined | +| values | uint256[] | undefined | + +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ----------- | +| operator `indexed` | address | undefined | +| from `indexed` | address | undefined | +| to `indexed` | address | undefined | +| id | uint256 | undefined | +| value | uint256 | undefined | + +### URI + +```solidity +event URI(string value, uint256 indexed id) +``` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | ----------- | +| value | string | undefined | +| id `indexed` | uint256 | undefined | + +### Upgraded + +```solidity +event Upgraded(address indexed implementation) +``` + +#### Parameters + +| Name | Type | Description | +| ------------------------ | ------- | ----------- | +| implementation `indexed` | address | undefined | + +### ValueTransfer + +```solidity +event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) +``` + +_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ + +#### Parameters + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| claimID | uint256 | undefined | +| fromTokenID | uint256 | undefined | +| toTokenID | uint256 | undefined | +| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md new file mode 100644 index 00000000..72455b43 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md @@ -0,0 +1,29 @@ +# IAllowlist + +_bitbeckers_ + +> Interface for allowlist + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### isAllowedToClaim + +```solidity +function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | --------- | ----------- | +| proof | bytes32[] | undefined | +| tokenID | uint256 | undefined | +| leaf | bytes32 | undefined | + +#### Returns + +| Name | Type | Description | +| --------- | ---- | ----------- | +| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md new file mode 100644 index 00000000..30ed6f95 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md @@ -0,0 +1,192 @@ +# IHypercertToken + +_bitbeckers_ + +> Interface for hypercert token interactions + +This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) + +## Methods + +### batchBurnFraction + +```solidity +function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable +``` + +Operator must be allowed by `creator` and the tokens must represent the total amount of available units. + +_Function to burn the tokens at `tokenIDs` for `account`_ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### burnFraction + +```solidity +function burnFraction(address account, uint256 tokenID) external nonpayable +``` + +Operator must be allowed by `creator` and the token must represent the total amount of available units. + +_Function to burn the token at `tokenID` for `account`_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +### mergeFractions + +```solidity +function mergeFractions(address account, uint256[] tokenIDs) external nonpayable +``` + +Tokens that have been merged are burned. + +_Function called to merge tokens within `tokenIDs`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenIDs | uint256[] | undefined | + +### mintClaim + +```solidity +function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### mintClaimWithFractions + +```solidity +function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable +``` + +_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ + +#### Parameters + +| Name | Type | Description | +| ------------ | ----------------------------------------- | ----------- | +| account | address | undefined | +| units | uint256 | undefined | +| fractions | uint256[] | undefined | +| uri | string | undefined | +| restrictions | enum IHypercertToken.TransferRestrictions | undefined | + +### splitFraction + +```solidity +function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable +``` + +The sum of `values` must equal the current value of `_tokenID`. + +_Function called to split `tokenID` owned by `account` into units declared in `values`._ + +#### Parameters + +| Name | Type | Description | +| -------- | --------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | +| \_values | uint256[] | undefined | + +### unitsOf + +```solidity +function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| account | address | undefined | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### unitsOf + +```solidity +function unitsOf(uint256 tokenID) external view returns (uint256 units) +``` + +_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----- | ------- | ----------- | +| units | uint256 | undefined | + +### uri + +```solidity +function uri(uint256 tokenID) external view returns (string metadata) +``` + +_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| tokenID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| -------- | ------ | ----------- | +| metadata | string | undefined | + +## Events + +### ClaimStored + +```solidity +event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) +``` + +_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | ----------- | +| claimID `indexed` | uint256 | undefined | +| uri | string | undefined | +| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md new file mode 100644 index 00000000..93fe0124 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md @@ -0,0 +1,59 @@ +# Errors + +_bitbeckers_ + +## Errors + +### AlreadyClaimed + +```solidity +error AlreadyClaimed() +``` + +### ArraySize + +```solidity +error ArraySize() +``` + +### DoesNotExist + +```solidity +error DoesNotExist() +``` + +### DuplicateEntry + +```solidity +error DuplicateEntry() +``` + +### Invalid + +```solidity +error Invalid() +``` + +### NotAllowed + +```solidity +error NotAllowed() +``` + +### NotApprovedOrOwner + +```solidity +error NotApprovedOrOwner() +``` + +### TransfersNotAllowed + +```solidity +error TransfersNotAllowed() +``` + +### TypeMismatch + +```solidity +error TypeMismatch() +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll new file mode 100644 index 00000000..e2ac6616 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md new file mode 100644 index 00000000..b1434ab0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md @@ -0,0 +1,185 @@ +Hypercerts SDK Documentation / [Exports](modules.md) + +# Hypercert SDK + +## Quickstart Guide + +1. Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +``` + +or + +```bash + yarn add @hypercerts-org/sdk +``` + +2. Import the SDK into your project: + +```bash +import { HypercertClient } from "@hypercerts-org/sdk"; +``` + +3. Create a new instance of the HypercertClient class with your configuration options: + +```js +const client = new HypercertClient({ + chainId: 5, + provider, + signer, + nftStorageToken, + web3StorageToken, +}); +``` + +> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in +> [read-only mode](#read-only-mode) + +4. Use the client object to interact with the Hypercert network. + +For example, you can use the `client.mintClaim` method to create a new claim: + +```js +const tx = await client.mintClaim( + metaData, + totalUnits, + transferRestriction, + overrides, +); +``` + +This will validate the metadata, store it on IPFS, create a new hypercert on-chain and return a transaction receipt. + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more information on how to use the SDK, check out the +[developer documentation](https://hypercerts.org/docs/developer/) and the +[Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. Don't forget to set your +environment variables for your NFT.storage and web3.storage API keys in your .env file. + +## Config + +The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check +the environment variables. + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without a signer or provider. +- The client was initialized with a provider but not a signer. +- The client was initialized with a signer but not a provider. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a +warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief +explanation of each constant: + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphName": "hypercerts-testnet" + } +} +``` + +### Client config properties + +| \| Property | Type | Description | +| ------------------ | -------------------- | -------------------------------------- | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | +| `graphName` | `string` | The name of the Gsubgraph to use. | +| `provider` | `providers.Provider` | A custom provider to use. | +| `signer` | `Signer` | A custom signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +### Environment variables + +To determine the missing configuration values the SDK defaults to the following environment variables: + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +## Client modules + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and +NFT.storage. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the storage, indexer, and contract getters, the HypercertClient allows +developers to easily interact with the various components of the Hypercert system. For example, a developer could use +the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based +on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the +contract. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md new file mode 100644 index 00000000..89f2105f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError + +# Class: ClientError + +An error that is caused by a problem with the client. + +## Hierarchy + +- `Error` + + ↳ **`ClientError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ClientError.md#constructor) + +### Properties + +- [payload](ClientError.md#payload) + +## Constructors + +### constructor + +• **new ClientError**(`message`, `payload?`) + +Creates a new instance of the ClientError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md new file mode 100644 index 00000000..03813867 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md @@ -0,0 +1,66 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError + +# Class: ConfigurationError + +The configuration was invalid + +## Hierarchy + +- `Error` + + ↳ **`ConfigurationError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](ConfigurationError.md#constructor) + +### Properties + +- [payload](ConfigurationError.md#payload) + +## Constructors + +### constructor + +• **new ConfigurationError**(`message`, `payload?`) + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `message` | `string` | +| `payload?` | `Object` | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md new file mode 100644 index 00000000..d4c9f7c9 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError + +# Class: FetchError + +Fails fetching a remote resource + +## Hierarchy + +- `Error` + + ↳ **`FetchError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](FetchError.md#constructor) + +### Properties + +- [payload](FetchError.md#payload) + +## Constructors + +### constructor + +• **new FetchError**(`message`, `payload?`) + +Creates a new instance of the FetchError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md new file mode 100644 index 00000000..a5a0e900 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md @@ -0,0 +1,493 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient + +# Class: HypercertClient + +Hypercerts client factory + +**`Dev`** + +Creates a Hypercerts client instance + +**`Notice`** + +The client is readonly if no signer is set or if the contract address is not set + +**`Param`** + +Hypercerts client configuration + +**`Param`** + +Hypercerts storage object + +## Implements + +- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertClient.md#constructor) + +### Properties + +- [\_config](HypercertClient.md#_config) +- [\_contract](HypercertClient.md#_contract) +- [\_evaluator](HypercertClient.md#_evaluator) +- [\_indexer](HypercertClient.md#_indexer) +- [\_operator](HypercertClient.md#_operator) +- [\_storage](HypercertClient.md#_storage) +- [readonly](HypercertClient.md#readonly) + +### Accessors + +- [contract](HypercertClient.md#contract) +- [indexer](HypercertClient.md#indexer) +- [storage](HypercertClient.md#storage) + +### Methods + +- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClient.md#burnclaimfraction) +- [checkWritable](HypercertClient.md#checkwritable) +- [createAllowlist](HypercertClient.md#createallowlist) +- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) +- [mintClaim](HypercertClient.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClient.md#splitclaimunits) + +## Constructors + +### constructor + +• **new HypercertClient**(`config?`) + +Creates a new instance of the `HypercertClient` class. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | + +#### Defined in + +[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) + +## Properties + +### \_config + +• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) + +#### Defined in + +[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) + +--- + +### \_contract + +• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +#### Defined in + +[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) + +--- + +### \_evaluator + +• `Private` **\_evaluator**: [`default`](internal.default.md) + +#### Defined in + +[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) + +--- + +### \_indexer + +• `Private` **\_indexer**: [`default`](internal.default-1.md) + +#### Defined in + +[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) + +--- + +### \_operator + +• `Private` **\_operator**: `Provider` \| `Signer` + +#### Defined in + +[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) + +--- + +### \_storage + +• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) + +#### Defined in + +[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) + +## Accessors + +### contract + +• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +Gets the HypercertMinter contract used by the client. + +#### Returns + +[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) + +The contract. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) + +#### Defined in + +[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) + +--- + +### indexer + +• `get` **indexer**(): [`default`](internal.default-1.md) + +Gets the indexer for the client. + +#### Returns + +[`default`](internal.default-1.md) + +The indexer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) + +#### Defined in + +[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) + +--- + +### storage + +• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) + +Gets the storage layer for the client. + +#### Returns + +[`HypercertsStorage`](HypercertsStorage.md) + +The storage layer. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) + +#### Defined in + +[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) + +## Methods + +### batchMintClaimFractionsFromAllowlists + +▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | +| `roots?` | `BytesLike`[] | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Implementation of + +HypercertClientInterface.batchMintClaimFractionsFromAllowlists + +#### Defined in + +[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) + +--- + +### burnClaimFraction + +▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> + +Burn a Hypercert claim by providing the claim id + +**`Dev`** + +Burns a Hypercert claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :----------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.burnClaimFraction + +#### Defined in + +[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) + +--- + +### checkWritable + +▸ `Private` **checkWritable**(): `boolean` + +#### Returns + +`boolean` + +#### Defined in + +[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) + +--- + +### createAllowlist + +▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Create a Hypercert claim with an allowlist + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist + +**`Notice`** + +The total number of units in the allowlist must match the total number of units for the Hypercert + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.createAllowlist + +#### Defined in + +[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) + +--- + +### mergeClaimUnits + +▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> + +Merge multiple Hypercert claims fractions into one + +**`Dev`** + +Merges multiple Hypercert claims into one + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :------------------ | +| `claimIds` | `BigNumberish`[] | Hypercert claim ids | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mergeClaimUnits + +#### Defined in + +[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) + +--- + +### mintClaim + +▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim + +**`Dev`** + +Mints a Hypercert claim with the given metadata, total units and transfer restrictions + +#### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | +| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | +| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaim + +#### Defined in + +[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) + +--- + +### mintClaimFractionFromAllowlist + +▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> + +Mint a Hypercert claim fraction from an allowlist. + +**`Dev`** + +Verifies the claim proof and mints the claim fraction + +**`Notice`** + +If known, provide the root for client side verification + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------- | :------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `units` | `BigNumberish` | Number of units to mint | +| `proof` | `BytesLike`[] | Merkle proof for the claim | +| `root?` | `BytesLike` | - | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.mintClaimFractionFromAllowlist + +#### Defined in + +[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) + +--- + +### splitClaimUnits + +▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> + +Split a Hypercert's unit into multiple claims with the given fractions + +**`Dev`** + +Submit the ID of the claim to split and new fraction values. + +**`Notice`** + +The sum of the fractions must be equal to the total units of the claim + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------- | :---------------------------------------- | +| `claimId` | `BigNumberish` | Hypercert claim id | +| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | +| `overrides?` | `Overrides` | - | + +#### Returns + +`Promise`<`ContractTransaction`\> + +Contract transaction + +#### Implementation of + +HypercertClientInterface.splitClaimUnits + +#### Defined in + +[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md new file mode 100644 index 00000000..706c14fe --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md @@ -0,0 +1,250 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage + +# Class: HypercertsStorage + +A class that provides storage functionality for Hypercerts. + +## Implements + +- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) + +## Table of contents + +### Constructors + +- [constructor](HypercertsStorage.md#constructor) + +### Properties + +- [nftStorageClient](HypercertsStorage.md#nftstorageclient) +- [readonly](HypercertsStorage.md#readonly) +- [web3StorageClient](HypercertsStorage.md#web3storageclient) + +### Methods + +- [getData](HypercertsStorage.md#getdata) +- [getMetadata](HypercertsStorage.md#getmetadata) +- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) +- [storeData](HypercertsStorage.md#storedata) +- [storeMetadata](HypercertsStorage.md#storemetadata) + +## Constructors + +### constructor + +• **new HypercertsStorage**(`overrides`) + +Creates a new instance of the `HypercertsStorage` class. + +#### Parameters + +| Name | Type | Description | +| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | +| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | + +#### Defined in + +[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) + +## Properties + +### nftStorageClient + +• `Optional` **nftStorageClient**: `NFTStorage` + +The NFT storage client. + +#### Defined in + +[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +Whether the storage is read-only. + +#### Defined in + +[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) + +--- + +### web3StorageClient + +• `Optional` **web3StorageClient**: `any` + +The Web3 storage client. + +#### Defined in + +[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) + +## Methods + +### getData + +▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> + +Gets arbitrary data from Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the data cannot be retrieved. + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :-------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | + +#### Returns + +`Promise`<`any`\> + +A Promise that resolves to the data. + +#### Implementation of + +HypercertStorageInterface.getData + +#### Defined in + +[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) + +--- + +### getMetadata + +▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +Gets metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. E.g. unknown schema + +#### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------ | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | + +#### Returns + +`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> + +A Promise that resolves to the metadata. + +#### Implementation of + +HypercertStorageInterface.getMetadata + +#### Defined in + +[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) + +--- + +### getNftStorageGatewayUri + +▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` + +#### Parameters + +| Name | Type | +| :------------- | :------- | +| `cidOrIpfsUri` | `string` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) + +--- + +### storeData + +▸ **storeData**(`data`): `Promise`<`CIDString`\> + +Stores arbitrary data in Web3 storage. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Notice`** + +Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Implementation of + +HypercertStorageInterface.storeData + +#### Defined in + +[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) + +--- + +### storeMetadata + +▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> + +Stores metadata for a Hypercert. + +**`Throws`** + +A `StorageError` if the storage client is not configured. + +**`Throws`** + +A `MalformedDataError` if the metadata is invalid. + +**`Notice`** + +Because we pay for storage quotas, this data is stored best effort. +If you are using our default keys, we may delete older data if we hit our storage quota. + +#### Parameters + +| Name | Type | Description | +| :----- | :-------------------------------------------------------- | :--------------------- | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | + +#### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Implementation of + +HypercertStorageInterface.storeMetadata + +#### Defined in + +[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md new file mode 100644 index 00000000..d12c0653 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError + +# Class: InvalidOrMissingError + +The provided value was undefined or empty + +## Hierarchy + +- `Error` + + ↳ **`InvalidOrMissingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](InvalidOrMissingError.md#constructor) + +### Properties + +- [payload](InvalidOrMissingError.md#payload) + +## Constructors + +### constructor + +• **new InvalidOrMissingError**(`message`, `payload?`) + +Creates a new instance of the InvalidOrMissingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md new file mode 100644 index 00000000..028129d8 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError + +# Class: MalformedDataError + +Data doesn't conform to expectations + +## Hierarchy + +- `Error` + + ↳ **`MalformedDataError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MalformedDataError.md#constructor) + +### Properties + +- [payload](MalformedDataError.md#payload) + +## Constructors + +### constructor + +• **new MalformedDataError**(`message`, `payload?`) + +Creates a new instance of the MalformedDataError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md new file mode 100644 index 00000000..de284494 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError + +# Class: MintingError + +Minting transaction failed + +## Hierarchy + +- `Error` + + ↳ **`MintingError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](MintingError.md#constructor) + +### Properties + +- [payload](MintingError.md#payload) + +## Constructors + +### constructor + +• **new MintingError**(`message`, `payload?`) + +Creates a new instance of the MintingError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md new file mode 100644 index 00000000..0dcf0291 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError + +# Class: StorageError + +Fails storing to a remote resource + +## Hierarchy + +- `Error` + + ↳ **`StorageError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](StorageError.md#constructor) + +### Properties + +- [payload](StorageError.md#payload) + +## Constructors + +### constructor + +• **new StorageError**(`message`, `payload?`) + +Creates a new instance of the StorageError class. + +#### Parameters + +| Name | Type | Description | +| :--------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md new file mode 100644 index 00000000..5fdb25e0 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md @@ -0,0 +1,71 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError + +# Class: UnknownSchemaError + +Schema could not be loaded + +## Hierarchy + +- `Error` + + ↳ **`UnknownSchemaError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnknownSchemaError.md#constructor) + +### Properties + +- [payload](UnknownSchemaError.md#payload) + +## Constructors + +### constructor + +• **new UnknownSchemaError**(`message`, `payload?`) + +Creates a new instance of the UnknownSchemaError class. + +#### Parameters + +| Name | Type | Description | +| :------------------- | :------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.schemaName` | `string` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :----------- | :------- | +| `schemaName` | `string` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md new file mode 100644 index 00000000..0964b138 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md @@ -0,0 +1,72 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError + +# Class: UnsupportedChainError + +This blockchain is not yet supported +Please file an issue + +## Hierarchy + +- `Error` + + ↳ **`UnsupportedChainError`** + +## Implements + +- [`CustomError`](../interfaces/CustomError.md) + +## Table of contents + +### Constructors + +- [constructor](UnsupportedChainError.md#constructor) + +### Properties + +- [payload](UnsupportedChainError.md#payload) + +## Constructors + +### constructor + +• **new UnsupportedChainError**(`message`, `payload?`) + +Creates a new instance of the UnsupportedChainError class. + +#### Parameters + +| Name | Type | Description | +| :---------------- | :---------------------------------- | :------------------------ | +| `message` | `string` | The error message. | +| `payload?` | `Object` | Additional error payload. | +| `payload.chainID` | `undefined` \| `string` \| `number` | - | + +#### Overrides + +Error.constructor + +#### Defined in + +[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Type declaration + +| Name | Type | +| :-------- | :---------------------------------- | +| `chainID` | `undefined` \| `string` \| `number` | + +#### Implementation of + +[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) + +#### Defined in + +[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md new file mode 100644 index 00000000..1b94a629 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md @@ -0,0 +1,278 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +A class that provides indexing functionality for Hypercerts. + +## Implements + +- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default-1.md#constructor) + +### Properties + +- [\_graphClient](internal.default-1.md#_graphclient) + +### Accessors + +- [graphClient](internal.default-1.md#graphclient) + +### Methods + +- [claimById](internal.default-1.md#claimbyid) +- [claimsByOwner](internal.default-1.md#claimsbyowner) +- [firstClaims](internal.default-1.md#firstclaims) +- [fractionById](internal.default-1.md#fractionbyid) +- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) +- [fractionsByOwner](internal.default-1.md#fractionsbyowner) + +## Constructors + +### constructor + +• **new default**(`options`) + +Creates a new instance of the `HypercertIndexer` class. + +#### Parameters + +| Name | Type | Description | +| :------------------ | :------- | :----------------------------------------- | +| `options` | `Object` | The configuration options for the indexer. | +| `options.graphUrl?` | `string` | - | + +#### Defined in + +[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) + +## Properties + +### \_graphClient + +• `Private` **\_graphClient**: `Object` + +The Graph client used by the indexer. + +#### Type declaration + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Defined in + +[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) + +## Accessors + +### graphClient + +• `get` **graphClient**(): `Object` + +Gets the Graph client used by the indexer. + +#### Returns + +`Object` + +The Graph client. + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | +| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | +| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | +| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | +| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | +| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | + +#### Implementation of + +[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) + +#### Defined in + +[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) + +## Methods + +### claimById + +▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +Gets a claim by its ID. + +#### Parameters + +| Name | Type | Description | +| :--- | :------- | :------------------- | +| `id` | `string` | The ID of the claim. | + +#### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +A Promise that resolves to the claim. + +#### Implementation of + +HypercertIndexerInterface.claimById + +#### Defined in + +[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) + +--- + +### claimsByOwner + +▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +Gets the claims owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.claimsByOwner + +#### Defined in + +[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) + +--- + +### firstClaims + +▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +Gets the most recent claims. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :-------------------- | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +A Promise that resolves to the claims. + +#### Implementation of + +HypercertIndexerInterface.firstClaims + +#### Defined in + +[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) + +--- + +### fractionById + +▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +Gets a claim token by its ID. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------- | :------------------------- | +| `fractionId` | `string` | The ID of the claim token. | + +#### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +A Promise that resolves to the claim token. + +#### Implementation of + +HypercertIndexerInterface.fractionById + +#### Defined in + +[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) + +--- + +### fractionsByClaim + +▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +Gets the claim tokens for a given claim. + +#### Parameters + +| Name | Type | Default value | Description | +| :-------- | :----------------------------------------- | :------------------- | :-------------------- | +| `claimId` | `string` | `undefined` | The ID of the claim. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByClaim + +#### Defined in + +[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) + +--- + +### fractionsByOwner + +▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +Gets the claim tokens owned by a given address. + +#### Parameters + +| Name | Type | Default value | Description | +| :------- | :----------------------------------------- | :------------------- | :------------------------ | +| `owner` | `string` | `undefined` | The address of the owner. | +| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | + +#### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +A Promise that resolves to the claim tokens. + +#### Implementation of + +HypercertIndexerInterface.fractionsByOwner + +#### Defined in + +[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md new file mode 100644 index 00000000..1538ce61 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md @@ -0,0 +1,131 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +The EasEvaluator class provides methods for signing off-chain attestations of evaluations. +Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. + +## Table of contents + +### Constructors + +- [constructor](internal.default-2.md#constructor) + +### Properties + +- [offChain](internal.default-2.md#offchain) +- [readonly](internal.default-2.md#readonly) +- [signer](internal.default-2.md#signer) + +### Methods + +- [getSignature](internal.default-2.md#getsignature) +- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) + +## Constructors + +### constructor + +• **new default**(`config`) + +Creates a new EasEvaluator instance. + +#### Parameters + +| Name | Type | Description | +| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | + +#### Defined in + +[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) + +## Properties + +### offChain + +• **offChain**: `Offchain` + +The Offchain instance used for signing off-chain attestations. + +#### Defined in + +[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +The TypedDataSigner instance used for signing typed data. + +#### Defined in + +[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) + +## Methods + +### getSignature + +▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> + +Gets a signature for an off-chain attestation. + +#### Parameters + +| Name | Type | Description | +| :------------ | :------- | :------------------------------------------------ | +| `encodedData` | `string` | The encoded data to sign. | +| `recipient` | `string` | The address of the recipient of the attestation. | +| `schemaUid` | `string` | The UID of the schema to use for the attestation. | + +#### Returns + +`Promise`<`SignedOffchainAttestation`\> + +- The signature for the attestation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) + +--- + +### signOfflineEvaluation + +▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> + +Signs an offline evaluation. + +**`Throws`** + +- If the evaluation data is malformed. + +#### Parameters + +| Name | Type | Description | +| :----------- | :----------------------------------------------- | :--------------------------- | +| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | + +#### Returns + +`Promise`<`undefined` \| `SignedOffchainAttestation`\> + +- The signature for the evaluation. + +#### Defined in + +[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md new file mode 100644 index 00000000..86daa5e4 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md @@ -0,0 +1,110 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default + +# Class: default + +[internal](../modules/internal.md).default + +## Implements + +- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) + +## Table of contents + +### Constructors + +- [constructor](internal.default.md#constructor) + +### Properties + +- [eas](internal.default.md#eas) +- [readonly](internal.default.md#readonly) +- [signer](internal.default.md#signer) +- [storage](internal.default.md#storage) + +### Methods + +- [submitEvaluation](internal.default.md#submitevaluation) + +## Constructors + +### constructor + +• **new default**(`config?`) + +#### Parameters + +| Name | Type | +| :------- | :------------------------------------------------------------------------- | +| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | + +#### Defined in + +[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) + +## Properties + +### eas + +• **eas**: [`default`](internal.default-2.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) + +--- + +### readonly + +• **readonly**: `boolean` = `true` + +#### Defined in + +[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) + +--- + +### signer + +• `Optional` **signer**: `Signer` & `TypedDataSigner` + +#### Defined in + +[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) + +--- + +### storage + +• **storage**: [`HypercertsStorage`](HypercertsStorage.md) + +#### Defined in + +[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) + +## Methods + +### submitEvaluation + +▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------------------------ | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | + +#### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Implementation of + +EvaluatorInterface.submitEvaluation + +#### Defined in + +[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md new file mode 100644 index 00000000..b4af6279 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md @@ -0,0 +1,39 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError + +# Interface: CustomError + +An interface for errors that have a specific type. + +## Implemented by + +- [`ClientError`](../classes/ClientError.md) +- [`ConfigurationError`](../classes/ConfigurationError.md) +- [`FetchError`](../classes/FetchError.md) +- [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) +- [`MalformedDataError`](../classes/MalformedDataError.md) +- [`MintingError`](../classes/MintingError.md) +- [`StorageError`](../classes/StorageError.md) +- [`UnknownSchemaError`](../classes/UnknownSchemaError.md) +- [`UnsupportedChainError`](../classes/UnsupportedChainError.md) + +## Table of contents + +### Properties + +- [payload](CustomError.md#payload) + +## Properties + +### payload + +• `Optional` **payload**: `Object` + +Additional error payload. + +#### Index signature + +▪ [key: `string`]: `unknown` + +#### Defined in + +[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md new file mode 100644 index 00000000..4606b46e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation + +# Interface: DuplicateEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) +- [explanation](DuplicateEvaluation.md#explanation) +- [realHypercert](DuplicateEvaluation.md#realhypercert) +- [type](DuplicateEvaluation.md#type) + +## Properties + +### duplicateHypercerts + +• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] + +#### Defined in + +[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) + +--- + +### explanation + +• **explanation**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) + +--- + +### realHypercert + +• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) + +--- + +### type + +• **type**: `"duplicate"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md new file mode 100644 index 00000000..205b7004 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md @@ -0,0 +1,56 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation + +# Interface: EASEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](EASEvaluation.md#chainid) +- [contract](EASEvaluation.md#contract) +- [type](EASEvaluation.md#type) +- [uid](EASEvaluation.md#uid) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) + +--- + +### type + +• **type**: `"EAS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) + +--- + +### uid + +• **uid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md new file mode 100644 index 00000000..3dcea656 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -0,0 +1,167 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](HypercertClaimdata.md#contributors) +- [impact_scope](HypercertClaimdata.md#impact_scope) +- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) +- [rights](HypercertClaimdata.md#rights) +- [work_scope](HypercertClaimdata.md#work_scope) +- [work_timeframe](HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md new file mode 100644 index 00000000..0483b520 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -0,0 +1,341 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface + +# Interface: HypercertClientInterface + +The interface for the Hypercert client. + +## Hierarchy + +- [`HypercertClientMethods`](HypercertClientMethods.md) + +- [`HypercertClientState`](HypercertClientState.md) + + ↳ **`HypercertClientInterface`** + +## Implemented by + +- [`HypercertClient`](../classes/HypercertClient.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) +- [contract](HypercertClientInterface.md#contract) +- [createAllowlist](HypercertClientInterface.md#createallowlist) +- [indexer](HypercertClientInterface.md#indexer) +- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) +- [mintClaim](HypercertClientInterface.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) +- [readonly](HypercertClientInterface.md#readonly) +- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) +- [storage](HypercertClientInterface.md#storage) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Inherited from + +[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md new file mode 100644 index 00000000..734ccbee --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -0,0 +1,239 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods + +# Interface: HypercertClientMethods + +The methods for the Hypercert client. + +## Hierarchy + +- **`HypercertClientMethods`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) +- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) +- [createAllowlist](HypercertClientMethods.md#createallowlist) +- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) +- [mintClaim](HypercertClientMethods.md#mintclaim) +- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) +- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) + +## Properties + +### batchMintClaimFractionsFromAllowlists + +• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> + +Batch mints a claim fraction from an allowlist + +**`Note`** + +The length of the arrays must be equal. + +**`Note`** + +The order of the arrays must be equal. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :---------------------------------------------------- | +| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | +| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | +| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) + +--- + +### burnClaimFraction + +• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`): `Promise`<`ContractTransaction`\> + +Burns a claim fraction. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) + +--- + +### createAllowlist + +• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Creates a new allowlist and mints a new claim with the allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) + +--- + +### mergeClaimUnits + +• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimIds`): `Promise`<`ContractTransaction`\> + +Merges multiple claim fractions into a single claim. + +##### Parameters + +| Name | Type | Description | +| :--------- | :--------------- | :--------------------------------------- | +| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) + +--- + +### mintClaim + +• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> + +Mints a new claim. + +##### Parameters + +| Name | Type | Description | +| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | +| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | +| `totalUnits` | `BigNumberish` | The total number of units for the claim. | +| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) + +--- + +### mintClaimFractionFromAllowlist + +• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> + +Mints a claim fraction from an allowlist. + +##### Parameters + +| Name | Type | Description | +| :-------- | :------------- | :------------------------------------------ | +| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | +| `units` | `BigNumberish` | The number of units for the fraction. | +| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) + +--- + +### splitClaimUnits + +• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> + +#### Type declaration + +▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> + +Splits a claim into multiple fractions. + +##### Parameters + +| Name | Type | Description | +| :---------- | :--------------- | :------------------------------------- | +| `claimId` | `BigNumberish` | The ID of the claim to split. | +| `fractions` | `BigNumberish`[] | The number of units for each fraction. | + +##### Returns + +`Promise`<`ContractTransaction`\> + +A Promise that resolves to the transaction receipt + +#### Defined in + +[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md new file mode 100644 index 00000000..2d90a599 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md @@ -0,0 +1,68 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState + +# Interface: HypercertClientState + +The state of the Hypercert client. + +## Hierarchy + +- **`HypercertClientState`** + + ↳ [`HypercertClientInterface`](HypercertClientInterface.md) + +## Table of contents + +### Properties + +- [contract](HypercertClientState.md#contract) +- [indexer](HypercertClientState.md#indexer) +- [readonly](HypercertClientState.md#readonly) +- [storage](HypercertClientState.md#storage) + +## Properties + +### contract + +• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) + +The contract used by the client. + +#### Defined in + +[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) + +--- + +### indexer + +• **indexer**: [`default`](../classes/internal.default-1.md) + +The indexer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) + +--- + +### readonly + +• **readonly**: `boolean` + +Whether the client is in read-only mode. + +#### Defined in + +[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) + +--- + +### storage + +• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) + +The storage layer used by the client. + +#### Defined in + +[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md new file mode 100644 index 00000000..6ebed93a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -0,0 +1,47 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema + +# Interface: HypercertEvaluationSchema + +Schema for evaluating Hypercerts across different sources and evaluation types + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [creator](HypercertEvaluationSchema.md#creator) +- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) +- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) + +## Properties + +### creator + +• **creator**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) + +--- + +### evaluationData + +• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) + +--- + +### evaluationSource + +• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md new file mode 100644 index 00000000..f18c409f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -0,0 +1,176 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface + +# Interface: HypercertIndexerInterface + +## Implemented by + +- [`default`](../classes/internal.default-1.md) + +## Table of contents + +### Properties + +- [claimById](HypercertIndexerInterface.md#claimbyid) +- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) +- [firstClaims](HypercertIndexerInterface.md#firstclaims) +- [fractionById](HypercertIndexerInterface.md#fractionbyid) +- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) +- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) +- [graphClient](HypercertIndexerInterface.md#graphclient) + +## Properties + +### claimById + +• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Type declaration + +▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +##### Parameters + +| Name | Type | +| :--- | :------- | +| `id` | `string` | + +##### Returns + +`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) + +--- + +### claimsByOwner + +• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) + +--- + +### firstClaims + +• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Type declaration + +▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) + +--- + +### fractionById + +• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Type declaration + +▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +##### Parameters + +| Name | Type | +| :----------- | :------- | +| `fractionId` | `string` | + +##### Returns + +`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) + +--- + +### fractionsByClaim + +• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Type declaration + +▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `claimId` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) + +--- + +### fractionsByOwner + +• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Type declaration + +▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------- | +| `owner` | `string` | +| `params?` | [`QueryParams`](../modules.md#queryparams) | + +##### Returns + +`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> + +#### Defined in + +[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) + +--- + +### graphClient + +• **graphClient**: `any` + +#### Defined in + +[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md new file mode 100644 index 00000000..d65362f3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md @@ -0,0 +1,123 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata + +# Interface: HypercertMetadata + +Claim data for hypercert. ERC1155 Metadata compliant + +## Table of contents + +### Properties + +- [allowList](HypercertMetadata.md#allowlist) +- [description](HypercertMetadata.md#description) +- [external_url](HypercertMetadata.md#external_url) +- [hypercert](HypercertMetadata.md#hypercert) +- [image](HypercertMetadata.md#image) +- [name](HypercertMetadata.md#name) +- [properties](HypercertMetadata.md#properties) +- [ref](HypercertMetadata.md#ref) +- [version](HypercertMetadata.md#version) + +## Properties + +### allowList + +• `Optional` **allowList**: `string` + +A CID pointer to the merke tree proof json on ipfs + +#### Defined in + +[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) + +--- + +### description + +• **description**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) + +--- + +### external_url + +• `Optional` **external_url**: `string` + +An url pointing to the external website of the project + +#### Defined in + +[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) + +--- + +### hypercert + +• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) + +#### Defined in + +[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) + +--- + +### image + +• **image**: `string` + +A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. + +#### Defined in + +[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) + +--- + +### name + +• **name**: `string` + +Identifies the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) + +--- + +### properties + +• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] + +#### Defined in + +[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) + +--- + +### ref + +• `Optional` **ref**: `string` + +Describes the asset to which this token represents + +#### Defined in + +[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) + +--- + +### version + +• `Optional` **version**: `string` + +The version of Hypercert schema used to describe this hypercert + +#### Defined in + +[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md new file mode 100644 index 00000000..773c41d3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer + +# Interface: HypercertPointer + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [chainId](HypercertPointer.md#chainid) +- [claimId](HypercertPointer.md#claimid) +- [contract](HypercertPointer.md#contract) + +## Properties + +### chainId + +• **chainId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) + +--- + +### claimId + +• **claimId**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) + +--- + +### contract + +• **contract**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md new file mode 100644 index 00000000..8ffda51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -0,0 +1,130 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface + +# Interface: HypercertStorageInterface + +The interface for the Hypercert storage layer. + +## Implemented by + +- [`HypercertsStorage`](../classes/HypercertsStorage.md) + +## Table of contents + +### Properties + +- [getData](HypercertStorageInterface.md#getdata) +- [getMetadata](HypercertStorageInterface.md#getmetadata) +- [storeData](HypercertStorageInterface.md#storedata) +- [storeMetadata](HypercertStorageInterface.md#storemetadata) + +## Properties + +### getData + +• **getData**: (`cidOrIpfsUri`: `string`) => `Promise`<`unknown`\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<`unknown`\> + +Retrieves arbitrary data from IPFS. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | + +##### Returns + +`Promise`<`unknown`\> + +A Promise that resolves to the retrieved data. + +#### Defined in + +[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) + +--- + +### getMetadata + +• **getMetadata**: (`cidOrIpfsUri`: `string`) => `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +#### Type declaration + +▸ (`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +Retrieves the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :------------- | :------- | :----------------------------------------------- | +| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | + +##### Returns + +`Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> + +A Promise that resolves to the retrieved metadata. + +#### Defined in + +[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) + +--- + +### storeData + +• **storeData**: (`data`: `unknown`) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`data`): `Promise`<`CIDString`\> + +Stores arbitrary data on IPFS. + +##### Parameters + +| Name | Type | Description | +| :----- | :-------- | :----------------- | +| `data` | `unknown` | The data to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored data. + +#### Defined in + +[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) + +--- + +### storeMetadata + +• **storeMetadata**: (`metadata`: [`HypercertMetadata`](HypercertMetadata.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`metadata`): `Promise`<`CIDString`\> + +Stores the metadata for a Hypercert evaluation. + +##### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------------ | :--------------------- | +| `metadata` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata to store. | + +##### Returns + +`Promise`<`CIDString`\> + +A Promise that resolves to the CID of the stored metadata. + +#### Defined in + +[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md new file mode 100644 index 00000000..5f5871f2 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -0,0 +1,34 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation + +# Interface: IPFSEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [cid](IPFSEvaluation.md#cid) +- [type](IPFSEvaluation.md#type) + +## Properties + +### cid + +• **cid**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) + +--- + +### type + +• **type**: `"IPFS"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md new file mode 100644 index 00000000..3e4b3b92 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -0,0 +1,45 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation + +# Interface: SimpleTextEvaluation + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [hypercert](SimpleTextEvaluation.md#hypercert) +- [text](SimpleTextEvaluation.md#text) +- [type](SimpleTextEvaluation.md#type) + +## Properties + +### hypercert + +• **hypercert**: [`HypercertPointer`](HypercertPointer.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) + +--- + +### text + +• **text**: `string` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) + +--- + +### type + +• **type**: `"simpleText"` + +#### Defined in + +[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md new file mode 100644 index 00000000..53ac36ed --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md @@ -0,0 +1,43 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface + +# Interface: EvaluatorInterface + +[internal](../modules/internal.md).EvaluatorInterface + +## Implemented by + +- [`default`](../classes/internal.default.md) + +## Table of contents + +### Properties + +- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) + +## Properties + +### submitEvaluation + +• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> + +#### Type declaration + +▸ (`evaluation`): `Promise`<`CIDString`\> + +Submits an evaluation to the prefered storage system. + +##### Parameters + +| Name | Type | Description | +| :----------- | :---------------------------------------------------------- | :------------------------ | +| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | + +##### Returns + +`Promise`<`CIDString`\> + +- The CID of the submitted evaluation. + +#### Defined in + +[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md new file mode 100644 index 00000000..273912bc --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md @@ -0,0 +1,169 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata + +# Interface: HypercertClaimdata + +[internal](../modules/internal.md).HypercertClaimdata + +Properties of an impact claim + +## Indexable + +▪ [k: `string`]: `unknown` + +## Table of contents + +### Properties + +- [contributors](internal.HypercertClaimdata.md#contributors) +- [impact_scope](internal.HypercertClaimdata.md#impact_scope) +- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) +- [rights](internal.HypercertClaimdata.md#rights) +- [work_scope](internal.HypercertClaimdata.md#work_scope) +- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) + +## Properties + +### contributors + +• **contributors**: `Object` + +Contributors + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) + +--- + +### impact_scope + +• **impact_scope**: `Object` + +Scopes of impact + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) + +--- + +### impact_timeframe + +• **impact_timeframe**: `Object` + +Impact time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) + +--- + +### rights + +• `Optional` **rights**: `Object` + +Rights + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) + +--- + +### work_scope + +• **work_scope**: `Object` + +Scopes of work + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `excludes?` | `string`[] | +| `name?` | `string` | +| `value?` | `string`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) + +--- + +### work_timeframe + +• **work_timeframe**: `Object` + +Work time period. The value is UNIX time in seconds from epoch. + +#### Index signature + +▪ [k: `string`]: `unknown` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------- | +| `display_value?` | `string` | +| `name?` | `string` | +| `value?` | `number`[] | + +#### Defined in + +[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md new file mode 100644 index 00000000..3f4ea346 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md @@ -0,0 +1,17 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter + +# Interface: HypercertMinter + +[internal](../modules/internal.md).HypercertMinter + +Hypercert contract interface. + +**`Notice`** + +hacky loop to get typedoc to generate all the docs + +## Hierarchy + +- `HypercertMinter` + + ↳ **`HypercertMinter`** diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md new file mode 100644 index 00000000..15998930 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md @@ -0,0 +1,638 @@ +[Hypercerts SDK Documentation](README.md) / Exports + +# Hypercerts SDK Documentation + +## Table of contents + +### References + +- [Claim](modules.md#claim) +- [ClaimToken](modules.md#claimtoken) +- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) + +### Modules + +- [internal](modules/internal.md) + +### Classes + +- [ClientError](classes/ClientError.md) +- [ConfigurationError](classes/ConfigurationError.md) +- [FetchError](classes/FetchError.md) +- [HypercertClient](classes/HypercertClient.md) +- [HypercertsStorage](classes/HypercertsStorage.md) +- [InvalidOrMissingError](classes/InvalidOrMissingError.md) +- [MalformedDataError](classes/MalformedDataError.md) +- [MintingError](classes/MintingError.md) +- [StorageError](classes/StorageError.md) +- [UnknownSchemaError](classes/UnknownSchemaError.md) +- [UnsupportedChainError](classes/UnsupportedChainError.md) + +### Interfaces + +- [CustomError](interfaces/CustomError.md) +- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) +- [EASEvaluation](interfaces/EASEvaluation.md) +- [HypercertClaimdata](interfaces/HypercertClaimdata.md) +- [HypercertClientInterface](interfaces/HypercertClientInterface.md) +- [HypercertClientMethods](interfaces/HypercertClientMethods.md) +- [HypercertClientState](interfaces/HypercertClientState.md) +- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) +- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) +- [HypercertMetadata](interfaces/HypercertMetadata.md) +- [HypercertPointer](interfaces/HypercertPointer.md) +- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) +- [IPFSEvaluation](interfaces/IPFSEvaluation.md) +- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) + +### Type Aliases + +- [AllowlistEntry](modules.md#allowlistentry) +- [Deployment](modules.md#deployment) +- [EvaluationData](modules.md#evaluationdata) +- [EvaluationSource](modules.md#evaluationsource) +- [HypercertClientConfig](modules.md#hypercertclientconfig) +- [HypercertClientProps](modules.md#hypercertclientprops) +- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) +- [HypercertStorageConfig](modules.md#hypercertstorageconfig) +- [HypercertsSdkError](modules.md#hypercertssdkerror) +- [QueryParams](modules.md#queryparams) +- [SupportedChainIds](modules.md#supportedchainids) +- [TransferRestrictions](modules.md#transferrestrictions) + +### Properties + +- [ClaimByIdQuery](modules.md#claimbyidquery) + +### Variables + +- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) +- [TransferRestrictions](modules.md#transferrestrictions-1) + +### Functions + +- [execute](modules.md#execute) +- [formatDate](modules.md#formatdate) +- [formatHypercertData](modules.md#formathypercertdata) +- [formatUnixTime](modules.md#formatunixtime) +- [validateAllowlist](modules.md#validateallowlist) +- [validateClaimData](modules.md#validateclaimdata) +- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) +- [validateMetaData](modules.md#validatemetadata) +- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) +- [verifyMerkleProof](modules.md#verifymerkleproof) +- [verifyMerkleProofs](modules.md#verifymerkleproofs) + +## References + +### Claim + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimToken + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +--- + +### ClaimTokensByClaimQuery + +Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) + +## Type Aliases + +### AllowlistEntry + +Ƭ **AllowlistEntry**: `Object` + +Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol + +**`Param`** + +Address of the recipient + +**`Param`** + +Number of units allocated to the recipient + +#### Type declaration + +| Name | Type | +| :-------- | :------------- | +| `address` | `string` | +| `units` | `BigNumberish` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) + +--- + +### Deployment + +Ƭ **Deployment**: `Object` + +Represents a deployment of a contract on a specific network. + +#### Type declaration + +| Name | Type | Description | +| :---------------- | :------- | :--------------------------------------------------------------------------------------- | +| `chainId` | `number` | The ID of the network on which the contract is deployed. | +| `chainName` | `string` | The name of the network on which the contract is deployed. | +| `contractAddress` | `string` | The address of the deployed contract. | +| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | + +#### Defined in + +[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) + +--- + +### EvaluationData + +Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) + +This file was automatically generated by json-schema-to-typescript. +DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +and run json-schema-to-typescript to regenerate this file. + +#### Defined in + +[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) + +--- + +### EvaluationSource + +Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) + +#### Defined in + +[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) + +--- + +### HypercertClientConfig + +Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } + +Configuration options for the Hypercert client. + +#### Defined in + +[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) + +--- + +### HypercertClientProps + +Ƭ **HypercertClientProps**: `Object` + +The props for the Hypercert client. + +#### Type declaration + +| Name | Type | Description | +| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | +| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | + +#### Defined in + +[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) + +--- + +### HypercertEvaluatorConfig + +Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } + +Configuration options for the Hypercert evaluator. + +**`Note`** + +The signer is required for submitting evaluations. + +#### Defined in + +[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) + +--- + +### HypercertStorageConfig + +Ƭ **HypercertStorageConfig**: `Object` + +Configuration options for the Hypercert storage layer. + +**`Note`** + +The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. + +#### Type declaration + +| Name | Type | Description | +| :------------------ | :------- | :------------------------------ | +| `nftStorageToken?` | `string` | The API token for NFT.storage. | +| `web3StorageToken?` | `string` | The API token for Web3.storage. | + +#### Defined in + +[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) + +--- + +### HypercertsSdkError + +Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) + +#### Defined in + +[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) + +--- + +### QueryParams + +Ƭ **QueryParams**: `Object` + +#### Index signature + +▪ [key: `string`]: `any` + +#### Type declaration + +| Name | Type | +| :---------------- | :------------------ | +| `first` | `number` | +| `orderDirections` | `"asc"` \| `"desc"` | +| `skip` | `number` | + +#### Defined in + +[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) + +--- + +### SupportedChainIds + +Ƭ **SupportedChainIds**: `5` \| `10` + +#### Defined in + +[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) + +--- + +### TransferRestrictions + +Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Properties + +### ClaimByIdQuery + +• **ClaimByIdQuery**: `any` + +## Variables + +### INDEFINITE_DATE_STRING + +• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` + +#### Defined in + +[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) + +--- + +### TransferRestrictions + +• `Const` **TransferRestrictions**: `Object` + +Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol + +**`Dev`** + +AllowAll: All transfers are allowed + +**`Dev`** + +DisallowAll: All transfers are disallowed + +**`Dev`** + +FromCreatorOnly: Only the creator can transfer the Hypercert + +#### Type declaration + +| Name | Type | +| :---------------- | :--- | +| `AllowAll` | `0` | +| `DisallowAll` | `1` | +| `FromCreatorOnly` | `2` | + +#### Defined in + +[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) + +[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) + +## Functions + +### execute + +▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------- | +| `document` | `GraphQLOperation`<`any`, `any`\> | +| `variables` | `any` | +| `context?` | `any` | +| `rootValue?` | `any` | +| `operationName?` | `string` | + +#### Returns + +`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> + +#### Defined in + +node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 + +--- + +### formatDate + +▸ **formatDate**(`date`): `string` + +#### Parameters + +| Name | Type | +| :----- | :----- | +| `date` | `Date` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) + +--- + +### formatHypercertData + +▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) + +Formats input data to an object containing HypercertMetadata including appropriate labels + +#### Parameters + +| Name | Type | +| :----------------------- | :----------------------------------------------- | +| `«destructured»` | `Object` | +| › `contributors` | `string`[] | +| › `description` | `string` | +| › `excludedImpactScope` | `string`[] | +| › `excludedRights` | `string`[] | +| › `excludedWorkScope` | `string`[] | +| › `external_url?` | `string` | +| › `image` | `string` | +| › `impactScope` | `string`[] | +| › `impactTimeframeEnd` | `number` | +| › `impactTimeframeStart` | `number` | +| › `name` | `string` | +| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | +| › `rights` | `string`[] | +| › `version` | `string` | +| › `workScope` | `string`[] | +| › `workTimeframeEnd` | `number` | +| › `workTimeframeStart` | `number` | + +#### Returns + +[`FormatResult`](modules/internal.md#formatresult) + +#### Defined in + +[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) + +--- + +### formatUnixTime + +▸ **formatUnixTime**(`seconds`): `string` + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `seconds` | `number` | + +#### Returns + +`string` + +#### Defined in + +[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) + +--- + +### validateAllowlist + +▸ **validateAllowlist**(`data`, `units`): `Object` + +Validates the data for an allowlist. + +#### Parameters + +| Name | Type | Description | +| :------ | :---------------------------------------------- | :------------------------------------------ | +| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | +| `units` | `BigNumberish` | The total number of units in the allowlist. | + +#### Returns + +`Object` + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +| Name | Type | +| :------- | :------------------------------------------ | +| `errors` | `Record`<`string`, `string` \| `string`[]\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) + +--- + +### validateClaimData + +▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :------------------------------------------------------- | :-------------------- | +| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) + +--- + +### validateDuplicateEvaluationData + +▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a duplicate evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :--------------------------------------------------------- | :-------------------- | +| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) + +--- + +### validateMetaData + +▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------- | :-------------------- | +| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) + +--- + +### validateSimpleTextEvaluationData + +▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) + +Validates the data for a simple text evaluation. + +#### Parameters + +| Name | Type | Description | +| :----- | :----------------------------------------------------------- | :-------------------- | +| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | + +#### Returns + +[`ValidationResult`](modules/internal.md#validationresult) + +A `ValidationResult` object indicating whether the data is valid and any errors that were found. + +#### Defined in + +[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) + +--- + +### verifyMerkleProof + +▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` + +Verifies a Merkle proof for a given address and units. + +**`Throws`** + +If the Merkle proof verification fails. + +#### Parameters + +| Name | Type | Description | +| :-------------- | :------------- | :-------------------------------------- | +| `root` | `string` | The Merkle root hash to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish` | The units to verify. | +| `proof` | `string`[] | The Merkle proof to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) + +--- + +### verifyMerkleProofs + +▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` + +Batch verifies Merkle proofs for multiple roots, units and proofs for a single address + +**`Throws`** + +If the Merkle proof verification fails. + +**`Notice`** + +Wrapper around `verifyMerkleProof` to batch verify multiple proofs + +#### Parameters + +| Name | Type | Description | +| :-------------- | :--------------- | :---------------------------------------- | +| `roots` | `string`[] | The Merkle root hashes to verify against. | +| `signerAddress` | `string` | The address to verify. | +| `units` | `BigNumberish`[] | The units to verify. | +| `proofs` | `string`[][] | The Merkle proofs to verify. | + +#### Returns + +`void` + +#### Defined in + +[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md new file mode 100644 index 00000000..d20a3804 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md @@ -0,0 +1,307 @@ +[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal + +# Module: internal + +## Table of contents + +### Classes + +- [default](../classes/internal.default.md) +- [default](../classes/internal.default-1.md) +- [default](../classes/internal.default-2.md) + +### Interfaces + +- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) +- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) +- [HypercertMinter](../interfaces/internal.HypercertMinter.md) + +### Type Aliases + +- [Claim](internal.md#claim) +- [ClaimByIdQuery](internal.md#claimbyidquery) +- [ClaimToken](internal.md#claimtoken) +- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) +- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) +- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) +- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) +- [Exact](internal.md#exact) +- [FormatResult](internal.md#formatresult) +- [InputMaybe](internal.md#inputmaybe) +- [Maybe](internal.md#maybe) +- [OrderDirection](internal.md#orderdirection) +- [RecentClaimsQuery](internal.md#recentclaimsquery) +- [Scalars](internal.md#scalars) +- [ValidationResult](internal.md#validationresult) + +## Type Aliases + +### Claim + +Ƭ **Claim**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | +| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | + +#### Defined in + +[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) + +--- + +### ClaimByIdQuery + +Ƭ **ClaimByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | + +#### Defined in + +[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) + +--- + +### ClaimToken + +Ƭ **ClaimToken**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :--------------------------------------------- | +| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `claim` | [`Claim`](internal.md#claim) | +| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | +| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | +| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | +| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | + +#### Defined in + +[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) + +--- + +### ClaimTokenByIdQuery + +Ƭ **ClaimTokenByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | + +#### Defined in + +[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) + +--- + +### ClaimTokensByClaimQuery + +Ƭ **ClaimTokensByClaimQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :------------------------------------------------------------------------------------------------------------------ | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) + +--- + +### ClaimTokensByOwnerQuery + +Ƭ **ClaimTokensByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | + +#### Defined in + +[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) + +--- + +### ClaimsByOwnerQuery + +Ƭ **ClaimsByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) + +--- + +### Exact + +Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } + +#### Type parameters + +| Name | Type | +| :--- | :--------------- | +| `T` | extends `Object` | + +#### Defined in + +[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) + +--- + +### FormatResult + +Ƭ **FormatResult**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------ | +| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | +| `errors` | `Record`<`string`, `string`\> \| `null` | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) + +--- + +### InputMaybe + +Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) + +--- + +### Maybe + +Ƭ **Maybe**<`T`\>: `T` \| `null` + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Defined in + +[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) + +--- + +### OrderDirection + +Ƭ **OrderDirection**: `"asc"` \| `"desc"` + +Defines the order direction, either ascending or descending + +#### Defined in + +[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) + +--- + +### RecentClaimsQuery + +Ƭ **RecentClaimsQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | + +#### Defined in + +[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) + +--- + +### Scalars + +Ƭ **Scalars**: `Object` + +All built-in and custom scalars, mapped to their actual values + +#### Type declaration + +| Name | Type | +| :----------- | :-------- | +| `BigDecimal` | `any` | +| `BigInt` | `any` | +| `Boolean` | `boolean` | +| `Bytes` | `any` | +| `Float` | `number` | +| `ID` | `string` | +| `Int` | `number` | +| `Int8` | `any` | +| `String` | `string` | + +#### Defined in + +[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) + +--- + +### ValidationResult + +Ƭ **ValidationResult**: `Object` + +The result of a validation. + +**`Property`** + +Whether the data is valid. + +**`Property`** + +A map of errors, where the key is the field that failed validation and the value is the error message. + +#### Type declaration + +| Name | Type | +| :------- | :---------------------------- | +| `errors` | `Record`<`string`, `string`\> | +| `valid` | `boolean` | + +#### Defined in + +[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md new file mode 100644 index 00000000..b591d11d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md @@ -0,0 +1,12 @@ +# Burning + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Burning fraction tokens + +You can only burn fraction tokens that you own. Hypercert claims cannot be burned once minted. +You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). + +```js +const txn = await hypercerts.burnFraction({ tokenId }); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md new file mode 100644 index 00000000..0be153cb --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md @@ -0,0 +1,110 @@ +# Hypercert Client Configuration + +The client provides a high level interface that communicates with the Graph, IPFS and the evm. For easy setup we harmonised the configuration into a flow that allows for configuration with different levels of specificity. + +## Configuration + +### Setup + +The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: + +1. Overrides declared in `Partial` + +Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. + +We then process the rest of the overrides and possible environment variables to customise the default configuration. + +To get started quickly you can either: + +- initialize a new client by calling `new HypercertClient({chain: {id: 5})` (or 10) + +Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) + +### Read-only mode + +The SDK client will be in read-only mode if any of the following conditions are true: + +- The client was initialized without an operator. +- The client was initialized with an operator without signing abilities. +- The contract address is not set. +- The storage layer is in read-only mode. + +If any of these conditions are true, the read-only property of the `HypercertClient` instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. + +### Defaults + +The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. + +`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the +default chain ID is set to 5, which corresponds to the Goerli testnet. + +Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. + +`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object +contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. + +For example: + +```json +{ + "5": { + "chainId": 5, + "chainName": "goerli", + "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" + } +} +``` + +You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` +when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. + +### Client config properties + +| Property | Type | Description | +| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | +| `chainId` | `number` | The chain ID of the network to use. | +| `chainName` | `string` | The name of the network to use. | +| `contractAddress` | `string` | The address of the Hypercert contract. | +| `graphUrl` | `string` | The url of the subgraph to use. | +| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | +| `nftStorageToken` | `string` | Your NFT.storage API key. | +| `web3StorageToken` | `string` | Your web3.storage API key. | + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +### Environment variables + +You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. + +We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. + +| Environment Variable | Description | +| -------------------------------- | --------------------------------------------------------------------------------------------------- | +| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | +| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | +| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | +| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | +| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | +| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | +| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | + +### Logging + +The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level +determines which log messages are printed to the console. By default, the logger is configured to log messages with a +level of info or higher to the console. + +In your `.env` file: + +```bash +LOG_LEVEL="info" +``` + +The SDK logger supports four log levels: `error`, `warn`, `info`, and `debug`. + +- The `error` log level is used to log errors that occur in the SDK. +- The `warn` log level is used to log warnings that do not necessarily indicate an error, but may be important to investigate. +- The `info` log level is used to log general information about the SDK's state or behavior. +- The `debug` log level is used to log detailed information that is useful for debugging purposes. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md new file mode 100644 index 00000000..60f4e5e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md @@ -0,0 +1,18 @@ +# Errors in the SDK + +Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. + +### Handling Errors + +To support debugging we've implemented some custom errors. + +| Error | Reason | Payload | +| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | +| ClientError | An error caused by the client | `{ [key: string]: unknown }` | +| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | +| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | +| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | +| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | +| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | +| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | +| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md new file mode 100644 index 00000000..c5399a4f --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md @@ -0,0 +1,13 @@ +# Evaluations + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## Respond / or contest an evaluation + +To create an evaluation of a hypercert + +```js +TODO; +``` + +_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md new file mode 100644 index 00000000..d5ff1226 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md @@ -0,0 +1,57 @@ +# Minting + +## Token design + +Hypercerts are semi-fungible tokens. +Thus, each hypercert is represented on-chain by a group of fraction tokens, +each representing a fraction of ownership over the hypercert. +If you want to split your fraction token, or merge multiple tokens into one, +check out the section on [splitting and merging](./split-merge.md). + +## Minting your first hypercert + +To mint a hypercert you need to provide the `metadata`, total amount of `units` and the preferred `TransferRestrictions`. +The resulting hypercert will be wholly owned by the creator. + +```js +import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" + +const { metadata } = formatHypercertData(...); +const totalUnits = "10000"; + +const tx: Promise = await hypercerts.mintClaim({ + metadata, + totalUnits, + transferRestrictions: TransferRestrictions.FromCreatorOnly, +}); +``` + +> **Note** If you did not initialize your HypercertsClient with an `operator`, `nftStorageToken` and `web3StorageToken`, the client will run in [read-only mode](#read-only-mode) and this will fail. + +Let's see what happens under the hood: + +First, `mintClaim` checks that the client is not `read only` and that the operator is a `Signer`. If not, it throws an `InvalidOrMissingError`. + +Next, the function validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. The function then stores the metadata on `IPFS` using the `storeMetadata` method and returns the `CID` for the metadata. + +Finally, we call the mintClaim function on the contract with the signer `address`, total `units`, `CID`, and `transfer restriction` as parameters. If `overrides` are provided, the function uses them to send the transaction. Otherwise, it sends the transaction without overrides. + +## Transfer restrictions + +When minting a Hypercert, you must pass in a `TransferRestriction` policy. For now there are only 3 implemented policies: + +```js +enum TransferRestrictions { + // Unrestricted + AllowAll, + // All transfers disabled after minting + DisallowAll, + // Only the original creator can transfer + FromCreatorOnly +} +``` + +## Reference + +See the [code](https://github.com/hypercerts-org/hypercerts/tree/main/sdk/src/client.ts) +for more details on how we implement minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md new file mode 100644 index 00000000..98ebbb83 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md @@ -0,0 +1,306 @@ +# Querying + +## Overview + +The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient +has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, +HypercertIndexer, and HypercertMinter classes, respectively. + +```js +const { + client: { storage }, +} = new HypercertClient({}); +``` + +The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. + +```js +const { + client: { indexer }, +} = new HypercertClient({}); +``` + +The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. +It is used by the HypercertClient to retrieve event-based data via the subgraph. + +```js +const { + client: { contract }, +} = new HypercertClient({}); +``` + +Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used +by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. + +By providing instances of these classes through the `storage`, `indexer`, and `contract` getters, the HypercertClient allows developers to easily interact with the various components of the Hypercert system directly. +For example, a developer could use the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the contract. + +## Indexer + +For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. + +### Live graph playground + +To inspect the subgraph and explore queries, have a look at the Graph playground for Goerli testnet and Optimism mainnet: + +- [Goerli dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) +- [Optimism dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) + +### Graph client + +Since the client is fully typed, it's easy to explore the functionalities using code completion in IDEs. + +Here's one example from our frontend where we let [react-query](https://www.npmjs.com/package/%2540tanstack/react-query) frequently update the call to the graph: + +```js +import { useHypercertClient } from "./hypercerts-client"; +import { useQuery } from "@tanstack/react-query"; + +export const useFractionsByOwner = (owner: string) => { + const { + client: { indexer }, + } = useHypercertClient(); + + return useQuery( + ["hypercerts", "fractions", "owner", owner], + () => indexer.fractionsByOwner(owner), + { enabled: !!owner, refetchInterval: 5000 }, + ); +}; +``` + +### Queries: Claims + +These tables show the input parameters and output fields for each of the GraphQL queries in [claims.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/claims.graphql). +A claim represents 1 Hypercert and all of the common data across all claim/fraction tokens. + +#### `ClaimsByOwner` + +The `ClaimsByOwner` query retrieves an array of claims that belong to a specific owner. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claims to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `RecentClaims` + +The RecentClaims query retrieves an array of the most recent claims on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | ---------------------------------- | ------------- | +| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | +| `first` | `Int` | The number of claims to retrieve. | `100` | +| `skip` | `Int` | The number of claims to skip. | `0` | + +##### Output + +The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +#### `ClaimByID` + +The ClaimById query retrieves a single claim by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------- | +| `id` | `ID!` | The ID of the claim to retrieve. | + +##### Output + +The query returns a claim object that matches the input parameter. The claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `contract` | `Bytes` | The address of the contract. | +| `tokenID` | `String` | The token ID. | +| `creator` | `Bytes` | The address of the creator. | +| `id` | `ID` | The ID of the claim. | +| `owner` | `Bytes` | The address of the owner. | +| `totalUnits` | `BigInt` | The total number of units. | +| `uri` | `String` | The URI of the claim metadata. | + +### Queries: Fractions + +These tables show the input parameters and output fields for each of the GraphQL queries in [fractions.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/fractions.graphql). +A claim token represents a fraction of ownership of a Hypercert. + +#### `ClaimTokensByOwner` + +The `ClaimTokensByOwner` query retrieves an array of claim tokens that belong to a specific owner on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `owner` | `Bytes` | The address of the owner whose claim tokens to retrieve. | "" | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ------------------------------------------ | +| `chainName` | `String` | The name of the chain. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +#### `ClaimTokensByClaim` + +The `ClaimTokensByClaim` query retrieves an array of claim tokens that belong to a specific claim on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | Default Value | +| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | +| `claimId` | `String!` | The ID of the claim whose claim tokens to retrieve. | None | +| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | +| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | +| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | + +##### Output + +The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | + +#### `ClaimTokenById` Query + +The `ClaimTokenById` query retrieves a single claim token by its ID on the Hypercert platform. + +##### Input + +The query takes the following input parameters: + +| Parameter | Type | Description | +| --------- | ----- | -------------------------------------- | +| `id` | `ID!` | The ID of the claim token to retrieve. | + +##### Output + +The query returns a claim token object that matches the input parameter. The claim token object has the following fields: + +| Field | Type | Description | +| ----------- | -------- | ---------------------------------------------- | +| `chainName` | `String` | The name of the chain the claim was minted on. | +| `id` | `ID` | The ID of the claim token. | +| `owner` | `Bytes` | The address of the owner. | +| `tokenID` | `String` | The token ID. | +| `units` | `BigInt` | The number of units. | +| `claim` | `Claim` | The claim associated with the claim token. | + +The Claim object has the following fields: + +| Field | Type | Description | +| ------------ | -------- | ------------------------------------ | +| `id` | `ID` | The ID of the claim. | +| `creation` | `Int` | The timestamp of the claim creation. | +| `uri` | `String` | The URI of the claim metadata. | +| `totalUnits` | `BigInt` | The total number of units. | + +## Storage + +### Hypercert Metadata + +Currently, all metadata is stored off-chain in IPFS. Use the `storage` client to retrieve the metadata + +```js +const claimId = "0x822f17a9a5eecfd...85254363386255337"; +const { indexer, storage } = hypercertsClient; +// Get the on-chain claim +const claimById = await indexer.claimById(claimId); +// Get the off-chain metadata +const metadata = await storage.getMetadata(claimById.claim.uri); +``` + +## Contract + +### Typechain bindings + +We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, +which you can import and use from your TypeScript/JavaScript codebase. + +For example: + +```js +import { ethers } from "ethers"; +import { + HyperCertMinterFactory, + HypercertMinterABI, + IHypercertTokenABI, +} from "@hypercerts-org/sdk"; + +const provider = new ethers.getDefaultProvider(network); +const contractInterface = new ethers.utils.Interface(HypercertMinterABI); +const contract = new ethers.Contract( + contractAddress, + HypercertMinterABI, + provider, +); +const metadataUri = await contract.functions.uri(tokenId); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md new file mode 100644 index 00000000..936cc05b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md @@ -0,0 +1,101 @@ +# Getting started with JavaScript + +The Hypercerts SDK makes it easy to integrate Hypercerts into your application or backend with JavaScript/TypeScript. + +## Installation + +Install the SDK using npm or yarn: + +```bash +npm install @hypercerts-org/sdk +# OR yarn add @hypercerts-org/sdk +``` + +## Get storage credentials (only required for minting) + +For now, we store all metadata (e.g. Hypercert claim data) on IPFS using [NFT.Storage](https://nft.storage/) and [web3.storage](https://web3.storage/). + +In order to mint a Hypercert, you will need to create API tokens for both services, which you can learn more about from their respective guides: + +- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) +- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) + +_Note: In the future, we want to also support other mechanisms for storing off-chain data._ + +## Initialize + +Import the SDK into your project and create a new instance of `HypercertClient` with your configuration options: + +```js +import { HypercertClient } from "@hypercerts-org/sdk"; +import { ethers } from "ethers"; + +// NOTE: you should replace this with your own JSON-RPC provider to the network +// This should have signing abilities and match the `chainId` passed into HypercertClient +const operator = ethers.providers.getDefaultProvider("goerli"); + +const client = new HypercertClient({ + chainId: 5, // goerli testnet + operator, + nftStorageToken, + web3StorageToken, +}); +``` + +Hypercerts is a multi-chain protocol. +See [here](./supported-networks.md) for a list of currently supported networks. + +> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). + +## Make a Hypercert + +Use the client object to interact with the Hypercert network. For example, you can use the `client.mintClaim` method to create a new claim: + +```js +import { + formatHypercertData, + TransferRestrictions, +} from "@hypercerts-org/sdk"; + +// Validate and format your Hypercert metadata +const { data: metadata, valid, errors } = formatHypercertData({ + name, + ... +}) + +// Check on errors +if (!valid) { + return console.error(errors); +} + +// Set the total amount of units available +const totalUnits: BigNumberish = 10_000_000 + +// Define the transfer restriction +const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly + +// Mint your Hypercert! +const tx = await client.mintClaim( + metadata, + totalUnits, + transferRestrictions, +); +``` + +For guidance on how to specify your metadata, see the [minting guide](../minting-guide/step-by-step.md). +This will validate the metadata, store claim metadata on IPFS, create a new hypercert on-chain, and return a transaction receipt. + +For more details, check out the [Minting Guide](./minting.md). + +## Query for Hypercerts + +You can also use the client to query the subgraph and retrieve which claims an address owns: + +```js +const claims = await client.indexer.fractionsByOwner(owner), +``` + +For more details, checkout the [Querying guide](./querying.md) +and our [Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet). + +That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md new file mode 100644 index 00000000..409a1e9d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md @@ -0,0 +1,41 @@ +# Getting started with Solidity + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +If you need the Solidity contracts or interfaces exported from the SDK, +please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Hypercerts deployments + +Hypercerts is a multi-chain protocol and we want to support any network that wants to make positive impact. +We plan to support at most 1 canonical contract deployment per network. +For a complete list of deployments and their contract addresses, see [Supported Networks](./supported-networks.md). + +## Installing the Hypercert contracts + +```bash +npm install @hypercerts-org/contracts +# or yarn add @hypercerts-org/contracts +``` + +## Using the Solidity interface + +If you want to call the Hypercerts contract on your network directly from Solidity, +we export the interface/ABI for you to use from your contract. + +```js +import { IHypercertToken } from "@hypercerts-org/contracts/IHypercertMinter.sol"; + +contract MyContract { + IHypercertToken hypercerts; + + function initialize(address _addr) public virtual initializer { + hypercerts = IHypercertToken(_addr); + } + + function uri(uint256 tokenID) public view returns (string memory _uri) { + _uri = hypercerts.uri(tokenID); + } +} + +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md new file mode 100644 index 00000000..1ac5556e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md @@ -0,0 +1,29 @@ +# Split and Merge + +> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. + +## By Token Value + +### Split / merge token values + +```js +const { tokenIds } = await hypercerts.splitFraction({ + tokenId, + units: [10, 12, 15], +}); +const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); +``` + +## By Claim Data + +### Split / merge claim data + +```js +const { claimIds } = await hypercerts.splitClaim({ + claimId, + TODO: somehow specify hypercert subregions +}); +const { claimId} = await hypercerts.mergeClaims({ + claimIds, +}); +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md new file mode 100644 index 00000000..3bfd0f18 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md @@ -0,0 +1,13 @@ +# Supported networks + +Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. + +We want to support every network that wants to support positive impact! +If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). + +## Overview + +| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | +| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | +| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | +| Optimism | 10 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md new file mode 100644 index 00000000..72b3ee2d --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md @@ -0,0 +1,120 @@ +# Deploy a new proxy contract + +This should be done only on rare occasions. For example, when: + +- We want to deploy to a new network +- We have updated the contract in a way that is _NOT_ backwards-compatible. + - For most upgrades, please use UUPS [upgrades](./upgrade.md). + +## Smart Contracts + +### Setup the `contracts/` environment + +Navigate to `contracts/`. Configure your `.env` file by following the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/contracts#setup). + +### Build and deploy the smart contracts + +If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. + +```javascript + "optimism-goeri": getChainConfig("optimism-goerli"), +``` + +Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. + +```sh +# Run in contracts/ +yarn build:hardhat +yarn hardhat deploy --network NETWORK +``` + +This will output the new proxy address. Update the root `README.md` with this new address. + +Now transfer ownership over the proxy contract to the multisig: + +```sh +yarn hardhat transfer-owner --network NETWORK --proxy PROXY_CONTRACT_ADDRESS --owner MULTISIG_ADDRESS +``` + +## Subgraph + +### Setup the `graph/` environment + +Navigate to `graph/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/graph#setup) +to get set up. + +### Deploy the subgraph + +Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). + +Now deploy the subgraph + +```sh +# Run in graph/ +yarn build +yarn deploy:hosted +``` + +## OpenZeppelin Defender + +### Create a new Supabase table + +Log into the [Supabase dashboard](https://app.supabase.com/). +We store all data in a single project, but use different tables for each network. +The table name should be suffixed by the network (e.g. `allowlistCache-goerli`). +If you are deploying to a new network, create a new table. You can copy the table schema and RLS policy from another pre-existing table. + +If you are deploying a new proxy contract to a network for which you already have another deployment, you'll have to make a judgement call as to whether you can reuse the existing table, whether you need to clear the existing table, or create another table. + +Note: We want to merge all the tables in this [issue](https://github.com/hypercerts-org/hypercerts/issues/477). + +### Update the OpenZeppelin Defender scripts + +Modify the Defender scripts to support the new network in `defender/src/networks.ts`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. + +Note: The entry point for deployment is in `defender/src/setup.ts`. + +### Setup the `defender/` environment + +Navigate to `defender/`. Follow the instructions in the +[README](https://github.com/hypercerts-org/hypercerts/tree/main/defender#setup) +to get set up. + +### Deploy defender scripts + +Deploy to OpenZeppelin Defender via + +```sh +# Run in defender/ +yarn deploy +``` + +## Hypercerts SDK + +TODO: Flesh this out + +Run the build in `contracts/`. + +(Soon to be deprecated) Publish `contracts/` to npm + +Configure the SDK to support the new network via the graphclient. + +Publish SDK to npm + +## Deploy the Dapp frontend + +Each frontend build is configured to run on a different network (e.g. `https://testnet.hypercerts.org`). You can use any CDN to serve the site (e.g. Netlify, Vercel, GitHub Pages, Cloudflare Pages, Fleek, Firebase Hosting). + +1. Configure your build environment with the environment variables specified in `frontend/.env.local.example`. + +2. Configure your builds to the following settings: + +- Build command: `yarn build:site` +- Build output directory: `/build` +- Root directory: `/` + +3. Configure the domain that you want for your build. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md new file mode 100644 index 00000000..05dc5b0c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md @@ -0,0 +1,45 @@ +# Errors + +## Deploying + +### Artifact for contract "HypercertMinter" not found + +#### Error message + +`Error HH700: Artifact for contract "HypercertMinter" not found.` + +#### Cause + +Attempting to deploy a contract with `npx hardhat deploy` before the contract has been compiled by hardhat. Contracts compiled by forge are currently not visible to hardhat (this could be a configuration problem). + +### insufficient funds for intrinsic transaction cost + +#### Error message + +`Error: insufficient funds for intrinsic transaction cost` + +#### Cause + +The environment variable `MNEMONIC` is not configured correctly. + +Alternatively, the wallet may not have enough funds for the selected network + +Causing pause twice + +Error: cannot estimate gas; transaction may fail or may require manual gas limit + +reason: 'execution reverted: Pausable: paused', + +#### Etherscan API + +Note: It can take between 5-10 minutes before a newly created etherscan API key becomes valid for queries to goerli. + +When using an etherscan API key that was too recently created, hardhat tasks using etherscan to verify transactions will exit with an error message: + +`Etherscan returned with message: NOTOK, reason: Invalid API Key` + +Despite this error the transaction may have succeeded, the hardhat task just can't confirm it. + +It is unknown if this is a problem for queries to mainnet as well. + +Metamask makes it very difficult to have multiple wallets. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md new file mode 100644 index 00000000..9b208595 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md @@ -0,0 +1,18 @@ +# DevOps + +We use this playbook to encapsulate our practices and current setup. + +## Setup dev environment + +- [Setup guide](./setup.md) +- [Plasmic setup](./plasmic.md) + +## Tasks + +- [Deploy new proxy contract](./deploy-proxy.md) +- [Upgrade contract](./upgrade.md) +- [Pause contract](./pause.md) + +## FAQ + +- [Common errors](./errors.md) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md new file mode 100644 index 00000000..2668f51e --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md @@ -0,0 +1,29 @@ +# Pause / Unpause + +## Pause + +### Contract owned by an address + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat pause --network NETWORK --address CONTRACT_ADDRESS +``` + +### Contract owned by a multi-sig + +If we transferred ownership to a multisig, we can use +[OpenZeppelin Defender Admin](https://defender.openzeppelin.com/#/admin) +to propose a pause to be approved by the multisig. + +## Unpause + +Make sure you have set up your wallets and config from the [setup guide](./setup.md). + +To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: + +```sh +yarn hardhat unpause --network NETWORK --address CONTRACT_ADDRESS +``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md new file mode 100644 index 00000000..10e52f5b --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md @@ -0,0 +1,76 @@ +# Plasmic setup + +## HypercertImage + +### Props + +hideImpact + +``` +$ctx.currentForm.impactTimeEnd === "indefinite" && ($ctx.currentForm.impactScopes.length === 0 || ($ctx.currentForm.impactScopes.length === 1 && $ctx.currentForm.impactScopes[0] === "all")) +``` + +color + +``` +$ctx.currentForm.backgroundColor +``` + +vectorart + +``` +$ctx.currentForm.backgroundVectorArt +``` + +### Slots + +logoImage Image URL + +``` +$ctx.currentForm.logoUrl +``` + +title Content + +``` +$ctx.currentForm.name +``` + +workPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.workTimeEnd.format ? $ctx.currentForm.workTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.workTimeEnd}` +``` + +bannerImage Image URL + +``` +$ctx.currentForm.bannerUrl +``` + +impactPeriod Content + +``` +`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.impactTimeEnd.format ? $ctx.currentForm.impactTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.impactTimeEnd}` +``` + +#### workScopes: repeated ScopeChip + +Collection + +``` +$ctx.currentForm.workScopes.split(/[,\n]/).map(i => i.trim()).filter(i => !!i) +``` + +Element name: `currentWorkScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentWorkScope` + +#### impactScopes: repeated ScopeChip + +Collection: `$ctx.currentForm.impactScopes` +Element name: `currentImpactScope` +Index name: `currentIndex` +Color variant: `$ctx.currentForm.backgroundColor` +Content: `currentImpactScope` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md new file mode 100644 index 00000000..afb95296 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md @@ -0,0 +1,41 @@ +# Setup + +## Pre-requisites + +1. Install [NodeJS](https://nodejs.org/en/) and [git](https://git-scm.com/) +2. Install [yarn](https://classic.yarnpkg.com/) + +```sh +npm install --global yarn +``` + +3. Clone the repository: + +``` +git clone git@github.com:hypercerts-org/hypercerts.git +cd hypercerts +``` + +4. Install dependancies: + +To install dependencies across all projects in the monorepo workspace: + +```sh +yarn install +``` + +## Setup your wallets + +We need 2 wallets: a multi-sig for administering the contracts, and a hot wallet for setting everything up. + +1. We use a [Gnosis Safe](https://app.safe.global/) multisig for managing and administering the contracts. Set one up with your desired confirmation threshold (e.g. 2 of 3). This wallet will not require any balance. +2. Separately, set up a wallet that we'll use in our developer scripts. + +- If you don't have one, you can goto `contracts/` and run `yarn hardhat generate-address`. +- Make sure there is enough balance in this account to deploy the contract and transfer ownership to the multisig + - [Goerli Faucet](https://goerlifaucet.com/) + - [Optimism Bridge](https://app.optimism.io/bridge/deposit) + +## Next Steps + +Depending on what you want to do (e.g. in `./sdk/` or `./frontend/`), there will be further setup instructions in the respective `README.md` file. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md new file mode 100644 index 00000000..820255e7 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md @@ -0,0 +1,35 @@ +# Upgrading the contract + +## Validate upgrade + +Validate contract upgradeability against deployment. + +For example, for the `goerli` deployment: + +```sh +yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS +``` + +## Propose Upgrade + +Propose an upgrade via OpenZeppelin Defender. For more information, see this +[guide](https://docs.openzeppelin.com/defender/guide-upgrades) + +For example, for the `goerli` deployment: + +```sh +yarn build:hardhat +yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS +``` + +This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. + +## Publish to npm + +After you update the contracts, deploy the `contracts/` package to npm. + +TODO + +Update the dependencies in `frontend/package.json` and `sdk/package.json`. + +If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/faq.md b/docs/versioned_docs/version-1.0.0-alpha.1/faq.md new file mode 100644 index 00000000..b9659b5a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/faq.md @@ -0,0 +1,139 @@ +--- +title: Frequently Asked Questions +id: faq +--- + +# FAQs + +### How do I create a hypercert? + +We've created a step-by-step guide in the documents, which you can find [here](minting-guide/minting-guide-start). + +### Who gets to claim my hypercert? + +There are currently two types of users who are eligible to claim your hypercert. + +1. You as the creator of the hypercert are eligible to claim your hypercert. For projects with an allow list, you are eligible to claim 50% of the total tokens. For projects with no allow list, you will receive 100% of the tokens automatically and can do whatever you like with them. + +2. Anyone on the hypercert's allow list will be eligible to claim your hypercert. The allow list is stored and the time of minting and allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions through a separate contract interaction. Creators often use allow lists be used to allocate fractions to previous funders and contributors. + +### How do I claim a hypercert? Can I claim all of the ones I’m eligible for at once? + +After you connect your wallet, you will see a dashboard of hypercerts that you can claim. You can either claim them individually or in a batch transaction. Note that if you perform the batch transaction you will automatically claim _all_ hypercerts you are allow-listed for. (You still pay a gas fee for each claim, however.) If you don't want to claim _all_ at once, then you should claim them one-by-one. + +### What token standard do hypercerts utilize? + +The interface supports both ERC-1155s and 721s. Our current implementation makes use of [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) (a semi-fungible token). + +### What are the required fields to generate a hypercert? + +There are six required fields: + +1. Set of contributors: An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. Scope of work: A conjunction of potentially-negated work scope tags, where an empty string means “all”. +3. Time of work: A date range, from the start to the end of the work being claimed by this hypercert. +4. Scope of impact: A conjunction of potentially-negated impact scope tags, where an empty string means “all”. +5. Time of impact: Date ranges from the start to the end of the impact. +6. Rights of the owners: An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Hypercerts also need a name and description. + +### What should I put for my hypercert's work scope? + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +### Are hypercerts the same as impact evaluations? + +No. A hypercert is a claim over a discrete piece of work and the impact that may result from that work. It has no opinion about the legitimacy or quality of the claim. + +An impact evaluation is an opinionated assessment about the legitimacy or quality of a claim. + +For example, a hypercert might represent "Planting trees in the Amazon in 2022". An impact evaluation might point to that hypercert and assert the percent of trees that survived, the amount of CO2 removed by the trees, or the income change among people living around the project. + +Over time, the expectation is that hypercerts that attract multiple, high quality, credibly neutral impact evaluations will be more relevant than ones that do not. + +### What can I do with my hypercert? + +The `rights` dimension specific what an owner can do with their hypercert. Currently, the only `right` that owners have is "Public Display". Over time, we hope the protocol can support various `rights` including transfers, intellectual property, tax-deductibility, carbon offsets, ESG reporting, and more. + +### How is a hypercert different than a POAP or Impact NFT? + +Hypercerts have some things in common with certain POAPs or Impact NFTs, but also a number of crucial differences. + +First, all POAPs and most Impact NFTs are implemented as non-fungible tokens (ERC-721s). Hypercerts are currently being implemented as semi-fungible tokens (ERC-1155s), meaning it is possible to own more than one unit or fraction of a given hypercert. This makes it easy and intuitive to display the share of hypercerts that a given owner has. + +Second, hypercerts have specific metadata requirements and interpretation logic. These include a standard schema for how the six required hypercert dimensions are defined and captured (i.e., work scopes, impact scopes, timeframes, contributors, etc) as well as logic for how to interpret different inputs (e.g., how to include or exclude certain work scopes, create an indefinite time period, etc). POAPs have a completely different schema. Although there is no standard schema for Impact NFTs, an Impact NFT project could choose to adopt the hypercert standard and token interface and thereby achieve compatibility. + +Third, the hypercerts token interface is intended to support several functions that are not possible out of the box with other token standards, chiefly, atomic split and merge capabilities. We also expect other protocols to work with hypercerts for the purposes of prospective and retrospective funding, contributor verification, and impact evaluation. + +For certain use cases, POAPs may be better suited for projects as hypercerts are focused on the funding aspect of impactful work. + +### Where can I purchase a hypercert? + +Currently, it is only possible to purchase a hypercert from a creator or project. This can be facilitated directly by the project or via a third-party marketplace like OpenSea. Currently, hypercerts cannot be resold on secondary markets. + +### What chain(s) is hypercerts running on? + +The hypercerts smart contracts have been deployed on Optimism and Goerli Testnet. We plan to support various EVM chains in the near future. + +### How do I bridge to Optimism? + +There are various bridging services including the official [Optimism Bridge](https://app.optimism.io/bridge/deposit). Note that bridging assets from Ethereum to Optimism will incur a gas fee. + +### How much gas will it cost to create or claim a hypercert? + +In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). Claiming a hypercert should be below 0.0001 ETH or less than $0.10 on Optimism. + +### How do I create a hypercert from a multisig? + +If you are creating a hypercert on Optimism, then you will need an Optimism-based multisig. (Unfortunately, Safe wallets created on Ethereum won't work on Optimism.) + +### Have the smart contracts been audited? + +Yes. The auditor's security report is available [here](https://github.com/pashov/audits/blob/master/solo/Hypercerts-security-review.md). + +### How is the allow list generated? + +For Gitcoin projects, an allow list is generated from a snapshot of all of the on-chain funding received by the project. + +The queries used to generate the allow lists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Once the snapshot is taken, the formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +### Why am I not on the allow list even though I contributed to the project? + +If you contributed less than $1 DAI to a project, then you will not be eligible to claim a hypercert fraction. + +### I supported a project. Why I don't I see the hypercert in my dashboard? + +In order to your hypercert to appear as "claimable", the project needs to mint the hypercert first. If the project has not minted its hypercert yet, then you will not be able to claim it. We suggest you check back in a few days to see if the project has created the hypercert and is now claimable. + +If the project has created its hypercert, then please try the following solutions: + +1. Confirm the wallet address is correct (some users have multiple wallet addresses and forget which one they donated with) +2. Check that your wallet is included in the Dune Dashboards for each Gitcoin Round + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +3. Confirm you donated more than $1 DAI to the project. + +If the project has created its hypercert, and you have confirmed items 1-3, then please send us a DM over Twitter or Telegram with your wallet address and we will get back to you promptly. + +### How do I retire a hypercert? + +We don't yet have a frontend for retiring hypercerts but you can do this by interacting directly with the smart contract on Etherscan. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md b/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md new file mode 100644 index 00000000..86c25331 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md @@ -0,0 +1,37 @@ +--- +title: Further Resources +id: further-resources +--- + +# Papers, Articles, Presentations + +## Writings + +- Feb 14, 2023, Whitepaper draft by [@hypercerts](http://twitter.com/hypercerts): [Hypercerts: A new primitive for impact funding systems (draft v0)](../static/pdf/hypercerts_whitepaper_v0.pdf) +- Aug 24, 2022, Blogpost by [@holkeb](https://twitter.com/holkeb): [Hypercerts: A new primitive for public goods funding](https://protocol.ai/blog/hypercert-new-primitive/) +- Jun 2022, Tech report (draft) by [@davidad](https://twitter.com/davidad): [Hypercerts; an Interoperable Datalayer for Impact-Funding Mechanisms](../static/pdf/hypercerts_Tech_Report_draft.pdf) + +## Talks + +#### Jun 24, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Hypercerts: on-chain primitives for impact markets](https://youtu.be/2hOhOdCbBlU) + + + +#### Jun 23, 2022, Conversation between [@emiyazono](http://twitter.com/emiyazono) and [@owocki](http://twitter.com/owocki) at GreenPill Podcast: [Impact Certificates | Evan Miyazono, Head of Research at Protocol Labs | Green Pill #21](https://youtu.be/kyo5SxtSJ9U) + + + +#### Mar 4, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Interoperable mechanisms for non-rival goods (Hypercerts)](https://youtu.be/acbBeGcevok) + + + +## Other resources + +Overview of some previous writings on impact certificates, retrospective funding and impact markets: + +- Christiano, Paul (2014) Certificates of impact, Rational Altruist, [https://rationalaltruist.com/2014/11/15/certificates-of-impact/](https://rationalaltruist.com/2014/11/15/certificates-of-impact/) +- Christiano, Paul & Katja Grace (2015) The Impact Purchase, [https://impactpurchase.org/why-certificates/](https://impactpurchase.org/why-certificates/) +- Optimism & Buterin, Vitalik (2021) Retroactive Public Goods Funding, [https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c) +- Cotton-Barratt, Owen (2021), Impact Certificates and Impact Markets, Funding the Commons November 2021, [https://youtu.be/ZiDV56o5M7Q](https://youtu.be/ZiDV56o5M7Q) +- Drescher, Denis (2022) Towards Impact Markets, [https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1](https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1) +- Ofer & Cotton-Barratt, Owen (2022) Impact markets may incentivize predictably net-negative projects, [https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6](https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md new file mode 100644 index 00000000..b2451310 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md @@ -0,0 +1,139 @@ +--- +title: Glossary +id: glossary +sidebar_position: 3 +--- + +# Glossary of Hypercerts Terms + +## Main Terms + +### Allowlist + +A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. + +### Claiming a fraction + +Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. + +### Contributor + +An individual or organization that performs some or all of the work described in a hypercert. + +### Creating a hypercert + +Synonymous to minting a hypercert. + +### Fraction + +A token that represents a quantified proportion of a hypercert denominated in units. + +### Funder + +Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. + +### Hypercert + +A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. + +### Hypercerts interface + +The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. + +### Hypercerts implementation + +An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. + +### Hypercerts standard + +A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Impact + +Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. + +### Impact evaluation + +A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. + +### Impact Funding System (IFS) + +A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. + +### Impact space + +A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. + +### Merging hypercerts + +An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. + +### Minting a hypercert + +Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. + +### Project + +Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. + +### Prospective funder + +Individual, organization, or algorithm that fund work before it is done. + +### Retrospective funder + +Individual, organization, or algorithm that fund work after it is done. + +### Rights + +An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. + +### Set of contributors + +An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of impact + +A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Scope of work + +A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Splitting hypercerts + +An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. + +### Time of impact + +Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Time of work + +A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. + +### Unit + +The smallest possible fraction of a claim. Generally units are grouped in fractions. + +### Work + +Activities that produce impact. + +## Additional Impact Evaluation Terms + +### Auditor + +Individual, organization, or algorithm that evaluates the impact of work after it is done. + +### Beneficiaries + +People or objects that are impacted by work. + +### Evaluator + +Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. + +### Scout + +Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md new file mode 100644 index 00000000..08eb9fcb --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md @@ -0,0 +1,188 @@ +--- +title: Metadata Standard +id: metadata +sidebar_position: 2 +--- + +# Hypercert Metadata Structure + +Hypercerts are represented as [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) tokens. All token instances of a hypercert must share the same ERC-1155 metadata. For sites like OpenSea to pull in off-chain metadata for ERC-1155 assets, your hypercert contract will need to return an IPFS URI that contains all necessary hypercert metadata. + +The hypercert metadata schema follows the [Enjin recommendation](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema) for ERC-1155 metadata. It also includes **six required dimensions** that are necessary to clearly and unambiguously identify the hypercert's impact claim. + +The following are standard ERC-1155 metadata fields. + +## ERC-1155 fields + +| Property | Description | +| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `name` | Name or title of the hypercert. Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. | +| `description` | A human readable description of the hypercert. Markdown is supported. Additional external URLs can be added. | +| `image` | A URI pointing to a resource with mime type image/\* that represents the hypercert's artwork, i.e., `ipfs://`. We recommend images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. | +| `external_url` | [optional] A URL that can be displayed next to the hypercert on webpages like OpenSea and links users to a page that has more information about the project or impact claim. | +| `properties` | [optional] Additional properties (aka attributes) that may be helpful for discovery and curation of hypercerts. Marketplaces like OpenSea will display these properties in the same way as they display rarity traits of NFTs. | + +In order to perform hypercert-specific operations, including split and merge functions, and for your hypercert to robustly claim a set of coordinates in the impact space, there are six additional dimensions that must be included in your metadata. + +## Required Hypercert dimensions + +| Property | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `work_scope` | An _ordered list_ of work scope tags. Work scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any work scope that is explicitly excluded from the claim. | +| `work_timeframe` | Date range from the start to the end of the work in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). | +| `impact_scope` | An _ordered list_ of impact scope tags. Impact scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any impact scope that is explicitly excluded from the claim. The default claim is to "all" impact, giving the owner rights to claim all potential impact created by the work that is represented by the hypercert. | +| `impact_timeframe` | Date range from the start to the end of the impact in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). The default claim is from the start date of work until `indefinite` (i.e., the impact may occur at any point in time in the future). | +| `contributors` | An _ordered list_ of all contributors. Contributors should be itemized as wallet addresses or ENS names, but may be names / pseudonyms. The default claim is to the wallet address that created the hypercert contract. A multisig wallet can be used to represent a group of contributors. | +| `rights` | An _unordered list_ of usage rights tags. The default claim is solely to "public display" of the hypercert, i.e., all other rights remain with the contributors. | + +## Examples + +### Example 1: hypercert with minimal bounds + +Here is an example of hypercert dimensions for work on IPFS with minimal bounds: + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["IPFS"], + "excludes": [], + "display_value": "IPFS" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": [], + "display_value": "All" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1380585600, 1388534399], + "display_value": "2013-10-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1380585600, 0], + "display_value": "2013-10-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["Protocol Labs"], + "display_value": "Protocol Labs" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 2: hypercert with bounded impact claims + +This hypercert is for a carbon removal project that provides a bounded impact scope. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["CO2 in Atmosphere"], + "excludes": [], + "display_value": "CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Example 3: hypercert with excluded impact claims + +Here is an example that explicitly excludes an impact scope to generate a more fine-grained claim. + +``` +"hypercert": { + "work_scope": { + "name": "Work Scope", + "value": ["Protecting Trees in Amazon"], + "excludes": [], + "display_value": "Protecting Trees in Amazon" + }, + "impact_scope": { + "name": "Impact Scope", + "value": ["All"], + "excludes": ["CO2 in Atmosphere"], + "display_value": "All ∧ ¬CO2 in Atmosphere" + }, + "work_timeframe": { + "name": "Work Timeframe", + "value": [1356998400, 1388534399], + "display_value": "2013-01-01 -> 2013-12-31" + }, + "impact_timeframe": { + "name": "Impact Timeframe", + "value": [1356998400, 0], + "display_value": "2013-01-01 -> Indefinite" + }, + "contributors": { + "name": "Contributors", + "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], + "display_value": "0xa1f...000, Project Forest Conservation" + }, + "rights": { + "name": "Rights", + "value": ["Public Display"], + "display_value": "Public Display" + } +} +``` + +### Additional guidelines + +Here are some additional guidelines for defining hypercert dimensions. + +- For most hypercerts, the `work_scope` is best represented as the name of the project or activity. Other information contained in the hypercert, namely, the `contributors` and the `work_timeframe` should provide sufficient context to disambiguate multiple claims from the same project. +- Similarly, for most hypercerts, the `impact_scope` will be most clearly represented as "all" (with an indefinite upper bound on the `impact_timeframe` dimensions). This gives the hypercert creator and its owners the flexibility to make claims about impact that may not have been observable or well-understood when the hypercert was created. + +- It is recommended to browse the `impact_scope` and `work_scope` tags that have already been created and are in use by your or other projects. (We are building a catalog to be available at [hypercerts.org](https://hypercerts.org).) Picking established tags can make it easier for users to discover, curate, and interact with your hypercert. In the long-run, we expect different ontologies to emerge in domains like climate solutions, open source software, etc, and picking more established tags will help prevent overlapping or duplicate claims. +- Tags for work scopes and impact scopes are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. +- Scopes that are explicitly excluded from the hypercert claim are enumerated separately and displayed with the `¬` prefix in the tag. Excluded scopes are not currently displayed on hypercert artwork. +- The order of tags matters only for display purposes. The hypercert artwork will only display a limited number of tags in the `impact_scope` and `work_scope` arrays due to image size and stylistic constraints. +- A `contributor` can be identified using any human-readable string. The base case is to set the `contributors` to the wallet address used to create the hypercert. A multisig wallet can be used to represent a group of contributors. + +### Assigning `rights` + +In version 1.0 of the protocol, only one `rights` tag will be enabled: + +> **Public Display**: owners of the hypercert have the right to publicly display and receive social utility from their hypercert. + +This means that any other rights regarding the work described by the hypercert either remain with the original contributors or are governed by other agreements. + +Additional `rights` including the potential for certain types of transfers to be explicitly enabled will be released in subsequent versions. + +## Optional hidden properties + +Creators may wish to add other fields in their metadata that are not a part of the hypercert claim and are not for display on third-party marketplaces like OpenSea. These can be added by creating a `hidden_properties` field in the metadata. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md new file mode 100644 index 00000000..a767c670 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md @@ -0,0 +1,29 @@ +--- +title: Token Standard +id: token-standard +sidebar_position: 1 +--- + +### Hypercerts as a semi-fungible token + +In order to make the token identifiable, traceable, and transferable, hypercerts are represented as [ERC-1155 tokens](https://eips.ethereum.org/EIPS/eip-1155). The ERC-1155 standard enables a single deployed contract to store many hypercerts, facilitating simpler creation, transfers, as well as splitting and merging of hypercerts within a single namespace. As a semi-fungible token, each unique token represents a fraction of ownership of a hypercert. Hypercerts are then represented as a group of tokens, where the total ownership sums to 100%. In order to easily identify which hypercert a token belongs to, we utilize the upper 128 bits of a 256-bit token ID to identify the hypercert. All tokens within the same hypercert group should share the same [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). + +![hypercert id](../../static/img/hypercert_id.png) + +For illustrative purposes, let us assume that token IDs are just 2 bytes long, where the first byte represents the hypercert ID and the last byte represents which fraction of ownership. Alice could create a new hypercert token 0x2301, representing 100% of hypercert 0x23. If Alice wanted to transfer 20% to Bob, Alice could perform a split operation by minting token 0x2302 and transferring 20% of value to it, such that tokens 0x2301 and 0x2302 represent 80% and 20% ownership respectively of hypercert 0x23. Then Alice transfers token 0x2302 to Bob. Similarly, they could merge these 2 tokens together, back to form a token that represented 100% ownership. In this case, the value of 0x2301 would be transferred to 0x2302, and then 0x2301 is subsequently burned. + +Alice can also choose to split or merge hypercerts along some dimension of the impact space. For example, Alice may split hypercert 0x23 into two new hypercerts — 0x24 representing work done before the year 2000, and 0x25 representing work done after 2000. The original hypercert 0x23 is burned and the two new hypercerts store a reference to the previous hypercert. When the history of splits and merges are indexed, we can easily trace through the provenance of any individual hypercert. + +### Claim Data + +Hypercert claim data, such as scope of work and the contributor list, is encoded in JSON format into the [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). Claim data can be stored on-chain alongside the token, or in off-chain storage such as IPFS. For details on the JSON schema and how off-chain storage can be utilized, see the [hypercerts-sdk repository](https://github.com/hypercerts-org/hypercerts/tree/main/sdk). + +When considering whether to store hypercert metadata on-chain or off-chain, we can consider the different trade-offs to the user experience and cost, which may differ depending on which blockchain is being used. Storing data off-chain saves on costs, but could lead to on-chain claims without the metadata. Storing data on-chain adds additional security that the claims will not be forgotten but can lead to higher gas fees. + +Beyond the standard fields of hypercerts that locate the hypercert in the impact space, additional fields can be added. This allows for different templates in different impact areas, such as AI safety or biodiversity, as different additional information will be useful. Importantly, however, all hypercerts will be located in a single impact space – the additional fields do not change that. + +### Multi-chain support + +We expect hypercerts to exist in a multi-chain ecosystem, where the local deployment can be used to support the unique funding systems of that community. In order to visualize a single global impact space, we index the different contract deployments across chains and surface any potential hypercert claim conflicts. Because different blockchains support different subsets of programming languages, we do expect different implementations of the hypercert protocol to exist. However, they must adhere to the same hypercert data model to be indexed into the impact space. + +In order to decide which deployments to index into the hypercerts impact space, decentralized governance institutions will be used to govern the list of contract addresses used across all blockchains. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/intro.md new file mode 100644 index 00000000..0c4d7ca3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/intro.md @@ -0,0 +1,58 @@ +--- +title: What Are Hypercerts? +id: intro +--- + +# What are hypercerts? + +### Hypercerts are a new token standard for tracking and rewarding positive impact. + +Each hypercert represents a unique impact claim capturing the following information: + +- a scope of work and its corresponding scope of impact +- a set of time frames for both the work and its impact +- a set of contributors – the organization or people behind the work +- a set of rights you get by owning a hypercert + +The hypercert itself is an ERC-1155 semi-fungible token with the information above stored as metadata on IPFS. Here’s an example. + +### Hypercert example + +#### Graphic representation + +![hypercert design example](../static/img/hypercert_example.png) + +#### Supplementary information (metadata) + +- **Title of hypercert:** Invention of the InterPlanetary Filesystem (IPFS) +- **Description:** The InterPlanetary File System (IPFS) is a set of composable, peer-to-peer protocols for addressing, routing, and transferring content-addressed data in a decentralized file system. +- **Link:** ipns://ipfs.tech/ + +#### Hypercert dimensions (metadata) + +- **Set of contributors:** 0xb794f5ea0ba39494ce839613fffba74279579268 _(example Ethereum address)_ +- **Scope of work:** IPFS ∧ ¬ go-ipfs +- **Time of work:** 2013-01-01 --> 2013-12-31 +- **Scope of impact:** All +- **Time of impact:** 2013-01-01 --> indefinite +- **Rights:** Public display + +### Why should you care? + +We spend trillions of dollars every year on public goods via governmental agencies, foundations, private donations and corporate spendings; however, we don’t effectively track this work – leaving us in the dark, hoping that it actually has the intended positive impact. + +We believe we can do better: + +- We should start by tracking this work consistently – this is what hypercerts are for. +- We should evaluate how impactful that work was – this is what the open evaluation system of hypercerts supports. +- We should reward the work that was exceptionally impactful – this is what the public display of hypercerts and retrospective funding is for. + +Doing this would unfold powerful incentives. Retrospective funding 1) provides incentives for creators to take on public goods projects with a potentially high, but uncertain, impact, 2) enables feedback loops to learn from successes and failures, and 3) attracts more talent to the public goods sector by improving performance-based compensation. + +While we are excited about the prospects of retrospective funding, hypercerts do not impose any specific funding mechanisms, but start with tracking the work that is supposed to be impactful. As a database for many funding mechanisms this facilitates experimentation and interoperability between funding mechanisms. + +### Next + +Curious and want to learn more? Head over to the [whitepaper](whitepaper/whitepaper-intro.md) to dive deeper into the world of hypercerts. + +Or do you want to get started right away? Head to the [minting guide](minting-guide/minting-guide-start.md). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md new file mode 100644 index 00000000..1ad2310a --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md @@ -0,0 +1,166 @@ +--- +title: Gitcoin Alpha Round Instructions +id: gitcoin-round +sidebar_position: 3 +--- + +# Gitcoin Alpha Round Instructions + +## Overview + +- all projects in the Gitcoin Alpha Round are invited to mint a hypercert for their work +- anyone who gave over $1 to a project is automatically allowlisted for that project’s hypercert +- 50% of each hypercert is distributed to the funders, 50% is kept by the project and can be transferred later +- each project has a custom URL to make minting super easy (the link is sent directly to each project) +- everything runs on Optimism (users only need to pay L2 gas costs) + +:::info +If your project participated in the Gitcoin Alpha Round, but you didn't get a message with a custom URL, please reach out to team[at]hypercert.org. +::: + +## Hypercerts x Gitcoin Alpha Round + +Now that Gitcoin’s Alpha Round has officially closed and the funding distribution is finalized, we are inviting all eligible projects that participated to mint a hypercert for their past work and to allocate fractions of their hypercert to a list of supporters. + +We’ve created a dApp that pulls all of the data required to mint your hypercert directly from Gitcoin’s Grant Protocol. You can fine-tune the properties, tweak your artwork, and review the distribution mechanism. Once you’re ready, hit the create button and your hypercert will be released into the ethers! + +Once your hypercert has been minted, the people who supported your project with a contribution of at least $1 DAI on Gitcoin’s Alpha Round will be able to connect and claim their fractions. + +A few important notes about the Alpha Round: + +- The total units of a hypercert is based on the total donations; each funder get awarded units proportional to their donations. +- Transfers will be restricted to one transfer from the project to the supporters. +- There will be no additional rights awarded to the funders except the right to "public display" their support for the project. + +## Instructions + +The following guidance is only for projects that receive a custom URL that pre-populates the hypercerts form based on their Gitcoin Grants' data. + +It explains the default settings in the form and recommends fields that the creator may choose to update or edit. + +:::note +Gitcoin Grant hypercerts are for retrospective work, i.e., they are intended to capture work that happened between Gitcoin Grants Round 15 (September 2022) and the Alpha Round (January 2023). Therefore, the work time period is always set to past dates. (You might need to adjust the name and description to also refer to past work only.) We are focusing solely on retrospective hypercerts for this round as part of broader efforts to promote retrospective funding; you can read more about it [in the whitepaper](whitepaper/retrospective-funding.md). +::: + +### General Fields + +#### Name of Hypercert + +This field is set by default to the name of your project on Gitcoin Grants. You can edit this to be more specific. Given that your project may create numerous hypercerts over time, consider giving each hypercert a name that represents a more discrete phase or output. + +#### Logo + +This field is set to the icon artwork provided for your project on Gitcoin Grants. If there was an error accessing your icon, you will see a generic icon. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +#### Background Banner Image + +This field is set to the banner artwork provided for your project on Gitcoin Grants. If there was an error accessing your banner, you will see a generic Gitcoin banner. + +You can update this by providing a new URL and the hypercert artwork should update automatically. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +#### Project Description + +This field is set by default to the description of your project on Gitcoin Grants. Review closely -- a long project description in your Gitcoin Grant description will be truncated. + +You may edit this to provide more details about your work and to remove information that is targeted solely at Gitcoin Grants users. This is also a good place to provide other links, such as Github repos or social media accounts, where the general public can learn more about the work. Please aim for a project description that is less than 500 characters. + +:::note +The project description should refer to **past work**, not future work that you would like to do with additional funding. +::: + +#### Link + +This field is set to the first external URL provided for your project on Gitcoin Grants. You can update this. + +### Hypercert Fields + +#### Work Scope + +This field is set by default to a **shortened version** of the name of your project on Gitcoin Grants. You may edit or add additional work scope tags. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +#### Work Start/End Dates + +The start date has been set by default to the `2022-09-22` for all projects on Gitcoin Grants. This date coincides with the end of Gitcoin Grants Round 15. + +The end date references the last update to your grant page on Gitcoin Grants. + +You may edit or update these fields, however, the end date may not extend beyond `2023-01-31` (the close of the funding round) as all hypercerts will be retrospective in this round. + +#### Set of Contributors + +This field is set by default to the wallet address that is set as the recipient address for receiving Gitcoin Grants funding. + +:::note +You should review this field closely and – if applicable – provide the addresses of additional contributors. +::: + +### Advanced Fields + +#### Impact Scope + +This field is set by default to `all`. + +Updates are currently disabled on the frontend because funding decisions on Gitcoin Grants were not specific to an impact scope or impact time period. + +#### Impact Start/End Dates + +This field is set by default to the work start date of `2022-09-22` (see above) and a work end date of `indefinite`. Updates are currently disabled on the frontend. + +#### Rights + +This field is set by default to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +Updates are currently disabled on the frontend. + +### Distribution + +#### Allowlist + +This field is set by default to a custom allowlist generated for each project based on the funding it received on the Gitcoin Grants Alpha Round. You should not need to update this field. If there is a problem with your allowlist, please contact us. + +50% of the hypercert will be allocated according to this allowlist. The other 50% will be kept by the project, i.e. it is allocated to the address that mints the hypercert. You will be able to transfer or sell these fractions later as long as they are owned by the minter. This means that they can only be transferred or sold once. + +The formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. + +For example: + +- $5.60 donated --> 5 fractions +- $5.20 donated --> 5 fractions +- $0.96 donated --> 1 fraction +- $0.52 donated --> 0 fractions + +The queries used to generate the allowlists can be viewed here: + +- ETH Infra: https://dune.com/queries/1934656 +- Climate: https://dune.com/queries/1934689 +- OSS: https://dune.com/queries/1934969 + +Donors who contributed to the matching pool for each round are also eligible to claim hypercerts. + +:::note +You are free to edit your allowlist. You can do this by following the step-by-step instructions [here](minting-guide/step-by-step.md). Just remember that you will need to upload the new allowlist in a CSV format to a storage site like [web3.storage](https://web3.storage) and then update the link in the allowlist field. Contact team[at]hypercerts.org if you need help. +::: + +### Confirmations + +#### Contributors' permission + +Every contributor needs to agree to have their contribution be represented by a hypercert. This is why the person minting the hypercert has to confirm to have the permission of all listed contributors. + +#### Terms & Conditions + +The terms & Conditions can be found [here](https://hypercerts.org/terms). + +### Final step: Click "Create" + +Make sure your Optimism wallet or multi-sig is connected. Click on "create" and wait for your hypercert to be created. Congratulations! diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md new file mode 100644 index 00000000..47e8ad7c --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md @@ -0,0 +1,44 @@ +--- +title: Getting Started +id: minting-guide-start +sidebar_position: 1 +--- + +# Getting started + +### How to create a hypercert + +Creating a hypercert is similar to creating an NFT on sites like OpenSea or Zora. + +In this article, we’ll walk through the steps one by one and explain exactly what you need to do to create your first hypercert. + +There are typically two ways of creating a hypercert: + +1. As a project affiliated with a specific funding network (e.g., Gitcoin Grants): In this case, you should receive a custom URL from the funding network that pre-populates most of your hypercert fields. You will still be able to change most of these, so you should review and adjust them as needed to better describe your hypercert. Guidance on how to do so (for Gitcoin Grants projects) is provided at the end of this doc. +2. As a project not affiliated with a specific funding network: In this case, you will be creating a hypercert from scratch and filling in each field on your own. Read on below. + +### Who can create a hypercert? + +Anyone doing work that is intended to have a positive impact can create a hypercert. Your hypercert can be as simple as "I did X on this date and want to claim all future impact from it". + +It can also represent something more, such as a phase in an ongoing team project, an invention or discovery, a research publication, or an important software release. + +Critically, if the work was done by more than one person, then each person should be listed as a contributor to the hypercert and approve the creation of the hypercert. + +_Note: In the future, the approval of each contributor will be verified on-chain._ + +### What do I need to create a hypercert? + +You will need to prepare all of the information required in the form builder (see **Step-by-step instructions for creating a hypercert** below). This includes important metadata, such as a description of the project and the dimensions of your impact claim, as well as a project artwork. You may also want to include an allowlist of wallets that are approved to claim one or more fractions of the hypercert. + +In addition to the information regarding the hypercert itself, you’ll need a crypto wallet to mint your hypercert. “Minting” a hypercert is the process of writing an impact claim to the blockchain. This establishes its immutable record of authenticity and ownership. + +Next, choose a blockchain on which to mint your hypercert. The hypercerts protocol is available on Ethereum, Goerli (testnet), and Optimism. Each of these blockchains has different gas fees associated with transactions on their networks. To reduce gas fees we recommend Optimism for most projects. + +Finally, go ahead and create your hypercert. + +### How much does it cost to create a hypercert? + +You will need enough Ethereum in your wallet to cover gas fees. In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). + +The protocol currently does not offer gas-free or "lazy" minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md new file mode 100644 index 00000000..9f3b6303 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md @@ -0,0 +1,130 @@ +--- +title: Step-by-step Instructions +id: step-by-step +sidebar_position: 2 +--- + +# Step-by-step instructions + +First, go to the [Create Hypercert](https://hypercerts.org/app/create) site with a wallet-enabled browser or follow the custom URL you received to access a prepopulated form. + +Although the site works on mobile, it is easier to use on desktop because the browser will display a dynamic preview of the hypercert while you fill out the Create form. + +Next, connect your wallet. You will be prompted to switch to the Ethereum or Optimism network. + +Once you've connected, you will see an empty form for creating a hypercert. + +### General fields + +#### Name of Hypercert + +Enter the name or title of the hypercert. This is the place to be verbose and specific about what the project is doing. You'll see on the preview when your title becomes too long. + +Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. + +Names are restricted to 100 characters but may include emojis (:smile:), accents (é), non-Latin scripts (表情), and other Unicode characters. + +#### Project Description + +Enter a human readable description of the hypercert. This is the place to share more details about the work and the team or individual behind the work. + +The description field supports [Markdown syntax](https://www.markdownguide.org/cheat-sheet/) and has a limit of 10,000 characters. + +In addition to the main link (see next field) you can add further links in the markdown to help others to understand the work of the project. + +#### Link + +A valid URL for the project, beginning with https:// + +This will be displayed next to the hypercert on webpages like OpenSea and should link users to a page that has more information about the project or impact claim. + +#### Logo + +An icon for the top left part of the card. This could be your project logo. It will be automatically masked to the shape of a circle. + +Logo images look best with an aspect ratio of 1.0 (square-shaped). + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +#### Background Banner Image + +A background image that will extend across the upper half of the artwork. This could be your project masthead or a unique piece of art. + +Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. + +Currently we don't support zoom / cropping, so you will need to test the look and feel on your own. + +The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. + +### Work Scope fields + +#### Work Scope + +One or multiple tags describe the work that the hypercert represents. This work scope will be used to identify the work that is included in the hypercerts and the work that is not included. + +Multiple tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. + +For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. + +_Note: In the future, you will be able to specifically exclude work from the hypercert._ + +#### Start and End Date of Work + +The work time period defines when the work was done that the hypercert represents, i.e., only the work in this time period is included in the hypercert. + +The time period of work doesn't need to be the start and end date of a project, but it can be. One project can be split up into multiple hypercerts, e.g. all hypercerts can have the same `work scope`, but different time periods of work. Of course, the time periods are not allowed to overlap. + +### Impact scope fields + +#### Impact Scope + +The impact scope can be used to limit the impact that a hypercert represents, e.g. for the work scope `Planting trees` a hypercert can represent _only_ the impact on biodiversity by including the impact scope tag `Biodiversity`. This would exclude all other impacts, including the impact on CO2 in the atmosphere, which can be useful if that impact is already captured by a carbon credit. + +By default this is set to "`all`" and we strongly recommend keeping it that way. + +Just like the work scope, multiple impact scope tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction). + +#### Start and End Date of Impact + +The impact time period is another way to limit the impact that a hypercert represents, e.g. inventing a new medical treatment has a positive impact over many years, but we might want to capture the positive impact separately for each year. + +By default the `impact start date` is the same as the `work start date` and the `impact end date` is "`indefinite`", i.e., the impact is not restricted time-wise. We strongly recommend keeping it that way. + +### Set of Contributors + +Provide a list of contributors, one per line, or comma-separated. + +The list should include _all_ contributors that performed the described work. + +Contributors are generally itemized as wallet addresses or ENS names, but can also be names / pseudonyms. Groups of contributors can be represented by a multisig or name of an organization. + +### Owners + +#### Allowlist + +The allowlist allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions afterwards. For example, it can be used to allocate fractions to previous funders and contributors. + +The allowlist is implemented as a CSV file specifying `index,address,price,fractions` headers. + +| index | address | price | fractions | +| ----- | ------------------------------------------ | ----- | --------- | +| 0 | 0x5dee7b340764c49a827c60d2b8729e49405fbefc | 0.0 | 100 | +| 1 | 0x1e2dbb9ca3f6d48e085384a821b7259abfdc7d65 | 0.0 | 50 | +| ... | ... | ... | ... | +| 999 | 0x436bad18642f45d3fa5fcaad0a2d81764a9cba85 | 0.0 | 1 | + +The `price` field is denominated in ETH. This should remain at 0.0 for all hypercerts, as primary sales are not currently supported through the app and the secondary sale/transfer of hypercerts is currently not allowed. + +You can store your allowlists on IPFS using [web3.storage](https://web3.storage/). + +:::note +If your allowlist is not properly formatted, you will be unable to mint your hypercert. If you do not include an allowlist, then the creator of the hypercert will receive 100% of the hypercert (set to a default of 10,000 units), which you can then sell or transfer to another wallet a maximum of one time. +::: + +#### Rights + +This field defines the rights that owners of the hypercert have over the work being claimed by this hypercert. + +By default this is set to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. + +_Note: In the future, additional rights can be included for different hypercerts._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md new file mode 100644 index 00000000..87fb9194 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md @@ -0,0 +1,23 @@ +--- +title: Open Impact Evaluations +id: evaluation +sidebar_position: 5 +--- + +A key design element is that hypercerts themselves do not make a claim about the size of the impact, but only account for the work that is supposed to be impactful. The figure below shows this contrast in a simplified illustration of the example that we introduced above. The open evaluation system allows multiple evaluations to point at the same area of the impact space that a hypercert claims. The evaluations can include self-evaluation from the contributors themselves. Funders observe these and make their funding decisions based on this richer set of information. + +![hypercert evaluations](../../static/img/hypercert_evaluations.png) + +The open evaluation system is also used to provide additional information, e.g. an evaluator or the project itself provides information about the health of the trees. This information can then be used transparently by other evaluators to evaluate the impact on CO2 in the atmosphere. + +An important feature is that the evaluations do not directly point at a hypercert, but rather at an area in the impact space. In practice this area will mostly be the exact same area that a hypercert claims, such that it can be considered an evaluation of the hypercert, but it does not have to. This feature ensures that, if hypercerts are merged or split, previous evaluations will continue to be linked appropriately. + +The form of evaluations can be standardized to simplify handling and comparing multiple evaluations from multiple evaluators. The open evaluation system allows for templates to be created and used by any evaluators. Similar to the emerging ontologies, these are not enforced centrally, but should emerge as useful standards – potentially steered by decentralized governance institutions. + +Important characteristics of the open evaluation system are: + +- Evaluators can submit multiple evaluations of the same area in the impact space as more information becomes available +- Evaluations can challenge other evaluations +- Evaluation methodologies can evolve over time + +These features allow the whole evaluation system to be dynamically improved by each actor. The relevant incentives for this improvement will stem from the funders who will value the signals from some evaluators more than others and evaluators are able to build up reputation. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md new file mode 100644 index 00000000..8acc11d1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md @@ -0,0 +1,104 @@ +--- +title: "Hypercerts: a New Primitive for Impact Funding Systems" +id: hypercerts-intro +sidebar_position: 3 +--- + +### Defining hypercerts + +A hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and represents all or parts of that impact. A hypercert has the following fields (one for each dimension): + +1. **Set of contributors:** An ordered list of all contributors, who claim to do or have done the work described by this hypercert. +2. **Scope of work:** A conjunction of potentially-negated work scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +3. **Time of work:** A date range, from the start to the end of the work being claimed by this hypercert. +4. **Scope of impact:** A conjunction of potentially-negated impact scope tags, where an empty string means “all”: + +``` + ::= AND | " " + ::= | NOT +``` + +5. **Time of impact:** Date ranges from the start to the end of the impact. +6. **Rights of the owners:** An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. + +Implementing hypercerts as a semi-fungible token allows multiple contributors and funders to own parts of hypercerts. For instance the original contributors can award 10% of a hypercert to a funder, while keeping 90%, which they can award to other funders later. This is why hypercerts are fractionalizable. + +### Examples + +In the simplest cases of hypercerts, the scope of work and impact as well as the time of impact are not restricted and no rights are transferred to owners of the hypercerts, i.e. the hypercerts just define the who (set of contributors) and when (time of work) of the claimed work. Scope of work and impact would be set to all, time of impact to “indefinite” and the rights to only “public display of support”. The latter is always included as the hypercert is a public record, such that owners will always automatically display their support of the work. + +Take for example hypercert 1 below: It represents all work that contributor 1 has performed in 2013 with all the impact that the work had from the beginning of the work; the hypercert doesn’t give any additional rights to the owners of the hypercert. + +The other fields – except the rights field – can be used to limit the work or impact that is represented by the hypercert. Hypercert 2 limits this to the work on IPFS in 2013, i.e. any other work besides IPFS that contributor 1 performed is not included. Hypercert 3 limits it even further as it excludes a specific aspect of IPFS, the go-ipfs implementation. + +| | **Hypercert 1** | **Hypercert 2** | **Hypercert 3** | +| ----------------------- | ------------------------- | ------------------------- | ------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | all | IPFS | IPFS ∧ ¬ go-ipfs | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | all | all | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → 2013-12-31 | +| **Rights** | Public display of support | Public display of support | Public display of support | + +In the table below we illustrate a use case for limiting the scope of impact. Suppose contributor 1 protects trees in a certain area. This work has positive effects on the CO2 in the atmosphere and could turn into carbon credits; however, the trees have additional positive impacts, such as protecting biodiversity. Instead of including all positive impacts in one hypercert (hypercert 4), the impact can be split between the impact on CO2 in the atmosphere (hypercert 5) and all other positive impacts (hypercert 6). If funders are willing to pay for biodiversity, this would be a new income opportunity. And it would account for the additional positive impact that other methods of reducing CO2 might not have, like industrial carbon capture. Importantly, negative impacts can not be excluded from a hypercert. + +| | **Hypercert 4** | **Hypercert 5** | **Hypercert 6** | +| ----------------------- | -------------------------- | -------------------------- | -------------------------- | +| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | +| **Scope of work** | Protecting trees in area X | Protecting trees in area X | Protecting trees in area X | +| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | +| **Scope of impact** | all | CO2 in atmosphere | all ∧ ¬ CO2 in atmosphere | +| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → indefinite | +| **Rights** | Public display of support | Public display of support | Public display of support | + +Importantly a hypercert does not specify the “size” of the impact, e.g. a hypercert does not state “5 tons of CO2 removed from the atmosphere.” Instead the hypercert only defines the work, e.g. “200 trees protected” (scope of work) in 2022 (time of work). The size of the impact is then left to the evaluations of the “CO2 in the atmosphere” (scope of impact) in 2022 (time of impact) that point towards the covered region of the hypercert. For instance: This allows a self evaluation to claim that 5 tons of CO2 were removed in a given year as well as one or multiple evaluations from independent auditors to confirm or challenge how much CO2 has been removed. An evaluator could detect that some of the trees were not healthy and hence only 4 tons of CO2 were removed. Allowing for multiple evaluation is a defining characteristic of the open evaluation system. + +### Functions of hypercerts + +#### 1. Identifiability + +Hypercerts clearly define the work that is supposed to be impactful by creating a record of who (set of contributors) claims to do or have done what (scope of work) in what time period (time of work). They also allow the creation of multiple records of the same work to identify separate impacts that this work had or will have (scope of impact) over specified time periods (time of impact). + +#### 2. Traceability + +As these records are public and logically monotonic (immutable, except to split or merge hypercerts), records are durable and permanent. + +#### 3. Transferability + +The records are a digital object that can be owned and ownership can be transferred (under specific conditions). As hypercerts can be created as fractionalizable, it is also possible to transfer only a specified fraction of the hypercert. Each hypercert defines the rights over the defined work that owners have, such as rights to retrospective rewards, rights to public display of the support (“bragging rights”) or rights to passive income from intellectual property. + +:::note Transferability restrictions + +Hypercerts are generally transferable. However, there are use cases, in which minters of hypercerts want to restrict how their hypercerts can be transferred. The protocol allows the minter to restrict who can transfer the hypercert and/or to whom the hypercert can be transferred. For instance, by specifying that only the original owner can transfer the hypercert, any future owner is prohibited from selling it, i.e. a secondary market would not exist for this hypercert. + +::: + +### Merging hypercerts + +Besides the fungible dimension, hypercerts can be merged and split on any of the six dimensions as shown in box 1. Let us take the hypercert 1 from the section "Hypercerts definition" and focus only on two of the dimensions, scope of work and time of work. These two dimensions create a simplified impact space. The figure below shows how work on IPFS (InterPlanetary File System) could have been minted over time in separate hypercerts, one for each quarter of work. + +![minting hypercerts example](../../static/img/creating.png) + +We created five hypercerts, one for each quarter of work. As the resulting work of all of these together is IPFS 0.1, the merged hypercert in total is more meaningful and more valuable than just the five individual hypercerts. In this case the proverb is true, the whole is greater than the sum of its parts. Hence, we want to merge them as shown in the next figure. + +![merging hypercerts example](../../static/img/merging.png) + +### Splitting hypercerts + +Conversely, splitting can increase the meaningfulness and value of hypercerts as well. We can split the work on IPFS 0.1 into the conceptual work “invention of IPFS” and the implementation via “go-ipfs 0.1” as shown in the next figure. + +![splitting hypercerts examples](../../static/img/splitting.png) + +Other use cases are where multiple contributors want to combine their work on the same scope of work (merging) or disentangle their work (splitting). Ultimately, splitting and merging allows users to repackage the digital representation of their work and impact. + +Importantly, splitting and merging are the only operations that are permitted to change hypercerts. Once an area in the impact space is claimed, it can not be unclaimed. This ensures that claims are never forgotten. + +### Retiring hypercerts + +While a claim in the impact space can not be unclaimed, it can be retired. Retiring a hypercert means that owners can not transfer and sell it anymore. This way owners prove that they are the final buyers of the impact. Technically retiring hypercerts means that they are sent to a specific null address, which ensures that the retired hypercerts are recorded and traceable. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md new file mode 100644 index 00000000..6f71ac50 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md @@ -0,0 +1,103 @@ +--- +title: The Need for Interoperable Impact Funding Systems (IFSs) +id: ifs +--- + +# The Need for Interoperable Impact Funding Systems (IFSs) + +### An IFS consists of + +- **Actors:** Contributors, funders, evaluators, and beneficiaries +- **Funding mechanisms:** Grants, bounties, retrospective funding, etc. +- **Coordination mechanisms:** Roadmapping, communication forums, etc. +- **A goal:** Maximize the domain-specific positive value created (impact) + +The goal will be specific to the impact area, e.g. prevent existential risks from artificial intelligence (AI) would be the goal for the impact area “AI safety.” To achieve these goals, skilled contributors must work with high effort on promising projects. Additionally, for those projects that create impact continuously, sufficient income streams are necessary to cover both their ongoing operating expenses and contributors’ upside incentives. + +#### Actors in IFSs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeSubtypeDescription
    ContributorsPeople or organizations who do the work
    FundersProspective fundersPeople or organizations who fund work before it is done
    Retrospective fundersPeople or organizations who fund work after it is done
    EvaluatorsScoutsPeople or organizations who evaluate the potential impact of work before it is done
    AuditorsPeople or organizations who evaluate the impact of work after it is done
    BeneficiariesPeople or objects that are impacted by the work
    + +### Guiding questions for designing IFSs + +1. **Projects:** How can we improve the chances that the most promising projects are worked on? +2. **Talent & resources:** How can we attract top talent to contribute to the most promising projects and provide them with the necessary resources? +3. **Effort:** How can we reward contributors for their impact on outcomes? +4. **Sustainable income:** How can we create recurring income streams and financial sustainability for impactful projects? + +Markets have been proven very powerful in answering these questions if they are directed towards maximizing profits. As we are directing systems towards maximizing impact, these answers become more challenging. In particular, in an IFS we are facing coordination and incentive problems in funding impact, such as the free-rider problem. + +### Example dynamics between actors in an IFS + +In order for impact funding systems to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources and (3) evaluations. In the diagram below you see a potential dynamic between the actors of an IFS. In that scenario hypercerts can account for the prospective funding (steps 2-3) as well as for the retrospective funding (steps 8-9) from different funders. Evaluations are made public and can be discovered through the hypercerts for all funders (steps 5-7). Retrospective funders can reward not only the contributors but also the prospective funders (steps 10-11). + +```mermaid +sequenceDiagram + autonumber + participant Beneficiaries + participant Contributors + participant Prospective funders + participant Retrospective funders + participant Evaluators + Contributors ->> Contributors: Mint hypercerts + Prospective funders ->> Contributors: Award funding + Contributors ->> Prospective funders: Award fractions of
    the hypercert + Contributors ->> Beneficiaries: Create impact + Retrospective funders ->> Evaluators: Fund evaluation + Evaluators ->> Beneficiaries: Evaluate impact on beneficiaries + Evaluators ->> Retrospective funders: Make evaluations public,
    esp. for retrospective
    funders + Retrospective funders ->> Contributors: Award funding + Contributors ->> Retrospective funders: Award fractions of hypercerts + opt + Retrospective funders ->> Prospective funders: Award funding + Prospective funders ->> Retrospective funders: Transfer fractions
    of hypercert + end +``` + +### Hypercerts as a data layer for IFSs + +By serving as a single, open, shared, decentralized database hypercerts lower the transaction costs to coordinate and fund impactful work together. This is important because the optimal funding decisions of a single funder depends on the funding decision of all other funders. For instance, some work is only impactful if a minimum funding is provided: The impact is non-linear in the funding amount, e.g. half a bridge is not half as impactful as a full bridge. Other work might be over-funded, i.e. the impact of an additional dollar is basically zero. Ultimately, funders want to find the highest impact for each additional dollar spend (cf. S-process as in Critch, 2021). Today multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Through hypercerts the funding becomes more transparent and the credits for funding impactful work can be easily shared. Coordinating funding becomes easier. + +Hypercerts don’t solve this coordination problem by themselves, but build the basis for different decision and funding mechanisms as shown below. Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. Hypercerts do not lock in any particular decision-making scheme for funders. + +![Hypercerts as a data layer for an IFS](../../static/img/hypercert_data_layer.png) + +Looking farther into the future: If a large majority of funding across an entire IFS ends up flowing through hypercerts, funders have created the transparency that enables each of them to make the best decisions given the funding decision of everyone else. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md new file mode 100644 index 00000000..f8fed762 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md @@ -0,0 +1,35 @@ +--- +title: A Consistent Impact Space +id: impact-space +sidebar_position: 4 +--- + +Every hypercert represents a claim in the impact space, which itself represents all possible claims. Above we illustrated the impact space with two dimensions, scope and time of work. The complete impact space is spanned by the six dimensions introduced in the definition of hypercerts. + +### Consistency of the impact space + +Every point in the impact space should either be claimed or not be claimed. No point must be claimed twice, or equivalently: + +- If the impact of some work is represented in one hypercert, it must not be part of any other hypercert. +- Hypercerts must not overlap with each other. + +The table below shows two hypercerts that were illustrated in the section on "Hypercerts operations", but now with all six fields. The two hypercerts can represent the exact same work by the same contributor, but they do not overlap because of the difference in the time of work. + +| | **Hypercert 7** | **Hypercert 8** | +| ----------------------- | ------------------------ | ------------------------ | +| **Set of contributors** | Contributor 1 | Contributor 1 | +| **Scope of work** | IPFS | IPFS | +| **Time of work** | 2013-10-01 to 2013-12-31 | 2014-01-01 to 2014-03-31 | +| **Scope of impact** | all | all | +| **Time of impact** | 2013-10-01 → indefinite | 2014-01-01 → indefinite | +| **Rights** | None | None | + +The consistency of the impact space is crucial as it ensures that no rights to an impact claim are sold twice. If for example someone owns the right to retrospective rewards for the impact of some work, the owners must be identifiable unambiguously. + +Because users can create hypercerts with arbitrary data on any chain, on which a hypercert contract is deployed, we provide ways to help users detect collisions in the impact space. For example, if one hypercert on Ethereum points to the work on “IPFS”, and another hypercert on Filecoin points to the work on “https://github.com/ipfs/go-ipfs” both with the same contributor and time of work, which of these overlapping hypercerts is the correct one to support? To surface such overlapping hypercerts, the hypercerts protocol and SDK will support mechanisms to index, search, and visualize neighbors in the impact space. With these tools evaluators can quickly detect potential conflicts and submit the results as evaluations to help disambiguate proper credit and attribution. + +### Emerging ontologies + +Common ontologies for the scope of work and scope of impact are useful to create transparency and improve discoverability. Such ontologies need to be created from the practices and should be adapted over time. They are like emerging norms, instead of fixed rules. However, some larger players or a group of smaller players could enforce certain ontologies, e.g. if multiple funders agree that they only fund projects that follow a specified ontology. + +As some ontologies might be more useful than others, we would ideally see a consensus emerge between participants and experts in each impact area. Decentralized governance institutions can help facilitate this; however, further details on the design are out of the scope of this paper and are left for future work. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md new file mode 100644 index 00000000..57444581 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md @@ -0,0 +1,42 @@ +--- +title: Retrospective Impact Funding +id: retrospective-funding +sidebar_position: 6 +--- + +### Introducing retrospective funding + +While hypercerts do not impose any specific funding mechanisms, they are especially useful for retrospective funding. The core idea, from the perspective of contributors building impactful goods, is this: if you can reasonably expect to get funded retrospectively for your work once you produce a positive impact, then you can work now, in expectation of a probabilistic future cash flow. In another conception, you are effectively “borrowing” money from this anticipated future cash flow to fund the work in the first place; the expectation of future funding “retro-causes” the impactful work. Retrospective funding may be able to 1) provide incentives for contributors to take on impactful goods projects with a potentially high, but uncertain, impact and 2) create a more efficient IFS by back-propagating signals on what outcomes were impactful post-hoc. + +In addition, contributors are able to receive fair compensation by providing outsized impact that will be highly valued. It incentivizes you to create a positive impact, beyond your intrinsic motivation. This does not mean that the most successful contributors to impactful goods automatically have potential upside comparable to some for-profit startup founders (or that they should), just that their potential upside does depend on how much funders later value their past work. This will attract more talent to the impact sector by improving performance-based compensation. + +The crucial aspect for this to work: funders need to retrospectively fund impact, and send credible signals that they will do so in the future. Based on these signals contributors form expectations about future retrospective rewards and can start working today to receive them in the future. + +Hypercerts facilitate retrospective funding as the impact claims are identifiable, traceable and transferable. Contributors can sell parts of their hypercerts to prospective funders to receive the necessary funding for their project (“activity” in the figure below). The project delivers impact to a larger group (“beneficiaries”), which retrospectively buys the hypercerts from the prospective funder, and from the contributors if they retained some fraction of their hypercerts (the latter is not represented in the figure). + +![Retrospective funding with hypercerts](../../static/img/retrospective_funding.png) + +### Increasing rewards + +Retrospective funding allows us to increase rewards as more impact is created because impact is easier to observe, measure and prove retrospectively. Increasing rewards – as shown in the next figure – incentivizes contributors to put in their highest effort to produce impact and enables contributors to be rewarded for their talent. Moreover, prospective funders are incentivized to select, fund and support the projects with the highest expected impact, if they also receive retrospective rewards. + +![Increasing rewards](../../static/img/increasing_rewards.png) + +Note that retrospective funding should not be used in cases where a significant negative impact is possible since a nongovernmental, permissionless framework can not impose retrospective penalties for negative externalities. See Ofer & Cotton-Barratt (2022) for a discussion of this limitation of retrospective funding. + +In some cases we do not expect the retrospective evaluation to be any different than the prospective evaluation, i.e. there is no uncertainty resolved over time as the impact of an activity is already “known” prospectively. In these cases retrospective funding would only complicate the funding mechanism and funding via grants or milestone bounties would be preferable. Retrospective funding is preferable only if uncertainty is resolved over time. + +### Impact evaluations + +The relevance of impact evaluations will depend on how much their signals influence the funding decisions of retrospective funders (see the potential dynamics in the section on "IFSs"). This is a critical difference to many impact reports today: If a project was funded by a grant, the funders as well as the project want to receive a positive evaluation. If, however, the funding decisions of the retrospective funders are outstanding, they are interested in truthful signals about the impact. Hence, funders value improvements in evaluation methodologies and can fund independent evaluators. Evaluators in turn would build up a reputation for their evaluation methodologies and improve the strength of their signals to retrospective funders. + +Impact evaluators can take on a range of forms ranging forms, such as + +- Voting by relevant communities or beneficiaries +- Expert panels +- Professional evaluators similar to financial rating agencies +- Automatic monitoring and data collection by sensors and oracles + +The most useful form or combinations thereof will depend on the specific requirements of the impact area. For a generalized framework on impact evaluators see Protocol Labs (2023). + +While retrospective funding makes impact evaluations financially relevant for funders and contributors, hypercerts enable to pre-commit funding for those evaluations: As impact claims are never forgotten, any actor can at any time commit funding to a future evaluation of these claims. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md new file mode 100644 index 00000000..4d4648ba --- /dev/null +++ b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md @@ -0,0 +1,24 @@ +--- +title: Introduction +id: whitepaper-intro +--- + +# Vision & Whitepaper + +:::note + +If you prefer to read the draft whitepaper (v0) as a pdf, you can find it [here](../../static/pdf/hypercerts_whitepaper_v0.pdf). The content is mostly identical to the following pages. + +::: + +#### The world faces unprecedented challenges, from climate change to safe artificial intelligence, that require billions to trillions of dollars of public goods funding. + +High-upside/high-uncertainty endeavors are often overlooked due to the absence of strong incentives to pursue them in the dominant public goods funding framework of at-cost grants or even a milestone-bounty framework (which directly exposes small contributors to aversive risk levels). Yet these should be pursued when the expected positive value is very high, as it often is. New impact funding mechanisms can address this. One such mechanism is retrospective funding, which rewards projects based on the impact they create after the impact is observable. If projects can reasonably expect such retrospective rewards, they are incentivized to maximize their impact and – together with prospective funders – take risky bets when the expected positive value is high. + +#### In order for Impact Funding Systems (IFSs) to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources, and (3) evaluations. + +Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. We do not wish to lock in any particular decision-making scheme for funders. Without mechanisms like these, multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Funders should be able to easily collaborate with other funders or to intentionally fund different projects to diversify the funded approaches. Evaluators should be able to evaluate the same impact with different methodologies – potentially with conflicting results, to foster rigor and progress of evaluation methodologies. + +#### Hypercerts create this interoperability by serving as a single, open, shared, decentralized database for impact funding mechanisms. + +A single hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and whose ownership is fractionizable and transferable (under specific conditions). Hypercerts do not impose any specific funding mechanisms but provide baseline invariant guarantees such that claims will not be forgotten as different mechanisms come into and out of fashion. This is also why hypercerts are especially useful for any retrospective funding mechanisms – funding can be applied to claims of the past. diff --git a/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json b/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json new file mode 100644 index 00000000..33a5ba79 --- /dev/null +++ b/docs/versioned_sidebars/version-1.0.0-alpha.0-sidebars.json @@ -0,0 +1,162 @@ +{ + "mySidebar": [ + { + "type": "doc", + "id": "intro" + }, + { + "type": "category", + "label": "Vision & Whitepaper", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "whitepaper/whitepaper-intro" + }, + { + "type": "doc", + "id": "whitepaper/ifs" + }, + { + "type": "doc", + "id": "whitepaper/hypercerts-intro" + }, + { + "type": "doc", + "id": "whitepaper/impact-space" + }, + { + "type": "doc", + "id": "whitepaper/evaluation" + }, + { + "type": "doc", + "id": "whitepaper/retrospective-funding" + } + ] + }, + { + "type": "category", + "label": "Developer Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "developer/quickstart-javascript" + }, + { + "type": "doc", + "id": "developer/quickstart-solidity" + }, + { + "type": "doc", + "id": "developer/minting" + }, + { + "type": "doc", + "id": "developer/allowlists" + }, + { + "type": "doc", + "id": "developer/querying" + }, + { + "type": "doc", + "id": "developer/split-merge" + }, + { + "type": "doc", + "id": "developer/evaluations" + }, + { + "type": "doc", + "id": "developer/burning" + }, + { + "type": "doc", + "id": "developer/supported-networks" + }, + { + "type": "doc", + "id": "devops/index" + }, + { + "type": "category", + "label": "API Reference", + "collapsed": true, + "items": [ + { + "type": "category", + "label": "Contracts", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "developer/api/contracts/HypercertMinter" + }, + { + "type": "doc", + "id": "developer/api/contracts/SemiFungible1155" + }, + { + "type": "doc", + "id": "developer/api/contracts/AllowlistMinter" + } + ] + }, + { + "type": "doc", + "id": "developer/api/sdk/modules" + } + ] + } + ] + }, + { + "type": "category", + "label": "Minting Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "minting-guide/minting-guide-start" + }, + { + "type": "doc", + "id": "minting-guide/step-by-step" + }, + { + "type": "doc", + "id": "minting-guide/gitcoin-round" + } + ] + }, + { + "type": "category", + "label": "Implementation", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "implementation/token-standard" + }, + { + "type": "doc", + "id": "implementation/metadata" + }, + { + "type": "doc", + "id": "implementation/glossary" + } + ] + }, + { + "type": "doc", + "id": "faq" + }, + { + "type": "doc", + "id": "further-resources" + } + ] +} diff --git a/docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json b/docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json new file mode 100644 index 00000000..91fbd94e --- /dev/null +++ b/docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json @@ -0,0 +1,165 @@ +{ + "mySidebar": [ + { + "type": "doc", + "id": "intro" + }, + { + "type": "category", + "label": "Vision & Whitepaper", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "whitepaper/whitepaper-intro" + }, + { + "type": "doc", + "id": "whitepaper/ifs" + }, + { + "type": "doc", + "id": "whitepaper/hypercerts-intro" + }, + { + "type": "doc", + "id": "whitepaper/impact-space" + }, + { + "type": "doc", + "id": "whitepaper/evaluation" + }, + { + "type": "doc", + "id": "whitepaper/retrospective-funding" + } + ] + }, + { + "type": "category", + "label": "Developer Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "developer/quickstart-javascript" + }, + { + "type": "doc", + "id": "developer/quickstart-solidity" + }, + { + "type": "doc", + "id": "developer/minting" + }, + { + "type": "doc", + "id": "developer/allowlists" + }, + { + "type": "doc", + "id": "developer/querying" + }, + { + "type": "doc", + "id": "developer/split-merge" + }, + { + "type": "doc", + "id": "developer/evaluations" + }, + { + "type": "doc", + "id": "developer/burning" + }, + { + "type": "doc", + "id": "developer/supported-networks" + }, + { + "type": "doc", + "id": "devops/index" + }, + { + "type": "category", + "label": "API Reference", + "collapsed": true, + "items": [ + { + "type": "category", + "label": "Protocol", + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "developer/api/contracts/protocol" + } + ] + }, + { + "type": "category", + "label": "Exchange", + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "developer/api/contracts/marketplace" + } + ] + }, + { + "type": "doc", + "id": "developer/api/sdk/modules" + } + ] + } + ] + }, + { + "type": "category", + "label": "Minting Guide", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "minting-guide/minting-guide-start" + }, + { + "type": "doc", + "id": "minting-guide/step-by-step" + }, + { + "type": "doc", + "id": "minting-guide/gitcoin-round" + } + ] + }, + { + "type": "category", + "label": "Implementation", + "collapsed": true, + "items": [ + { + "type": "doc", + "id": "implementation/token-standard" + }, + { + "type": "doc", + "id": "implementation/metadata" + }, + { + "type": "doc", + "id": "implementation/glossary" + } + ] + }, + { + "type": "doc", + "id": "faq" + }, + { + "type": "doc", + "id": "further-resources" + } + ] +} diff --git a/graph/generated/schema.ts b/graph/generated/schema.ts index a1ae231d..cf492abf 100644 --- a/graph/generated/schema.ts +++ b/graph/generated/schema.ts @@ -331,4 +331,417 @@ export class ClaimToken extends Entity { set units(value: BigInt) { this.set("units", Value.fromBigInt(value)); } + + get offers(): OfferLoader { + return new OfferLoader("ClaimToken", this.get("id")!.toString(), "offers"); + } +} + +export class Token extends Entity { + constructor(id: string) { + super(); + this.set("id", Value.fromString(id)); + } + + save(): void { + let id = this.get("id"); + assert(id != null, "Cannot save Token entity without an ID"); + if (id) { + assert( + id.kind == ValueKind.STRING, + `Entities of type Token must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, + ); + store.set("Token", id.toString(), this); + } + } + + static loadInBlock(id: string): Token | null { + return changetype(store.get_in_block("Token", id)); + } + + static load(id: string): Token | null { + return changetype(store.get("Token", id)); + } + + get id(): string { + let value = this.get("id"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set id(value: string) { + this.set("id", Value.fromString(value)); + } + + get name(): string { + let value = this.get("name"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set name(value: string) { + this.set("name", Value.fromString(value)); + } + + get symbol(): string | null { + let value = this.get("symbol"); + if (!value || value.kind == ValueKind.NULL) { + return null; + } else { + return value.toString(); + } + } + + set symbol(value: string | null) { + if (!value) { + this.unset("symbol"); + } else { + this.set("symbol", Value.fromString(value)); + } + } + + get decimals(): BigInt | null { + let value = this.get("decimals"); + if (!value || value.kind == ValueKind.NULL) { + return null; + } else { + return value.toBigInt(); + } + } + + set decimals(value: BigInt | null) { + if (!value) { + this.unset("decimals"); + } else { + this.set("decimals", Value.fromBigInt(value)); + } + } +} + +export class AcceptedToken extends Entity { + constructor(id: string) { + super(); + this.set("id", Value.fromString(id)); + } + + save(): void { + let id = this.get("id"); + assert(id != null, "Cannot save AcceptedToken entity without an ID"); + if (id) { + assert( + id.kind == ValueKind.STRING, + `Entities of type AcceptedToken must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, + ); + store.set("AcceptedToken", id.toString(), this); + } + } + + static loadInBlock(id: string): AcceptedToken | null { + return changetype( + store.get_in_block("AcceptedToken", id), + ); + } + + static load(id: string): AcceptedToken | null { + return changetype(store.get("AcceptedToken", id)); + } + + get id(): string { + let value = this.get("id"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set id(value: string) { + this.set("id", Value.fromString(value)); + } + + get token(): string { + let value = this.get("token"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set token(value: string) { + this.set("token", Value.fromString(value)); + } + + get minimumAmountPerUnit(): BigInt { + let value = this.get("minimumAmountPerUnit"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set minimumAmountPerUnit(value: BigInt) { + this.set("minimumAmountPerUnit", Value.fromBigInt(value)); + } + + get accepted(): boolean { + let value = this.get("accepted"); + if (!value || value.kind == ValueKind.NULL) { + return false; + } else { + return value.toBoolean(); + } + } + + set accepted(value: boolean) { + this.set("accepted", Value.fromBoolean(value)); + } +} + +export class Offer extends Entity { + constructor(id: string) { + super(); + this.set("id", Value.fromString(id)); + } + + save(): void { + let id = this.get("id"); + assert(id != null, "Cannot save Offer entity without an ID"); + if (id) { + assert( + id.kind == ValueKind.STRING, + `Entities of type Offer must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, + ); + store.set("Offer", id.toString(), this); + } + } + + static loadInBlock(id: string): Offer | null { + return changetype(store.get_in_block("Offer", id)); + } + + static load(id: string): Offer | null { + return changetype(store.get("Offer", id)); + } + + get id(): string { + let value = this.get("id"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set id(value: string) { + this.set("id", Value.fromString(value)); + } + + get fractionID(): string { + let value = this.get("fractionID"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set fractionID(value: string) { + this.set("fractionID", Value.fromString(value)); + } + + get unitsAvailable(): BigInt { + let value = this.get("unitsAvailable"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set unitsAvailable(value: BigInt) { + this.set("unitsAvailable", Value.fromBigInt(value)); + } + + get minUnitsPerTrade(): BigInt { + let value = this.get("minUnitsPerTrade"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set minUnitsPerTrade(value: BigInt) { + this.set("minUnitsPerTrade", Value.fromBigInt(value)); + } + + get maxUnitsPerTrade(): BigInt { + let value = this.get("maxUnitsPerTrade"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set maxUnitsPerTrade(value: BigInt) { + this.set("maxUnitsPerTrade", Value.fromBigInt(value)); + } + + get status(): string { + let value = this.get("status"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set status(value: string) { + this.set("status", Value.fromString(value)); + } + + get acceptedTokens(): Array { + let value = this.get("acceptedTokens"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toStringArray(); + } + } + + set acceptedTokens(value: Array) { + this.set("acceptedTokens", Value.fromStringArray(value)); + } +} + +export class Trade extends Entity { + constructor(id: string) { + super(); + this.set("id", Value.fromString(id)); + } + + save(): void { + let id = this.get("id"); + assert(id != null, "Cannot save Trade entity without an ID"); + if (id) { + assert( + id.kind == ValueKind.STRING, + `Entities of type Trade must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, + ); + store.set("Trade", id.toString(), this); + } + } + + static loadInBlock(id: string): Trade | null { + return changetype(store.get_in_block("Trade", id)); + } + + static load(id: string): Trade | null { + return changetype(store.get("Trade", id)); + } + + get id(): string { + let value = this.get("id"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set id(value: string) { + this.set("id", Value.fromString(value)); + } + + get buyer(): Bytes { + let value = this.get("buyer"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBytes(); + } + } + + set buyer(value: Bytes) { + this.set("buyer", Value.fromBytes(value)); + } + + get offerID(): string { + let value = this.get("offerID"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set offerID(value: string) { + this.set("offerID", Value.fromString(value)); + } + + get unitsSold(): BigInt { + let value = this.get("unitsSold"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set unitsSold(value: BigInt) { + this.set("unitsSold", Value.fromBigInt(value)); + } + + get token(): string { + let value = this.get("token"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set token(value: string) { + this.set("token", Value.fromString(value)); + } + + get amountPerUnit(): BigInt { + let value = this.get("amountPerUnit"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set amountPerUnit(value: BigInt) { + this.set("amountPerUnit", Value.fromBigInt(value)); + } +} + +export class OfferLoader extends Entity { + _entity: string; + _field: string; + _id: string; + + constructor(entity: string, id: string, field: string) { + super(); + this._entity = entity; + this._id = id; + this._field = field; + } + + load(): Offer[] { + let value = store.loadRelated(this._entity, this._id, this._field); + return changetype(value); + } } diff --git a/graph/schema.graphql b/graph/schema.graphql index c2c8b8d5..d6ec32ef 100644 --- a/graph/schema.graphql +++ b/graph/schema.graphql @@ -22,4 +22,44 @@ type ClaimToken @entity { claim: Claim! owner: Bytes! units: BigInt! + offers: [Offer!] @derivedFrom(field: "fractionID") +} + +type Token @entity { + id: String! + name: String! + symbol: String + decimals: BigInt +} + +type AcceptedToken @entity { + id: String! + token: Token! + minimumAmountPerUnit: BigInt! + accepted: Boolean! +} + +enum OfferStatus { + Open + Fulfilled + Cancelled +} + +type Offer @entity { + id: String! + fractionID: ClaimToken! + unitsAvailable: BigInt! + minUnitsPerTrade: BigInt! + maxUnitsPerTrade: BigInt! + status: OfferStatus! + acceptedTokens: [AcceptedToken!]! +} + +type Trade @entity { + id: String! + buyer: Bytes! + offerID: Offer! + unitsSold: BigInt! + token: Token! + amountPerUnit: BigInt! } diff --git a/graph/tests/.latest.json b/graph/tests/.latest.json index 5afb1807..4f9a5e79 100644 --- a/graph/tests/.latest.json +++ b/graph/tests/.latest.json @@ -1,4 +1,4 @@ { "version": "0.6.0", - "timestamp": 1701971111457 + "timestamp": 1702070097153 } From c96bb1f18376ead5449eab71e519d35a61d273b7 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 14 Dec 2023 14:21:37 +0100 Subject: [PATCH 045/118] Faet/docs search function in documentation (#1236) * feat(docsearch): add config * feat(search): implement algolia search --- .../developer/api/sdk/classes/ClientError.md | 4 +- .../api/sdk/classes/ConfigurationError.md | 4 +- .../api/sdk/classes/ContractError.md | 4 +- .../developer/api/sdk/classes/FetchError.md | 4 +- .../api/sdk/classes/HypercertClient.md | 54 +- .../api/sdk/classes/HypercertsStorage.md | 16 +- .../api/sdk/classes/InvalidOrMissingError.md | 4 +- .../api/sdk/classes/MalformedDataError.md | 4 +- .../developer/api/sdk/classes/MintingError.md | 4 +- .../developer/api/sdk/classes/StorageError.md | 4 +- .../api/sdk/classes/UnknownSchemaError.md | 4 +- .../api/sdk/classes/UnsupportedChainError.md | 4 +- .../api/sdk/interfaces/CustomError.md | 2 +- .../api/sdk/interfaces/DuplicateEvaluation.md | 8 +- .../api/sdk/interfaces/EASEvaluation.md | 8 +- .../api/sdk/interfaces/HypercertClaimdata.md | 12 +- .../interfaces/HypercertClientInterface.md | 28 +- .../sdk/interfaces/HypercertClientMethods.md | 20 +- .../sdk/interfaces/HypercertClientState.md | 8 +- .../interfaces/HypercertEvaluationSchema.md | 6 +- .../interfaces/HypercertIndexerInterface.md | 14 +- .../api/sdk/interfaces/HypercertMetadata.md | 18 +- .../api/sdk/interfaces/HypercertPointer.md | 6 +- .../interfaces/HypercertStorageInterface.md | 8 +- .../api/sdk/interfaces/IPFSEvaluation.md | 4 +- .../sdk/interfaces/SimpleTextEvaluation.md | 6 +- docs/docs/developer/api/sdk/modules.md | 111 +- docs/docusaurus.config.js | 11 + .../version-1.0.0-alpha.0/about.md | 24 - .../developer/allowlists.md | 101 -- .../api/contracts/AllowlistMinter.md | 84 -- .../api/contracts/HypercertMinter.md | 895 ------------- .../api/contracts/HypercertTrader.md | 434 ------- .../api/contracts/IHypercertMinter.md | 39 - .../api/contracts/SemiFungible1155.md | 457 ------- .../v0.8/interfaces/AggregatorV3Interface.md | 77 -- .../api/contracts/forge-std/src/console.md | 1 - .../api/contracts/forge-std/src/console2.md | 3 - .../api/contracts/interfaces/IAllowlist.md | 29 - .../contracts/interfaces/IHypercertToken.md | 192 --- .../contracts/interfaces/IHypercertTrader.md | 133 -- .../developer/api/contracts/libs/Errors.md | 59 - .../marketplace/BatchOrderTypehashRegistry.md | 46 - .../CreatorFeeManagerWithRebates.md | 76 -- .../CreatorFeeManagerWithRoyalties.md | 64 - .../contracts/marketplace/CurrencyManager.md | 250 ---- .../contracts/marketplace/ExecutionManager.md | 751 ----------- .../marketplace/InheritedStrategy.md | 9 - .../marketplace/LooksRareProtocol.md | 1157 ----------------- .../api/contracts/marketplace/NonceManager.md | 193 --- .../marketplace/ProtocolFeeRecipient.md | 75 -- .../contracts/marketplace/StrategyManager.md | 391 ------ .../contracts/marketplace/TransferManager.md | 553 -------- .../marketplace/TransferSelectorNFT.md | 779 ----------- .../executionStrategies/BaseStrategy.md | 41 - .../BaseStrategyChainlinkPriceLatency.md | 212 --- .../StrategyChainlinkUSDDynamicAsk.md | 342 ----- .../StrategyCollectionOffer.md | 127 -- .../StrategyDutchAuction.md | 83 -- .../StrategyHypercertFractionOffer.md | 123 -- .../StrategyItemIdsRange.md | 75 -- .../marketplace/helpers/OrderValidatorV2A.md | 215 --- .../marketplace/helpers/ProtocolHelpers.md | 159 --- .../interfaces/ICreatorFeeManager.md | 60 - .../interfaces/ICurrencyManager.md | 22 - .../interfaces/IExecutionManager.md | 99 -- .../interfaces/IImmutableCreate2Factory.md | 41 - .../interfaces/ILooksRareProtocol.md | 157 --- .../marketplace/interfaces/INonceManager.md | 53 - .../interfaces/IRoyaltyFeeRegistry.md | 29 - .../marketplace/interfaces/IStrategy.md | 41 - .../interfaces/IStrategyManager.md | 84 -- .../interfaces/ITransferManager.md | 111 -- .../libraries/CurrencyValidator.md | 7 - .../libraries/LowLevelHypercertCaller.md | 21 - .../MerkleProofCalldataWithNodes.md | 7 - .../OpenZeppelin/MerkleProofMemory.md | 7 - .../marketplace/libraries/OrderStructs.md | 7 - .../api/contracts/protocol/AllowlistMinter.md | 84 -- .../api/contracts/protocol/HypercertMinter.md | 895 ------------- .../contracts/protocol/SemiFungible1155.md | 457 ------- .../protocol/interfaces/IAllowlist.md | 29 - .../protocol/interfaces/IHypercertToken.md | 192 --- .../api/contracts/protocol/libs/Errors.md | 59 - .../developer/api/sdk/.nojekyll | 1 - .../developer/api/sdk/README.md | 185 --- .../developer/api/sdk/classes/ClientError.md | 68 - .../api/sdk/classes/ConfigurationError.md | 66 - .../developer/api/sdk/classes/FetchError.md | 68 - .../api/sdk/classes/HypercertClient.md | 493 ------- .../api/sdk/classes/HypercertsStorage.md | 250 ---- .../api/sdk/classes/InvalidOrMissingError.md | 68 - .../api/sdk/classes/MalformedDataError.md | 68 - .../developer/api/sdk/classes/MintingError.md | 68 - .../developer/api/sdk/classes/StorageError.md | 68 - .../api/sdk/classes/UnknownSchemaError.md | 71 - .../api/sdk/classes/UnsupportedChainError.md | 72 - .../api/sdk/classes/internal.default-1.md | 278 ---- .../api/sdk/classes/internal.default-2.md | 131 -- .../api/sdk/classes/internal.default.md | 110 -- .../api/sdk/interfaces/CustomError.md | 39 - .../api/sdk/interfaces/DuplicateEvaluation.md | 56 - .../api/sdk/interfaces/EASEvaluation.md | 56 - .../api/sdk/interfaces/HypercertClaimdata.md | 167 --- .../interfaces/HypercertClientInterface.md | 341 ----- .../sdk/interfaces/HypercertClientMethods.md | 239 ---- .../sdk/interfaces/HypercertClientState.md | 68 - .../interfaces/HypercertEvaluationSchema.md | 47 - .../interfaces/HypercertIndexerInterface.md | 176 --- .../api/sdk/interfaces/HypercertMetadata.md | 123 -- .../api/sdk/interfaces/HypercertPointer.md | 45 - .../interfaces/HypercertStorageInterface.md | 130 -- .../api/sdk/interfaces/IPFSEvaluation.md | 34 - .../sdk/interfaces/SimpleTextEvaluation.md | 45 - .../interfaces/internal.EvaluatorInterface.md | 43 - .../interfaces/internal.HypercertClaimdata.md | 169 --- .../interfaces/internal.HypercertMinter.md | 17 - .../developer/api/sdk/modules.md | 638 --------- .../developer/api/sdk/modules/internal.md | 307 ----- .../developer/burning.md | 12 - .../version-1.0.0-alpha.0/developer/config.md | 112 -- .../version-1.0.0-alpha.0/developer/errors.md | 18 - .../developer/evaluations.md | 13 - .../developer/minting.md | 57 - .../developer/querying.md | 306 ----- .../developer/quickstart-javascript.md | 101 -- .../developer/quickstart-solidity.md | 41 - .../developer/split-merge.md | 29 - .../developer/supported-networks.md | 13 - .../devops/deploy-proxy.md | 120 -- .../version-1.0.0-alpha.0/devops/errors.md | 45 - .../version-1.0.0-alpha.0/devops/index.md | 18 - .../version-1.0.0-alpha.0/devops/pause.md | 29 - .../version-1.0.0-alpha.0/devops/plasmic.md | 76 -- .../version-1.0.0-alpha.0/devops/setup.md | 41 - .../version-1.0.0-alpha.0/devops/upgrade.md | 35 - .../version-1.0.0-alpha.0/faq.md | 139 -- .../further-resources.md | 37 - .../implementation/glossary.md | 139 -- .../implementation/metadata.md | 188 --- .../implementation/token-standard.md | 29 - .../version-1.0.0-alpha.0/intro.md | 58 - .../minting-guide/gitcoin-round.md | 166 --- .../minting-guide/minting-guide-start.md | 44 - .../minting-guide/step-by-step.md | 130 -- .../whitepaper/evaluation.md | 23 - .../whitepaper/hypercerts-intro.md | 104 -- .../version-1.0.0-alpha.0/whitepaper/ifs.md | 103 -- .../whitepaper/impact-space.md | 35 - .../whitepaper/retrospective-funding.md | 42 - .../whitepaper/whitepaper-intro.md | 24 - .../version-1.0.0-alpha.1/about.md | 24 - .../developer/allowlists.md | 101 -- .../api/contracts/AllowlistMinter.md | 84 -- .../api/contracts/HypercertMinter.md | 895 ------------- .../api/contracts/HypercertTrader.md | 434 ------- .../api/contracts/IHypercertMinter.md | 39 - .../api/contracts/SemiFungible1155.md | 457 ------- .../v0.8/interfaces/AggregatorV3Interface.md | 77 -- .../api/contracts/forge-std/src/console.md | 1 - .../api/contracts/forge-std/src/console2.md | 3 - .../api/contracts/interfaces/IAllowlist.md | 29 - .../contracts/interfaces/IHypercertToken.md | 192 --- .../contracts/interfaces/IHypercertTrader.md | 133 -- .../developer/api/contracts/libs/Errors.md | 59 - .../marketplace/BatchOrderTypehashRegistry.md | 46 - .../CreatorFeeManagerWithRebates.md | 76 -- .../CreatorFeeManagerWithRoyalties.md | 64 - .../contracts/marketplace/CurrencyManager.md | 250 ---- .../contracts/marketplace/ExecutionManager.md | 751 ----------- .../marketplace/InheritedStrategy.md | 9 - .../marketplace/LooksRareProtocol.md | 1157 ----------------- .../api/contracts/marketplace/NonceManager.md | 193 --- .../marketplace/ProtocolFeeRecipient.md | 75 -- .../contracts/marketplace/StrategyManager.md | 391 ------ .../contracts/marketplace/TransferManager.md | 553 -------- .../marketplace/TransferSelectorNFT.md | 779 ----------- .../executionStrategies/BaseStrategy.md | 41 - .../BaseStrategyChainlinkPriceLatency.md | 212 --- .../StrategyChainlinkUSDDynamicAsk.md | 342 ----- .../StrategyCollectionOffer.md | 127 -- .../StrategyDutchAuction.md | 83 -- .../StrategyHypercertFractionOffer.md | 123 -- .../StrategyItemIdsRange.md | 75 -- .../marketplace/helpers/OrderValidatorV2A.md | 215 --- .../marketplace/helpers/ProtocolHelpers.md | 159 --- .../interfaces/ICreatorFeeManager.md | 60 - .../interfaces/ICurrencyManager.md | 22 - .../interfaces/IExecutionManager.md | 99 -- .../interfaces/IImmutableCreate2Factory.md | 41 - .../interfaces/ILooksRareProtocol.md | 157 --- .../marketplace/interfaces/INonceManager.md | 53 - .../interfaces/IRoyaltyFeeRegistry.md | 29 - .../marketplace/interfaces/IStrategy.md | 41 - .../interfaces/IStrategyManager.md | 84 -- .../interfaces/ITransferManager.md | 111 -- .../libraries/CurrencyValidator.md | 7 - .../libraries/LowLevelHypercertCaller.md | 21 - .../MerkleProofCalldataWithNodes.md | 7 - .../OpenZeppelin/MerkleProofMemory.md | 7 - .../marketplace/libraries/OrderStructs.md | 7 - .../api/contracts/protocol/AllowlistMinter.md | 84 -- .../api/contracts/protocol/HypercertMinter.md | 895 ------------- .../contracts/protocol/SemiFungible1155.md | 457 ------- .../protocol/interfaces/IAllowlist.md | 29 - .../protocol/interfaces/IHypercertToken.md | 192 --- .../api/contracts/protocol/libs/Errors.md | 59 - .../developer/api/sdk/.nojekyll | 1 - .../developer/api/sdk/README.md | 185 --- .../developer/api/sdk/classes/ClientError.md | 68 - .../api/sdk/classes/ConfigurationError.md | 66 - .../developer/api/sdk/classes/FetchError.md | 68 - .../api/sdk/classes/HypercertClient.md | 493 ------- .../api/sdk/classes/HypercertsStorage.md | 250 ---- .../api/sdk/classes/InvalidOrMissingError.md | 68 - .../api/sdk/classes/MalformedDataError.md | 68 - .../developer/api/sdk/classes/MintingError.md | 68 - .../developer/api/sdk/classes/StorageError.md | 68 - .../api/sdk/classes/UnknownSchemaError.md | 71 - .../api/sdk/classes/UnsupportedChainError.md | 72 - .../api/sdk/classes/internal.default-1.md | 278 ---- .../api/sdk/classes/internal.default-2.md | 131 -- .../api/sdk/classes/internal.default.md | 110 -- .../api/sdk/interfaces/CustomError.md | 39 - .../api/sdk/interfaces/DuplicateEvaluation.md | 56 - .../api/sdk/interfaces/EASEvaluation.md | 56 - .../api/sdk/interfaces/HypercertClaimdata.md | 167 --- .../interfaces/HypercertClientInterface.md | 341 ----- .../sdk/interfaces/HypercertClientMethods.md | 239 ---- .../sdk/interfaces/HypercertClientState.md | 68 - .../interfaces/HypercertEvaluationSchema.md | 47 - .../interfaces/HypercertIndexerInterface.md | 176 --- .../api/sdk/interfaces/HypercertMetadata.md | 123 -- .../api/sdk/interfaces/HypercertPointer.md | 45 - .../interfaces/HypercertStorageInterface.md | 130 -- .../api/sdk/interfaces/IPFSEvaluation.md | 34 - .../sdk/interfaces/SimpleTextEvaluation.md | 45 - .../interfaces/internal.EvaluatorInterface.md | 43 - .../interfaces/internal.HypercertClaimdata.md | 169 --- .../interfaces/internal.HypercertMinter.md | 17 - .../developer/api/sdk/modules.md | 638 --------- .../developer/api/sdk/modules/internal.md | 307 ----- .../developer/burning.md | 12 - .../version-1.0.0-alpha.1/developer/config.md | 110 -- .../version-1.0.0-alpha.1/developer/errors.md | 18 - .../developer/evaluations.md | 13 - .../developer/minting.md | 57 - .../developer/querying.md | 306 ----- .../developer/quickstart-javascript.md | 101 -- .../developer/quickstart-solidity.md | 41 - .../developer/split-merge.md | 29 - .../developer/supported-networks.md | 13 - .../devops/deploy-proxy.md | 120 -- .../version-1.0.0-alpha.1/devops/errors.md | 45 - .../version-1.0.0-alpha.1/devops/index.md | 18 - .../version-1.0.0-alpha.1/devops/pause.md | 29 - .../version-1.0.0-alpha.1/devops/plasmic.md | 76 -- .../version-1.0.0-alpha.1/devops/setup.md | 41 - .../version-1.0.0-alpha.1/devops/upgrade.md | 35 - .../version-1.0.0-alpha.1/faq.md | 139 -- .../further-resources.md | 37 - .../implementation/glossary.md | 139 -- .../implementation/metadata.md | 188 --- .../implementation/token-standard.md | 29 - .../version-1.0.0-alpha.1/intro.md | 58 - .../minting-guide/gitcoin-round.md | 166 --- .../minting-guide/minting-guide-start.md | 44 - .../minting-guide/step-by-step.md | 130 -- .../whitepaper/evaluation.md | 23 - .../whitepaper/hypercerts-intro.md | 104 -- .../version-1.0.0-alpha.1/whitepaper/ifs.md | 103 -- .../whitepaper/impact-space.md | 35 - .../whitepaper/retrospective-funding.md | 42 - .../whitepaper/whitepaper-intro.md | 24 - .../developer/api/sdk/classes/ClientError.md | 4 +- .../api/sdk/classes/ConfigurationError.md | 4 +- .../api/sdk/classes/ContractError.md | 4 +- .../developer/api/sdk/classes/FetchError.md | 4 +- .../api/sdk/classes/HypercertClient.md | 54 +- .../api/sdk/classes/HypercertsStorage.md | 16 +- .../api/sdk/classes/InvalidOrMissingError.md | 4 +- .../api/sdk/classes/MalformedDataError.md | 4 +- .../developer/api/sdk/classes/MintingError.md | 4 +- .../developer/api/sdk/classes/StorageError.md | 4 +- .../api/sdk/classes/UnknownSchemaError.md | 4 +- .../api/sdk/classes/UnsupportedChainError.md | 4 +- .../api/sdk/interfaces/CustomError.md | 2 +- .../api/sdk/interfaces/DuplicateEvaluation.md | 8 +- .../api/sdk/interfaces/EASEvaluation.md | 8 +- .../api/sdk/interfaces/HypercertClaimdata.md | 12 +- .../interfaces/HypercertClientInterface.md | 28 +- .../sdk/interfaces/HypercertClientMethods.md | 20 +- .../sdk/interfaces/HypercertClientState.md | 8 +- .../interfaces/HypercertEvaluationSchema.md | 6 +- .../interfaces/HypercertIndexerInterface.md | 50 +- .../api/sdk/interfaces/HypercertMetadata.md | 18 +- .../api/sdk/interfaces/HypercertPointer.md | 6 +- .../interfaces/HypercertStorageInterface.md | 8 +- .../api/sdk/interfaces/IPFSEvaluation.md | 4 +- .../sdk/interfaces/SimpleTextEvaluation.md | 6 +- .../developer/api/sdk/modules.md | 476 ++++++- 301 files changed, 781 insertions(+), 36053 deletions(-) delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/about.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/faq.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/about.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/faq.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md diff --git a/docs/docs/developer/api/sdk/classes/ClientError.md b/docs/docs/developer/api/sdk/classes/ClientError.md index a0c9b619..6ff5198d 100644 --- a/docs/docs/developer/api/sdk/classes/ClientError.md +++ b/docs/docs/developer/api/sdk/classes/ClientError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:27 +[sdk/src/types/errors.ts:27](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L27) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:20 +[sdk/src/types/errors.ts:20](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L20) --- diff --git a/docs/docs/developer/api/sdk/classes/ConfigurationError.md b/docs/docs/developer/api/sdk/classes/ConfigurationError.md index aa28ba72..ef36adaa 100644 --- a/docs/docs/developer/api/sdk/classes/ConfigurationError.md +++ b/docs/docs/developer/api/sdk/classes/ConfigurationError.md @@ -41,7 +41,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:188 +[sdk/src/types/errors.ts:188](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L188) ## Properties @@ -103,7 +103,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:187 +[sdk/src/types/errors.ts:187](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L187) --- diff --git a/docs/docs/developer/api/sdk/classes/ContractError.md b/docs/docs/developer/api/sdk/classes/ContractError.md index 8561bfa7..ec81132a 100644 --- a/docs/docs/developer/api/sdk/classes/ContractError.md +++ b/docs/docs/developer/api/sdk/classes/ContractError.md @@ -42,7 +42,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:43 +[sdk/src/types/errors.ts:43](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L43) ## Properties @@ -104,7 +104,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:41 +[sdk/src/types/errors.ts:41](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L41) --- diff --git a/docs/docs/developer/api/sdk/classes/FetchError.md b/docs/docs/developer/api/sdk/classes/FetchError.md index 75c55a8c..1e32a4a2 100644 --- a/docs/docs/developer/api/sdk/classes/FetchError.md +++ b/docs/docs/developer/api/sdk/classes/FetchError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:65 +[sdk/src/types/errors.ts:65](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L65) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:58 +[sdk/src/types/errors.ts:58](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L58) --- diff --git a/docs/docs/developer/api/sdk/classes/HypercertClient.md b/docs/docs/developer/api/sdk/classes/HypercertClient.md index 0ef53914..ad12433a 100644 --- a/docs/docs/developer/api/sdk/classes/HypercertClient.md +++ b/docs/docs/developer/api/sdk/classes/HypercertClient.md @@ -54,7 +54,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -sdk/src/client.ts:55 +[sdk/src/client.ts:55](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L55) ## Properties @@ -64,7 +64,7 @@ sdk/src/client.ts:55 #### Defined in -sdk/src/client.ts:38 +[sdk/src/client.ts:38](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L38) --- @@ -74,7 +74,7 @@ sdk/src/client.ts:38 #### Defined in -sdk/src/client.ts:41 +[sdk/src/client.ts:41](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L41) --- @@ -84,7 +84,7 @@ sdk/src/client.ts:41 #### Defined in -sdk/src/client.ts:42 +[sdk/src/client.ts:42](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L42) --- @@ -158,7 +158,7 @@ sdk/src/client.ts:42 #### Defined in -sdk/src/client.ts:43 +[sdk/src/client.ts:43](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L43) --- @@ -168,7 +168,7 @@ sdk/src/client.ts:43 #### Defined in -sdk/src/client.ts:39 +[sdk/src/client.ts:39](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L39) --- @@ -212,7 +212,7 @@ sdk/src/client.ts:39 #### Defined in -sdk/src/client.ts:44 +[sdk/src/client.ts:44](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L44) --- @@ -228,7 +228,7 @@ Whether the client is in read-only mode. #### Defined in -sdk/src/client.ts:45 +[sdk/src/client.ts:45](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L45) ## Accessors @@ -246,7 +246,7 @@ The client config. #### Defined in -sdk/src/client.ts:79 +[sdk/src/client.ts:79](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L79) --- @@ -268,7 +268,7 @@ The contract. #### Defined in -sdk/src/client.ts:103 +[sdk/src/client.ts:103](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L103) --- @@ -290,7 +290,7 @@ The indexer. #### Defined in -sdk/src/client.ts:95 +[sdk/src/client.ts:95](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L95) --- @@ -312,7 +312,7 @@ The storage layer. #### Defined in -sdk/src/client.ts:87 +[sdk/src/client.ts:87](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L87) ## Methods @@ -351,7 +351,7 @@ Will throw an `InvalidOrMissingError` if any of the proofs are invalid. #### Defined in -sdk/src/client.ts:459 +[sdk/src/client.ts:459](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L459) --- @@ -384,7 +384,7 @@ A promise that resolves to the transaction hash. #### Defined in -sdk/src/client.ts:210 +[sdk/src/client.ts:210](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L210) --- @@ -421,7 +421,7 @@ Will throw a `ClientError` if the claim is not owned by the account. #### Defined in -sdk/src/client.ts:382 +[sdk/src/client.ts:382](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L382) --- @@ -462,7 +462,7 @@ Will throw a `MalformedDataError` if the provided allowlist or metadata is inval #### Defined in -sdk/src/client.ts:243 +[sdk/src/client.ts:243](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L243) --- @@ -482,7 +482,7 @@ sdk/src/client.ts:243 #### Defined in -sdk/src/client.ts:499 +[sdk/src/client.ts:499](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L499) --- @@ -496,7 +496,7 @@ sdk/src/client.ts:499 #### Defined in -sdk/src/client.ts:490 +[sdk/src/client.ts:490](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L490) --- @@ -526,7 +526,7 @@ a Promise that resolves to the applicable transfer restrictions. #### Defined in -sdk/src/client.ts:162 +[sdk/src/client.ts:162](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L162) --- @@ -574,7 +574,7 @@ sdk/src/client.ts:162 #### Defined in -sdk/src/client.ts:509 +[sdk/src/client.ts:509](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L509) --- @@ -611,7 +611,7 @@ Will throw a `ClientError` if any of the fractions are not owned by the account. #### Defined in -sdk/src/client.ts:341 +[sdk/src/client.ts:341](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L341) --- @@ -651,7 +651,7 @@ Will throw a `MalformedDataError` if the provided metadata is invalid. #### Defined in -sdk/src/client.ts:127 +[sdk/src/client.ts:127](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L127) --- @@ -690,7 +690,7 @@ Will throw an `InvalidOrMissingError` if the proof is invalid. #### Defined in -sdk/src/client.ts:415 +[sdk/src/client.ts:415](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L415) --- @@ -713,7 +713,7 @@ sdk/src/client.ts:415 #### Defined in -sdk/src/client.ts:519 +[sdk/src/client.ts:519](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L519) --- @@ -752,7 +752,7 @@ Will throw a `ClientError` if the fraction is not owned by the account or if the #### Defined in -sdk/src/client.ts:296 +[sdk/src/client.ts:296](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L296) --- @@ -782,7 +782,7 @@ Will throw a `ClientError` if the request fails. #### Defined in -sdk/src/client.ts:550 +[sdk/src/client.ts:550](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L550) --- @@ -815,4 +815,4 @@ A promise that resolves to the transaction hash. #### Defined in -sdk/src/client.ts:182 +[sdk/src/client.ts:182](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L182) diff --git a/docs/docs/developer/api/sdk/classes/HypercertsStorage.md b/docs/docs/developer/api/sdk/classes/HypercertsStorage.md index 6105ec7c..b76c9f96 100644 --- a/docs/docs/developer/api/sdk/classes/HypercertsStorage.md +++ b/docs/docs/developer/api/sdk/classes/HypercertsStorage.md @@ -46,7 +46,7 @@ This constructor takes an optional `overrides` parameter that can be used to ove #### Defined in -sdk/src/storage.ts:47 +[sdk/src/storage.ts:47](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L47) ## Properties @@ -58,7 +58,7 @@ The NFT Storage client used for storing and retrieving Hypercerts. #### Defined in -sdk/src/storage.ts:36 +[sdk/src/storage.ts:36](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L36) --- @@ -70,7 +70,7 @@ Whether the storage is read-only. If true, the storage methods will not perform #### Defined in -sdk/src/storage.ts:34 +[sdk/src/storage.ts:34](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L34) --- @@ -82,7 +82,7 @@ The Web3 Storage client used for storing and retrieving Hypercerts. #### Defined in -sdk/src/storage.ts:38 +[sdk/src/storage.ts:38](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L38) ## Methods @@ -124,7 +124,7 @@ Note: The original implementation using the Web3 Storage client is currently com #### Defined in -sdk/src/storage.ts:167 +[sdk/src/storage.ts:167](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L167) --- @@ -159,7 +159,7 @@ Will throw a `MalformedDataError` if the retrieved data is invalid. #### Defined in -sdk/src/storage.ts:114 +[sdk/src/storage.ts:114](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L114) --- @@ -200,7 +200,7 @@ If you are using our default keys, we may delete older data if we hit our storag #### Defined in -sdk/src/storage.ts:139 +[sdk/src/storage.ts:139](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L139) --- @@ -240,4 +240,4 @@ Will throw a `MalformedDataError` if the provided metadata is invalid. #### Defined in -sdk/src/storage.ts:81 +[sdk/src/storage.ts:81](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L81) diff --git a/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md index ca034a9d..055cc2e6 100644 --- a/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md +++ b/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:83 +[sdk/src/types/errors.ts:83](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L83) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:76 +[sdk/src/types/errors.ts:76](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L76) --- diff --git a/docs/docs/developer/api/sdk/classes/MalformedDataError.md b/docs/docs/developer/api/sdk/classes/MalformedDataError.md index 826cc8f2..d9349882 100644 --- a/docs/docs/developer/api/sdk/classes/MalformedDataError.md +++ b/docs/docs/developer/api/sdk/classes/MalformedDataError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:155 +[sdk/src/types/errors.ts:155](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L155) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:148 +[sdk/src/types/errors.ts:148](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L148) --- diff --git a/docs/docs/developer/api/sdk/classes/MintingError.md b/docs/docs/developer/api/sdk/classes/MintingError.md index 50d11138..66739db6 100644 --- a/docs/docs/developer/api/sdk/classes/MintingError.md +++ b/docs/docs/developer/api/sdk/classes/MintingError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:101 +[sdk/src/types/errors.ts:101](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L101) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:94 +[sdk/src/types/errors.ts:94](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L94) --- diff --git a/docs/docs/developer/api/sdk/classes/StorageError.md b/docs/docs/developer/api/sdk/classes/StorageError.md index e8fe2baa..7a9bbf11 100644 --- a/docs/docs/developer/api/sdk/classes/StorageError.md +++ b/docs/docs/developer/api/sdk/classes/StorageError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:119 +[sdk/src/types/errors.ts:119](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L119) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:112 +[sdk/src/types/errors.ts:112](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L112) --- diff --git a/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md b/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md index 2325eb5a..5ccf9796 100644 --- a/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md +++ b/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md @@ -44,7 +44,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:137 +[sdk/src/types/errors.ts:137](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L137) ## Properties @@ -108,7 +108,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:130 +[sdk/src/types/errors.ts:130](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L130) --- diff --git a/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md b/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md index 7c02e287..774e83f5 100644 --- a/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md +++ b/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md @@ -45,7 +45,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:174 +[sdk/src/types/errors.ts:174](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L174) ## Properties @@ -109,7 +109,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:167 +[sdk/src/types/errors.ts:167](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L167) --- diff --git a/docs/docs/developer/api/sdk/interfaces/CustomError.md b/docs/docs/developer/api/sdk/interfaces/CustomError.md index 3b0952f8..a05c1011 100644 --- a/docs/docs/developer/api/sdk/interfaces/CustomError.md +++ b/docs/docs/developer/api/sdk/interfaces/CustomError.md @@ -35,4 +35,4 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:10 +[sdk/src/types/errors.ts:10](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L10) diff --git a/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md index 4da8fd22..4c1a3b98 100644 --- a/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -sdk/src/types/evaluation.d.ts:22 +[sdk/src/types/evaluation.d.ts:22](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L22) --- @@ -28,7 +28,7 @@ sdk/src/types/evaluation.d.ts:22 #### Defined in -sdk/src/types/evaluation.d.ts:24 +[sdk/src/types/evaluation.d.ts:24](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L24) --- @@ -38,7 +38,7 @@ sdk/src/types/evaluation.d.ts:24 #### Defined in -sdk/src/types/evaluation.d.ts:23 +[sdk/src/types/evaluation.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L23) --- @@ -48,4 +48,4 @@ sdk/src/types/evaluation.d.ts:23 #### Defined in -sdk/src/types/evaluation.d.ts:21 +[sdk/src/types/evaluation.d.ts:21](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md b/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md index 9328c6cd..8e19a07b 100644 --- a/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -sdk/src/types/evaluation.d.ts:41 +[sdk/src/types/evaluation.d.ts:41](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L41) --- @@ -28,7 +28,7 @@ sdk/src/types/evaluation.d.ts:41 #### Defined in -sdk/src/types/evaluation.d.ts:42 +[sdk/src/types/evaluation.d.ts:42](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L42) --- @@ -38,7 +38,7 @@ sdk/src/types/evaluation.d.ts:42 #### Defined in -sdk/src/types/evaluation.d.ts:40 +[sdk/src/types/evaluation.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L40) --- @@ -48,4 +48,4 @@ sdk/src/types/evaluation.d.ts:40 #### Defined in -sdk/src/types/evaluation.d.ts:43 +[sdk/src/types/evaluation.d.ts:43](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md index cc3c8ce2..cb04ac04 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -34,7 +34,7 @@ Contributors #### Defined in -sdk/src/types/claimdata.d.ts:53 +[sdk/src/types/claimdata.d.ts:53](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L53) --- @@ -59,7 +59,7 @@ Scopes of impact #### Defined in -sdk/src/types/claimdata.d.ts:15 +[sdk/src/types/claimdata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L15) --- @@ -83,7 +83,7 @@ Impact time period. The value is UNIX time in seconds from epoch. #### Defined in -sdk/src/types/claimdata.d.ts:44 +[sdk/src/types/claimdata.d.ts:44](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L44) --- @@ -108,7 +108,7 @@ Rights #### Defined in -sdk/src/types/claimdata.d.ts:62 +[sdk/src/types/claimdata.d.ts:62](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L62) --- @@ -133,7 +133,7 @@ Scopes of work #### Defined in -sdk/src/types/claimdata.d.ts:25 +[sdk/src/types/claimdata.d.ts:25](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L25) --- @@ -157,4 +157,4 @@ Work time period. The value is UNIX time in seconds from epoch. #### Defined in -sdk/src/types/claimdata.d.ts:35 +[sdk/src/types/claimdata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md index 9b969ab0..d11e9857 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -62,7 +62,7 @@ The order of the arrays must be equal. #### Defined in -sdk/src/types/client.ts:237 +[sdk/src/types/client.ts:237](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L237) --- @@ -96,7 +96,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:171 +[sdk/src/types/client.ts:171](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L171) --- @@ -128,7 +128,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:212 +[sdk/src/types/client.ts:212](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L212) --- @@ -142,7 +142,7 @@ sdk/src/types/client.ts:212 #### Defined in -sdk/src/types/client.ts:124 +[sdk/src/types/client.ts:124](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L124) --- @@ -177,7 +177,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:185 +[sdk/src/types/client.ts:185](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L185) --- @@ -209,7 +209,7 @@ A Promise that resolves to the applicable transfer restrictions. #### Defined in -sdk/src/types/client.ts:149 +[sdk/src/types/client.ts:149](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L149) --- @@ -225,7 +225,7 @@ The indexer used by the client. #### Defined in -sdk/src/types/client.ts:123 +[sdk/src/types/client.ts:123](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L123) --- @@ -257,7 +257,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:205 +[sdk/src/types/client.ts:205](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L205) --- @@ -291,7 +291,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:138 +[sdk/src/types/client.ts:138](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L138) --- @@ -325,7 +325,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:221 +[sdk/src/types/client.ts:221](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L221) --- @@ -341,7 +341,7 @@ Whether the client is in read-only mode. #### Defined in -sdk/src/types/client.ts:119 +[sdk/src/types/client.ts:119](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L119) --- @@ -374,7 +374,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:198 +[sdk/src/types/client.ts:198](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L198) --- @@ -390,7 +390,7 @@ The storage layer used by the client. #### Defined in -sdk/src/types/client.ts:121 +[sdk/src/types/client.ts:121](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L121) --- @@ -424,4 +424,4 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:158 +[sdk/src/types/client.ts:158](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L158) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md index c6f4aa3c..a7f5f483 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -52,7 +52,7 @@ The order of the arrays must be equal. #### Defined in -sdk/src/types/client.ts:237 +[sdk/src/types/client.ts:237](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L237) --- @@ -82,7 +82,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:171 +[sdk/src/types/client.ts:171](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L171) --- @@ -110,7 +110,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:212 +[sdk/src/types/client.ts:212](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L212) --- @@ -141,7 +141,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:185 +[sdk/src/types/client.ts:185](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L185) --- @@ -169,7 +169,7 @@ A Promise that resolves to the applicable transfer restrictions. #### Defined in -sdk/src/types/client.ts:149 +[sdk/src/types/client.ts:149](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L149) --- @@ -197,7 +197,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:205 +[sdk/src/types/client.ts:205](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L205) --- @@ -227,7 +227,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:138 +[sdk/src/types/client.ts:138](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L138) --- @@ -257,7 +257,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:221 +[sdk/src/types/client.ts:221](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L221) --- @@ -286,7 +286,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:198 +[sdk/src/types/client.ts:198](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L198) --- @@ -316,4 +316,4 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:158 +[sdk/src/types/client.ts:158](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L158) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md index 69a38d6f..7f899d66 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md @@ -22,7 +22,7 @@ The state of the Hypercert client. #### Defined in -sdk/src/types/client.ts:124 +[sdk/src/types/client.ts:124](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L124) --- @@ -34,7 +34,7 @@ The indexer used by the client. #### Defined in -sdk/src/types/client.ts:123 +[sdk/src/types/client.ts:123](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L123) --- @@ -46,7 +46,7 @@ Whether the client is in read-only mode. #### Defined in -sdk/src/types/client.ts:119 +[sdk/src/types/client.ts:119](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L119) --- @@ -58,4 +58,4 @@ The storage layer used by the client. #### Defined in -sdk/src/types/client.ts:121 +[sdk/src/types/client.ts:121](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L121) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md index 59e77fde..3f5aafc4 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -20,7 +20,7 @@ Schema for evaluating Hypercerts across different sources and evaluation types #### Defined in -sdk/src/types/evaluation.d.ts:15 +[sdk/src/types/evaluation.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L15) --- @@ -30,7 +30,7 @@ sdk/src/types/evaluation.d.ts:15 #### Defined in -sdk/src/types/evaluation.d.ts:16 +[sdk/src/types/evaluation.d.ts:16](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L16) --- @@ -40,4 +40,4 @@ sdk/src/types/evaluation.d.ts:16 #### Defined in -sdk/src/types/evaluation.d.ts:17 +[sdk/src/types/evaluation.d.ts:17](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md index 351025e3..a1500d48 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -28,7 +28,7 @@ custom_edit_url: null #### Defined in -sdk/src/types/indexer.ts:20 +[sdk/src/types/indexer.ts:20](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L20) --- @@ -53,7 +53,7 @@ sdk/src/types/indexer.ts:20 #### Defined in -sdk/src/types/indexer.ts:19 +[sdk/src/types/indexer.ts:19](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L19) --- @@ -77,7 +77,7 @@ sdk/src/types/indexer.ts:19 #### Defined in -sdk/src/types/indexer.ts:21 +[sdk/src/types/indexer.ts:21](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L21) --- @@ -101,7 +101,7 @@ sdk/src/types/indexer.ts:21 #### Defined in -sdk/src/types/indexer.ts:24 +[sdk/src/types/indexer.ts:24](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L24) --- @@ -126,7 +126,7 @@ sdk/src/types/indexer.ts:24 #### Defined in -sdk/src/types/indexer.ts:23 +[sdk/src/types/indexer.ts:23](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L23) --- @@ -151,7 +151,7 @@ sdk/src/types/indexer.ts:23 #### Defined in -sdk/src/types/indexer.ts:22 +[sdk/src/types/indexer.ts:22](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L22) --- @@ -161,4 +161,4 @@ sdk/src/types/indexer.ts:22 #### Defined in -sdk/src/types/indexer.ts:18 +[sdk/src/types/indexer.ts:18](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L18) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md index c0a9cbf8..f6493ef1 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md @@ -18,7 +18,7 @@ A CID pointer to the merke tree proof json on ipfs #### Defined in -sdk/src/types/metadata.d.ts:39 +[sdk/src/types/metadata.d.ts:39](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L39) --- @@ -30,7 +30,7 @@ Describes the asset to which this token represents #### Defined in -sdk/src/types/metadata.d.ts:19 +[sdk/src/types/metadata.d.ts:19](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L19) --- @@ -42,7 +42,7 @@ An url pointing to the external website of the project #### Defined in -sdk/src/types/metadata.d.ts:23 +[sdk/src/types/metadata.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L23) --- @@ -52,7 +52,7 @@ sdk/src/types/metadata.d.ts:23 #### Defined in -sdk/src/types/metadata.d.ts:45 +[sdk/src/types/metadata.d.ts:45](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L45) --- @@ -64,7 +64,7 @@ A URI pointing to a resource with mime type image/\* representing the asset to w #### Defined in -sdk/src/types/metadata.d.ts:27 +[sdk/src/types/metadata.d.ts:27](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L27) --- @@ -76,7 +76,7 @@ Identifies the asset to which this token represents #### Defined in -sdk/src/types/metadata.d.ts:15 +[sdk/src/types/metadata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L15) --- @@ -86,7 +86,7 @@ sdk/src/types/metadata.d.ts:15 #### Defined in -sdk/src/types/metadata.d.ts:40 +[sdk/src/types/metadata.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L40) --- @@ -98,7 +98,7 @@ Describes the asset to which this token represents #### Defined in -sdk/src/types/metadata.d.ts:35 +[sdk/src/types/metadata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L35) --- @@ -110,4 +110,4 @@ The version of Hypercert schema used to describe this hypercert #### Defined in -sdk/src/types/metadata.d.ts:31 +[sdk/src/types/metadata.d.ts:31](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md b/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md index f97b5d26..199f6f54 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -sdk/src/types/evaluation.d.ts:28 +[sdk/src/types/evaluation.d.ts:28](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L28) --- @@ -28,7 +28,7 @@ sdk/src/types/evaluation.d.ts:28 #### Defined in -sdk/src/types/evaluation.d.ts:30 +[sdk/src/types/evaluation.d.ts:30](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L30) --- @@ -38,4 +38,4 @@ sdk/src/types/evaluation.d.ts:30 #### Defined in -sdk/src/types/evaluation.d.ts:29 +[sdk/src/types/evaluation.d.ts:29](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md index ba0a2551..ff50839f 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -38,7 +38,7 @@ A Promise that resolves to the retrieved data. #### Defined in -sdk/src/types/client.ts:98 +[sdk/src/types/client.ts:98](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L98) --- @@ -66,7 +66,7 @@ A Promise that resolves to the retrieved metadata. #### Defined in -sdk/src/types/client.ts:84 +[sdk/src/types/client.ts:84](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L84) --- @@ -94,7 +94,7 @@ A Promise that resolves to the CID of the stored data. #### Defined in -sdk/src/types/client.ts:91 +[sdk/src/types/client.ts:91](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L91) --- @@ -122,4 +122,4 @@ A Promise that resolves to the CID of the stored metadata. #### Defined in -sdk/src/types/client.ts:77 +[sdk/src/types/client.ts:77](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L77) diff --git a/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md index 15835a1e..1d8c13e2 100644 --- a/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -sdk/src/types/evaluation.d.ts:48 +[sdk/src/types/evaluation.d.ts:48](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L48) --- @@ -28,4 +28,4 @@ sdk/src/types/evaluation.d.ts:48 #### Defined in -sdk/src/types/evaluation.d.ts:47 +[sdk/src/types/evaluation.d.ts:47](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md index 0ad3d38f..20457082 100644 --- a/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -sdk/src/types/evaluation.d.ts:35 +[sdk/src/types/evaluation.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L35) --- @@ -28,7 +28,7 @@ sdk/src/types/evaluation.d.ts:35 #### Defined in -sdk/src/types/evaluation.d.ts:36 +[sdk/src/types/evaluation.d.ts:36](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L36) --- @@ -38,4 +38,4 @@ sdk/src/types/evaluation.d.ts:36 #### Defined in -sdk/src/types/evaluation.d.ts:34 +[sdk/src/types/evaluation.d.ts:34](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/docs/developer/api/sdk/modules.md b/docs/docs/developer/api/sdk/modules.md index 7d71a207..b5d8bab0 100644 --- a/docs/docs/developer/api/sdk/modules.md +++ b/docs/docs/developer/api/sdk/modules.md @@ -55,7 +55,7 @@ Represents an entry in an allowlist. #### Defined in -sdk/src/types/hypercerts.ts:24 +[sdk/src/types/hypercerts.ts:24](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/hypercerts.ts#L24) --- @@ -80,7 +80,7 @@ sdk/src/types/hypercerts.ts:24 #### Defined in -sdk/src/indexer/gql/graphql.ts:116 +[sdk/src/indexer/gql/graphql.ts:116](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L116) --- @@ -97,9 +97,7 @@ sdk/src/indexer/gql/graphql.ts:116 #### Defined in - -sdk/src/indexer/gql/graphql.ts:587 - +[sdk/src/indexer/gql/graphql.ts:587](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L587) --- @@ -120,7 +118,7 @@ sdk/src/indexer/gql/graphql.ts:587 #### Defined in -sdk/src/indexer/gql/graphql.ts:129 +[sdk/src/indexer/gql/graphql.ts:129](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L129) --- @@ -137,7 +135,7 @@ sdk/src/indexer/gql/graphql.ts:129 #### Defined in -sdk/src/indexer/gql/graphql.ts:636 +[sdk/src/indexer/gql/graphql.ts:636](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L636) --- @@ -154,7 +152,7 @@ sdk/src/indexer/gql/graphql.ts:636 #### Defined in -sdk/src/indexer/gql/graphql.ts:627 +[sdk/src/indexer/gql/graphql.ts:627](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L627) --- @@ -171,8 +169,7 @@ sdk/src/indexer/gql/graphql.ts:627 #### Defined in -sdk/src/indexer/gql/graphql.ts:608 - +[sdk/src/indexer/gql/graphql.ts:608](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L608) --- @@ -189,7 +186,8 @@ sdk/src/indexer/gql/graphql.ts:608 #### Defined in -sdk/src/indexer/gql/graphql.ts:549 +[sdk/src/indexer/gql/graphql.ts:549](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L549) + --- ### Deployment @@ -209,7 +207,7 @@ Represents a deployment of a contract on a specific network. #### Defined in -sdk/src/types/client.ts:23 +[sdk/src/types/client.ts:23](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L23) --- @@ -225,8 +223,7 @@ sdk/src/types/client.ts:23 #### Defined in -sdk/src/indexer/gql/gql.ts:53 - +[sdk/src/indexer/gql/gql.ts:53](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/gql.ts#L53) --- @@ -240,7 +237,7 @@ and run json-schema-to-typescript to regenerate this file. #### Defined in -sdk/src/types/evaluation.d.ts:8 +[sdk/src/types/evaluation.d.ts:8](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L8) --- @@ -250,7 +247,7 @@ sdk/src/types/evaluation.d.ts:8 #### Defined in -sdk/src/types/evaluation.d.ts:9 +[sdk/src/types/evaluation.d.ts:9](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L9) --- @@ -266,8 +263,7 @@ sdk/src/types/evaluation.d.ts:9 #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:5 - +[sdk/src/indexer/gql/fragment-masking.ts:5](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L5) --- @@ -279,7 +275,7 @@ Configuration options for the Hypercert client. #### Defined in -sdk/src/types/client.ts:35 +[sdk/src/types/client.ts:35](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L35) --- @@ -297,7 +293,7 @@ The props for the Hypercert client. #### Defined in -sdk/src/types/client.ts:104 +[sdk/src/types/client.ts:104](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L104) --- @@ -313,7 +309,7 @@ The signer is required for submitting evaluations. #### Defined in -sdk/src/types/client.ts:64 +[sdk/src/types/client.ts:64](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L64) --- @@ -336,7 +332,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -sdk/src/types/client.ts:53 +[sdk/src/types/client.ts:53](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L53) --- @@ -346,7 +342,7 @@ sdk/src/types/client.ts:53 #### Defined in -sdk/src/types/errors.ts:195 +[sdk/src/types/errors.ts:195](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L195) --- @@ -368,7 +364,7 @@ sdk/src/types/errors.ts:195 #### Defined in -sdk/src/types/indexer.ts:10 +[sdk/src/types/indexer.ts:10](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L10) --- @@ -385,7 +381,7 @@ sdk/src/types/indexer.ts:10 #### Defined in -sdk/src/indexer/gql/graphql.ts:569 +[sdk/src/indexer/gql/graphql.ts:569](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L569) --- @@ -395,7 +391,7 @@ sdk/src/indexer/gql/graphql.ts:569 #### Defined in -sdk/src/types/client.ts:13 +[sdk/src/types/client.ts:13](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L13) --- @@ -413,7 +409,7 @@ sdk/src/types/client.ts:13 #### Defined in -sdk/src/types/client.ts:14 +[sdk/src/types/client.ts:14](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L14) --- @@ -423,9 +419,9 @@ sdk/src/types/client.ts:14 #### Defined in -sdk/src/types/hypercerts.ts:9 +[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/hypercerts.ts#L9) -sdk/src/types/hypercerts.ts:15 +[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/hypercerts.ts#L15) ## Variables @@ -465,9 +461,9 @@ Represents the possible transfer restrictions of a claim matching the hypercerts #### Defined in -sdk/src/types/hypercerts.ts:9 +[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/hypercerts.ts#L9) -sdk/src/types/hypercerts.ts:15 +[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/hypercerts.ts#L15) --- @@ -477,7 +473,7 @@ sdk/src/types/hypercerts.ts:15 #### Defined in -sdk/src/constants.ts:10 +[sdk/src/constants.ts:10](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/constants.ts#L10) --- @@ -496,7 +492,7 @@ sdk/src/constants.ts:10 #### Defined in -sdk/src/utils/logger.ts:24 +[sdk/src/utils/logger.ts:24](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/logger.ts#L24) ## Functions @@ -535,7 +531,7 @@ Formats input data to an object containing HypercertMetadata including appropria #### Defined in -sdk/src/utils/formatter.ts:27 +[sdk/src/utils/formatter.ts:27](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/formatter.ts#L27) --- @@ -569,7 +565,7 @@ Will throw a `StoragjeError` if the data cannot be fetched from either gateway. #### Defined in -sdk/src/utils/fetchers.ts:17 +[sdk/src/utils/fetchers.ts:17](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/fetchers.ts#L17) --- @@ -604,7 +600,7 @@ Will throw an error if the Merkle tree cannot be fetched. #### Defined in -sdk/src/utils/allowlist.ts:35 +[sdk/src/utils/allowlist.ts:35](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/allowlist.ts#L35) --- @@ -643,7 +639,7 @@ Please regenerate the types. #### Defined in -sdk/src/indexer/gql/gql.ts:34 +[sdk/src/indexer/gql/gql.ts:34](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/gql.ts#L34) ▸ **graphql**(`source`): typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}"``] @@ -661,7 +657,7 @@ typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: #### Defined in -sdk/src/indexer/gql/gql.ts:39 +[sdk/src/indexer/gql/gql.ts:39](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/gql.ts#L39) ▸ **graphql**(`source`): typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}"``] @@ -679,7 +675,7 @@ typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirec #### Defined in -sdk/src/indexer/gql/gql.ts:45 +[sdk/src/indexer/gql/gql.ts:45](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/gql.ts#L45) --- @@ -699,7 +695,7 @@ sdk/src/indexer/gql/gql.ts:45 #### Defined in -sdk/src/utils/errors.ts:39 +[sdk/src/utils/errors.ts:39](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/errors.ts#L39) --- @@ -721,7 +717,7 @@ Method to catch errors and log them #### Defined in -sdk/src/utils/errors.ts:22 +[sdk/src/utils/errors.ts:22](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/errors.ts#L22) --- @@ -750,7 +746,7 @@ data is [TFrag] extends [Object] ? TKey extends string ? Object : never : never #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:51 +[sdk/src/indexer/gql/fragment-masking.ts:51](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L51) --- @@ -778,7 +774,7 @@ sdk/src/indexer/gql/fragment-masking.ts:51 #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:45 +[sdk/src/indexer/gql/fragment-masking.ts:45](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L45) --- @@ -868,7 +864,7 @@ An ethers.js `Provider` instance, or `undefined` if no chain is found in the `Pu #### Defined in -sdk/src/utils/adapters.ts:19 +[sdk/src/utils/adapters.ts:19](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/adapters.ts#L19) --- @@ -895,7 +891,7 @@ sdk/src/utils/adapters.ts:19 #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:15 +[sdk/src/indexer/gql/fragment-masking.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L15) ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `TType` \| `null` \| `undefined` @@ -918,8 +914,7 @@ sdk/src/indexer/gql/fragment-masking.ts:15 #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:20 - +[sdk/src/indexer/gql/fragment-masking.ts:20](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L20) ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> @@ -942,8 +937,7 @@ sdk/src/indexer/gql/fragment-masking.ts:20 #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:25 - +[sdk/src/indexer/gql/fragment-masking.ts:25](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L25) ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> \| `null` \| `undefined` @@ -966,8 +960,7 @@ sdk/src/indexer/gql/fragment-masking.ts:25 #### Defined in -sdk/src/indexer/gql/fragment-masking.ts:30 - +[sdk/src/indexer/gql/fragment-masking.ts:30](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L30) --- @@ -995,7 +988,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -sdk/src/validator/index.ts:108 +[sdk/src/validator/index.ts:108](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L108) --- @@ -1023,7 +1016,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -sdk/src/validator/index.ts:77 +[sdk/src/validator/index.ts:77](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L77) --- @@ -1051,7 +1044,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -sdk/src/validator/index.ts:139 +[sdk/src/validator/index.ts:139](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L139) --- @@ -1079,7 +1072,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -sdk/src/validator/index.ts:46 +[sdk/src/validator/index.ts:46](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L46) --- @@ -1107,7 +1100,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -sdk/src/validator/index.ts:169 +[sdk/src/validator/index.ts:169](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L169) --- @@ -1139,7 +1132,7 @@ Will throw a `MintingError` if the signer address is invalid or if the Merkle pr #### Defined in -sdk/src/validator/index.ts:201 +[sdk/src/validator/index.ts:201](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L201) --- @@ -1171,7 +1164,7 @@ Will throw a `MintingError` if the lengths of the input arrays are not equal or #### Defined in -sdk/src/validator/index.ts:224 +[sdk/src/validator/index.ts:224](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L224) --- @@ -1230,4 +1223,4 @@ An ethers.js `Signer` instance, or `undefined` if no chain is found in the `Wall #### Defined in -sdk/src/utils/adapters.ts:51 +[sdk/src/utils/adapters.ts:51](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/adapters.ts#L51) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 891844ed..810246db 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -74,6 +74,17 @@ export default async function createConfigAsync() { }, themes: ["@docusaurus/theme-mermaid"], themeConfig: { + algolia: { + // The application ID provided by Algolia + appId: "KEI1L137BU", + + // Public API key: it is safe to commit it + apiKey: "3c28007b9532f79a8f326cc2a07f1721", + + indexName: "hypercerts", + + insights: true, + }, docs: { sidebar: { hideable: true, diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/about.md b/docs/versioned_docs/version-1.0.0-alpha.0/about.md deleted file mode 100644 index e2d4eb79..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/about.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: The Hypercerts Foundation -id: about ---- - -# The Hypercerts Foundation - -### Mission - -The mission of the Hypercerts Foundation is to advance the development and adoption of open-source protocols for funding and rewarding positive impact. - -### Organization - -The Hypercerts Foundation is a fully independent organisation working closely with stakeholders in the open source, scientific research, and cryptography communities to develop and promote additional protocols that are decentralized, secure, and transparent. The Foundation will also provide support and resources to help drive the wider adoption of these protocols. - -### History - -Research on hypercerts was first presented to the public by David A. Dalrymple at the conference series Funding the Commons in March 2022. However, the concept of “impact certificates” has been a recurring theme at conferences and in online discussion forums since at least 2014. In late 2022, a small team of research scientists, developers, and practitioners began implementing hypercerts as a set of Ethereum-based smart contracts that could be used to assert and fund impact claims. The Hypercerts Foundation will now serve as the long-term home for this work. - -The new foundation is supported in part by Protocol Labs and is part of the broader Protocol Labs Network of hundreds of companies and organizations. The Foundation will complement Protocol Labs Network’s mission of enabling a more secure, open, and accessible internet. The Hypercerts Foundation, however, is fully independent and will focus on protocol development and cultivating a community of developers and impact entrepreneurs well beyond the Protocol Labs Network. - -### Further links - -Read the full [announcement of the Hypercerts Foundation](https://hypercerts.notion.site/Introducing-the-Hypercerts-Foundation-d956203fe0fc4792980da138015e770a). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md deleted file mode 100644 index bc65b116..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md +++ /dev/null @@ -1,101 +0,0 @@ -# Allowlists - -Allowlists are an efficient way to enable distribution of hypercert fractions amongst a group. -First, the creator will create the hypercert with the metadata and an immutable allowlist. -With the `claimId`, every account specified in the allowlist can later mint their fraction token from that allowlist. - -## Create an allowlist - -First specify an allowlist, mapping addresses to the number of units they should receive. - -```js -import { - TransferRestrictions, - formatHypercertData, - Allowlist, -} from "@hypercerts-org/sdk"; - -const allowlist: Allowlist = [ - { address: "0x123", units: 100 }, - { address: "0xabc", units: 100 }, -]; -``` - -Then, call `createAllowlist` with the metadata and allowlist. - -```js -const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; -const transferRestrictions = TransferRestrictions.FromCreatorOnly - -const { claimId } = await hypercerts.createAllowlist({ - allowList, - metaData, - totalUnits, - transferRestrictions: TransferRestrictions.FromCreatorOnly, -}); -``` - -> **note** We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree generation and data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree) - -It first checks if the client is writable and if the operator is a signer. If the operator is not a signer, it throws an `InvalidOrMissingError`. - -Next, it validates the allowlist and metadata by calling the `validateAllowlist` and `validateMetaData` functions respectively. If either the allowlist or metadata is invalid, it throws a `MalformedDataError`. - -Once the allowlist and metadata are validated, the method creates a Merkle tree from the allowlist and stores it on IPFS. It then stores the metadata on IPFS as well. - -Finally, the method invokes the `createAllowlist` function on the contract with the signer's `address`, the total number of `units`, the Merkle tree `root`, the metadata `CID`, and the `transfer restrictions`. If the method is called with `overrides`, it passes them to the createAllowlist function. - -## Claiming a fraction token - -Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: - -| Variable | Type | Source | -| -------- | ------------ | ------------ | -| claimId | BigNumberish | Hypercert ID | -| units | BigNumberish | Allowlist | -| proof | BytesLike[] | Merkle tree | - -We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. - -Then, call `mintClaimFractionFromAllowlist` with the required data. The contracts will also verify the proofs. However, when providing the `root` in the function input, the proofs will be verified before a transaction is submitted. - -```js -import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; - -const claimId = "0x822f17a9a5eecfd...85254363386255337"; -const address = "0xc0ffee254729296a45a3885639AC7E10F9d54979"; - -const { indexer, storage } = hypercertsClient; -const claimById = await indexer.claimById(claimId); -const { uri, tokenID: _id } = claimById.claim; -const metadata = await storage.getMetadata(uri || ""); -const treeResponse = await storage.getData(metadata.allowList); -const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); - -let args; -// Find the proof in the allowlist -for (const [leaf, value] of tree.entries()) { - if (value[0] === address) { - args = { - proofs: tree.getProof(leaf), - units: Number(value[1]), - claimId: _id, - }; - break; - } -} - -// Mint fraction token -const tx = await hypercerts.mintClaimFractionFromAllowlist({ - ...args, -}); -``` - -Let's see what happens under the hood: - -First, the method checks that the client is not `read only` and that the operator is a signer. If not, it throws an `InvalidOrMissingError`. - -Next, the method verifies the Merkle `proof` using the OpenZeppelin Merkle tree library. If a `root` is provided, the method uses it to verify the proof. If the proof is invalid, it throws an error. - -Finally, the method calls the `mintClaimFromAllowlist` function on the contract with the signer `address`, Merkle `proof`, `claim ID`, and number of `units` as parameters. If overrides are provided, the method uses them to send the transaction. Otherwise, it sends the transaction without overrides. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md deleted file mode 100644 index 4684053c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md +++ /dev/null @@ -1,84 +0,0 @@ -# AllowlistMinter - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -## Events - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -## Errors - -### DoesNotExist - -```solidity -error DoesNotExist() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md deleted file mode 100644 index 518efa42..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md +++ /dev/null @@ -1,895 +0,0 @@ -# HypercertMinter - -_bitbeckers_ - -> Contract for managing hypercert claims and whitelists - -Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. - -_Wrapper contract to expose and chain functions._ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### batchBurnFraction - -```solidity -function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenIDs | uint256[] | undefined | - -### batchMintClaimsFromAllowlists - -```solidity -function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable -``` - -Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - -_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| -------- | ----------- | ----------- | -| account | address | undefined | -| proofs | bytes32[][] | undefined | -| claimIDs | uint256[] | undefined | -| units | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256) external nonpayable -``` - -Burn a claimtoken; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| \_2 | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable -``` - -Batch burn claimtokens; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| \_2 | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address _account, uint256 _tokenID) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | - -### createAllowlist - -```solidity -function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Register a claim and the whitelist for minting token(s) belonging to that claim - -_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| merkleRoot | bytes32 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable -``` - -Merge the value of tokens belonging to the same claim - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------- | --------- | ----------- | -| \_account | address | undefined | -| \_fractionIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint a semi-fungible token for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimFromAllowlist - -```solidity -function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable -``` - -Mint a semi-fungible token representing a fraction of the claim - -_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| units | uint256 | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint semi-fungible tokens for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### name - -```solidity -function name() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### readTransferRestriction - -```solidity -function readTransferRestriction(uint256 tokenID) external view returns (string) -``` - -TRANSFER RESTRICTIONS - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### splitFraction - -```solidity -function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable -``` - -Split a claimtokens value into parts with summed value equal to the original - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| -------------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | -| \_newFractions | uint256[] | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_see { IHypercertMetadata}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | ----------- | -| \_uri | string | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md deleted file mode 100644 index e31e8840..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md +++ /dev/null @@ -1,434 +0,0 @@ -# HypercertTrader - -_bitbeckers_ - -> Contract for managing hypercert trades - -Implementation of the HypercertTrader Interface - -## Methods - -### batchBuyUnits - -```solidity -function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable -``` - -This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. - -_Buys Hypercert tokens from multiple existing offers in a single transaction._ - -#### Parameters - -| Name | Type | Description | -| ------------------- | --------- | -------------------------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerIDs | uint256[] | The list of IDs of the offers to buy from. | -| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | -| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | -| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | - -### buyUnits - -```solidity -function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable -``` - -This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. - -_Buys Hypercert tokens from an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | --------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerID | uint256 | The ID of the offer to buy from. | -| unitAmount | uint256 | The number of units to buy. | -| buyToken | address | The address of the token used for payment. | -| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | - -### cancelOffer - -```solidity -function cancelOffer(uint256 offerID) external nonpayable -``` - -This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. - -_Cancels an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ------------------------------ | -| offerID | uint256 | The ID of the offer to cancel. | - -### createOffer - -```solidity -function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | -------------------------------- | ----------- | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| unitsForSale | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -### getOffer - -```solidity -function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------- | ----------- | -| \_0 | IHypercertTrader.Offer | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### offers - -```solidity -function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | --------------------------------- | ----------- | -| offerer | address | undefined | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| unitsAvailable | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| offerType | enum IHypercertTrader.OfferType | undefined | -| status | enum IHypercertTrader.OfferStatus | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### totalUnitsForSale - -```solidity -function totalUnitsForSale(address, uint256) external view returns (uint256) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OfferCancelled - -```solidity -event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| creator `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OfferCreated - -```solidity -event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| offerer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Trade - -```solidity -event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| seller `indexed` | address | undefined | -| buyer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID | uint256 | undefined | -| unitsBought | uint256 | undefined | -| buyToken | address | undefined | -| tokenAmountPerUnit | uint256 | undefined | -| offerID | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -## Errors - -### InvalidBuy - -```solidity -error InvalidBuy(string) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### InvalidOffer - -```solidity -error InvalidOffer(string) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### NotAllowed - -```solidity -error NotAllowed() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md deleted file mode 100644 index 13a84632..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md +++ /dev/null @@ -1,39 +0,0 @@ -# IHypercertMinter - -## Methods - -### ownerOf - -```solidity -function ownerOf(uint256 id) external view returns (address) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 id) external view returns (uint256) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md deleted file mode 100644 index a4086e37..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/SemiFungible1155.md +++ /dev/null @@ -1,457 +0,0 @@ -# SemiFungible1155 - -_bitbeckers_ - -> Contract for minting semi-fungible EIP1155 tokens - -Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` - -_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------------------------------- | -| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | -------------------------------------------- | -| \_uri | string | The metadata URI for the specified token ID. | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md deleted file mode 100644 index 6be07157..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md +++ /dev/null @@ -1,77 +0,0 @@ -# AggregatorV3Interface - -## Methods - -### decimals - -```solidity -function decimals() external view returns (uint8) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ----- | ----------- | -| \_0 | uint8 | undefined | - -### description - -```solidity -function description() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### getRoundData - -```solidity -function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -#### Parameters - -| Name | Type | Description | -| --------- | ------ | ----------- | -| \_roundId | uint80 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| roundId | uint80 | undefined | -| answer | int256 | undefined | -| startedAt | uint256 | undefined | -| updatedAt | uint256 | undefined | -| answeredInRound | uint80 | undefined | - -### latestRoundData - -```solidity -function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -#### Returns - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| roundId | uint80 | undefined | -| answer | int256 | undefined | -| startedAt | uint256 | undefined | -| updatedAt | uint256 | undefined | -| answeredInRound | uint80 | undefined | - -### version - -```solidity -function version() external view returns (uint256) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md deleted file mode 100644 index 8d14ad8c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md +++ /dev/null @@ -1 +0,0 @@ -# console diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md deleted file mode 100644 index cb666cd3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md +++ /dev/null @@ -1,3 +0,0 @@ -# console2 - -_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md deleted file mode 100644 index 72455b43..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IAllowlist.md +++ /dev/null @@ -1,29 +0,0 @@ -# IAllowlist - -_bitbeckers_ - -> Interface for allowlist - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md deleted file mode 100644 index 30ed6f95..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertToken.md +++ /dev/null @@ -1,192 +0,0 @@ -# IHypercertToken - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### batchBurnFraction - -```solidity -function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable -``` - -Operator must be allowed by `creator` and the tokens must represent the total amount of available units. - -_Function to burn the tokens at `tokenIDs` for `account`_ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address account, uint256 tokenID) external nonpayable -``` - -Operator must be allowed by `creator` and the token must represent the total amount of available units. - -_Function to burn the token at `tokenID` for `account`_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address account, uint256[] tokenIDs) external nonpayable -``` - -Tokens that have been merged are burned. - -_Function called to merge tokens within `tokenIDs`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### splitFraction - -```solidity -function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable -``` - -The sum of `values` must equal the current value of `_tokenID`. - -_Function called to split `tokenID` owned by `account` into units declared in `values`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | -| \_values | uint256[] | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string metadata) -``` - -_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------ | ----------- | -| metadata | string | undefined | - -## Events - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md deleted file mode 100644 index 06fb700c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md +++ /dev/null @@ -1,133 +0,0 @@ -# IHypercertTrader - -_bitbeckers_ - -> Interface for hypercert token trading - -This interface declares the required functionality to interact with the hypercert marketplace - -## Methods - -### batchBuyUnits - -```solidity -function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable -``` - -_Buys Hypercert tokens from multiple existing offers in a single transaction._ - -#### Parameters - -| Name | Type | Description | -| ------------------- | --------- | -------------------------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerIDs | uint256[] | The list of IDs of the offers to buy from. | -| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | -| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | -| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | - -### buyUnits - -```solidity -function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable -``` - -_Buys Hypercert tokens from an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | --------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerID | uint256 | The ID of the offer to buy from. | -| unitAmount | uint256 | The number of units to buy. | -| buyToken | address | The address of the token used for payment. | -| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | - -### cancelOffer - -```solidity -function cancelOffer(uint256 offerID) external nonpayable -``` - -_Cancels an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ------------------------------ | -| offerID | uint256 | The ID of the offer to cancel. | - -### createOffer - -```solidity -function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | -------------------------------- | ----------- | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| units | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -## Events - -### OfferCancelled - -```solidity -event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| creator `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OfferCreated - -```solidity -event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| offerer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### Trade - -```solidity -event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| seller `indexed` | address | undefined | -| buyer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID | uint256 | undefined | -| unitsBought | uint256 | undefined | -| buyToken | address | undefined | -| tokenAmountPerUnit | uint256 | undefined | -| offerID | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md deleted file mode 100644 index 93fe0124..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/libs/Errors.md +++ /dev/null @@ -1,59 +0,0 @@ -# Errors - -_bitbeckers_ - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md deleted file mode 100644 index 4cb96bfc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md +++ /dev/null @@ -1,46 +0,0 @@ -# BatchOrderTypehashRegistry - -_LooksRare protocol team (👀,💎)_ - -> BatchOrderTypehashRegistry - -The contract generates the batch order hash that is used to compute the digest for signature verification. - -## Methods - -### hashBatchOrder - -```solidity -function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) -``` - -This function returns the hash of the concatenation of batch order type hash and merkle root. - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ------------------- | -| root | bytes32 | Merkle root | -| proofLength | uint256 | Merkle proof length | - -#### Returns - -| Name | Type | Description | -| -------------- | ------- | -------------------- | -| batchOrderHash | bytes32 | The batch order hash | - -## Errors - -### MerkleProofTooLarge - -```solidity -error MerkleProofTooLarge(uint256 length) -``` - -It is returned if the length of the merkle proof provided is greater than tolerated. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ------------ | -| length | uint256 | Proof length | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md deleted file mode 100644 index a32aef65..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md +++ /dev/null @@ -1,76 +0,0 @@ -# CreatorFeeManagerWithRebates - -_LooksRare protocol team (👀,💎)_ - -> CreatorFeeManagerWithRebates - -This contract returns the creator fee address and the creator rebate amount. - -## Methods - -### STANDARD_ROYALTY_FEE_BP - -```solidity -function STANDARD_ROYALTY_FEE_BP() external view returns (uint256) -``` - -Standard royalty fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### royaltyFeeRegistry - -```solidity -function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) -``` - -Royalty fee registry interface. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | contract IRoyaltyFeeRegistry | undefined | - -### viewCreatorFeeInfo - -```solidity -function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) -``` - -This function returns the creator address and calculates the creator fee amount. - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | -| itemIds | uint256[] | Array of item ids | - -#### Returns - -| Name | Type | Description | -| ---------------- | ------- | ------------------ | -| creator | address | Creator address | -| creatorFeeAmount | uint256 | Creator fee amount | - -## Errors - -### BundleEIP2981NotAllowed - -```solidity -error BundleEIP2981NotAllowed(address collection) -``` - -It is returned if the bundle contains multiple itemIds with different creator fee structure. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md deleted file mode 100644 index 41cab900..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md +++ /dev/null @@ -1,64 +0,0 @@ -# CreatorFeeManagerWithRoyalties - -_LooksRare protocol team (👀,💎)_ - -> CreatorFeeManagerWithRoyalties - -This contract returns the creator fee address and the creator fee amount. - -## Methods - -### royaltyFeeRegistry - -```solidity -function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) -``` - -Royalty fee registry interface. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | contract IRoyaltyFeeRegistry | undefined | - -### viewCreatorFeeInfo - -```solidity -function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) -``` - -This function returns the creator address and calculates the creator fee amount. - -_There are two on-chain sources for the royalty fee to distribute. 1. RoyaltyFeeRegistry: It is an on-chain registry where creator fee is defined for all items of a collection. 2. ERC2981: The NFT Royalty Standard where royalty fee is defined at a itemId level in a collection. The on-chain logic looks up the registry first. If it does not find anything, it checks if a collection is ERC2981. If so, it fetches the proper royalty information for the itemId. For a bundle that contains multiple itemIds (for a collection using ERC2981), if the royalty fee/recipient differ among the itemIds part of the bundle, the trade reverts. This contract DOES NOT enforce any restriction for extremely high creator fee, nor verifies the creator fee fetched is inferior to the total price. If any contract relies on it to build an on-chain royalty logic, it should implement protection against: (1) high royalties (2) potential unexpected royalty changes that can occur after the creation of the order._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | -| itemIds | uint256[] | Array of item ids | - -#### Returns - -| Name | Type | Description | -| ---------------- | ------- | ------------------ | -| creator | address | Creator address | -| creatorFeeAmount | uint256 | Creator fee amount | - -## Errors - -### BundleEIP2981NotAllowed - -```solidity -error BundleEIP2981NotAllowed(address collection) -``` - -It is returned if the bundle contains multiple itemIds with different creator fee structure. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md deleted file mode 100644 index 9ff1c0fc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/CurrencyManager.md +++ /dev/null @@ -1,250 +0,0 @@ -# CurrencyManager - -_LooksRare protocol team (👀,💎)_ - -> CurrencyManager - -This contract manages the list of valid fungible currencies. - -## Methods - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -## Errors - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md deleted file mode 100644 index 83eefc37..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ExecutionManager.md +++ /dev/null @@ -1,751 +0,0 @@ -# ExecutionManager - -_LooksRare protocol team (👀,💎); bitbeckers;_ - -> ExecutionManager - -This contract handles the execution and resolution of transactions. A transaction is executed on-chain when an off-chain maker order is matched by on-chain taker order of a different kind. For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -Creator fee manager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint16) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | uint16 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### protocolFeeRecipient - -```solidity -function protocolFeeRecipient() external view returns (address) -``` - -Protocol fee recipient. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### updateCreatorFeeManager - -```solidity -function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable -``` - -This function allows the owner to update the creator fee manager address. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ---------------------------------- | -| newCreatorFeeManager | address | Address of the creator fee manager | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateMaxCreatorFeeBp - -```solidity -function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable -``` - -This function allows the owner to update the maximum creator fee (in basis point). - -_The maximum value that can be set is 25%. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------ | ---------------------------------------- | -| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | - -### updateProtocolFeeRecipient - -```solidity -function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable -``` - -This function allows the owner to update the protocol fee recipient. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ---------------------------------- | -| newProtocolFeeRecipient | address | New protocol fee recipient address | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| creatorFeeManager | address | undefined | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| maxCreatorFeeBp | uint256 | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------- | -| protocolFeeRecipient | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -## Errors - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md deleted file mode 100644 index 022cce57..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/InheritedStrategy.md +++ /dev/null @@ -1,9 +0,0 @@ -# InheritedStrategy - -_LooksRare protocol team (👀,💎)_ - -> InheritedStrategy - -This contract handles the verification of parameters for standard transactions. It does not verify the taker struct's itemIds and amounts array as well as minPrice (taker ask) / maxPrice (taker bid) because before the taker executes the transaction and the maker itemIds/amounts/price should have already been confirmed off-chain. - -_A standard transaction (bid or ask) is mapped to strategyId = 0._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md deleted file mode 100644 index cc542c7e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/LooksRareProtocol.md +++ /dev/null @@ -1,1157 +0,0 @@ -# LooksRareProtocol - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> LooksRareProtocol - -This contract is the core smart contract of the LooksRare protocol ("v2"). It is the main entry point for users to initiate transactions with taker orders and manage the cancellation of maker orders, which exist off-chain. ~~~~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~- ~~~~~~~~ ~~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~~ ~~~~~~~~ ~~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~~~~ - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### WETH - -```solidity -function WETH() external view returns (address) -``` - -Wrapped ETH. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### chainId - -```solidity -function chainId() external view returns (uint256) -``` - -Current chainId. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -Creator fee manager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### domainSeparator - -```solidity -function domainSeparator() external view returns (bytes32) -``` - -Current domain separator. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### executeMultipleTakerBids - -```solidity -function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable -``` - -#### Parameters - -| Name | Type | Description | -| --------------- | ------------------------- | ----------- | -| takerBids | OrderStructs.Taker[] | undefined | -| makerAsks | OrderStructs.Maker[] | undefined | -| makerSignatures | bytes[] | undefined | -| merkleTrees | OrderStructs.MerkleTree[] | undefined | -| isAtomic | bool | undefined | - -### executeTakerAsk - -```solidity -function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -### executeTakerBid - -```solidity -function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -### hashBatchOrder - -```solidity -function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) -``` - -This function returns the hash of the concatenation of batch order type hash and merkle root. - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ------------------- | -| root | bytes32 | Merkle root | -| proofLength | uint256 | Merkle proof length | - -#### Returns - -| Name | Type | Description | -| -------------- | ------- | -------------------- | -| batchOrderHash | bytes32 | The batch order hash | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint16) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | uint16 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### protocolFeeRecipient - -```solidity -function protocolFeeRecipient() external view returns (address) -``` - -Protocol fee recipient. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### restrictedExecuteTakerBid - -```solidity -function restrictedExecuteTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, address sender, bytes32 orderHash) external nonpayable returns (uint256 protocolFeeAmount) -``` - -#### Parameters - -| Name | Type | Description | -| --------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | -| sender | address | undefined | -| orderHash | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| protocolFeeAmount | uint256 | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### transferManager - -```solidity -function transferManager() external view returns (contract TransferManager) -``` - -Transfer manager for ERC721, ERC1155 and Hypercerts. - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------ | ----------- | -| \_0 | contract TransferManager | undefined | - -### updateCreatorFeeManager - -```solidity -function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable -``` - -This function allows the owner to update the creator fee manager address. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ---------------------------------- | -| newCreatorFeeManager | address | Address of the creator fee manager | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateDomainSeparator - -```solidity -function updateDomainSeparator() external nonpayable -``` - -This function allows the owner to update the domain separator (if possible). - -_Only callable by owner. If there is a fork of the network with a new chainId, it allows the owner to reset the domain separator for the new chain id._ - -### updateETHGasLimitForTransfer - -```solidity -function updateETHGasLimitForTransfer(uint256 newGasLimitETHTransfer) external nonpayable -``` - -This function allows the owner to update the maximum ETH gas limit for a standard transfer. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------ | -| newGasLimitETHTransfer | uint256 | New gas limit for ETH transfer | - -### updateMaxCreatorFeeBp - -```solidity -function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable -``` - -This function allows the owner to update the maximum creator fee (in basis point). - -_The maximum value that can be set is 25%. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------ | ---------------------------------------- | -| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | - -### updateProtocolFeeRecipient - -```solidity -function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable -``` - -This function allows the owner to update the protocol fee recipient. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ---------------------------------- | -| newProtocolFeeRecipient | address | New protocol fee recipient address | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| creatorFeeManager | address | undefined | - -### NewDomainSeparator - -```solidity -event NewDomainSeparator() -``` - -It is emitted if there is a change in the domain separator. - -### NewGasLimitETHTransfer - -```solidity -event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) -``` - -It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). - -#### Parameters - -| Name | Type | Description | -| ------------------- | ------- | ----------- | -| gasLimitETHTransfer | uint256 | undefined | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| maxCreatorFeeBp | uint256 | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------- | -| protocolFeeRecipient | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -### TakerAsk - -```solidity -event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker ask transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | -| askUser | address | undefined | -| bidUser | address | undefined | -| strategyId | uint256 | undefined | -| currency | address | undefined | -| collection | address | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| feeRecipients | address[2] | undefined | -| feeAmounts | uint256[3] | undefined | - -### TakerBid - -```solidity -event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker bid transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | -| bidUser | address | undefined | -| bidRecipient | address | undefined | -| strategyId | uint256 | undefined | -| currency | address | undefined | -| collection | address | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| feeRecipients | address[2] | undefined | -| feeAmounts | uint256[3] | undefined | - -## Errors - -### CallerInvalid - -```solidity -error CallerInvalid() -``` - -It is returned if the function cannot be called by the sender. - -### ChainIdInvalid - -```solidity -error ChainIdInvalid() -``` - -It is returned if the domain separator should change. - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### CurrencyInvalid - -```solidity -error CurrencyInvalid() -``` - -It is returned if the currency is invalid. - -### ERC20TransferFromFail - -```solidity -error ERC20TransferFromFail() -``` - -It is emitted if the ERC20 transferFrom fails. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### MerkleProofInvalid - -```solidity -error MerkleProofInvalid() -``` - -It is returned if the merkle proof provided is invalid. - -### MerkleProofTooLarge - -```solidity -error MerkleProofTooLarge(uint256 length) -``` - -It is returned if the length of the merkle proof provided is greater than tolerated. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ------------ | -| length | uint256 | Proof length | - -### NewGasLimitETHTransferTooLow - -```solidity -error NewGasLimitETHTransferTooLow() -``` - -It is returned if the gas limit for a standard ETH transfer is too low. - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### NoncesInvalid - -```solidity -error NoncesInvalid() -``` - -It is returned if the nonces are invalid. - -### NotAContract - -```solidity -error NotAContract() -``` - -It is emitted if the call recipient is not a contract. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### NullSignerAddress - -```solidity -error NullSignerAddress() -``` - -It is emitted if the signer is null. - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### QuoteTypeInvalid - -```solidity -error QuoteTypeInvalid() -``` - -It is returned if the maker quote type is invalid. - -### ReentrancyFail - -```solidity -error ReentrancyFail() -``` - -This is returned when there is a reentrant call. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### SameDomainSeparator - -```solidity -error SameDomainSeparator() -``` - -It is returned if the domain separator cannot be updated (i.e. the chainId is the same). - -### SignatureEOAInvalid - -```solidity -error SignatureEOAInvalid() -``` - -It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). - -### SignatureERC1271Invalid - -```solidity -error SignatureERC1271Invalid() -``` - -It is emitted if the signature is invalid for a ERC1271 contract signer. - -### SignatureLengthInvalid - -```solidity -error SignatureLengthInvalid(uint256 length) -``` - -It is emitted if the signature's length is neither 64 nor 65 bytes. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| length | uint256 | undefined | - -### SignatureParameterSInvalid - -```solidity -error SignatureParameterSInvalid() -``` - -It is emitted if the signature is invalid due to S parameter. - -### SignatureParameterVInvalid - -```solidity -error SignatureParameterVInvalid(uint8 v) -``` - -It is emitted if the signature is invalid due to V parameter. - -#### Parameters - -| Name | Type | Description | -| ---- | ----- | ----------- | -| v | uint8 | undefined | - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### UnsupportedCollectionType - -```solidity -error UnsupportedCollectionType() -``` - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md deleted file mode 100644 index fea95495..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/NonceManager.md +++ /dev/null @@ -1,193 +0,0 @@ -# NonceManager - -_LooksRare protocol team (👀,💎)_ - -> NonceManager - -This contract handles the nonce logic that is used for invalidating maker orders that exist off-chain. The nonce logic revolves around three parts at the user level: - order nonce (orders sharing an order nonce are conditional, OCO-like) - subset (orders can be grouped under a same subset) - bid/ask (all orders can be executed only if the bid/ask nonce matches the user's one on-chain) Only the order nonce is invalidated at the time of the execution of a maker order that contains it. - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -## Errors - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md deleted file mode 100644 index 36f6a35c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/ProtocolFeeRecipient.md +++ /dev/null @@ -1,75 +0,0 @@ -# ProtocolFeeRecipient - -_LooksRare protocol team (👀,💎)_ - -> ProtocolFeeRecipient - -This contract is used to receive protocol fees and transfer them to the fee sharing setter. Fee sharing setter cannot receive ETH directly, so we need to use this contract as a middleman to convert ETH into WETH before sending it. - -## Methods - -### FEE_SHARING_SETTER - -```solidity -function FEE_SHARING_SETTER() external view returns (address) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### WETH - -```solidity -function WETH() external view returns (contract IWETH) -``` - -#### Returns - -| Name | Type | Description | -| ---- | -------------- | ----------- | -| \_0 | contract IWETH | undefined | - -### transferERC20 - -```solidity -function transferERC20(address currency) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ---------------------- | -| currency | address | ERC20 currency address | - -### transferETH - -```solidity -function transferETH() external nonpayable -``` - -## Errors - -### ERC20TransferFail - -```solidity -error ERC20TransferFail() -``` - -It is emitted if the ERC20 transfer fails. - -### NotAContract - -```solidity -error NotAContract() -``` - -It is emitted if the call recipient is not a contract. - -### NothingToTransfer - -```solidity -error NothingToTransfer() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md deleted file mode 100644 index a55f3985..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/StrategyManager.md +++ /dev/null @@ -1,391 +0,0 @@ -# StrategyManager - -_LooksRare protocol team (👀,💎)_ - -> StrategyManager - -This contract handles the addition and the update of execution strategies. - -## Methods - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -## Errors - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md deleted file mode 100644 index c6766114..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferManager.md +++ /dev/null @@ -1,553 +0,0 @@ -# TransferManager - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> TransferManager - -This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. - -_"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ - -## Methods - -### allowOperator - -```solidity -function allowOperator(address operator) external nonpayable -``` - -This function allows an operator to be added for the shared transfer system. Once the operator is allowed, users can grant NFT approvals to this operator. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ------------------------- | -| operator | address | Operator address to allow | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### grantApprovals - -```solidity -function grantApprovals(address[] operators) external nonpayable -``` - -This function allows a user to grant approvals for an array of operators. Users cannot grant approvals if the operator is not allowed by this contract's owner. - -_Each operator address must be globally allowed to be approved._ - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| operators | address[] | Array of operator addresses | - -### hasUserApprovedOperator - -```solidity -function hasUserApprovedOperator(address, address) external view returns (bool) -``` - -This returns whether the user has approved the operator address. The first address is the user and the second address is the operator (e.g. LooksRareProtocol). - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isOperatorAllowed - -```solidity -function isOperatorAllowed(address) external view returns (bool) -``` - -This returns whether the operator address is allowed by this contract's owner. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### removeOperator - -```solidity -function removeOperator(address operator) external nonpayable -``` - -This function allows the user to remove an operator for the shared transfer system. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | -------------------------- | -| operator | address | Operator address to remove | - -### revokeApprovals - -```solidity -function revokeApprovals(address[] operators) external nonpayable -``` - -This function allows a user to revoke existing approvals for an array of operators. - -_Each operator address must be approved at the user level to be revoked._ - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| operators | address[] | Array of operator addresses | - -### splitItemsHypercert - -```solidity -function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function splits and transfers a fraction of a hypercert. - -_It does not allow batch transferring._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -### transferBatchItemsAcrossCollections - -```solidity -function transferBatchItemsAcrossCollections(ITransferManager.BatchTransferItem[] items, address from, address to) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ----- | ------------------------------------ | ----------- | -| items | ITransferManager.BatchTransferItem[] | undefined | -| from | address | undefined | -| to | address | undefined | - -### transferItemsERC1155 - -```solidity -function transferItemsERC1155(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function transfers items for a single ERC1155 collection. - -_It does not allow batch transferring if from = msg.sender since native function should be used._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -### transferItemsERC721 - -```solidity -function transferItemsERC721(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function transfers items for a single ERC721 collection. - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -### transferItemsHypercert - -```solidity -function transferItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function transfers items for a single Hypercert. - -_It does not allow batch transferring if from = msg.sender since native function should be used._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -## Events - -### ApprovalsGranted - -```solidity -event ApprovalsGranted(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are granted by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | ----------- | -| user | address | undefined | -| operators | address[] | undefined | - -### ApprovalsRemoved - -```solidity -event ApprovalsRemoved(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are revoked by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | ----------- | -| user | address | undefined | -| operators | address[] | undefined | - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### OperatorAllowed - -```solidity -event OperatorAllowed(address operator) -``` - -It is emitted if a new operator is added to the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | - -### OperatorRemoved - -```solidity -event OperatorRemoved(address operator) -``` - -It is emitted if an operator is removed from the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | - -## Errors - -### AmountInvalid - -```solidity -error AmountInvalid() -``` - -It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. - -### ERC1155SafeBatchTransferFromFail - -```solidity -error ERC1155SafeBatchTransferFromFail() -``` - -It is emitted if the ERC1155 safeBatchTransferFrom fails. - -### ERC1155SafeTransferFromFail - -```solidity -error ERC1155SafeTransferFromFail() -``` - -It is emitted if the ERC1155 safeTransferFrom fails. - -### ERC721TransferFromFail - -```solidity -error ERC721TransferFromFail() -``` - -It is emitted if the ERC721 transferFrom fails. - -### HypercertSplitFractionError - -```solidity -error HypercertSplitFractionError() -``` - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotAContract - -```solidity -error NotAContract() -``` - -It is emitted if the call recipient is not a contract. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### OperatorAlreadyAllowed - -```solidity -error OperatorAlreadyAllowed() -``` - -It is returned if the transfer caller is already allowed by the owner. - -_This error can only be returned for owner operations._ - -### OperatorAlreadyApprovedByUser - -```solidity -error OperatorAlreadyApprovedByUser() -``` - -It is returned if the operator to approve has already been approved by the user. - -### OperatorNotAllowed - -```solidity -error OperatorNotAllowed() -``` - -It is returned if the operator to approve is not in the global allowlist defined by the owner. - -_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ - -### OperatorNotApprovedByUser - -```solidity -error OperatorNotApprovedByUser() -``` - -It is returned if the operator to revoke has not been previously approved by the user. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferCallerInvalid - -```solidity -error TransferCallerInvalid() -``` - -It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md deleted file mode 100644 index 9011bd50..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/TransferSelectorNFT.md +++ /dev/null @@ -1,779 +0,0 @@ -# TransferSelectorNFT - -_LooksRare protocol team (👀,💎); bitbeckers;_ - -> TransferSelectorNFT - -This contract handles the logic for transferring non-fungible items. - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -Creator fee manager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint16) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | uint16 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### protocolFeeRecipient - -```solidity -function protocolFeeRecipient() external view returns (address) -``` - -Protocol fee recipient. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### transferManager - -```solidity -function transferManager() external view returns (contract TransferManager) -``` - -Transfer manager for ERC721, ERC1155 and Hypercerts. - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------ | ----------- | -| \_0 | contract TransferManager | undefined | - -### updateCreatorFeeManager - -```solidity -function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable -``` - -This function allows the owner to update the creator fee manager address. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ---------------------------------- | -| newCreatorFeeManager | address | Address of the creator fee manager | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateMaxCreatorFeeBp - -```solidity -function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable -``` - -This function allows the owner to update the maximum creator fee (in basis point). - -_The maximum value that can be set is 25%. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------ | ---------------------------------------- | -| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | - -### updateProtocolFeeRecipient - -```solidity -function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable -``` - -This function allows the owner to update the protocol fee recipient. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ---------------------------------- | -| newProtocolFeeRecipient | address | New protocol fee recipient address | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| creatorFeeManager | address | undefined | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| maxCreatorFeeBp | uint256 | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------- | -| protocolFeeRecipient | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -## Errors - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### ReentrancyFail - -```solidity -error ReentrancyFail() -``` - -This is returned when there is a reentrant call. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### UnsupportedCollectionType - -```solidity -error UnsupportedCollectionType() -``` - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md deleted file mode 100644 index 37866658..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md +++ /dev/null @@ -1,41 +0,0 @@ -# BaseStrategy - -_LooksRare protocol team (👀,💎)_ - -> BaseStrategy - -## Methods - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerOrder | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md deleted file mode 100644 index c9503939..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md +++ /dev/null @@ -1,212 +0,0 @@ -# BaseStrategyChainlinkPriceLatency - -_LooksRare protocol team (👀,💎)_ - -> BaseStrategyChainlinkPriceLatency - -This contract allows the owner to define the maximum acceptable Chainlink price latency. - -## Methods - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### maxLatency - -```solidity -function maxLatency() external view returns (uint256) -``` - -Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -## Errors - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md deleted file mode 100644 index e2d77dd3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md +++ /dev/null @@ -1,342 +0,0 @@ -# StrategyChainlinkUSDDynamicAsk - -_LooksRare protocol team (👀,💎)_ - -> StrategyChainlinkUSDDynamicAsk - -This contract allows a seller to sell an NFT priced in USD and the receivable amount to be in ETH. - -## Methods - -### ETH_USD_PRICE_FEED_DECIMALS - -```solidity -function ETH_USD_PRICE_FEED_DECIMALS() external view returns (uint256) -``` - -_It is possible to call priceFeed.decimals() to get the decimals, but to save gas, it is hard coded instead._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### WETH - -```solidity -function WETH() external view returns (address) -``` - -Wrapped ether (WETH) address. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### executeStrategyWithTakerBid - -```solidity -function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerAsk | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -### maxLatency - -```solidity -function maxLatency() external view returns (uint256) -``` - -Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### priceFeed - -```solidity -function priceFeed() external view returns (contract AggregatorV3Interface) -``` - -ETH/USD Chainlink price feed - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------------ | ----------- | -| \_0 | contract AggregatorV3Interface | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -## Errors - -### BidTooLow - -```solidity -error BidTooLow() -``` - -It is returned if the bid price is too low for the ask user. - -### ChainlinkPriceInvalid - -```solidity -error ChainlinkPriceInvalid() -``` - -It is returned if the Chainlink price is invalid (e.g. negative). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. - -### PriceNotRecentEnough - -```solidity -error PriceNotRecentEnough() -``` - -It is returned if the current block time relative to the latest price's update time is greater than the latency tolerance. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md deleted file mode 100644 index ddec4495..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md +++ /dev/null @@ -1,127 +0,0 @@ -# StrategyCollectionOffer - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> StrategyCollectionOffer - -This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount must be 1 (fractions are NFTs) - -## Methods - -### executeCollectionStrategyWithTakerAsk - -```solidity -function executeCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### executeCollectionStrategyWithTakerAskWithAllowlist - -```solidity -function executeCollectionStrategyWithTakerAskWithAllowlist(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### executeCollectionStrategyWithTakerAskWithProof - -```solidity -function executeCollectionStrategyWithTakerAskWithProof(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerBid | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### MerkleProofInvalid - -```solidity -error MerkleProofInvalid() -``` - -It is returned if the merkle proof provided is invalid. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md deleted file mode 100644 index 1227878d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md +++ /dev/null @@ -1,83 +0,0 @@ -# StrategyDutchAuction - -_LooksRare protocol team (👀,💎)_ - -> StrategyDutchAuction - -This contract offers a single execution strategy for users to create Dutch auctions. - -## Methods - -### executeStrategyWithTakerBid - -```solidity -function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerAsk | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### BidTooLow - -```solidity -error BidTooLow() -``` - -It is returned if the bid price is too low for the ask user. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md deleted file mode 100644 index daa427e4..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md +++ /dev/null @@ -1,123 +0,0 @@ -# StrategyHypercertFractionOffer - -_LooksRare protocol team (👀,💎); bitbeckers;_ - -> StrategyHypercertFractionOffer - -This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. - -_Use cases can include tiered pricing; think early bird tickets._ - -## Methods - -### executeHypercertFractionStrategyWithTakerBid - -```solidity -function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### executeHypercertFractionStrategyWithTakerBidWithAllowlist - -```solidity -function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerAsk | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### AmountInvalid - -```solidity -error AmountInvalid() -``` - -It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### MerkleProofInvalid - -```solidity -error MerkleProofInvalid() -``` - -It is returned if the merkle proof provided is invalid. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md deleted file mode 100644 index 6a1f0cd5..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md +++ /dev/null @@ -1,75 +0,0 @@ -# StrategyItemIdsRange - -_LooksRare protocol team (👀,💎)_ - -> StrategyItemIdsRange - -This contract offers a single execution strategy for users to bid on a specific amount of items in a range bounded by 2 item ids. - -## Methods - -### executeStrategyWithTakerAsk - -```solidity -function executeStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerBid | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md deleted file mode 100644 index 76918fc5..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md +++ /dev/null @@ -1,215 +0,0 @@ -# OrderValidatorV2A - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> OrderValidatorV2A - -This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) - -_This version does not handle strategies with partial fills._ - -## Methods - -### CRITERIA_GROUPS - -```solidity -function CRITERIA_GROUPS() external view returns (uint256) -``` - -Number of distinct criteria groups checked to evaluate the validity of an order. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### ERC1155_INTERFACE_ID - -```solidity -function ERC1155_INTERFACE_ID() external view returns (bytes4) -``` - -ERC1155 interfaceId. - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### ERC721_INTERFACE_ID_1 - -```solidity -function ERC721_INTERFACE_ID_1() external view returns (bytes4) -``` - -ERC721 potential interfaceId. - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### ERC721_INTERFACE_ID_2 - -```solidity -function ERC721_INTERFACE_ID_2() external view returns (bytes4) -``` - -ERC721 potential interfaceId. - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### HYPERCERT_INTERFACE_ID - -```solidity -function HYPERCERT_INTERFACE_ID() external view returns (bytes4) -``` - -Hypercert interfaceId - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### checkMakerOrderValidity - -```solidity -function checkMakerOrderValidity(OrderStructs.Maker makerOrder, bytes signature, OrderStructs.MerkleTree merkleTree) external view returns (uint256[9] validationCodes) -``` - -#### Parameters - -| Name | Type | Description | -| ---------- | ----------------------- | ----------- | -| makerOrder | OrderStructs.Maker | undefined | -| signature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -#### Returns - -| Name | Type | Description | -| --------------- | ---------- | ----------- | -| validationCodes | uint256[9] | undefined | - -### checkMultipleMakerOrderValidities - -```solidity -function checkMultipleMakerOrderValidities(OrderStructs.Maker[] makerOrders, bytes[] signatures, OrderStructs.MerkleTree[] merkleTrees) external view returns (uint256[9][] validationCodes) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------------------------- | ----------- | -| makerOrders | OrderStructs.Maker[] | undefined | -| signatures | bytes[] | undefined | -| merkleTrees | OrderStructs.MerkleTree[] | undefined | - -#### Returns - -| Name | Type | Description | -| --------------- | ------------ | ----------- | -| validationCodes | uint256[9][] | undefined | - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -CreatorFeeManager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### deriveProtocolParameters - -```solidity -function deriveProtocolParameters() external nonpayable -``` - -Derive protocol parameters. Anyone can call this function. - -_It allows adjusting if the domain separator or creator fee manager address were to change._ - -### domainSeparator - -```solidity -function domainSeparator() external view returns (bytes32) -``` - -LooksRareProtocol domain separator. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### looksRareProtocol - -```solidity -function looksRareProtocol() external view returns (contract LooksRareProtocol) -``` - -LooksRareProtocol. - -#### Returns - -| Name | Type | Description | -| ---- | -------------------------- | ----------- | -| \_0 | contract LooksRareProtocol | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint256) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### transferManager - -```solidity -function transferManager() external view returns (contract TransferManager) -``` - -TransferManager - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------ | ----------- | -| \_0 | contract TransferManager | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md deleted file mode 100644 index 91be29a9..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md +++ /dev/null @@ -1,159 +0,0 @@ -# ProtocolHelpers - -_LooksRare protocol team (👀,💎)_ - -> ProtocolHelpers - -This contract contains helper view functions for order creation. - -## Methods - -### computeDigestMerkleTree - -```solidity -function computeDigestMerkleTree(OrderStructs.MerkleTree merkleTree) external view returns (bytes32 digest) -``` - -#### Parameters - -| Name | Type | Description | -| ---------- | ----------------------- | ----------- | -| merkleTree | OrderStructs.MerkleTree | undefined | - -#### Returns - -| Name | Type | Description | -| ------ | ------- | ----------- | -| digest | bytes32 | undefined | - -### computeMakerDigest - -```solidity -function computeMakerDigest(OrderStructs.Maker maker) external view returns (bytes32 digest) -``` - -#### Parameters - -| Name | Type | Description | -| ----- | ------------------ | ----------- | -| maker | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------ | ------- | ----------- | -| digest | bytes32 | undefined | - -### looksRareProtocol - -```solidity -function looksRareProtocol() external view returns (contract LooksRareProtocol) -``` - -#### Returns - -| Name | Type | Description | -| ---- | -------------------------- | ----------- | -| \_0 | contract LooksRareProtocol | undefined | - -### verifyMakerSignature - -```solidity -function verifyMakerSignature(OrderStructs.Maker maker, bytes makerSignature, address signer) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ------------------ | ----------- | -| maker | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| signer | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### verifyMerkleTree - -```solidity -function verifyMerkleTree(OrderStructs.MerkleTree merkleTree, bytes makerSignature, address signer) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| merkleTree | OrderStructs.MerkleTree | undefined | -| makerSignature | bytes | undefined | -| signer | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Errors - -### NullSignerAddress - -```solidity -error NullSignerAddress() -``` - -It is emitted if the signer is null. - -### SignatureEOAInvalid - -```solidity -error SignatureEOAInvalid() -``` - -It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). - -### SignatureERC1271Invalid - -```solidity -error SignatureERC1271Invalid() -``` - -It is emitted if the signature is invalid for a ERC1271 contract signer. - -### SignatureLengthInvalid - -```solidity -error SignatureLengthInvalid(uint256 length) -``` - -It is emitted if the signature's length is neither 64 nor 65 bytes. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| length | uint256 | undefined | - -### SignatureParameterSInvalid - -```solidity -error SignatureParameterSInvalid() -``` - -It is emitted if the signature is invalid due to S parameter. - -### SignatureParameterVInvalid - -```solidity -error SignatureParameterVInvalid(uint8 v) -``` - -It is emitted if the signature is invalid due to V parameter. - -#### Parameters - -| Name | Type | Description | -| ---- | ----- | ----------- | -| v | uint8 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md deleted file mode 100644 index b832744e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md +++ /dev/null @@ -1,60 +0,0 @@ -# ICreatorFeeManager - -_LooksRare protocol team (👀,💎)_ - -> ICreatorFeeManager - -## Methods - -### royaltyFeeRegistry - -```solidity -function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry royaltyFeeRegistry) -``` - -It returns the royalty fee registry address/interface. - -#### Returns - -| Name | Type | Description | -| ------------------ | ---------------------------- | ------------------------------------- | -| royaltyFeeRegistry | contract IRoyaltyFeeRegistry | Interface of the royalty fee registry | - -### viewCreatorFeeInfo - -```solidity -function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) -``` - -This function returns the creator address and calculates the creator fee amount. - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | -| itemIds | uint256[] | Array of item ids | - -#### Returns - -| Name | Type | Description | -| ---------------- | ------- | ------------------ | -| creator | address | Creator address | -| creatorFeeAmount | uint256 | Creator fee amount | - -## Errors - -### BundleEIP2981NotAllowed - -```solidity -error BundleEIP2981NotAllowed(address collection) -``` - -It is returned if the bundle contains multiple itemIds with different creator fee structure. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md deleted file mode 100644 index da683d8c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md +++ /dev/null @@ -1,22 +0,0 @@ -# ICurrencyManager - -_LooksRare protocol team (👀,💎)_ - -> ICurrencyManager - -## Events - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------------------------------- | -| currency | address | Currency address (address(0) = ETH) | -| isAllowed | bool | Whether the currency is allowed | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md deleted file mode 100644 index 0e86c75b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IExecutionManager.md +++ /dev/null @@ -1,99 +0,0 @@ -# IExecutionManager - -_LooksRare protocol team (👀,💎)_ - -> IExecutionManager - -## Events - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | -------------------------------------- | -| creatorFeeManager | address | Address of the new creator fee manager | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ---------------------------------------- | -| maxCreatorFeeBp | uint256 | New maximum creator fee (in basis point) | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------------------------------------- | -| protocolFeeRecipient | address | Address of the new protocol fee recipient | - -## Errors - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md deleted file mode 100644 index 393cb24b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md +++ /dev/null @@ -1,41 +0,0 @@ -# IImmutableCreate2Factory - -## Methods - -### findCreate2Address - -```solidity -function findCreate2Address(bytes32 salt, bytes initializationCode) external view returns (address deploymentAddress) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| salt | bytes32 | undefined | -| initializationCode | bytes | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| deploymentAddress | address | undefined | - -### safeCreate2 - -```solidity -function safeCreate2(bytes32 salt, bytes initializationCode) external payable returns (address deploymentAddress) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| salt | bytes32 | undefined | -| initializationCode | bytes | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| deploymentAddress | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md deleted file mode 100644 index e7414f54..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md +++ /dev/null @@ -1,157 +0,0 @@ -# ILooksRareProtocol - -_LooksRare protocol team (👀,💎)_ - -> ILooksRareProtocol - -## Methods - -### executeMultipleTakerBids - -```solidity -function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable -``` - -#### Parameters - -| Name | Type | Description | -| --------------- | ------------------------- | ----------- | -| takerBids | OrderStructs.Taker[] | undefined | -| makerAsks | OrderStructs.Maker[] | undefined | -| makerSignatures | bytes[] | undefined | -| merkleTrees | OrderStructs.MerkleTree[] | undefined | -| isAtomic | bool | undefined | - -### executeTakerAsk - -```solidity -function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -### executeTakerBid - -```solidity -function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -## Events - -### NewDomainSeparator - -```solidity -event NewDomainSeparator() -``` - -It is emitted if there is a change in the domain separator. - -### NewGasLimitETHTransfer - -```solidity -event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) -``` - -It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). - -#### Parameters - -| Name | Type | Description | -| ------------------- | ------- | ----------------------------- | -| gasLimitETHTransfer | uint256 | Gas limit for an ETH transfer | - -### TakerAsk - -```solidity -event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker ask transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | -| askUser | address | Address of the ask user | -| bidUser | address | Address of the bid user | -| strategyId | uint256 | Id of the strategy | -| currency | address | Address of the currency | -| collection | address | Address of the collection | -| itemIds | uint256[] | Array of item ids | -| amounts | uint256[] | Array of amounts (for item ids) | -| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it can be the taker ask user or different) feeRecipients[1] Creator fee recipient (if none, address(0)) | -| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | - -### TakerBid - -```solidity -event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker bid transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | -| bidUser | address | Address of the bid user | -| bidRecipient | address | Address of the recipient of the bid | -| strategyId | uint256 | Id of the strategy | -| currency | address | Address of the currency | -| collection | address | Address of the collection | -| itemIds | uint256[] | Array of item ids | -| amounts | uint256[] | Array of amounts (for item ids) | -| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it is the maker ask user) feeRecipients[1] Creator fee recipient (if none, address(0)) | -| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | - -## Errors - -### ChainIdInvalid - -```solidity -error ChainIdInvalid() -``` - -It is returned if the domain separator should change. - -### NewGasLimitETHTransferTooLow - -```solidity -error NewGasLimitETHTransferTooLow() -``` - -It is returned if the gas limit for a standard ETH transfer is too low. - -### NoncesInvalid - -```solidity -error NoncesInvalid() -``` - -It is returned if the nonces are invalid. - -### SameDomainSeparator - -```solidity -error SameDomainSeparator() -``` - -It is returned if the domain separator cannot be updated (i.e. the chainId is the same). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md deleted file mode 100644 index eaa3f977..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/INonceManager.md +++ /dev/null @@ -1,53 +0,0 @@ -# INonceManager - -_LooksRare protocol team (👀,💎)_ - -> INonceManager - -## Events - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ------------------- | -| user | address | Address of the user | -| bidNonce | uint256 | New bid nonce | -| askNonce | uint256 | New ask nonce | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ------------------------------- | -| user | address | Address of the user | -| orderNonces | uint256[] | Array of order nonces cancelled | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | -------------------------------- | -| user | address | Address of the user | -| subsetNonces | uint256[] | Array of subset nonces cancelled | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md deleted file mode 100644 index 5ed0ef6c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md +++ /dev/null @@ -1,29 +0,0 @@ -# IRoyaltyFeeRegistry - -_LooksRare protocol team (👀,💎)_ - -> IRoyaltyFeeRegistry - -## Methods - -### royaltyInfo - -```solidity -function royaltyInfo(address collection, uint256 price) external view returns (address receiver, uint256 royaltyFee) -``` - -This function returns the royalty information for a collection at a given transaction price. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | - -#### Returns - -| Name | Type | Description | -| ---------- | ------- | ------------------ | -| receiver | address | Receiver address | -| royaltyFee | uint256 | Royalty fee amount | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md deleted file mode 100644 index 2b4a45bc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategy.md +++ /dev/null @@ -1,41 +0,0 @@ -# IStrategy - -_LooksRare protocol team (👀,💎)_ - -> IStrategy - -## Methods - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool isStrategy) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---------- | ---- | ---------------------------------------------- | -| isStrategy | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerOrder | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md deleted file mode 100644 index ae6ea7b1..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/IStrategyManager.md +++ /dev/null @@ -1,84 +0,0 @@ -# IStrategyManager - -_LooksRare protocol team (👀,💎)_ - -> IStrategyManager - -## Events - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------------- | -| strategyId | uint256 | Id of the new strategy | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the transaction to be executed | -| isMakerBid | bool | Whether the strategyId is for maker bid | -| implementation | address | Address of the implementation of the strategy | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | -------------------------------------------------------- | -| strategyId | uint256 | Id of the strategy | -| isActive | bool | Whether the strategy is active (or not) after the update | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | - -## Errors - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md deleted file mode 100644 index 3ba8ca81..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/interfaces/ITransferManager.md +++ /dev/null @@ -1,111 +0,0 @@ -# ITransferManager - -_LooksRare protocol team (👀,💎)_ - -> ITransferManager - -## Events - -### ApprovalsGranted - -```solidity -event ApprovalsGranted(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are granted by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| user | address | Address of the user | -| operators | address[] | Array of operator addresses | - -### ApprovalsRemoved - -```solidity -event ApprovalsRemoved(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are revoked by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| user | address | Address of the user | -| operators | address[] | Array of operator addresses | - -### OperatorAllowed - -```solidity -event OperatorAllowed(address operator) -``` - -It is emitted if a new operator is added to the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ---------------- | -| operator | address | Operator address | - -### OperatorRemoved - -```solidity -event OperatorRemoved(address operator) -``` - -It is emitted if an operator is removed from the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ---------------- | -| operator | address | Operator address | - -## Errors - -### OperatorAlreadyAllowed - -```solidity -error OperatorAlreadyAllowed() -``` - -It is returned if the transfer caller is already allowed by the owner. - -_This error can only be returned for owner operations._ - -### OperatorAlreadyApprovedByUser - -```solidity -error OperatorAlreadyApprovedByUser() -``` - -It is returned if the operator to approve has already been approved by the user. - -### OperatorNotAllowed - -```solidity -error OperatorNotAllowed() -``` - -It is returned if the operator to approve is not in the global allowlist defined by the owner. - -_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ - -### OperatorNotApprovedByUser - -```solidity -error OperatorNotApprovedByUser() -``` - -It is returned if the operator to revoke has not been previously approved by the user. - -### TransferCallerInvalid - -```solidity -error TransferCallerInvalid() -``` - -It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md deleted file mode 100644 index 1b1f41a2..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/CurrencyValidator.md +++ /dev/null @@ -1,7 +0,0 @@ -# CurrencyValidator - -_LooksRare protocol team (👀,💎)_ - -> CurrencyValidator - -This library validates the order currency to be the chain's native currency or the specified ERC20 token. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md deleted file mode 100644 index 5951cc56..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md +++ /dev/null @@ -1,21 +0,0 @@ -# LowLevelHypercertCaller - -_bitbeckers_ - -> LowLevelHypercertCaller - -This contract contains low-level calls to transfer ERC1155 tokens. - -## Errors - -### HypercertSplitFractionError - -```solidity -error HypercertSplitFractionError() -``` - -### NotAContract - -```solidity -error NotAContract() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md deleted file mode 100644 index 943a54cd..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md +++ /dev/null @@ -1,7 +0,0 @@ -# MerkleProofCalldataWithNodes - -_OpenZeppelin (adjusted by LooksRare)_ - -> MerkleProofCalldataWithNodes - -This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md deleted file mode 100644 index 37529181..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md +++ /dev/null @@ -1,7 +0,0 @@ -# MerkleProofMemory - -_OpenZeppelin (adjusted by LooksRare)_ - -> MerkleProofMemory - -This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md deleted file mode 100644 index 6ffa83e2..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/libraries/OrderStructs.md +++ /dev/null @@ -1,7 +0,0 @@ -# OrderStructs - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> OrderStructs - -This library contains all order struct types for the LooksRare protocol (v2). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md deleted file mode 100644 index 4684053c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md +++ /dev/null @@ -1,84 +0,0 @@ -# AllowlistMinter - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -## Events - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -## Errors - -### DoesNotExist - -```solidity -error DoesNotExist() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md deleted file mode 100644 index 518efa42..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md +++ /dev/null @@ -1,895 +0,0 @@ -# HypercertMinter - -_bitbeckers_ - -> Contract for managing hypercert claims and whitelists - -Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. - -_Wrapper contract to expose and chain functions._ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### batchBurnFraction - -```solidity -function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenIDs | uint256[] | undefined | - -### batchMintClaimsFromAllowlists - -```solidity -function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable -``` - -Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - -_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| -------- | ----------- | ----------- | -| account | address | undefined | -| proofs | bytes32[][] | undefined | -| claimIDs | uint256[] | undefined | -| units | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256) external nonpayable -``` - -Burn a claimtoken; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| \_2 | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable -``` - -Batch burn claimtokens; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| \_2 | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address _account, uint256 _tokenID) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | - -### createAllowlist - -```solidity -function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Register a claim and the whitelist for minting token(s) belonging to that claim - -_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| merkleRoot | bytes32 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable -``` - -Merge the value of tokens belonging to the same claim - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------- | --------- | ----------- | -| \_account | address | undefined | -| \_fractionIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint a semi-fungible token for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimFromAllowlist - -```solidity -function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable -``` - -Mint a semi-fungible token representing a fraction of the claim - -_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| units | uint256 | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint semi-fungible tokens for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### name - -```solidity -function name() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### readTransferRestriction - -```solidity -function readTransferRestriction(uint256 tokenID) external view returns (string) -``` - -TRANSFER RESTRICTIONS - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### splitFraction - -```solidity -function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable -``` - -Split a claimtokens value into parts with summed value equal to the original - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| -------------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | -| \_newFractions | uint256[] | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_see { IHypercertMetadata}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | ----------- | -| \_uri | string | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md deleted file mode 100644 index a4086e37..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md +++ /dev/null @@ -1,457 +0,0 @@ -# SemiFungible1155 - -_bitbeckers_ - -> Contract for minting semi-fungible EIP1155 tokens - -Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` - -_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------------------------------- | -| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | -------------------------------------------- | -| \_uri | string | The metadata URI for the specified token ID. | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md deleted file mode 100644 index 72455b43..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md +++ /dev/null @@ -1,29 +0,0 @@ -# IAllowlist - -_bitbeckers_ - -> Interface for allowlist - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md deleted file mode 100644 index 30ed6f95..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md +++ /dev/null @@ -1,192 +0,0 @@ -# IHypercertToken - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### batchBurnFraction - -```solidity -function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable -``` - -Operator must be allowed by `creator` and the tokens must represent the total amount of available units. - -_Function to burn the tokens at `tokenIDs` for `account`_ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address account, uint256 tokenID) external nonpayable -``` - -Operator must be allowed by `creator` and the token must represent the total amount of available units. - -_Function to burn the token at `tokenID` for `account`_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address account, uint256[] tokenIDs) external nonpayable -``` - -Tokens that have been merged are burned. - -_Function called to merge tokens within `tokenIDs`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### splitFraction - -```solidity -function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable -``` - -The sum of `values` must equal the current value of `_tokenID`. - -_Function called to split `tokenID` owned by `account` into units declared in `values`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | -| \_values | uint256[] | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string metadata) -``` - -_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------ | ----------- | -| metadata | string | undefined | - -## Events - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md deleted file mode 100644 index 93fe0124..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md +++ /dev/null @@ -1,59 +0,0 @@ -# Errors - -_bitbeckers_ - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll deleted file mode 100644 index e2ac6616..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md deleted file mode 100644 index b1434ab0..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md +++ /dev/null @@ -1,185 +0,0 @@ -Hypercerts SDK Documentation / [Exports](modules.md) - -# Hypercert SDK - -## Quickstart Guide - -1. Install the SDK using npm or yarn: - -```bash -npm install @hypercerts-org/sdk -``` - -or - -```bash - yarn add @hypercerts-org/sdk -``` - -2. Import the SDK into your project: - -```bash -import { HypercertClient } from "@hypercerts-org/sdk"; -``` - -3. Create a new instance of the HypercertClient class with your configuration options: - -```js -const client = new HypercertClient({ - chainId: 5, - provider, - signer, - nftStorageToken, - web3StorageToken, -}); -``` - -> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in -> [read-only mode](#read-only-mode) - -4. Use the client object to interact with the Hypercert network. - -For example, you can use the `client.mintClaim` method to create a new claim: - -```js -const tx = await client.mintClaim( - metaData, - totalUnits, - transferRestriction, - overrides, -); -``` - -This will validate the metadata, store it on IPFS, create a new hypercert on-chain and return a transaction receipt. - -You can also use the client to query the subgraph and retrieve which claims an address owns: - -```js -const claims = await client.indexer.fractionsByOwner(owner), -``` - -For more information on how to use the SDK, check out the -[developer documentation](https://hypercerts.org/docs/developer/) and the -[Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet). - -That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. Don't forget to set your -environment variables for your NFT.storage and web3.storage API keys in your .env file. - -## Config - -The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check -the environment variables. - -### Read-only mode - -The SDK client will be in read-only mode if any of the following conditions are true: - -- The client was initialized without a signer or provider. -- The client was initialized with a provider but not a signer. -- The client was initialized with a signer but not a provider. -- The contract address is not set. -- The storage layer is in read-only mode. - -If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a -warning message will be logged indicating that the client is in read-only mode. - -### Defaults - -The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief -explanation of each constant: - -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - -`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object -contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. - -For example: - -```json -{ - "5": { - "chainId": 5, - "chainName": "goerli", - "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "graphName": "hypercerts-testnet" - } -} -``` - -### Client config properties - -| \| Property | Type | Description | -| ------------------ | -------------------- | -------------------------------------- | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | -| `graphName` | `string` | The name of the Gsubgraph to use. | -| `provider` | `providers.Provider` | A custom provider to use. | -| `signer` | `Signer` | A custom signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | - -### Environment variables - -To determine the missing configuration values the SDK defaults to the following environment variables: - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - -### Logging - -The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level -determines which log messages are printed to the console. By default, the logger is configured to log messages with a -level of info or higher to the console. - -## Client modules - -The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient -has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, -HypercertIndexer, and HypercertMinter classes, respectively. - -```js -const { - client: { storage }, -} = new HypercertClient({}); -``` - -The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and -NFT.storage. It is used by the HypercertClient to store metadata when creating new Hypercerts. - -```js -const { - client: { indexer }, -} = new HypercertClient({}); -``` - -The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. -It is used by the HypercertClient to retrieve event-based data via the subgraph - -```js -const { - client: { contract }, -} = new HypercertClient({}); -``` - -Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used -by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. - -By providing instances of these classes through the storage, indexer, and contract getters, the HypercertClient allows -developers to easily interact with the various components of the Hypercert system. For example, a developer could use -the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based -on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the -contract. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md deleted file mode 100644 index 89f2105f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError - -# Class: ClientError - -An error that is caused by a problem with the client. - -## Hierarchy - -- `Error` - - ↳ **`ClientError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](ClientError.md#constructor) - -### Properties - -- [payload](ClientError.md#payload) - -## Constructors - -### constructor - -• **new ClientError**(`message`, `payload?`) - -Creates a new instance of the ClientError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md deleted file mode 100644 index 03813867..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md +++ /dev/null @@ -1,66 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError - -# Class: ConfigurationError - -The configuration was invalid - -## Hierarchy - -- `Error` - - ↳ **`ConfigurationError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](ConfigurationError.md#constructor) - -### Properties - -- [payload](ConfigurationError.md#payload) - -## Constructors - -### constructor - -• **new ConfigurationError**(`message`, `payload?`) - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `message` | `string` | -| `payload?` | `Object` | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md deleted file mode 100644 index d4c9f7c9..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError - -# Class: FetchError - -Fails fetching a remote resource - -## Hierarchy - -- `Error` - - ↳ **`FetchError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](FetchError.md#constructor) - -### Properties - -- [payload](FetchError.md#payload) - -## Constructors - -### constructor - -• **new FetchError**(`message`, `payload?`) - -Creates a new instance of the FetchError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md deleted file mode 100644 index a5a0e900..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md +++ /dev/null @@ -1,493 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient - -# Class: HypercertClient - -Hypercerts client factory - -**`Dev`** - -Creates a Hypercerts client instance - -**`Notice`** - -The client is readonly if no signer is set or if the contract address is not set - -**`Param`** - -Hypercerts client configuration - -**`Param`** - -Hypercerts storage object - -## Implements - -- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) - -## Table of contents - -### Constructors - -- [constructor](HypercertClient.md#constructor) - -### Properties - -- [\_config](HypercertClient.md#_config) -- [\_contract](HypercertClient.md#_contract) -- [\_evaluator](HypercertClient.md#_evaluator) -- [\_indexer](HypercertClient.md#_indexer) -- [\_operator](HypercertClient.md#_operator) -- [\_storage](HypercertClient.md#_storage) -- [readonly](HypercertClient.md#readonly) - -### Accessors - -- [contract](HypercertClient.md#contract) -- [indexer](HypercertClient.md#indexer) -- [storage](HypercertClient.md#storage) - -### Methods - -- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClient.md#burnclaimfraction) -- [checkWritable](HypercertClient.md#checkwritable) -- [createAllowlist](HypercertClient.md#createallowlist) -- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) -- [mintClaim](HypercertClient.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClient.md#splitclaimunits) - -## Constructors - -### constructor - -• **new HypercertClient**(`config?`) - -Creates a new instance of the `HypercertClient` class. - -#### Parameters - -| Name | Type | Description | -| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | - -#### Defined in - -[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) - -## Properties - -### \_config - -• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) - -#### Defined in - -[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) - ---- - -### \_contract - -• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -#### Defined in - -[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) - ---- - -### \_evaluator - -• `Private` **\_evaluator**: [`default`](internal.default.md) - -#### Defined in - -[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) - ---- - -### \_indexer - -• `Private` **\_indexer**: [`default`](internal.default-1.md) - -#### Defined in - -[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) - ---- - -### \_operator - -• `Private` **\_operator**: `Provider` \| `Signer` - -#### Defined in - -[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) - ---- - -### \_storage - -• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) - -#### Defined in - -[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) - -#### Defined in - -[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) - -## Accessors - -### contract - -• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -Gets the HypercertMinter contract used by the client. - -#### Returns - -[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -The contract. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) - -#### Defined in - -[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) - ---- - -### indexer - -• `get` **indexer**(): [`default`](internal.default-1.md) - -Gets the indexer for the client. - -#### Returns - -[`default`](internal.default-1.md) - -The indexer. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) - -#### Defined in - -[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) - ---- - -### storage - -• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) - -Gets the storage layer for the client. - -#### Returns - -[`HypercertsStorage`](HypercertsStorage.md) - -The storage layer. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) - -#### Defined in - -[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) - -## Methods - -### batchMintClaimFractionsFromAllowlists - -▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | -| `roots?` | `BytesLike`[] | - | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Implementation of - -HypercertClientInterface.batchMintClaimFractionsFromAllowlists - -#### Defined in - -[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) - ---- - -### burnClaimFraction - -▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> - -Burn a Hypercert claim by providing the claim id - -**`Dev`** - -Burns a Hypercert claim - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------- | :----------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.burnClaimFraction - -#### Defined in - -[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) - ---- - -### checkWritable - -▸ `Private` **checkWritable**(): `boolean` - -#### Returns - -`boolean` - -#### Defined in - -[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) - ---- - -### createAllowlist - -▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> - -Create a Hypercert claim with an allowlist - -**`Dev`** - -Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist - -**`Notice`** - -The total number of units in the allowlist must match the total number of units for the Hypercert - -#### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.createAllowlist - -#### Defined in - -[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) - ---- - -### mergeClaimUnits - -▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> - -Merge multiple Hypercert claims fractions into one - -**`Dev`** - -Merges multiple Hypercert claims into one - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :------------------ | -| `claimIds` | `BigNumberish`[] | Hypercert claim ids | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mergeClaimUnits - -#### Defined in - -[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) - ---- - -### mintClaim - -▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> - -Mint a Hypercert claim - -**`Dev`** - -Mints a Hypercert claim with the given metadata, total units and transfer restrictions - -#### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mintClaim - -#### Defined in - -[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) - ---- - -### mintClaimFractionFromAllowlist - -▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> - -Mint a Hypercert claim fraction from an allowlist. - -**`Dev`** - -Verifies the claim proof and mints the claim fraction - -**`Notice`** - -If known, provide the root for client side verification - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------- | :------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `units` | `BigNumberish` | Number of units to mint | -| `proof` | `BytesLike`[] | Merkle proof for the claim | -| `root?` | `BytesLike` | - | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mintClaimFractionFromAllowlist - -#### Defined in - -[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) - ---- - -### splitClaimUnits - -▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> - -Split a Hypercert's unit into multiple claims with the given fractions - -**`Dev`** - -Submit the ID of the claim to split and new fraction values. - -**`Notice`** - -The sum of the fractions must be equal to the total units of the claim - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.splitClaimUnits - -#### Defined in - -[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md deleted file mode 100644 index 706c14fe..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md +++ /dev/null @@ -1,250 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage - -# Class: HypercertsStorage - -A class that provides storage functionality for Hypercerts. - -## Implements - -- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) - -## Table of contents - -### Constructors - -- [constructor](HypercertsStorage.md#constructor) - -### Properties - -- [nftStorageClient](HypercertsStorage.md#nftstorageclient) -- [readonly](HypercertsStorage.md#readonly) -- [web3StorageClient](HypercertsStorage.md#web3storageclient) - -### Methods - -- [getData](HypercertsStorage.md#getdata) -- [getMetadata](HypercertsStorage.md#getmetadata) -- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) -- [storeData](HypercertsStorage.md#storedata) -- [storeMetadata](HypercertsStorage.md#storemetadata) - -## Constructors - -### constructor - -• **new HypercertsStorage**(`overrides`) - -Creates a new instance of the `HypercertsStorage` class. - -#### Parameters - -| Name | Type | Description | -| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | -| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | - -#### Defined in - -[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) - -## Properties - -### nftStorageClient - -• `Optional` **nftStorageClient**: `NFTStorage` - -The NFT storage client. - -#### Defined in - -[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -Whether the storage is read-only. - -#### Defined in - -[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) - ---- - -### web3StorageClient - -• `Optional` **web3StorageClient**: `any` - -The Web3 storage client. - -#### Defined in - -[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) - -## Methods - -### getData - -▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> - -Gets arbitrary data from Web3 storage. - -**`Throws`** - -A `StorageError` if the storage client is not configured or the data cannot be retrieved. - -#### Parameters - -| Name | Type | Description | -| :------------- | :------- | :-------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | - -#### Returns - -`Promise`<`any`\> - -A Promise that resolves to the data. - -#### Implementation of - -HypercertStorageInterface.getData - -#### Defined in - -[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) - ---- - -### getMetadata - -▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> - -Gets metadata for a Hypercert. - -**`Throws`** - -A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. - -**`Throws`** - -A `MalformedDataError` if the metadata is invalid. E.g. unknown schema - -#### Parameters - -| Name | Type | Description | -| :------------- | :------- | :------------------------------------------ | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | - -#### Returns - -`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> - -A Promise that resolves to the metadata. - -#### Implementation of - -HypercertStorageInterface.getMetadata - -#### Defined in - -[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) - ---- - -### getNftStorageGatewayUri - -▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` - -#### Parameters - -| Name | Type | -| :------------- | :------- | -| `cidOrIpfsUri` | `string` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) - ---- - -### storeData - -▸ **storeData**(`data`): `Promise`<`CIDString`\> - -Stores arbitrary data in Web3 storage. - -**`Throws`** - -A `StorageError` if the storage client is not configured. - -**`Notice`** - -Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. -Because we pay for storage quotas, this data is stored best effort. -If you are using our default keys, we may delete older data if we hit our storage quota. - -#### Parameters - -| Name | Type | Description | -| :----- | :-------- | :----------------- | -| `data` | `unknown` | The data to store. | - -#### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored data. - -#### Implementation of - -HypercertStorageInterface.storeData - -#### Defined in - -[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) - ---- - -### storeMetadata - -▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> - -Stores metadata for a Hypercert. - -**`Throws`** - -A `StorageError` if the storage client is not configured. - -**`Throws`** - -A `MalformedDataError` if the metadata is invalid. - -**`Notice`** - -Because we pay for storage quotas, this data is stored best effort. -If you are using our default keys, we may delete older data if we hit our storage quota. - -#### Parameters - -| Name | Type | Description | -| :----- | :-------------------------------------------------------- | :--------------------- | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | - -#### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored metadata. - -#### Implementation of - -HypercertStorageInterface.storeMetadata - -#### Defined in - -[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md deleted file mode 100644 index d12c0653..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError - -# Class: InvalidOrMissingError - -The provided value was undefined or empty - -## Hierarchy - -- `Error` - - ↳ **`InvalidOrMissingError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](InvalidOrMissingError.md#constructor) - -### Properties - -- [payload](InvalidOrMissingError.md#payload) - -## Constructors - -### constructor - -• **new InvalidOrMissingError**(`message`, `payload?`) - -Creates a new instance of the InvalidOrMissingError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md deleted file mode 100644 index 028129d8..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError - -# Class: MalformedDataError - -Data doesn't conform to expectations - -## Hierarchy - -- `Error` - - ↳ **`MalformedDataError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](MalformedDataError.md#constructor) - -### Properties - -- [payload](MalformedDataError.md#payload) - -## Constructors - -### constructor - -• **new MalformedDataError**(`message`, `payload?`) - -Creates a new instance of the MalformedDataError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md deleted file mode 100644 index de284494..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError - -# Class: MintingError - -Minting transaction failed - -## Hierarchy - -- `Error` - - ↳ **`MintingError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](MintingError.md#constructor) - -### Properties - -- [payload](MintingError.md#payload) - -## Constructors - -### constructor - -• **new MintingError**(`message`, `payload?`) - -Creates a new instance of the MintingError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md deleted file mode 100644 index 0dcf0291..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError - -# Class: StorageError - -Fails storing to a remote resource - -## Hierarchy - -- `Error` - - ↳ **`StorageError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](StorageError.md#constructor) - -### Properties - -- [payload](StorageError.md#payload) - -## Constructors - -### constructor - -• **new StorageError**(`message`, `payload?`) - -Creates a new instance of the StorageError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md deleted file mode 100644 index 5fdb25e0..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md +++ /dev/null @@ -1,71 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError - -# Class: UnknownSchemaError - -Schema could not be loaded - -## Hierarchy - -- `Error` - - ↳ **`UnknownSchemaError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](UnknownSchemaError.md#constructor) - -### Properties - -- [payload](UnknownSchemaError.md#payload) - -## Constructors - -### constructor - -• **new UnknownSchemaError**(`message`, `payload?`) - -Creates a new instance of the UnknownSchemaError class. - -#### Parameters - -| Name | Type | Description | -| :------------------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | -| `payload.schemaName` | `string` | - | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Type declaration - -| Name | Type | -| :----------- | :------- | -| `schemaName` | `string` | - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md deleted file mode 100644 index 0964b138..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md +++ /dev/null @@ -1,72 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError - -# Class: UnsupportedChainError - -This blockchain is not yet supported -Please file an issue - -## Hierarchy - -- `Error` - - ↳ **`UnsupportedChainError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](UnsupportedChainError.md#constructor) - -### Properties - -- [payload](UnsupportedChainError.md#payload) - -## Constructors - -### constructor - -• **new UnsupportedChainError**(`message`, `payload?`) - -Creates a new instance of the UnsupportedChainError class. - -#### Parameters - -| Name | Type | Description | -| :---------------- | :---------------------------------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | -| `payload.chainID` | `undefined` \| `string` \| `number` | - | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Type declaration - -| Name | Type | -| :-------- | :---------------------------------- | -| `chainID` | `undefined` \| `string` \| `number` | - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md deleted file mode 100644 index 1b94a629..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md +++ /dev/null @@ -1,278 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -A class that provides indexing functionality for Hypercerts. - -## Implements - -- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default-1.md#constructor) - -### Properties - -- [\_graphClient](internal.default-1.md#_graphclient) - -### Accessors - -- [graphClient](internal.default-1.md#graphclient) - -### Methods - -- [claimById](internal.default-1.md#claimbyid) -- [claimsByOwner](internal.default-1.md#claimsbyowner) -- [firstClaims](internal.default-1.md#firstclaims) -- [fractionById](internal.default-1.md#fractionbyid) -- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) -- [fractionsByOwner](internal.default-1.md#fractionsbyowner) - -## Constructors - -### constructor - -• **new default**(`options`) - -Creates a new instance of the `HypercertIndexer` class. - -#### Parameters - -| Name | Type | Description | -| :------------------ | :------- | :----------------------------------------- | -| `options` | `Object` | The configuration options for the indexer. | -| `options.graphUrl?` | `string` | - | - -#### Defined in - -[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) - -## Properties - -### \_graphClient - -• `Private` **\_graphClient**: `Object` - -The Graph client used by the indexer. - -#### Type declaration - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Defined in - -[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) - -## Accessors - -### graphClient - -• `get` **graphClient**(): `Object` - -Gets the Graph client used by the indexer. - -#### Returns - -`Object` - -The Graph client. - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Implementation of - -[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) - -#### Defined in - -[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) - -## Methods - -### claimById - -▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -Gets a claim by its ID. - -#### Parameters - -| Name | Type | Description | -| :--- | :------- | :------------------- | -| `id` | `string` | The ID of the claim. | - -#### Returns - -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -A Promise that resolves to the claim. - -#### Implementation of - -HypercertIndexerInterface.claimById - -#### Defined in - -[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) - ---- - -### claimsByOwner - -▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -Gets the claims owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.claimsByOwner - -#### Defined in - -[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) - ---- - -### firstClaims - -▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -Gets the most recent claims. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :-------------------- | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.firstClaims - -#### Defined in - -[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) - ---- - -### fractionById - -▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -Gets a claim token by its ID. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------- | :------------------------- | -| `fractionId` | `string` | The ID of the claim token. | - -#### Returns - -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -A Promise that resolves to the claim token. - -#### Implementation of - -HypercertIndexerInterface.fractionById - -#### Defined in - -[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) - ---- - -### fractionsByClaim - -▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -Gets the claim tokens for a given claim. - -#### Parameters - -| Name | Type | Default value | Description | -| :-------- | :----------------------------------------- | :------------------- | :-------------------- | -| `claimId` | `string` | `undefined` | The ID of the claim. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByClaim - -#### Defined in - -[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) - ---- - -### fractionsByOwner - -▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -Gets the claim tokens owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByOwner - -#### Defined in - -[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md deleted file mode 100644 index 1538ce61..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md +++ /dev/null @@ -1,131 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -The EasEvaluator class provides methods for signing off-chain attestations of evaluations. -Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. - -## Table of contents - -### Constructors - -- [constructor](internal.default-2.md#constructor) - -### Properties - -- [offChain](internal.default-2.md#offchain) -- [readonly](internal.default-2.md#readonly) -- [signer](internal.default-2.md#signer) - -### Methods - -- [getSignature](internal.default-2.md#getsignature) -- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) - -## Constructors - -### constructor - -• **new default**(`config`) - -Creates a new EasEvaluator instance. - -#### Parameters - -| Name | Type | Description | -| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | - -#### Defined in - -[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) - -## Properties - -### offChain - -• **offChain**: `Offchain` - -The Offchain instance used for signing off-chain attestations. - -#### Defined in - -[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -The TypedDataSigner instance used for signing typed data. - -#### Defined in - -[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) - -## Methods - -### getSignature - -▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> - -Gets a signature for an off-chain attestation. - -#### Parameters - -| Name | Type | Description | -| :------------ | :------- | :------------------------------------------------ | -| `encodedData` | `string` | The encoded data to sign. | -| `recipient` | `string` | The address of the recipient of the attestation. | -| `schemaUid` | `string` | The UID of the schema to use for the attestation. | - -#### Returns - -`Promise`<`SignedOffchainAttestation`\> - -- The signature for the attestation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) - ---- - -### signOfflineEvaluation - -▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> - -Signs an offline evaluation. - -**`Throws`** - -- If the evaluation data is malformed. - -#### Parameters - -| Name | Type | Description | -| :----------- | :----------------------------------------------- | :--------------------------- | -| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | - -#### Returns - -`Promise`<`undefined` \| `SignedOffchainAttestation`\> - -- The signature for the evaluation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md deleted file mode 100644 index 86daa5e4..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md +++ /dev/null @@ -1,110 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -## Implements - -- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default.md#constructor) - -### Properties - -- [eas](internal.default.md#eas) -- [readonly](internal.default.md#readonly) -- [signer](internal.default.md#signer) -- [storage](internal.default.md#storage) - -### Methods - -- [submitEvaluation](internal.default.md#submitevaluation) - -## Constructors - -### constructor - -• **new default**(`config?`) - -#### Parameters - -| Name | Type | -| :------- | :------------------------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | - -#### Defined in - -[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) - -## Properties - -### eas - -• **eas**: [`default`](internal.default-2.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -#### Defined in - -[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) - ---- - -### storage - -• **storage**: [`HypercertsStorage`](HypercertsStorage.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) - -## Methods - -### submitEvaluation - -▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------------------------------------------------------------------ | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | - -#### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Implementation of - -EvaluatorInterface.submitEvaluation - -#### Defined in - -[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md deleted file mode 100644 index b4af6279..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md +++ /dev/null @@ -1,39 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError - -# Interface: CustomError - -An interface for errors that have a specific type. - -## Implemented by - -- [`ClientError`](../classes/ClientError.md) -- [`ConfigurationError`](../classes/ConfigurationError.md) -- [`FetchError`](../classes/FetchError.md) -- [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) -- [`MalformedDataError`](../classes/MalformedDataError.md) -- [`MintingError`](../classes/MintingError.md) -- [`StorageError`](../classes/StorageError.md) -- [`UnknownSchemaError`](../classes/UnknownSchemaError.md) -- [`UnsupportedChainError`](../classes/UnsupportedChainError.md) - -## Table of contents - -### Properties - -- [payload](CustomError.md#payload) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Defined in - -[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md deleted file mode 100644 index 4606b46e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md +++ /dev/null @@ -1,56 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation - -# Interface: DuplicateEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) -- [explanation](DuplicateEvaluation.md#explanation) -- [realHypercert](DuplicateEvaluation.md#realhypercert) -- [type](DuplicateEvaluation.md#type) - -## Properties - -### duplicateHypercerts - -• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] - -#### Defined in - -[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) - ---- - -### explanation - -• **explanation**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) - ---- - -### realHypercert - -• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) - ---- - -### type - -• **type**: `"duplicate"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md deleted file mode 100644 index 205b7004..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md +++ /dev/null @@ -1,56 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation - -# Interface: EASEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [chainId](EASEvaluation.md#chainid) -- [contract](EASEvaluation.md#contract) -- [type](EASEvaluation.md#type) -- [uid](EASEvaluation.md#uid) - -## Properties - -### chainId - -• **chainId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) - ---- - -### contract - -• **contract**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) - ---- - -### type - -• **type**: `"EAS"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) - ---- - -### uid - -• **uid**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md deleted file mode 100644 index 3dcea656..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClaimdata.md +++ /dev/null @@ -1,167 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata - -# Interface: HypercertClaimdata - -Properties of an impact claim - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [contributors](HypercertClaimdata.md#contributors) -- [impact_scope](HypercertClaimdata.md#impact_scope) -- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) -- [rights](HypercertClaimdata.md#rights) -- [work_scope](HypercertClaimdata.md#work_scope) -- [work_timeframe](HypercertClaimdata.md#work_timeframe) - -## Properties - -### contributors - -• **contributors**: `Object` - -Contributors - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) - ---- - -### impact_scope - -• **impact_scope**: `Object` - -Scopes of impact - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) - ---- - -### impact_timeframe - -• **impact_timeframe**: `Object` - -Impact time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) - ---- - -### rights - -• `Optional` **rights**: `Object` - -Rights - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) - ---- - -### work_scope - -• **work_scope**: `Object` - -Scopes of work - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) - ---- - -### work_timeframe - -• **work_timeframe**: `Object` - -Work time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md deleted file mode 100644 index 0483b520..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md +++ /dev/null @@ -1,341 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface - -# Interface: HypercertClientInterface - -The interface for the Hypercert client. - -## Hierarchy - -- [`HypercertClientMethods`](HypercertClientMethods.md) - -- [`HypercertClientState`](HypercertClientState.md) - - ↳ **`HypercertClientInterface`** - -## Implemented by - -- [`HypercertClient`](../classes/HypercertClient.md) - -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) -- [contract](HypercertClientInterface.md#contract) -- [createAllowlist](HypercertClientInterface.md#createallowlist) -- [indexer](HypercertClientInterface.md#indexer) -- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) -- [mintClaim](HypercertClientInterface.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) -- [readonly](HypercertClientInterface.md#readonly) -- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) -- [storage](HypercertClientInterface.md#storage) - -## Properties - -### batchMintClaimFractionsFromAllowlists - -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) - -#### Defined in - -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) - ---- - -### burnClaimFraction - -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`): `Promise`<`ContractTransaction`\> - -Burns a claim fraction. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) - -#### Defined in - -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) - ---- - -### contract - -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) - -#### Defined in - -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) - ---- - -### createAllowlist - -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Creates a new allowlist and mints a new claim with the allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) - -#### Defined in - -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) - ---- - -### indexer - -• **indexer**: [`default`](../classes/internal.default-1.md) - -The indexer used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) - -#### Defined in - -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) - ---- - -### mergeClaimUnits - -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`): `Promise`<`ContractTransaction`\> - -Merges multiple claim fractions into a single claim. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) - -#### Defined in - -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) - ---- - -### mintClaim - -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Mints a new claim. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) - -#### Defined in - -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) - ---- - -### mintClaimFractionFromAllowlist - -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> - -Mints a claim fraction from an allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) - -#### Defined in - -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) - -#### Defined in - -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) - ---- - -### splitClaimUnits - -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> - -Splits a claim into multiple fractions. - -##### Parameters - -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) - -#### Defined in - -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) - ---- - -### storage - -• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) - -The storage layer used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) - -#### Defined in - -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md deleted file mode 100644 index 734ccbee..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md +++ /dev/null @@ -1,239 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods - -# Interface: HypercertClientMethods - -The methods for the Hypercert client. - -## Hierarchy - -- **`HypercertClientMethods`** - - ↳ [`HypercertClientInterface`](HypercertClientInterface.md) - -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) -- [createAllowlist](HypercertClientMethods.md#createallowlist) -- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) -- [mintClaim](HypercertClientMethods.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) - -## Properties - -### batchMintClaimFractionsFromAllowlists - -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) - ---- - -### burnClaimFraction - -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`): `Promise`<`ContractTransaction`\> - -Burns a claim fraction. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) - ---- - -### createAllowlist - -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Creates a new allowlist and mints a new claim with the allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) - ---- - -### mergeClaimUnits - -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`): `Promise`<`ContractTransaction`\> - -Merges multiple claim fractions into a single claim. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) - ---- - -### mintClaim - -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Mints a new claim. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) - ---- - -### mintClaimFractionFromAllowlist - -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> - -Mints a claim fraction from an allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) - ---- - -### splitClaimUnits - -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> - -Splits a claim into multiple fractions. - -##### Parameters - -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md deleted file mode 100644 index 2d90a599..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState - -# Interface: HypercertClientState - -The state of the Hypercert client. - -## Hierarchy - -- **`HypercertClientState`** - - ↳ [`HypercertClientInterface`](HypercertClientInterface.md) - -## Table of contents - -### Properties - -- [contract](HypercertClientState.md#contract) -- [indexer](HypercertClientState.md#indexer) -- [readonly](HypercertClientState.md#readonly) -- [storage](HypercertClientState.md#storage) - -## Properties - -### contract - -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. - -#### Defined in - -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) - ---- - -### indexer - -• **indexer**: [`default`](../classes/internal.default-1.md) - -The indexer used by the client. - -#### Defined in - -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Defined in - -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) - ---- - -### storage - -• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) - -The storage layer used by the client. - -#### Defined in - -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md deleted file mode 100644 index 6ebed93a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md +++ /dev/null @@ -1,47 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema - -# Interface: HypercertEvaluationSchema - -Schema for evaluating Hypercerts across different sources and evaluation types - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [creator](HypercertEvaluationSchema.md#creator) -- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) -- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) - -## Properties - -### creator - -• **creator**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) - ---- - -### evaluationData - -• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) - ---- - -### evaluationSource - -• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md deleted file mode 100644 index f18c409f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md +++ /dev/null @@ -1,176 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface - -# Interface: HypercertIndexerInterface - -## Implemented by - -- [`default`](../classes/internal.default-1.md) - -## Table of contents - -### Properties - -- [claimById](HypercertIndexerInterface.md#claimbyid) -- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) -- [firstClaims](HypercertIndexerInterface.md#firstclaims) -- [fractionById](HypercertIndexerInterface.md#fractionbyid) -- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) -- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) -- [graphClient](HypercertIndexerInterface.md#graphclient) - -## Properties - -### claimById - -• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -#### Type declaration - -▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -##### Parameters - -| Name | Type | -| :--- | :------- | -| `id` | `string` | - -##### Returns - -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) - ---- - -### claimsByOwner - -• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -#### Type declaration - -▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `owner` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) - ---- - -### firstClaims - -• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -#### Type declaration - -▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) - ---- - -### fractionById - -• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -#### Type declaration - -▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -##### Parameters - -| Name | Type | -| :----------- | :------- | -| `fractionId` | `string` | - -##### Returns - -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) - ---- - -### fractionsByClaim - -• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -#### Type declaration - -▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `claimId` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) - ---- - -### fractionsByOwner - -• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -#### Type declaration - -▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `owner` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) - ---- - -### graphClient - -• **graphClient**: `any` - -#### Defined in - -[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md deleted file mode 100644 index d65362f3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md +++ /dev/null @@ -1,123 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata - -# Interface: HypercertMetadata - -Claim data for hypercert. ERC1155 Metadata compliant - -## Table of contents - -### Properties - -- [allowList](HypercertMetadata.md#allowlist) -- [description](HypercertMetadata.md#description) -- [external_url](HypercertMetadata.md#external_url) -- [hypercert](HypercertMetadata.md#hypercert) -- [image](HypercertMetadata.md#image) -- [name](HypercertMetadata.md#name) -- [properties](HypercertMetadata.md#properties) -- [ref](HypercertMetadata.md#ref) -- [version](HypercertMetadata.md#version) - -## Properties - -### allowList - -• `Optional` **allowList**: `string` - -A CID pointer to the merke tree proof json on ipfs - -#### Defined in - -[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) - ---- - -### description - -• **description**: `string` - -Describes the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) - ---- - -### external_url - -• `Optional` **external_url**: `string` - -An url pointing to the external website of the project - -#### Defined in - -[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) - ---- - -### hypercert - -• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) - -#### Defined in - -[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) - ---- - -### image - -• **image**: `string` - -A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. - -#### Defined in - -[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) - ---- - -### name - -• **name**: `string` - -Identifies the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) - ---- - -### properties - -• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] - -#### Defined in - -[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) - ---- - -### ref - -• `Optional` **ref**: `string` - -Describes the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) - ---- - -### version - -• `Optional` **version**: `string` - -The version of Hypercert schema used to describe this hypercert - -#### Defined in - -[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md deleted file mode 100644 index 773c41d3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md +++ /dev/null @@ -1,45 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer - -# Interface: HypercertPointer - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [chainId](HypercertPointer.md#chainid) -- [claimId](HypercertPointer.md#claimid) -- [contract](HypercertPointer.md#contract) - -## Properties - -### chainId - -• **chainId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) - ---- - -### claimId - -• **claimId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) - ---- - -### contract - -• **contract**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md deleted file mode 100644 index 8ffda51e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md +++ /dev/null @@ -1,130 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface - -# Interface: HypercertStorageInterface - -The interface for the Hypercert storage layer. - -## Implemented by - -- [`HypercertsStorage`](../classes/HypercertsStorage.md) - -## Table of contents - -### Properties - -- [getData](HypercertStorageInterface.md#getdata) -- [getMetadata](HypercertStorageInterface.md#getmetadata) -- [storeData](HypercertStorageInterface.md#storedata) -- [storeMetadata](HypercertStorageInterface.md#storemetadata) - -## Properties - -### getData - -• **getData**: (`cidOrIpfsUri`: `string`) => `Promise`<`unknown`\> - -#### Type declaration - -▸ (`cidOrIpfsUri`): `Promise`<`unknown`\> - -Retrieves arbitrary data from IPFS. - -##### Parameters - -| Name | Type | Description | -| :------------- | :------- | :------------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | - -##### Returns - -`Promise`<`unknown`\> - -A Promise that resolves to the retrieved data. - -#### Defined in - -[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) - ---- - -### getMetadata - -• **getMetadata**: (`cidOrIpfsUri`: `string`) => `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -#### Type declaration - -▸ (`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -Retrieves the metadata for a Hypercert evaluation. - -##### Parameters - -| Name | Type | Description | -| :------------- | :------- | :----------------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | - -##### Returns - -`Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -A Promise that resolves to the retrieved metadata. - -#### Defined in - -[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) - ---- - -### storeData - -• **storeData**: (`data`: `unknown`) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`data`): `Promise`<`CIDString`\> - -Stores arbitrary data on IPFS. - -##### Parameters - -| Name | Type | Description | -| :----- | :-------- | :----------------- | -| `data` | `unknown` | The data to store. | - -##### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored data. - -#### Defined in - -[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) - ---- - -### storeMetadata - -• **storeMetadata**: (`metadata`: [`HypercertMetadata`](HypercertMetadata.md)) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`metadata`): `Promise`<`CIDString`\> - -Stores the metadata for a Hypercert evaluation. - -##### Parameters - -| Name | Type | Description | -| :--------- | :------------------------------------------ | :--------------------- | -| `metadata` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata to store. | - -##### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored metadata. - -#### Defined in - -[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md deleted file mode 100644 index 5f5871f2..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md +++ /dev/null @@ -1,34 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation - -# Interface: IPFSEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [cid](IPFSEvaluation.md#cid) -- [type](IPFSEvaluation.md#type) - -## Properties - -### cid - -• **cid**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) - ---- - -### type - -• **type**: `"IPFS"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md deleted file mode 100644 index 3e4b3b92..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md +++ /dev/null @@ -1,45 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation - -# Interface: SimpleTextEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [hypercert](SimpleTextEvaluation.md#hypercert) -- [text](SimpleTextEvaluation.md#text) -- [type](SimpleTextEvaluation.md#type) - -## Properties - -### hypercert - -• **hypercert**: [`HypercertPointer`](HypercertPointer.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) - ---- - -### text - -• **text**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) - ---- - -### type - -• **type**: `"simpleText"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md deleted file mode 100644 index 53ac36ed..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md +++ /dev/null @@ -1,43 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface - -# Interface: EvaluatorInterface - -[internal](../modules/internal.md).EvaluatorInterface - -## Implemented by - -- [`default`](../classes/internal.default.md) - -## Table of contents - -### Properties - -- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) - -## Properties - -### submitEvaluation - -• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -##### Parameters - -| Name | Type | Description | -| :----------- | :---------------------------------------------------------- | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | - -##### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Defined in - -[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md deleted file mode 100644 index 273912bc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md +++ /dev/null @@ -1,169 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata - -# Interface: HypercertClaimdata - -[internal](../modules/internal.md).HypercertClaimdata - -Properties of an impact claim - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [contributors](internal.HypercertClaimdata.md#contributors) -- [impact_scope](internal.HypercertClaimdata.md#impact_scope) -- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) -- [rights](internal.HypercertClaimdata.md#rights) -- [work_scope](internal.HypercertClaimdata.md#work_scope) -- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) - -## Properties - -### contributors - -• **contributors**: `Object` - -Contributors - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) - ---- - -### impact_scope - -• **impact_scope**: `Object` - -Scopes of impact - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) - ---- - -### impact_timeframe - -• **impact_timeframe**: `Object` - -Impact time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) - ---- - -### rights - -• `Optional` **rights**: `Object` - -Rights - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) - ---- - -### work_scope - -• **work_scope**: `Object` - -Scopes of work - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) - ---- - -### work_timeframe - -• **work_timeframe**: `Object` - -Work time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md deleted file mode 100644 index 3f4ea346..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md +++ /dev/null @@ -1,17 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter - -# Interface: HypercertMinter - -[internal](../modules/internal.md).HypercertMinter - -Hypercert contract interface. - -**`Notice`** - -hacky loop to get typedoc to generate all the docs - -## Hierarchy - -- `HypercertMinter` - - ↳ **`HypercertMinter`** diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md deleted file mode 100644 index 15998930..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md +++ /dev/null @@ -1,638 +0,0 @@ -[Hypercerts SDK Documentation](README.md) / Exports - -# Hypercerts SDK Documentation - -## Table of contents - -### References - -- [Claim](modules.md#claim) -- [ClaimToken](modules.md#claimtoken) -- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) - -### Modules - -- [internal](modules/internal.md) - -### Classes - -- [ClientError](classes/ClientError.md) -- [ConfigurationError](classes/ConfigurationError.md) -- [FetchError](classes/FetchError.md) -- [HypercertClient](classes/HypercertClient.md) -- [HypercertsStorage](classes/HypercertsStorage.md) -- [InvalidOrMissingError](classes/InvalidOrMissingError.md) -- [MalformedDataError](classes/MalformedDataError.md) -- [MintingError](classes/MintingError.md) -- [StorageError](classes/StorageError.md) -- [UnknownSchemaError](classes/UnknownSchemaError.md) -- [UnsupportedChainError](classes/UnsupportedChainError.md) - -### Interfaces - -- [CustomError](interfaces/CustomError.md) -- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) -- [EASEvaluation](interfaces/EASEvaluation.md) -- [HypercertClaimdata](interfaces/HypercertClaimdata.md) -- [HypercertClientInterface](interfaces/HypercertClientInterface.md) -- [HypercertClientMethods](interfaces/HypercertClientMethods.md) -- [HypercertClientState](interfaces/HypercertClientState.md) -- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) -- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) -- [HypercertMetadata](interfaces/HypercertMetadata.md) -- [HypercertPointer](interfaces/HypercertPointer.md) -- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) -- [IPFSEvaluation](interfaces/IPFSEvaluation.md) -- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) - -### Type Aliases - -- [AllowlistEntry](modules.md#allowlistentry) -- [Deployment](modules.md#deployment) -- [EvaluationData](modules.md#evaluationdata) -- [EvaluationSource](modules.md#evaluationsource) -- [HypercertClientConfig](modules.md#hypercertclientconfig) -- [HypercertClientProps](modules.md#hypercertclientprops) -- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) -- [HypercertStorageConfig](modules.md#hypercertstorageconfig) -- [HypercertsSdkError](modules.md#hypercertssdkerror) -- [QueryParams](modules.md#queryparams) -- [SupportedChainIds](modules.md#supportedchainids) -- [TransferRestrictions](modules.md#transferrestrictions) - -### Properties - -- [ClaimByIdQuery](modules.md#claimbyidquery) - -### Variables - -- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) -- [TransferRestrictions](modules.md#transferrestrictions-1) - -### Functions - -- [execute](modules.md#execute) -- [formatDate](modules.md#formatdate) -- [formatHypercertData](modules.md#formathypercertdata) -- [formatUnixTime](modules.md#formatunixtime) -- [validateAllowlist](modules.md#validateallowlist) -- [validateClaimData](modules.md#validateclaimdata) -- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) -- [validateMetaData](modules.md#validatemetadata) -- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) -- [verifyMerkleProof](modules.md#verifymerkleproof) -- [verifyMerkleProofs](modules.md#verifymerkleproofs) - -## References - -### Claim - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimToken - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimTokensByClaimQuery - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - -## Type Aliases - -### AllowlistEntry - -Ƭ **AllowlistEntry**: `Object` - -Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol - -**`Param`** - -Address of the recipient - -**`Param`** - -Number of units allocated to the recipient - -#### Type declaration - -| Name | Type | -| :-------- | :------------- | -| `address` | `string` | -| `units` | `BigNumberish` | - -#### Defined in - -[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) - ---- - -### Deployment - -Ƭ **Deployment**: `Object` - -Represents a deployment of a contract on a specific network. - -#### Type declaration - -| Name | Type | Description | -| :---------------- | :------- | :--------------------------------------------------------------------------------------- | -| `chainId` | `number` | The ID of the network on which the contract is deployed. | -| `chainName` | `string` | The name of the network on which the contract is deployed. | -| `contractAddress` | `string` | The address of the deployed contract. | -| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | - -#### Defined in - -[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) - ---- - -### EvaluationData - -Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) - -This file was automatically generated by json-schema-to-typescript. -DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, -and run json-schema-to-typescript to regenerate this file. - -#### Defined in - -[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) - ---- - -### EvaluationSource - -Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) - ---- - -### HypercertClientConfig - -Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } - -Configuration options for the Hypercert client. - -#### Defined in - -[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) - ---- - -### HypercertClientProps - -Ƭ **HypercertClientProps**: `Object` - -The props for the Hypercert client. - -#### Type declaration - -| Name | Type | Description | -| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | -| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | - -#### Defined in - -[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) - ---- - -### HypercertEvaluatorConfig - -Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } - -Configuration options for the Hypercert evaluator. - -**`Note`** - -The signer is required for submitting evaluations. - -#### Defined in - -[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) - ---- - -### HypercertStorageConfig - -Ƭ **HypercertStorageConfig**: `Object` - -Configuration options for the Hypercert storage layer. - -**`Note`** - -The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. - -#### Type declaration - -| Name | Type | Description | -| :------------------ | :------- | :------------------------------ | -| `nftStorageToken?` | `string` | The API token for NFT.storage. | -| `web3StorageToken?` | `string` | The API token for Web3.storage. | - -#### Defined in - -[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) - ---- - -### HypercertsSdkError - -Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) - -#### Defined in - -[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) - ---- - -### QueryParams - -Ƭ **QueryParams**: `Object` - -#### Index signature - -▪ [key: `string`]: `any` - -#### Type declaration - -| Name | Type | -| :---------------- | :------------------ | -| `first` | `number` | -| `orderDirections` | `"asc"` \| `"desc"` | -| `skip` | `number` | - -#### Defined in - -[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) - ---- - -### SupportedChainIds - -Ƭ **SupportedChainIds**: `5` \| `10` - -#### Defined in - -[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) - ---- - -### TransferRestrictions - -Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] - -#### Defined in - -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) - -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) - -## Properties - -### ClaimByIdQuery - -• **ClaimByIdQuery**: `any` - -## Variables - -### INDEFINITE_DATE_STRING - -• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` - -#### Defined in - -[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) - ---- - -### TransferRestrictions - -• `Const` **TransferRestrictions**: `Object` - -Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol - -**`Dev`** - -AllowAll: All transfers are allowed - -**`Dev`** - -DisallowAll: All transfers are disallowed - -**`Dev`** - -FromCreatorOnly: Only the creator can transfer the Hypercert - -#### Type declaration - -| Name | Type | -| :---------------- | :--- | -| `AllowAll` | `0` | -| `DisallowAll` | `1` | -| `FromCreatorOnly` | `2` | - -#### Defined in - -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) - -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) - -## Functions - -### execute - -▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> - -#### Parameters - -| Name | Type | -| :--------------- | :-------------------------------- | -| `document` | `GraphQLOperation`<`any`, `any`\> | -| `variables` | `any` | -| `context?` | `any` | -| `rootValue?` | `any` | -| `operationName?` | `string` | - -#### Returns - -`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> - -#### Defined in - -node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 - ---- - -### formatDate - -▸ **formatDate**(`date`): `string` - -#### Parameters - -| Name | Type | -| :----- | :----- | -| `date` | `Date` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) - ---- - -### formatHypercertData - -▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) - -Formats input data to an object containing HypercertMetadata including appropriate labels - -#### Parameters - -| Name | Type | -| :----------------------- | :----------------------------------------------- | -| `«destructured»` | `Object` | -| › `contributors` | `string`[] | -| › `description` | `string` | -| › `excludedImpactScope` | `string`[] | -| › `excludedRights` | `string`[] | -| › `excludedWorkScope` | `string`[] | -| › `external_url?` | `string` | -| › `image` | `string` | -| › `impactScope` | `string`[] | -| › `impactTimeframeEnd` | `number` | -| › `impactTimeframeStart` | `number` | -| › `name` | `string` | -| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | -| › `rights` | `string`[] | -| › `version` | `string` | -| › `workScope` | `string`[] | -| › `workTimeframeEnd` | `number` | -| › `workTimeframeStart` | `number` | - -#### Returns - -[`FormatResult`](modules/internal.md#formatresult) - -#### Defined in - -[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) - ---- - -### formatUnixTime - -▸ **formatUnixTime**(`seconds`): `string` - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `seconds` | `number` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) - ---- - -### validateAllowlist - -▸ **validateAllowlist**(`data`, `units`): `Object` - -Validates the data for an allowlist. - -#### Parameters - -| Name | Type | Description | -| :------ | :---------------------------------------------- | :------------------------------------------ | -| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | -| `units` | `BigNumberish` | The total number of units in the allowlist. | - -#### Returns - -`Object` - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -| Name | Type | -| :------- | :------------------------------------------ | -| `errors` | `Record`<`string`, `string` \| `string`[]\> | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) - ---- - -### validateClaimData - -▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :------------------------------------------------------- | :-------------------- | -| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) - ---- - -### validateDuplicateEvaluationData - -▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a duplicate evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :--------------------------------------------------------- | :-------------------- | -| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) - ---- - -### validateMetaData - -▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :----------------------------------------------------- | :-------------------- | -| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) - ---- - -### validateSimpleTextEvaluationData - -▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :----------------------------------------------------------- | :-------------------- | -| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) - ---- - -### verifyMerkleProof - -▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` - -Verifies a Merkle proof for a given address and units. - -**`Throws`** - -If the Merkle proof verification fails. - -#### Parameters - -| Name | Type | Description | -| :-------------- | :------------- | :-------------------------------------- | -| `root` | `string` | The Merkle root hash to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish` | The units to verify. | -| `proof` | `string`[] | The Merkle proof to verify. | - -#### Returns - -`void` - -#### Defined in - -[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) - ---- - -### verifyMerkleProofs - -▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` - -Batch verifies Merkle proofs for multiple roots, units and proofs for a single address - -**`Throws`** - -If the Merkle proof verification fails. - -**`Notice`** - -Wrapper around `verifyMerkleProof` to batch verify multiple proofs - -#### Parameters - -| Name | Type | Description | -| :-------------- | :--------------- | :---------------------------------------- | -| `roots` | `string`[] | The Merkle root hashes to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish`[] | The units to verify. | -| `proofs` | `string`[][] | The Merkle proofs to verify. | - -#### Returns - -`void` - -#### Defined in - -[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md deleted file mode 100644 index d20a3804..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md +++ /dev/null @@ -1,307 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal - -# Module: internal - -## Table of contents - -### Classes - -- [default](../classes/internal.default.md) -- [default](../classes/internal.default-1.md) -- [default](../classes/internal.default-2.md) - -### Interfaces - -- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) -- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) -- [HypercertMinter](../interfaces/internal.HypercertMinter.md) - -### Type Aliases - -- [Claim](internal.md#claim) -- [ClaimByIdQuery](internal.md#claimbyidquery) -- [ClaimToken](internal.md#claimtoken) -- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) -- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) -- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) -- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) -- [Exact](internal.md#exact) -- [FormatResult](internal.md#formatresult) -- [InputMaybe](internal.md#inputmaybe) -- [Maybe](internal.md#maybe) -- [OrderDirection](internal.md#orderdirection) -- [RecentClaimsQuery](internal.md#recentclaimsquery) -- [Scalars](internal.md#scalars) -- [ValidationResult](internal.md#validationresult) - -## Type Aliases - -### Claim - -Ƭ **Claim**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | -| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | - -#### Defined in - -[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) - ---- - -### ClaimByIdQuery - -Ƭ **ClaimByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | - -#### Defined in - -[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) - ---- - -### ClaimToken - -Ƭ **ClaimToken**: `Object` - -#### Type declaration - -| Name | Type | -| :---------- | :--------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `claim` | [`Claim`](internal.md#claim) | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | - -#### Defined in - -[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) - ---- - -### ClaimTokenByIdQuery - -Ƭ **ClaimTokenByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | - -#### Defined in - -[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) - ---- - -### ClaimTokensByClaimQuery - -Ƭ **ClaimTokensByClaimQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :------------------------------------------------------------------------------------------------------------------ | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) - ---- - -### ClaimTokensByOwnerQuery - -Ƭ **ClaimTokensByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | - -#### Defined in - -[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) - ---- - -### ClaimsByOwnerQuery - -Ƭ **ClaimsByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) - ---- - -### Exact - -Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } - -#### Type parameters - -| Name | Type | -| :--- | :--------------- | -| `T` | extends `Object` | - -#### Defined in - -[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) - ---- - -### FormatResult - -Ƭ **FormatResult**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------ | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | -| `errors` | `Record`<`string`, `string`\> \| `null` | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) - ---- - -### InputMaybe - -Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) - ---- - -### Maybe - -Ƭ **Maybe**<`T`\>: `T` \| `null` - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) - ---- - -### OrderDirection - -Ƭ **OrderDirection**: `"asc"` \| `"desc"` - -Defines the order direction, either ascending or descending - -#### Defined in - -[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) - ---- - -### RecentClaimsQuery - -Ƭ **RecentClaimsQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) - ---- - -### Scalars - -Ƭ **Scalars**: `Object` - -All built-in and custom scalars, mapped to their actual values - -#### Type declaration - -| Name | Type | -| :----------- | :-------- | -| `BigDecimal` | `any` | -| `BigInt` | `any` | -| `Boolean` | `boolean` | -| `Bytes` | `any` | -| `Float` | `number` | -| `ID` | `string` | -| `Int` | `number` | -| `Int8` | `any` | -| `String` | `string` | - -#### Defined in - -[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) - ---- - -### ValidationResult - -Ƭ **ValidationResult**: `Object` - -The result of a validation. - -**`Property`** - -Whether the data is valid. - -**`Property`** - -A map of errors, where the key is the field that failed validation and the value is the error message. - -#### Type declaration - -| Name | Type | -| :------- | :---------------------------- | -| `errors` | `Record`<`string`, `string`\> | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md deleted file mode 100644 index b591d11d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/burning.md +++ /dev/null @@ -1,12 +0,0 @@ -# Burning - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## Burning fraction tokens - -You can only burn fraction tokens that you own. Hypercert claims cannot be burned once minted. -You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). - -```js -const txn = await hypercerts.burnFraction({ tokenId }); -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md deleted file mode 100644 index b26fc0e8..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md +++ /dev/null @@ -1,112 +0,0 @@ -# Hypercert Client Configuration - -The client provides a high level interface that communicates with the Graph, IPFS and the evm. For easy setup we harmonised the configuration into a flow that allows for configuration with different levels of specificity. - -## Configuration - -### Setup - -The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: - -1. Overrides declared in `Partial` -2. Environment variables exposed via `process.env` - -Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. - -We then process the rest of the overrides and possible environment variables to customise the default configuration. - -To get started quickly you can either: - -- set `process.env.DEFAULT_CHAIN_ID` to 5 or 10 -- initialize a new client by calling `new HypercertClient({chainId: 5})` (or 10) - -Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) - -### Read-only mode - -The SDK client will be in read-only mode if any of the following conditions are true: - -- The client was initialized without an operator. -- The client was initialized with an operator without signing abilities. -- The contract address is not set. -- The storage layer is in read-only mode. - -If any of these conditions are true, the read-only property of the `HypercertClient` instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. - -### Defaults - -The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. - -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - -`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object -contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. - -For example: - -```json -{ - "5": { - "chainId": 5, - "chainName": "goerli", - "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" - } -} -``` - -You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. - -### Client config properties - -| Property | Type | Description | -| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `graphUrl` | `string` | The url of the subgraph to use. | -| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | - -- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) -- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) - -### Environment variables - -You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. - -We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - -### Logging - -The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level -determines which log messages are printed to the console. By default, the logger is configured to log messages with a -level of info or higher to the console. - -In your `.env` file: - -```bash -LOG_LEVEL="info" -``` - -The SDK logger supports four log levels: `error`, `warn`, `info`, and `debug`. - -- The `error` log level is used to log errors that occur in the SDK. -- The `warn` log level is used to log warnings that do not necessarily indicate an error, but may be important to investigate. -- The `info` log level is used to log general information about the SDK's state or behavior. -- The `debug` log level is used to log detailed information that is useful for debugging purposes. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md deleted file mode 100644 index 60f4e5e7..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md +++ /dev/null @@ -1,18 +0,0 @@ -# Errors in the SDK - -Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. - -### Handling Errors - -To support debugging we've implemented some custom errors. - -| Error | Reason | Payload | -| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | -| ClientError | An error caused by the client | `{ [key: string]: unknown }` | -| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | -| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | -| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | -| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | -| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | -| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | -| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md deleted file mode 100644 index c5399a4f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md +++ /dev/null @@ -1,13 +0,0 @@ -# Evaluations - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## Respond / or contest an evaluation - -To create an evaluation of a hypercert - -```js -TODO; -``` - -_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md deleted file mode 100644 index d5ff1226..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/minting.md +++ /dev/null @@ -1,57 +0,0 @@ -# Minting - -## Token design - -Hypercerts are semi-fungible tokens. -Thus, each hypercert is represented on-chain by a group of fraction tokens, -each representing a fraction of ownership over the hypercert. -If you want to split your fraction token, or merge multiple tokens into one, -check out the section on [splitting and merging](./split-merge.md). - -## Minting your first hypercert - -To mint a hypercert you need to provide the `metadata`, total amount of `units` and the preferred `TransferRestrictions`. -The resulting hypercert will be wholly owned by the creator. - -```js -import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" - -const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; - -const tx: Promise = await hypercerts.mintClaim({ - metadata, - totalUnits, - transferRestrictions: TransferRestrictions.FromCreatorOnly, -}); -``` - -> **Note** If you did not initialize your HypercertsClient with an `operator`, `nftStorageToken` and `web3StorageToken`, the client will run in [read-only mode](#read-only-mode) and this will fail. - -Let's see what happens under the hood: - -First, `mintClaim` checks that the client is not `read only` and that the operator is a `Signer`. If not, it throws an `InvalidOrMissingError`. - -Next, the function validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. The function then stores the metadata on `IPFS` using the `storeMetadata` method and returns the `CID` for the metadata. - -Finally, we call the mintClaim function on the contract with the signer `address`, total `units`, `CID`, and `transfer restriction` as parameters. If `overrides` are provided, the function uses them to send the transaction. Otherwise, it sends the transaction without overrides. - -## Transfer restrictions - -When minting a Hypercert, you must pass in a `TransferRestriction` policy. For now there are only 3 implemented policies: - -```js -enum TransferRestrictions { - // Unrestricted - AllowAll, - // All transfers disabled after minting - DisallowAll, - // Only the original creator can transfer - FromCreatorOnly -} -``` - -## Reference - -See the [code](https://github.com/hypercerts-org/hypercerts/tree/main/sdk/src/client.ts) -for more details on how we implement minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md deleted file mode 100644 index 98ebbb83..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md +++ /dev/null @@ -1,306 +0,0 @@ -# Querying - -## Overview - -The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient -has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, -HypercertIndexer, and HypercertMinter classes, respectively. - -```js -const { - client: { storage }, -} = new HypercertClient({}); -``` - -The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. - -```js -const { - client: { indexer }, -} = new HypercertClient({}); -``` - -The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. -It is used by the HypercertClient to retrieve event-based data via the subgraph. - -```js -const { - client: { contract }, -} = new HypercertClient({}); -``` - -Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used -by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. - -By providing instances of these classes through the `storage`, `indexer`, and `contract` getters, the HypercertClient allows developers to easily interact with the various components of the Hypercert system directly. -For example, a developer could use the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the contract. - -## Indexer - -For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. - -### Live graph playground - -To inspect the subgraph and explore queries, have a look at the Graph playground for Goerli testnet and Optimism mainnet: - -- [Goerli dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) -- [Optimism dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) - -### Graph client - -Since the client is fully typed, it's easy to explore the functionalities using code completion in IDEs. - -Here's one example from our frontend where we let [react-query](https://www.npmjs.com/package/%2540tanstack/react-query) frequently update the call to the graph: - -```js -import { useHypercertClient } from "./hypercerts-client"; -import { useQuery } from "@tanstack/react-query"; - -export const useFractionsByOwner = (owner: string) => { - const { - client: { indexer }, - } = useHypercertClient(); - - return useQuery( - ["hypercerts", "fractions", "owner", owner], - () => indexer.fractionsByOwner(owner), - { enabled: !!owner, refetchInterval: 5000 }, - ); -}; -``` - -### Queries: Claims - -These tables show the input parameters and output fields for each of the GraphQL queries in [claims.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/claims.graphql). -A claim represents 1 Hypercert and all of the common data across all claim/fraction tokens. - -#### `ClaimsByOwner` - -The `ClaimsByOwner` query retrieves an array of claims that belong to a specific owner. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------- | ------------- | -| `owner` | `Bytes` | The address of the owner whose claims to retrieve. | "" | -| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | -| `first` | `Int` | The number of claims to retrieve. | `100` | -| `skip` | `Int` | The number of claims to skip. | `0` | - -##### Output - -The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -#### `RecentClaims` - -The RecentClaims query retrieves an array of the most recent claims on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | ---------------------------------- | ------------- | -| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | -| `first` | `Int` | The number of claims to retrieve. | `100` | -| `skip` | `Int` | The number of claims to skip. | `0` | - -##### Output - -The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -#### `ClaimByID` - -The ClaimById query retrieves a single claim by its ID on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | -| --------- | ----- | -------------------------------- | -| `id` | `ID!` | The ID of the claim to retrieve. | - -##### Output - -The query returns a claim object that matches the input parameter. The claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -### Queries: Fractions - -These tables show the input parameters and output fields for each of the GraphQL queries in [fractions.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/fractions.graphql). -A claim token represents a fraction of ownership of a Hypercert. - -#### `ClaimTokensByOwner` - -The `ClaimTokensByOwner` query retrieves an array of claim tokens that belong to a specific owner on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | -| `owner` | `Bytes` | The address of the owner whose claim tokens to retrieve. | "" | -| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | -| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | -| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | - -##### Output - -The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ------------------------------------------ | -| `chainName` | `String` | The name of the chain. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | - -The Claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ------------------------------------ | -| `id` | `ID` | The ID of the claim. | -| `creation` | `Int` | The timestamp of the claim creation. | -| `uri` | `String` | The URI of the claim metadata. | -| `totalUnits` | `BigInt` | The total number of units. | - -#### `ClaimTokensByClaim` - -The `ClaimTokensByClaim` query retrieves an array of claim tokens that belong to a specific claim on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | -| `claimId` | `String!` | The ID of the claim whose claim tokens to retrieve. | None | -| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | -| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | -| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | - -##### Output - -The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | - -#### `ClaimTokenById` Query - -The `ClaimTokenById` query retrieves a single claim token by its ID on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | -| --------- | ----- | -------------------------------------- | -| `id` | `ID!` | The ID of the claim token to retrieve. | - -##### Output - -The query returns a claim token object that matches the input parameter. The claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | - -The Claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ------------------------------------ | -| `id` | `ID` | The ID of the claim. | -| `creation` | `Int` | The timestamp of the claim creation. | -| `uri` | `String` | The URI of the claim metadata. | -| `totalUnits` | `BigInt` | The total number of units. | - -## Storage - -### Hypercert Metadata - -Currently, all metadata is stored off-chain in IPFS. Use the `storage` client to retrieve the metadata - -```js -const claimId = "0x822f17a9a5eecfd...85254363386255337"; -const { indexer, storage } = hypercertsClient; -// Get the on-chain claim -const claimById = await indexer.claimById(claimId); -// Get the off-chain metadata -const metadata = await storage.getMetadata(claimById.claim.uri); -``` - -## Contract - -### Typechain bindings - -We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, -which you can import and use from your TypeScript/JavaScript codebase. - -For example: - -```js -import { ethers } from "ethers"; -import { - HyperCertMinterFactory, - HypercertMinterABI, - IHypercertTokenABI, -} from "@hypercerts-org/sdk"; - -const provider = new ethers.getDefaultProvider(network); -const contractInterface = new ethers.utils.Interface(HypercertMinterABI); -const contract = new ethers.Contract( - contractAddress, - HypercertMinterABI, - provider, -); -const metadataUri = await contract.functions.uri(tokenId); -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md deleted file mode 100644 index 936cc05b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-javascript.md +++ /dev/null @@ -1,101 +0,0 @@ -# Getting started with JavaScript - -The Hypercerts SDK makes it easy to integrate Hypercerts into your application or backend with JavaScript/TypeScript. - -## Installation - -Install the SDK using npm or yarn: - -```bash -npm install @hypercerts-org/sdk -# OR yarn add @hypercerts-org/sdk -``` - -## Get storage credentials (only required for minting) - -For now, we store all metadata (e.g. Hypercert claim data) on IPFS using [NFT.Storage](https://nft.storage/) and [web3.storage](https://web3.storage/). - -In order to mint a Hypercert, you will need to create API tokens for both services, which you can learn more about from their respective guides: - -- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) -- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) - -_Note: In the future, we want to also support other mechanisms for storing off-chain data._ - -## Initialize - -Import the SDK into your project and create a new instance of `HypercertClient` with your configuration options: - -```js -import { HypercertClient } from "@hypercerts-org/sdk"; -import { ethers } from "ethers"; - -// NOTE: you should replace this with your own JSON-RPC provider to the network -// This should have signing abilities and match the `chainId` passed into HypercertClient -const operator = ethers.providers.getDefaultProvider("goerli"); - -const client = new HypercertClient({ - chainId: 5, // goerli testnet - operator, - nftStorageToken, - web3StorageToken, -}); -``` - -Hypercerts is a multi-chain protocol. -See [here](./supported-networks.md) for a list of currently supported networks. - -> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). - -## Make a Hypercert - -Use the client object to interact with the Hypercert network. For example, you can use the `client.mintClaim` method to create a new claim: - -```js -import { - formatHypercertData, - TransferRestrictions, -} from "@hypercerts-org/sdk"; - -// Validate and format your Hypercert metadata -const { data: metadata, valid, errors } = formatHypercertData({ - name, - ... -}) - -// Check on errors -if (!valid) { - return console.error(errors); -} - -// Set the total amount of units available -const totalUnits: BigNumberish = 10_000_000 - -// Define the transfer restriction -const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly - -// Mint your Hypercert! -const tx = await client.mintClaim( - metadata, - totalUnits, - transferRestrictions, -); -``` - -For guidance on how to specify your metadata, see the [minting guide](../minting-guide/step-by-step.md). -This will validate the metadata, store claim metadata on IPFS, create a new hypercert on-chain, and return a transaction receipt. - -For more details, check out the [Minting Guide](./minting.md). - -## Query for Hypercerts - -You can also use the client to query the subgraph and retrieve which claims an address owns: - -```js -const claims = await client.indexer.fractionsByOwner(owner), -``` - -For more details, checkout the [Querying guide](./querying.md) -and our [Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet). - -That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md deleted file mode 100644 index 409a1e9d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/quickstart-solidity.md +++ /dev/null @@ -1,41 +0,0 @@ -# Getting started with Solidity - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -If you need the Solidity contracts or interfaces exported from the SDK, -please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). - -## Hypercerts deployments - -Hypercerts is a multi-chain protocol and we want to support any network that wants to make positive impact. -We plan to support at most 1 canonical contract deployment per network. -For a complete list of deployments and their contract addresses, see [Supported Networks](./supported-networks.md). - -## Installing the Hypercert contracts - -```bash -npm install @hypercerts-org/contracts -# or yarn add @hypercerts-org/contracts -``` - -## Using the Solidity interface - -If you want to call the Hypercerts contract on your network directly from Solidity, -we export the interface/ABI for you to use from your contract. - -```js -import { IHypercertToken } from "@hypercerts-org/contracts/IHypercertMinter.sol"; - -contract MyContract { - IHypercertToken hypercerts; - - function initialize(address _addr) public virtual initializer { - hypercerts = IHypercertToken(_addr); - } - - function uri(uint256 tokenID) public view returns (string memory _uri) { - _uri = hypercerts.uri(tokenID); - } -} - -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md deleted file mode 100644 index 1ac5556e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md +++ /dev/null @@ -1,29 +0,0 @@ -# Split and Merge - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## By Token Value - -### Split / merge token values - -```js -const { tokenIds } = await hypercerts.splitFraction({ - tokenId, - units: [10, 12, 15], -}); -const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); -``` - -## By Claim Data - -### Split / merge claim data - -```js -const { claimIds } = await hypercerts.splitClaim({ - claimId, - TODO: somehow specify hypercert subregions -}); -const { claimId} = await hypercerts.mergeClaims({ - claimIds, -}); -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md b/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md deleted file mode 100644 index 3bfd0f18..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md +++ /dev/null @@ -1,13 +0,0 @@ -# Supported networks - -Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. - -We want to support every network that wants to support positive impact! -If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). - -## Overview - -| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | -| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | -| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | -| Optimism | 10 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md deleted file mode 100644 index 72b3ee2d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/deploy-proxy.md +++ /dev/null @@ -1,120 +0,0 @@ -# Deploy a new proxy contract - -This should be done only on rare occasions. For example, when: - -- We want to deploy to a new network -- We have updated the contract in a way that is _NOT_ backwards-compatible. - - For most upgrades, please use UUPS [upgrades](./upgrade.md). - -## Smart Contracts - -### Setup the `contracts/` environment - -Navigate to `contracts/`. Configure your `.env` file by following the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/contracts#setup). - -### Build and deploy the smart contracts - -If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. - -```javascript - "optimism-goeri": getChainConfig("optimism-goerli"), -``` - -Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. - -```sh -# Run in contracts/ -yarn build:hardhat -yarn hardhat deploy --network NETWORK -``` - -This will output the new proxy address. Update the root `README.md` with this new address. - -Now transfer ownership over the proxy contract to the multisig: - -```sh -yarn hardhat transfer-owner --network NETWORK --proxy PROXY_CONTRACT_ADDRESS --owner MULTISIG_ADDRESS -``` - -## Subgraph - -### Setup the `graph/` environment - -Navigate to `graph/`. Follow the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/graph#setup) -to get set up. - -### Deploy the subgraph - -Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). - -Now deploy the subgraph - -```sh -# Run in graph/ -yarn build -yarn deploy:hosted -``` - -## OpenZeppelin Defender - -### Create a new Supabase table - -Log into the [Supabase dashboard](https://app.supabase.com/). -We store all data in a single project, but use different tables for each network. -The table name should be suffixed by the network (e.g. `allowlistCache-goerli`). -If you are deploying to a new network, create a new table. You can copy the table schema and RLS policy from another pre-existing table. - -If you are deploying a new proxy contract to a network for which you already have another deployment, you'll have to make a judgement call as to whether you can reuse the existing table, whether you need to clear the existing table, or create another table. - -Note: We want to merge all the tables in this [issue](https://github.com/hypercerts-org/hypercerts/issues/477). - -### Update the OpenZeppelin Defender scripts - -Modify the Defender scripts to support the new network in `defender/src/networks.ts`. - -If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. - -Note: The entry point for deployment is in `defender/src/setup.ts`. - -### Setup the `defender/` environment - -Navigate to `defender/`. Follow the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/defender#setup) -to get set up. - -### Deploy defender scripts - -Deploy to OpenZeppelin Defender via - -```sh -# Run in defender/ -yarn deploy -``` - -## Hypercerts SDK - -TODO: Flesh this out - -Run the build in `contracts/`. - -(Soon to be deprecated) Publish `contracts/` to npm - -Configure the SDK to support the new network via the graphclient. - -Publish SDK to npm - -## Deploy the Dapp frontend - -Each frontend build is configured to run on a different network (e.g. `https://testnet.hypercerts.org`). You can use any CDN to serve the site (e.g. Netlify, Vercel, GitHub Pages, Cloudflare Pages, Fleek, Firebase Hosting). - -1. Configure your build environment with the environment variables specified in `frontend/.env.local.example`. - -2. Configure your builds to the following settings: - -- Build command: `yarn build:site` -- Build output directory: `/build` -- Root directory: `/` - -3. Configure the domain that you want for your build. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md deleted file mode 100644 index 05dc5b0c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/errors.md +++ /dev/null @@ -1,45 +0,0 @@ -# Errors - -## Deploying - -### Artifact for contract "HypercertMinter" not found - -#### Error message - -`Error HH700: Artifact for contract "HypercertMinter" not found.` - -#### Cause - -Attempting to deploy a contract with `npx hardhat deploy` before the contract has been compiled by hardhat. Contracts compiled by forge are currently not visible to hardhat (this could be a configuration problem). - -### insufficient funds for intrinsic transaction cost - -#### Error message - -`Error: insufficient funds for intrinsic transaction cost` - -#### Cause - -The environment variable `MNEMONIC` is not configured correctly. - -Alternatively, the wallet may not have enough funds for the selected network - -Causing pause twice - -Error: cannot estimate gas; transaction may fail or may require manual gas limit - -reason: 'execution reverted: Pausable: paused', - -#### Etherscan API - -Note: It can take between 5-10 minutes before a newly created etherscan API key becomes valid for queries to goerli. - -When using an etherscan API key that was too recently created, hardhat tasks using etherscan to verify transactions will exit with an error message: - -`Etherscan returned with message: NOTOK, reason: Invalid API Key` - -Despite this error the transaction may have succeeded, the hardhat task just can't confirm it. - -It is unknown if this is a problem for queries to mainnet as well. - -Metamask makes it very difficult to have multiple wallets. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md deleted file mode 100644 index 9b208595..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# DevOps - -We use this playbook to encapsulate our practices and current setup. - -## Setup dev environment - -- [Setup guide](./setup.md) -- [Plasmic setup](./plasmic.md) - -## Tasks - -- [Deploy new proxy contract](./deploy-proxy.md) -- [Upgrade contract](./upgrade.md) -- [Pause contract](./pause.md) - -## FAQ - -- [Common errors](./errors.md) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md deleted file mode 100644 index 2668f51e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/pause.md +++ /dev/null @@ -1,29 +0,0 @@ -# Pause / Unpause - -## Pause - -### Contract owned by an address - -Make sure you have set up your wallets and config from the [setup guide](./setup.md). - -To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: - -```sh -yarn hardhat pause --network NETWORK --address CONTRACT_ADDRESS -``` - -### Contract owned by a multi-sig - -If we transferred ownership to a multisig, we can use -[OpenZeppelin Defender Admin](https://defender.openzeppelin.com/#/admin) -to propose a pause to be approved by the multisig. - -## Unpause - -Make sure you have set up your wallets and config from the [setup guide](./setup.md). - -To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: - -```sh -yarn hardhat unpause --network NETWORK --address CONTRACT_ADDRESS -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md deleted file mode 100644 index 10e52f5b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/plasmic.md +++ /dev/null @@ -1,76 +0,0 @@ -# Plasmic setup - -## HypercertImage - -### Props - -hideImpact - -``` -$ctx.currentForm.impactTimeEnd === "indefinite" && ($ctx.currentForm.impactScopes.length === 0 || ($ctx.currentForm.impactScopes.length === 1 && $ctx.currentForm.impactScopes[0] === "all")) -``` - -color - -``` -$ctx.currentForm.backgroundColor -``` - -vectorart - -``` -$ctx.currentForm.backgroundVectorArt -``` - -### Slots - -logoImage Image URL - -``` -$ctx.currentForm.logoUrl -``` - -title Content - -``` -$ctx.currentForm.name -``` - -workPeriod Content - -``` -`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.workTimeEnd.format ? $ctx.currentForm.workTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.workTimeEnd}` -``` - -bannerImage Image URL - -``` -$ctx.currentForm.bannerUrl -``` - -impactPeriod Content - -``` -`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.impactTimeEnd.format ? $ctx.currentForm.impactTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.impactTimeEnd}` -``` - -#### workScopes: repeated ScopeChip - -Collection - -``` -$ctx.currentForm.workScopes.split(/[,\n]/).map(i => i.trim()).filter(i => !!i) -``` - -Element name: `currentWorkScope` -Index name: `currentIndex` -Color variant: `$ctx.currentForm.backgroundColor` -Content: `currentWorkScope` - -#### impactScopes: repeated ScopeChip - -Collection: `$ctx.currentForm.impactScopes` -Element name: `currentImpactScope` -Index name: `currentIndex` -Color variant: `$ctx.currentForm.backgroundColor` -Content: `currentImpactScope` diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md deleted file mode 100644 index afb95296..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/setup.md +++ /dev/null @@ -1,41 +0,0 @@ -# Setup - -## Pre-requisites - -1. Install [NodeJS](https://nodejs.org/en/) and [git](https://git-scm.com/) -2. Install [yarn](https://classic.yarnpkg.com/) - -```sh -npm install --global yarn -``` - -3. Clone the repository: - -``` -git clone git@github.com:hypercerts-org/hypercerts.git -cd hypercerts -``` - -4. Install dependancies: - -To install dependencies across all projects in the monorepo workspace: - -```sh -yarn install -``` - -## Setup your wallets - -We need 2 wallets: a multi-sig for administering the contracts, and a hot wallet for setting everything up. - -1. We use a [Gnosis Safe](https://app.safe.global/) multisig for managing and administering the contracts. Set one up with your desired confirmation threshold (e.g. 2 of 3). This wallet will not require any balance. -2. Separately, set up a wallet that we'll use in our developer scripts. - -- If you don't have one, you can goto `contracts/` and run `yarn hardhat generate-address`. -- Make sure there is enough balance in this account to deploy the contract and transfer ownership to the multisig - - [Goerli Faucet](https://goerlifaucet.com/) - - [Optimism Bridge](https://app.optimism.io/bridge/deposit) - -## Next Steps - -Depending on what you want to do (e.g. in `./sdk/` or `./frontend/`), there will be further setup instructions in the respective `README.md` file. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md b/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md deleted file mode 100644 index 820255e7..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/devops/upgrade.md +++ /dev/null @@ -1,35 +0,0 @@ -# Upgrading the contract - -## Validate upgrade - -Validate contract upgradeability against deployment. - -For example, for the `goerli` deployment: - -```sh -yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS -``` - -## Propose Upgrade - -Propose an upgrade via OpenZeppelin Defender. For more information, see this -[guide](https://docs.openzeppelin.com/defender/guide-upgrades) - -For example, for the `goerli` deployment: - -```sh -yarn build:hardhat -yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS -``` - -This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. - -## Publish to npm - -After you update the contracts, deploy the `contracts/` package to npm. - -TODO - -Update the dependencies in `frontend/package.json` and `sdk/package.json`. - -If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/faq.md b/docs/versioned_docs/version-1.0.0-alpha.0/faq.md deleted file mode 100644 index b9659b5a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/faq.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Frequently Asked Questions -id: faq ---- - -# FAQs - -### How do I create a hypercert? - -We've created a step-by-step guide in the documents, which you can find [here](minting-guide/minting-guide-start). - -### Who gets to claim my hypercert? - -There are currently two types of users who are eligible to claim your hypercert. - -1. You as the creator of the hypercert are eligible to claim your hypercert. For projects with an allow list, you are eligible to claim 50% of the total tokens. For projects with no allow list, you will receive 100% of the tokens automatically and can do whatever you like with them. - -2. Anyone on the hypercert's allow list will be eligible to claim your hypercert. The allow list is stored and the time of minting and allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions through a separate contract interaction. Creators often use allow lists be used to allocate fractions to previous funders and contributors. - -### How do I claim a hypercert? Can I claim all of the ones I’m eligible for at once? - -After you connect your wallet, you will see a dashboard of hypercerts that you can claim. You can either claim them individually or in a batch transaction. Note that if you perform the batch transaction you will automatically claim _all_ hypercerts you are allow-listed for. (You still pay a gas fee for each claim, however.) If you don't want to claim _all_ at once, then you should claim them one-by-one. - -### What token standard do hypercerts utilize? - -The interface supports both ERC-1155s and 721s. Our current implementation makes use of [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) (a semi-fungible token). - -### What are the required fields to generate a hypercert? - -There are six required fields: - -1. Set of contributors: An ordered list of all contributors, who claim to do or have done the work described by this hypercert. -2. Scope of work: A conjunction of potentially-negated work scope tags, where an empty string means “all”. -3. Time of work: A date range, from the start to the end of the work being claimed by this hypercert. -4. Scope of impact: A conjunction of potentially-negated impact scope tags, where an empty string means “all”. -5. Time of impact: Date ranges from the start to the end of the impact. -6. Rights of the owners: An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. - -Hypercerts also need a name and description. - -### What should I put for my hypercert's work scope? - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -### Are hypercerts the same as impact evaluations? - -No. A hypercert is a claim over a discrete piece of work and the impact that may result from that work. It has no opinion about the legitimacy or quality of the claim. - -An impact evaluation is an opinionated assessment about the legitimacy or quality of a claim. - -For example, a hypercert might represent "Planting trees in the Amazon in 2022". An impact evaluation might point to that hypercert and assert the percent of trees that survived, the amount of CO2 removed by the trees, or the income change among people living around the project. - -Over time, the expectation is that hypercerts that attract multiple, high quality, credibly neutral impact evaluations will be more relevant than ones that do not. - -### What can I do with my hypercert? - -The `rights` dimension specific what an owner can do with their hypercert. Currently, the only `right` that owners have is "Public Display". Over time, we hope the protocol can support various `rights` including transfers, intellectual property, tax-deductibility, carbon offsets, ESG reporting, and more. - -### How is a hypercert different than a POAP or Impact NFT? - -Hypercerts have some things in common with certain POAPs or Impact NFTs, but also a number of crucial differences. - -First, all POAPs and most Impact NFTs are implemented as non-fungible tokens (ERC-721s). Hypercerts are currently being implemented as semi-fungible tokens (ERC-1155s), meaning it is possible to own more than one unit or fraction of a given hypercert. This makes it easy and intuitive to display the share of hypercerts that a given owner has. - -Second, hypercerts have specific metadata requirements and interpretation logic. These include a standard schema for how the six required hypercert dimensions are defined and captured (i.e., work scopes, impact scopes, timeframes, contributors, etc) as well as logic for how to interpret different inputs (e.g., how to include or exclude certain work scopes, create an indefinite time period, etc). POAPs have a completely different schema. Although there is no standard schema for Impact NFTs, an Impact NFT project could choose to adopt the hypercert standard and token interface and thereby achieve compatibility. - -Third, the hypercerts token interface is intended to support several functions that are not possible out of the box with other token standards, chiefly, atomic split and merge capabilities. We also expect other protocols to work with hypercerts for the purposes of prospective and retrospective funding, contributor verification, and impact evaluation. - -For certain use cases, POAPs may be better suited for projects as hypercerts are focused on the funding aspect of impactful work. - -### Where can I purchase a hypercert? - -Currently, it is only possible to purchase a hypercert from a creator or project. This can be facilitated directly by the project or via a third-party marketplace like OpenSea. Currently, hypercerts cannot be resold on secondary markets. - -### What chain(s) is hypercerts running on? - -The hypercerts smart contracts have been deployed on Optimism and Goerli Testnet. We plan to support various EVM chains in the near future. - -### How do I bridge to Optimism? - -There are various bridging services including the official [Optimism Bridge](https://app.optimism.io/bridge/deposit). Note that bridging assets from Ethereum to Optimism will incur a gas fee. - -### How much gas will it cost to create or claim a hypercert? - -In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). Claiming a hypercert should be below 0.0001 ETH or less than $0.10 on Optimism. - -### How do I create a hypercert from a multisig? - -If you are creating a hypercert on Optimism, then you will need an Optimism-based multisig. (Unfortunately, Safe wallets created on Ethereum won't work on Optimism.) - -### Have the smart contracts been audited? - -Yes. The auditor's security report is available [here](https://github.com/pashov/audits/blob/master/solo/Hypercerts-security-review.md). - -### How is the allow list generated? - -For Gitcoin projects, an allow list is generated from a snapshot of all of the on-chain funding received by the project. - -The queries used to generate the allow lists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -Once the snapshot is taken, the formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. - -For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.96 donated --> 1 fraction -- $0.52 donated --> 0 fractions - -### Why am I not on the allow list even though I contributed to the project? - -If you contributed less than $1 DAI to a project, then you will not be eligible to claim a hypercert fraction. - -### I supported a project. Why I don't I see the hypercert in my dashboard? - -In order to your hypercert to appear as "claimable", the project needs to mint the hypercert first. If the project has not minted its hypercert yet, then you will not be able to claim it. We suggest you check back in a few days to see if the project has created the hypercert and is now claimable. - -If the project has created its hypercert, then please try the following solutions: - -1. Confirm the wallet address is correct (some users have multiple wallet addresses and forget which one they donated with) -2. Check that your wallet is included in the Dune Dashboards for each Gitcoin Round - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -3. Confirm you donated more than $1 DAI to the project. - -If the project has created its hypercert, and you have confirmed items 1-3, then please send us a DM over Twitter or Telegram with your wallet address and we will get back to you promptly. - -### How do I retire a hypercert? - -We don't yet have a frontend for retiring hypercerts but you can do this by interacting directly with the smart contract on Etherscan. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md b/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md deleted file mode 100644 index 86c25331..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/further-resources.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Further Resources -id: further-resources ---- - -# Papers, Articles, Presentations - -## Writings - -- Feb 14, 2023, Whitepaper draft by [@hypercerts](http://twitter.com/hypercerts): [Hypercerts: A new primitive for impact funding systems (draft v0)](../static/pdf/hypercerts_whitepaper_v0.pdf) -- Aug 24, 2022, Blogpost by [@holkeb](https://twitter.com/holkeb): [Hypercerts: A new primitive for public goods funding](https://protocol.ai/blog/hypercert-new-primitive/) -- Jun 2022, Tech report (draft) by [@davidad](https://twitter.com/davidad): [Hypercerts; an Interoperable Datalayer for Impact-Funding Mechanisms](../static/pdf/hypercerts_Tech_Report_draft.pdf) - -## Talks - -#### Jun 24, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Hypercerts: on-chain primitives for impact markets](https://youtu.be/2hOhOdCbBlU) - - - -#### Jun 23, 2022, Conversation between [@emiyazono](http://twitter.com/emiyazono) and [@owocki](http://twitter.com/owocki) at GreenPill Podcast: [Impact Certificates | Evan Miyazono, Head of Research at Protocol Labs | Green Pill #21](https://youtu.be/kyo5SxtSJ9U) - - - -#### Mar 4, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Interoperable mechanisms for non-rival goods (Hypercerts)](https://youtu.be/acbBeGcevok) - - - -## Other resources - -Overview of some previous writings on impact certificates, retrospective funding and impact markets: - -- Christiano, Paul (2014) Certificates of impact, Rational Altruist, [https://rationalaltruist.com/2014/11/15/certificates-of-impact/](https://rationalaltruist.com/2014/11/15/certificates-of-impact/) -- Christiano, Paul & Katja Grace (2015) The Impact Purchase, [https://impactpurchase.org/why-certificates/](https://impactpurchase.org/why-certificates/) -- Optimism & Buterin, Vitalik (2021) Retroactive Public Goods Funding, [https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c) -- Cotton-Barratt, Owen (2021), Impact Certificates and Impact Markets, Funding the Commons November 2021, [https://youtu.be/ZiDV56o5M7Q](https://youtu.be/ZiDV56o5M7Q) -- Drescher, Denis (2022) Towards Impact Markets, [https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1](https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1) -- Ofer & Cotton-Barratt, Owen (2022) Impact markets may incentivize predictably net-negative projects, [https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6](https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6) diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md deleted file mode 100644 index b2451310..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/glossary.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Glossary -id: glossary -sidebar_position: 3 ---- - -# Glossary of Hypercerts Terms - -## Main Terms - -### Allowlist - -A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. - -### Claiming a fraction - -Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. - -### Contributor - -An individual or organization that performs some or all of the work described in a hypercert. - -### Creating a hypercert - -Synonymous to minting a hypercert. - -### Fraction - -A token that represents a quantified proportion of a hypercert denominated in units. - -### Funder - -Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. - -### Hypercert - -A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. - -### Hypercerts interface - -The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. - -### Hypercerts implementation - -An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. - -### Hypercerts standard - -A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. - -### Impact - -Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. - -### Impact evaluation - -A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. - -### Impact Funding System (IFS) - -A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. - -### Impact space - -A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. - -### Merging hypercerts - -An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. - -### Minting a hypercert - -Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. - -### Project - -Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. - -### Prospective funder - -Individual, organization, or algorithm that fund work before it is done. - -### Retrospective funder - -Individual, organization, or algorithm that fund work after it is done. - -### Rights - -An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. - -### Set of contributors - -An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Scope of impact - -A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Scope of work - -A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Splitting hypercerts - -An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. - -### Time of impact - -Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Time of work - -A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Unit - -The smallest possible fraction of a claim. Generally units are grouped in fractions. - -### Work - -Activities that produce impact. - -## Additional Impact Evaluation Terms - -### Auditor - -Individual, organization, or algorithm that evaluates the impact of work after it is done. - -### Beneficiaries - -People or objects that are impacted by work. - -### Evaluator - -Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. - -### Scout - -Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md deleted file mode 100644 index 08eb9fcb..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/metadata.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: Metadata Standard -id: metadata -sidebar_position: 2 ---- - -# Hypercert Metadata Structure - -Hypercerts are represented as [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) tokens. All token instances of a hypercert must share the same ERC-1155 metadata. For sites like OpenSea to pull in off-chain metadata for ERC-1155 assets, your hypercert contract will need to return an IPFS URI that contains all necessary hypercert metadata. - -The hypercert metadata schema follows the [Enjin recommendation](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema) for ERC-1155 metadata. It also includes **six required dimensions** that are necessary to clearly and unambiguously identify the hypercert's impact claim. - -The following are standard ERC-1155 metadata fields. - -## ERC-1155 fields - -| Property | Description | -| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | Name or title of the hypercert. Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. | -| `description` | A human readable description of the hypercert. Markdown is supported. Additional external URLs can be added. | -| `image` | A URI pointing to a resource with mime type image/\* that represents the hypercert's artwork, i.e., `ipfs://`. We recommend images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. | -| `external_url` | [optional] A URL that can be displayed next to the hypercert on webpages like OpenSea and links users to a page that has more information about the project or impact claim. | -| `properties` | [optional] Additional properties (aka attributes) that may be helpful for discovery and curation of hypercerts. Marketplaces like OpenSea will display these properties in the same way as they display rarity traits of NFTs. | - -In order to perform hypercert-specific operations, including split and merge functions, and for your hypercert to robustly claim a set of coordinates in the impact space, there are six additional dimensions that must be included in your metadata. - -## Required Hypercert dimensions - -| Property | Description | -| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `work_scope` | An _ordered list_ of work scope tags. Work scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any work scope that is explicitly excluded from the claim. | -| `work_timeframe` | Date range from the start to the end of the work in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). | -| `impact_scope` | An _ordered list_ of impact scope tags. Impact scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any impact scope that is explicitly excluded from the claim. The default claim is to "all" impact, giving the owner rights to claim all potential impact created by the work that is represented by the hypercert. | -| `impact_timeframe` | Date range from the start to the end of the impact in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). The default claim is from the start date of work until `indefinite` (i.e., the impact may occur at any point in time in the future). | -| `contributors` | An _ordered list_ of all contributors. Contributors should be itemized as wallet addresses or ENS names, but may be names / pseudonyms. The default claim is to the wallet address that created the hypercert contract. A multisig wallet can be used to represent a group of contributors. | -| `rights` | An _unordered list_ of usage rights tags. The default claim is solely to "public display" of the hypercert, i.e., all other rights remain with the contributors. | - -## Examples - -### Example 1: hypercert with minimal bounds - -Here is an example of hypercert dimensions for work on IPFS with minimal bounds: - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["IPFS"], - "excludes": [], - "display_value": "IPFS" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["All"], - "excludes": [], - "display_value": "All" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1380585600, 1388534399], - "display_value": "2013-10-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1380585600, 0], - "display_value": "2013-10-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["Protocol Labs"], - "display_value": "Protocol Labs" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Example 2: hypercert with bounded impact claims - -This hypercert is for a carbon removal project that provides a bounded impact scope. - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["Protecting Trees in Amazon"], - "excludes": [], - "display_value": "Protecting Trees in Amazon" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["CO2 in Atmosphere"], - "excludes": [], - "display_value": "CO2 in Atmosphere" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1356998400, 1388534399], - "display_value": "2013-01-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1356998400, 0], - "display_value": "2013-01-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], - "display_value": "0xa1f...000, Project Forest Conservation" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Example 3: hypercert with excluded impact claims - -Here is an example that explicitly excludes an impact scope to generate a more fine-grained claim. - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["Protecting Trees in Amazon"], - "excludes": [], - "display_value": "Protecting Trees in Amazon" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["All"], - "excludes": ["CO2 in Atmosphere"], - "display_value": "All ∧ ¬CO2 in Atmosphere" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1356998400, 1388534399], - "display_value": "2013-01-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1356998400, 0], - "display_value": "2013-01-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], - "display_value": "0xa1f...000, Project Forest Conservation" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Additional guidelines - -Here are some additional guidelines for defining hypercert dimensions. - -- For most hypercerts, the `work_scope` is best represented as the name of the project or activity. Other information contained in the hypercert, namely, the `contributors` and the `work_timeframe` should provide sufficient context to disambiguate multiple claims from the same project. -- Similarly, for most hypercerts, the `impact_scope` will be most clearly represented as "all" (with an indefinite upper bound on the `impact_timeframe` dimensions). This gives the hypercert creator and its owners the flexibility to make claims about impact that may not have been observable or well-understood when the hypercert was created. - -- It is recommended to browse the `impact_scope` and `work_scope` tags that have already been created and are in use by your or other projects. (We are building a catalog to be available at [hypercerts.org](https://hypercerts.org).) Picking established tags can make it easier for users to discover, curate, and interact with your hypercert. In the long-run, we expect different ontologies to emerge in domains like climate solutions, open source software, etc, and picking more established tags will help prevent overlapping or duplicate claims. -- Tags for work scopes and impact scopes are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. -- Scopes that are explicitly excluded from the hypercert claim are enumerated separately and displayed with the `¬` prefix in the tag. Excluded scopes are not currently displayed on hypercert artwork. -- The order of tags matters only for display purposes. The hypercert artwork will only display a limited number of tags in the `impact_scope` and `work_scope` arrays due to image size and stylistic constraints. -- A `contributor` can be identified using any human-readable string. The base case is to set the `contributors` to the wallet address used to create the hypercert. A multisig wallet can be used to represent a group of contributors. - -### Assigning `rights` - -In version 1.0 of the protocol, only one `rights` tag will be enabled: - -> **Public Display**: owners of the hypercert have the right to publicly display and receive social utility from their hypercert. - -This means that any other rights regarding the work described by the hypercert either remain with the original contributors or are governed by other agreements. - -Additional `rights` including the potential for certain types of transfers to be explicitly enabled will be released in subsequent versions. - -## Optional hidden properties - -Creators may wish to add other fields in their metadata that are not a part of the hypercert claim and are not for display on third-party marketplaces like OpenSea. These can be added by creating a `hidden_properties` field in the metadata. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md b/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md deleted file mode 100644 index a767c670..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/implementation/token-standard.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Token Standard -id: token-standard -sidebar_position: 1 ---- - -### Hypercerts as a semi-fungible token - -In order to make the token identifiable, traceable, and transferable, hypercerts are represented as [ERC-1155 tokens](https://eips.ethereum.org/EIPS/eip-1155). The ERC-1155 standard enables a single deployed contract to store many hypercerts, facilitating simpler creation, transfers, as well as splitting and merging of hypercerts within a single namespace. As a semi-fungible token, each unique token represents a fraction of ownership of a hypercert. Hypercerts are then represented as a group of tokens, where the total ownership sums to 100%. In order to easily identify which hypercert a token belongs to, we utilize the upper 128 bits of a 256-bit token ID to identify the hypercert. All tokens within the same hypercert group should share the same [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). - -![hypercert id](../../static/img/hypercert_id.png) - -For illustrative purposes, let us assume that token IDs are just 2 bytes long, where the first byte represents the hypercert ID and the last byte represents which fraction of ownership. Alice could create a new hypercert token 0x2301, representing 100% of hypercert 0x23. If Alice wanted to transfer 20% to Bob, Alice could perform a split operation by minting token 0x2302 and transferring 20% of value to it, such that tokens 0x2301 and 0x2302 represent 80% and 20% ownership respectively of hypercert 0x23. Then Alice transfers token 0x2302 to Bob. Similarly, they could merge these 2 tokens together, back to form a token that represented 100% ownership. In this case, the value of 0x2301 would be transferred to 0x2302, and then 0x2301 is subsequently burned. - -Alice can also choose to split or merge hypercerts along some dimension of the impact space. For example, Alice may split hypercert 0x23 into two new hypercerts — 0x24 representing work done before the year 2000, and 0x25 representing work done after 2000. The original hypercert 0x23 is burned and the two new hypercerts store a reference to the previous hypercert. When the history of splits and merges are indexed, we can easily trace through the provenance of any individual hypercert. - -### Claim Data - -Hypercert claim data, such as scope of work and the contributor list, is encoded in JSON format into the [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). Claim data can be stored on-chain alongside the token, or in off-chain storage such as IPFS. For details on the JSON schema and how off-chain storage can be utilized, see the [hypercerts-sdk repository](https://github.com/hypercerts-org/hypercerts/tree/main/sdk). - -When considering whether to store hypercert metadata on-chain or off-chain, we can consider the different trade-offs to the user experience and cost, which may differ depending on which blockchain is being used. Storing data off-chain saves on costs, but could lead to on-chain claims without the metadata. Storing data on-chain adds additional security that the claims will not be forgotten but can lead to higher gas fees. - -Beyond the standard fields of hypercerts that locate the hypercert in the impact space, additional fields can be added. This allows for different templates in different impact areas, such as AI safety or biodiversity, as different additional information will be useful. Importantly, however, all hypercerts will be located in a single impact space – the additional fields do not change that. - -### Multi-chain support - -We expect hypercerts to exist in a multi-chain ecosystem, where the local deployment can be used to support the unique funding systems of that community. In order to visualize a single global impact space, we index the different contract deployments across chains and surface any potential hypercert claim conflicts. Because different blockchains support different subsets of programming languages, we do expect different implementations of the hypercert protocol to exist. However, they must adhere to the same hypercert data model to be indexed into the impact space. - -In order to decide which deployments to index into the hypercerts impact space, decentralized governance institutions will be used to govern the list of contract addresses used across all blockchains. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/intro.md deleted file mode 100644 index 0c4d7ca3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/intro.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: What Are Hypercerts? -id: intro ---- - -# What are hypercerts? - -### Hypercerts are a new token standard for tracking and rewarding positive impact. - -Each hypercert represents a unique impact claim capturing the following information: - -- a scope of work and its corresponding scope of impact -- a set of time frames for both the work and its impact -- a set of contributors – the organization or people behind the work -- a set of rights you get by owning a hypercert - -The hypercert itself is an ERC-1155 semi-fungible token with the information above stored as metadata on IPFS. Here’s an example. - -### Hypercert example - -#### Graphic representation - -![hypercert design example](../static/img/hypercert_example.png) - -#### Supplementary information (metadata) - -- **Title of hypercert:** Invention of the InterPlanetary Filesystem (IPFS) -- **Description:** The InterPlanetary File System (IPFS) is a set of composable, peer-to-peer protocols for addressing, routing, and transferring content-addressed data in a decentralized file system. -- **Link:** ipns://ipfs.tech/ - -#### Hypercert dimensions (metadata) - -- **Set of contributors:** 0xb794f5ea0ba39494ce839613fffba74279579268 _(example Ethereum address)_ -- **Scope of work:** IPFS ∧ ¬ go-ipfs -- **Time of work:** 2013-01-01 --> 2013-12-31 -- **Scope of impact:** All -- **Time of impact:** 2013-01-01 --> indefinite -- **Rights:** Public display - -### Why should you care? - -We spend trillions of dollars every year on public goods via governmental agencies, foundations, private donations and corporate spendings; however, we don’t effectively track this work – leaving us in the dark, hoping that it actually has the intended positive impact. - -We believe we can do better: - -- We should start by tracking this work consistently – this is what hypercerts are for. -- We should evaluate how impactful that work was – this is what the open evaluation system of hypercerts supports. -- We should reward the work that was exceptionally impactful – this is what the public display of hypercerts and retrospective funding is for. - -Doing this would unfold powerful incentives. Retrospective funding 1) provides incentives for creators to take on public goods projects with a potentially high, but uncertain, impact, 2) enables feedback loops to learn from successes and failures, and 3) attracts more talent to the public goods sector by improving performance-based compensation. - -While we are excited about the prospects of retrospective funding, hypercerts do not impose any specific funding mechanisms, but start with tracking the work that is supposed to be impactful. As a database for many funding mechanisms this facilitates experimentation and interoperability between funding mechanisms. - -### Next - -Curious and want to learn more? Head over to the [whitepaper](whitepaper/whitepaper-intro.md) to dive deeper into the world of hypercerts. - -Or do you want to get started right away? Head to the [minting guide](minting-guide/minting-guide-start.md). diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md deleted file mode 100644 index 1ad2310a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/gitcoin-round.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: Gitcoin Alpha Round Instructions -id: gitcoin-round -sidebar_position: 3 ---- - -# Gitcoin Alpha Round Instructions - -## Overview - -- all projects in the Gitcoin Alpha Round are invited to mint a hypercert for their work -- anyone who gave over $1 to a project is automatically allowlisted for that project’s hypercert -- 50% of each hypercert is distributed to the funders, 50% is kept by the project and can be transferred later -- each project has a custom URL to make minting super easy (the link is sent directly to each project) -- everything runs on Optimism (users only need to pay L2 gas costs) - -:::info -If your project participated in the Gitcoin Alpha Round, but you didn't get a message with a custom URL, please reach out to team[at]hypercert.org. -::: - -## Hypercerts x Gitcoin Alpha Round - -Now that Gitcoin’s Alpha Round has officially closed and the funding distribution is finalized, we are inviting all eligible projects that participated to mint a hypercert for their past work and to allocate fractions of their hypercert to a list of supporters. - -We’ve created a dApp that pulls all of the data required to mint your hypercert directly from Gitcoin’s Grant Protocol. You can fine-tune the properties, tweak your artwork, and review the distribution mechanism. Once you’re ready, hit the create button and your hypercert will be released into the ethers! - -Once your hypercert has been minted, the people who supported your project with a contribution of at least $1 DAI on Gitcoin’s Alpha Round will be able to connect and claim their fractions. - -A few important notes about the Alpha Round: - -- The total units of a hypercert is based on the total donations; each funder get awarded units proportional to their donations. -- Transfers will be restricted to one transfer from the project to the supporters. -- There will be no additional rights awarded to the funders except the right to "public display" their support for the project. - -## Instructions - -The following guidance is only for projects that receive a custom URL that pre-populates the hypercerts form based on their Gitcoin Grants' data. - -It explains the default settings in the form and recommends fields that the creator may choose to update or edit. - -:::note -Gitcoin Grant hypercerts are for retrospective work, i.e., they are intended to capture work that happened between Gitcoin Grants Round 15 (September 2022) and the Alpha Round (January 2023). Therefore, the work time period is always set to past dates. (You might need to adjust the name and description to also refer to past work only.) We are focusing solely on retrospective hypercerts for this round as part of broader efforts to promote retrospective funding; you can read more about it [in the whitepaper](whitepaper/retrospective-funding.md). -::: - -### General Fields - -#### Name of Hypercert - -This field is set by default to the name of your project on Gitcoin Grants. You can edit this to be more specific. Given that your project may create numerous hypercerts over time, consider giving each hypercert a name that represents a more discrete phase or output. - -#### Logo - -This field is set to the icon artwork provided for your project on Gitcoin Grants. If there was an error accessing your icon, you will see a generic icon. - -You can update this by providing a new URL and the hypercert artwork should update automatically. - -Logo images look best with an aspect ratio of 1.0 (square-shaped). - -#### Background Banner Image - -This field is set to the banner artwork provided for your project on Gitcoin Grants. If there was an error accessing your banner, you will see a generic Gitcoin banner. - -You can update this by providing a new URL and the hypercert artwork should update automatically. - -Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. - -#### Project Description - -This field is set by default to the description of your project on Gitcoin Grants. Review closely -- a long project description in your Gitcoin Grant description will be truncated. - -You may edit this to provide more details about your work and to remove information that is targeted solely at Gitcoin Grants users. This is also a good place to provide other links, such as Github repos or social media accounts, where the general public can learn more about the work. Please aim for a project description that is less than 500 characters. - -:::note -The project description should refer to **past work**, not future work that you would like to do with additional funding. -::: - -#### Link - -This field is set to the first external URL provided for your project on Gitcoin Grants. You can update this. - -### Hypercert Fields - -#### Work Scope - -This field is set by default to a **shortened version** of the name of your project on Gitcoin Grants. You may edit or add additional work scope tags. - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -#### Work Start/End Dates - -The start date has been set by default to the `2022-09-22` for all projects on Gitcoin Grants. This date coincides with the end of Gitcoin Grants Round 15. - -The end date references the last update to your grant page on Gitcoin Grants. - -You may edit or update these fields, however, the end date may not extend beyond `2023-01-31` (the close of the funding round) as all hypercerts will be retrospective in this round. - -#### Set of Contributors - -This field is set by default to the wallet address that is set as the recipient address for receiving Gitcoin Grants funding. - -:::note -You should review this field closely and – if applicable – provide the addresses of additional contributors. -::: - -### Advanced Fields - -#### Impact Scope - -This field is set by default to `all`. - -Updates are currently disabled on the frontend because funding decisions on Gitcoin Grants were not specific to an impact scope or impact time period. - -#### Impact Start/End Dates - -This field is set by default to the work start date of `2022-09-22` (see above) and a work end date of `indefinite`. Updates are currently disabled on the frontend. - -#### Rights - -This field is set by default to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. - -Updates are currently disabled on the frontend. - -### Distribution - -#### Allowlist - -This field is set by default to a custom allowlist generated for each project based on the funding it received on the Gitcoin Grants Alpha Round. You should not need to update this field. If there is a problem with your allowlist, please contact us. - -50% of the hypercert will be allocated according to this allowlist. The other 50% will be kept by the project, i.e. it is allocated to the address that mints the hypercert. You will be able to transfer or sell these fractions later as long as they are owned by the minter. This means that they can only be transferred or sold once. - -The formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. - -For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.96 donated --> 1 fraction -- $0.52 donated --> 0 fractions - -The queries used to generate the allowlists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -Donors who contributed to the matching pool for each round are also eligible to claim hypercerts. - -:::note -You are free to edit your allowlist. You can do this by following the step-by-step instructions [here](minting-guide/step-by-step.md). Just remember that you will need to upload the new allowlist in a CSV format to a storage site like [web3.storage](https://web3.storage) and then update the link in the allowlist field. Contact team[at]hypercerts.org if you need help. -::: - -### Confirmations - -#### Contributors' permission - -Every contributor needs to agree to have their contribution be represented by a hypercert. This is why the person minting the hypercert has to confirm to have the permission of all listed contributors. - -#### Terms & Conditions - -The terms & Conditions can be found [here](https://hypercerts.org/terms). - -### Final step: Click "Create" - -Make sure your Optimism wallet or multi-sig is connected. Click on "create" and wait for your hypercert to be created. Congratulations! diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md deleted file mode 100644 index 47e8ad7c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/minting-guide-start.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Getting Started -id: minting-guide-start -sidebar_position: 1 ---- - -# Getting started - -### How to create a hypercert - -Creating a hypercert is similar to creating an NFT on sites like OpenSea or Zora. - -In this article, we’ll walk through the steps one by one and explain exactly what you need to do to create your first hypercert. - -There are typically two ways of creating a hypercert: - -1. As a project affiliated with a specific funding network (e.g., Gitcoin Grants): In this case, you should receive a custom URL from the funding network that pre-populates most of your hypercert fields. You will still be able to change most of these, so you should review and adjust them as needed to better describe your hypercert. Guidance on how to do so (for Gitcoin Grants projects) is provided at the end of this doc. -2. As a project not affiliated with a specific funding network: In this case, you will be creating a hypercert from scratch and filling in each field on your own. Read on below. - -### Who can create a hypercert? - -Anyone doing work that is intended to have a positive impact can create a hypercert. Your hypercert can be as simple as "I did X on this date and want to claim all future impact from it". - -It can also represent something more, such as a phase in an ongoing team project, an invention or discovery, a research publication, or an important software release. - -Critically, if the work was done by more than one person, then each person should be listed as a contributor to the hypercert and approve the creation of the hypercert. - -_Note: In the future, the approval of each contributor will be verified on-chain._ - -### What do I need to create a hypercert? - -You will need to prepare all of the information required in the form builder (see **Step-by-step instructions for creating a hypercert** below). This includes important metadata, such as a description of the project and the dimensions of your impact claim, as well as a project artwork. You may also want to include an allowlist of wallets that are approved to claim one or more fractions of the hypercert. - -In addition to the information regarding the hypercert itself, you’ll need a crypto wallet to mint your hypercert. “Minting” a hypercert is the process of writing an impact claim to the blockchain. This establishes its immutable record of authenticity and ownership. - -Next, choose a blockchain on which to mint your hypercert. The hypercerts protocol is available on Ethereum, Goerli (testnet), and Optimism. Each of these blockchains has different gas fees associated with transactions on their networks. To reduce gas fees we recommend Optimism for most projects. - -Finally, go ahead and create your hypercert. - -### How much does it cost to create a hypercert? - -You will need enough Ethereum in your wallet to cover gas fees. In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). - -The protocol currently does not offer gas-free or "lazy" minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md b/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md deleted file mode 100644 index 9f3b6303..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/minting-guide/step-by-step.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Step-by-step Instructions -id: step-by-step -sidebar_position: 2 ---- - -# Step-by-step instructions - -First, go to the [Create Hypercert](https://hypercerts.org/app/create) site with a wallet-enabled browser or follow the custom URL you received to access a prepopulated form. - -Although the site works on mobile, it is easier to use on desktop because the browser will display a dynamic preview of the hypercert while you fill out the Create form. - -Next, connect your wallet. You will be prompted to switch to the Ethereum or Optimism network. - -Once you've connected, you will see an empty form for creating a hypercert. - -### General fields - -#### Name of Hypercert - -Enter the name or title of the hypercert. This is the place to be verbose and specific about what the project is doing. You'll see on the preview when your title becomes too long. - -Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. - -Names are restricted to 100 characters but may include emojis (:smile:), accents (é), non-Latin scripts (表情), and other Unicode characters. - -#### Project Description - -Enter a human readable description of the hypercert. This is the place to share more details about the work and the team or individual behind the work. - -The description field supports [Markdown syntax](https://www.markdownguide.org/cheat-sheet/) and has a limit of 10,000 characters. - -In addition to the main link (see next field) you can add further links in the markdown to help others to understand the work of the project. - -#### Link - -A valid URL for the project, beginning with https:// - -This will be displayed next to the hypercert on webpages like OpenSea and should link users to a page that has more information about the project or impact claim. - -#### Logo - -An icon for the top left part of the card. This could be your project logo. It will be automatically masked to the shape of a circle. - -Logo images look best with an aspect ratio of 1.0 (square-shaped). - -The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. - -#### Background Banner Image - -A background image that will extend across the upper half of the artwork. This could be your project masthead or a unique piece of art. - -Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. - -Currently we don't support zoom / cropping, so you will need to test the look and feel on your own. - -The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. - -### Work Scope fields - -#### Work Scope - -One or multiple tags describe the work that the hypercert represents. This work scope will be used to identify the work that is included in the hypercerts and the work that is not included. - -Multiple tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -_Note: In the future, you will be able to specifically exclude work from the hypercert._ - -#### Start and End Date of Work - -The work time period defines when the work was done that the hypercert represents, i.e., only the work in this time period is included in the hypercert. - -The time period of work doesn't need to be the start and end date of a project, but it can be. One project can be split up into multiple hypercerts, e.g. all hypercerts can have the same `work scope`, but different time periods of work. Of course, the time periods are not allowed to overlap. - -### Impact scope fields - -#### Impact Scope - -The impact scope can be used to limit the impact that a hypercert represents, e.g. for the work scope `Planting trees` a hypercert can represent _only_ the impact on biodiversity by including the impact scope tag `Biodiversity`. This would exclude all other impacts, including the impact on CO2 in the atmosphere, which can be useful if that impact is already captured by a carbon credit. - -By default this is set to "`all`" and we strongly recommend keeping it that way. - -Just like the work scope, multiple impact scope tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction). - -#### Start and End Date of Impact - -The impact time period is another way to limit the impact that a hypercert represents, e.g. inventing a new medical treatment has a positive impact over many years, but we might want to capture the positive impact separately for each year. - -By default the `impact start date` is the same as the `work start date` and the `impact end date` is "`indefinite`", i.e., the impact is not restricted time-wise. We strongly recommend keeping it that way. - -### Set of Contributors - -Provide a list of contributors, one per line, or comma-separated. - -The list should include _all_ contributors that performed the described work. - -Contributors are generally itemized as wallet addresses or ENS names, but can also be names / pseudonyms. Groups of contributors can be represented by a multisig or name of an organization. - -### Owners - -#### Allowlist - -The allowlist allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions afterwards. For example, it can be used to allocate fractions to previous funders and contributors. - -The allowlist is implemented as a CSV file specifying `index,address,price,fractions` headers. - -| index | address | price | fractions | -| ----- | ------------------------------------------ | ----- | --------- | -| 0 | 0x5dee7b340764c49a827c60d2b8729e49405fbefc | 0.0 | 100 | -| 1 | 0x1e2dbb9ca3f6d48e085384a821b7259abfdc7d65 | 0.0 | 50 | -| ... | ... | ... | ... | -| 999 | 0x436bad18642f45d3fa5fcaad0a2d81764a9cba85 | 0.0 | 1 | - -The `price` field is denominated in ETH. This should remain at 0.0 for all hypercerts, as primary sales are not currently supported through the app and the secondary sale/transfer of hypercerts is currently not allowed. - -You can store your allowlists on IPFS using [web3.storage](https://web3.storage/). - -:::note -If your allowlist is not properly formatted, you will be unable to mint your hypercert. If you do not include an allowlist, then the creator of the hypercert will receive 100% of the hypercert (set to a default of 10,000 units), which you can then sell or transfer to another wallet a maximum of one time. -::: - -#### Rights - -This field defines the rights that owners of the hypercert have over the work being claimed by this hypercert. - -By default this is set to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. - -_Note: In the future, additional rights can be included for different hypercerts._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md deleted file mode 100644 index 87fb9194..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/evaluation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Open Impact Evaluations -id: evaluation -sidebar_position: 5 ---- - -A key design element is that hypercerts themselves do not make a claim about the size of the impact, but only account for the work that is supposed to be impactful. The figure below shows this contrast in a simplified illustration of the example that we introduced above. The open evaluation system allows multiple evaluations to point at the same area of the impact space that a hypercert claims. The evaluations can include self-evaluation from the contributors themselves. Funders observe these and make their funding decisions based on this richer set of information. - -![hypercert evaluations](../../static/img/hypercert_evaluations.png) - -The open evaluation system is also used to provide additional information, e.g. an evaluator or the project itself provides information about the health of the trees. This information can then be used transparently by other evaluators to evaluate the impact on CO2 in the atmosphere. - -An important feature is that the evaluations do not directly point at a hypercert, but rather at an area in the impact space. In practice this area will mostly be the exact same area that a hypercert claims, such that it can be considered an evaluation of the hypercert, but it does not have to. This feature ensures that, if hypercerts are merged or split, previous evaluations will continue to be linked appropriately. - -The form of evaluations can be standardized to simplify handling and comparing multiple evaluations from multiple evaluators. The open evaluation system allows for templates to be created and used by any evaluators. Similar to the emerging ontologies, these are not enforced centrally, but should emerge as useful standards – potentially steered by decentralized governance institutions. - -Important characteristics of the open evaluation system are: - -- Evaluators can submit multiple evaluations of the same area in the impact space as more information becomes available -- Evaluations can challenge other evaluations -- Evaluation methodologies can evolve over time - -These features allow the whole evaluation system to be dynamically improved by each actor. The relevant incentives for this improvement will stem from the funders who will value the signals from some evaluators more than others and evaluators are able to build up reputation. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md deleted file mode 100644 index 8acc11d1..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/hypercerts-intro.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: "Hypercerts: a New Primitive for Impact Funding Systems" -id: hypercerts-intro -sidebar_position: 3 ---- - -### Defining hypercerts - -A hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and represents all or parts of that impact. A hypercert has the following fields (one for each dimension): - -1. **Set of contributors:** An ordered list of all contributors, who claim to do or have done the work described by this hypercert. -2. **Scope of work:** A conjunction of potentially-negated work scope tags, where an empty string means “all”: - -``` - ::= AND | " " - ::= | NOT -``` - -3. **Time of work:** A date range, from the start to the end of the work being claimed by this hypercert. -4. **Scope of impact:** A conjunction of potentially-negated impact scope tags, where an empty string means “all”: - -``` - ::= AND | " " - ::= | NOT -``` - -5. **Time of impact:** Date ranges from the start to the end of the impact. -6. **Rights of the owners:** An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. - -Implementing hypercerts as a semi-fungible token allows multiple contributors and funders to own parts of hypercerts. For instance the original contributors can award 10% of a hypercert to a funder, while keeping 90%, which they can award to other funders later. This is why hypercerts are fractionalizable. - -### Examples - -In the simplest cases of hypercerts, the scope of work and impact as well as the time of impact are not restricted and no rights are transferred to owners of the hypercerts, i.e. the hypercerts just define the who (set of contributors) and when (time of work) of the claimed work. Scope of work and impact would be set to all, time of impact to “indefinite” and the rights to only “public display of support”. The latter is always included as the hypercert is a public record, such that owners will always automatically display their support of the work. - -Take for example hypercert 1 below: It represents all work that contributor 1 has performed in 2013 with all the impact that the work had from the beginning of the work; the hypercert doesn’t give any additional rights to the owners of the hypercert. - -The other fields – except the rights field – can be used to limit the work or impact that is represented by the hypercert. Hypercert 2 limits this to the work on IPFS in 2013, i.e. any other work besides IPFS that contributor 1 performed is not included. Hypercert 3 limits it even further as it excludes a specific aspect of IPFS, the go-ipfs implementation. - -| | **Hypercert 1** | **Hypercert 2** | **Hypercert 3** | -| ----------------------- | ------------------------- | ------------------------- | ------------------------- | -| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | -| **Scope of work** | all | IPFS | IPFS ∧ ¬ go-ipfs | -| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | -| **Scope of impact** | all | all | all | -| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → 2013-12-31 | -| **Rights** | Public display of support | Public display of support | Public display of support | - -In the table below we illustrate a use case for limiting the scope of impact. Suppose contributor 1 protects trees in a certain area. This work has positive effects on the CO2 in the atmosphere and could turn into carbon credits; however, the trees have additional positive impacts, such as protecting biodiversity. Instead of including all positive impacts in one hypercert (hypercert 4), the impact can be split between the impact on CO2 in the atmosphere (hypercert 5) and all other positive impacts (hypercert 6). If funders are willing to pay for biodiversity, this would be a new income opportunity. And it would account for the additional positive impact that other methods of reducing CO2 might not have, like industrial carbon capture. Importantly, negative impacts can not be excluded from a hypercert. - -| | **Hypercert 4** | **Hypercert 5** | **Hypercert 6** | -| ----------------------- | -------------------------- | -------------------------- | -------------------------- | -| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | -| **Scope of work** | Protecting trees in area X | Protecting trees in area X | Protecting trees in area X | -| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | -| **Scope of impact** | all | CO2 in atmosphere | all ∧ ¬ CO2 in atmosphere | -| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → indefinite | -| **Rights** | Public display of support | Public display of support | Public display of support | - -Importantly a hypercert does not specify the “size” of the impact, e.g. a hypercert does not state “5 tons of CO2 removed from the atmosphere.” Instead the hypercert only defines the work, e.g. “200 trees protected” (scope of work) in 2022 (time of work). The size of the impact is then left to the evaluations of the “CO2 in the atmosphere” (scope of impact) in 2022 (time of impact) that point towards the covered region of the hypercert. For instance: This allows a self evaluation to claim that 5 tons of CO2 were removed in a given year as well as one or multiple evaluations from independent auditors to confirm or challenge how much CO2 has been removed. An evaluator could detect that some of the trees were not healthy and hence only 4 tons of CO2 were removed. Allowing for multiple evaluation is a defining characteristic of the open evaluation system. - -### Functions of hypercerts - -#### 1. Identifiability - -Hypercerts clearly define the work that is supposed to be impactful by creating a record of who (set of contributors) claims to do or have done what (scope of work) in what time period (time of work). They also allow the creation of multiple records of the same work to identify separate impacts that this work had or will have (scope of impact) over specified time periods (time of impact). - -#### 2. Traceability - -As these records are public and logically monotonic (immutable, except to split or merge hypercerts), records are durable and permanent. - -#### 3. Transferability - -The records are a digital object that can be owned and ownership can be transferred (under specific conditions). As hypercerts can be created as fractionalizable, it is also possible to transfer only a specified fraction of the hypercert. Each hypercert defines the rights over the defined work that owners have, such as rights to retrospective rewards, rights to public display of the support (“bragging rights”) or rights to passive income from intellectual property. - -:::note Transferability restrictions - -Hypercerts are generally transferable. However, there are use cases, in which minters of hypercerts want to restrict how their hypercerts can be transferred. The protocol allows the minter to restrict who can transfer the hypercert and/or to whom the hypercert can be transferred. For instance, by specifying that only the original owner can transfer the hypercert, any future owner is prohibited from selling it, i.e. a secondary market would not exist for this hypercert. - -::: - -### Merging hypercerts - -Besides the fungible dimension, hypercerts can be merged and split on any of the six dimensions as shown in box 1. Let us take the hypercert 1 from the section "Hypercerts definition" and focus only on two of the dimensions, scope of work and time of work. These two dimensions create a simplified impact space. The figure below shows how work on IPFS (InterPlanetary File System) could have been minted over time in separate hypercerts, one for each quarter of work. - -![minting hypercerts example](../../static/img/creating.png) - -We created five hypercerts, one for each quarter of work. As the resulting work of all of these together is IPFS 0.1, the merged hypercert in total is more meaningful and more valuable than just the five individual hypercerts. In this case the proverb is true, the whole is greater than the sum of its parts. Hence, we want to merge them as shown in the next figure. - -![merging hypercerts example](../../static/img/merging.png) - -### Splitting hypercerts - -Conversely, splitting can increase the meaningfulness and value of hypercerts as well. We can split the work on IPFS 0.1 into the conceptual work “invention of IPFS” and the implementation via “go-ipfs 0.1” as shown in the next figure. - -![splitting hypercerts examples](../../static/img/splitting.png) - -Other use cases are where multiple contributors want to combine their work on the same scope of work (merging) or disentangle their work (splitting). Ultimately, splitting and merging allows users to repackage the digital representation of their work and impact. - -Importantly, splitting and merging are the only operations that are permitted to change hypercerts. Once an area in the impact space is claimed, it can not be unclaimed. This ensures that claims are never forgotten. - -### Retiring hypercerts - -While a claim in the impact space can not be unclaimed, it can be retired. Retiring a hypercert means that owners can not transfer and sell it anymore. This way owners prove that they are the final buyers of the impact. Technically retiring hypercerts means that they are sent to a specific null address, which ensures that the retired hypercerts are recorded and traceable. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md deleted file mode 100644 index 6f71ac50..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/ifs.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: The Need for Interoperable Impact Funding Systems (IFSs) -id: ifs ---- - -# The Need for Interoperable Impact Funding Systems (IFSs) - -### An IFS consists of - -- **Actors:** Contributors, funders, evaluators, and beneficiaries -- **Funding mechanisms:** Grants, bounties, retrospective funding, etc. -- **Coordination mechanisms:** Roadmapping, communication forums, etc. -- **A goal:** Maximize the domain-specific positive value created (impact) - -The goal will be specific to the impact area, e.g. prevent existential risks from artificial intelligence (AI) would be the goal for the impact area “AI safety.” To achieve these goals, skilled contributors must work with high effort on promising projects. Additionally, for those projects that create impact continuously, sufficient income streams are necessary to cover both their ongoing operating expenses and contributors’ upside incentives. - -#### Actors in IFSs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeSubtypeDescription
    ContributorsPeople or organizations who do the work
    FundersProspective fundersPeople or organizations who fund work before it is done
    Retrospective fundersPeople or organizations who fund work after it is done
    EvaluatorsScoutsPeople or organizations who evaluate the potential impact of work before it is done
    AuditorsPeople or organizations who evaluate the impact of work after it is done
    BeneficiariesPeople or objects that are impacted by the work
    - -### Guiding questions for designing IFSs - -1. **Projects:** How can we improve the chances that the most promising projects are worked on? -2. **Talent & resources:** How can we attract top talent to contribute to the most promising projects and provide them with the necessary resources? -3. **Effort:** How can we reward contributors for their impact on outcomes? -4. **Sustainable income:** How can we create recurring income streams and financial sustainability for impactful projects? - -Markets have been proven very powerful in answering these questions if they are directed towards maximizing profits. As we are directing systems towards maximizing impact, these answers become more challenging. In particular, in an IFS we are facing coordination and incentive problems in funding impact, such as the free-rider problem. - -### Example dynamics between actors in an IFS - -In order for impact funding systems to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources and (3) evaluations. In the diagram below you see a potential dynamic between the actors of an IFS. In that scenario hypercerts can account for the prospective funding (steps 2-3) as well as for the retrospective funding (steps 8-9) from different funders. Evaluations are made public and can be discovered through the hypercerts for all funders (steps 5-7). Retrospective funders can reward not only the contributors but also the prospective funders (steps 10-11). - -```mermaid -sequenceDiagram - autonumber - participant Beneficiaries - participant Contributors - participant Prospective funders - participant Retrospective funders - participant Evaluators - Contributors ->> Contributors: Mint hypercerts - Prospective funders ->> Contributors: Award funding - Contributors ->> Prospective funders: Award fractions of
    the hypercert - Contributors ->> Beneficiaries: Create impact - Retrospective funders ->> Evaluators: Fund evaluation - Evaluators ->> Beneficiaries: Evaluate impact on beneficiaries - Evaluators ->> Retrospective funders: Make evaluations public,
    esp. for retrospective
    funders - Retrospective funders ->> Contributors: Award funding - Contributors ->> Retrospective funders: Award fractions of hypercerts - opt - Retrospective funders ->> Prospective funders: Award funding - Prospective funders ->> Retrospective funders: Transfer fractions
    of hypercert - end -``` - -### Hypercerts as a data layer for IFSs - -By serving as a single, open, shared, decentralized database hypercerts lower the transaction costs to coordinate and fund impactful work together. This is important because the optimal funding decisions of a single funder depends on the funding decision of all other funders. For instance, some work is only impactful if a minimum funding is provided: The impact is non-linear in the funding amount, e.g. half a bridge is not half as impactful as a full bridge. Other work might be over-funded, i.e. the impact of an additional dollar is basically zero. Ultimately, funders want to find the highest impact for each additional dollar spend (cf. S-process as in Critch, 2021). Today multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Through hypercerts the funding becomes more transparent and the credits for funding impactful work can be easily shared. Coordinating funding becomes easier. - -Hypercerts don’t solve this coordination problem by themselves, but build the basis for different decision and funding mechanisms as shown below. Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. Hypercerts do not lock in any particular decision-making scheme for funders. - -![Hypercerts as a data layer for an IFS](../../static/img/hypercert_data_layer.png) - -Looking farther into the future: If a large majority of funding across an entire IFS ends up flowing through hypercerts, funders have created the transparency that enables each of them to make the best decisions given the funding decision of everyone else. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md deleted file mode 100644 index f8fed762..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/impact-space.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: A Consistent Impact Space -id: impact-space -sidebar_position: 4 ---- - -Every hypercert represents a claim in the impact space, which itself represents all possible claims. Above we illustrated the impact space with two dimensions, scope and time of work. The complete impact space is spanned by the six dimensions introduced in the definition of hypercerts. - -### Consistency of the impact space - -Every point in the impact space should either be claimed or not be claimed. No point must be claimed twice, or equivalently: - -- If the impact of some work is represented in one hypercert, it must not be part of any other hypercert. -- Hypercerts must not overlap with each other. - -The table below shows two hypercerts that were illustrated in the section on "Hypercerts operations", but now with all six fields. The two hypercerts can represent the exact same work by the same contributor, but they do not overlap because of the difference in the time of work. - -| | **Hypercert 7** | **Hypercert 8** | -| ----------------------- | ------------------------ | ------------------------ | -| **Set of contributors** | Contributor 1 | Contributor 1 | -| **Scope of work** | IPFS | IPFS | -| **Time of work** | 2013-10-01 to 2013-12-31 | 2014-01-01 to 2014-03-31 | -| **Scope of impact** | all | all | -| **Time of impact** | 2013-10-01 → indefinite | 2014-01-01 → indefinite | -| **Rights** | None | None | - -The consistency of the impact space is crucial as it ensures that no rights to an impact claim are sold twice. If for example someone owns the right to retrospective rewards for the impact of some work, the owners must be identifiable unambiguously. - -Because users can create hypercerts with arbitrary data on any chain, on which a hypercert contract is deployed, we provide ways to help users detect collisions in the impact space. For example, if one hypercert on Ethereum points to the work on “IPFS”, and another hypercert on Filecoin points to the work on “https://github.com/ipfs/go-ipfs” both with the same contributor and time of work, which of these overlapping hypercerts is the correct one to support? To surface such overlapping hypercerts, the hypercerts protocol and SDK will support mechanisms to index, search, and visualize neighbors in the impact space. With these tools evaluators can quickly detect potential conflicts and submit the results as evaluations to help disambiguate proper credit and attribution. - -### Emerging ontologies - -Common ontologies for the scope of work and scope of impact are useful to create transparency and improve discoverability. Such ontologies need to be created from the practices and should be adapted over time. They are like emerging norms, instead of fixed rules. However, some larger players or a group of smaller players could enforce certain ontologies, e.g. if multiple funders agree that they only fund projects that follow a specified ontology. - -As some ontologies might be more useful than others, we would ideally see a consensus emerge between participants and experts in each impact area. Decentralized governance institutions can help facilitate this; however, further details on the design are out of the scope of this paper and are left for future work. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md deleted file mode 100644 index 57444581..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/retrospective-funding.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Retrospective Impact Funding -id: retrospective-funding -sidebar_position: 6 ---- - -### Introducing retrospective funding - -While hypercerts do not impose any specific funding mechanisms, they are especially useful for retrospective funding. The core idea, from the perspective of contributors building impactful goods, is this: if you can reasonably expect to get funded retrospectively for your work once you produce a positive impact, then you can work now, in expectation of a probabilistic future cash flow. In another conception, you are effectively “borrowing” money from this anticipated future cash flow to fund the work in the first place; the expectation of future funding “retro-causes” the impactful work. Retrospective funding may be able to 1) provide incentives for contributors to take on impactful goods projects with a potentially high, but uncertain, impact and 2) create a more efficient IFS by back-propagating signals on what outcomes were impactful post-hoc. - -In addition, contributors are able to receive fair compensation by providing outsized impact that will be highly valued. It incentivizes you to create a positive impact, beyond your intrinsic motivation. This does not mean that the most successful contributors to impactful goods automatically have potential upside comparable to some for-profit startup founders (or that they should), just that their potential upside does depend on how much funders later value their past work. This will attract more talent to the impact sector by improving performance-based compensation. - -The crucial aspect for this to work: funders need to retrospectively fund impact, and send credible signals that they will do so in the future. Based on these signals contributors form expectations about future retrospective rewards and can start working today to receive them in the future. - -Hypercerts facilitate retrospective funding as the impact claims are identifiable, traceable and transferable. Contributors can sell parts of their hypercerts to prospective funders to receive the necessary funding for their project (“activity” in the figure below). The project delivers impact to a larger group (“beneficiaries”), which retrospectively buys the hypercerts from the prospective funder, and from the contributors if they retained some fraction of their hypercerts (the latter is not represented in the figure). - -![Retrospective funding with hypercerts](../../static/img/retrospective_funding.png) - -### Increasing rewards - -Retrospective funding allows us to increase rewards as more impact is created because impact is easier to observe, measure and prove retrospectively. Increasing rewards – as shown in the next figure – incentivizes contributors to put in their highest effort to produce impact and enables contributors to be rewarded for their talent. Moreover, prospective funders are incentivized to select, fund and support the projects with the highest expected impact, if they also receive retrospective rewards. - -![Increasing rewards](../../static/img/increasing_rewards.png) - -Note that retrospective funding should not be used in cases where a significant negative impact is possible since a nongovernmental, permissionless framework can not impose retrospective penalties for negative externalities. See Ofer & Cotton-Barratt (2022) for a discussion of this limitation of retrospective funding. - -In some cases we do not expect the retrospective evaluation to be any different than the prospective evaluation, i.e. there is no uncertainty resolved over time as the impact of an activity is already “known” prospectively. In these cases retrospective funding would only complicate the funding mechanism and funding via grants or milestone bounties would be preferable. Retrospective funding is preferable only if uncertainty is resolved over time. - -### Impact evaluations - -The relevance of impact evaluations will depend on how much their signals influence the funding decisions of retrospective funders (see the potential dynamics in the section on "IFSs"). This is a critical difference to many impact reports today: If a project was funded by a grant, the funders as well as the project want to receive a positive evaluation. If, however, the funding decisions of the retrospective funders are outstanding, they are interested in truthful signals about the impact. Hence, funders value improvements in evaluation methodologies and can fund independent evaluators. Evaluators in turn would build up a reputation for their evaluation methodologies and improve the strength of their signals to retrospective funders. - -Impact evaluators can take on a range of forms ranging forms, such as - -- Voting by relevant communities or beneficiaries -- Expert panels -- Professional evaluators similar to financial rating agencies -- Automatic monitoring and data collection by sensors and oracles - -The most useful form or combinations thereof will depend on the specific requirements of the impact area. For a generalized framework on impact evaluators see Protocol Labs (2023). - -While retrospective funding makes impact evaluations financially relevant for funders and contributors, hypercerts enable to pre-commit funding for those evaluations: As impact claims are never forgotten, any actor can at any time commit funding to a future evaluation of these claims. diff --git a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md deleted file mode 100644 index 4d4648ba..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.0/whitepaper/whitepaper-intro.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Introduction -id: whitepaper-intro ---- - -# Vision & Whitepaper - -:::note - -If you prefer to read the draft whitepaper (v0) as a pdf, you can find it [here](../../static/pdf/hypercerts_whitepaper_v0.pdf). The content is mostly identical to the following pages. - -::: - -#### The world faces unprecedented challenges, from climate change to safe artificial intelligence, that require billions to trillions of dollars of public goods funding. - -High-upside/high-uncertainty endeavors are often overlooked due to the absence of strong incentives to pursue them in the dominant public goods funding framework of at-cost grants or even a milestone-bounty framework (which directly exposes small contributors to aversive risk levels). Yet these should be pursued when the expected positive value is very high, as it often is. New impact funding mechanisms can address this. One such mechanism is retrospective funding, which rewards projects based on the impact they create after the impact is observable. If projects can reasonably expect such retrospective rewards, they are incentivized to maximize their impact and – together with prospective funders – take risky bets when the expected positive value is high. - -#### In order for Impact Funding Systems (IFSs) to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources, and (3) evaluations. - -Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. We do not wish to lock in any particular decision-making scheme for funders. Without mechanisms like these, multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Funders should be able to easily collaborate with other funders or to intentionally fund different projects to diversify the funded approaches. Evaluators should be able to evaluate the same impact with different methodologies – potentially with conflicting results, to foster rigor and progress of evaluation methodologies. - -#### Hypercerts create this interoperability by serving as a single, open, shared, decentralized database for impact funding mechanisms. - -A single hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and whose ownership is fractionizable and transferable (under specific conditions). Hypercerts do not impose any specific funding mechanisms but provide baseline invariant guarantees such that claims will not be forgotten as different mechanisms come into and out of fashion. This is also why hypercerts are especially useful for any retrospective funding mechanisms – funding can be applied to claims of the past. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/about.md b/docs/versioned_docs/version-1.0.0-alpha.1/about.md deleted file mode 100644 index e2d4eb79..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/about.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: The Hypercerts Foundation -id: about ---- - -# The Hypercerts Foundation - -### Mission - -The mission of the Hypercerts Foundation is to advance the development and adoption of open-source protocols for funding and rewarding positive impact. - -### Organization - -The Hypercerts Foundation is a fully independent organisation working closely with stakeholders in the open source, scientific research, and cryptography communities to develop and promote additional protocols that are decentralized, secure, and transparent. The Foundation will also provide support and resources to help drive the wider adoption of these protocols. - -### History - -Research on hypercerts was first presented to the public by David A. Dalrymple at the conference series Funding the Commons in March 2022. However, the concept of “impact certificates” has been a recurring theme at conferences and in online discussion forums since at least 2014. In late 2022, a small team of research scientists, developers, and practitioners began implementing hypercerts as a set of Ethereum-based smart contracts that could be used to assert and fund impact claims. The Hypercerts Foundation will now serve as the long-term home for this work. - -The new foundation is supported in part by Protocol Labs and is part of the broader Protocol Labs Network of hundreds of companies and organizations. The Foundation will complement Protocol Labs Network’s mission of enabling a more secure, open, and accessible internet. The Hypercerts Foundation, however, is fully independent and will focus on protocol development and cultivating a community of developers and impact entrepreneurs well beyond the Protocol Labs Network. - -### Further links - -Read the full [announcement of the Hypercerts Foundation](https://hypercerts.notion.site/Introducing-the-Hypercerts-Foundation-d956203fe0fc4792980da138015e770a). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md deleted file mode 100644 index bc65b116..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/allowlists.md +++ /dev/null @@ -1,101 +0,0 @@ -# Allowlists - -Allowlists are an efficient way to enable distribution of hypercert fractions amongst a group. -First, the creator will create the hypercert with the metadata and an immutable allowlist. -With the `claimId`, every account specified in the allowlist can later mint their fraction token from that allowlist. - -## Create an allowlist - -First specify an allowlist, mapping addresses to the number of units they should receive. - -```js -import { - TransferRestrictions, - formatHypercertData, - Allowlist, -} from "@hypercerts-org/sdk"; - -const allowlist: Allowlist = [ - { address: "0x123", units: 100 }, - { address: "0xabc", units: 100 }, -]; -``` - -Then, call `createAllowlist` with the metadata and allowlist. - -```js -const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; -const transferRestrictions = TransferRestrictions.FromCreatorOnly - -const { claimId } = await hypercerts.createAllowlist({ - allowList, - metaData, - totalUnits, - transferRestrictions: TransferRestrictions.FromCreatorOnly, -}); -``` - -> **note** We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree generation and data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree) - -It first checks if the client is writable and if the operator is a signer. If the operator is not a signer, it throws an `InvalidOrMissingError`. - -Next, it validates the allowlist and metadata by calling the `validateAllowlist` and `validateMetaData` functions respectively. If either the allowlist or metadata is invalid, it throws a `MalformedDataError`. - -Once the allowlist and metadata are validated, the method creates a Merkle tree from the allowlist and stores it on IPFS. It then stores the metadata on IPFS as well. - -Finally, the method invokes the `createAllowlist` function on the contract with the signer's `address`, the total number of `units`, the Merkle tree `root`, the metadata `CID`, and the `transfer restrictions`. If the method is called with `overrides`, it passes them to the createAllowlist function. - -## Claiming a fraction token - -Users can claim their fraction tokens for many hypercerts at once using `mintClaimFractionFromAllowlist`. To determine the input the following information is required: - -| Variable | Type | Source | -| -------- | ------------ | ------------ | -| claimId | BigNumberish | Hypercert ID | -| units | BigNumberish | Allowlist | -| proof | BytesLike[] | Merkle tree | - -We store the allowlist and the Merkle tree in the metadata of the Hypercert. To understand the Merkle tree data structures, check out the [OpenZeppelin merkle tree library](https://github.com/OpenZeppelin/merkle-tree). You can get the `proof` and `units` by traversing the merkle tree. - -Then, call `mintClaimFractionFromAllowlist` with the required data. The contracts will also verify the proofs. However, when providing the `root` in the function input, the proofs will be verified before a transaction is submitted. - -```js -import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; - -const claimId = "0x822f17a9a5eecfd...85254363386255337"; -const address = "0xc0ffee254729296a45a3885639AC7E10F9d54979"; - -const { indexer, storage } = hypercertsClient; -const claimById = await indexer.claimById(claimId); -const { uri, tokenID: _id } = claimById.claim; -const metadata = await storage.getMetadata(uri || ""); -const treeResponse = await storage.getData(metadata.allowList); -const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); - -let args; -// Find the proof in the allowlist -for (const [leaf, value] of tree.entries()) { - if (value[0] === address) { - args = { - proofs: tree.getProof(leaf), - units: Number(value[1]), - claimId: _id, - }; - break; - } -} - -// Mint fraction token -const tx = await hypercerts.mintClaimFractionFromAllowlist({ - ...args, -}); -``` - -Let's see what happens under the hood: - -First, the method checks that the client is not `read only` and that the operator is a signer. If not, it throws an `InvalidOrMissingError`. - -Next, the method verifies the Merkle `proof` using the OpenZeppelin Merkle tree library. If a `root` is provided, the method uses it to verify the proof. If the proof is invalid, it throws an error. - -Finally, the method calls the `mintClaimFromAllowlist` function on the contract with the signer `address`, Merkle `proof`, `claim ID`, and number of `units` as parameters. If overrides are provided, the method uses them to send the transaction. Otherwise, it sends the transaction without overrides. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md deleted file mode 100644 index 4684053c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md +++ /dev/null @@ -1,84 +0,0 @@ -# AllowlistMinter - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -## Events - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -## Errors - -### DoesNotExist - -```solidity -error DoesNotExist() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md deleted file mode 100644 index 518efa42..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertMinter.md +++ /dev/null @@ -1,895 +0,0 @@ -# HypercertMinter - -_bitbeckers_ - -> Contract for managing hypercert claims and whitelists - -Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. - -_Wrapper contract to expose and chain functions._ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### batchBurnFraction - -```solidity -function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenIDs | uint256[] | undefined | - -### batchMintClaimsFromAllowlists - -```solidity -function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable -``` - -Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - -_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| -------- | ----------- | ----------- | -| account | address | undefined | -| proofs | bytes32[][] | undefined | -| claimIDs | uint256[] | undefined | -| units | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256) external nonpayable -``` - -Burn a claimtoken; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| \_2 | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable -``` - -Batch burn claimtokens; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| \_2 | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address _account, uint256 _tokenID) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | - -### createAllowlist - -```solidity -function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Register a claim and the whitelist for minting token(s) belonging to that claim - -_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| merkleRoot | bytes32 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable -``` - -Merge the value of tokens belonging to the same claim - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------- | --------- | ----------- | -| \_account | address | undefined | -| \_fractionIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint a semi-fungible token for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimFromAllowlist - -```solidity -function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable -``` - -Mint a semi-fungible token representing a fraction of the claim - -_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| units | uint256 | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint semi-fungible tokens for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### name - -```solidity -function name() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### readTransferRestriction - -```solidity -function readTransferRestriction(uint256 tokenID) external view returns (string) -``` - -TRANSFER RESTRICTIONS - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### splitFraction - -```solidity -function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable -``` - -Split a claimtokens value into parts with summed value equal to the original - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| -------------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | -| \_newFractions | uint256[] | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_see { IHypercertMetadata}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | ----------- | -| \_uri | string | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md deleted file mode 100644 index e31e8840..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md +++ /dev/null @@ -1,434 +0,0 @@ -# HypercertTrader - -_bitbeckers_ - -> Contract for managing hypercert trades - -Implementation of the HypercertTrader Interface - -## Methods - -### batchBuyUnits - -```solidity -function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable -``` - -This function allows a user to buy Hypercert tokens from multiple existing offers in a single transaction. The function takes in several arrays of parameters, including the IDs of the offers to buy from, the number of units to buy for each offer, the tokens used for payment for each offer, and the amounts of tokens to pay per unit for each offer. The function then executes the trades and transfers the Hypercert tokens to the specified recipient. - -_Buys Hypercert tokens from multiple existing offers in a single transaction._ - -#### Parameters - -| Name | Type | Description | -| ------------------- | --------- | -------------------------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerIDs | uint256[] | The list of IDs of the offers to buy from. | -| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | -| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | -| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | - -### buyUnits - -```solidity -function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable -``` - -This function buys Hypercert tokens from an existing offer. The function verifies that the offer is valid and that the buyer has provided enough payment in the specified token. If the offer is for a fraction of a Hypercert token, the function splits the fraction and transfers the appropriate number of units to the buyer. If the offer is for a fixed number of units, the function transfers the units to the buyer. The function also transfers the payment to the offerer and emits a `Trade` event. - -_Buys Hypercert tokens from an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | --------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerID | uint256 | The ID of the offer to buy from. | -| unitAmount | uint256 | The number of units to buy. | -| buyToken | address | The address of the token used for payment. | -| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | - -### cancelOffer - -```solidity -function cancelOffer(uint256 offerID) external nonpayable -``` - -This function cancels an existing offer. The function verifies that the offer exists and that the caller is the offerer. The function sets the offer status to `Cancelled` and emits an `OfferCancelled` event. - -_Cancels an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ------------------------------ | -| offerID | uint256 | The ID of the offer to cancel. | - -### createOffer - -```solidity -function createOffer(address hypercertContract, uint256 fractionID, uint256 unitsForSale, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | -------------------------------- | ----------- | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| unitsForSale | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -### getOffer - -```solidity -function getOffer(uint256 offerID) external view returns (struct IHypercertTrader.Offer) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------- | ----------- | -| \_0 | IHypercertTrader.Offer | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### offers - -```solidity -function offers(uint256) external view returns (address offerer, address hypercertContract, uint256 fractionID, uint256 unitsAvailable, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, enum IHypercertTrader.OfferType offerType, enum IHypercertTrader.OfferStatus status) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | --------------------------------- | ----------- | -| offerer | address | undefined | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| unitsAvailable | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| offerType | enum IHypercertTrader.OfferType | undefined | -| status | enum IHypercertTrader.OfferStatus | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### totalUnitsForSale - -```solidity -function totalUnitsForSale(address, uint256) external view returns (uint256) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OfferCancelled - -```solidity -event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| creator `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OfferCreated - -```solidity -event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| offerer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Trade - -```solidity -event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| seller `indexed` | address | undefined | -| buyer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID | uint256 | undefined | -| unitsBought | uint256 | undefined | -| buyToken | address | undefined | -| tokenAmountPerUnit | uint256 | undefined | -| offerID | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -## Errors - -### InvalidBuy - -```solidity -error InvalidBuy(string) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### InvalidOffer - -```solidity -error InvalidOffer(string) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### NotAllowed - -```solidity -error NotAllowed() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md deleted file mode 100644 index 13a84632..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md +++ /dev/null @@ -1,39 +0,0 @@ -# IHypercertMinter - -## Methods - -### ownerOf - -```solidity -function ownerOf(uint256 id) external view returns (address) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 id) external view returns (uint256) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md deleted file mode 100644 index a4086e37..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md +++ /dev/null @@ -1,457 +0,0 @@ -# SemiFungible1155 - -_bitbeckers_ - -> Contract for minting semi-fungible EIP1155 tokens - -Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` - -_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------------------------------- | -| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | -------------------------------------------- | -| \_uri | string | The metadata URI for the specified token ID. | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md deleted file mode 100644 index 6be07157..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md +++ /dev/null @@ -1,77 +0,0 @@ -# AggregatorV3Interface - -## Methods - -### decimals - -```solidity -function decimals() external view returns (uint8) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ----- | ----------- | -| \_0 | uint8 | undefined | - -### description - -```solidity -function description() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### getRoundData - -```solidity -function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -#### Parameters - -| Name | Type | Description | -| --------- | ------ | ----------- | -| \_roundId | uint80 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| roundId | uint80 | undefined | -| answer | int256 | undefined | -| startedAt | uint256 | undefined | -| updatedAt | uint256 | undefined | -| answeredInRound | uint80 | undefined | - -### latestRoundData - -```solidity -function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -#### Returns - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| roundId | uint80 | undefined | -| answer | int256 | undefined | -| startedAt | uint256 | undefined | -| updatedAt | uint256 | undefined | -| answeredInRound | uint80 | undefined | - -### version - -```solidity -function version() external view returns (uint256) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md deleted file mode 100644 index 8d14ad8c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md +++ /dev/null @@ -1 +0,0 @@ -# console diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md deleted file mode 100644 index cb666cd3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md +++ /dev/null @@ -1,3 +0,0 @@ -# console2 - -_The original console.sol uses `int` and `uint` for computing function selectors, but it should use `int256` and `uint256`. This modified version fixes that. This version is recommended over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. Reference: https://github.com/NomicFoundation/hardhat/issues/2178_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md deleted file mode 100644 index 72455b43..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md +++ /dev/null @@ -1,29 +0,0 @@ -# IAllowlist - -_bitbeckers_ - -> Interface for allowlist - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md deleted file mode 100644 index 30ed6f95..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md +++ /dev/null @@ -1,192 +0,0 @@ -# IHypercertToken - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### batchBurnFraction - -```solidity -function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable -``` - -Operator must be allowed by `creator` and the tokens must represent the total amount of available units. - -_Function to burn the tokens at `tokenIDs` for `account`_ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address account, uint256 tokenID) external nonpayable -``` - -Operator must be allowed by `creator` and the token must represent the total amount of available units. - -_Function to burn the token at `tokenID` for `account`_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address account, uint256[] tokenIDs) external nonpayable -``` - -Tokens that have been merged are burned. - -_Function called to merge tokens within `tokenIDs`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### splitFraction - -```solidity -function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable -``` - -The sum of `values` must equal the current value of `_tokenID`. - -_Function called to split `tokenID` owned by `account` into units declared in `values`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | -| \_values | uint256[] | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string metadata) -``` - -_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------ | ----------- | -| metadata | string | undefined | - -## Events - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md deleted file mode 100644 index 06fb700c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md +++ /dev/null @@ -1,133 +0,0 @@ -# IHypercertTrader - -_bitbeckers_ - -> Interface for hypercert token trading - -This interface declares the required functionality to interact with the hypercert marketplace - -## Methods - -### batchBuyUnits - -```solidity -function batchBuyUnits(address recipient, uint256[] offerIDs, uint256[] unitAmounts, address[] buyTokens, uint256[] tokenAmountsPerUnit) external payable -``` - -_Buys Hypercert tokens from multiple existing offers in a single transaction._ - -#### Parameters - -| Name | Type | Description | -| ------------------- | --------- | -------------------------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerIDs | uint256[] | The list of IDs of the offers to buy from. | -| unitAmounts | uint256[] | The list of numbers of units to buy for each offer. | -| buyTokens | address[] | The list of addresses of the tokens used for payment for each offer. | -| tokenAmountsPerUnit | uint256[] | The list of amounts of tokens to pay per unit for each offer. | - -### buyUnits - -```solidity -function buyUnits(address recipient, uint256 offerID, uint256 unitAmount, address buyToken, uint256 tokenAmountPerUnit) external payable -``` - -_Buys Hypercert tokens from an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | --------------------------------------------------- | -| recipient | address | The address that will receive the Hypercert tokens. | -| offerID | uint256 | The ID of the offer to buy from. | -| unitAmount | uint256 | The number of units to buy. | -| buyToken | address | The address of the token used for payment. | -| tokenAmountPerUnit | uint256 | The amount of tokens to pay per unit. | - -### cancelOffer - -```solidity -function cancelOffer(uint256 offerID) external nonpayable -``` - -_Cancels an existing offer._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ------------------------------ | -| offerID | uint256 | The ID of the offer to cancel. | - -### createOffer - -```solidity -function createOffer(address hypercertContract, uint256 fractionID, uint256 units, uint256 minUnitsPerTrade, uint256 maxUnitsPerTrade, IHypercertTrader.AcceptedToken[] acceptedTokens) external payable returns (uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | -------------------------------- | ----------- | -| hypercertContract | address | undefined | -| fractionID | uint256 | undefined | -| units | uint256 | undefined | -| minUnitsPerTrade | uint256 | undefined | -| maxUnitsPerTrade | uint256 | undefined | -| acceptedTokens | IHypercertTrader.AcceptedToken[] | undefined | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | ----------- | -| offerID | uint256 | undefined | - -## Events - -### OfferCancelled - -```solidity -event OfferCancelled(address indexed creator, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| creator `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### OfferCreated - -```solidity -event OfferCreated(address indexed offerer, address indexed hypercertContract, uint256 indexed fractionID, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| offerer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID `indexed` | uint256 | undefined | -| offerID | uint256 | undefined | - -### Trade - -```solidity -event Trade(address indexed seller, address indexed buyer, address indexed hypercertContract, uint256 fractionID, uint256 unitsBought, address buyToken, uint256 tokenAmountPerUnit, uint256 offerID) -``` - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ------- | ----------- | -| seller `indexed` | address | undefined | -| buyer `indexed` | address | undefined | -| hypercertContract `indexed` | address | undefined | -| fractionID | uint256 | undefined | -| unitsBought | uint256 | undefined | -| buyToken | address | undefined | -| tokenAmountPerUnit | uint256 | undefined | -| offerID | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md deleted file mode 100644 index 93fe0124..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md +++ /dev/null @@ -1,59 +0,0 @@ -# Errors - -_bitbeckers_ - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md deleted file mode 100644 index 4cb96bfc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md +++ /dev/null @@ -1,46 +0,0 @@ -# BatchOrderTypehashRegistry - -_LooksRare protocol team (👀,💎)_ - -> BatchOrderTypehashRegistry - -The contract generates the batch order hash that is used to compute the digest for signature verification. - -## Methods - -### hashBatchOrder - -```solidity -function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) -``` - -This function returns the hash of the concatenation of batch order type hash and merkle root. - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ------------------- | -| root | bytes32 | Merkle root | -| proofLength | uint256 | Merkle proof length | - -#### Returns - -| Name | Type | Description | -| -------------- | ------- | -------------------- | -| batchOrderHash | bytes32 | The batch order hash | - -## Errors - -### MerkleProofTooLarge - -```solidity -error MerkleProofTooLarge(uint256 length) -``` - -It is returned if the length of the merkle proof provided is greater than tolerated. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ------------ | -| length | uint256 | Proof length | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md deleted file mode 100644 index a32aef65..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md +++ /dev/null @@ -1,76 +0,0 @@ -# CreatorFeeManagerWithRebates - -_LooksRare protocol team (👀,💎)_ - -> CreatorFeeManagerWithRebates - -This contract returns the creator fee address and the creator rebate amount. - -## Methods - -### STANDARD_ROYALTY_FEE_BP - -```solidity -function STANDARD_ROYALTY_FEE_BP() external view returns (uint256) -``` - -Standard royalty fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### royaltyFeeRegistry - -```solidity -function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) -``` - -Royalty fee registry interface. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | contract IRoyaltyFeeRegistry | undefined | - -### viewCreatorFeeInfo - -```solidity -function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) -``` - -This function returns the creator address and calculates the creator fee amount. - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | -| itemIds | uint256[] | Array of item ids | - -#### Returns - -| Name | Type | Description | -| ---------------- | ------- | ------------------ | -| creator | address | Creator address | -| creatorFeeAmount | uint256 | Creator fee amount | - -## Errors - -### BundleEIP2981NotAllowed - -```solidity -error BundleEIP2981NotAllowed(address collection) -``` - -It is returned if the bundle contains multiple itemIds with different creator fee structure. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md deleted file mode 100644 index 41cab900..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md +++ /dev/null @@ -1,64 +0,0 @@ -# CreatorFeeManagerWithRoyalties - -_LooksRare protocol team (👀,💎)_ - -> CreatorFeeManagerWithRoyalties - -This contract returns the creator fee address and the creator fee amount. - -## Methods - -### royaltyFeeRegistry - -```solidity -function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry) -``` - -Royalty fee registry interface. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | contract IRoyaltyFeeRegistry | undefined | - -### viewCreatorFeeInfo - -```solidity -function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) -``` - -This function returns the creator address and calculates the creator fee amount. - -_There are two on-chain sources for the royalty fee to distribute. 1. RoyaltyFeeRegistry: It is an on-chain registry where creator fee is defined for all items of a collection. 2. ERC2981: The NFT Royalty Standard where royalty fee is defined at a itemId level in a collection. The on-chain logic looks up the registry first. If it does not find anything, it checks if a collection is ERC2981. If so, it fetches the proper royalty information for the itemId. For a bundle that contains multiple itemIds (for a collection using ERC2981), if the royalty fee/recipient differ among the itemIds part of the bundle, the trade reverts. This contract DOES NOT enforce any restriction for extremely high creator fee, nor verifies the creator fee fetched is inferior to the total price. If any contract relies on it to build an on-chain royalty logic, it should implement protection against: (1) high royalties (2) potential unexpected royalty changes that can occur after the creation of the order._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | -| itemIds | uint256[] | Array of item ids | - -#### Returns - -| Name | Type | Description | -| ---------------- | ------- | ------------------ | -| creator | address | Creator address | -| creatorFeeAmount | uint256 | Creator fee amount | - -## Errors - -### BundleEIP2981NotAllowed - -```solidity -error BundleEIP2981NotAllowed(address collection) -``` - -It is returned if the bundle contains multiple itemIds with different creator fee structure. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md deleted file mode 100644 index 9ff1c0fc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md +++ /dev/null @@ -1,250 +0,0 @@ -# CurrencyManager - -_LooksRare protocol team (👀,💎)_ - -> CurrencyManager - -This contract manages the list of valid fungible currencies. - -## Methods - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -## Errors - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md deleted file mode 100644 index 83eefc37..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md +++ /dev/null @@ -1,751 +0,0 @@ -# ExecutionManager - -_LooksRare protocol team (👀,💎); bitbeckers;_ - -> ExecutionManager - -This contract handles the execution and resolution of transactions. A transaction is executed on-chain when an off-chain maker order is matched by on-chain taker order of a different kind. For instance, a taker ask is executed against a maker bid (or a taker bid against a maker ask). - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -Creator fee manager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint16) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | uint16 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### protocolFeeRecipient - -```solidity -function protocolFeeRecipient() external view returns (address) -``` - -Protocol fee recipient. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### updateCreatorFeeManager - -```solidity -function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable -``` - -This function allows the owner to update the creator fee manager address. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ---------------------------------- | -| newCreatorFeeManager | address | Address of the creator fee manager | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateMaxCreatorFeeBp - -```solidity -function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable -``` - -This function allows the owner to update the maximum creator fee (in basis point). - -_The maximum value that can be set is 25%. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------ | ---------------------------------------- | -| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | - -### updateProtocolFeeRecipient - -```solidity -function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable -``` - -This function allows the owner to update the protocol fee recipient. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ---------------------------------- | -| newProtocolFeeRecipient | address | New protocol fee recipient address | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| creatorFeeManager | address | undefined | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| maxCreatorFeeBp | uint256 | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------- | -| protocolFeeRecipient | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -## Errors - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md deleted file mode 100644 index 022cce57..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md +++ /dev/null @@ -1,9 +0,0 @@ -# InheritedStrategy - -_LooksRare protocol team (👀,💎)_ - -> InheritedStrategy - -This contract handles the verification of parameters for standard transactions. It does not verify the taker struct's itemIds and amounts array as well as minPrice (taker ask) / maxPrice (taker bid) because before the taker executes the transaction and the maker itemIds/amounts/price should have already been confirmed off-chain. - -_A standard transaction (bid or ask) is mapped to strategyId = 0._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md deleted file mode 100644 index cc542c7e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md +++ /dev/null @@ -1,1157 +0,0 @@ -# LooksRareProtocol - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> LooksRareProtocol - -This contract is the core smart contract of the LooksRare protocol ("v2"). It is the main entry point for users to initiate transactions with taker orders and manage the cancellation of maker orders, which exist off-chain. ~~~~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~- ~~~~~~~~ ~~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~~~ ~~~~ ~~~ ~~~ ~~~~~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~ ~~~~~ ~~~ ~~~~~~ ~~~~~~ ~~~ ~~~~~ ~~~ ~~~ ~~~~~~~~~~ ~~~ ~~~ ~~ ~~~ ~~~ ~~~ ~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~ ~~~~ ~~~~~~~~ ~~~~ ~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~~~~~~ ~~~~ ~~~~ ~~~~~~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~~~~~ - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### WETH - -```solidity -function WETH() external view returns (address) -``` - -Wrapped ETH. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### chainId - -```solidity -function chainId() external view returns (uint256) -``` - -Current chainId. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -Creator fee manager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### domainSeparator - -```solidity -function domainSeparator() external view returns (bytes32) -``` - -Current domain separator. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### executeMultipleTakerBids - -```solidity -function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable -``` - -#### Parameters - -| Name | Type | Description | -| --------------- | ------------------------- | ----------- | -| takerBids | OrderStructs.Taker[] | undefined | -| makerAsks | OrderStructs.Maker[] | undefined | -| makerSignatures | bytes[] | undefined | -| merkleTrees | OrderStructs.MerkleTree[] | undefined | -| isAtomic | bool | undefined | - -### executeTakerAsk - -```solidity -function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -### executeTakerBid - -```solidity -function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -### hashBatchOrder - -```solidity -function hashBatchOrder(bytes32 root, uint256 proofLength) external pure returns (bytes32 batchOrderHash) -``` - -This function returns the hash of the concatenation of batch order type hash and merkle root. - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ------------------- | -| root | bytes32 | Merkle root | -| proofLength | uint256 | Merkle proof length | - -#### Returns - -| Name | Type | Description | -| -------------- | ------- | -------------------- | -| batchOrderHash | bytes32 | The batch order hash | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint16) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | uint16 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### protocolFeeRecipient - -```solidity -function protocolFeeRecipient() external view returns (address) -``` - -Protocol fee recipient. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### restrictedExecuteTakerBid - -```solidity -function restrictedExecuteTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, address sender, bytes32 orderHash) external nonpayable returns (uint256 protocolFeeAmount) -``` - -#### Parameters - -| Name | Type | Description | -| --------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | -| sender | address | undefined | -| orderHash | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| protocolFeeAmount | uint256 | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### transferManager - -```solidity -function transferManager() external view returns (contract TransferManager) -``` - -Transfer manager for ERC721, ERC1155 and Hypercerts. - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------ | ----------- | -| \_0 | contract TransferManager | undefined | - -### updateCreatorFeeManager - -```solidity -function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable -``` - -This function allows the owner to update the creator fee manager address. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ---------------------------------- | -| newCreatorFeeManager | address | Address of the creator fee manager | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateDomainSeparator - -```solidity -function updateDomainSeparator() external nonpayable -``` - -This function allows the owner to update the domain separator (if possible). - -_Only callable by owner. If there is a fork of the network with a new chainId, it allows the owner to reset the domain separator for the new chain id._ - -### updateETHGasLimitForTransfer - -```solidity -function updateETHGasLimitForTransfer(uint256 newGasLimitETHTransfer) external nonpayable -``` - -This function allows the owner to update the maximum ETH gas limit for a standard transfer. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------ | -| newGasLimitETHTransfer | uint256 | New gas limit for ETH transfer | - -### updateMaxCreatorFeeBp - -```solidity -function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable -``` - -This function allows the owner to update the maximum creator fee (in basis point). - -_The maximum value that can be set is 25%. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------ | ---------------------------------------- | -| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | - -### updateProtocolFeeRecipient - -```solidity -function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable -``` - -This function allows the owner to update the protocol fee recipient. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ---------------------------------- | -| newProtocolFeeRecipient | address | New protocol fee recipient address | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| creatorFeeManager | address | undefined | - -### NewDomainSeparator - -```solidity -event NewDomainSeparator() -``` - -It is emitted if there is a change in the domain separator. - -### NewGasLimitETHTransfer - -```solidity -event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) -``` - -It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). - -#### Parameters - -| Name | Type | Description | -| ------------------- | ------- | ----------- | -| gasLimitETHTransfer | uint256 | undefined | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| maxCreatorFeeBp | uint256 | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------- | -| protocolFeeRecipient | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -### TakerAsk - -```solidity -event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker ask transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | -| askUser | address | undefined | -| bidUser | address | undefined | -| strategyId | uint256 | undefined | -| currency | address | undefined | -| collection | address | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| feeRecipients | address[2] | undefined | -| feeAmounts | uint256[3] | undefined | - -### TakerBid - -```solidity -event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker bid transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | undefined | -| bidUser | address | undefined | -| bidRecipient | address | undefined | -| strategyId | uint256 | undefined | -| currency | address | undefined | -| collection | address | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| feeRecipients | address[2] | undefined | -| feeAmounts | uint256[3] | undefined | - -## Errors - -### CallerInvalid - -```solidity -error CallerInvalid() -``` - -It is returned if the function cannot be called by the sender. - -### ChainIdInvalid - -```solidity -error ChainIdInvalid() -``` - -It is returned if the domain separator should change. - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### CurrencyInvalid - -```solidity -error CurrencyInvalid() -``` - -It is returned if the currency is invalid. - -### ERC20TransferFromFail - -```solidity -error ERC20TransferFromFail() -``` - -It is emitted if the ERC20 transferFrom fails. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### MerkleProofInvalid - -```solidity -error MerkleProofInvalid() -``` - -It is returned if the merkle proof provided is invalid. - -### MerkleProofTooLarge - -```solidity -error MerkleProofTooLarge(uint256 length) -``` - -It is returned if the length of the merkle proof provided is greater than tolerated. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ------------ | -| length | uint256 | Proof length | - -### NewGasLimitETHTransferTooLow - -```solidity -error NewGasLimitETHTransferTooLow() -``` - -It is returned if the gas limit for a standard ETH transfer is too low. - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### NoncesInvalid - -```solidity -error NoncesInvalid() -``` - -It is returned if the nonces are invalid. - -### NotAContract - -```solidity -error NotAContract() -``` - -It is emitted if the call recipient is not a contract. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### NullSignerAddress - -```solidity -error NullSignerAddress() -``` - -It is emitted if the signer is null. - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### QuoteTypeInvalid - -```solidity -error QuoteTypeInvalid() -``` - -It is returned if the maker quote type is invalid. - -### ReentrancyFail - -```solidity -error ReentrancyFail() -``` - -This is returned when there is a reentrant call. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### SameDomainSeparator - -```solidity -error SameDomainSeparator() -``` - -It is returned if the domain separator cannot be updated (i.e. the chainId is the same). - -### SignatureEOAInvalid - -```solidity -error SignatureEOAInvalid() -``` - -It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). - -### SignatureERC1271Invalid - -```solidity -error SignatureERC1271Invalid() -``` - -It is emitted if the signature is invalid for a ERC1271 contract signer. - -### SignatureLengthInvalid - -```solidity -error SignatureLengthInvalid(uint256 length) -``` - -It is emitted if the signature's length is neither 64 nor 65 bytes. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| length | uint256 | undefined | - -### SignatureParameterSInvalid - -```solidity -error SignatureParameterSInvalid() -``` - -It is emitted if the signature is invalid due to S parameter. - -### SignatureParameterVInvalid - -```solidity -error SignatureParameterVInvalid(uint8 v) -``` - -It is emitted if the signature is invalid due to V parameter. - -#### Parameters - -| Name | Type | Description | -| ---- | ----- | ----------- | -| v | uint8 | undefined | - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### UnsupportedCollectionType - -```solidity -error UnsupportedCollectionType() -``` - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md deleted file mode 100644 index fea95495..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md +++ /dev/null @@ -1,193 +0,0 @@ -# NonceManager - -_LooksRare protocol team (👀,💎)_ - -> NonceManager - -This contract handles the nonce logic that is used for invalidating maker orders that exist off-chain. The nonce logic revolves around three parts at the user level: - order nonce (orders sharing an order nonce are conditional, OCO-like) - subset (orders can be grouped under a same subset) - bid/ask (all orders can be executed only if the bid/ask nonce matches the user's one on-chain) Only the order nonce is invalidated at the time of the execution of a maker order that contains it. - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -## Errors - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md deleted file mode 100644 index 36f6a35c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md +++ /dev/null @@ -1,75 +0,0 @@ -# ProtocolFeeRecipient - -_LooksRare protocol team (👀,💎)_ - -> ProtocolFeeRecipient - -This contract is used to receive protocol fees and transfer them to the fee sharing setter. Fee sharing setter cannot receive ETH directly, so we need to use this contract as a middleman to convert ETH into WETH before sending it. - -## Methods - -### FEE_SHARING_SETTER - -```solidity -function FEE_SHARING_SETTER() external view returns (address) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### WETH - -```solidity -function WETH() external view returns (contract IWETH) -``` - -#### Returns - -| Name | Type | Description | -| ---- | -------------- | ----------- | -| \_0 | contract IWETH | undefined | - -### transferERC20 - -```solidity -function transferERC20(address currency) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ---------------------- | -| currency | address | ERC20 currency address | - -### transferETH - -```solidity -function transferETH() external nonpayable -``` - -## Errors - -### ERC20TransferFail - -```solidity -error ERC20TransferFail() -``` - -It is emitted if the ERC20 transfer fails. - -### NotAContract - -```solidity -error NotAContract() -``` - -It is emitted if the call recipient is not a contract. - -### NothingToTransfer - -```solidity -error NothingToTransfer() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md deleted file mode 100644 index a55f3985..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md +++ /dev/null @@ -1,391 +0,0 @@ -# StrategyManager - -_LooksRare protocol team (👀,💎)_ - -> StrategyManager - -This contract handles the addition and the update of execution strategies. - -## Methods - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -## Errors - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md deleted file mode 100644 index c6766114..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md +++ /dev/null @@ -1,553 +0,0 @@ -# TransferManager - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> TransferManager - -This contract provides the transfer functions for ERC721/ERC1155/Hypercert for contracts that require them. Collection type "0" refers to ERC721 transfer functions. Collection type "1" refers to ERC1155 transfer functions. Collection type "2" refers to Hypercert transfer functions. - -_"Safe" transfer functions for ERC721 are not implemented since they come with added gas costs to verify if the recipient is a contract as it requires verifying the receiver interface is valid._ - -## Methods - -### allowOperator - -```solidity -function allowOperator(address operator) external nonpayable -``` - -This function allows an operator to be added for the shared transfer system. Once the operator is allowed, users can grant NFT approvals to this operator. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ------------------------- | -| operator | address | Operator address to allow | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### grantApprovals - -```solidity -function grantApprovals(address[] operators) external nonpayable -``` - -This function allows a user to grant approvals for an array of operators. Users cannot grant approvals if the operator is not allowed by this contract's owner. - -_Each operator address must be globally allowed to be approved._ - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| operators | address[] | Array of operator addresses | - -### hasUserApprovedOperator - -```solidity -function hasUserApprovedOperator(address, address) external view returns (bool) -``` - -This returns whether the user has approved the operator address. The first address is the user and the second address is the operator (e.g. LooksRareProtocol). - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isOperatorAllowed - -```solidity -function isOperatorAllowed(address) external view returns (bool) -``` - -This returns whether the operator address is allowed by this contract's owner. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### removeOperator - -```solidity -function removeOperator(address operator) external nonpayable -``` - -This function allows the user to remove an operator for the shared transfer system. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | -------------------------- | -| operator | address | Operator address to remove | - -### revokeApprovals - -```solidity -function revokeApprovals(address[] operators) external nonpayable -``` - -This function allows a user to revoke existing approvals for an array of operators. - -_Each operator address must be approved at the user level to be revoked._ - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| operators | address[] | Array of operator addresses | - -### splitItemsHypercert - -```solidity -function splitItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function splits and transfers a fraction of a hypercert. - -_It does not allow batch transferring._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -### transferBatchItemsAcrossCollections - -```solidity -function transferBatchItemsAcrossCollections(ITransferManager.BatchTransferItem[] items, address from, address to) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ----- | ------------------------------------ | ----------- | -| items | ITransferManager.BatchTransferItem[] | undefined | -| from | address | undefined | -| to | address | undefined | - -### transferItemsERC1155 - -```solidity -function transferItemsERC1155(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function transfers items for a single ERC1155 collection. - -_It does not allow batch transferring if from = msg.sender since native function should be used._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -### transferItemsERC721 - -```solidity -function transferItemsERC721(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function transfers items for a single ERC721 collection. - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -### transferItemsHypercert - -```solidity -function transferItemsHypercert(address collection, address from, address to, uint256[] itemIds, uint256[] amounts) external nonpayable -``` - -This function transfers items for a single Hypercert. - -_It does not allow batch transferring if from = msg.sender since native function should be used._ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| from | address | Sender address | -| to | address | Recipient address | -| itemIds | uint256[] | Array of itemIds | -| amounts | uint256[] | Array of amounts | - -## Events - -### ApprovalsGranted - -```solidity -event ApprovalsGranted(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are granted by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | ----------- | -| user | address | undefined | -| operators | address[] | undefined | - -### ApprovalsRemoved - -```solidity -event ApprovalsRemoved(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are revoked by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | ----------- | -| user | address | undefined | -| operators | address[] | undefined | - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### OperatorAllowed - -```solidity -event OperatorAllowed(address operator) -``` - -It is emitted if a new operator is added to the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | - -### OperatorRemoved - -```solidity -event OperatorRemoved(address operator) -``` - -It is emitted if an operator is removed from the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | - -## Errors - -### AmountInvalid - -```solidity -error AmountInvalid() -``` - -It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. - -### ERC1155SafeBatchTransferFromFail - -```solidity -error ERC1155SafeBatchTransferFromFail() -``` - -It is emitted if the ERC1155 safeBatchTransferFrom fails. - -### ERC1155SafeTransferFromFail - -```solidity -error ERC1155SafeTransferFromFail() -``` - -It is emitted if the ERC1155 safeTransferFrom fails. - -### ERC721TransferFromFail - -```solidity -error ERC721TransferFromFail() -``` - -It is emitted if the ERC721 transferFrom fails. - -### HypercertSplitFractionError - -```solidity -error HypercertSplitFractionError() -``` - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotAContract - -```solidity -error NotAContract() -``` - -It is emitted if the call recipient is not a contract. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### OperatorAlreadyAllowed - -```solidity -error OperatorAlreadyAllowed() -``` - -It is returned if the transfer caller is already allowed by the owner. - -_This error can only be returned for owner operations._ - -### OperatorAlreadyApprovedByUser - -```solidity -error OperatorAlreadyApprovedByUser() -``` - -It is returned if the operator to approve has already been approved by the user. - -### OperatorNotAllowed - -```solidity -error OperatorNotAllowed() -``` - -It is returned if the operator to approve is not in the global allowlist defined by the owner. - -_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ - -### OperatorNotApprovedByUser - -```solidity -error OperatorNotApprovedByUser() -``` - -It is returned if the operator to revoke has not been previously approved by the user. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferCallerInvalid - -```solidity -error TransferCallerInvalid() -``` - -It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md deleted file mode 100644 index 9011bd50..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md +++ /dev/null @@ -1,779 +0,0 @@ -# TransferSelectorNFT - -_LooksRare protocol team (👀,💎); bitbeckers;_ - -> TransferSelectorNFT - -This contract handles the logic for transferring non-fungible items. - -## Methods - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### addStrategy - -```solidity -function addStrategy(uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) external nonpayable -``` - -This function allows the owner to add a new execution strategy to the protocol. - -_Strategies have an id that is incremental. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------- | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the strategy | -| isMakerBid | bool | Whether the function selector is for maker bid | -| implementation | address | Implementation address | - -### cancelOrderNonces - -```solidity -function cancelOrderNonces(uint256[] orderNonces) external nonpayable -``` - -This function allows a user to cancel an array of order nonces. - -_It does not check the status of the nonces to save gas and to prevent revertion if one of the orders is filled in the same block._ - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | --------------------- | -| orderNonces | uint256[] | Array of order nonces | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### cancelSubsetNonces - -```solidity -function cancelSubsetNonces(uint256[] subsetNonces) external nonpayable -``` - -This function allows a user to cancel an array of subset nonces. - -_It does not check the status of the nonces to save gas._ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ---------------------- | -| subsetNonces | uint256[] | Array of subset nonces | - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -Creator fee manager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### incrementBidAskNonces - -```solidity -function incrementBidAskNonces(bool bid, bool ask) external nonpayable -``` - -This function increments a user's bid/ask nonces. - -_The logic for computing the quasi-random number is inspired by Seaport v1.2. The pseudo-randomness allows non-deterministic computation of the next ask/bid nonce. A deterministic increment would make the cancel-all process non-effective in certain cases (orders signed with a greater ask/bid nonce). The same quasi-random number is used for incrementing both the bid and ask nonces if both values are incremented in the same transaction. If this function is used twice in the same block, it will return the same quasiRandomNumber but this will not impact the overall business logic._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | --------------------------------------- | -| bid | bool | Whether to increment the user bid nonce | -| ask | bool | Whether to increment the user ask nonce | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isCurrencyAllowed - -```solidity -function isCurrencyAllowed(address) external view returns (bool) -``` - -It checks whether the currency is allowed for transacting. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint16) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | uint16 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### protocolFeeRecipient - -```solidity -function protocolFeeRecipient() external view returns (address) -``` - -Protocol fee recipient. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### strategyInfo - -```solidity -function strategyInfo(uint256) external view returns (bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -This returns the strategy information for a strategy id. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### transferManager - -```solidity -function transferManager() external view returns (contract TransferManager) -``` - -Transfer manager for ERC721, ERC1155 and Hypercerts. - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------ | ----------- | -| \_0 | contract TransferManager | undefined | - -### updateCreatorFeeManager - -```solidity -function updateCreatorFeeManager(address newCreatorFeeManager) external nonpayable -``` - -This function allows the owner to update the creator fee manager address. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ---------------------------------- | -| newCreatorFeeManager | address | Address of the creator fee manager | - -### updateCurrencyStatus - -```solidity -function updateCurrencyStatus(address currency, bool isAllowed) external nonpayable -``` - -This function allows the owner to update the status of a currency. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | -------------------------------------------------- | -| currency | address | Currency address (address(0) for ETH) | -| isAllowed | bool | Whether the currency should be allowed for trading | - -### updateMaxCreatorFeeBp - -```solidity -function updateMaxCreatorFeeBp(uint16 newMaxCreatorFeeBp) external nonpayable -``` - -This function allows the owner to update the maximum creator fee (in basis point). - -_The maximum value that can be set is 25%. Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------ | ---------------------------------------- | -| newMaxCreatorFeeBp | uint16 | New maximum creator fee (in basis point) | - -### updateProtocolFeeRecipient - -```solidity -function updateProtocolFeeRecipient(address newProtocolFeeRecipient) external nonpayable -``` - -This function allows the owner to update the protocol fee recipient. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ---------------------------------- | -| newProtocolFeeRecipient | address | New protocol fee recipient address | - -### updateStrategy - -```solidity -function updateStrategy(uint256 strategyId, bool isActive, uint16 newStandardProtocolFee, uint16 newMinTotalFee) external nonpayable -``` - -This function allows the owner to update parameters for an existing execution strategy. - -_Only callable by owner._ - -#### Parameters - -| Name | Type | Description | -| ---------------------- | ------- | ------------------------------------------ | -| strategyId | uint256 | Strategy id | -| isActive | bool | Whether the strategy must be active | -| newStandardProtocolFee | uint16 | New standard protocol fee (in basis point) | -| newMinTotalFee | uint16 | New minimum total fee (in basis point) | - -### userBidAskNonces - -```solidity -function userBidAskNonces(address) external view returns (uint256 bidNonce, uint256 askNonce) -``` - -This tracks the bid and ask nonces for a user address. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------- | ----------- | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### userOrderNonce - -```solidity -function userOrderNonce(address, uint256) external view returns (bytes32) -``` - -This checks whether the order nonce for a user was executed or cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### userSubsetNonce - -```solidity -function userSubsetNonce(address, uint256) external view returns (bool) -``` - -This checks whether the subset nonce for a user was cancelled. - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | -| \_1 | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| currency | address | undefined | -| isAllowed | bool | undefined | - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| user | address | undefined | -| bidNonce | uint256 | undefined | -| askNonce | uint256 | undefined | - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| creatorFeeManager | address | undefined | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ----------- | -| maxCreatorFeeBp | uint256 | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------- | -| protocolFeeRecipient | address | undefined | - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | -| maxProtocolFeeBp | uint16 | undefined | -| selector | bytes4 | undefined | -| isMakerBid | bool | undefined | -| implementation | address | undefined | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ----------- | -| user | address | undefined | -| orderNonces | uint256[] | undefined | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ----------- | -| strategyId | uint256 | undefined | -| isActive | bool | undefined | -| standardProtocolFeeBp | uint16 | undefined | -| minTotalFeeBp | uint16 | undefined | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| user | address | undefined | -| subsetNonces | uint256[] | undefined | - -## Errors - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### ReentrancyFail - -```solidity -error ReentrancyFail() -``` - -This is returned when there is a reentrant call. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### UnsupportedCollectionType - -```solidity -error UnsupportedCollectionType() -``` - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md deleted file mode 100644 index 37866658..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md +++ /dev/null @@ -1,41 +0,0 @@ -# BaseStrategy - -_LooksRare protocol team (👀,💎)_ - -> BaseStrategy - -## Methods - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerOrder | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md deleted file mode 100644 index c9503939..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md +++ /dev/null @@ -1,212 +0,0 @@ -# BaseStrategyChainlinkPriceLatency - -_LooksRare protocol team (👀,💎)_ - -> BaseStrategyChainlinkPriceLatency - -This contract allows the owner to define the maximum acceptable Chainlink price latency. - -## Methods - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### maxLatency - -```solidity -function maxLatency() external view returns (uint256) -``` - -Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -## Errors - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md deleted file mode 100644 index e2d77dd3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md +++ /dev/null @@ -1,342 +0,0 @@ -# StrategyChainlinkUSDDynamicAsk - -_LooksRare protocol team (👀,💎)_ - -> StrategyChainlinkUSDDynamicAsk - -This contract allows a seller to sell an NFT priced in USD and the receivable amount to be in ETH. - -## Methods - -### ETH_USD_PRICE_FEED_DECIMALS - -```solidity -function ETH_USD_PRICE_FEED_DECIMALS() external view returns (uint256) -``` - -_It is possible to call priceFeed.decimals() to get the decimals, but to save gas, it is hard coded instead._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### WETH - -```solidity -function WETH() external view returns (address) -``` - -Wrapped ether (WETH) address. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### cancelOwnershipTransfer - -```solidity -function cancelOwnershipTransfer() external nonpayable -``` - -This function is used to cancel the ownership transfer. - -_This function can be used for both cancelling a transfer to a new owner and cancelling the renouncement of the ownership._ - -### confirmOwnershipRenouncement - -```solidity -function confirmOwnershipRenouncement() external nonpayable -``` - -This function is used to confirm the ownership renouncement. - -### confirmOwnershipTransfer - -```solidity -function confirmOwnershipTransfer() external nonpayable -``` - -This function is used to confirm the ownership transfer. - -_This function can only be called by the current potential owner._ - -### executeStrategyWithTakerBid - -```solidity -function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### initiateOwnershipRenouncement - -```solidity -function initiateOwnershipRenouncement() external nonpayable -``` - -This function is used to initiate the ownership renouncement. - -### initiateOwnershipTransfer - -```solidity -function initiateOwnershipTransfer(address newPotentialOwner) external nonpayable -``` - -This function is used to initiate the transfer of ownership to a new owner. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | --------------------------- | -| newPotentialOwner | address | New potential owner address | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerAsk | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -### maxLatency - -```solidity -function maxLatency() external view returns (uint256) -``` - -Maximum latency accepted after which the execution strategy rejects the retrieved price. For ETH, it cannot be higher than 3,600 as Chainlink will at least update the price every 3,600 seconds, provided ETH's price does not deviate more than 0.5%. For NFTs, it cannot be higher than 86,400 as Chainlink will at least update the price every 86,400 seconds, provided ETH's price does not deviate more than 2%. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -Address of the current owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownershipStatus - -```solidity -function ownershipStatus() external view returns (enum IOwnableTwoSteps.Status) -``` - -Ownership status. - -#### Returns - -| Name | Type | Description | -| ---- | ---------------------------- | ----------- | -| \_0 | enum IOwnableTwoSteps.Status | undefined | - -### potentialOwner - -```solidity -function potentialOwner() external view returns (address) -``` - -Address of the potential owner. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### priceFeed - -```solidity -function priceFeed() external view returns (contract AggregatorV3Interface) -``` - -ETH/USD Chainlink price feed - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------------ | ----------- | -| \_0 | contract AggregatorV3Interface | undefined | - -## Events - -### CancelOwnershipTransfer - -```solidity -event CancelOwnershipTransfer() -``` - -This is emitted if the ownership transfer is cancelled. - -### InitiateOwnershipRenouncement - -```solidity -event InitiateOwnershipRenouncement() -``` - -This is emitted if the ownership renouncement is initiated. - -### InitiateOwnershipTransfer - -```solidity -event InitiateOwnershipTransfer(address previousOwner, address potentialOwner) -``` - -This is emitted if the ownership transfer is initiated. - -#### Parameters - -| Name | Type | Description | -| -------------- | ------- | ----------- | -| previousOwner | address | undefined | -| potentialOwner | address | undefined | - -### NewOwner - -```solidity -event NewOwner(address newOwner) -``` - -This is emitted when there is a new owner. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -## Errors - -### BidTooLow - -```solidity -error BidTooLow() -``` - -It is returned if the bid price is too low for the ask user. - -### ChainlinkPriceInvalid - -```solidity -error ChainlinkPriceInvalid() -``` - -It is returned if the Chainlink price is invalid (e.g. negative). - -### NoOngoingTransferInProgress - -```solidity -error NoOngoingTransferInProgress() -``` - -This is returned when there is no transfer of ownership in progress. - -### NotOwner - -```solidity -error NotOwner() -``` - -This is returned when the caller is not the owner. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. - -### PriceNotRecentEnough - -```solidity -error PriceNotRecentEnough() -``` - -It is returned if the current block time relative to the latest price's update time is greater than the latency tolerance. - -### RenouncementNotInProgress - -```solidity -error RenouncementNotInProgress() -``` - -This is returned when there is no renouncement in progress but the owner tries to validate the ownership renouncement. - -### TransferAlreadyInProgress - -```solidity -error TransferAlreadyInProgress() -``` - -This is returned when the transfer is already in progress but the owner tries initiate a new ownership transfer. - -### TransferNotInProgress - -```solidity -error TransferNotInProgress() -``` - -This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. - -### WrongPotentialOwner - -```solidity -error WrongPotentialOwner() -``` - -This is returned when the ownership transfer is attempted to be validated by the a caller that is not the potential owner. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md deleted file mode 100644 index ddec4495..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md +++ /dev/null @@ -1,127 +0,0 @@ -# StrategyCollectionOffer - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> StrategyCollectionOffer - -This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount must be 1 (fractions are NFTs) - -## Methods - -### executeCollectionStrategyWithTakerAsk - -```solidity -function executeCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### executeCollectionStrategyWithTakerAskWithAllowlist - -```solidity -function executeCollectionStrategyWithTakerAskWithAllowlist(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### executeCollectionStrategyWithTakerAskWithProof - -```solidity -function executeCollectionStrategyWithTakerAskWithProof(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerBid | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### MerkleProofInvalid - -```solidity -error MerkleProofInvalid() -``` - -It is returned if the merkle proof provided is invalid. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md deleted file mode 100644 index 1227878d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md +++ /dev/null @@ -1,83 +0,0 @@ -# StrategyDutchAuction - -_LooksRare protocol team (👀,💎)_ - -> StrategyDutchAuction - -This contract offers a single execution strategy for users to create Dutch auctions. - -## Methods - -### executeStrategyWithTakerBid - -```solidity -function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerAsk | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### BidTooLow - -```solidity -error BidTooLow() -``` - -It is returned if the bid price is too low for the ask user. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md deleted file mode 100644 index daa427e4..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md +++ /dev/null @@ -1,123 +0,0 @@ -# StrategyHypercertFractionOffer - -_LooksRare protocol team (👀,💎); bitbeckers;_ - -> StrategyHypercertFractionOffer - -This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. - -_Use cases can include tiered pricing; think early bird tickets._ - -## Methods - -### executeHypercertFractionStrategyWithTakerBid - -```solidity -function executeHypercertFractionStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### executeHypercertFractionStrategyWithTakerBidWithAllowlist - -```solidity -function executeHypercertFractionStrategyWithTakerBidWithAllowlist(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerAsk | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### AmountInvalid - -```solidity -error AmountInvalid() -``` - -It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. - -### LengthsInvalid - -```solidity -error LengthsInvalid() -``` - -It is returned if there is either a mismatch or an error in the length of the array(s). - -### MerkleProofInvalid - -```solidity -error MerkleProofInvalid() -``` - -It is returned if the merkle proof provided is invalid. - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md deleted file mode 100644 index 6a1f0cd5..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md +++ /dev/null @@ -1,75 +0,0 @@ -# StrategyItemIdsRange - -_LooksRare protocol team (👀,💎)_ - -> StrategyItemIdsRange - -This contract offers a single execution strategy for users to bid on a specific amount of items in a range bounded by 2 item ids. - -## Methods - -### executeStrategyWithTakerAsk - -```solidity -function executeStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external pure returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) -``` - -#### Parameters - -| Name | Type | Description | -| -------- | ------------------ | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| price | uint256 | undefined | -| itemIds | uint256[] | undefined | -| amounts | uint256[] | undefined | -| isNonceInvalidated | bool | undefined | - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ---------------------------------------------- | -| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerBid | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | - -## Errors - -### OrderInvalid - -```solidity -error OrderInvalid() -``` - -It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md deleted file mode 100644 index 76918fc5..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md +++ /dev/null @@ -1,215 +0,0 @@ -# OrderValidatorV2A - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> OrderValidatorV2A - -This contract is used to check the validity of maker ask/bid orders in the LooksRareProtocol (v2). It performs checks for: 1. Protocol allowlist issues (i.e. currency or strategy not allowed) 2. Maker order-specific issues (e.g., order invalid due to format or other-strategy specific issues) 3. Nonce related issues (e.g., nonce executed or cancelled) 4. Signature related issues and merkle tree parameters 5. Timestamp related issues (e.g., order expired) 6. Asset-related issues for ERC20/ERC721/ERC1155/Hypercerts (approvals and balances) 7. Collection-type suggestions 8. Transfer manager related issues 9. Creator fee related issues (e.g., creator fee too high, ERC2981 bundles) - -_This version does not handle strategies with partial fills._ - -## Methods - -### CRITERIA_GROUPS - -```solidity -function CRITERIA_GROUPS() external view returns (uint256) -``` - -Number of distinct criteria groups checked to evaluate the validity of an order. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### ERC1155_INTERFACE_ID - -```solidity -function ERC1155_INTERFACE_ID() external view returns (bytes4) -``` - -ERC1155 interfaceId. - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### ERC721_INTERFACE_ID_1 - -```solidity -function ERC721_INTERFACE_ID_1() external view returns (bytes4) -``` - -ERC721 potential interfaceId. - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### ERC721_INTERFACE_ID_2 - -```solidity -function ERC721_INTERFACE_ID_2() external view returns (bytes4) -``` - -ERC721 potential interfaceId. - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### HYPERCERT_INTERFACE_ID - -```solidity -function HYPERCERT_INTERFACE_ID() external view returns (bytes4) -``` - -Hypercert interfaceId - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | bytes4 | undefined | - -### MAGIC_VALUE_ORDER_NONCE_EXECUTED - -```solidity -function MAGIC_VALUE_ORDER_NONCE_EXECUTED() external view returns (bytes32) -``` - -Magic value nonce returned if executed (or cancelled). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### checkMakerOrderValidity - -```solidity -function checkMakerOrderValidity(OrderStructs.Maker makerOrder, bytes signature, OrderStructs.MerkleTree merkleTree) external view returns (uint256[9] validationCodes) -``` - -#### Parameters - -| Name | Type | Description | -| ---------- | ----------------------- | ----------- | -| makerOrder | OrderStructs.Maker | undefined | -| signature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -#### Returns - -| Name | Type | Description | -| --------------- | ---------- | ----------- | -| validationCodes | uint256[9] | undefined | - -### checkMultipleMakerOrderValidities - -```solidity -function checkMultipleMakerOrderValidities(OrderStructs.Maker[] makerOrders, bytes[] signatures, OrderStructs.MerkleTree[] merkleTrees) external view returns (uint256[9][] validationCodes) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------------------------- | ----------- | -| makerOrders | OrderStructs.Maker[] | undefined | -| signatures | bytes[] | undefined | -| merkleTrees | OrderStructs.MerkleTree[] | undefined | - -#### Returns - -| Name | Type | Description | -| --------------- | ------------ | ----------- | -| validationCodes | uint256[9][] | undefined | - -### creatorFeeManager - -```solidity -function creatorFeeManager() external view returns (contract ICreatorFeeManager) -``` - -CreatorFeeManager. - -#### Returns - -| Name | Type | Description | -| ---- | --------------------------- | ----------- | -| \_0 | contract ICreatorFeeManager | undefined | - -### deriveProtocolParameters - -```solidity -function deriveProtocolParameters() external nonpayable -``` - -Derive protocol parameters. Anyone can call this function. - -_It allows adjusting if the domain separator or creator fee manager address were to change._ - -### domainSeparator - -```solidity -function domainSeparator() external view returns (bytes32) -``` - -LooksRareProtocol domain separator. - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### looksRareProtocol - -```solidity -function looksRareProtocol() external view returns (contract LooksRareProtocol) -``` - -LooksRareProtocol. - -#### Returns - -| Name | Type | Description | -| ---- | -------------------------- | ----------- | -| \_0 | contract LooksRareProtocol | undefined | - -### maxCreatorFeeBp - -```solidity -function maxCreatorFeeBp() external view returns (uint256) -``` - -Maximum creator fee (in basis point). - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### transferManager - -```solidity -function transferManager() external view returns (contract TransferManager) -``` - -TransferManager - -#### Returns - -| Name | Type | Description | -| ---- | ------------------------ | ----------- | -| \_0 | contract TransferManager | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md deleted file mode 100644 index 91be29a9..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md +++ /dev/null @@ -1,159 +0,0 @@ -# ProtocolHelpers - -_LooksRare protocol team (👀,💎)_ - -> ProtocolHelpers - -This contract contains helper view functions for order creation. - -## Methods - -### computeDigestMerkleTree - -```solidity -function computeDigestMerkleTree(OrderStructs.MerkleTree merkleTree) external view returns (bytes32 digest) -``` - -#### Parameters - -| Name | Type | Description | -| ---------- | ----------------------- | ----------- | -| merkleTree | OrderStructs.MerkleTree | undefined | - -#### Returns - -| Name | Type | Description | -| ------ | ------- | ----------- | -| digest | bytes32 | undefined | - -### computeMakerDigest - -```solidity -function computeMakerDigest(OrderStructs.Maker maker) external view returns (bytes32 digest) -``` - -#### Parameters - -| Name | Type | Description | -| ----- | ------------------ | ----------- | -| maker | OrderStructs.Maker | undefined | - -#### Returns - -| Name | Type | Description | -| ------ | ------- | ----------- | -| digest | bytes32 | undefined | - -### looksRareProtocol - -```solidity -function looksRareProtocol() external view returns (contract LooksRareProtocol) -``` - -#### Returns - -| Name | Type | Description | -| ---- | -------------------------- | ----------- | -| \_0 | contract LooksRareProtocol | undefined | - -### verifyMakerSignature - -```solidity -function verifyMakerSignature(OrderStructs.Maker maker, bytes makerSignature, address signer) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ------------------ | ----------- | -| maker | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| signer | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### verifyMerkleTree - -```solidity -function verifyMerkleTree(OrderStructs.MerkleTree merkleTree, bytes makerSignature, address signer) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| merkleTree | OrderStructs.MerkleTree | undefined | -| makerSignature | bytes | undefined | -| signer | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -## Errors - -### NullSignerAddress - -```solidity -error NullSignerAddress() -``` - -It is emitted if the signer is null. - -### SignatureEOAInvalid - -```solidity -error SignatureEOAInvalid() -``` - -It is emitted if the signature is invalid for an EOA (the address recovered is not the expected one). - -### SignatureERC1271Invalid - -```solidity -error SignatureERC1271Invalid() -``` - -It is emitted if the signature is invalid for a ERC1271 contract signer. - -### SignatureLengthInvalid - -```solidity -error SignatureLengthInvalid(uint256 length) -``` - -It is emitted if the signature's length is neither 64 nor 65 bytes. - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| length | uint256 | undefined | - -### SignatureParameterSInvalid - -```solidity -error SignatureParameterSInvalid() -``` - -It is emitted if the signature is invalid due to S parameter. - -### SignatureParameterVInvalid - -```solidity -error SignatureParameterVInvalid(uint8 v) -``` - -It is emitted if the signature is invalid due to V parameter. - -#### Parameters - -| Name | Type | Description | -| ---- | ----- | ----------- | -| v | uint8 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md deleted file mode 100644 index b832744e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md +++ /dev/null @@ -1,60 +0,0 @@ -# ICreatorFeeManager - -_LooksRare protocol team (👀,💎)_ - -> ICreatorFeeManager - -## Methods - -### royaltyFeeRegistry - -```solidity -function royaltyFeeRegistry() external view returns (contract IRoyaltyFeeRegistry royaltyFeeRegistry) -``` - -It returns the royalty fee registry address/interface. - -#### Returns - -| Name | Type | Description | -| ------------------ | ---------------------------- | ------------------------------------- | -| royaltyFeeRegistry | contract IRoyaltyFeeRegistry | Interface of the royalty fee registry | - -### viewCreatorFeeInfo - -```solidity -function viewCreatorFeeInfo(address collection, uint256 price, uint256[] itemIds) external view returns (address creator, uint256 creatorFeeAmount) -``` - -This function returns the creator address and calculates the creator fee amount. - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | -| itemIds | uint256[] | Array of item ids | - -#### Returns - -| Name | Type | Description | -| ---------------- | ------- | ------------------ | -| creator | address | Creator address | -| creatorFeeAmount | uint256 | Creator fee amount | - -## Errors - -### BundleEIP2981NotAllowed - -```solidity -error BundleEIP2981NotAllowed(address collection) -``` - -It is returned if the bundle contains multiple itemIds with different creator fee structure. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| collection | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md deleted file mode 100644 index da683d8c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md +++ /dev/null @@ -1,22 +0,0 @@ -# ICurrencyManager - -_LooksRare protocol team (👀,💎)_ - -> ICurrencyManager - -## Events - -### CurrencyStatusUpdated - -```solidity -event CurrencyStatusUpdated(address currency, bool isAllowed) -``` - -It is emitted if the currency status in the allowlist is updated. - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------------------------------- | -| currency | address | Currency address (address(0) = ETH) | -| isAllowed | bool | Whether the currency is allowed | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md deleted file mode 100644 index 0e86c75b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md +++ /dev/null @@ -1,99 +0,0 @@ -# IExecutionManager - -_LooksRare protocol team (👀,💎)_ - -> IExecutionManager - -## Events - -### NewCreatorFeeManager - -```solidity -event NewCreatorFeeManager(address creatorFeeManager) -``` - -It is issued when there is a new creator fee manager. - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | -------------------------------------- | -| creatorFeeManager | address | Address of the new creator fee manager | - -### NewMaxCreatorFeeBp - -```solidity -event NewMaxCreatorFeeBp(uint256 maxCreatorFeeBp) -``` - -It is issued when there is a new maximum creator fee (in basis point). - -#### Parameters - -| Name | Type | Description | -| --------------- | ------- | ---------------------------------------- | -| maxCreatorFeeBp | uint256 | New maximum creator fee (in basis point) | - -### NewProtocolFeeRecipient - -```solidity -event NewProtocolFeeRecipient(address protocolFeeRecipient) -``` - -It is issued when there is a new protocol fee recipient address. - -#### Parameters - -| Name | Type | Description | -| -------------------- | ------- | ----------------------------------------- | -| protocolFeeRecipient | address | Address of the new protocol fee recipient | - -## Errors - -### CreatorFeeBpTooHigh - -```solidity -error CreatorFeeBpTooHigh() -``` - -It is returned if the creator fee (in basis point) is too high. - -### NewProtocolFeeRecipientCannotBeNullAddress - -```solidity -error NewProtocolFeeRecipientCannotBeNullAddress() -``` - -It is returned if the new protocol fee recipient is set to address(0). - -### NoSelectorForStrategy - -```solidity -error NoSelectorForStrategy() -``` - -It is returned if there is no selector for maker ask/bid for a given strategyId, depending on the quote type. - -### OutsideOfTimeRange - -```solidity -error OutsideOfTimeRange() -``` - -It is returned if the current block timestamp is not between start and end times in the maker order. - -### StrategyNotAvailable - -```solidity -error StrategyNotAvailable(uint256 strategyId) -``` - -It is returned if the strategy id has no implementation. - -_It is returned if there is no implementation address and the strategyId is strictly greater than 0._ - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ----------- | -| strategyId | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md deleted file mode 100644 index 393cb24b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md +++ /dev/null @@ -1,41 +0,0 @@ -# IImmutableCreate2Factory - -## Methods - -### findCreate2Address - -```solidity -function findCreate2Address(bytes32 salt, bytes initializationCode) external view returns (address deploymentAddress) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| salt | bytes32 | undefined | -| initializationCode | bytes | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| deploymentAddress | address | undefined | - -### safeCreate2 - -```solidity -function safeCreate2(bytes32 salt, bytes initializationCode) external payable returns (address deploymentAddress) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| salt | bytes32 | undefined | -| initializationCode | bytes | undefined | - -#### Returns - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| deploymentAddress | address | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md deleted file mode 100644 index e7414f54..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md +++ /dev/null @@ -1,157 +0,0 @@ -# ILooksRareProtocol - -_LooksRare protocol team (👀,💎)_ - -> ILooksRareProtocol - -## Methods - -### executeMultipleTakerBids - -```solidity -function executeMultipleTakerBids(OrderStructs.Taker[] takerBids, OrderStructs.Maker[] makerAsks, bytes[] makerSignatures, OrderStructs.MerkleTree[] merkleTrees, bool isAtomic) external payable -``` - -#### Parameters - -| Name | Type | Description | -| --------------- | ------------------------- | ----------- | -| takerBids | OrderStructs.Taker[] | undefined | -| makerAsks | OrderStructs.Maker[] | undefined | -| makerSignatures | bytes[] | undefined | -| merkleTrees | OrderStructs.MerkleTree[] | undefined | -| isAtomic | bool | undefined | - -### executeTakerAsk - -```solidity -function executeTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerAsk | OrderStructs.Taker | undefined | -| makerBid | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -### executeTakerBid - -```solidity -function executeTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk, bytes makerSignature, OrderStructs.MerkleTree merkleTree) external payable -``` - -#### Parameters - -| Name | Type | Description | -| -------------- | ----------------------- | ----------- | -| takerBid | OrderStructs.Taker | undefined | -| makerAsk | OrderStructs.Maker | undefined | -| makerSignature | bytes | undefined | -| merkleTree | OrderStructs.MerkleTree | undefined | - -## Events - -### NewDomainSeparator - -```solidity -event NewDomainSeparator() -``` - -It is emitted if there is a change in the domain separator. - -### NewGasLimitETHTransfer - -```solidity -event NewGasLimitETHTransfer(uint256 gasLimitETHTransfer) -``` - -It is emitted when there is a new gas limit for a ETH transfer (before it is wrapped to WETH). - -#### Parameters - -| Name | Type | Description | -| ------------------- | ------- | ----------------------------- | -| gasLimitETHTransfer | uint256 | Gas limit for an ETH transfer | - -### TakerAsk - -```solidity -event TakerAsk(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address askUser, address bidUser, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker ask transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | -| askUser | address | Address of the ask user | -| bidUser | address | Address of the bid user | -| strategyId | uint256 | Id of the strategy | -| currency | address | Address of the currency | -| collection | address | Address of the collection | -| itemIds | uint256[] | Array of item ids | -| amounts | uint256[] | Array of amounts (for item ids) | -| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it can be the taker ask user or different) feeRecipients[1] Creator fee recipient (if none, address(0)) | -| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | - -### TakerBid - -```solidity -event TakerBid(ILooksRareProtocol.NonceInvalidationParameters nonceInvalidationParameters, address bidUser, address bidRecipient, uint256 strategyId, address currency, address collection, uint256[] itemIds, uint256[] amounts, address[2] feeRecipients, uint256[3] feeAmounts) -``` - -It is emitted when a taker bid transaction is completed. - -#### Parameters - -| Name | Type | Description | -| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| nonceInvalidationParameters | ILooksRareProtocol.NonceInvalidationParameters | Struct about nonce invalidation parameters | -| bidUser | address | Address of the bid user | -| bidRecipient | address | Address of the recipient of the bid | -| strategyId | uint256 | Id of the strategy | -| currency | address | Address of the currency | -| collection | address | Address of the collection | -| itemIds | uint256[] | Array of item ids | -| amounts | uint256[] | Array of amounts (for item ids) | -| feeRecipients | address[2] | Array of fee recipients feeRecipients[0] User who receives the proceeds of the sale (it is the maker ask user) feeRecipients[1] Creator fee recipient (if none, address(0)) | -| feeAmounts | uint256[3] | Array of fee amounts feeAmounts[0] Fee amount for the user receiving sale proceeds feeAmounts[1] Creator fee amount feeAmounts[2] Protocol fee amount prior to adjustment for a potential affiliate payment | - -## Errors - -### ChainIdInvalid - -```solidity -error ChainIdInvalid() -``` - -It is returned if the domain separator should change. - -### NewGasLimitETHTransferTooLow - -```solidity -error NewGasLimitETHTransferTooLow() -``` - -It is returned if the gas limit for a standard ETH transfer is too low. - -### NoncesInvalid - -```solidity -error NoncesInvalid() -``` - -It is returned if the nonces are invalid. - -### SameDomainSeparator - -```solidity -error SameDomainSeparator() -``` - -It is returned if the domain separator cannot be updated (i.e. the chainId is the same). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md deleted file mode 100644 index eaa3f977..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md +++ /dev/null @@ -1,53 +0,0 @@ -# INonceManager - -_LooksRare protocol team (👀,💎)_ - -> INonceManager - -## Events - -### NewBidAskNonces - -```solidity -event NewBidAskNonces(address user, uint256 bidNonce, uint256 askNonce) -``` - -It is emitted when there is an update of the global bid/ask nonces for a user. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ------------------- | -| user | address | Address of the user | -| bidNonce | uint256 | New bid nonce | -| askNonce | uint256 | New ask nonce | - -### OrderNoncesCancelled - -```solidity -event OrderNoncesCancelled(address user, uint256[] orderNonces) -``` - -It is emitted when order nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ----------- | --------- | ------------------------------- | -| user | address | Address of the user | -| orderNonces | uint256[] | Array of order nonces cancelled | - -### SubsetNoncesCancelled - -```solidity -event SubsetNoncesCancelled(address user, uint256[] subsetNonces) -``` - -It is emitted when subset nonces are cancelled for a user. - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | -------------------------------- | -| user | address | Address of the user | -| subsetNonces | uint256[] | Array of subset nonces cancelled | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md deleted file mode 100644 index 5ed0ef6c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md +++ /dev/null @@ -1,29 +0,0 @@ -# IRoyaltyFeeRegistry - -_LooksRare protocol team (👀,💎)_ - -> IRoyaltyFeeRegistry - -## Methods - -### royaltyInfo - -```solidity -function royaltyInfo(address collection, uint256 price) external view returns (address receiver, uint256 royaltyFee) -``` - -This function returns the royalty information for a collection at a given transaction price. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | ------------------ | -| collection | address | Collection address | -| price | uint256 | Transaction price | - -#### Returns - -| Name | Type | Description | -| ---------- | ------- | ------------------ | -| receiver | address | Receiver address | -| royaltyFee | uint256 | Royalty fee amount | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md deleted file mode 100644 index 2b4a45bc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md +++ /dev/null @@ -1,41 +0,0 @@ -# IStrategy - -_LooksRare protocol team (👀,💎)_ - -> IStrategy - -## Methods - -### isLooksRareV2Strategy - -```solidity -function isLooksRareV2Strategy() external pure returns (bool isStrategy) -``` - -This function acts as a safety check for the protocol's owner when adding new execution strategies. - -#### Returns - -| Name | Type | Description | -| ---------- | ---- | ---------------------------------------------- | -| isStrategy | bool | Whether it is a LooksRare V2 protocol strategy | - -### isMakerOrderValid - -```solidity -function isMakerOrderValid(OrderStructs.Maker makerOrder, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------------------ | ----------- | -| makerOrder | OrderStructs.Maker | undefined | -| functionSelector | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ------------- | ------ | ----------- | -| isValid | bool | undefined | -| errorSelector | bytes4 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md deleted file mode 100644 index ae6ea7b1..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md +++ /dev/null @@ -1,84 +0,0 @@ -# IStrategyManager - -_LooksRare protocol team (👀,💎)_ - -> IStrategyManager - -## Events - -### NewStrategy - -```solidity -event NewStrategy(uint256 strategyId, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp, uint16 maxProtocolFeeBp, bytes4 selector, bool isMakerBid, address implementation) -``` - -It is emitted when a new strategy is added. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | ---------------------------------------------------- | -| strategyId | uint256 | Id of the new strategy | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | -| maxProtocolFeeBp | uint16 | Maximum protocol fee (in basis point) | -| selector | bytes4 | Function selector for the transaction to be executed | -| isMakerBid | bool | Whether the strategyId is for maker bid | -| implementation | address | Address of the implementation of the strategy | - -### StrategyUpdated - -```solidity -event StrategyUpdated(uint256 strategyId, bool isActive, uint16 standardProtocolFeeBp, uint16 minTotalFeeBp) -``` - -It is emitted when an existing strategy is updated. - -#### Parameters - -| Name | Type | Description | -| --------------------- | ------- | -------------------------------------------------------- | -| strategyId | uint256 | Id of the strategy | -| isActive | bool | Whether the strategy is active (or not) after the update | -| standardProtocolFeeBp | uint16 | Standard protocol fee (in basis point) | -| minTotalFeeBp | uint16 | Minimum total fee (in basis point) | - -## Errors - -### NotV2Strategy - -```solidity -error NotV2Strategy() -``` - -If the strategy has not set properly its implementation contract. - -_It can only be returned for owner operations._ - -### StrategyHasNoSelector - -```solidity -error StrategyHasNoSelector() -``` - -It is returned if the strategy has no selector. - -_It can only be returned for owner operations._ - -### StrategyNotUsed - -```solidity -error StrategyNotUsed() -``` - -It is returned if the strategyId is invalid. - -### StrategyProtocolFeeTooHigh - -```solidity -error StrategyProtocolFeeTooHigh() -``` - -It is returned if the strategy's protocol fee is too high. - -_It can only be returned for owner operations._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md deleted file mode 100644 index 3ba8ca81..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md +++ /dev/null @@ -1,111 +0,0 @@ -# ITransferManager - -_LooksRare protocol team (👀,💎)_ - -> ITransferManager - -## Events - -### ApprovalsGranted - -```solidity -event ApprovalsGranted(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are granted by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| user | address | Address of the user | -| operators | address[] | Array of operator addresses | - -### ApprovalsRemoved - -```solidity -event ApprovalsRemoved(address user, address[] operators) -``` - -It is emitted if operators' approvals to transfer NFTs are revoked by a user. - -#### Parameters - -| Name | Type | Description | -| --------- | --------- | --------------------------- | -| user | address | Address of the user | -| operators | address[] | Array of operator addresses | - -### OperatorAllowed - -```solidity -event OperatorAllowed(address operator) -``` - -It is emitted if a new operator is added to the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ---------------- | -| operator | address | Operator address | - -### OperatorRemoved - -```solidity -event OperatorRemoved(address operator) -``` - -It is emitted if an operator is removed from the global allowlist. - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ---------------- | -| operator | address | Operator address | - -## Errors - -### OperatorAlreadyAllowed - -```solidity -error OperatorAlreadyAllowed() -``` - -It is returned if the transfer caller is already allowed by the owner. - -_This error can only be returned for owner operations._ - -### OperatorAlreadyApprovedByUser - -```solidity -error OperatorAlreadyApprovedByUser() -``` - -It is returned if the operator to approve has already been approved by the user. - -### OperatorNotAllowed - -```solidity -error OperatorNotAllowed() -``` - -It is returned if the operator to approve is not in the global allowlist defined by the owner. - -_This error can be returned if the user tries to grant approval to an operator address not in the allowlist or if the owner tries to remove the operator from the global allowlist._ - -### OperatorNotApprovedByUser - -```solidity -error OperatorNotApprovedByUser() -``` - -It is returned if the operator to revoke has not been previously approved by the user. - -### TransferCallerInvalid - -```solidity -error TransferCallerInvalid() -``` - -It is returned if the transfer caller is invalid. For a transfer called to be valid, the operator must be in the global allowlist and approved by the 'from' user. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md deleted file mode 100644 index 1b1f41a2..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md +++ /dev/null @@ -1,7 +0,0 @@ -# CurrencyValidator - -_LooksRare protocol team (👀,💎)_ - -> CurrencyValidator - -This library validates the order currency to be the chain's native currency or the specified ERC20 token. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md deleted file mode 100644 index 5951cc56..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md +++ /dev/null @@ -1,21 +0,0 @@ -# LowLevelHypercertCaller - -_bitbeckers_ - -> LowLevelHypercertCaller - -This contract contains low-level calls to transfer ERC1155 tokens. - -## Errors - -### HypercertSplitFractionError - -```solidity -error HypercertSplitFractionError() -``` - -### NotAContract - -```solidity -error NotAContract() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md deleted file mode 100644 index 943a54cd..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md +++ /dev/null @@ -1,7 +0,0 @@ -# MerkleProofCalldataWithNodes - -_OpenZeppelin (adjusted by LooksRare)_ - -> MerkleProofCalldataWithNodes - -This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md deleted file mode 100644 index 37529181..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md +++ /dev/null @@ -1,7 +0,0 @@ -# MerkleProofMemory - -_OpenZeppelin (adjusted by LooksRare)_ - -> MerkleProofMemory - -This library is adjusted from the work of OpenZeppelin. It is based on the 4.7.0 (utils/cryptography/MerkleProof.sol). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md deleted file mode 100644 index 6ffa83e2..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md +++ /dev/null @@ -1,7 +0,0 @@ -# OrderStructs - -_LooksRare protocol team (👀,💎); bitbeckers_ - -> OrderStructs - -This library contains all order struct types for the LooksRare protocol (v2). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md deleted file mode 100644 index 4684053c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/AllowlistMinter.md +++ /dev/null @@ -1,84 +0,0 @@ -# AllowlistMinter - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -## Events - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -## Errors - -### DoesNotExist - -```solidity -error DoesNotExist() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md deleted file mode 100644 index 518efa42..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md +++ /dev/null @@ -1,895 +0,0 @@ -# HypercertMinter - -_bitbeckers_ - -> Contract for managing hypercert claims and whitelists - -Implementation of the HypercertTokenInterface using { SemiFungible1155 } as underlying token.This contract supports whitelisted minting via { AllowlistMinter }. - -_Wrapper contract to expose and chain functions._ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### batchBurnFraction - -```solidity -function batchBurnFraction(address _account, uint256[] _tokenIDs) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ---------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenIDs | uint256[] | undefined | - -### batchMintClaimsFromAllowlists - -```solidity -function batchMintClaimsFromAllowlists(address account, bytes32[][] proofs, uint256[] claimIDs, uint256[] units) external nonpayable -``` - -Mint semi-fungible tokens representing a fraction of the claims in `claimIDs` - -_Calls AllowlistMinter to verify `proofs`.Mints the `amount` of units for the hypercert stored under `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| -------- | ----------- | ----------- | -| account | address | undefined | -| proofs | bytes32[][] | undefined | -| claimIDs | uint256[] | undefined | -| units | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256) external nonpayable -``` - -Burn a claimtoken; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| \_2 | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[]) external nonpayable -``` - -Batch burn claimtokens; override is needed to update units/values - -_see {ERC1155Burnable}_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| \_2 | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address _account, uint256 _tokenID) external nonpayable -``` - -Burn a claimtoken - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| --------- | ------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | - -### createAllowlist - -```solidity -function createAllowlist(address account, uint256 units, bytes32 merkleRoot, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Register a claim and the whitelist for minting token(s) belonging to that claim - -_Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `units`Calls AllowlistMinter to store the `merkleRoot` as proof to authorize claims_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| merkleRoot | bytes32 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### hasBeenClaimed - -```solidity -function hasBeenClaimed(uint256, bytes32) external view returns (bool) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | -| \_1 | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### initialize - -```solidity -function initialize() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 claimID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address _account, uint256[] _fractionIDs) external nonpayable -``` - -Merge the value of tokens belonging to the same claim - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------- | --------- | ----------- | -| \_account | address | undefined | -| \_fractionIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint a semi-fungible token for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimFromAllowlist - -```solidity -function mintClaimFromAllowlist(address account, bytes32[] proof, uint256 claimID, uint256 units) external nonpayable -``` - -Mint a semi-fungible token representing a fraction of the claim - -_Calls AllowlistMinter to verify `proof`.Mints the `amount` of units for the hypercert stored under `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| proof | bytes32[] | undefined | -| claimID | uint256 | undefined | -| units | uint256 | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string _uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -Mint semi-fungible tokens for the impact claim referenced via `uri` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| \_uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### name - -```solidity -function name() external view returns (string) -``` - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### pause - -```solidity -function pause() external nonpayable -``` - -PAUSABLE - -### paused - -```solidity -function paused() external view returns (bool) -``` - -_Returns true if the contract is paused, and false otherwise._ - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### readTransferRestriction - -```solidity -function readTransferRestriction(uint256 tokenID) external view returns (string) -``` - -TRANSFER RESTRICTIONS - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------ | ----------- | -| \_0 | string | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### splitFraction - -```solidity -function splitFraction(address _account, uint256 _tokenID, uint256[] _newFractions) external nonpayable -``` - -Split a claimtokens value into parts with summed value equal to the original - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| -------------- | --------- | ----------- | -| \_account | address | undefined | -| \_tokenID | uint256 | undefined | -| \_newFractions | uint256[] | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_see {IHypercertToken}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unpause - -```solidity -function unpause() external nonpayable -``` - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_see { IHypercertMetadata}_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | ----------- | -| \_uri | string | undefined | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### AllowlistCreated - -```solidity -event AllowlistCreated(uint256 tokenID, bytes32 root) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| root | bytes32 | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### LeafClaimed - -```solidity -event LeafClaimed(uint256 tokenID, bytes32 leaf) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### Paused - -```solidity -event Paused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Unpaused - -```solidity -event Unpaused(address account) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md deleted file mode 100644 index a4086e37..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md +++ /dev/null @@ -1,457 +0,0 @@ -# SemiFungible1155 - -_bitbeckers_ - -> Contract for minting semi-fungible EIP1155 tokens - -Extends { Upgradeable1155 } token with semi-fungible properties and the concept of `units` - -_Adds split bit strategy as described in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155#non-fungible-tokens)_ - -## Methods - -### \_\_SemiFungible1155_init - -```solidity -function __SemiFungible1155_init() external nonpayable -``` - -_see { openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol }_ - -### balanceOf - -```solidity -function balanceOf(address account, uint256 id) external view returns (uint256) -``` - -_See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | uint256 | undefined | - -### balanceOfBatch - -```solidity -function balanceOfBatch(address[] accounts, uint256[] ids) external view returns (uint256[]) -``` - -_See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| accounts | address[] | undefined | -| ids | uint256[] | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | --------- | ----------- | -| \_0 | uint256[] | undefined | - -### burn - -```solidity -function burn(address account, uint256 id, uint256 value) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### burnBatch - -```solidity -function burnBatch(address account, uint256[] ids, uint256[] values) external nonpayable -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| account | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### isApprovedForAll - -```solidity -function isApprovedForAll(address account, address operator) external view returns (bool) -``` - -_See {IERC1155-isApprovedForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| account | address | undefined | -| operator | address | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### owner - -```solidity -function owner() external view returns (address) -``` - -_Returns the address of the current owner._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | address | undefined | - -### ownerOf - -```solidity -function ownerOf(uint256 tokenID) external view returns (address _owner) -``` - -_Returns the owner of a given token ID._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------- | -| tokenID | uint256 | The ID of the token to query. | - -#### Returns - -| Name | Type | Description | -| ------- | ------- | -------------------------------------- | -| \_owner | address | The address of the owner of the token. | - -### proxiableUUID - -```solidity -function proxiableUUID() external view returns (bytes32) -``` - -_Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier._ - -#### Returns - -| Name | Type | Description | -| ---- | ------- | ----------- | -| \_0 | bytes32 | undefined | - -### renounceOwnership - -```solidity -function renounceOwnership() external nonpayable -``` - -_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner._ - -### safeBatchTransferFrom - -```solidity -function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) external nonpayable -``` - -_See {IERC1155-safeBatchTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| ids | uint256[] | undefined | -| amounts | uint256[] | undefined | -| data | bytes | undefined | - -### safeTransferFrom - -```solidity -function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external nonpayable -``` - -_See {IERC1155-safeTransferFrom}._ - -#### Parameters - -| Name | Type | Description | -| ------ | ------- | ----------- | -| from | address | undefined | -| to | address | undefined | -| id | uint256 | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - -### setApprovalForAll - -```solidity -function setApprovalForAll(address operator, bool approved) external nonpayable -``` - -_See {IERC1155-setApprovalForAll}._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| operator | address | undefined | -| approved | bool | undefined | - -### supportsInterface - -```solidity -function supportsInterface(bytes4 interfaceId) external view returns (bool) -``` - -_See {IERC165-supportsInterface}._ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------ | ----------- | -| interfaceId | bytes4 | undefined | - -#### Returns - -| Name | Type | Description | -| ---- | ---- | ----------- | -| \_0 | bool | undefined | - -### transferOwnership - -```solidity -function transferOwnership(address newOwner) external nonpayable -``` - -_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ - -#### Parameters - -| Name | Type | Description | -| -------- | ------- | ----------- | -| newOwner | address | undefined | - -### upgradeTo - -```solidity -function upgradeTo(address newImplementation) external nonpayable -``` - -_Upgrade the implementation of the proxy to `newImplementation`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | - -### upgradeToAndCall - -```solidity -function upgradeToAndCall(address newImplementation, bytes data) external payable -``` - -_Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {\_authorizeUpgrade}. Emits an {Upgraded} event._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| newImplementation | address | undefined | -| data | bytes | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string _uri) -``` - -_Returns the metadata URI for a given token ID.This function retrieves the metadata URI for the specified token ID by calling the `uri` function of the `ERC1155URIStorageUpgradeable` contract.The metadata URI is a string that points to a JSON file containing information about the token, such as its name, symbol, and image.This function always returns the URI for the basetype so that it's managed in one place._ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------------------------------- | -| tokenID | uint256 | The ID of the token to retrieve the metadata URI for. | - -#### Returns - -| Name | Type | Description | -| ----- | ------ | -------------------------------------------- | -| \_uri | string | The metadata URI for the specified token ID. | - -## Events - -### AdminChanged - -```solidity -event AdminChanged(address previousAdmin, address newAdmin) -``` - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | ----------- | -| previousAdmin | address | undefined | -| newAdmin | address | undefined | - -### ApprovalForAll - -```solidity -event ApprovalForAll(address indexed account, address indexed operator, bool approved) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| account `indexed` | address | undefined | -| operator `indexed` | address | undefined | -| approved | bool | undefined | - -### BatchValueTransfer - -```solidity -event BatchValueTransfer(uint256[] claimIDs, uint256[] fromTokenIDs, uint256[] toTokenIDs, uint256[] values) -``` - -_Emitted on transfer of `values` between `fromTokenIDs` to `toTokenIDs` of `claimIDs`_ - -#### Parameters - -| Name | Type | Description | -| ------------ | --------- | ----------- | -| claimIDs | uint256[] | undefined | -| fromTokenIDs | uint256[] | undefined | -| toTokenIDs | uint256[] | undefined | -| values | uint256[] | undefined | - -### BeaconUpgraded - -```solidity -event BeaconUpgraded(address indexed beacon) -``` - -#### Parameters - -| Name | Type | Description | -| ---------------- | ------- | ----------- | -| beacon `indexed` | address | undefined | - -### Initialized - -```solidity -event Initialized(uint8 version) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | ----- | ----------- | -| version | uint8 | undefined | - -### OwnershipTransferred - -```solidity -event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -``` - -#### Parameters - -| Name | Type | Description | -| ----------------------- | ------- | ----------- | -| previousOwner `indexed` | address | undefined | -| newOwner `indexed` | address | undefined | - -### TransferBatch - -```solidity -event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | --------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| ids | uint256[] | undefined | -| values | uint256[] | undefined | - -### TransferSingle - -```solidity -event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------ | ------- | ----------- | -| operator `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| id | uint256 | undefined | -| value | uint256 | undefined | - -### URI - -```solidity -event URI(string value, uint256 indexed id) -``` - -#### Parameters - -| Name | Type | Description | -| ------------ | ------- | ----------- | -| value | string | undefined | -| id `indexed` | uint256 | undefined | - -### Upgraded - -```solidity -event Upgraded(address indexed implementation) -``` - -#### Parameters - -| Name | Type | Description | -| ------------------------ | ------- | ----------- | -| implementation `indexed` | address | undefined | - -### ValueTransfer - -```solidity -event ValueTransfer(uint256 claimID, uint256 fromTokenID, uint256 toTokenID, uint256 value) -``` - -_Emitted on transfer of `value` between `fromTokenID` to `toTokenID` of the same `claimID`_ - -#### Parameters - -| Name | Type | Description | -| ----------- | ------- | ----------- | -| claimID | uint256 | undefined | -| fromTokenID | uint256 | undefined | -| toTokenID | uint256 | undefined | -| value | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md deleted file mode 100644 index 72455b43..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md +++ /dev/null @@ -1,29 +0,0 @@ -# IAllowlist - -_bitbeckers_ - -> Interface for allowlist - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### isAllowedToClaim - -```solidity -function isAllowedToClaim(bytes32[] proof, uint256 tokenID, bytes32 leaf) external view returns (bool isAllowed) -``` - -#### Parameters - -| Name | Type | Description | -| ------- | --------- | ----------- | -| proof | bytes32[] | undefined | -| tokenID | uint256 | undefined | -| leaf | bytes32 | undefined | - -#### Returns - -| Name | Type | Description | -| --------- | ---- | ----------- | -| isAllowed | bool | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md deleted file mode 100644 index 30ed6f95..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md +++ /dev/null @@ -1,192 +0,0 @@ -# IHypercertToken - -_bitbeckers_ - -> Interface for hypercert token interactions - -This interface declares the required functionality for a hypercert tokenThis interface does not specify the underlying token type (e.g. 721 or 1155) - -## Methods - -### batchBurnFraction - -```solidity -function batchBurnFraction(address account, uint256[] tokenIDs) external nonpayable -``` - -Operator must be allowed by `creator` and the tokens must represent the total amount of available units. - -_Function to burn the tokens at `tokenIDs` for `account`_ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### burnFraction - -```solidity -function burnFraction(address account, uint256 tokenID) external nonpayable -``` - -Operator must be allowed by `creator` and the token must represent the total amount of available units. - -_Function to burn the token at `tokenID` for `account`_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -### mergeFractions - -```solidity -function mergeFractions(address account, uint256[] tokenIDs) external nonpayable -``` - -Tokens that have been merged are burned. - -_Function called to merge tokens within `tokenIDs`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenIDs | uint256[] | undefined | - -### mintClaim - -```solidity -function mintClaim(address account, uint256 units, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a maximum number of fractions `units`._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### mintClaimWithFractions - -```solidity -function mintClaimWithFractions(address account, uint256 units, uint256[] fractions, string uri, enum IHypercertToken.TransferRestrictions restrictions) external nonpayable -``` - -_Function called to store a claim referenced via `uri` with a set of `fractions`.Fractions are internally summed to total units._ - -#### Parameters - -| Name | Type | Description | -| ------------ | ----------------------------------------- | ----------- | -| account | address | undefined | -| units | uint256 | undefined | -| fractions | uint256[] | undefined | -| uri | string | undefined | -| restrictions | enum IHypercertToken.TransferRestrictions | undefined | - -### splitFraction - -```solidity -function splitFraction(address account, uint256 tokenID, uint256[] _values) external nonpayable -``` - -The sum of `values` must equal the current value of `_tokenID`. - -_Function called to split `tokenID` owned by `account` into units declared in `values`._ - -#### Parameters - -| Name | Type | Description | -| -------- | --------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | -| \_values | uint256[] | undefined | - -### unitsOf - -```solidity -function unitsOf(address account, uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by `account` of a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` held by `account` for the claim is returned.If `tokenID` is a fractional token, the `units` held by `account` the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| account | address | undefined | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### unitsOf - -```solidity -function unitsOf(uint256 tokenID) external view returns (uint256 units) -``` - -_Returns the `units` held by a (fractional) token at `claimID`If `tokenID` is a base type, the total amount of `units` for the claim is returned.If `tokenID` is a fractional token, the `units` held by the token is returned_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| ----- | ------- | ----------- | -| units | uint256 | undefined | - -### uri - -```solidity -function uri(uint256 tokenID) external view returns (string metadata) -``` - -_Returns the `uri` for metadata of the claim represented by `tokenID`Metadata must conform to { Hypercert Metadata } spec (based on ERC1155 Metadata)_ - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------- | -| tokenID | uint256 | undefined | - -#### Returns - -| Name | Type | Description | -| -------- | ------ | ----------- | -| metadata | string | undefined | - -## Events - -### ClaimStored - -```solidity -event ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits) -``` - -_Emitted when token with tokenID `claimID` is stored, with external data reference via `uri`._ - -#### Parameters - -| Name | Type | Description | -| ----------------- | ------- | ----------- | -| claimID `indexed` | uint256 | undefined | -| uri | string | undefined | -| totalUnits | uint256 | undefined | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md deleted file mode 100644 index 93fe0124..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md +++ /dev/null @@ -1,59 +0,0 @@ -# Errors - -_bitbeckers_ - -## Errors - -### AlreadyClaimed - -```solidity -error AlreadyClaimed() -``` - -### ArraySize - -```solidity -error ArraySize() -``` - -### DoesNotExist - -```solidity -error DoesNotExist() -``` - -### DuplicateEntry - -```solidity -error DuplicateEntry() -``` - -### Invalid - -```solidity -error Invalid() -``` - -### NotAllowed - -```solidity -error NotAllowed() -``` - -### NotApprovedOrOwner - -```solidity -error NotApprovedOrOwner() -``` - -### TransfersNotAllowed - -```solidity -error TransfersNotAllowed() -``` - -### TypeMismatch - -```solidity -error TypeMismatch() -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll deleted file mode 100644 index e2ac6616..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md deleted file mode 100644 index b1434ab0..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md +++ /dev/null @@ -1,185 +0,0 @@ -Hypercerts SDK Documentation / [Exports](modules.md) - -# Hypercert SDK - -## Quickstart Guide - -1. Install the SDK using npm or yarn: - -```bash -npm install @hypercerts-org/sdk -``` - -or - -```bash - yarn add @hypercerts-org/sdk -``` - -2. Import the SDK into your project: - -```bash -import { HypercertClient } from "@hypercerts-org/sdk"; -``` - -3. Create a new instance of the HypercertClient class with your configuration options: - -```js -const client = new HypercertClient({ - chainId: 5, - provider, - signer, - nftStorageToken, - web3StorageToken, -}); -``` - -> **Note** If there's no `signer`, `provider`, `nftStorageToken` or `web3StorageToken` provided, the client will run in -> [read-only mode](#read-only-mode) - -4. Use the client object to interact with the Hypercert network. - -For example, you can use the `client.mintClaim` method to create a new claim: - -```js -const tx = await client.mintClaim( - metaData, - totalUnits, - transferRestriction, - overrides, -); -``` - -This will validate the metadata, store it on IPFS, create a new hypercert on-chain and return a transaction receipt. - -You can also use the client to query the subgraph and retrieve which claims an address owns: - -```js -const claims = await client.indexer.fractionsByOwner(owner), -``` - -For more information on how to use the SDK, check out the -[developer documentation](https://hypercerts.org/docs/developer/) and the -[Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet). - -That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. Don't forget to set your -environment variables for your NFT.storage and web3.storage API keys in your .env file. - -## Config - -The SDK will try to determine the `DEFAULT_CHAIN_ID` and use that to inform the configuration. We allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check -the environment variables. - -### Read-only mode - -The SDK client will be in read-only mode if any of the following conditions are true: - -- The client was initialized without a signer or provider. -- The client was initialized with a provider but not a signer. -- The client was initialized with a signer but not a provider. -- The contract address is not set. -- The storage layer is in read-only mode. - -If any of these conditions are true, the readonly property of the HypercertClient instance will be set to true, and a -warning message will be logged indicating that the client is in read-only mode. - -### Defaults - -The constants.ts file defines various constants that are used throughout the Hypercert system. Here's a brief -explanation of each constant: - -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - -`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object -contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. - -For example: - -```json -{ - "5": { - "chainId": 5, - "chainName": "goerli", - "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "graphName": "hypercerts-testnet" - } -} -``` - -### Client config properties - -| \| Property | Type | Description | -| ------------------ | -------------------- | -------------------------------------- | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `rpcUrl` | `string` | The URL of the RPC endpoint to use. | -| `graphName` | `string` | The name of the Gsubgraph to use. | -| `provider` | `providers.Provider` | A custom provider to use. | -| `signer` | `Signer` | A custom signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | - -### Environment variables - -To determine the missing configuration values the SDK defaults to the following environment variables: - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `RPC_URL` | Specifies the RPC URL to use for the evm-compatible network. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - -### Logging - -The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level -determines which log messages are printed to the console. By default, the logger is configured to log messages with a -level of info or higher to the console. - -## Client modules - -The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient -has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, -HypercertIndexer, and HypercertMinter classes, respectively. - -```js -const { - client: { storage }, -} = new HypercertClient({}); -``` - -The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and -NFT.storage. It is used by the HypercertClient to store metadata when creating new Hypercerts. - -```js -const { - client: { indexer }, -} = new HypercertClient({}); -``` - -The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. -It is used by the HypercertClient to retrieve event-based data via the subgraph - -```js -const { - client: { contract }, -} = new HypercertClient({}); -``` - -Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used -by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. - -By providing instances of these classes through the storage, indexer, and contract getters, the HypercertClient allows -developers to easily interact with the various components of the Hypercert system. For example, a developer could use -the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based -on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the -contract. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md deleted file mode 100644 index 89f2105f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ClientError - -# Class: ClientError - -An error that is caused by a problem with the client. - -## Hierarchy - -- `Error` - - ↳ **`ClientError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](ClientError.md#constructor) - -### Properties - -- [payload](ClientError.md#payload) - -## Constructors - -### constructor - -• **new ClientError**(`message`, `payload?`) - -Creates a new instance of the ClientError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L25) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md deleted file mode 100644 index 03813867..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md +++ /dev/null @@ -1,66 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / ConfigurationError - -# Class: ConfigurationError - -The configuration was invalid - -## Hierarchy - -- `Error` - - ↳ **`ConfigurationError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](ConfigurationError.md#constructor) - -### Properties - -- [payload](ConfigurationError.md#payload) - -## Constructors - -### constructor - -• **new ConfigurationError**(`message`, `payload?`) - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `message` | `string` | -| `payload?` | `Object` | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:166](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L166) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:165](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L165) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md deleted file mode 100644 index d4c9f7c9..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / FetchError - -# Class: FetchError - -Fails fetching a remote resource - -## Hierarchy - -- `Error` - - ↳ **`FetchError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](FetchError.md#constructor) - -### Properties - -- [payload](FetchError.md#payload) - -## Constructors - -### constructor - -• **new FetchError**(`message`, `payload?`) - -Creates a new instance of the FetchError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L43) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L36) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md deleted file mode 100644 index a5a0e900..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md +++ /dev/null @@ -1,493 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClient - -# Class: HypercertClient - -Hypercerts client factory - -**`Dev`** - -Creates a Hypercerts client instance - -**`Notice`** - -The client is readonly if no signer is set or if the contract address is not set - -**`Param`** - -Hypercerts client configuration - -**`Param`** - -Hypercerts storage object - -## Implements - -- [`HypercertClientInterface`](../interfaces/HypercertClientInterface.md) - -## Table of contents - -### Constructors - -- [constructor](HypercertClient.md#constructor) - -### Properties - -- [\_config](HypercertClient.md#_config) -- [\_contract](HypercertClient.md#_contract) -- [\_evaluator](HypercertClient.md#_evaluator) -- [\_indexer](HypercertClient.md#_indexer) -- [\_operator](HypercertClient.md#_operator) -- [\_storage](HypercertClient.md#_storage) -- [readonly](HypercertClient.md#readonly) - -### Accessors - -- [contract](HypercertClient.md#contract) -- [indexer](HypercertClient.md#indexer) -- [storage](HypercertClient.md#storage) - -### Methods - -- [batchMintClaimFractionsFromAllowlists](HypercertClient.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClient.md#burnclaimfraction) -- [checkWritable](HypercertClient.md#checkwritable) -- [createAllowlist](HypercertClient.md#createallowlist) -- [mergeClaimUnits](HypercertClient.md#mergeclaimunits) -- [mintClaim](HypercertClient.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClient.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClient.md#splitclaimunits) - -## Constructors - -### constructor - -• **new HypercertClient**(`config?`) - -Creates a new instance of the `HypercertClient` class. - -#### Parameters - -| Name | Type | Description | -| :------- | :------------------------------------------------------------------------- | :---------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the client. | - -#### Defined in - -[sdk/src/client.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L45) - -## Properties - -### \_config - -• `Private` **\_config**: [`HypercertClientConfig`](../modules.md#hypercertclientconfig) - -#### Defined in - -[sdk/src/client.ts:32](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L32) - ---- - -### \_contract - -• `Private` **\_contract**: [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -#### Defined in - -[sdk/src/client.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L38) - ---- - -### \_evaluator - -• `Private` **\_evaluator**: [`default`](internal.default.md) - -#### Defined in - -[sdk/src/client.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L34) - ---- - -### \_indexer - -• `Private` **\_indexer**: [`default`](internal.default-1.md) - -#### Defined in - -[sdk/src/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L35) - ---- - -### \_operator - -• `Private` **\_operator**: `Provider` \| `Signer` - -#### Defined in - -[sdk/src/client.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L37) - ---- - -### \_storage - -• `Private` **\_storage**: [`HypercertsStorage`](HypercertsStorage.md) - -#### Defined in - -[sdk/src/client.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L33) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[readonly](../interfaces/HypercertClientInterface.md#readonly) - -#### Defined in - -[sdk/src/client.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L39) - -## Accessors - -### contract - -• `get` **contract**(): [`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -Gets the HypercertMinter contract used by the client. - -#### Returns - -[`HypercertMinter`](../interfaces/internal.HypercertMinter.md) - -The contract. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) - -#### Defined in - -[sdk/src/client.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L90) - ---- - -### indexer - -• `get` **indexer**(): [`default`](internal.default-1.md) - -Gets the indexer for the client. - -#### Returns - -[`default`](internal.default-1.md) - -The indexer. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[indexer](../interfaces/HypercertClientInterface.md#indexer) - -#### Defined in - -[sdk/src/client.ts:82](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L82) - ---- - -### storage - -• `get` **storage**(): [`HypercertsStorage`](HypercertsStorage.md) - -Gets the storage layer for the client. - -#### Returns - -[`HypercertsStorage`](HypercertsStorage.md) - -The storage layer. - -#### Implementation of - -[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[storage](../interfaces/HypercertClientInterface.md#storage) - -#### Defined in - -[sdk/src/client.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L74) - -## Methods - -### batchMintClaimFractionsFromAllowlists - -▸ **batchMintClaimFractionsFromAllowlists**(`claimIds`, `units`, `proofs`, `roots?`, `overrides?`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | -| `roots?` | `BytesLike`[] | - | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Implementation of - -HypercertClientInterface.batchMintClaimFractionsFromAllowlists - -#### Defined in - -[sdk/src/client.ts:317](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L317) - ---- - -### burnClaimFraction - -▸ **burnClaimFraction**(`claimId`, `overrides?`): `Promise`<`ContractTransaction`\> - -Burn a Hypercert claim by providing the claim id - -**`Dev`** - -Burns a Hypercert claim - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------- | :----------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.burnClaimFraction - -#### Defined in - -[sdk/src/client.ts:251](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L251) - ---- - -### checkWritable - -▸ `Private` **checkWritable**(): `boolean` - -#### Returns - -`boolean` - -#### Defined in - -[sdk/src/client.ts:347](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L347) - ---- - -### createAllowlist - -▸ **createAllowlist**(`allowList`, `metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> - -Create a Hypercert claim with an allowlist - -**`Dev`** - -Mints a Hypercert claim with the given metadata, total units, transfer restrictions and allowlist - -**`Notice`** - -The total number of units in the allowlist must match the total number of units for the Hypercert - -#### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | Allowlist for the Hypercert | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.createAllowlist - -#### Defined in - -[sdk/src/client.ts:140](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L140) - ---- - -### mergeClaimUnits - -▸ **mergeClaimUnits**(`claimIds`, `overrides?`): `Promise`<`ContractTransaction`\> - -Merge multiple Hypercert claims fractions into one - -**`Dev`** - -Merges multiple Hypercert claims into one - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :------------------ | -| `claimIds` | `BigNumberish`[] | Hypercert claim ids | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mergeClaimUnits - -#### Defined in - -[sdk/src/client.ts:221](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L221) - ---- - -### mintClaim - -▸ **mintClaim**(`metaData`, `totalUnits`, `transferRestriction`, `overrides?`): `Promise`<`ContractTransaction`\> - -Mint a Hypercert claim - -**`Dev`** - -Mints a Hypercert claim with the given metadata, total units and transfer restrictions - -#### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :-------------------------------------- | -| `metaData` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | Hypercert metadata | -| `totalUnits` | `BigNumberish` | Total number of units for the Hypercert | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | Transfer restrictions for the Hypercert | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mintClaim - -#### Defined in - -[sdk/src/client.ts:102](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L102) - ---- - -### mintClaimFractionFromAllowlist - -▸ **mintClaimFractionFromAllowlist**(`claimId`, `units`, `proof`, `root?`, `overrides?`): `Promise`<`ContractTransaction`\> - -Mint a Hypercert claim fraction from an allowlist. - -**`Dev`** - -Verifies the claim proof and mints the claim fraction - -**`Notice`** - -If known, provide the root for client side verification - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------- | :------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `units` | `BigNumberish` | Number of units to mint | -| `proof` | `BytesLike`[] | Merkle proof for the claim | -| `root?` | `BytesLike` | - | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.mintClaimFractionFromAllowlist - -#### Defined in - -[sdk/src/client.ts:278](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L278) - ---- - -### splitClaimUnits - -▸ **splitClaimUnits**(`claimId`, `fractions`, `overrides?`): `Promise`<`ContractTransaction`\> - -Split a Hypercert's unit into multiple claims with the given fractions - -**`Dev`** - -Submit the ID of the claim to split and new fraction values. - -**`Notice`** - -The sum of the fractions must be equal to the total units of the claim - -#### Parameters - -| Name | Type | Description | -| :----------- | :--------------- | :---------------------------------------- | -| `claimId` | `BigNumberish` | Hypercert claim id | -| `fractions` | `BigNumberish`[] | Fractions of the Hypercert claim to split | -| `overrides?` | `Overrides` | - | - -#### Returns - -`Promise`<`ContractTransaction`\> - -Contract transaction - -#### Implementation of - -HypercertClientInterface.splitClaimUnits - -#### Defined in - -[sdk/src/client.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/client.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md deleted file mode 100644 index 706c14fe..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md +++ /dev/null @@ -1,250 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertsStorage - -# Class: HypercertsStorage - -A class that provides storage functionality for Hypercerts. - -## Implements - -- [`HypercertStorageInterface`](../interfaces/HypercertStorageInterface.md) - -## Table of contents - -### Constructors - -- [constructor](HypercertsStorage.md#constructor) - -### Properties - -- [nftStorageClient](HypercertsStorage.md#nftstorageclient) -- [readonly](HypercertsStorage.md#readonly) -- [web3StorageClient](HypercertsStorage.md#web3storageclient) - -### Methods - -- [getData](HypercertsStorage.md#getdata) -- [getMetadata](HypercertsStorage.md#getmetadata) -- [getNftStorageGatewayUri](HypercertsStorage.md#getnftstoragegatewayuri) -- [storeData](HypercertsStorage.md#storedata) -- [storeMetadata](HypercertsStorage.md#storemetadata) - -## Constructors - -### constructor - -• **new HypercertsStorage**(`overrides`) - -Creates a new instance of the `HypercertsStorage` class. - -#### Parameters - -| Name | Type | Description | -| :---------- | :--------------------------------------------------------------------------- | :------------------------------------------- | -| `overrides` | `Partial`<[`HypercertStorageConfig`](../modules.md#hypercertstorageconfig)\> | The configuration overrides for the storage. | - -#### Defined in - -[sdk/src/storage.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L37) - -## Properties - -### nftStorageClient - -• `Optional` **nftStorageClient**: `NFTStorage` - -The NFT storage client. - -#### Defined in - -[sdk/src/storage.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L29) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -Whether the storage is read-only. - -#### Defined in - -[sdk/src/storage.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L27) - ---- - -### web3StorageClient - -• `Optional` **web3StorageClient**: `any` - -The Web3 storage client. - -#### Defined in - -[sdk/src/storage.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L31) - -## Methods - -### getData - -▸ **getData**(`cidOrIpfsUri`): `Promise`<`any`\> - -Gets arbitrary data from Web3 storage. - -**`Throws`** - -A `StorageError` if the storage client is not configured or the data cannot be retrieved. - -#### Parameters - -| Name | Type | Description | -| :------------- | :------- | :-------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to get. | - -#### Returns - -`Promise`<`any`\> - -A Promise that resolves to the data. - -#### Implementation of - -HypercertStorageInterface.getData - -#### Defined in - -[sdk/src/storage.ts:147](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L147) - ---- - -### getMetadata - -▸ **getMetadata**(`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> - -Gets metadata for a Hypercert. - -**`Throws`** - -A `StorageError` if the storage client is not configured or the metadata cannot be retrieved. - -**`Throws`** - -A `MalformedDataError` if the metadata is invalid. E.g. unknown schema - -#### Parameters - -| Name | Type | Description | -| :------------- | :------- | :------------------------------------------ | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to get. | - -#### Returns - -`Promise`<[`HypercertMetadata`](../interfaces/HypercertMetadata.md)\> - -A Promise that resolves to the metadata. - -#### Implementation of - -HypercertStorageInterface.getMetadata - -#### Defined in - -[sdk/src/storage.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L97) - ---- - -### getNftStorageGatewayUri - -▸ **getNftStorageGatewayUri**(`cidOrIpfsUri`): `string` - -#### Parameters - -| Name | Type | -| :------------- | :------- | -| `cidOrIpfsUri` | `string` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/storage.ts:181](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L181) - ---- - -### storeData - -▸ **storeData**(`data`): `Promise`<`CIDString`\> - -Stores arbitrary data in Web3 storage. - -**`Throws`** - -A `StorageError` if the storage client is not configured. - -**`Notice`** - -Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. -Because we pay for storage quotas, this data is stored best effort. -If you are using our default keys, we may delete older data if we hit our storage quota. - -#### Parameters - -| Name | Type | Description | -| :----- | :-------- | :----------------- | -| `data` | `unknown` | The data to store. | - -#### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored data. - -#### Implementation of - -HypercertStorageInterface.storeData - -#### Defined in - -[sdk/src/storage.ts:125](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L125) - ---- - -### storeMetadata - -▸ **storeMetadata**(`data`): `Promise`<`CIDString`\> - -Stores metadata for a Hypercert. - -**`Throws`** - -A `StorageError` if the storage client is not configured. - -**`Throws`** - -A `MalformedDataError` if the metadata is invalid. - -**`Notice`** - -Because we pay for storage quotas, this data is stored best effort. -If you are using our default keys, we may delete older data if we hit our storage quota. - -#### Parameters - -| Name | Type | Description | -| :----- | :-------------------------------------------------------- | :--------------------- | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) | The metadata to store. | - -#### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored metadata. - -#### Implementation of - -HypercertStorageInterface.storeMetadata - -#### Defined in - -[sdk/src/storage.ts:67](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/storage.ts#L67) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md deleted file mode 100644 index d12c0653..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / InvalidOrMissingError - -# Class: InvalidOrMissingError - -The provided value was undefined or empty - -## Hierarchy - -- `Error` - - ↳ **`InvalidOrMissingError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](InvalidOrMissingError.md#constructor) - -### Properties - -- [payload](InvalidOrMissingError.md#payload) - -## Constructors - -### constructor - -• **new InvalidOrMissingError**(`message`, `payload?`) - -Creates a new instance of the InvalidOrMissingError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:61](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L61) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L54) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md deleted file mode 100644 index 028129d8..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MalformedDataError - -# Class: MalformedDataError - -Data doesn't conform to expectations - -## Hierarchy - -- `Error` - - ↳ **`MalformedDataError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](MalformedDataError.md#constructor) - -### Properties - -- [payload](MalformedDataError.md#payload) - -## Constructors - -### constructor - -• **new MalformedDataError**(`message`, `payload?`) - -Creates a new instance of the MalformedDataError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:133](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L133) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:126](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L126) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md deleted file mode 100644 index de284494..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / MintingError - -# Class: MintingError - -Minting transaction failed - -## Hierarchy - -- `Error` - - ↳ **`MintingError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](MintingError.md#constructor) - -### Properties - -- [payload](MintingError.md#payload) - -## Constructors - -### constructor - -• **new MintingError**(`message`, `payload?`) - -Creates a new instance of the MintingError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L79) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md deleted file mode 100644 index 0dcf0291..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / StorageError - -# Class: StorageError - -Fails storing to a remote resource - -## Hierarchy - -- `Error` - - ↳ **`StorageError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](StorageError.md#constructor) - -### Properties - -- [payload](StorageError.md#payload) - -## Constructors - -### constructor - -• **new StorageError**(`message`, `payload?`) - -Creates a new instance of the StorageError class. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:97](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L97) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:90](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L90) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md deleted file mode 100644 index 5fdb25e0..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md +++ /dev/null @@ -1,71 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnknownSchemaError - -# Class: UnknownSchemaError - -Schema could not be loaded - -## Hierarchy - -- `Error` - - ↳ **`UnknownSchemaError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](UnknownSchemaError.md#constructor) - -### Properties - -- [payload](UnknownSchemaError.md#payload) - -## Constructors - -### constructor - -• **new UnknownSchemaError**(`message`, `payload?`) - -Creates a new instance of the UnknownSchemaError class. - -#### Parameters - -| Name | Type | Description | -| :------------------- | :------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | -| `payload.schemaName` | `string` | - | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:115](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L115) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Type declaration - -| Name | Type | -| :----------- | :------- | -| `schemaName` | `string` | - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:108](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L108) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md deleted file mode 100644 index 0964b138..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md +++ /dev/null @@ -1,72 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / UnsupportedChainError - -# Class: UnsupportedChainError - -This blockchain is not yet supported -Please file an issue - -## Hierarchy - -- `Error` - - ↳ **`UnsupportedChainError`** - -## Implements - -- [`CustomError`](../interfaces/CustomError.md) - -## Table of contents - -### Constructors - -- [constructor](UnsupportedChainError.md#constructor) - -### Properties - -- [payload](UnsupportedChainError.md#payload) - -## Constructors - -### constructor - -• **new UnsupportedChainError**(`message`, `payload?`) - -Creates a new instance of the UnsupportedChainError class. - -#### Parameters - -| Name | Type | Description | -| :---------------- | :---------------------------------- | :------------------------ | -| `message` | `string` | The error message. | -| `payload?` | `Object` | Additional error payload. | -| `payload.chainID` | `undefined` \| `string` \| `number` | - | - -#### Overrides - -Error.constructor - -#### Defined in - -[sdk/src/types/errors.ts:152](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L152) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Type declaration - -| Name | Type | -| :-------- | :---------------------------------- | -| `chainID` | `undefined` \| `string` \| `number` | - -#### Implementation of - -[CustomError](../interfaces/CustomError.md).[payload](../interfaces/CustomError.md#payload) - -#### Defined in - -[sdk/src/types/errors.ts:145](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L145) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md deleted file mode 100644 index 1b94a629..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md +++ /dev/null @@ -1,278 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -A class that provides indexing functionality for Hypercerts. - -## Implements - -- [`HypercertIndexerInterface`](../interfaces/HypercertIndexerInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default-1.md#constructor) - -### Properties - -- [\_graphClient](internal.default-1.md#_graphclient) - -### Accessors - -- [graphClient](internal.default-1.md#graphclient) - -### Methods - -- [claimById](internal.default-1.md#claimbyid) -- [claimsByOwner](internal.default-1.md#claimsbyowner) -- [firstClaims](internal.default-1.md#firstclaims) -- [fractionById](internal.default-1.md#fractionbyid) -- [fractionsByClaim](internal.default-1.md#fractionsbyclaim) -- [fractionsByOwner](internal.default-1.md#fractionsbyowner) - -## Constructors - -### constructor - -• **new default**(`options`) - -Creates a new instance of the `HypercertIndexer` class. - -#### Parameters - -| Name | Type | Description | -| :------------------ | :------- | :----------------------------------------- | -| `options` | `Object` | The configuration options for the indexer. | -| `options.graphUrl?` | `string` | - | - -#### Defined in - -[sdk/src/indexer.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L17) - -## Properties - -### \_graphClient - -• `Private` **\_graphClient**: `Object` - -The Graph client used by the indexer. - -#### Type declaration - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Defined in - -[sdk/src/indexer.ts:11](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L11) - -## Accessors - -### graphClient - -• `get` **graphClient**(): `Object` - -Gets the Graph client used by the indexer. - -#### Returns - -`Object` - -The Graph client. - -| Name | Type | -| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ClaimById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `id`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> | -| `ClaimTokenById` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimTokenId`: `string` }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> | -| `ClaimTokensByClaim` | (`variables`: [`Exact`](../modules/internal.md#exact)<{ `claimId`: `string` ; `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> | -| `ClaimTokensByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> | -| `ClaimsByOwner` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `owner?`: `any` ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> | -| `RecentClaims` | (`variables?`: [`Exact`](../modules/internal.md#exact)<{ `first?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> ; `orderDirection?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<[`OrderDirection`](../modules/internal.md#orderdirection)\> ; `skip?`: [`InputMaybe`](../modules/internal.md#inputmaybe)<`number`\> }\>, `options?`: `unknown`) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> | - -#### Implementation of - -[HypercertIndexerInterface](../interfaces/HypercertIndexerInterface.md).[graphClient](../interfaces/HypercertIndexerInterface.md#graphclient) - -#### Defined in - -[sdk/src/indexer.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L27) - -## Methods - -### claimById - -▸ **claimById**(`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -Gets a claim by its ID. - -#### Parameters - -| Name | Type | Description | -| :--- | :------- | :------------------- | -| `id` | `string` | The ID of the claim. | - -#### Returns - -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -A Promise that resolves to the claim. - -#### Implementation of - -HypercertIndexerInterface.claimById - -#### Defined in - -[sdk/src/indexer.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L48) - ---- - -### claimsByOwner - -▸ **claimsByOwner**(`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -Gets the claims owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.claimsByOwner - -#### Defined in - -[sdk/src/indexer.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L37) - ---- - -### firstClaims - -▸ **firstClaims**(`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -Gets the most recent claims. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :-------------------- | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -A Promise that resolves to the claims. - -#### Implementation of - -HypercertIndexerInterface.firstClaims - -#### Defined in - -[sdk/src/indexer.ts:58](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L58) - ---- - -### fractionById - -▸ **fractionById**(`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -Gets a claim token by its ID. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------- | :------------------------- | -| `fractionId` | `string` | The ID of the claim token. | - -#### Returns - -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -A Promise that resolves to the claim token. - -#### Implementation of - -HypercertIndexerInterface.fractionById - -#### Defined in - -[sdk/src/indexer.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L92) - ---- - -### fractionsByClaim - -▸ **fractionsByClaim**(`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -Gets the claim tokens for a given claim. - -#### Parameters - -| Name | Type | Default value | Description | -| :-------- | :----------------------------------------- | :------------------- | :-------------------- | -| `claimId` | `string` | `undefined` | The ID of the claim. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByClaim - -#### Defined in - -[sdk/src/indexer.ts:81](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L81) - ---- - -### fractionsByOwner - -▸ **fractionsByOwner**(`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -Gets the claim tokens owned by a given address. - -#### Parameters - -| Name | Type | Default value | Description | -| :------- | :----------------------------------------- | :------------------- | :------------------------ | -| `owner` | `string` | `undefined` | The address of the owner. | -| `params` | [`QueryParams`](../modules.md#queryparams) | `defaultQueryParams` | The query parameters. | - -#### Returns - -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -A Promise that resolves to the claim tokens. - -#### Implementation of - -HypercertIndexerInterface.fractionsByOwner - -#### Defined in - -[sdk/src/indexer.ts:69](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/indexer.ts#L69) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md deleted file mode 100644 index 1538ce61..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md +++ /dev/null @@ -1,131 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -The EasEvaluator class provides methods for signing off-chain attestations of evaluations. -Schemas are stored on-chain in the Ethereum Attestation Service (EAS) contract. - -## Table of contents - -### Constructors - -- [constructor](internal.default-2.md#constructor) - -### Properties - -- [offChain](internal.default-2.md#offchain) -- [readonly](internal.default-2.md#readonly) -- [signer](internal.default-2.md#signer) - -### Methods - -- [getSignature](internal.default-2.md#getsignature) -- [signOfflineEvaluation](internal.default-2.md#signofflineevaluation) - -## Constructors - -### constructor - -• **new default**(`config`) - -Creates a new EasEvaluator instance. - -#### Parameters - -| Name | Type | Description | -| :------- | :------------------------------------------------------------------------- | :------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | The configuration options for the EasEvaluator instance. | - -#### Defined in - -[sdk/src/evaluations/eas.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L37) - -## Properties - -### offChain - -• **offChain**: `Offchain` - -The Offchain instance used for signing off-chain attestations. - -#### Defined in - -[sdk/src/evaluations/eas.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L24) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/eas.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L31) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -The TypedDataSigner instance used for signing typed data. - -#### Defined in - -[sdk/src/evaluations/eas.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L29) - -## Methods - -### getSignature - -▸ **getSignature**(`encodedData`, `recipient`, `schemaUid`): `Promise`<`SignedOffchainAttestation`\> - -Gets a signature for an off-chain attestation. - -#### Parameters - -| Name | Type | Description | -| :------------ | :------- | :------------------------------------------------ | -| `encodedData` | `string` | The encoded data to sign. | -| `recipient` | `string` | The address of the recipient of the attestation. | -| `schemaUid` | `string` | The UID of the schema to use for the attestation. | - -#### Returns - -`Promise`<`SignedOffchainAttestation`\> - -- The signature for the attestation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L62) - ---- - -### signOfflineEvaluation - -▸ **signOfflineEvaluation**(`evaluation`): `Promise`<`undefined` \| `SignedOffchainAttestation`\> - -Signs an offline evaluation. - -**`Throws`** - -- If the evaluation data is malformed. - -#### Parameters - -| Name | Type | Description | -| :----------- | :----------------------------------------------- | :--------------------------- | -| `evaluation` | [`EvaluationData`](../modules.md#evaluationdata) | The evaluation data to sign. | - -#### Returns - -`Promise`<`undefined` \| `SignedOffchainAttestation`\> - -- The signature for the evaluation. - -#### Defined in - -[sdk/src/evaluations/eas.ts:95](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/eas.ts#L95) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md deleted file mode 100644 index 86daa5e4..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md +++ /dev/null @@ -1,110 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / default - -# Class: default - -[internal](../modules/internal.md).default - -## Implements - -- [`EvaluatorInterface`](../interfaces/internal.EvaluatorInterface.md) - -## Table of contents - -### Constructors - -- [constructor](internal.default.md#constructor) - -### Properties - -- [eas](internal.default.md#eas) -- [readonly](internal.default.md#readonly) -- [signer](internal.default.md#signer) -- [storage](internal.default.md#storage) - -### Methods - -- [submitEvaluation](internal.default.md#submitevaluation) - -## Constructors - -### constructor - -• **new default**(`config?`) - -#### Parameters - -| Name | Type | -| :------- | :------------------------------------------------------------------------- | -| `config` | `Partial`<[`HypercertClientConfig`](../modules.md#hypercertclientconfig)\> | - -#### Defined in - -[sdk/src/evaluations/index.ts:37](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L37) - -## Properties - -### eas - -• **eas**: [`default`](internal.default-2.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:33](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L33) - ---- - -### readonly - -• **readonly**: `boolean` = `true` - -#### Defined in - -[sdk/src/evaluations/index.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L35) - ---- - -### signer - -• `Optional` **signer**: `Signer` & `TypedDataSigner` - -#### Defined in - -[sdk/src/evaluations/index.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L29) - ---- - -### storage - -• **storage**: [`HypercertsStorage`](HypercertsStorage.md) - -#### Defined in - -[sdk/src/evaluations/index.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L31) - -## Methods - -### submitEvaluation - -▸ **submitEvaluation**(`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -#### Parameters - -| Name | Type | Description | -| :----------- | :------------------------------------------------------------------------ | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](../interfaces/HypercertEvaluationSchema.md) | The evaluation to submit. | - -#### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Implementation of - -EvaluatorInterface.submitEvaluation - -#### Defined in - -[sdk/src/evaluations/index.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L53) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md deleted file mode 100644 index b4af6279..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/CustomError.md +++ /dev/null @@ -1,39 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / CustomError - -# Interface: CustomError - -An interface for errors that have a specific type. - -## Implemented by - -- [`ClientError`](../classes/ClientError.md) -- [`ConfigurationError`](../classes/ConfigurationError.md) -- [`FetchError`](../classes/FetchError.md) -- [`InvalidOrMissingError`](../classes/InvalidOrMissingError.md) -- [`MalformedDataError`](../classes/MalformedDataError.md) -- [`MintingError`](../classes/MintingError.md) -- [`StorageError`](../classes/StorageError.md) -- [`UnknownSchemaError`](../classes/UnknownSchemaError.md) -- [`UnsupportedChainError`](../classes/UnsupportedChainError.md) - -## Table of contents - -### Properties - -- [payload](CustomError.md#payload) - -## Properties - -### payload - -• `Optional` **payload**: `Object` - -Additional error payload. - -#### Index signature - -▪ [key: `string`]: `unknown` - -#### Defined in - -[sdk/src/types/errors.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L8) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md deleted file mode 100644 index 4606b46e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md +++ /dev/null @@ -1,56 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / DuplicateEvaluation - -# Interface: DuplicateEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [duplicateHypercerts](DuplicateEvaluation.md#duplicatehypercerts) -- [explanation](DuplicateEvaluation.md#explanation) -- [realHypercert](DuplicateEvaluation.md#realhypercert) -- [type](DuplicateEvaluation.md#type) - -## Properties - -### duplicateHypercerts - -• **duplicateHypercerts**: [`HypercertPointer`](HypercertPointer.md)[] - -#### Defined in - -[sdk/src/types/evaluation.d.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L22) - ---- - -### explanation - -• **explanation**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L24) - ---- - -### realHypercert - -• **realHypercert**: [`HypercertPointer`](HypercertPointer.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L23) - ---- - -### type - -• **type**: `"duplicate"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md deleted file mode 100644 index 205b7004..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md +++ /dev/null @@ -1,56 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / EASEvaluation - -# Interface: EASEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [chainId](EASEvaluation.md#chainid) -- [contract](EASEvaluation.md#contract) -- [type](EASEvaluation.md#type) -- [uid](EASEvaluation.md#uid) - -## Properties - -### chainId - -• **chainId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:41](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L41) - ---- - -### contract - -• **contract**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:42](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L42) - ---- - -### type - -• **type**: `"EAS"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L40) - ---- - -### uid - -• **uid**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:43](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md deleted file mode 100644 index 3dcea656..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md +++ /dev/null @@ -1,167 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClaimdata - -# Interface: HypercertClaimdata - -Properties of an impact claim - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [contributors](HypercertClaimdata.md#contributors) -- [impact_scope](HypercertClaimdata.md#impact_scope) -- [impact_timeframe](HypercertClaimdata.md#impact_timeframe) -- [rights](HypercertClaimdata.md#rights) -- [work_scope](HypercertClaimdata.md#work_scope) -- [work_timeframe](HypercertClaimdata.md#work_timeframe) - -## Properties - -### contributors - -• **contributors**: `Object` - -Contributors - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:53](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L53) - ---- - -### impact_scope - -• **impact_scope**: `Object` - -Scopes of impact - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L15) - ---- - -### impact_timeframe - -• **impact_timeframe**: `Object` - -Impact time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:44](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L44) - ---- - -### rights - -• `Optional` **rights**: `Object` - -Rights - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:62](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L62) - ---- - -### work_scope - -• **work_scope**: `Object` - -Scopes of work - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L25) - ---- - -### work_timeframe - -• **work_timeframe**: `Object` - -Work time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/claimdata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md deleted file mode 100644 index 0483b520..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md +++ /dev/null @@ -1,341 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientInterface - -# Interface: HypercertClientInterface - -The interface for the Hypercert client. - -## Hierarchy - -- [`HypercertClientMethods`](HypercertClientMethods.md) - -- [`HypercertClientState`](HypercertClientState.md) - - ↳ **`HypercertClientInterface`** - -## Implemented by - -- [`HypercertClient`](../classes/HypercertClient.md) - -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientInterface.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientInterface.md#burnclaimfraction) -- [contract](HypercertClientInterface.md#contract) -- [createAllowlist](HypercertClientInterface.md#createallowlist) -- [indexer](HypercertClientInterface.md#indexer) -- [mergeClaimUnits](HypercertClientInterface.md#mergeclaimunits) -- [mintClaim](HypercertClientInterface.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientInterface.md#mintclaimfractionfromallowlist) -- [readonly](HypercertClientInterface.md#readonly) -- [splitClaimUnits](HypercertClientInterface.md#splitclaimunits) -- [storage](HypercertClientInterface.md#storage) - -## Properties - -### batchMintClaimFractionsFromAllowlists - -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) - -#### Defined in - -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) - ---- - -### burnClaimFraction - -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`): `Promise`<`ContractTransaction`\> - -Burns a claim fraction. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) - -#### Defined in - -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) - ---- - -### contract - -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[contract](HypercertClientState.md#contract) - -#### Defined in - -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) - ---- - -### createAllowlist - -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Creates a new allowlist and mints a new claim with the allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[createAllowlist](HypercertClientMethods.md#createallowlist) - -#### Defined in - -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) - ---- - -### indexer - -• **indexer**: [`default`](../classes/internal.default-1.md) - -The indexer used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[indexer](HypercertClientState.md#indexer) - -#### Defined in - -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) - ---- - -### mergeClaimUnits - -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`): `Promise`<`ContractTransaction`\> - -Merges multiple claim fractions into a single claim. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) - -#### Defined in - -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) - ---- - -### mintClaim - -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Mints a new claim. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mintClaim](HypercertClientMethods.md#mintclaim) - -#### Defined in - -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) - ---- - -### mintClaimFractionFromAllowlist - -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> - -Mints a claim fraction from an allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) - -#### Defined in - -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[readonly](HypercertClientState.md#readonly) - -#### Defined in - -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) - ---- - -### splitClaimUnits - -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> - -Splits a claim into multiple fractions. - -##### Parameters - -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Inherited from - -[HypercertClientMethods](HypercertClientMethods.md).[splitClaimUnits](HypercertClientMethods.md#splitclaimunits) - -#### Defined in - -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) - ---- - -### storage - -• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) - -The storage layer used by the client. - -#### Inherited from - -[HypercertClientState](HypercertClientState.md).[storage](HypercertClientState.md#storage) - -#### Defined in - -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md deleted file mode 100644 index 734ccbee..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md +++ /dev/null @@ -1,239 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientMethods - -# Interface: HypercertClientMethods - -The methods for the Hypercert client. - -## Hierarchy - -- **`HypercertClientMethods`** - - ↳ [`HypercertClientInterface`](HypercertClientInterface.md) - -## Table of contents - -### Properties - -- [batchMintClaimFractionsFromAllowlists](HypercertClientMethods.md#batchmintclaimfractionsfromallowlists) -- [burnClaimFraction](HypercertClientMethods.md#burnclaimfraction) -- [createAllowlist](HypercertClientMethods.md#createallowlist) -- [mergeClaimUnits](HypercertClientMethods.md#mergeclaimunits) -- [mintClaim](HypercertClientMethods.md#mintclaim) -- [mintClaimFractionFromAllowlist](HypercertClientMethods.md#mintclaimfractionfromallowlist) -- [splitClaimUnits](HypercertClientMethods.md#splitclaimunits) - -## Properties - -### batchMintClaimFractionsFromAllowlists - -• **batchMintClaimFractionsFromAllowlists**: (`claimIds`: `BigNumberish`[], `units`: `BigNumberish`[], `proofs`: `BytesLike`[][]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`, `units`, `proofs`): `Promise`<`ContractTransaction`\> - -Batch mints a claim fraction from an allowlist - -**`Note`** - -The length of the arrays must be equal. - -**`Note`** - -The order of the arrays must be equal. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :---------------------------------------------------- | -| `claimIds` | `BigNumberish`[] | Array of the IDs of the claims to mint fractions for. | -| `units` | `BigNumberish`[] | Array of the number of units for each fraction. | -| `proofs` | `BytesLike`[][] | Array of Merkle proofs for the allowlists. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:200](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L200) - ---- - -### burnClaimFraction - -• **burnClaimFraction**: (`claimId`: `BigNumberish`) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`): `Promise`<`ContractTransaction`\> - -Burns a claim fraction. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim fraction to burn. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:175](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L175) - ---- - -### createAllowlist - -• **createAllowlist**: (`allowList`: [`AllowlistEntry`](../modules.md#allowlistentry)[], `metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`allowList`, `metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Creates a new allowlist and mints a new claim with the allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `allowList` | [`AllowlistEntry`](../modules.md#allowlistentry)[] | The allowlist for the claim. | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:148](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L148) - ---- - -### mergeClaimUnits - -• **mergeClaimUnits**: (`claimIds`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimIds`): `Promise`<`ContractTransaction`\> - -Merges multiple claim fractions into a single claim. - -##### Parameters - -| Name | Type | Description | -| :--------- | :--------------- | :--------------------------------------- | -| `claimIds` | `BigNumberish`[] | The IDs of the claim fractions to merge. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:168](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L168) - ---- - -### mintClaim - -• **mintClaim**: (`metaData`: [`HypercertMetadata`](HypercertMetadata.md), `totalUnits`: `BigNumberish`, `transferRestriction`: [`TransferRestrictions`](../modules.md#transferrestrictions-1)) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`metaData`, `totalUnits`, `transferRestriction`): `Promise`<`ContractTransaction`\> - -Mints a new claim. - -##### Parameters - -| Name | Type | Description | -| :-------------------- | :------------------------------------------------------------- | :--------------------------------------- | -| `metaData` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata for the claim. | -| `totalUnits` | `BigNumberish` | The total number of units for the claim. | -| `transferRestriction` | [`TransferRestrictions`](../modules.md#transferrestrictions-1) | The transfer restriction for the claim. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:134](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L134) - ---- - -### mintClaimFractionFromAllowlist - -• **mintClaimFractionFromAllowlist**: (`claimId`: `BigNumberish`, `units`: `BigNumberish`, `proof`: `BytesLike`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `units`, `proof`): `Promise`<`ContractTransaction`\> - -Mints a claim fraction from an allowlist. - -##### Parameters - -| Name | Type | Description | -| :-------- | :------------- | :------------------------------------------ | -| `claimId` | `BigNumberish` | The ID of the claim to mint a fraction for. | -| `units` | `BigNumberish` | The number of units for the fraction. | -| `proof` | `BytesLike`[] | The Merkle proof for the allowlist. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:184](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L184) - ---- - -### splitClaimUnits - -• **splitClaimUnits**: (`claimId`: `BigNumberish`, `fractions`: `BigNumberish`[]) => `Promise`<`ContractTransaction`\> - -#### Type declaration - -▸ (`claimId`, `fractions`): `Promise`<`ContractTransaction`\> - -Splits a claim into multiple fractions. - -##### Parameters - -| Name | Type | Description | -| :---------- | :--------------- | :------------------------------------- | -| `claimId` | `BigNumberish` | The ID of the claim to split. | -| `fractions` | `BigNumberish`[] | The number of units for each fraction. | - -##### Returns - -`Promise`<`ContractTransaction`\> - -A Promise that resolves to the transaction receipt - -#### Defined in - -[sdk/src/types/client.ts:161](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L161) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md deleted file mode 100644 index 2d90a599..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md +++ /dev/null @@ -1,68 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertClientState - -# Interface: HypercertClientState - -The state of the Hypercert client. - -## Hierarchy - -- **`HypercertClientState`** - - ↳ [`HypercertClientInterface`](HypercertClientInterface.md) - -## Table of contents - -### Properties - -- [contract](HypercertClientState.md#contract) -- [indexer](HypercertClientState.md#indexer) -- [readonly](HypercertClientState.md#readonly) -- [storage](HypercertClientState.md#storage) - -## Properties - -### contract - -• **contract**: [`HypercertMinter`](internal.HypercertMinter.md) - -The contract used by the client. - -#### Defined in - -[sdk/src/types/client.ts:120](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L120) - ---- - -### indexer - -• **indexer**: [`default`](../classes/internal.default-1.md) - -The indexer used by the client. - -#### Defined in - -[sdk/src/types/client.ts:118](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L118) - ---- - -### readonly - -• **readonly**: `boolean` - -Whether the client is in read-only mode. - -#### Defined in - -[sdk/src/types/client.ts:114](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L114) - ---- - -### storage - -• **storage**: [`HypercertStorageInterface`](HypercertStorageInterface.md) - -The storage layer used by the client. - -#### Defined in - -[sdk/src/types/client.ts:116](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L116) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md deleted file mode 100644 index 6ebed93a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md +++ /dev/null @@ -1,47 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertEvaluationSchema - -# Interface: HypercertEvaluationSchema - -Schema for evaluating Hypercerts across different sources and evaluation types - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [creator](HypercertEvaluationSchema.md#creator) -- [evaluationData](HypercertEvaluationSchema.md#evaluationdata) -- [evaluationSource](HypercertEvaluationSchema.md#evaluationsource) - -## Properties - -### creator - -• **creator**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L15) - ---- - -### evaluationData - -• **evaluationData**: [`EvaluationData`](../modules.md#evaluationdata) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:16](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L16) - ---- - -### evaluationSource - -• **evaluationSource**: [`EvaluationSource`](../modules.md#evaluationsource) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:17](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md deleted file mode 100644 index f18c409f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md +++ /dev/null @@ -1,176 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertIndexerInterface - -# Interface: HypercertIndexerInterface - -## Implemented by - -- [`default`](../classes/internal.default-1.md) - -## Table of contents - -### Properties - -- [claimById](HypercertIndexerInterface.md#claimbyid) -- [claimsByOwner](HypercertIndexerInterface.md#claimsbyowner) -- [firstClaims](HypercertIndexerInterface.md#firstclaims) -- [fractionById](HypercertIndexerInterface.md#fractionbyid) -- [fractionsByClaim](HypercertIndexerInterface.md#fractionsbyclaim) -- [fractionsByOwner](HypercertIndexerInterface.md#fractionsbyowner) -- [graphClient](HypercertIndexerInterface.md#graphclient) - -## Properties - -### claimById - -• **claimById**: (`id`: `string`) => `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -#### Type declaration - -▸ (`id`): `Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -##### Parameters - -| Name | Type | -| :--- | :------- | -| `id` | `string` | - -##### Returns - -`Promise`<[`ClaimByIdQuery`](../modules/internal.md#claimbyidquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L20) - ---- - -### claimsByOwner - -• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -#### Type declaration - -▸ (`owner`, `params?`): `Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `owner` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimsByOwnerQuery`](../modules/internal.md#claimsbyownerquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L19) - ---- - -### firstClaims - -• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -#### Type declaration - -▸ (`params?`): `Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`RecentClaimsQuery`](../modules/internal.md#recentclaimsquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L21) - ---- - -### fractionById - -• **fractionById**: (`fractionId`: `string`) => `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -#### Type declaration - -▸ (`fractionId`): `Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -##### Parameters - -| Name | Type | -| :----------- | :------- | -| `fractionId` | `string` | - -##### Returns - -`Promise`<[`ClaimTokenByIdQuery`](../modules/internal.md#claimtokenbyidquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:24](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L24) - ---- - -### fractionsByClaim - -• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -#### Type declaration - -▸ (`claimId`, `params?`): `Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `claimId` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimTokensByClaimQuery`](../modules/internal.md#claimtokensbyclaimquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L23) - ---- - -### fractionsByOwner - -• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -#### Type declaration - -▸ (`owner`, `params?`): `Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -##### Parameters - -| Name | Type | -| :-------- | :----------------------------------------- | -| `owner` | `string` | -| `params?` | [`QueryParams`](../modules.md#queryparams) | - -##### Returns - -`Promise`<[`ClaimTokensByOwnerQuery`](../modules/internal.md#claimtokensbyownerquery)\> - -#### Defined in - -[sdk/src/types/indexer.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L22) - ---- - -### graphClient - -• **graphClient**: `any` - -#### Defined in - -[sdk/src/types/indexer.ts:18](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md deleted file mode 100644 index d65362f3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md +++ /dev/null @@ -1,123 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertMetadata - -# Interface: HypercertMetadata - -Claim data for hypercert. ERC1155 Metadata compliant - -## Table of contents - -### Properties - -- [allowList](HypercertMetadata.md#allowlist) -- [description](HypercertMetadata.md#description) -- [external_url](HypercertMetadata.md#external_url) -- [hypercert](HypercertMetadata.md#hypercert) -- [image](HypercertMetadata.md#image) -- [name](HypercertMetadata.md#name) -- [properties](HypercertMetadata.md#properties) -- [ref](HypercertMetadata.md#ref) -- [version](HypercertMetadata.md#version) - -## Properties - -### allowList - -• `Optional` **allowList**: `string` - -A CID pointer to the merke tree proof json on ipfs - -#### Defined in - -[sdk/src/types/metadata.d.ts:39](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L39) - ---- - -### description - -• **description**: `string` - -Describes the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:19](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L19) - ---- - -### external_url - -• `Optional` **external_url**: `string` - -An url pointing to the external website of the project - -#### Defined in - -[sdk/src/types/metadata.d.ts:23](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L23) - ---- - -### hypercert - -• `Optional` **hypercert**: [`HypercertClaimdata`](internal.HypercertClaimdata.md) - -#### Defined in - -[sdk/src/types/metadata.d.ts:45](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L45) - ---- - -### image - -• **image**: `string` - -A URI pointing to a resource with mime type image/\* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. - -#### Defined in - -[sdk/src/types/metadata.d.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L27) - ---- - -### name - -• **name**: `string` - -Identifies the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L15) - ---- - -### properties - -• `Optional` **properties**: { `[k: string]`: `unknown`; `trait_type?`: `string` ; `value?`: `string` }[] - -#### Defined in - -[sdk/src/types/metadata.d.ts:40](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L40) - ---- - -### ref - -• `Optional` **ref**: `string` - -Describes the asset to which this token represents - -#### Defined in - -[sdk/src/types/metadata.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L35) - ---- - -### version - -• `Optional` **version**: `string` - -The version of Hypercert schema used to describe this hypercert - -#### Defined in - -[sdk/src/types/metadata.d.ts:31](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md deleted file mode 100644 index 773c41d3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md +++ /dev/null @@ -1,45 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertPointer - -# Interface: HypercertPointer - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [chainId](HypercertPointer.md#chainid) -- [claimId](HypercertPointer.md#claimid) -- [contract](HypercertPointer.md#contract) - -## Properties - -### chainId - -• **chainId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L28) - ---- - -### claimId - -• **claimId**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:30](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L30) - ---- - -### contract - -• **contract**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:29](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md deleted file mode 100644 index 8ffda51e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertStorageInterface.md +++ /dev/null @@ -1,130 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / HypercertStorageInterface - -# Interface: HypercertStorageInterface - -The interface for the Hypercert storage layer. - -## Implemented by - -- [`HypercertsStorage`](../classes/HypercertsStorage.md) - -## Table of contents - -### Properties - -- [getData](HypercertStorageInterface.md#getdata) -- [getMetadata](HypercertStorageInterface.md#getmetadata) -- [storeData](HypercertStorageInterface.md#storedata) -- [storeMetadata](HypercertStorageInterface.md#storemetadata) - -## Properties - -### getData - -• **getData**: (`cidOrIpfsUri`: `string`) => `Promise`<`unknown`\> - -#### Type declaration - -▸ (`cidOrIpfsUri`): `Promise`<`unknown`\> - -Retrieves arbitrary data from IPFS. - -##### Parameters - -| Name | Type | Description | -| :------------- | :------- | :------------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the data to retrieve. | - -##### Returns - -`Promise`<`unknown`\> - -A Promise that resolves to the retrieved data. - -#### Defined in - -[sdk/src/types/client.ts:93](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L93) - ---- - -### getMetadata - -• **getMetadata**: (`cidOrIpfsUri`: `string`) => `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -#### Type declaration - -▸ (`cidOrIpfsUri`): `Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -Retrieves the metadata for a Hypercert evaluation. - -##### Parameters - -| Name | Type | Description | -| :------------- | :------- | :----------------------------------------------- | -| `cidOrIpfsUri` | `string` | The CID or IPFS URI of the metadata to retrieve. | - -##### Returns - -`Promise`<[`HypercertMetadata`](HypercertMetadata.md)\> - -A Promise that resolves to the retrieved metadata. - -#### Defined in - -[sdk/src/types/client.ts:79](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L79) - ---- - -### storeData - -• **storeData**: (`data`: `unknown`) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`data`): `Promise`<`CIDString`\> - -Stores arbitrary data on IPFS. - -##### Parameters - -| Name | Type | Description | -| :----- | :-------- | :----------------- | -| `data` | `unknown` | The data to store. | - -##### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored data. - -#### Defined in - -[sdk/src/types/client.ts:86](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L86) - ---- - -### storeMetadata - -• **storeMetadata**: (`metadata`: [`HypercertMetadata`](HypercertMetadata.md)) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`metadata`): `Promise`<`CIDString`\> - -Stores the metadata for a Hypercert evaluation. - -##### Parameters - -| Name | Type | Description | -| :--------- | :------------------------------------------ | :--------------------- | -| `metadata` | [`HypercertMetadata`](HypercertMetadata.md) | The metadata to store. | - -##### Returns - -`Promise`<`CIDString`\> - -A Promise that resolves to the CID of the stored metadata. - -#### Defined in - -[sdk/src/types/client.ts:72](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L72) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md deleted file mode 100644 index 5f5871f2..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md +++ /dev/null @@ -1,34 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / IPFSEvaluation - -# Interface: IPFSEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [cid](IPFSEvaluation.md#cid) -- [type](IPFSEvaluation.md#type) - -## Properties - -### cid - -• **cid**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L48) - ---- - -### type - -• **type**: `"IPFS"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:47](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md deleted file mode 100644 index 3e4b3b92..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md +++ /dev/null @@ -1,45 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / SimpleTextEvaluation - -# Interface: SimpleTextEvaluation - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [hypercert](SimpleTextEvaluation.md#hypercert) -- [text](SimpleTextEvaluation.md#text) -- [type](SimpleTextEvaluation.md#type) - -## Properties - -### hypercert - -• **hypercert**: [`HypercertPointer`](HypercertPointer.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L35) - ---- - -### text - -• **text**: `string` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L36) - ---- - -### type - -• **type**: `"simpleText"` - -#### Defined in - -[sdk/src/types/evaluation.d.ts:34](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md deleted file mode 100644 index 53ac36ed..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md +++ /dev/null @@ -1,43 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / EvaluatorInterface - -# Interface: EvaluatorInterface - -[internal](../modules/internal.md).EvaluatorInterface - -## Implemented by - -- [`default`](../classes/internal.default.md) - -## Table of contents - -### Properties - -- [submitEvaluation](internal.EvaluatorInterface.md#submitevaluation) - -## Properties - -### submitEvaluation - -• **submitEvaluation**: (`evaluation`: [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md)) => `Promise`<`CIDString`\> - -#### Type declaration - -▸ (`evaluation`): `Promise`<`CIDString`\> - -Submits an evaluation to the prefered storage system. - -##### Parameters - -| Name | Type | Description | -| :----------- | :---------------------------------------------------------- | :------------------------ | -| `evaluation` | [`HypercertEvaluationSchema`](HypercertEvaluationSchema.md) | The evaluation to submit. | - -##### Returns - -`Promise`<`CIDString`\> - -- The CID of the submitted evaluation. - -#### Defined in - -[sdk/src/evaluations/index.ts:25](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/evaluations/index.ts#L25) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md deleted file mode 100644 index 273912bc..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md +++ /dev/null @@ -1,169 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertClaimdata - -# Interface: HypercertClaimdata - -[internal](../modules/internal.md).HypercertClaimdata - -Properties of an impact claim - -## Indexable - -▪ [k: `string`]: `unknown` - -## Table of contents - -### Properties - -- [contributors](internal.HypercertClaimdata.md#contributors) -- [impact_scope](internal.HypercertClaimdata.md#impact_scope) -- [impact_timeframe](internal.HypercertClaimdata.md#impact_timeframe) -- [rights](internal.HypercertClaimdata.md#rights) -- [work_scope](internal.HypercertClaimdata.md#work_scope) -- [work_timeframe](internal.HypercertClaimdata.md#work_timeframe) - -## Properties - -### contributors - -• **contributors**: `Object` - -Contributors - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:92](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L92) - ---- - -### impact_scope - -• **impact_scope**: `Object` - -Scopes of impact - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:54](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L54) - ---- - -### impact_timeframe - -• **impact_timeframe**: `Object` - -Impact time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:83](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L83) - ---- - -### rights - -• `Optional` **rights**: `Object` - -Rights - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:101](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L101) - ---- - -### work_scope - -• **work_scope**: `Object` - -Scopes of work - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `excludes?` | `string`[] | -| `name?` | `string` | -| `value?` | `string`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L64) - ---- - -### work_timeframe - -• **work_timeframe**: `Object` - -Work time period. The value is UNIX time in seconds from epoch. - -#### Index signature - -▪ [k: `string`]: `unknown` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------- | -| `display_value?` | `string` | -| `name?` | `string` | -| `value?` | `number`[] | - -#### Defined in - -[sdk/src/types/metadata.d.ts:74](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/metadata.d.ts#L74) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md deleted file mode 100644 index 3f4ea346..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md +++ /dev/null @@ -1,17 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / [internal](../modules/internal.md) / HypercertMinter - -# Interface: HypercertMinter - -[internal](../modules/internal.md).HypercertMinter - -Hypercert contract interface. - -**`Notice`** - -hacky loop to get typedoc to generate all the docs - -## Hierarchy - -- `HypercertMinter` - - ↳ **`HypercertMinter`** diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md deleted file mode 100644 index 15998930..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md +++ /dev/null @@ -1,638 +0,0 @@ -[Hypercerts SDK Documentation](README.md) / Exports - -# Hypercerts SDK Documentation - -## Table of contents - -### References - -- [Claim](modules.md#claim) -- [ClaimToken](modules.md#claimtoken) -- [ClaimTokensByClaimQuery](modules.md#claimtokensbyclaimquery) - -### Modules - -- [internal](modules/internal.md) - -### Classes - -- [ClientError](classes/ClientError.md) -- [ConfigurationError](classes/ConfigurationError.md) -- [FetchError](classes/FetchError.md) -- [HypercertClient](classes/HypercertClient.md) -- [HypercertsStorage](classes/HypercertsStorage.md) -- [InvalidOrMissingError](classes/InvalidOrMissingError.md) -- [MalformedDataError](classes/MalformedDataError.md) -- [MintingError](classes/MintingError.md) -- [StorageError](classes/StorageError.md) -- [UnknownSchemaError](classes/UnknownSchemaError.md) -- [UnsupportedChainError](classes/UnsupportedChainError.md) - -### Interfaces - -- [CustomError](interfaces/CustomError.md) -- [DuplicateEvaluation](interfaces/DuplicateEvaluation.md) -- [EASEvaluation](interfaces/EASEvaluation.md) -- [HypercertClaimdata](interfaces/HypercertClaimdata.md) -- [HypercertClientInterface](interfaces/HypercertClientInterface.md) -- [HypercertClientMethods](interfaces/HypercertClientMethods.md) -- [HypercertClientState](interfaces/HypercertClientState.md) -- [HypercertEvaluationSchema](interfaces/HypercertEvaluationSchema.md) -- [HypercertIndexerInterface](interfaces/HypercertIndexerInterface.md) -- [HypercertMetadata](interfaces/HypercertMetadata.md) -- [HypercertPointer](interfaces/HypercertPointer.md) -- [HypercertStorageInterface](interfaces/HypercertStorageInterface.md) -- [IPFSEvaluation](interfaces/IPFSEvaluation.md) -- [SimpleTextEvaluation](interfaces/SimpleTextEvaluation.md) - -### Type Aliases - -- [AllowlistEntry](modules.md#allowlistentry) -- [Deployment](modules.md#deployment) -- [EvaluationData](modules.md#evaluationdata) -- [EvaluationSource](modules.md#evaluationsource) -- [HypercertClientConfig](modules.md#hypercertclientconfig) -- [HypercertClientProps](modules.md#hypercertclientprops) -- [HypercertEvaluatorConfig](modules.md#hypercertevaluatorconfig) -- [HypercertStorageConfig](modules.md#hypercertstorageconfig) -- [HypercertsSdkError](modules.md#hypercertssdkerror) -- [QueryParams](modules.md#queryparams) -- [SupportedChainIds](modules.md#supportedchainids) -- [TransferRestrictions](modules.md#transferrestrictions) - -### Properties - -- [ClaimByIdQuery](modules.md#claimbyidquery) - -### Variables - -- [INDEFINITE_DATE_STRING](modules.md#indefinite_date_string) -- [TransferRestrictions](modules.md#transferrestrictions-1) - -### Functions - -- [execute](modules.md#execute) -- [formatDate](modules.md#formatdate) -- [formatHypercertData](modules.md#formathypercertdata) -- [formatUnixTime](modules.md#formatunixtime) -- [validateAllowlist](modules.md#validateallowlist) -- [validateClaimData](modules.md#validateclaimdata) -- [validateDuplicateEvaluationData](modules.md#validateduplicateevaluationdata) -- [validateMetaData](modules.md#validatemetadata) -- [validateSimpleTextEvaluationData](modules.md#validatesimpletextevaluationdata) -- [verifyMerkleProof](modules.md#verifymerkleproof) -- [verifyMerkleProofs](modules.md#verifymerkleproofs) - -## References - -### Claim - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimToken - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - ---- - -### ClaimTokensByClaimQuery - -Renames and re-exports [ClaimByIdQuery](modules.md#claimbyidquery) - -## Type Aliases - -### AllowlistEntry - -Ƭ **AllowlistEntry**: `Object` - -Allowlist entry for Hypercerts matching the definitions in the Hypercerts protocol - -**`Param`** - -Address of the recipient - -**`Param`** - -Number of units allocated to the recipient - -#### Type declaration - -| Name | Type | -| :-------- | :------------- | -| `address` | `string` | -| `units` | `BigNumberish` | - -#### Defined in - -[sdk/src/types/hypercerts.ts:22](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L22) - ---- - -### Deployment - -Ƭ **Deployment**: `Object` - -Represents a deployment of a contract on a specific network. - -#### Type declaration - -| Name | Type | Description | -| :---------------- | :------- | :--------------------------------------------------------------------------------------- | -| `chainId` | `number` | The ID of the network on which the contract is deployed. | -| `chainName` | `string` | The name of the network on which the contract is deployed. | -| `contractAddress` | `string` | The address of the deployed contract. | -| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | - -#### Defined in - -[sdk/src/types/client.ts:21](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L21) - ---- - -### EvaluationData - -Ƭ **EvaluationData**: [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) \| [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) - -This file was automatically generated by json-schema-to-typescript. -DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, -and run json-schema-to-typescript to regenerate this file. - -#### Defined in - -[sdk/src/types/evaluation.d.ts:8](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L8) - ---- - -### EvaluationSource - -Ƭ **EvaluationSource**: [`EASEvaluation`](interfaces/EASEvaluation.md) \| [`IPFSEvaluation`](interfaces/IPFSEvaluation.md) - -#### Defined in - -[sdk/src/types/evaluation.d.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/evaluation.d.ts#L9) - ---- - -### HypercertClientConfig - -Ƭ **HypercertClientConfig**: [`Deployment`](modules.md#deployment) & [`HypercertStorageConfig`](modules.md#hypercertstorageconfig) & [`HypercertEvaluatorConfig`](modules.md#hypercertevaluatorconfig) & { `operator`: `ethers.providers.Provider` \| `ethers.Signer` ; `unsafeForceOverrideConfig?`: `boolean` } - -Configuration options for the Hypercert client. - -#### Defined in - -[sdk/src/types/client.ts:35](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L35) - ---- - -### HypercertClientProps - -Ƭ **HypercertClientProps**: `Object` - -The props for the Hypercert client. - -#### Type declaration - -| Name | Type | Description | -| :-------- | :---------------------------------------------------------------------- | :-------------------------------------------------- | -| `config?` | `Partial`<[`HypercertClientConfig`](modules.md#hypercertclientconfig)\> | The configuration options for the Hypercert client. | - -#### Defined in - -[sdk/src/types/client.ts:99](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L99) - ---- - -### HypercertEvaluatorConfig - -Ƭ **HypercertEvaluatorConfig**: `Omit`<`PartialTypedDataConfig`, `"address"`\> & { `easContractAddress`: `string` } - -Configuration options for the Hypercert evaluator. - -**`Note`** - -The signer is required for submitting evaluations. - -#### Defined in - -[sdk/src/types/client.ts:59](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L59) - ---- - -### HypercertStorageConfig - -Ƭ **HypercertStorageConfig**: `Object` - -Configuration options for the Hypercert storage layer. - -**`Note`** - -The API tokens are optional, but required for storing data on NFT.storage and Web3.storage. - -#### Type declaration - -| Name | Type | Description | -| :------------------ | :------- | :------------------------------ | -| `nftStorageToken?` | `string` | The API token for NFT.storage. | -| `web3StorageToken?` | `string` | The API token for Web3.storage. | - -#### Defined in - -[sdk/src/types/client.ts:48](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L48) - ---- - -### HypercertsSdkError - -Ƭ **HypercertsSdkError**: [`ConfigurationError`](classes/ConfigurationError.md) \| [`FetchError`](classes/FetchError.md) \| [`InvalidOrMissingError`](classes/InvalidOrMissingError.md) \| [`MalformedDataError`](classes/MalformedDataError.md) \| [`MintingError`](classes/MintingError.md) \| [`StorageError`](classes/StorageError.md) \| [`UnsupportedChainError`](classes/UnsupportedChainError.md) \| [`UnknownSchemaError`](classes/UnknownSchemaError.md) - -#### Defined in - -[sdk/src/types/errors.ts:173](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/errors.ts#L173) - ---- - -### QueryParams - -Ƭ **QueryParams**: `Object` - -#### Index signature - -▪ [key: `string`]: `any` - -#### Type declaration - -| Name | Type | -| :---------------- | :------------------ | -| `first` | `number` | -| `orderDirections` | `"asc"` \| `"desc"` | -| `skip` | `number` | - -#### Defined in - -[sdk/src/types/indexer.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/indexer.ts#L10) - ---- - -### SupportedChainIds - -Ƭ **SupportedChainIds**: `5` \| `10` - -#### Defined in - -[sdk/src/types/client.ts:10](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/client.ts#L10) - ---- - -### TransferRestrictions - -Ƭ **TransferRestrictions**: typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)[keyof typeof [`TransferRestrictions`](modules.md#transferrestrictions-1)] - -#### Defined in - -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) - -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) - -## Properties - -### ClaimByIdQuery - -• **ClaimByIdQuery**: `any` - -## Variables - -### INDEFINITE_DATE_STRING - -• `Const` **INDEFINITE_DATE_STRING**: `"indefinite"` - -#### Defined in - -[sdk/src/utils/formatter.ts:4](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L4) - ---- - -### TransferRestrictions - -• `Const` **TransferRestrictions**: `Object` - -Transfer restrictions for Hypercerts matching the definitions in the Hypercerts protocol - -**`Dev`** - -AllowAll: All transfers are allowed - -**`Dev`** - -DisallowAll: All transfers are disallowed - -**`Dev`** - -FromCreatorOnly: Only the creator can transfer the Hypercert - -#### Type declaration - -| Name | Type | -| :---------------- | :--- | -| `AllowAll` | `0` | -| `DisallowAll` | `1` | -| `FromCreatorOnly` | `2` | - -#### Defined in - -[sdk/src/types/hypercerts.ts:9](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L9) - -[sdk/src/types/hypercerts.ts:15](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/types/hypercerts.ts#L15) - -## Functions - -### execute - -▸ **execute**(`document`, `variables`, `context?`, `rootValue?`, `operationName?`): `Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> - -#### Parameters - -| Name | Type | -| :--------------- | :-------------------------------- | -| `document` | `GraphQLOperation`<`any`, `any`\> | -| `variables` | `any` | -| `context?` | `any` | -| `rootValue?` | `any` | -| `operationName?` | `string` | - -#### Returns - -`Promise`<`ExecutionResult`<`any`, `ObjMap`<`unknown`\>\>\> - -#### Defined in - -node_modules/@graphql-mesh/runtime/typings/types.d.ts:25 - ---- - -### formatDate - -▸ **formatDate**(`date`): `string` - -#### Parameters - -| Name | Type | -| :----- | :----- | -| `date` | `Date` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/utils/formatter.ts:13](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L13) - ---- - -### formatHypercertData - -▸ **formatHypercertData**(`«destructured»`): [`FormatResult`](modules/internal.md#formatresult) - -Formats input data to an object containing HypercertMetadata including appropriate labels - -#### Parameters - -| Name | Type | -| :----------------------- | :----------------------------------------------- | -| `«destructured»` | `Object` | -| › `contributors` | `string`[] | -| › `description` | `string` | -| › `excludedImpactScope` | `string`[] | -| › `excludedRights` | `string`[] | -| › `excludedWorkScope` | `string`[] | -| › `external_url?` | `string` | -| › `image` | `string` | -| › `impactScope` | `string`[] | -| › `impactTimeframeEnd` | `number` | -| › `impactTimeframeStart` | `number` | -| › `name` | `string` | -| › `properties?` | { `trait_type`: `string` ; `value`: `string` }[] | -| › `rights` | `string`[] | -| › `version` | `string` | -| › `workScope` | `string`[] | -| › `workTimeframeEnd` | `number` | -| › `workTimeframeStart` | `number` | - -#### Returns - -[`FormatResult`](modules/internal.md#formatresult) - -#### Defined in - -[sdk/src/utils/formatter.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L27) - ---- - -### formatUnixTime - -▸ **formatUnixTime**(`seconds`): `string` - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `seconds` | `number` | - -#### Returns - -`string` - -#### Defined in - -[sdk/src/utils/formatter.ts:5](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L5) - ---- - -### validateAllowlist - -▸ **validateAllowlist**(`data`, `units`): `Object` - -Validates the data for an allowlist. - -#### Parameters - -| Name | Type | Description | -| :------ | :---------------------------------------------- | :------------------------------------------ | -| `data` | [`AllowlistEntry`](modules.md#allowlistentry)[] | The data to validate. | -| `units` | `BigNumberish` | The total number of units in the allowlist. | - -#### Returns - -`Object` - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -| Name | Type | -| :------- | :------------------------------------------ | -| `errors` | `Record`<`string`, `string` \| `string`[]\> | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/validator/index.ts:91](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L91) - ---- - -### validateClaimData - -▸ **validateClaimData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :------------------------------------------------------- | :-------------------- | -| `data` | [`HypercertClaimdata`](interfaces/HypercertClaimdata.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:64](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L64) - ---- - -### validateDuplicateEvaluationData - -▸ **validateDuplicateEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a duplicate evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :--------------------------------------------------------- | :-------------------- | -| `data` | [`DuplicateEvaluation`](interfaces/DuplicateEvaluation.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:117](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L117) - ---- - -### validateMetaData - -▸ **validateMetaData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :----------------------------------------------------- | :-------------------- | -| `data` | [`HypercertMetadata`](interfaces/HypercertMetadata.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:38](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L38) - ---- - -### validateSimpleTextEvaluationData - -▸ **validateSimpleTextEvaluationData**(`data`): [`ValidationResult`](modules/internal.md#validationresult) - -Validates the data for a simple text evaluation. - -#### Parameters - -| Name | Type | Description | -| :----- | :----------------------------------------------------------- | :-------------------- | -| `data` | [`SimpleTextEvaluation`](interfaces/SimpleTextEvaluation.md) | The data to validate. | - -#### Returns - -[`ValidationResult`](modules/internal.md#validationresult) - -A `ValidationResult` object indicating whether the data is valid and any errors that were found. - -#### Defined in - -[sdk/src/validator/index.ts:142](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L142) - ---- - -### verifyMerkleProof - -▸ **verifyMerkleProof**(`root`, `signerAddress`, `units`, `proof`): `void` - -Verifies a Merkle proof for a given address and units. - -**`Throws`** - -If the Merkle proof verification fails. - -#### Parameters - -| Name | Type | Description | -| :-------------- | :------------- | :-------------------------------------- | -| `root` | `string` | The Merkle root hash to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish` | The units to verify. | -| `proof` | `string`[] | The Merkle proof to verify. | - -#### Returns - -`void` - -#### Defined in - -[sdk/src/validator/index.ts:170](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L170) - ---- - -### verifyMerkleProofs - -▸ **verifyMerkleProofs**(`roots`, `signerAddress`, `units`, `proofs`): `void` - -Batch verifies Merkle proofs for multiple roots, units and proofs for a single address - -**`Throws`** - -If the Merkle proof verification fails. - -**`Notice`** - -Wrapper around `verifyMerkleProof` to batch verify multiple proofs - -#### Parameters - -| Name | Type | Description | -| :-------------- | :--------------- | :---------------------------------------- | -| `roots` | `string`[] | The Merkle root hashes to verify against. | -| `signerAddress` | `string` | The address to verify. | -| `units` | `BigNumberish`[] | The units to verify. | -| `proofs` | `string`[][] | The Merkle proofs to verify. | - -#### Returns - -`void` - -#### Defined in - -[sdk/src/validator/index.ts:190](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L190) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md deleted file mode 100644 index d20a3804..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md +++ /dev/null @@ -1,307 +0,0 @@ -[Hypercerts SDK Documentation](../README.md) / [Exports](../modules.md) / internal - -# Module: internal - -## Table of contents - -### Classes - -- [default](../classes/internal.default.md) -- [default](../classes/internal.default-1.md) -- [default](../classes/internal.default-2.md) - -### Interfaces - -- [EvaluatorInterface](../interfaces/internal.EvaluatorInterface.md) -- [HypercertClaimdata](../interfaces/internal.HypercertClaimdata.md) -- [HypercertMinter](../interfaces/internal.HypercertMinter.md) - -### Type Aliases - -- [Claim](internal.md#claim) -- [ClaimByIdQuery](internal.md#claimbyidquery) -- [ClaimToken](internal.md#claimtoken) -- [ClaimTokenByIdQuery](internal.md#claimtokenbyidquery) -- [ClaimTokensByClaimQuery](internal.md#claimtokensbyclaimquery) -- [ClaimTokensByOwnerQuery](internal.md#claimtokensbyownerquery) -- [ClaimsByOwnerQuery](internal.md#claimsbyownerquery) -- [Exact](internal.md#exact) -- [FormatResult](internal.md#formatresult) -- [InputMaybe](internal.md#inputmaybe) -- [Maybe](internal.md#maybe) -- [OrderDirection](internal.md#orderdirection) -- [RecentClaimsQuery](internal.md#recentclaimsquery) -- [Scalars](internal.md#scalars) -- [ValidationResult](internal.md#validationresult) - -## Type Aliases - -### Claim - -Ƭ **Claim**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `contract` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `creation` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `creator?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"Bytes"``]\> | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `totalUnits?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"BigInt"``]\> | -| `uri?` | [`Maybe`](internal.md#maybe)<[`Scalars`](internal.md#scalars)[``"String"``]\> | - -#### Defined in - -[sdk/.graphclient/index.ts:275](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L275) - ---- - -### ClaimByIdQuery - -Ƭ **ClaimByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `claim?` | [`Maybe`](internal.md#maybe)<`Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>\> | - -#### Defined in - -[sdk/.graphclient/index.ts:985](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L985) - ---- - -### ClaimToken - -Ƭ **ClaimToken**: `Object` - -#### Type declaration - -| Name | Type | -| :---------- | :--------------------------------------------- | -| `chainName` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `claim` | [`Claim`](internal.md#claim) | -| `id` | [`Scalars`](internal.md#scalars)[``"String"``] | -| `owner` | [`Scalars`](internal.md#scalars)[``"Bytes"``] | -| `tokenID` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | -| `units` | [`Scalars`](internal.md#scalars)[``"BigInt"``] | - -#### Defined in - -[sdk/.graphclient/index.ts:287](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L287) - ---- - -### ClaimTokenByIdQuery - -Ƭ **ClaimTokenByIdQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimToken?` | [`Maybe`](internal.md#maybe)<`Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }\> | - -#### Defined in - -[sdk/.graphclient/index.ts:1015](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1015) - ---- - -### ClaimTokensByClaimQuery - -Ƭ **ClaimTokensByClaimQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :------------------------------------------------------------------------------------------------------------------ | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:1008](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L1008) - ---- - -### ClaimTokensByOwnerQuery - -Ƭ **ClaimTokensByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claimTokens` | `Pick`<[`ClaimToken`](internal.md#claimtoken), `"chainName"` \| `"id"` \| `"owner"` \| `"tokenID"` \| `"units"`\> & { `claim`: `Pick`<[`Claim`](internal.md#claim), `"id"` \| `"creation"` \| `"uri"` \| `"totalUnits"`\> }[] | - -#### Defined in - -[sdk/.graphclient/index.ts:995](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L995) - ---- - -### ClaimsByOwnerQuery - -Ƭ **ClaimsByOwnerQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:969](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L969) - ---- - -### Exact - -Ƭ **Exact**<`T`\>: { [K in keyof T]: T[K] } - -#### Type parameters - -| Name | Type | -| :--- | :--------------- | -| `T` | extends `Object` | - -#### Defined in - -[sdk/.graphclient/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L28) - ---- - -### FormatResult - -Ƭ **FormatResult**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------ | -| `data` | [`HypercertMetadata`](../interfaces/HypercertMetadata.md) \| `null` | -| `errors` | `Record`<`string`, `string`\> \| `null` | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/utils/formatter.ts:20](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/utils/formatter.ts#L20) - ---- - -### InputMaybe - -Ƭ **InputMaybe**<`T`\>: [`Maybe`](internal.md#maybe)<`T`\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:27](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L27) - ---- - -### Maybe - -Ƭ **Maybe**<`T`\>: `T` \| `null` - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Defined in - -[sdk/.graphclient/index.ts:26](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L26) - ---- - -### OrderDirection - -Ƭ **OrderDirection**: `"asc"` \| `"desc"` - -Defines the order direction, either ascending or descending - -#### Defined in - -[sdk/.graphclient/index.ts:507](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L507) - ---- - -### RecentClaimsQuery - -Ƭ **RecentClaimsQuery**: `Object` - -#### Type declaration - -| Name | Type | -| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `claims` | `Pick`<[`Claim`](internal.md#claim), `"chainName"` \| `"contract"` \| `"tokenID"` \| `"creator"` \| `"id"` \| `"owner"` \| `"totalUnits"` \| `"uri"`\>[] | - -#### Defined in - -[sdk/.graphclient/index.ts:978](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L978) - ---- - -### Scalars - -Ƭ **Scalars**: `Object` - -All built-in and custom scalars, mapped to their actual values - -#### Type declaration - -| Name | Type | -| :----------- | :-------- | -| `BigDecimal` | `any` | -| `BigInt` | `any` | -| `Boolean` | `boolean` | -| `Bytes` | `any` | -| `Float` | `number` | -| `ID` | `string` | -| `Int` | `number` | -| `Int8` | `any` | -| `String` | `string` | - -#### Defined in - -[sdk/.graphclient/index.ts:36](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/.graphclient/index.ts#L36) - ---- - -### ValidationResult - -Ƭ **ValidationResult**: `Object` - -The result of a validation. - -**`Property`** - -Whether the data is valid. - -**`Property`** - -A map of errors, where the key is the field that failed validation and the value is the error message. - -#### Type declaration - -| Name | Type | -| :------- | :---------------------------- | -| `errors` | `Record`<`string`, `string`\> | -| `valid` | `boolean` | - -#### Defined in - -[sdk/src/validator/index.ts:28](https://github.com/Network-Goods/hypercerts/blob/9677274/sdk/src/validator/index.ts#L28) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md deleted file mode 100644 index b591d11d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md +++ /dev/null @@ -1,12 +0,0 @@ -# Burning - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## Burning fraction tokens - -You can only burn fraction tokens that you own. Hypercert claims cannot be burned once minted. -You can get a list of all fraction tokens you own with [this query](./querying.md#claimtokensbyowner). - -```js -const txn = await hypercerts.burnFraction({ tokenId }); -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md deleted file mode 100644 index 0be153cb..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/config.md +++ /dev/null @@ -1,110 +0,0 @@ -# Hypercert Client Configuration - -The client provides a high level interface that communicates with the Graph, IPFS and the evm. For easy setup we harmonised the configuration into a flow that allows for configuration with different levels of specificity. - -## Configuration - -### Setup - -The SDK allows for minimal configuration, explicit overrides and defining values in environment variables. We apply the following hierarchy: - -1. Overrides declared in `Partial` - -Based on the chainID (either 5 or 10) we load the default config for Goerli or Optimism. - -We then process the rest of the overrides and possible environment variables to customise the default configuration. - -To get started quickly you can either: - -- initialize a new client by calling `new HypercertClient({chain: {id: 5})` (or 10) - -Using either of the options above will launch the client in `read only` mode using the defaults in [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) - -### Read-only mode - -The SDK client will be in read-only mode if any of the following conditions are true: - -- The client was initialized without an operator. -- The client was initialized with an operator without signing abilities. -- The contract address is not set. -- The storage layer is in read-only mode. - -If any of these conditions are true, the read-only property of the `HypercertClient` instance will be set to true, and a warning message will be logged indicating that the client is in read-only mode. - -### Defaults - -The [constants.ts](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/constants.ts) file defines various defaults constants that are used throughout the Hypercert system. - -`DEFAULT_CHAIN_ID`: This constant defines the default chain ID to use if no chain ID is specified. In this case, the -default chain ID is set to 5, which corresponds to the Goerli testnet. - -Based on `DEFAULT_CHAIN_ID` the SDK will select a `DEPLOYMENT`. - -`DEPLOYMENTS`: This constant defines the deployments that are managed by the Hypercert system. Each Deployment object -contains information about a specific deployment, including the chain ID, chain name, contract address, and graph name. - -For example: - -```json -{ - "5": { - "chainId": 5, - "chainName": "goerli", - "contractAddress": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "graphUrl": "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet" - } -} -``` - -You can select which deployment to use by either passing in a `chainId` configuration parameter or setting the `DEFAULT_CHAIN_ID` environment variable. We also allow for `overrides` -when creating the SDK by passing configuration variables. Finally, when not defaults or overrides are found, we check the environment variables. - -### Client config properties - -| Property | Type | Description | -| ------------------ | -------------------------- | -------------------------------------- | ------------------------------ | -| `chainId` | `number` | The chain ID of the network to use. | -| `chainName` | `string` | The name of the network to use. | -| `contractAddress` | `string` | The address of the Hypercert contract. | -| `graphUrl` | `string` | The url of the subgraph to use. | -| `operator` | `ethers.providers.Provider | ethers.Signer` | The provider or signer to use. | -| `nftStorageToken` | `string` | Your NFT.storage API key. | -| `web3StorageToken` | `string` | Your web3.storage API key. | - -- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) -- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) - -### Environment variables - -You can also configure the SDK via environment variables. If you set both the config parameter and environment variable, the config parameter will take precedent. - -We provide a [template file](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/.env.template) in our monorepo. - -| Environment Variable | Description | -| -------------------------------- | --------------------------------------------------------------------------------------------------- | -| `DEFAULT_CHAIN_ID` | Specifies the default chain ID to use if no chain ID is specified. | -| `CONTRACT_ADDRESS` | Specifies the contract address to use for the Hypercert protocol. | -| `PRIVATE_KEY` | Specifies the private key to use for signing transactions. | -| `NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata. | -| `NEXT_PUBLIC_NFT_STORAGE_TOKEN` | Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. | -| `WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data. | -| `NEXT_PUBLIC_WEB3_STORAGE_TOKEN` | Specifies the Web3.storage API token to use for storing Hypercert data in a Next.js application. | - -### Logging - -The logger for the SDK uses the log level based on the value of the LOG_LEVEL environment variable. The log level -determines which log messages are printed to the console. By default, the logger is configured to log messages with a -level of info or higher to the console. - -In your `.env` file: - -```bash -LOG_LEVEL="info" -``` - -The SDK logger supports four log levels: `error`, `warn`, `info`, and `debug`. - -- The `error` log level is used to log errors that occur in the SDK. -- The `warn` log level is used to log warnings that do not necessarily indicate an error, but may be important to investigate. -- The `info` log level is used to log general information about the SDK's state or behavior. -- The `debug` log level is used to log detailed information that is useful for debugging purposes. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md deleted file mode 100644 index 60f4e5e7..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md +++ /dev/null @@ -1,18 +0,0 @@ -# Errors in the SDK - -Generally, we follow the pattern of throwing on errors and letting those surface to the application. This allows for developers to handle any (un)expected errors in a manner they find suitable. - -### Handling Errors - -To support debugging we've implemented some custom errors. - -| Error | Reason | Payload | -| --------------------- | ------------------------------------------------- | ---------------------------- | --------- | -| ClientError | An error caused by the client | `{ [key: string]: unknown }` | -| FetchError | An error caused by a failed API call | `{ [key: string]: unknown }` | -| InvalidOrMissingError | An error caused by a missing environment variable | `{ keyName: string }` | -| MalformedDataError | An error caused by invalid or malformed data | `{ [key: string]: unknown }` | -| MintingError | An error caused by a failed EVM call to mint | `{ [key: string]: unknown }` | -| StorageError | An error caused by NFT-/Web3 Storage | `{ [key: string]: unknown }` | -| UnsupportedChainError | An error caused by an unsupported EVM chain ID | `{ chainID: string | number }` | -| UnknownSchemaError | An error caused by a missing validation schema | `{ schemaName: string }` | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md deleted file mode 100644 index c5399a4f..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md +++ /dev/null @@ -1,13 +0,0 @@ -# Evaluations - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## Respond / or contest an evaluation - -To create an evaluation of a hypercert - -```js -TODO; -``` - -_Note: Under the hood, we leverage the [Ethereum Attestation Service](https://attest.sh/) for creating evaluations_ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md deleted file mode 100644 index d5ff1226..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md +++ /dev/null @@ -1,57 +0,0 @@ -# Minting - -## Token design - -Hypercerts are semi-fungible tokens. -Thus, each hypercert is represented on-chain by a group of fraction tokens, -each representing a fraction of ownership over the hypercert. -If you want to split your fraction token, or merge multiple tokens into one, -check out the section on [splitting and merging](./split-merge.md). - -## Minting your first hypercert - -To mint a hypercert you need to provide the `metadata`, total amount of `units` and the preferred `TransferRestrictions`. -The resulting hypercert will be wholly owned by the creator. - -```js -import { TransferRestrictions, formatHypercertData } from "@hypercerts-org/sdk" - -const { metadata } = formatHypercertData(...); -const totalUnits = "10000"; - -const tx: Promise = await hypercerts.mintClaim({ - metadata, - totalUnits, - transferRestrictions: TransferRestrictions.FromCreatorOnly, -}); -``` - -> **Note** If you did not initialize your HypercertsClient with an `operator`, `nftStorageToken` and `web3StorageToken`, the client will run in [read-only mode](#read-only-mode) and this will fail. - -Let's see what happens under the hood: - -First, `mintClaim` checks that the client is not `read only` and that the operator is a `Signer`. If not, it throws an `InvalidOrMissingError`. - -Next, the function validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. The function then stores the metadata on `IPFS` using the `storeMetadata` method and returns the `CID` for the metadata. - -Finally, we call the mintClaim function on the contract with the signer `address`, total `units`, `CID`, and `transfer restriction` as parameters. If `overrides` are provided, the function uses them to send the transaction. Otherwise, it sends the transaction without overrides. - -## Transfer restrictions - -When minting a Hypercert, you must pass in a `TransferRestriction` policy. For now there are only 3 implemented policies: - -```js -enum TransferRestrictions { - // Unrestricted - AllowAll, - // All transfers disabled after minting - DisallowAll, - // Only the original creator can transfer - FromCreatorOnly -} -``` - -## Reference - -See the [code](https://github.com/hypercerts-org/hypercerts/tree/main/sdk/src/client.ts) -for more details on how we implement minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md deleted file mode 100644 index 98ebbb83..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/querying.md +++ /dev/null @@ -1,306 +0,0 @@ -# Querying - -## Overview - -The `HypercertClient` provides a high-level interface for interacting with the Hypercert ecosystem. The HypercertClient -has three getter methods: `storage`, `indexer`, and `contract`. These methods return instances of the HypercertsStorage, -HypercertIndexer, and HypercertMinter classes, respectively. - -```js -const { - client: { storage }, -} = new HypercertClient({}); -``` - -The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata off-chain on IPFS. It is used by the HypercertClient to store metadata when creating new Hypercerts. - -```js -const { - client: { indexer }, -} = new HypercertClient({}); -``` - -The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. -It is used by the HypercertClient to retrieve event-based data via the subgraph. - -```js -const { - client: { contract }, -} = new HypercertClient({}); -``` - -Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used -by the HypercertClient to create new Hypercerts and retrieve specific on-chain information. - -By providing instances of these classes through the `storage`, `indexer`, and `contract` getters, the HypercertClient allows developers to easily interact with the various components of the Hypercert system directly. -For example, a developer could use the storage instance to store metadata for a new Hypercert, the indexer instance to search for existing Hypercerts based on various criteria, and the contract instance to create new Hypercerts and retrieve existing Hypercerts from the contract. - -## Indexer - -For indexing purposes, we rely on the [Graph](https://thegraph.com/docs/en/) to index Hypercert events. To make the subgraph easily accessible with typed methods and object we wrap the [Graph Client](https://github.com/graphprotocol/graph-client) and its SDK. - -### Live graph playground - -To inspect the subgraph and explore queries, have a look at the Graph playground for Goerli testnet and Optimism mainnet: - -- [Goerli dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) -- [Optimism dashboard](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) - -### Graph client - -Since the client is fully typed, it's easy to explore the functionalities using code completion in IDEs. - -Here's one example from our frontend where we let [react-query](https://www.npmjs.com/package/%2540tanstack/react-query) frequently update the call to the graph: - -```js -import { useHypercertClient } from "./hypercerts-client"; -import { useQuery } from "@tanstack/react-query"; - -export const useFractionsByOwner = (owner: string) => { - const { - client: { indexer }, - } = useHypercertClient(); - - return useQuery( - ["hypercerts", "fractions", "owner", owner], - () => indexer.fractionsByOwner(owner), - { enabled: !!owner, refetchInterval: 5000 }, - ); -}; -``` - -### Queries: Claims - -These tables show the input parameters and output fields for each of the GraphQL queries in [claims.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/claims.graphql). -A claim represents 1 Hypercert and all of the common data across all claim/fraction tokens. - -#### `ClaimsByOwner` - -The `ClaimsByOwner` query retrieves an array of claims that belong to a specific owner. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------- | ------------- | -| `owner` | `Bytes` | The address of the owner whose claims to retrieve. | "" | -| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | -| `first` | `Int` | The number of claims to retrieve. | `100` | -| `skip` | `Int` | The number of claims to skip. | `0` | - -##### Output - -The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -#### `RecentClaims` - -The RecentClaims query retrieves an array of the most recent claims on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | ---------------------------------- | ------------- | -| `orderDirection` | `OrderDirection` | The direction to order the claims. | `asc` | -| `first` | `Int` | The number of claims to retrieve. | `100` | -| `skip` | `Int` | The number of claims to skip. | `0` | - -##### Output - -The query returns an array of claim objects that match the input parameters. Each claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -#### `ClaimByID` - -The ClaimById query retrieves a single claim by its ID on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | -| --------- | ----- | -------------------------------- | -| `id` | `ID!` | The ID of the claim to retrieve. | - -##### Output - -The query returns a claim object that matches the input parameter. The claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `contract` | `Bytes` | The address of the contract. | -| `tokenID` | `String` | The token ID. | -| `creator` | `Bytes` | The address of the creator. | -| `id` | `ID` | The ID of the claim. | -| `owner` | `Bytes` | The address of the owner. | -| `totalUnits` | `BigInt` | The total number of units. | -| `uri` | `String` | The URI of the claim metadata. | - -### Queries: Fractions - -These tables show the input parameters and output fields for each of the GraphQL queries in [fractions.graphql](https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/fractions.graphql). -A claim token represents a fraction of ownership of a Hypercert. - -#### `ClaimTokensByOwner` - -The `ClaimTokensByOwner` query retrieves an array of claim tokens that belong to a specific owner on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | -| `owner` | `Bytes` | The address of the owner whose claim tokens to retrieve. | "" | -| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | -| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | -| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | - -##### Output - -The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ------------------------------------------ | -| `chainName` | `String` | The name of the chain. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | - -The Claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ------------------------------------ | -| `id` | `ID` | The ID of the claim. | -| `creation` | `Int` | The timestamp of the claim creation. | -| `uri` | `String` | The URI of the claim metadata. | -| `totalUnits` | `BigInt` | The total number of units. | - -#### `ClaimTokensByClaim` - -The `ClaimTokensByClaim` query retrieves an array of claim tokens that belong to a specific claim on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | Default Value | -| ---------------- | ---------------- | -------------------------------------------------------------------- | ------------- | -| `claimId` | `String!` | The ID of the claim whose claim tokens to retrieve. | None | -| `orderDirection` | `OrderDirection` | The direction to order the claim tokens. The default value is `asc`. | `asc` | -| `first` | `Int` | The number of claim tokens to retrieve. The default value is `100`. | `100` | -| `skip` | `Int` | The number of claim tokens to skip. The default value is `0`. | `0` | - -##### Output - -The query returns an array of claim token objects that match the input parameters. Each claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | - -#### `ClaimTokenById` Query - -The `ClaimTokenById` query retrieves a single claim token by its ID on the Hypercert platform. - -##### Input - -The query takes the following input parameters: - -| Parameter | Type | Description | -| --------- | ----- | -------------------------------------- | -| `id` | `ID!` | The ID of the claim token to retrieve. | - -##### Output - -The query returns a claim token object that matches the input parameter. The claim token object has the following fields: - -| Field | Type | Description | -| ----------- | -------- | ---------------------------------------------- | -| `chainName` | `String` | The name of the chain the claim was minted on. | -| `id` | `ID` | The ID of the claim token. | -| `owner` | `Bytes` | The address of the owner. | -| `tokenID` | `String` | The token ID. | -| `units` | `BigInt` | The number of units. | -| `claim` | `Claim` | The claim associated with the claim token. | - -The Claim object has the following fields: - -| Field | Type | Description | -| ------------ | -------- | ------------------------------------ | -| `id` | `ID` | The ID of the claim. | -| `creation` | `Int` | The timestamp of the claim creation. | -| `uri` | `String` | The URI of the claim metadata. | -| `totalUnits` | `BigInt` | The total number of units. | - -## Storage - -### Hypercert Metadata - -Currently, all metadata is stored off-chain in IPFS. Use the `storage` client to retrieve the metadata - -```js -const claimId = "0x822f17a9a5eecfd...85254363386255337"; -const { indexer, storage } = hypercertsClient; -// Get the on-chain claim -const claimById = await indexer.claimById(claimId); -// Get the off-chain metadata -const metadata = await storage.getMetadata(claimById.claim.uri); -``` - -## Contract - -### Typechain bindings - -We export the [typechain](https://github.com/dethcrypto/TypeChain) bindings, -which you can import and use from your TypeScript/JavaScript codebase. - -For example: - -```js -import { ethers } from "ethers"; -import { - HyperCertMinterFactory, - HypercertMinterABI, - IHypercertTokenABI, -} from "@hypercerts-org/sdk"; - -const provider = new ethers.getDefaultProvider(network); -const contractInterface = new ethers.utils.Interface(HypercertMinterABI); -const contract = new ethers.Contract( - contractAddress, - HypercertMinterABI, - provider, -); -const metadataUri = await contract.functions.uri(tokenId); -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md deleted file mode 100644 index 936cc05b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md +++ /dev/null @@ -1,101 +0,0 @@ -# Getting started with JavaScript - -The Hypercerts SDK makes it easy to integrate Hypercerts into your application or backend with JavaScript/TypeScript. - -## Installation - -Install the SDK using npm or yarn: - -```bash -npm install @hypercerts-org/sdk -# OR yarn add @hypercerts-org/sdk -``` - -## Get storage credentials (only required for minting) - -For now, we store all metadata (e.g. Hypercert claim data) on IPFS using [NFT.Storage](https://nft.storage/) and [web3.storage](https://web3.storage/). - -In order to mint a Hypercert, you will need to create API tokens for both services, which you can learn more about from their respective guides: - -- [Get an NFT.Storage API token](https://nft.storage/docs/#get-an-api-token) -- [Get a web3.storage API token](https://web3.storage/docs/how-tos/generate-api-token/) - -_Note: In the future, we want to also support other mechanisms for storing off-chain data._ - -## Initialize - -Import the SDK into your project and create a new instance of `HypercertClient` with your configuration options: - -```js -import { HypercertClient } from "@hypercerts-org/sdk"; -import { ethers } from "ethers"; - -// NOTE: you should replace this with your own JSON-RPC provider to the network -// This should have signing abilities and match the `chainId` passed into HypercertClient -const operator = ethers.providers.getDefaultProvider("goerli"); - -const client = new HypercertClient({ - chainId: 5, // goerli testnet - operator, - nftStorageToken, - web3StorageToken, -}); -``` - -Hypercerts is a multi-chain protocol. -See [here](./supported-networks.md) for a list of currently supported networks. - -> **Note** If there's no `operator`, `nftStorageToken` or `web3StorageToken` provided, the client will run in [read-only mode](#read-only-mode). - -## Make a Hypercert - -Use the client object to interact with the Hypercert network. For example, you can use the `client.mintClaim` method to create a new claim: - -```js -import { - formatHypercertData, - TransferRestrictions, -} from "@hypercerts-org/sdk"; - -// Validate and format your Hypercert metadata -const { data: metadata, valid, errors } = formatHypercertData({ - name, - ... -}) - -// Check on errors -if (!valid) { - return console.error(errors); -} - -// Set the total amount of units available -const totalUnits: BigNumberish = 10_000_000 - -// Define the transfer restriction -const transferRestrictions: TransferRestrictions = TransferRestrictions.FromCreatorOnly - -// Mint your Hypercert! -const tx = await client.mintClaim( - metadata, - totalUnits, - transferRestrictions, -); -``` - -For guidance on how to specify your metadata, see the [minting guide](../minting-guide/step-by-step.md). -This will validate the metadata, store claim metadata on IPFS, create a new hypercert on-chain, and return a transaction receipt. - -For more details, check out the [Minting Guide](./minting.md). - -## Query for Hypercerts - -You can also use the client to query the subgraph and retrieve which claims an address owns: - -```js -const claims = await client.indexer.fractionsByOwner(owner), -``` - -For more details, checkout the [Querying guide](./querying.md) -and our [Graph playground](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet). - -That's it! With these simple steps, you can start using the Hypercert SDK in your own projects. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md deleted file mode 100644 index 409a1e9d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md +++ /dev/null @@ -1,41 +0,0 @@ -# Getting started with Solidity - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -If you need the Solidity contracts or interfaces exported from the SDK, -please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). - -## Hypercerts deployments - -Hypercerts is a multi-chain protocol and we want to support any network that wants to make positive impact. -We plan to support at most 1 canonical contract deployment per network. -For a complete list of deployments and their contract addresses, see [Supported Networks](./supported-networks.md). - -## Installing the Hypercert contracts - -```bash -npm install @hypercerts-org/contracts -# or yarn add @hypercerts-org/contracts -``` - -## Using the Solidity interface - -If you want to call the Hypercerts contract on your network directly from Solidity, -we export the interface/ABI for you to use from your contract. - -```js -import { IHypercertToken } from "@hypercerts-org/contracts/IHypercertMinter.sol"; - -contract MyContract { - IHypercertToken hypercerts; - - function initialize(address _addr) public virtual initializer { - hypercerts = IHypercertToken(_addr); - } - - function uri(uint256 tokenID) public view returns (string memory _uri) { - _uri = hypercerts.uri(tokenID); - } -} - -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md deleted file mode 100644 index 1ac5556e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md +++ /dev/null @@ -1,29 +0,0 @@ -# Split and Merge - -> :construction: **NOTE**: This is a work-in-progress and may not be fully functioning yet. - -## By Token Value - -### Split / merge token values - -```js -const { tokenIds } = await hypercerts.splitFraction({ - tokenId, - units: [10, 12, 15], -}); -const { tokenId } = await hypercerts.mergeFractions({ tokenIds }); -``` - -## By Claim Data - -### Split / merge claim data - -```js -const { claimIds } = await hypercerts.splitClaim({ - claimId, - TODO: somehow specify hypercert subregions -}); -const { claimId} = await hypercerts.mergeClaims({ - claimIds, -}); -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md b/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md deleted file mode 100644 index 3bfd0f18..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md +++ /dev/null @@ -1,13 +0,0 @@ -# Supported networks - -Hypercerts is developed in public and released under [Apache license](https://github.com/hypercerts-org/hypercerts/blob/main/LICENSE). The Hypercert Foundation currently rolled out on two networks: Goerli for testing and Optimism as the production deployment. - -We want to support every network that wants to support positive impact! -If you want to see Hypercerts deployed on another network, please reach out by [filing an issue](https://github.com/hypercerts-org/hypercerts/issues). - -## Overview - -| Chainname | ChainID | Hypercerts Minter (UUPS Proxy) | Subgraph | Notes | -| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | -| Goerli | 5 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) | Testnet | -| Optimism | 10 | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) | Production | diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md deleted file mode 100644 index 72b3ee2d..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md +++ /dev/null @@ -1,120 +0,0 @@ -# Deploy a new proxy contract - -This should be done only on rare occasions. For example, when: - -- We want to deploy to a new network -- We have updated the contract in a way that is _NOT_ backwards-compatible. - - For most upgrades, please use UUPS [upgrades](./upgrade.md). - -## Smart Contracts - -### Setup the `contracts/` environment - -Navigate to `contracts/`. Configure your `.env` file by following the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/contracts#setup). - -### Build and deploy the smart contracts - -If you are deploying on a new network, configure `contracts/hardhat.config.ts` to support the new network under the `networks` key. - -```javascript - "optimism-goeri": getChainConfig("optimism-goerli"), -``` - -Build the contracts and deploy. Specify the network to match the key used in `hardhat.config.ts`. - -```sh -# Run in contracts/ -yarn build:hardhat -yarn hardhat deploy --network NETWORK -``` - -This will output the new proxy address. Update the root `README.md` with this new address. - -Now transfer ownership over the proxy contract to the multisig: - -```sh -yarn hardhat transfer-owner --network NETWORK --proxy PROXY_CONTRACT_ADDRESS --owner MULTISIG_ADDRESS -``` - -## Subgraph - -### Setup the `graph/` environment - -Navigate to `graph/`. Follow the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/graph#setup) -to get set up. - -### Deploy the subgraph - -Update `graph/networks.json` with the new proxy address. To speed up indexing, you set the `startBlock` to the block containing the contract creation. We can add multiple networks that are monitored by the same subgraph. For more details, see the [Graph documentation](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#deploying-the-subgraph-to-multiple-ethereum-networks). - -Now deploy the subgraph - -```sh -# Run in graph/ -yarn build -yarn deploy:hosted -``` - -## OpenZeppelin Defender - -### Create a new Supabase table - -Log into the [Supabase dashboard](https://app.supabase.com/). -We store all data in a single project, but use different tables for each network. -The table name should be suffixed by the network (e.g. `allowlistCache-goerli`). -If you are deploying to a new network, create a new table. You can copy the table schema and RLS policy from another pre-existing table. - -If you are deploying a new proxy contract to a network for which you already have another deployment, you'll have to make a judgement call as to whether you can reuse the existing table, whether you need to clear the existing table, or create another table. - -Note: We want to merge all the tables in this [issue](https://github.com/hypercerts-org/hypercerts/issues/477). - -### Update the OpenZeppelin Defender scripts - -Modify the Defender scripts to support the new network in `defender/src/networks.ts`. - -If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. - -Note: The entry point for deployment is in `defender/src/setup.ts`. - -### Setup the `defender/` environment - -Navigate to `defender/`. Follow the instructions in the -[README](https://github.com/hypercerts-org/hypercerts/tree/main/defender#setup) -to get set up. - -### Deploy defender scripts - -Deploy to OpenZeppelin Defender via - -```sh -# Run in defender/ -yarn deploy -``` - -## Hypercerts SDK - -TODO: Flesh this out - -Run the build in `contracts/`. - -(Soon to be deprecated) Publish `contracts/` to npm - -Configure the SDK to support the new network via the graphclient. - -Publish SDK to npm - -## Deploy the Dapp frontend - -Each frontend build is configured to run on a different network (e.g. `https://testnet.hypercerts.org`). You can use any CDN to serve the site (e.g. Netlify, Vercel, GitHub Pages, Cloudflare Pages, Fleek, Firebase Hosting). - -1. Configure your build environment with the environment variables specified in `frontend/.env.local.example`. - -2. Configure your builds to the following settings: - -- Build command: `yarn build:site` -- Build output directory: `/build` -- Root directory: `/` - -3. Configure the domain that you want for your build. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md deleted file mode 100644 index 05dc5b0c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md +++ /dev/null @@ -1,45 +0,0 @@ -# Errors - -## Deploying - -### Artifact for contract "HypercertMinter" not found - -#### Error message - -`Error HH700: Artifact for contract "HypercertMinter" not found.` - -#### Cause - -Attempting to deploy a contract with `npx hardhat deploy` before the contract has been compiled by hardhat. Contracts compiled by forge are currently not visible to hardhat (this could be a configuration problem). - -### insufficient funds for intrinsic transaction cost - -#### Error message - -`Error: insufficient funds for intrinsic transaction cost` - -#### Cause - -The environment variable `MNEMONIC` is not configured correctly. - -Alternatively, the wallet may not have enough funds for the selected network - -Causing pause twice - -Error: cannot estimate gas; transaction may fail or may require manual gas limit - -reason: 'execution reverted: Pausable: paused', - -#### Etherscan API - -Note: It can take between 5-10 minutes before a newly created etherscan API key becomes valid for queries to goerli. - -When using an etherscan API key that was too recently created, hardhat tasks using etherscan to verify transactions will exit with an error message: - -`Etherscan returned with message: NOTOK, reason: Invalid API Key` - -Despite this error the transaction may have succeeded, the hardhat task just can't confirm it. - -It is unknown if this is a problem for queries to mainnet as well. - -Metamask makes it very difficult to have multiple wallets. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md deleted file mode 100644 index 9b208595..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# DevOps - -We use this playbook to encapsulate our practices and current setup. - -## Setup dev environment - -- [Setup guide](./setup.md) -- [Plasmic setup](./plasmic.md) - -## Tasks - -- [Deploy new proxy contract](./deploy-proxy.md) -- [Upgrade contract](./upgrade.md) -- [Pause contract](./pause.md) - -## FAQ - -- [Common errors](./errors.md) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md deleted file mode 100644 index 2668f51e..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md +++ /dev/null @@ -1,29 +0,0 @@ -# Pause / Unpause - -## Pause - -### Contract owned by an address - -Make sure you have set up your wallets and config from the [setup guide](./setup.md). - -To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: - -```sh -yarn hardhat pause --network NETWORK --address CONTRACT_ADDRESS -``` - -### Contract owned by a multi-sig - -If we transferred ownership to a multisig, we can use -[OpenZeppelin Defender Admin](https://defender.openzeppelin.com/#/admin) -to propose a pause to be approved by the multisig. - -## Unpause - -Make sure you have set up your wallets and config from the [setup guide](./setup.md). - -To pause the contract, run the following, where `CONTRACT_ADDRESS` is the proxy address of the HypercertMinter, and `NETWORK` is one of the networks from `hardhat.config.ts`: - -```sh -yarn hardhat unpause --network NETWORK --address CONTRACT_ADDRESS -``` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md deleted file mode 100644 index 10e52f5b..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md +++ /dev/null @@ -1,76 +0,0 @@ -# Plasmic setup - -## HypercertImage - -### Props - -hideImpact - -``` -$ctx.currentForm.impactTimeEnd === "indefinite" && ($ctx.currentForm.impactScopes.length === 0 || ($ctx.currentForm.impactScopes.length === 1 && $ctx.currentForm.impactScopes[0] === "all")) -``` - -color - -``` -$ctx.currentForm.backgroundColor -``` - -vectorart - -``` -$ctx.currentForm.backgroundVectorArt -``` - -### Slots - -logoImage Image URL - -``` -$ctx.currentForm.logoUrl -``` - -title Content - -``` -$ctx.currentForm.name -``` - -workPeriod Content - -``` -`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.workTimeEnd.format ? $ctx.currentForm.workTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.workTimeEnd}` -``` - -bannerImage Image URL - -``` -$ctx.currentForm.bannerUrl -``` - -impactPeriod Content - -``` -`${$ctx.currentForm.workTimeStart.format ? $ctx.currentForm.workTimeStart.format("YYYY-MM-DD") : $ctx.currentForm.workTimeStart} → ${$ctx.currentForm.impactTimeEnd.format ? $ctx.currentForm.impactTimeEnd.format("YYYY-MM-DD") : $ctx.currentForm.impactTimeEnd}` -``` - -#### workScopes: repeated ScopeChip - -Collection - -``` -$ctx.currentForm.workScopes.split(/[,\n]/).map(i => i.trim()).filter(i => !!i) -``` - -Element name: `currentWorkScope` -Index name: `currentIndex` -Color variant: `$ctx.currentForm.backgroundColor` -Content: `currentWorkScope` - -#### impactScopes: repeated ScopeChip - -Collection: `$ctx.currentForm.impactScopes` -Element name: `currentImpactScope` -Index name: `currentIndex` -Color variant: `$ctx.currentForm.backgroundColor` -Content: `currentImpactScope` diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md deleted file mode 100644 index afb95296..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md +++ /dev/null @@ -1,41 +0,0 @@ -# Setup - -## Pre-requisites - -1. Install [NodeJS](https://nodejs.org/en/) and [git](https://git-scm.com/) -2. Install [yarn](https://classic.yarnpkg.com/) - -```sh -npm install --global yarn -``` - -3. Clone the repository: - -``` -git clone git@github.com:hypercerts-org/hypercerts.git -cd hypercerts -``` - -4. Install dependancies: - -To install dependencies across all projects in the monorepo workspace: - -```sh -yarn install -``` - -## Setup your wallets - -We need 2 wallets: a multi-sig for administering the contracts, and a hot wallet for setting everything up. - -1. We use a [Gnosis Safe](https://app.safe.global/) multisig for managing and administering the contracts. Set one up with your desired confirmation threshold (e.g. 2 of 3). This wallet will not require any balance. -2. Separately, set up a wallet that we'll use in our developer scripts. - -- If you don't have one, you can goto `contracts/` and run `yarn hardhat generate-address`. -- Make sure there is enough balance in this account to deploy the contract and transfer ownership to the multisig - - [Goerli Faucet](https://goerlifaucet.com/) - - [Optimism Bridge](https://app.optimism.io/bridge/deposit) - -## Next Steps - -Depending on what you want to do (e.g. in `./sdk/` or `./frontend/`), there will be further setup instructions in the respective `README.md` file. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md b/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md deleted file mode 100644 index 820255e7..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md +++ /dev/null @@ -1,35 +0,0 @@ -# Upgrading the contract - -## Validate upgrade - -Validate contract upgradeability against deployment. - -For example, for the `goerli` deployment: - -```sh -yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS -``` - -## Propose Upgrade - -Propose an upgrade via OpenZeppelin Defender. For more information, see this -[guide](https://docs.openzeppelin.com/defender/guide-upgrades) - -For example, for the `goerli` deployment: - -```sh -yarn build:hardhat -yarn hardhat propose-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS -``` - -This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. - -## Publish to npm - -After you update the contracts, deploy the `contracts/` package to npm. - -TODO - -Update the dependencies in `frontend/package.json` and `sdk/package.json`. - -If the ABI of the contract has changed, make sure you also update `defender/src/HypercertMinterABI.ts`. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/faq.md b/docs/versioned_docs/version-1.0.0-alpha.1/faq.md deleted file mode 100644 index b9659b5a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/faq.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Frequently Asked Questions -id: faq ---- - -# FAQs - -### How do I create a hypercert? - -We've created a step-by-step guide in the documents, which you can find [here](minting-guide/minting-guide-start). - -### Who gets to claim my hypercert? - -There are currently two types of users who are eligible to claim your hypercert. - -1. You as the creator of the hypercert are eligible to claim your hypercert. For projects with an allow list, you are eligible to claim 50% of the total tokens. For projects with no allow list, you will receive 100% of the tokens automatically and can do whatever you like with them. - -2. Anyone on the hypercert's allow list will be eligible to claim your hypercert. The allow list is stored and the time of minting and allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions through a separate contract interaction. Creators often use allow lists be used to allocate fractions to previous funders and contributors. - -### How do I claim a hypercert? Can I claim all of the ones I’m eligible for at once? - -After you connect your wallet, you will see a dashboard of hypercerts that you can claim. You can either claim them individually or in a batch transaction. Note that if you perform the batch transaction you will automatically claim _all_ hypercerts you are allow-listed for. (You still pay a gas fee for each claim, however.) If you don't want to claim _all_ at once, then you should claim them one-by-one. - -### What token standard do hypercerts utilize? - -The interface supports both ERC-1155s and 721s. Our current implementation makes use of [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) (a semi-fungible token). - -### What are the required fields to generate a hypercert? - -There are six required fields: - -1. Set of contributors: An ordered list of all contributors, who claim to do or have done the work described by this hypercert. -2. Scope of work: A conjunction of potentially-negated work scope tags, where an empty string means “all”. -3. Time of work: A date range, from the start to the end of the work being claimed by this hypercert. -4. Scope of impact: A conjunction of potentially-negated impact scope tags, where an empty string means “all”. -5. Time of impact: Date ranges from the start to the end of the impact. -6. Rights of the owners: An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. - -Hypercerts also need a name and description. - -### What should I put for my hypercert's work scope? - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -### Are hypercerts the same as impact evaluations? - -No. A hypercert is a claim over a discrete piece of work and the impact that may result from that work. It has no opinion about the legitimacy or quality of the claim. - -An impact evaluation is an opinionated assessment about the legitimacy or quality of a claim. - -For example, a hypercert might represent "Planting trees in the Amazon in 2022". An impact evaluation might point to that hypercert and assert the percent of trees that survived, the amount of CO2 removed by the trees, or the income change among people living around the project. - -Over time, the expectation is that hypercerts that attract multiple, high quality, credibly neutral impact evaluations will be more relevant than ones that do not. - -### What can I do with my hypercert? - -The `rights` dimension specific what an owner can do with their hypercert. Currently, the only `right` that owners have is "Public Display". Over time, we hope the protocol can support various `rights` including transfers, intellectual property, tax-deductibility, carbon offsets, ESG reporting, and more. - -### How is a hypercert different than a POAP or Impact NFT? - -Hypercerts have some things in common with certain POAPs or Impact NFTs, but also a number of crucial differences. - -First, all POAPs and most Impact NFTs are implemented as non-fungible tokens (ERC-721s). Hypercerts are currently being implemented as semi-fungible tokens (ERC-1155s), meaning it is possible to own more than one unit or fraction of a given hypercert. This makes it easy and intuitive to display the share of hypercerts that a given owner has. - -Second, hypercerts have specific metadata requirements and interpretation logic. These include a standard schema for how the six required hypercert dimensions are defined and captured (i.e., work scopes, impact scopes, timeframes, contributors, etc) as well as logic for how to interpret different inputs (e.g., how to include or exclude certain work scopes, create an indefinite time period, etc). POAPs have a completely different schema. Although there is no standard schema for Impact NFTs, an Impact NFT project could choose to adopt the hypercert standard and token interface and thereby achieve compatibility. - -Third, the hypercerts token interface is intended to support several functions that are not possible out of the box with other token standards, chiefly, atomic split and merge capabilities. We also expect other protocols to work with hypercerts for the purposes of prospective and retrospective funding, contributor verification, and impact evaluation. - -For certain use cases, POAPs may be better suited for projects as hypercerts are focused on the funding aspect of impactful work. - -### Where can I purchase a hypercert? - -Currently, it is only possible to purchase a hypercert from a creator or project. This can be facilitated directly by the project or via a third-party marketplace like OpenSea. Currently, hypercerts cannot be resold on secondary markets. - -### What chain(s) is hypercerts running on? - -The hypercerts smart contracts have been deployed on Optimism and Goerli Testnet. We plan to support various EVM chains in the near future. - -### How do I bridge to Optimism? - -There are various bridging services including the official [Optimism Bridge](https://app.optimism.io/bridge/deposit). Note that bridging assets from Ethereum to Optimism will incur a gas fee. - -### How much gas will it cost to create or claim a hypercert? - -In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). Claiming a hypercert should be below 0.0001 ETH or less than $0.10 on Optimism. - -### How do I create a hypercert from a multisig? - -If you are creating a hypercert on Optimism, then you will need an Optimism-based multisig. (Unfortunately, Safe wallets created on Ethereum won't work on Optimism.) - -### Have the smart contracts been audited? - -Yes. The auditor's security report is available [here](https://github.com/pashov/audits/blob/master/solo/Hypercerts-security-review.md). - -### How is the allow list generated? - -For Gitcoin projects, an allow list is generated from a snapshot of all of the on-chain funding received by the project. - -The queries used to generate the allow lists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -Once the snapshot is taken, the formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. - -For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.96 donated --> 1 fraction -- $0.52 donated --> 0 fractions - -### Why am I not on the allow list even though I contributed to the project? - -If you contributed less than $1 DAI to a project, then you will not be eligible to claim a hypercert fraction. - -### I supported a project. Why I don't I see the hypercert in my dashboard? - -In order to your hypercert to appear as "claimable", the project needs to mint the hypercert first. If the project has not minted its hypercert yet, then you will not be able to claim it. We suggest you check back in a few days to see if the project has created the hypercert and is now claimable. - -If the project has created its hypercert, then please try the following solutions: - -1. Confirm the wallet address is correct (some users have multiple wallet addresses and forget which one they donated with) -2. Check that your wallet is included in the Dune Dashboards for each Gitcoin Round - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -3. Confirm you donated more than $1 DAI to the project. - -If the project has created its hypercert, and you have confirmed items 1-3, then please send us a DM over Twitter or Telegram with your wallet address and we will get back to you promptly. - -### How do I retire a hypercert? - -We don't yet have a frontend for retiring hypercerts but you can do this by interacting directly with the smart contract on Etherscan. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md b/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md deleted file mode 100644 index 86c25331..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Further Resources -id: further-resources ---- - -# Papers, Articles, Presentations - -## Writings - -- Feb 14, 2023, Whitepaper draft by [@hypercerts](http://twitter.com/hypercerts): [Hypercerts: A new primitive for impact funding systems (draft v0)](../static/pdf/hypercerts_whitepaper_v0.pdf) -- Aug 24, 2022, Blogpost by [@holkeb](https://twitter.com/holkeb): [Hypercerts: A new primitive for public goods funding](https://protocol.ai/blog/hypercert-new-primitive/) -- Jun 2022, Tech report (draft) by [@davidad](https://twitter.com/davidad): [Hypercerts; an Interoperable Datalayer for Impact-Funding Mechanisms](../static/pdf/hypercerts_Tech_Report_draft.pdf) - -## Talks - -#### Jun 24, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Hypercerts: on-chain primitives for impact markets](https://youtu.be/2hOhOdCbBlU) - - - -#### Jun 23, 2022, Conversation between [@emiyazono](http://twitter.com/emiyazono) and [@owocki](http://twitter.com/owocki) at GreenPill Podcast: [Impact Certificates | Evan Miyazono, Head of Research at Protocol Labs | Green Pill #21](https://youtu.be/kyo5SxtSJ9U) - - - -#### Mar 4, 2022, Talk at [Funding the Commons](https://fundingthecommons.io/) by [@davidad](https://twitter.com/davidad): [Interoperable mechanisms for non-rival goods (Hypercerts)](https://youtu.be/acbBeGcevok) - - - -## Other resources - -Overview of some previous writings on impact certificates, retrospective funding and impact markets: - -- Christiano, Paul (2014) Certificates of impact, Rational Altruist, [https://rationalaltruist.com/2014/11/15/certificates-of-impact/](https://rationalaltruist.com/2014/11/15/certificates-of-impact/) -- Christiano, Paul & Katja Grace (2015) The Impact Purchase, [https://impactpurchase.org/why-certificates/](https://impactpurchase.org/why-certificates/) -- Optimism & Buterin, Vitalik (2021) Retroactive Public Goods Funding, [https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c) -- Cotton-Barratt, Owen (2021), Impact Certificates and Impact Markets, Funding the Commons November 2021, [https://youtu.be/ZiDV56o5M7Q](https://youtu.be/ZiDV56o5M7Q) -- Drescher, Denis (2022) Towards Impact Markets, [https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1](https://forum.effectivealtruism.org/posts/7kqL4G5badqjskYQs/toward-impact-markets-1) -- Ofer & Cotton-Barratt, Owen (2022) Impact markets may incentivize predictably net-negative projects, [https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6](https://forum.effectivealtruism.org/posts/74rz7b8fztCsKotL6) diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md deleted file mode 100644 index b2451310..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Glossary -id: glossary -sidebar_position: 3 ---- - -# Glossary of Hypercerts Terms - -## Main Terms - -### Allowlist - -A list that determines how fractions of hypercerts will be allocated to new owners. The current implementation requires a project to specify an allowlist at the time of minting its hypercert. Based on allowlists, designated new owners are able to claim their fractions. - -### Claiming a fraction - -Transferring the ownership of a fraction of a hypercert to a (new) owner. Generally 'claiming' implies minting a new token that represents said fraction by the new owner. - -### Contributor - -An individual or organization that performs some or all of the work described in a hypercert. - -### Creating a hypercert - -Synonymous to minting a hypercert. - -### Fraction - -A token that represents a quantified proportion of a hypercert denominated in units. - -### Funder - -Individual, organization, or algorithm that funds work. There are generally two types: (1) **prospective** funders, who fund work _before_ it is done, and (2) **retrospective** funders, who fund work _after_ it is done. - -### Hypercert - -A token that (1) accounts for work by specified contributors that is supposed to be impactful, (2) represents the – potentially explicitly specified – impact of this work, and (3) assigns right over this work to its owners. If a hypercert is split into multiple fractions, the hypercert refers to the sum of all of its fractions. The term `hypercert` may also refer to an implementation of the hypercert interface and standard. - -### Hypercerts interface - -The hypercerts [contract interface](https://github.com/hypercerts-org/hypercerts/blob/main/contracts/src/interfaces/IHypercertToken.sol), which declares the required functionality for a hypercert token. The current interface includes functions for minting, burning, splitting, and merging of hypercert tokens. - -### Hypercerts implementation - -An implementation that builds on top of the hypercerts interface and conforms to the hypercerts standard. For instance, our initial implementation uses an [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) token. The first 128 bits of the 256-bit token ID identifies the hypercert, the latter 128 bits identifies the specific fraction. Other implementations are possible (e.g., based on ERC-721) as long as they also conform to the data standard and use the hypercerts interface to support capabilities like splitting and merging of values. - -### Hypercerts standard - -A data standard for hypercerts. It requires the following fields to be defined in the metadata of the token: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. - -### Impact - -Value that is created or destroyed by work. It mostly refers to positive impact, i.e., value that is created. If work destroys value, it is referred to as negative impact. - -### Impact evaluation - -A claim that a specified impact has or will occur – potentially claiming which work was responsible for the impact. - -### Impact Funding System (IFS) - -A system of actors (contributors, evaluators, funders) that interact according to a set of rules (funding mechanisms, coordination mechanisms) to maximize the domain-specific impact. - -### Impact space - -A geometrical space representing all possible work with its associated impact and rights. The space is spanned by the six fields specified in the hypercerts data standard: (1) set of contributors, (2) scope of work, (3) time of work, (4) scope of impact, (5) time of impact, (6) rights. - -### Merging hypercerts - -An operation to combine two or more hypercerts, such that the resulting, merged hypercert covers the exact same region in the impact space that the individual hypercerts covered. - -### Minting a hypercert - -Creating a new record for a hypercert on a blockchain. The properties of the hypercert (e.g., its timeframe and scope of work) are retrievable via this record. - -### Project - -Work by one or more contributors to achieve a goal. A project does not always need to be represented by one hypercert; it can be represented by multiple hypercerts (e.g., one hypercert per phase or milestone of a project). A hypercert can also represent multiple projects or even parts of multiple projects. - -### Prospective funder - -Individual, organization, or algorithm that fund work before it is done. - -### Retrospective funder - -Individual, organization, or algorithm that fund work after it is done. - -### Rights - -An unordered list of usage rights tags, which define the rights of the owners of a hypercert over the work being claimed by a hypercert. One of the axis of the impact space and part of the required fields in the hypercerts data standard. - -### Set of contributors - -An ordered list of all contributors, who claim to do or have done the work described by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Scope of impact - -A conjunction of potentially-negated impact scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Scope of work - -A conjunction of potentially-negated work scope tags, where an empty string means “all”. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Splitting hypercerts - -An operation to split one hypercert into two or more separate hypercerts, such that the resulting, separated hypercerts cover the exact same region in the impact space that the previous hypercert covered. - -### Time of impact - -Date ranges from the start to the end of the impact being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Time of work - -A date range, from the start to the end of the work being claimed by a hypercert. One axis of the impact space and part of the required fields in the hypercerts data standard. - -### Unit - -The smallest possible fraction of a claim. Generally units are grouped in fractions. - -### Work - -Activities that produce impact. - -## Additional Impact Evaluation Terms - -### Auditor - -Individual, organization, or algorithm that evaluates the impact of work after it is done. - -### Beneficiaries - -People or objects that are impacted by work. - -### Evaluator - -Individual, organization, or algorithm that evaluates the impact of work. There are two types: Scouts evaluate the potential impact before it is done, auditors evaluate the impact after it is done. - -### Scout - -Individual, organization, or algorithm that evaluates the potential impact of work before it is done. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md deleted file mode 100644 index 08eb9fcb..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: Metadata Standard -id: metadata -sidebar_position: 2 ---- - -# Hypercert Metadata Structure - -Hypercerts are represented as [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) tokens. All token instances of a hypercert must share the same ERC-1155 metadata. For sites like OpenSea to pull in off-chain metadata for ERC-1155 assets, your hypercert contract will need to return an IPFS URI that contains all necessary hypercert metadata. - -The hypercert metadata schema follows the [Enjin recommendation](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema) for ERC-1155 metadata. It also includes **six required dimensions** that are necessary to clearly and unambiguously identify the hypercert's impact claim. - -The following are standard ERC-1155 metadata fields. - -## ERC-1155 fields - -| Property | Description | -| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | Name or title of the hypercert. Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. | -| `description` | A human readable description of the hypercert. Markdown is supported. Additional external URLs can be added. | -| `image` | A URI pointing to a resource with mime type image/\* that represents the hypercert's artwork, i.e., `ipfs://`. We recommend images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive. | -| `external_url` | [optional] A URL that can be displayed next to the hypercert on webpages like OpenSea and links users to a page that has more information about the project or impact claim. | -| `properties` | [optional] Additional properties (aka attributes) that may be helpful for discovery and curation of hypercerts. Marketplaces like OpenSea will display these properties in the same way as they display rarity traits of NFTs. | - -In order to perform hypercert-specific operations, including split and merge functions, and for your hypercert to robustly claim a set of coordinates in the impact space, there are six additional dimensions that must be included in your metadata. - -## Required Hypercert dimensions - -| Property | Description | -| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `work_scope` | An _ordered list_ of work scope tags. Work scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any work scope that is explicitly excluded from the claim. | -| `work_timeframe` | Date range from the start to the end of the work in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). | -| `impact_scope` | An _ordered list_ of impact scope tags. Impact scopes may also be excluded from the claim. The `¬` prefix will be displayed next to any impact scope that is explicitly excluded from the claim. The default claim is to "all" impact, giving the owner rights to claim all potential impact created by the work that is represented by the hypercert. | -| `impact_timeframe` | Date range from the start to the end of the impact in the form of a [UTC timestamp](https://www.utctime.net/utc-timestamp). The default claim is from the start date of work until `indefinite` (i.e., the impact may occur at any point in time in the future). | -| `contributors` | An _ordered list_ of all contributors. Contributors should be itemized as wallet addresses or ENS names, but may be names / pseudonyms. The default claim is to the wallet address that created the hypercert contract. A multisig wallet can be used to represent a group of contributors. | -| `rights` | An _unordered list_ of usage rights tags. The default claim is solely to "public display" of the hypercert, i.e., all other rights remain with the contributors. | - -## Examples - -### Example 1: hypercert with minimal bounds - -Here is an example of hypercert dimensions for work on IPFS with minimal bounds: - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["IPFS"], - "excludes": [], - "display_value": "IPFS" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["All"], - "excludes": [], - "display_value": "All" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1380585600, 1388534399], - "display_value": "2013-10-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1380585600, 0], - "display_value": "2013-10-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["Protocol Labs"], - "display_value": "Protocol Labs" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Example 2: hypercert with bounded impact claims - -This hypercert is for a carbon removal project that provides a bounded impact scope. - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["Protecting Trees in Amazon"], - "excludes": [], - "display_value": "Protecting Trees in Amazon" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["CO2 in Atmosphere"], - "excludes": [], - "display_value": "CO2 in Atmosphere" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1356998400, 1388534399], - "display_value": "2013-01-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1356998400, 0], - "display_value": "2013-01-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], - "display_value": "0xa1f...000, Project Forest Conservation" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Example 3: hypercert with excluded impact claims - -Here is an example that explicitly excludes an impact scope to generate a more fine-grained claim. - -``` -"hypercert": { - "work_scope": { - "name": "Work Scope", - "value": ["Protecting Trees in Amazon"], - "excludes": [], - "display_value": "Protecting Trees in Amazon" - }, - "impact_scope": { - "name": "Impact Scope", - "value": ["All"], - "excludes": ["CO2 in Atmosphere"], - "display_value": "All ∧ ¬CO2 in Atmosphere" - }, - "work_timeframe": { - "name": "Work Timeframe", - "value": [1356998400, 1388534399], - "display_value": "2013-01-01 -> 2013-12-31" - }, - "impact_timeframe": { - "name": "Impact Timeframe", - "value": [1356998400, 0], - "display_value": "2013-01-01 -> Indefinite" - }, - "contributors": { - "name": "Contributors", - "value": ["0xa1fa1fa000000000000000000000000000000000", "Project Forest Conservation"], - "display_value": "0xa1f...000, Project Forest Conservation" - }, - "rights": { - "name": "Rights", - "value": ["Public Display"], - "display_value": "Public Display" - } -} -``` - -### Additional guidelines - -Here are some additional guidelines for defining hypercert dimensions. - -- For most hypercerts, the `work_scope` is best represented as the name of the project or activity. Other information contained in the hypercert, namely, the `contributors` and the `work_timeframe` should provide sufficient context to disambiguate multiple claims from the same project. -- Similarly, for most hypercerts, the `impact_scope` will be most clearly represented as "all" (with an indefinite upper bound on the `impact_timeframe` dimensions). This gives the hypercert creator and its owners the flexibility to make claims about impact that may not have been observable or well-understood when the hypercert was created. - -- It is recommended to browse the `impact_scope` and `work_scope` tags that have already been created and are in use by your or other projects. (We are building a catalog to be available at [hypercerts.org](https://hypercerts.org).) Picking established tags can make it easier for users to discover, curate, and interact with your hypercert. In the long-run, we expect different ontologies to emerge in domains like climate solutions, open source software, etc, and picking more established tags will help prevent overlapping or duplicate claims. -- Tags for work scopes and impact scopes are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. -- Scopes that are explicitly excluded from the hypercert claim are enumerated separately and displayed with the `¬` prefix in the tag. Excluded scopes are not currently displayed on hypercert artwork. -- The order of tags matters only for display purposes. The hypercert artwork will only display a limited number of tags in the `impact_scope` and `work_scope` arrays due to image size and stylistic constraints. -- A `contributor` can be identified using any human-readable string. The base case is to set the `contributors` to the wallet address used to create the hypercert. A multisig wallet can be used to represent a group of contributors. - -### Assigning `rights` - -In version 1.0 of the protocol, only one `rights` tag will be enabled: - -> **Public Display**: owners of the hypercert have the right to publicly display and receive social utility from their hypercert. - -This means that any other rights regarding the work described by the hypercert either remain with the original contributors or are governed by other agreements. - -Additional `rights` including the potential for certain types of transfers to be explicitly enabled will be released in subsequent versions. - -## Optional hidden properties - -Creators may wish to add other fields in their metadata that are not a part of the hypercert claim and are not for display on third-party marketplaces like OpenSea. These can be added by creating a `hidden_properties` field in the metadata. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md b/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md deleted file mode 100644 index a767c670..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Token Standard -id: token-standard -sidebar_position: 1 ---- - -### Hypercerts as a semi-fungible token - -In order to make the token identifiable, traceable, and transferable, hypercerts are represented as [ERC-1155 tokens](https://eips.ethereum.org/EIPS/eip-1155). The ERC-1155 standard enables a single deployed contract to store many hypercerts, facilitating simpler creation, transfers, as well as splitting and merging of hypercerts within a single namespace. As a semi-fungible token, each unique token represents a fraction of ownership of a hypercert. Hypercerts are then represented as a group of tokens, where the total ownership sums to 100%. In order to easily identify which hypercert a token belongs to, we utilize the upper 128 bits of a 256-bit token ID to identify the hypercert. All tokens within the same hypercert group should share the same [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). - -![hypercert id](../../static/img/hypercert_id.png) - -For illustrative purposes, let us assume that token IDs are just 2 bytes long, where the first byte represents the hypercert ID and the last byte represents which fraction of ownership. Alice could create a new hypercert token 0x2301, representing 100% of hypercert 0x23. If Alice wanted to transfer 20% to Bob, Alice could perform a split operation by minting token 0x2302 and transferring 20% of value to it, such that tokens 0x2301 and 0x2302 represent 80% and 20% ownership respectively of hypercert 0x23. Then Alice transfers token 0x2302 to Bob. Similarly, they could merge these 2 tokens together, back to form a token that represented 100% ownership. In this case, the value of 0x2301 would be transferred to 0x2302, and then 0x2301 is subsequently burned. - -Alice can also choose to split or merge hypercerts along some dimension of the impact space. For example, Alice may split hypercert 0x23 into two new hypercerts — 0x24 representing work done before the year 2000, and 0x25 representing work done after 2000. The original hypercert 0x23 is burned and the two new hypercerts store a reference to the previous hypercert. When the history of splits and merges are indexed, we can easily trace through the provenance of any individual hypercert. - -### Claim Data - -Hypercert claim data, such as scope of work and the contributor list, is encoded in JSON format into the [ERC-1155 Metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata). Claim data can be stored on-chain alongside the token, or in off-chain storage such as IPFS. For details on the JSON schema and how off-chain storage can be utilized, see the [hypercerts-sdk repository](https://github.com/hypercerts-org/hypercerts/tree/main/sdk). - -When considering whether to store hypercert metadata on-chain or off-chain, we can consider the different trade-offs to the user experience and cost, which may differ depending on which blockchain is being used. Storing data off-chain saves on costs, but could lead to on-chain claims without the metadata. Storing data on-chain adds additional security that the claims will not be forgotten but can lead to higher gas fees. - -Beyond the standard fields of hypercerts that locate the hypercert in the impact space, additional fields can be added. This allows for different templates in different impact areas, such as AI safety or biodiversity, as different additional information will be useful. Importantly, however, all hypercerts will be located in a single impact space – the additional fields do not change that. - -### Multi-chain support - -We expect hypercerts to exist in a multi-chain ecosystem, where the local deployment can be used to support the unique funding systems of that community. In order to visualize a single global impact space, we index the different contract deployments across chains and surface any potential hypercert claim conflicts. Because different blockchains support different subsets of programming languages, we do expect different implementations of the hypercert protocol to exist. However, they must adhere to the same hypercert data model to be indexed into the impact space. - -In order to decide which deployments to index into the hypercerts impact space, decentralized governance institutions will be used to govern the list of contract addresses used across all blockchains. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/intro.md deleted file mode 100644 index 0c4d7ca3..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/intro.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: What Are Hypercerts? -id: intro ---- - -# What are hypercerts? - -### Hypercerts are a new token standard for tracking and rewarding positive impact. - -Each hypercert represents a unique impact claim capturing the following information: - -- a scope of work and its corresponding scope of impact -- a set of time frames for both the work and its impact -- a set of contributors – the organization or people behind the work -- a set of rights you get by owning a hypercert - -The hypercert itself is an ERC-1155 semi-fungible token with the information above stored as metadata on IPFS. Here’s an example. - -### Hypercert example - -#### Graphic representation - -![hypercert design example](../static/img/hypercert_example.png) - -#### Supplementary information (metadata) - -- **Title of hypercert:** Invention of the InterPlanetary Filesystem (IPFS) -- **Description:** The InterPlanetary File System (IPFS) is a set of composable, peer-to-peer protocols for addressing, routing, and transferring content-addressed data in a decentralized file system. -- **Link:** ipns://ipfs.tech/ - -#### Hypercert dimensions (metadata) - -- **Set of contributors:** 0xb794f5ea0ba39494ce839613fffba74279579268 _(example Ethereum address)_ -- **Scope of work:** IPFS ∧ ¬ go-ipfs -- **Time of work:** 2013-01-01 --> 2013-12-31 -- **Scope of impact:** All -- **Time of impact:** 2013-01-01 --> indefinite -- **Rights:** Public display - -### Why should you care? - -We spend trillions of dollars every year on public goods via governmental agencies, foundations, private donations and corporate spendings; however, we don’t effectively track this work – leaving us in the dark, hoping that it actually has the intended positive impact. - -We believe we can do better: - -- We should start by tracking this work consistently – this is what hypercerts are for. -- We should evaluate how impactful that work was – this is what the open evaluation system of hypercerts supports. -- We should reward the work that was exceptionally impactful – this is what the public display of hypercerts and retrospective funding is for. - -Doing this would unfold powerful incentives. Retrospective funding 1) provides incentives for creators to take on public goods projects with a potentially high, but uncertain, impact, 2) enables feedback loops to learn from successes and failures, and 3) attracts more talent to the public goods sector by improving performance-based compensation. - -While we are excited about the prospects of retrospective funding, hypercerts do not impose any specific funding mechanisms, but start with tracking the work that is supposed to be impactful. As a database for many funding mechanisms this facilitates experimentation and interoperability between funding mechanisms. - -### Next - -Curious and want to learn more? Head over to the [whitepaper](whitepaper/whitepaper-intro.md) to dive deeper into the world of hypercerts. - -Or do you want to get started right away? Head to the [minting guide](minting-guide/minting-guide-start.md). diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md deleted file mode 100644 index 1ad2310a..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: Gitcoin Alpha Round Instructions -id: gitcoin-round -sidebar_position: 3 ---- - -# Gitcoin Alpha Round Instructions - -## Overview - -- all projects in the Gitcoin Alpha Round are invited to mint a hypercert for their work -- anyone who gave over $1 to a project is automatically allowlisted for that project’s hypercert -- 50% of each hypercert is distributed to the funders, 50% is kept by the project and can be transferred later -- each project has a custom URL to make minting super easy (the link is sent directly to each project) -- everything runs on Optimism (users only need to pay L2 gas costs) - -:::info -If your project participated in the Gitcoin Alpha Round, but you didn't get a message with a custom URL, please reach out to team[at]hypercert.org. -::: - -## Hypercerts x Gitcoin Alpha Round - -Now that Gitcoin’s Alpha Round has officially closed and the funding distribution is finalized, we are inviting all eligible projects that participated to mint a hypercert for their past work and to allocate fractions of their hypercert to a list of supporters. - -We’ve created a dApp that pulls all of the data required to mint your hypercert directly from Gitcoin’s Grant Protocol. You can fine-tune the properties, tweak your artwork, and review the distribution mechanism. Once you’re ready, hit the create button and your hypercert will be released into the ethers! - -Once your hypercert has been minted, the people who supported your project with a contribution of at least $1 DAI on Gitcoin’s Alpha Round will be able to connect and claim their fractions. - -A few important notes about the Alpha Round: - -- The total units of a hypercert is based on the total donations; each funder get awarded units proportional to their donations. -- Transfers will be restricted to one transfer from the project to the supporters. -- There will be no additional rights awarded to the funders except the right to "public display" their support for the project. - -## Instructions - -The following guidance is only for projects that receive a custom URL that pre-populates the hypercerts form based on their Gitcoin Grants' data. - -It explains the default settings in the form and recommends fields that the creator may choose to update or edit. - -:::note -Gitcoin Grant hypercerts are for retrospective work, i.e., they are intended to capture work that happened between Gitcoin Grants Round 15 (September 2022) and the Alpha Round (January 2023). Therefore, the work time period is always set to past dates. (You might need to adjust the name and description to also refer to past work only.) We are focusing solely on retrospective hypercerts for this round as part of broader efforts to promote retrospective funding; you can read more about it [in the whitepaper](whitepaper/retrospective-funding.md). -::: - -### General Fields - -#### Name of Hypercert - -This field is set by default to the name of your project on Gitcoin Grants. You can edit this to be more specific. Given that your project may create numerous hypercerts over time, consider giving each hypercert a name that represents a more discrete phase or output. - -#### Logo - -This field is set to the icon artwork provided for your project on Gitcoin Grants. If there was an error accessing your icon, you will see a generic icon. - -You can update this by providing a new URL and the hypercert artwork should update automatically. - -Logo images look best with an aspect ratio of 1.0 (square-shaped). - -#### Background Banner Image - -This field is set to the banner artwork provided for your project on Gitcoin Grants. If there was an error accessing your banner, you will see a generic Gitcoin banner. - -You can update this by providing a new URL and the hypercert artwork should update automatically. - -Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. - -#### Project Description - -This field is set by default to the description of your project on Gitcoin Grants. Review closely -- a long project description in your Gitcoin Grant description will be truncated. - -You may edit this to provide more details about your work and to remove information that is targeted solely at Gitcoin Grants users. This is also a good place to provide other links, such as Github repos or social media accounts, where the general public can learn more about the work. Please aim for a project description that is less than 500 characters. - -:::note -The project description should refer to **past work**, not future work that you would like to do with additional funding. -::: - -#### Link - -This field is set to the first external URL provided for your project on Gitcoin Grants. You can update this. - -### Hypercert Fields - -#### Work Scope - -This field is set by default to a **shortened version** of the name of your project on Gitcoin Grants. You may edit or add additional work scope tags. - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -If you choose to use more than one tag, remember that tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -#### Work Start/End Dates - -The start date has been set by default to the `2022-09-22` for all projects on Gitcoin Grants. This date coincides with the end of Gitcoin Grants Round 15. - -The end date references the last update to your grant page on Gitcoin Grants. - -You may edit or update these fields, however, the end date may not extend beyond `2023-01-31` (the close of the funding round) as all hypercerts will be retrospective in this round. - -#### Set of Contributors - -This field is set by default to the wallet address that is set as the recipient address for receiving Gitcoin Grants funding. - -:::note -You should review this field closely and – if applicable – provide the addresses of additional contributors. -::: - -### Advanced Fields - -#### Impact Scope - -This field is set by default to `all`. - -Updates are currently disabled on the frontend because funding decisions on Gitcoin Grants were not specific to an impact scope or impact time period. - -#### Impact Start/End Dates - -This field is set by default to the work start date of `2022-09-22` (see above) and a work end date of `indefinite`. Updates are currently disabled on the frontend. - -#### Rights - -This field is set by default to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. - -Updates are currently disabled on the frontend. - -### Distribution - -#### Allowlist - -This field is set by default to a custom allowlist generated for each project based on the funding it received on the Gitcoin Grants Alpha Round. You should not need to update this field. If there is a problem with your allowlist, please contact us. - -50% of the hypercert will be allocated according to this allowlist. The other 50% will be kept by the project, i.e. it is allocated to the address that mints the hypercert. You will be able to transfer or sell these fractions later as long as they are owned by the minter. This means that they can only be transferred or sold once. - -The formula assigns one fraction (rounded down) for every $1 (using the exchange rate at the time of the transaction) that a donor contributed to the project. It also provides a small buffer (of 5%) so that a transaction worth $0.999 or $0.951 remains eligible for one fraction. - -For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.96 donated --> 1 fraction -- $0.52 donated --> 0 fractions - -The queries used to generate the allowlists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -Donors who contributed to the matching pool for each round are also eligible to claim hypercerts. - -:::note -You are free to edit your allowlist. You can do this by following the step-by-step instructions [here](minting-guide/step-by-step.md). Just remember that you will need to upload the new allowlist in a CSV format to a storage site like [web3.storage](https://web3.storage) and then update the link in the allowlist field. Contact team[at]hypercerts.org if you need help. -::: - -### Confirmations - -#### Contributors' permission - -Every contributor needs to agree to have their contribution be represented by a hypercert. This is why the person minting the hypercert has to confirm to have the permission of all listed contributors. - -#### Terms & Conditions - -The terms & Conditions can be found [here](https://hypercerts.org/terms). - -### Final step: Click "Create" - -Make sure your Optimism wallet or multi-sig is connected. Click on "create" and wait for your hypercert to be created. Congratulations! diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md deleted file mode 100644 index 47e8ad7c..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Getting Started -id: minting-guide-start -sidebar_position: 1 ---- - -# Getting started - -### How to create a hypercert - -Creating a hypercert is similar to creating an NFT on sites like OpenSea or Zora. - -In this article, we’ll walk through the steps one by one and explain exactly what you need to do to create your first hypercert. - -There are typically two ways of creating a hypercert: - -1. As a project affiliated with a specific funding network (e.g., Gitcoin Grants): In this case, you should receive a custom URL from the funding network that pre-populates most of your hypercert fields. You will still be able to change most of these, so you should review and adjust them as needed to better describe your hypercert. Guidance on how to do so (for Gitcoin Grants projects) is provided at the end of this doc. -2. As a project not affiliated with a specific funding network: In this case, you will be creating a hypercert from scratch and filling in each field on your own. Read on below. - -### Who can create a hypercert? - -Anyone doing work that is intended to have a positive impact can create a hypercert. Your hypercert can be as simple as "I did X on this date and want to claim all future impact from it". - -It can also represent something more, such as a phase in an ongoing team project, an invention or discovery, a research publication, or an important software release. - -Critically, if the work was done by more than one person, then each person should be listed as a contributor to the hypercert and approve the creation of the hypercert. - -_Note: In the future, the approval of each contributor will be verified on-chain._ - -### What do I need to create a hypercert? - -You will need to prepare all of the information required in the form builder (see **Step-by-step instructions for creating a hypercert** below). This includes important metadata, such as a description of the project and the dimensions of your impact claim, as well as a project artwork. You may also want to include an allowlist of wallets that are approved to claim one or more fractions of the hypercert. - -In addition to the information regarding the hypercert itself, you’ll need a crypto wallet to mint your hypercert. “Minting” a hypercert is the process of writing an impact claim to the blockchain. This establishes its immutable record of authenticity and ownership. - -Next, choose a blockchain on which to mint your hypercert. The hypercerts protocol is available on Ethereum, Goerli (testnet), and Optimism. Each of these blockchains has different gas fees associated with transactions on their networks. To reduce gas fees we recommend Optimism for most projects. - -Finally, go ahead and create your hypercert. - -### How much does it cost to create a hypercert? - -You will need enough Ethereum in your wallet to cover gas fees. In our simulations, the gas fee for minting a hypercert on Ethereum Mainnet ranged from 2,707,282 to 7,515,075 gwei (0.0027 to 0.0075 ETH). Minting costs are significantly cheaper on Optimism (i.e., below 0.0005 ETH or less than $1). - -The protocol currently does not offer gas-free or "lazy" minting. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md b/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md deleted file mode 100644 index 9f3b6303..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Step-by-step Instructions -id: step-by-step -sidebar_position: 2 ---- - -# Step-by-step instructions - -First, go to the [Create Hypercert](https://hypercerts.org/app/create) site with a wallet-enabled browser or follow the custom URL you received to access a prepopulated form. - -Although the site works on mobile, it is easier to use on desktop because the browser will display a dynamic preview of the hypercert while you fill out the Create form. - -Next, connect your wallet. You will be prompted to switch to the Ethereum or Optimism network. - -Once you've connected, you will see an empty form for creating a hypercert. - -### General fields - -#### Name of Hypercert - -Enter the name or title of the hypercert. This is the place to be verbose and specific about what the project is doing. You'll see on the preview when your title becomes too long. - -Given that a project may create numerous hypercerts over time, consider giving the hypercert a name that represents a discrete phase or output. - -Names are restricted to 100 characters but may include emojis (:smile:), accents (é), non-Latin scripts (表情), and other Unicode characters. - -#### Project Description - -Enter a human readable description of the hypercert. This is the place to share more details about the work and the team or individual behind the work. - -The description field supports [Markdown syntax](https://www.markdownguide.org/cheat-sheet/) and has a limit of 10,000 characters. - -In addition to the main link (see next field) you can add further links in the markdown to help others to understand the work of the project. - -#### Link - -A valid URL for the project, beginning with https:// - -This will be displayed next to the hypercert on webpages like OpenSea and should link users to a page that has more information about the project or impact claim. - -#### Logo - -An icon for the top left part of the card. This could be your project logo. It will be automatically masked to the shape of a circle. - -Logo images look best with an aspect ratio of 1.0 (square-shaped). - -The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. - -#### Background Banner Image - -A background image that will extend across the upper half of the artwork. This could be your project masthead or a unique piece of art. - -Banner images look best with an aspect ratio of 1.5 (e.g., 600 x 400 pixels). The dimensions should be at least 320 pixels wide and 214 pixels high to avoid stretching. - -Currently we don't support zoom / cropping, so you will need to test the look and feel on your own. - -The easiest way is to find an image you like in your web browser, right click "Copy Image Address", and paste it in the field. Images stored on IPFS should be referenced through a hosted URL service, e.g., `https://cloudflare-ipfs.com/ipfs/`. - -### Work Scope fields - -#### Work Scope - -One or multiple tags describe the work that the hypercert represents. This work scope will be used to identify the work that is included in the hypercerts and the work that is not included. - -Multiple tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction), e.g. `Planting trees` ∧ `Germany` means that the hypercert includes the planting of trees only in Germany, but not planting trees anywhere else or any other work in Germany that wasn't planting trees. - -For most projects, it's probably best just to use a single tag that is a short form of your project's name. Given that your project may create numerous hypercerts over time, having a work scope that represents the name of your project will make your claims in the "impact hyperspace" more continuous. - -_Note: In the future, you will be able to specifically exclude work from the hypercert._ - -#### Start and End Date of Work - -The work time period defines when the work was done that the hypercert represents, i.e., only the work in this time period is included in the hypercert. - -The time period of work doesn't need to be the start and end date of a project, but it can be. One project can be split up into multiple hypercerts, e.g. all hypercerts can have the same `work scope`, but different time periods of work. Of course, the time periods are not allowed to overlap. - -### Impact scope fields - -#### Impact Scope - -The impact scope can be used to limit the impact that a hypercert represents, e.g. for the work scope `Planting trees` a hypercert can represent _only_ the impact on biodiversity by including the impact scope tag `Biodiversity`. This would exclude all other impacts, including the impact on CO2 in the atmosphere, which can be useful if that impact is already captured by a carbon credit. - -By default this is set to "`all`" and we strongly recommend keeping it that way. - -Just like the work scope, multiple impact scope tags are [logically conjunctive](https://en.wikipedia.org/wiki/Logical_conjunction). - -#### Start and End Date of Impact - -The impact time period is another way to limit the impact that a hypercert represents, e.g. inventing a new medical treatment has a positive impact over many years, but we might want to capture the positive impact separately for each year. - -By default the `impact start date` is the same as the `work start date` and the `impact end date` is "`indefinite`", i.e., the impact is not restricted time-wise. We strongly recommend keeping it that way. - -### Set of Contributors - -Provide a list of contributors, one per line, or comma-separated. - -The list should include _all_ contributors that performed the described work. - -Contributors are generally itemized as wallet addresses or ENS names, but can also be names / pseudonyms. Groups of contributors can be represented by a multisig or name of an organization. - -### Owners - -#### Allowlist - -The allowlist allocates fractions of the hypercert to specific wallet addresses. These wallet addresses are then allowed to claim these fractions afterwards. For example, it can be used to allocate fractions to previous funders and contributors. - -The allowlist is implemented as a CSV file specifying `index,address,price,fractions` headers. - -| index | address | price | fractions | -| ----- | ------------------------------------------ | ----- | --------- | -| 0 | 0x5dee7b340764c49a827c60d2b8729e49405fbefc | 0.0 | 100 | -| 1 | 0x1e2dbb9ca3f6d48e085384a821b7259abfdc7d65 | 0.0 | 50 | -| ... | ... | ... | ... | -| 999 | 0x436bad18642f45d3fa5fcaad0a2d81764a9cba85 | 0.0 | 1 | - -The `price` field is denominated in ETH. This should remain at 0.0 for all hypercerts, as primary sales are not currently supported through the app and the secondary sale/transfer of hypercerts is currently not allowed. - -You can store your allowlists on IPFS using [web3.storage](https://web3.storage/). - -:::note -If your allowlist is not properly formatted, you will be unable to mint your hypercert. If you do not include an allowlist, then the creator of the hypercert will receive 100% of the hypercert (set to a default of 10,000 units), which you can then sell or transfer to another wallet a maximum of one time. -::: - -#### Rights - -This field defines the rights that owners of the hypercert have over the work being claimed by this hypercert. - -By default this is set to `Public Display`, i.e., the owners are allowed to publicly display the hypercert and show their support of the work. - -_Note: In the future, additional rights can be included for different hypercerts._ diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md deleted file mode 100644 index 87fb9194..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Open Impact Evaluations -id: evaluation -sidebar_position: 5 ---- - -A key design element is that hypercerts themselves do not make a claim about the size of the impact, but only account for the work that is supposed to be impactful. The figure below shows this contrast in a simplified illustration of the example that we introduced above. The open evaluation system allows multiple evaluations to point at the same area of the impact space that a hypercert claims. The evaluations can include self-evaluation from the contributors themselves. Funders observe these and make their funding decisions based on this richer set of information. - -![hypercert evaluations](../../static/img/hypercert_evaluations.png) - -The open evaluation system is also used to provide additional information, e.g. an evaluator or the project itself provides information about the health of the trees. This information can then be used transparently by other evaluators to evaluate the impact on CO2 in the atmosphere. - -An important feature is that the evaluations do not directly point at a hypercert, but rather at an area in the impact space. In practice this area will mostly be the exact same area that a hypercert claims, such that it can be considered an evaluation of the hypercert, but it does not have to. This feature ensures that, if hypercerts are merged or split, previous evaluations will continue to be linked appropriately. - -The form of evaluations can be standardized to simplify handling and comparing multiple evaluations from multiple evaluators. The open evaluation system allows for templates to be created and used by any evaluators. Similar to the emerging ontologies, these are not enforced centrally, but should emerge as useful standards – potentially steered by decentralized governance institutions. - -Important characteristics of the open evaluation system are: - -- Evaluators can submit multiple evaluations of the same area in the impact space as more information becomes available -- Evaluations can challenge other evaluations -- Evaluation methodologies can evolve over time - -These features allow the whole evaluation system to be dynamically improved by each actor. The relevant incentives for this improvement will stem from the funders who will value the signals from some evaluators more than others and evaluators are able to build up reputation. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md deleted file mode 100644 index 8acc11d1..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: "Hypercerts: a New Primitive for Impact Funding Systems" -id: hypercerts-intro -sidebar_position: 3 ---- - -### Defining hypercerts - -A hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and represents all or parts of that impact. A hypercert has the following fields (one for each dimension): - -1. **Set of contributors:** An ordered list of all contributors, who claim to do or have done the work described by this hypercert. -2. **Scope of work:** A conjunction of potentially-negated work scope tags, where an empty string means “all”: - -``` - ::= AND | " " - ::= | NOT -``` - -3. **Time of work:** A date range, from the start to the end of the work being claimed by this hypercert. -4. **Scope of impact:** A conjunction of potentially-negated impact scope tags, where an empty string means “all”: - -``` - ::= AND | " " - ::= | NOT -``` - -5. **Time of impact:** Date ranges from the start to the end of the impact. -6. **Rights of the owners:** An unordered list of usage rights tags, which define the rights of the owners of this hypercert over the work being claimed by this hypercert. - -Implementing hypercerts as a semi-fungible token allows multiple contributors and funders to own parts of hypercerts. For instance the original contributors can award 10% of a hypercert to a funder, while keeping 90%, which they can award to other funders later. This is why hypercerts are fractionalizable. - -### Examples - -In the simplest cases of hypercerts, the scope of work and impact as well as the time of impact are not restricted and no rights are transferred to owners of the hypercerts, i.e. the hypercerts just define the who (set of contributors) and when (time of work) of the claimed work. Scope of work and impact would be set to all, time of impact to “indefinite” and the rights to only “public display of support”. The latter is always included as the hypercert is a public record, such that owners will always automatically display their support of the work. - -Take for example hypercert 1 below: It represents all work that contributor 1 has performed in 2013 with all the impact that the work had from the beginning of the work; the hypercert doesn’t give any additional rights to the owners of the hypercert. - -The other fields – except the rights field – can be used to limit the work or impact that is represented by the hypercert. Hypercert 2 limits this to the work on IPFS in 2013, i.e. any other work besides IPFS that contributor 1 performed is not included. Hypercert 3 limits it even further as it excludes a specific aspect of IPFS, the go-ipfs implementation. - -| | **Hypercert 1** | **Hypercert 2** | **Hypercert 3** | -| ----------------------- | ------------------------- | ------------------------- | ------------------------- | -| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | -| **Scope of work** | all | IPFS | IPFS ∧ ¬ go-ipfs | -| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | -| **Scope of impact** | all | all | all | -| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → 2013-12-31 | -| **Rights** | Public display of support | Public display of support | Public display of support | - -In the table below we illustrate a use case for limiting the scope of impact. Suppose contributor 1 protects trees in a certain area. This work has positive effects on the CO2 in the atmosphere and could turn into carbon credits; however, the trees have additional positive impacts, such as protecting biodiversity. Instead of including all positive impacts in one hypercert (hypercert 4), the impact can be split between the impact on CO2 in the atmosphere (hypercert 5) and all other positive impacts (hypercert 6). If funders are willing to pay for biodiversity, this would be a new income opportunity. And it would account for the additional positive impact that other methods of reducing CO2 might not have, like industrial carbon capture. Importantly, negative impacts can not be excluded from a hypercert. - -| | **Hypercert 4** | **Hypercert 5** | **Hypercert 6** | -| ----------------------- | -------------------------- | -------------------------- | -------------------------- | -| **Set of contributors** | Contributor 1 | Contributor 1 | Contributor 1 | -| **Scope of work** | Protecting trees in area X | Protecting trees in area X | Protecting trees in area X | -| **Time of work** | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | 2013-01-01 to 2013-12-31 | -| **Scope of impact** | all | CO2 in atmosphere | all ∧ ¬ CO2 in atmosphere | -| **Time of impact** | 2013-01-01 → indefinite | 2013-01-01 → indefinite | 2013-01-01 → indefinite | -| **Rights** | Public display of support | Public display of support | Public display of support | - -Importantly a hypercert does not specify the “size” of the impact, e.g. a hypercert does not state “5 tons of CO2 removed from the atmosphere.” Instead the hypercert only defines the work, e.g. “200 trees protected” (scope of work) in 2022 (time of work). The size of the impact is then left to the evaluations of the “CO2 in the atmosphere” (scope of impact) in 2022 (time of impact) that point towards the covered region of the hypercert. For instance: This allows a self evaluation to claim that 5 tons of CO2 were removed in a given year as well as one or multiple evaluations from independent auditors to confirm or challenge how much CO2 has been removed. An evaluator could detect that some of the trees were not healthy and hence only 4 tons of CO2 were removed. Allowing for multiple evaluation is a defining characteristic of the open evaluation system. - -### Functions of hypercerts - -#### 1. Identifiability - -Hypercerts clearly define the work that is supposed to be impactful by creating a record of who (set of contributors) claims to do or have done what (scope of work) in what time period (time of work). They also allow the creation of multiple records of the same work to identify separate impacts that this work had or will have (scope of impact) over specified time periods (time of impact). - -#### 2. Traceability - -As these records are public and logically monotonic (immutable, except to split or merge hypercerts), records are durable and permanent. - -#### 3. Transferability - -The records are a digital object that can be owned and ownership can be transferred (under specific conditions). As hypercerts can be created as fractionalizable, it is also possible to transfer only a specified fraction of the hypercert. Each hypercert defines the rights over the defined work that owners have, such as rights to retrospective rewards, rights to public display of the support (“bragging rights”) or rights to passive income from intellectual property. - -:::note Transferability restrictions - -Hypercerts are generally transferable. However, there are use cases, in which minters of hypercerts want to restrict how their hypercerts can be transferred. The protocol allows the minter to restrict who can transfer the hypercert and/or to whom the hypercert can be transferred. For instance, by specifying that only the original owner can transfer the hypercert, any future owner is prohibited from selling it, i.e. a secondary market would not exist for this hypercert. - -::: - -### Merging hypercerts - -Besides the fungible dimension, hypercerts can be merged and split on any of the six dimensions as shown in box 1. Let us take the hypercert 1 from the section "Hypercerts definition" and focus only on two of the dimensions, scope of work and time of work. These two dimensions create a simplified impact space. The figure below shows how work on IPFS (InterPlanetary File System) could have been minted over time in separate hypercerts, one for each quarter of work. - -![minting hypercerts example](../../static/img/creating.png) - -We created five hypercerts, one for each quarter of work. As the resulting work of all of these together is IPFS 0.1, the merged hypercert in total is more meaningful and more valuable than just the five individual hypercerts. In this case the proverb is true, the whole is greater than the sum of its parts. Hence, we want to merge them as shown in the next figure. - -![merging hypercerts example](../../static/img/merging.png) - -### Splitting hypercerts - -Conversely, splitting can increase the meaningfulness and value of hypercerts as well. We can split the work on IPFS 0.1 into the conceptual work “invention of IPFS” and the implementation via “go-ipfs 0.1” as shown in the next figure. - -![splitting hypercerts examples](../../static/img/splitting.png) - -Other use cases are where multiple contributors want to combine their work on the same scope of work (merging) or disentangle their work (splitting). Ultimately, splitting and merging allows users to repackage the digital representation of their work and impact. - -Importantly, splitting and merging are the only operations that are permitted to change hypercerts. Once an area in the impact space is claimed, it can not be unclaimed. This ensures that claims are never forgotten. - -### Retiring hypercerts - -While a claim in the impact space can not be unclaimed, it can be retired. Retiring a hypercert means that owners can not transfer and sell it anymore. This way owners prove that they are the final buyers of the impact. Technically retiring hypercerts means that they are sent to a specific null address, which ensures that the retired hypercerts are recorded and traceable. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md deleted file mode 100644 index 6f71ac50..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: The Need for Interoperable Impact Funding Systems (IFSs) -id: ifs ---- - -# The Need for Interoperable Impact Funding Systems (IFSs) - -### An IFS consists of - -- **Actors:** Contributors, funders, evaluators, and beneficiaries -- **Funding mechanisms:** Grants, bounties, retrospective funding, etc. -- **Coordination mechanisms:** Roadmapping, communication forums, etc. -- **A goal:** Maximize the domain-specific positive value created (impact) - -The goal will be specific to the impact area, e.g. prevent existential risks from artificial intelligence (AI) would be the goal for the impact area “AI safety.” To achieve these goals, skilled contributors must work with high effort on promising projects. Additionally, for those projects that create impact continuously, sufficient income streams are necessary to cover both their ongoing operating expenses and contributors’ upside incentives. - -#### Actors in IFSs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeSubtypeDescription
    ContributorsPeople or organizations who do the work
    FundersProspective fundersPeople or organizations who fund work before it is done
    Retrospective fundersPeople or organizations who fund work after it is done
    EvaluatorsScoutsPeople or organizations who evaluate the potential impact of work before it is done
    AuditorsPeople or organizations who evaluate the impact of work after it is done
    BeneficiariesPeople or objects that are impacted by the work
    - -### Guiding questions for designing IFSs - -1. **Projects:** How can we improve the chances that the most promising projects are worked on? -2. **Talent & resources:** How can we attract top talent to contribute to the most promising projects and provide them with the necessary resources? -3. **Effort:** How can we reward contributors for their impact on outcomes? -4. **Sustainable income:** How can we create recurring income streams and financial sustainability for impactful projects? - -Markets have been proven very powerful in answering these questions if they are directed towards maximizing profits. As we are directing systems towards maximizing impact, these answers become more challenging. In particular, in an IFS we are facing coordination and incentive problems in funding impact, such as the free-rider problem. - -### Example dynamics between actors in an IFS - -In order for impact funding systems to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources and (3) evaluations. In the diagram below you see a potential dynamic between the actors of an IFS. In that scenario hypercerts can account for the prospective funding (steps 2-3) as well as for the retrospective funding (steps 8-9) from different funders. Evaluations are made public and can be discovered through the hypercerts for all funders (steps 5-7). Retrospective funders can reward not only the contributors but also the prospective funders (steps 10-11). - -```mermaid -sequenceDiagram - autonumber - participant Beneficiaries - participant Contributors - participant Prospective funders - participant Retrospective funders - participant Evaluators - Contributors ->> Contributors: Mint hypercerts - Prospective funders ->> Contributors: Award funding - Contributors ->> Prospective funders: Award fractions of
    the hypercert - Contributors ->> Beneficiaries: Create impact - Retrospective funders ->> Evaluators: Fund evaluation - Evaluators ->> Beneficiaries: Evaluate impact on beneficiaries - Evaluators ->> Retrospective funders: Make evaluations public,
    esp. for retrospective
    funders - Retrospective funders ->> Contributors: Award funding - Contributors ->> Retrospective funders: Award fractions of hypercerts - opt - Retrospective funders ->> Prospective funders: Award funding - Prospective funders ->> Retrospective funders: Transfer fractions
    of hypercert - end -``` - -### Hypercerts as a data layer for IFSs - -By serving as a single, open, shared, decentralized database hypercerts lower the transaction costs to coordinate and fund impactful work together. This is important because the optimal funding decisions of a single funder depends on the funding decision of all other funders. For instance, some work is only impactful if a minimum funding is provided: The impact is non-linear in the funding amount, e.g. half a bridge is not half as impactful as a full bridge. Other work might be over-funded, i.e. the impact of an additional dollar is basically zero. Ultimately, funders want to find the highest impact for each additional dollar spend (cf. S-process as in Critch, 2021). Today multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Through hypercerts the funding becomes more transparent and the credits for funding impactful work can be easily shared. Coordinating funding becomes easier. - -Hypercerts don’t solve this coordination problem by themselves, but build the basis for different decision and funding mechanisms as shown below. Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. Hypercerts do not lock in any particular decision-making scheme for funders. - -![Hypercerts as a data layer for an IFS](../../static/img/hypercert_data_layer.png) - -Looking farther into the future: If a large majority of funding across an entire IFS ends up flowing through hypercerts, funders have created the transparency that enables each of them to make the best decisions given the funding decision of everyone else. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md deleted file mode 100644 index f8fed762..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: A Consistent Impact Space -id: impact-space -sidebar_position: 4 ---- - -Every hypercert represents a claim in the impact space, which itself represents all possible claims. Above we illustrated the impact space with two dimensions, scope and time of work. The complete impact space is spanned by the six dimensions introduced in the definition of hypercerts. - -### Consistency of the impact space - -Every point in the impact space should either be claimed or not be claimed. No point must be claimed twice, or equivalently: - -- If the impact of some work is represented in one hypercert, it must not be part of any other hypercert. -- Hypercerts must not overlap with each other. - -The table below shows two hypercerts that were illustrated in the section on "Hypercerts operations", but now with all six fields. The two hypercerts can represent the exact same work by the same contributor, but they do not overlap because of the difference in the time of work. - -| | **Hypercert 7** | **Hypercert 8** | -| ----------------------- | ------------------------ | ------------------------ | -| **Set of contributors** | Contributor 1 | Contributor 1 | -| **Scope of work** | IPFS | IPFS | -| **Time of work** | 2013-10-01 to 2013-12-31 | 2014-01-01 to 2014-03-31 | -| **Scope of impact** | all | all | -| **Time of impact** | 2013-10-01 → indefinite | 2014-01-01 → indefinite | -| **Rights** | None | None | - -The consistency of the impact space is crucial as it ensures that no rights to an impact claim are sold twice. If for example someone owns the right to retrospective rewards for the impact of some work, the owners must be identifiable unambiguously. - -Because users can create hypercerts with arbitrary data on any chain, on which a hypercert contract is deployed, we provide ways to help users detect collisions in the impact space. For example, if one hypercert on Ethereum points to the work on “IPFS”, and another hypercert on Filecoin points to the work on “https://github.com/ipfs/go-ipfs” both with the same contributor and time of work, which of these overlapping hypercerts is the correct one to support? To surface such overlapping hypercerts, the hypercerts protocol and SDK will support mechanisms to index, search, and visualize neighbors in the impact space. With these tools evaluators can quickly detect potential conflicts and submit the results as evaluations to help disambiguate proper credit and attribution. - -### Emerging ontologies - -Common ontologies for the scope of work and scope of impact are useful to create transparency and improve discoverability. Such ontologies need to be created from the practices and should be adapted over time. They are like emerging norms, instead of fixed rules. However, some larger players or a group of smaller players could enforce certain ontologies, e.g. if multiple funders agree that they only fund projects that follow a specified ontology. - -As some ontologies might be more useful than others, we would ideally see a consensus emerge between participants and experts in each impact area. Decentralized governance institutions can help facilitate this; however, further details on the design are out of the scope of this paper and are left for future work. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md deleted file mode 100644 index 57444581..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Retrospective Impact Funding -id: retrospective-funding -sidebar_position: 6 ---- - -### Introducing retrospective funding - -While hypercerts do not impose any specific funding mechanisms, they are especially useful for retrospective funding. The core idea, from the perspective of contributors building impactful goods, is this: if you can reasonably expect to get funded retrospectively for your work once you produce a positive impact, then you can work now, in expectation of a probabilistic future cash flow. In another conception, you are effectively “borrowing” money from this anticipated future cash flow to fund the work in the first place; the expectation of future funding “retro-causes” the impactful work. Retrospective funding may be able to 1) provide incentives for contributors to take on impactful goods projects with a potentially high, but uncertain, impact and 2) create a more efficient IFS by back-propagating signals on what outcomes were impactful post-hoc. - -In addition, contributors are able to receive fair compensation by providing outsized impact that will be highly valued. It incentivizes you to create a positive impact, beyond your intrinsic motivation. This does not mean that the most successful contributors to impactful goods automatically have potential upside comparable to some for-profit startup founders (or that they should), just that their potential upside does depend on how much funders later value their past work. This will attract more talent to the impact sector by improving performance-based compensation. - -The crucial aspect for this to work: funders need to retrospectively fund impact, and send credible signals that they will do so in the future. Based on these signals contributors form expectations about future retrospective rewards and can start working today to receive them in the future. - -Hypercerts facilitate retrospective funding as the impact claims are identifiable, traceable and transferable. Contributors can sell parts of their hypercerts to prospective funders to receive the necessary funding for their project (“activity” in the figure below). The project delivers impact to a larger group (“beneficiaries”), which retrospectively buys the hypercerts from the prospective funder, and from the contributors if they retained some fraction of their hypercerts (the latter is not represented in the figure). - -![Retrospective funding with hypercerts](../../static/img/retrospective_funding.png) - -### Increasing rewards - -Retrospective funding allows us to increase rewards as more impact is created because impact is easier to observe, measure and prove retrospectively. Increasing rewards – as shown in the next figure – incentivizes contributors to put in their highest effort to produce impact and enables contributors to be rewarded for their talent. Moreover, prospective funders are incentivized to select, fund and support the projects with the highest expected impact, if they also receive retrospective rewards. - -![Increasing rewards](../../static/img/increasing_rewards.png) - -Note that retrospective funding should not be used in cases where a significant negative impact is possible since a nongovernmental, permissionless framework can not impose retrospective penalties for negative externalities. See Ofer & Cotton-Barratt (2022) for a discussion of this limitation of retrospective funding. - -In some cases we do not expect the retrospective evaluation to be any different than the prospective evaluation, i.e. there is no uncertainty resolved over time as the impact of an activity is already “known” prospectively. In these cases retrospective funding would only complicate the funding mechanism and funding via grants or milestone bounties would be preferable. Retrospective funding is preferable only if uncertainty is resolved over time. - -### Impact evaluations - -The relevance of impact evaluations will depend on how much their signals influence the funding decisions of retrospective funders (see the potential dynamics in the section on "IFSs"). This is a critical difference to many impact reports today: If a project was funded by a grant, the funders as well as the project want to receive a positive evaluation. If, however, the funding decisions of the retrospective funders are outstanding, they are interested in truthful signals about the impact. Hence, funders value improvements in evaluation methodologies and can fund independent evaluators. Evaluators in turn would build up a reputation for their evaluation methodologies and improve the strength of their signals to retrospective funders. - -Impact evaluators can take on a range of forms ranging forms, such as - -- Voting by relevant communities or beneficiaries -- Expert panels -- Professional evaluators similar to financial rating agencies -- Automatic monitoring and data collection by sensors and oracles - -The most useful form or combinations thereof will depend on the specific requirements of the impact area. For a generalized framework on impact evaluators see Protocol Labs (2023). - -While retrospective funding makes impact evaluations financially relevant for funders and contributors, hypercerts enable to pre-commit funding for those evaluations: As impact claims are never forgotten, any actor can at any time commit funding to a future evaluation of these claims. diff --git a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md b/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md deleted file mode 100644 index 4d4648ba..00000000 --- a/docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Introduction -id: whitepaper-intro ---- - -# Vision & Whitepaper - -:::note - -If you prefer to read the draft whitepaper (v0) as a pdf, you can find it [here](../../static/pdf/hypercerts_whitepaper_v0.pdf). The content is mostly identical to the following pages. - -::: - -#### The world faces unprecedented challenges, from climate change to safe artificial intelligence, that require billions to trillions of dollars of public goods funding. - -High-upside/high-uncertainty endeavors are often overlooked due to the absence of strong incentives to pursue them in the dominant public goods funding framework of at-cost grants or even a milestone-bounty framework (which directly exposes small contributors to aversive risk levels). Yet these should be pursued when the expected positive value is very high, as it often is. New impact funding mechanisms can address this. One such mechanism is retrospective funding, which rewards projects based on the impact they create after the impact is observable. If projects can reasonably expect such retrospective rewards, they are incentivized to maximize their impact and – together with prospective funders – take risky bets when the expected positive value is high. - -#### In order for Impact Funding Systems (IFSs) to be most effective, they should be interoperable regarding (1) funding mechanisms, (2) funding sources, and (3) evaluations. - -Quadratic voting, bargaining solutions, DAO-style votes, milestone bounties, and simple unconditional grants all have their strengths, among others. We do not wish to lock in any particular decision-making scheme for funders. Without mechanisms like these, multi-funder coordination on impact funding is prohibitively expensive, leading to suboptimal efficiency in impact capital allocation. Funders should be able to easily collaborate with other funders or to intentionally fund different projects to diversify the funded approaches. Evaluators should be able to evaluate the same impact with different methodologies – potentially with conflicting results, to foster rigor and progress of evaluation methodologies. - -#### Hypercerts create this interoperability by serving as a single, open, shared, decentralized database for impact funding mechanisms. - -A single hypercert is a semi-fungible token that accounts for work that is supposed to be impactful and whose ownership is fractionizable and transferable (under specific conditions). Hypercerts do not impose any specific funding mechanisms but provide baseline invariant guarantees such that claims will not be forgotten as different mechanisms come into and out of fashion. This is also why hypercerts are especially useful for any retrospective funding mechanisms – funding can be applied to claims of the past. diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ClientError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ClientError.md index a0c9b619..6ff5198d 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ClientError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ClientError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:27 +[sdk/src/types/errors.ts:27](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L27) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:20 +[sdk/src/types/errors.ts:20](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L20) --- diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ConfigurationError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ConfigurationError.md index aa28ba72..ef36adaa 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ConfigurationError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ConfigurationError.md @@ -41,7 +41,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:188 +[sdk/src/types/errors.ts:188](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L188) ## Properties @@ -103,7 +103,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:187 +[sdk/src/types/errors.ts:187](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L187) --- diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ContractError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ContractError.md index 8561bfa7..ec81132a 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ContractError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/ContractError.md @@ -42,7 +42,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:43 +[sdk/src/types/errors.ts:43](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L43) ## Properties @@ -104,7 +104,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:41 +[sdk/src/types/errors.ts:41](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L41) --- diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/FetchError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/FetchError.md index 75c55a8c..1e32a4a2 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/FetchError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/FetchError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:65 +[sdk/src/types/errors.ts:65](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L65) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:58 +[sdk/src/types/errors.ts:58](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L58) --- diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertClient.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertClient.md index 0ef53914..ad12433a 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertClient.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertClient.md @@ -54,7 +54,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -sdk/src/client.ts:55 +[sdk/src/client.ts:55](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L55) ## Properties @@ -64,7 +64,7 @@ sdk/src/client.ts:55 #### Defined in -sdk/src/client.ts:38 +[sdk/src/client.ts:38](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L38) --- @@ -74,7 +74,7 @@ sdk/src/client.ts:38 #### Defined in -sdk/src/client.ts:41 +[sdk/src/client.ts:41](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L41) --- @@ -84,7 +84,7 @@ sdk/src/client.ts:41 #### Defined in -sdk/src/client.ts:42 +[sdk/src/client.ts:42](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L42) --- @@ -158,7 +158,7 @@ sdk/src/client.ts:42 #### Defined in -sdk/src/client.ts:43 +[sdk/src/client.ts:43](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L43) --- @@ -168,7 +168,7 @@ sdk/src/client.ts:43 #### Defined in -sdk/src/client.ts:39 +[sdk/src/client.ts:39](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L39) --- @@ -212,7 +212,7 @@ sdk/src/client.ts:39 #### Defined in -sdk/src/client.ts:44 +[sdk/src/client.ts:44](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L44) --- @@ -228,7 +228,7 @@ Whether the client is in read-only mode. #### Defined in -sdk/src/client.ts:45 +[sdk/src/client.ts:45](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L45) ## Accessors @@ -246,7 +246,7 @@ The client config. #### Defined in -sdk/src/client.ts:79 +[sdk/src/client.ts:79](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L79) --- @@ -268,7 +268,7 @@ The contract. #### Defined in -sdk/src/client.ts:103 +[sdk/src/client.ts:103](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L103) --- @@ -290,7 +290,7 @@ The indexer. #### Defined in -sdk/src/client.ts:95 +[sdk/src/client.ts:95](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L95) --- @@ -312,7 +312,7 @@ The storage layer. #### Defined in -sdk/src/client.ts:87 +[sdk/src/client.ts:87](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L87) ## Methods @@ -351,7 +351,7 @@ Will throw an `InvalidOrMissingError` if any of the proofs are invalid. #### Defined in -sdk/src/client.ts:459 +[sdk/src/client.ts:459](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L459) --- @@ -384,7 +384,7 @@ A promise that resolves to the transaction hash. #### Defined in -sdk/src/client.ts:210 +[sdk/src/client.ts:210](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L210) --- @@ -421,7 +421,7 @@ Will throw a `ClientError` if the claim is not owned by the account. #### Defined in -sdk/src/client.ts:382 +[sdk/src/client.ts:382](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L382) --- @@ -462,7 +462,7 @@ Will throw a `MalformedDataError` if the provided allowlist or metadata is inval #### Defined in -sdk/src/client.ts:243 +[sdk/src/client.ts:243](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L243) --- @@ -482,7 +482,7 @@ sdk/src/client.ts:243 #### Defined in -sdk/src/client.ts:499 +[sdk/src/client.ts:499](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L499) --- @@ -496,7 +496,7 @@ sdk/src/client.ts:499 #### Defined in -sdk/src/client.ts:490 +[sdk/src/client.ts:490](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L490) --- @@ -526,7 +526,7 @@ a Promise that resolves to the applicable transfer restrictions. #### Defined in -sdk/src/client.ts:162 +[sdk/src/client.ts:162](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L162) --- @@ -574,7 +574,7 @@ sdk/src/client.ts:162 #### Defined in -sdk/src/client.ts:509 +[sdk/src/client.ts:509](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L509) --- @@ -611,7 +611,7 @@ Will throw a `ClientError` if any of the fractions are not owned by the account. #### Defined in -sdk/src/client.ts:341 +[sdk/src/client.ts:341](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L341) --- @@ -651,7 +651,7 @@ Will throw a `MalformedDataError` if the provided metadata is invalid. #### Defined in -sdk/src/client.ts:127 +[sdk/src/client.ts:127](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L127) --- @@ -690,7 +690,7 @@ Will throw an `InvalidOrMissingError` if the proof is invalid. #### Defined in -sdk/src/client.ts:415 +[sdk/src/client.ts:415](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L415) --- @@ -713,7 +713,7 @@ sdk/src/client.ts:415 #### Defined in -sdk/src/client.ts:519 +[sdk/src/client.ts:519](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L519) --- @@ -752,7 +752,7 @@ Will throw a `ClientError` if the fraction is not owned by the account or if the #### Defined in -sdk/src/client.ts:296 +[sdk/src/client.ts:296](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L296) --- @@ -782,7 +782,7 @@ Will throw a `ClientError` if the request fails. #### Defined in -sdk/src/client.ts:550 +[sdk/src/client.ts:550](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L550) --- @@ -815,4 +815,4 @@ A promise that resolves to the transaction hash. #### Defined in -sdk/src/client.ts:182 +[sdk/src/client.ts:182](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/client.ts#L182) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertsStorage.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertsStorage.md index 6105ec7c..b76c9f96 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertsStorage.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/HypercertsStorage.md @@ -46,7 +46,7 @@ This constructor takes an optional `overrides` parameter that can be used to ove #### Defined in -sdk/src/storage.ts:47 +[sdk/src/storage.ts:47](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L47) ## Properties @@ -58,7 +58,7 @@ The NFT Storage client used for storing and retrieving Hypercerts. #### Defined in -sdk/src/storage.ts:36 +[sdk/src/storage.ts:36](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L36) --- @@ -70,7 +70,7 @@ Whether the storage is read-only. If true, the storage methods will not perform #### Defined in -sdk/src/storage.ts:34 +[sdk/src/storage.ts:34](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L34) --- @@ -82,7 +82,7 @@ The Web3 Storage client used for storing and retrieving Hypercerts. #### Defined in -sdk/src/storage.ts:38 +[sdk/src/storage.ts:38](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L38) ## Methods @@ -124,7 +124,7 @@ Note: The original implementation using the Web3 Storage client is currently com #### Defined in -sdk/src/storage.ts:167 +[sdk/src/storage.ts:167](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L167) --- @@ -159,7 +159,7 @@ Will throw a `MalformedDataError` if the retrieved data is invalid. #### Defined in -sdk/src/storage.ts:114 +[sdk/src/storage.ts:114](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L114) --- @@ -200,7 +200,7 @@ If you are using our default keys, we may delete older data if we hit our storag #### Defined in -sdk/src/storage.ts:139 +[sdk/src/storage.ts:139](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L139) --- @@ -240,4 +240,4 @@ Will throw a `MalformedDataError` if the provided metadata is invalid. #### Defined in -sdk/src/storage.ts:81 +[sdk/src/storage.ts:81](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/storage.ts#L81) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/InvalidOrMissingError.md index ca034a9d..055cc2e6 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/InvalidOrMissingError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/InvalidOrMissingError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:83 +[sdk/src/types/errors.ts:83](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L83) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:76 +[sdk/src/types/errors.ts:76](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L76) --- diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MalformedDataError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MalformedDataError.md index 826cc8f2..d9349882 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MalformedDataError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MalformedDataError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:155 +[sdk/src/types/errors.ts:155](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L155) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:148 +[sdk/src/types/errors.ts:148](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L148) --- diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MintingError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MintingError.md index 50d11138..66739db6 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MintingError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/MintingError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:101 +[sdk/src/types/errors.ts:101](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L101) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:94 +[sdk/src/types/errors.ts:94](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L94) --- diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/StorageError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/StorageError.md index e8fe2baa..7a9bbf11 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/StorageError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/StorageError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:119 +[sdk/src/types/errors.ts:119](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L119) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:112 +[sdk/src/types/errors.ts:112](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L112) --- diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnknownSchemaError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnknownSchemaError.md index 2325eb5a..5ccf9796 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnknownSchemaError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnknownSchemaError.md @@ -44,7 +44,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:137 +[sdk/src/types/errors.ts:137](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L137) ## Properties @@ -108,7 +108,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:130 +[sdk/src/types/errors.ts:130](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L130) --- diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnsupportedChainError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnsupportedChainError.md index 7c02e287..774e83f5 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnsupportedChainError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/classes/UnsupportedChainError.md @@ -45,7 +45,7 @@ Error.constructor #### Defined in -sdk/src/types/errors.ts:174 +[sdk/src/types/errors.ts:174](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L174) ## Properties @@ -109,7 +109,7 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:167 +[sdk/src/types/errors.ts:167](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L167) --- diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/CustomError.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/CustomError.md index 3b0952f8..a05c1011 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/CustomError.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/CustomError.md @@ -35,4 +35,4 @@ Additional error payload. #### Defined in -sdk/src/types/errors.ts:10 +[sdk/src/types/errors.ts:10](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L10) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/DuplicateEvaluation.md index 4da8fd22..4c1a3b98 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/DuplicateEvaluation.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -sdk/src/types/evaluation.d.ts:22 +[sdk/src/types/evaluation.d.ts:22](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L22) --- @@ -28,7 +28,7 @@ sdk/src/types/evaluation.d.ts:22 #### Defined in -sdk/src/types/evaluation.d.ts:24 +[sdk/src/types/evaluation.d.ts:24](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L24) --- @@ -38,7 +38,7 @@ sdk/src/types/evaluation.d.ts:24 #### Defined in -sdk/src/types/evaluation.d.ts:23 +[sdk/src/types/evaluation.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L23) --- @@ -48,4 +48,4 @@ sdk/src/types/evaluation.d.ts:23 #### Defined in -sdk/src/types/evaluation.d.ts:21 +[sdk/src/types/evaluation.d.ts:21](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/EASEvaluation.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/EASEvaluation.md index 9328c6cd..8e19a07b 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/EASEvaluation.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/EASEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -sdk/src/types/evaluation.d.ts:41 +[sdk/src/types/evaluation.d.ts:41](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L41) --- @@ -28,7 +28,7 @@ sdk/src/types/evaluation.d.ts:41 #### Defined in -sdk/src/types/evaluation.d.ts:42 +[sdk/src/types/evaluation.d.ts:42](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L42) --- @@ -38,7 +38,7 @@ sdk/src/types/evaluation.d.ts:42 #### Defined in -sdk/src/types/evaluation.d.ts:40 +[sdk/src/types/evaluation.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L40) --- @@ -48,4 +48,4 @@ sdk/src/types/evaluation.d.ts:40 #### Defined in -sdk/src/types/evaluation.d.ts:43 +[sdk/src/types/evaluation.d.ts:43](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClaimdata.md index cc3c8ce2..cb04ac04 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClaimdata.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -34,7 +34,7 @@ Contributors #### Defined in -sdk/src/types/claimdata.d.ts:53 +[sdk/src/types/claimdata.d.ts:53](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L53) --- @@ -59,7 +59,7 @@ Scopes of impact #### Defined in -sdk/src/types/claimdata.d.ts:15 +[sdk/src/types/claimdata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L15) --- @@ -83,7 +83,7 @@ Impact time period. The value is UNIX time in seconds from epoch. #### Defined in -sdk/src/types/claimdata.d.ts:44 +[sdk/src/types/claimdata.d.ts:44](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L44) --- @@ -108,7 +108,7 @@ Rights #### Defined in -sdk/src/types/claimdata.d.ts:62 +[sdk/src/types/claimdata.d.ts:62](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L62) --- @@ -133,7 +133,7 @@ Scopes of work #### Defined in -sdk/src/types/claimdata.d.ts:25 +[sdk/src/types/claimdata.d.ts:25](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L25) --- @@ -157,4 +157,4 @@ Work time period. The value is UNIX time in seconds from epoch. #### Defined in -sdk/src/types/claimdata.d.ts:35 +[sdk/src/types/claimdata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientInterface.md index 9b969ab0..d11e9857 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientInterface.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -62,7 +62,7 @@ The order of the arrays must be equal. #### Defined in -sdk/src/types/client.ts:237 +[sdk/src/types/client.ts:237](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L237) --- @@ -96,7 +96,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:171 +[sdk/src/types/client.ts:171](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L171) --- @@ -128,7 +128,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:212 +[sdk/src/types/client.ts:212](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L212) --- @@ -142,7 +142,7 @@ sdk/src/types/client.ts:212 #### Defined in -sdk/src/types/client.ts:124 +[sdk/src/types/client.ts:124](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L124) --- @@ -177,7 +177,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:185 +[sdk/src/types/client.ts:185](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L185) --- @@ -209,7 +209,7 @@ A Promise that resolves to the applicable transfer restrictions. #### Defined in -sdk/src/types/client.ts:149 +[sdk/src/types/client.ts:149](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L149) --- @@ -225,7 +225,7 @@ The indexer used by the client. #### Defined in -sdk/src/types/client.ts:123 +[sdk/src/types/client.ts:123](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L123) --- @@ -257,7 +257,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:205 +[sdk/src/types/client.ts:205](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L205) --- @@ -291,7 +291,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:138 +[sdk/src/types/client.ts:138](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L138) --- @@ -325,7 +325,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:221 +[sdk/src/types/client.ts:221](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L221) --- @@ -341,7 +341,7 @@ Whether the client is in read-only mode. #### Defined in -sdk/src/types/client.ts:119 +[sdk/src/types/client.ts:119](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L119) --- @@ -374,7 +374,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:198 +[sdk/src/types/client.ts:198](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L198) --- @@ -390,7 +390,7 @@ The storage layer used by the client. #### Defined in -sdk/src/types/client.ts:121 +[sdk/src/types/client.ts:121](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L121) --- @@ -424,4 +424,4 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:158 +[sdk/src/types/client.ts:158](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L158) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientMethods.md index c6f4aa3c..a7f5f483 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientMethods.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -52,7 +52,7 @@ The order of the arrays must be equal. #### Defined in -sdk/src/types/client.ts:237 +[sdk/src/types/client.ts:237](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L237) --- @@ -82,7 +82,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:171 +[sdk/src/types/client.ts:171](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L171) --- @@ -110,7 +110,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:212 +[sdk/src/types/client.ts:212](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L212) --- @@ -141,7 +141,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:185 +[sdk/src/types/client.ts:185](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L185) --- @@ -169,7 +169,7 @@ A Promise that resolves to the applicable transfer restrictions. #### Defined in -sdk/src/types/client.ts:149 +[sdk/src/types/client.ts:149](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L149) --- @@ -197,7 +197,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:205 +[sdk/src/types/client.ts:205](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L205) --- @@ -227,7 +227,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:138 +[sdk/src/types/client.ts:138](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L138) --- @@ -257,7 +257,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:221 +[sdk/src/types/client.ts:221](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L221) --- @@ -286,7 +286,7 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:198 +[sdk/src/types/client.ts:198](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L198) --- @@ -316,4 +316,4 @@ A Promise that resolves to the transaction hash #### Defined in -sdk/src/types/client.ts:158 +[sdk/src/types/client.ts:158](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L158) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientState.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientState.md index 69a38d6f..7f899d66 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientState.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertClientState.md @@ -22,7 +22,7 @@ The state of the Hypercert client. #### Defined in -sdk/src/types/client.ts:124 +[sdk/src/types/client.ts:124](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L124) --- @@ -34,7 +34,7 @@ The indexer used by the client. #### Defined in -sdk/src/types/client.ts:123 +[sdk/src/types/client.ts:123](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L123) --- @@ -46,7 +46,7 @@ Whether the client is in read-only mode. #### Defined in -sdk/src/types/client.ts:119 +[sdk/src/types/client.ts:119](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L119) --- @@ -58,4 +58,4 @@ The storage layer used by the client. #### Defined in -sdk/src/types/client.ts:121 +[sdk/src/types/client.ts:121](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L121) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md index 59e77fde..3f5aafc4 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -20,7 +20,7 @@ Schema for evaluating Hypercerts across different sources and evaluation types #### Defined in -sdk/src/types/evaluation.d.ts:15 +[sdk/src/types/evaluation.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L15) --- @@ -30,7 +30,7 @@ sdk/src/types/evaluation.d.ts:15 #### Defined in -sdk/src/types/evaluation.d.ts:16 +[sdk/src/types/evaluation.d.ts:16](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L16) --- @@ -40,4 +40,4 @@ sdk/src/types/evaluation.d.ts:16 #### Defined in -sdk/src/types/evaluation.d.ts:17 +[sdk/src/types/evaluation.d.ts:17](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md index dcda3dd2..a1500d48 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -10,11 +10,11 @@ custom_edit_url: null ### claimById -• **claimById**: (`id`: `string`) => `Promise`<`undefined` \| `ClaimByIdQuery`\> +• **claimById**: (`id`: `string`) => `Promise`<`undefined` \| [`ClaimByIdQuery`](../modules.md#claimbyidquery)\> #### Type declaration -▸ (`id`): `Promise`<`undefined` \| `ClaimByIdQuery`\> +▸ (`id`): `Promise`<`undefined` \| [`ClaimByIdQuery`](../modules.md#claimbyidquery)\> ##### Parameters @@ -24,21 +24,21 @@ custom_edit_url: null ##### Returns -`Promise`<`undefined` \| `ClaimByIdQuery`\> +`Promise`<`undefined` \| [`ClaimByIdQuery`](../modules.md#claimbyidquery)\> #### Defined in -sdk/src/types/indexer.ts:20 +[sdk/src/types/indexer.ts:20](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L20) --- ### claimsByOwner -• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimsByOwnerQuery`\> +• **claimsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| [`ClaimsByOwnerQuery`](../modules.md#claimsbyownerquery)\> #### Type declaration -▸ (`owner`, `params?`): `Promise`<`undefined` \| `ClaimsByOwnerQuery`\> +▸ (`owner`, `params?`): `Promise`<`undefined` \| [`ClaimsByOwnerQuery`](../modules.md#claimsbyownerquery)\> ##### Parameters @@ -49,21 +49,21 @@ sdk/src/types/indexer.ts:20 ##### Returns -`Promise`<`undefined` \| `ClaimsByOwnerQuery`\> +`Promise`<`undefined` \| [`ClaimsByOwnerQuery`](../modules.md#claimsbyownerquery)\> #### Defined in -sdk/src/types/indexer.ts:19 +[sdk/src/types/indexer.ts:19](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L19) --- ### firstClaims -• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `RecentClaimsQuery`\> +• **firstClaims**: (`params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| [`RecentClaimsQuery`](../modules.md#recentclaimsquery)\> #### Type declaration -▸ (`params?`): `Promise`<`undefined` \| `RecentClaimsQuery`\> +▸ (`params?`): `Promise`<`undefined` \| [`RecentClaimsQuery`](../modules.md#recentclaimsquery)\> ##### Parameters @@ -73,21 +73,21 @@ sdk/src/types/indexer.ts:19 ##### Returns -`Promise`<`undefined` \| `RecentClaimsQuery`\> +`Promise`<`undefined` \| [`RecentClaimsQuery`](../modules.md#recentclaimsquery)\> #### Defined in -sdk/src/types/indexer.ts:21 +[sdk/src/types/indexer.ts:21](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L21) --- ### fractionById -• **fractionById**: (`fractionId`: `string`) => `Promise`<`undefined` \| `ClaimTokenByIdQuery`\> +• **fractionById**: (`fractionId`: `string`) => `Promise`<`undefined` \| [`ClaimTokenByIdQuery`](../modules.md#claimtokenbyidquery)\> #### Type declaration -▸ (`fractionId`): `Promise`<`undefined` \| `ClaimTokenByIdQuery`\> +▸ (`fractionId`): `Promise`<`undefined` \| [`ClaimTokenByIdQuery`](../modules.md#claimtokenbyidquery)\> ##### Parameters @@ -97,21 +97,21 @@ sdk/src/types/indexer.ts:21 ##### Returns -`Promise`<`undefined` \| `ClaimTokenByIdQuery`\> +`Promise`<`undefined` \| [`ClaimTokenByIdQuery`](../modules.md#claimtokenbyidquery)\> #### Defined in -sdk/src/types/indexer.ts:24 +[sdk/src/types/indexer.ts:24](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L24) --- ### fractionsByClaim -• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> +• **fractionsByClaim**: (`claimId`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| [`ClaimTokensByClaimQuery`](../modules.md#claimtokensbyclaimquery)\> #### Type declaration -▸ (`claimId`, `params?`): `Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> +▸ (`claimId`, `params?`): `Promise`<`undefined` \| [`ClaimTokensByClaimQuery`](../modules.md#claimtokensbyclaimquery)\> ##### Parameters @@ -122,21 +122,21 @@ sdk/src/types/indexer.ts:24 ##### Returns -`Promise`<`undefined` \| `ClaimTokensByClaimQuery`\> +`Promise`<`undefined` \| [`ClaimTokensByClaimQuery`](../modules.md#claimtokensbyclaimquery)\> #### Defined in -sdk/src/types/indexer.ts:23 +[sdk/src/types/indexer.ts:23](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L23) --- ### fractionsByOwner -• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> +• **fractionsByOwner**: (`owner`: `string`, `params?`: [`QueryParams`](../modules.md#queryparams)) => `Promise`<`undefined` \| [`ClaimTokensByOwnerQuery`](../modules.md#claimtokensbyownerquery)\> #### Type declaration -▸ (`owner`, `params?`): `Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> +▸ (`owner`, `params?`): `Promise`<`undefined` \| [`ClaimTokensByOwnerQuery`](../modules.md#claimtokensbyownerquery)\> ##### Parameters @@ -147,11 +147,11 @@ sdk/src/types/indexer.ts:23 ##### Returns -`Promise`<`undefined` \| `ClaimTokensByOwnerQuery`\> +`Promise`<`undefined` \| [`ClaimTokensByOwnerQuery`](../modules.md#claimtokensbyownerquery)\> #### Defined in -sdk/src/types/indexer.ts:22 +[sdk/src/types/indexer.ts:22](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L22) --- @@ -161,4 +161,4 @@ sdk/src/types/indexer.ts:22 #### Defined in -sdk/src/types/indexer.ts:18 +[sdk/src/types/indexer.ts:18](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L18) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertMetadata.md index c0a9cbf8..f6493ef1 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertMetadata.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertMetadata.md @@ -18,7 +18,7 @@ A CID pointer to the merke tree proof json on ipfs #### Defined in -sdk/src/types/metadata.d.ts:39 +[sdk/src/types/metadata.d.ts:39](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L39) --- @@ -30,7 +30,7 @@ Describes the asset to which this token represents #### Defined in -sdk/src/types/metadata.d.ts:19 +[sdk/src/types/metadata.d.ts:19](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L19) --- @@ -42,7 +42,7 @@ An url pointing to the external website of the project #### Defined in -sdk/src/types/metadata.d.ts:23 +[sdk/src/types/metadata.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L23) --- @@ -52,7 +52,7 @@ sdk/src/types/metadata.d.ts:23 #### Defined in -sdk/src/types/metadata.d.ts:45 +[sdk/src/types/metadata.d.ts:45](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L45) --- @@ -64,7 +64,7 @@ A URI pointing to a resource with mime type image/\* representing the asset to w #### Defined in -sdk/src/types/metadata.d.ts:27 +[sdk/src/types/metadata.d.ts:27](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L27) --- @@ -76,7 +76,7 @@ Identifies the asset to which this token represents #### Defined in -sdk/src/types/metadata.d.ts:15 +[sdk/src/types/metadata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L15) --- @@ -86,7 +86,7 @@ sdk/src/types/metadata.d.ts:15 #### Defined in -sdk/src/types/metadata.d.ts:40 +[sdk/src/types/metadata.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L40) --- @@ -98,7 +98,7 @@ Describes the asset to which this token represents #### Defined in -sdk/src/types/metadata.d.ts:35 +[sdk/src/types/metadata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L35) --- @@ -110,4 +110,4 @@ The version of Hypercert schema used to describe this hypercert #### Defined in -sdk/src/types/metadata.d.ts:31 +[sdk/src/types/metadata.d.ts:31](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertPointer.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertPointer.md index f97b5d26..199f6f54 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertPointer.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertPointer.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -sdk/src/types/evaluation.d.ts:28 +[sdk/src/types/evaluation.d.ts:28](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L28) --- @@ -28,7 +28,7 @@ sdk/src/types/evaluation.d.ts:28 #### Defined in -sdk/src/types/evaluation.d.ts:30 +[sdk/src/types/evaluation.d.ts:30](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L30) --- @@ -38,4 +38,4 @@ sdk/src/types/evaluation.d.ts:30 #### Defined in -sdk/src/types/evaluation.d.ts:29 +[sdk/src/types/evaluation.d.ts:29](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertStorageInterface.md index ba0a2551..ff50839f 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertStorageInterface.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -38,7 +38,7 @@ A Promise that resolves to the retrieved data. #### Defined in -sdk/src/types/client.ts:98 +[sdk/src/types/client.ts:98](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L98) --- @@ -66,7 +66,7 @@ A Promise that resolves to the retrieved metadata. #### Defined in -sdk/src/types/client.ts:84 +[sdk/src/types/client.ts:84](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L84) --- @@ -94,7 +94,7 @@ A Promise that resolves to the CID of the stored data. #### Defined in -sdk/src/types/client.ts:91 +[sdk/src/types/client.ts:91](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L91) --- @@ -122,4 +122,4 @@ A Promise that resolves to the CID of the stored metadata. #### Defined in -sdk/src/types/client.ts:77 +[sdk/src/types/client.ts:77](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L77) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/IPFSEvaluation.md index 15835a1e..1d8c13e2 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/IPFSEvaluation.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -sdk/src/types/evaluation.d.ts:48 +[sdk/src/types/evaluation.d.ts:48](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L48) --- @@ -28,4 +28,4 @@ sdk/src/types/evaluation.d.ts:48 #### Defined in -sdk/src/types/evaluation.d.ts:47 +[sdk/src/types/evaluation.d.ts:47](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md index 0ad3d38f..20457082 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -sdk/src/types/evaluation.d.ts:35 +[sdk/src/types/evaluation.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L35) --- @@ -28,7 +28,7 @@ sdk/src/types/evaluation.d.ts:35 #### Defined in -sdk/src/types/evaluation.d.ts:36 +[sdk/src/types/evaluation.d.ts:36](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L36) --- @@ -38,4 +38,4 @@ sdk/src/types/evaluation.d.ts:36 #### Defined in -sdk/src/types/evaluation.d.ts:34 +[sdk/src/types/evaluation.d.ts:34](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/versioned_docs/version-1.0.0/developer/api/sdk/modules.md b/docs/versioned_docs/version-1.0.0/developer/api/sdk/modules.md index 0d5aa920..b5d8bab0 100644 --- a/docs/versioned_docs/version-1.0.0/developer/api/sdk/modules.md +++ b/docs/versioned_docs/version-1.0.0/developer/api/sdk/modules.md @@ -55,7 +55,138 @@ Represents an entry in an allowlist. #### Defined in -sdk/src/types/hypercerts.ts:24 +[sdk/src/types/hypercerts.ts:24](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/hypercerts.ts#L24) + +--- + +### Claim + +Ƭ **Claim**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :-------------------------------------------- | +| `__typename?` | `"Claim"` | +| `allowlist?` | `Maybe`<`Allowlist`\> | +| `contract` | `Scalars`[`"String"`][``"output"``] | +| `creation` | `Scalars`[`"BigInt"`][``"output"``] | +| `creator?` | `Maybe`<`Scalars`[`"Bytes"`][``"output"``]\> | +| `id` | `Scalars`[`"String"`][``"output"``] | +| `owner?` | `Maybe`<`Scalars`[`"Bytes"`][``"output"``]\> | +| `tokenID` | `Scalars`[`"BigInt"`][``"output"``] | +| `totalUnits?` | `Maybe`<`Scalars`[`"BigInt"`][``"output"``]\> | +| `uri?` | `Maybe`<`Scalars`[`"String"`][``"output"``]\> | + +#### Defined in + +[sdk/src/indexer/gql/graphql.ts:116](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L116) + +--- + +### ClaimByIdQuery + +Ƭ **ClaimByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claim?` | \{ `__typename?`: `"Claim"` ; `contract`: `string` ; `creator?`: `any` \| `null` ; `id`: `string` ; `owner?`: `any` \| `null` ; `tokenID`: `any` ; `totalUnits?`: `any` \| `null` ; `uri?`: `string` \| `null` } \| `null` | + +#### Defined in + +[sdk/src/indexer/gql/graphql.ts:587](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L587) + +--- + +### ClaimToken + +Ƭ **ClaimToken**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :---------------------------------- | +| `__typename?` | `"ClaimToken"` | +| `claim` | [`Claim`](modules.md#claim) | +| `id` | `Scalars`[`"String"`][``"output"``] | +| `owner` | `Scalars`[`"Bytes"`][``"output"``] | +| `tokenID` | `Scalars`[`"BigInt"`][``"output"``] | +| `units` | `Scalars`[`"BigInt"`][``"output"``] | + +#### Defined in + +[sdk/src/indexer/gql/graphql.ts:129](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L129) + +--- + +### ClaimTokenByIdQuery + +Ƭ **ClaimTokenByIdQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claimToken?` | \{ `__typename?`: `"ClaimToken"` ; `claim`: \{ `__typename?`: `"Claim"` ; `creation`: `any` ; `id`: `string` ; `totalUnits?`: `any` \| `null` ; `uri?`: `string` \| `null` } ; `id`: `string` ; `owner`: `any` ; `tokenID`: `any` ; `units`: `any` } \| `null` | + +#### Defined in + +[sdk/src/indexer/gql/graphql.ts:636](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L636) + +--- + +### ClaimTokensByClaimQuery + +Ƭ **ClaimTokensByClaimQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :--------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claimTokens` | \{ `__typename?`: `"ClaimToken"` ; `id`: `string` ; `owner`: `any` ; `tokenID`: `any` ; `units`: `any` }[] | + +#### Defined in + +[sdk/src/indexer/gql/graphql.ts:627](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L627) + +--- + +### ClaimTokensByOwnerQuery + +Ƭ **ClaimTokensByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claimTokens` | \{ `__typename?`: `"ClaimToken"` ; `claim`: \{ `__typename?`: `"Claim"` ; `creation`: `any` ; `id`: `string` ; `totalUnits?`: `any` \| `null` ; `uri?`: `string` \| `null` } ; `id`: `string` ; `owner`: `any` ; `tokenID`: `any` ; `units`: `any` }[] | + +#### Defined in + +[sdk/src/indexer/gql/graphql.ts:608](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L608) + +--- + +### ClaimsByOwnerQuery + +Ƭ **ClaimsByOwnerQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claims` | \{ `__typename?`: `"Claim"` ; `contract`: `string` ; `creator?`: `any` \| `null` ; `id`: `string` ; `owner?`: `any` \| `null` ; `tokenID`: `any` ; `totalUnits?`: `any` \| `null` ; `uri?`: `string` \| `null` }[] | + +#### Defined in + +[sdk/src/indexer/gql/graphql.ts:549](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L549) --- @@ -76,7 +207,23 @@ Represents a deployment of a contract on a specific network. #### Defined in -sdk/src/types/client.ts:23 +[sdk/src/types/client.ts:23](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L23) + +--- + +### DocumentType + +Ƭ **DocumentType**<`TDocumentNode`\>: `TDocumentNode` extends `DocumentNode` ? `TType` : `never` + +#### Type parameters + +| Name | Type | +| :-------------- | :------------------------------------ | +| `TDocumentNode` | extends `DocumentNode`<`any`, `any`\> | + +#### Defined in + +[sdk/src/indexer/gql/gql.ts:53](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/gql.ts#L53) --- @@ -90,7 +237,7 @@ and run json-schema-to-typescript to regenerate this file. #### Defined in -sdk/src/types/evaluation.d.ts:8 +[sdk/src/types/evaluation.d.ts:8](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L8) --- @@ -100,7 +247,23 @@ sdk/src/types/evaluation.d.ts:8 #### Defined in -sdk/src/types/evaluation.d.ts:9 +[sdk/src/types/evaluation.d.ts:9](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/evaluation.d.ts#L9) + +--- + +### FragmentType + +Ƭ **FragmentType**<`TDocumentType`\>: `TDocumentType` extends `DocumentTypeDecoration` ? [`TType`] extends [\{ ` $fragmentName?`: infer TKey }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in TKey]: TType } } : `never` : `never` : `never` + +#### Type parameters + +| Name | Type | +| :-------------- | :---------------------------------------------- | +| `TDocumentType` | extends `DocumentTypeDecoration`<`any`, `any`\> | + +#### Defined in + +[sdk/src/indexer/gql/fragment-masking.ts:5](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L5) --- @@ -112,7 +275,7 @@ Configuration options for the Hypercert client. #### Defined in -sdk/src/types/client.ts:35 +[sdk/src/types/client.ts:35](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L35) --- @@ -130,7 +293,7 @@ The props for the Hypercert client. #### Defined in -sdk/src/types/client.ts:104 +[sdk/src/types/client.ts:104](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L104) --- @@ -146,7 +309,7 @@ The signer is required for submitting evaluations. #### Defined in -sdk/src/types/client.ts:64 +[sdk/src/types/client.ts:64](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L64) --- @@ -169,7 +332,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -sdk/src/types/client.ts:53 +[sdk/src/types/client.ts:53](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L53) --- @@ -179,7 +342,7 @@ sdk/src/types/client.ts:53 #### Defined in -sdk/src/types/errors.ts:195 +[sdk/src/types/errors.ts:195](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/errors.ts#L195) --- @@ -201,7 +364,24 @@ sdk/src/types/errors.ts:195 #### Defined in -sdk/src/types/indexer.ts:10 +[sdk/src/types/indexer.ts:10](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/indexer.ts#L10) + +--- + +### RecentClaimsQuery + +Ƭ **RecentClaimsQuery**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__typename?` | `"Query"` | +| `claims` | \{ `__typename?`: `"Claim"` ; `contract`: `string` ; `creator?`: `any` \| `null` ; `id`: `string` ; `owner?`: `any` \| `null` ; `tokenID`: `any` ; `totalUnits?`: `any` \| `null` ; `uri?`: `string` \| `null` }[] | + +#### Defined in + +[sdk/src/indexer/gql/graphql.ts:569](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/graphql.ts#L569) --- @@ -211,7 +391,7 @@ sdk/src/types/indexer.ts:10 #### Defined in -sdk/src/types/client.ts:13 +[sdk/src/types/client.ts:13](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L13) --- @@ -229,7 +409,7 @@ sdk/src/types/client.ts:13 #### Defined in -sdk/src/types/client.ts:14 +[sdk/src/types/client.ts:14](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/client.ts#L14) --- @@ -239,9 +419,9 @@ sdk/src/types/client.ts:14 #### Defined in -sdk/src/types/hypercerts.ts:9 +[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/hypercerts.ts#L9) -sdk/src/types/hypercerts.ts:15 +[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/hypercerts.ts#L15) ## Variables @@ -251,7 +431,7 @@ sdk/src/types/hypercerts.ts:15 #### Defined in -node_modules/.pnpm/@hypercerts-org+contracts@1.0.0-alpha.6_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:1524 +node_modules/.pnpm/@hypercerts-org+contracts@1.0.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:1524 --- @@ -261,7 +441,7 @@ node_modules/.pnpm/@hypercerts-org+contracts@1.0.0-alpha.6_ts-node@10.9.1_typesc #### Defined in -node_modules/.pnpm/@hypercerts-org+contracts@1.0.0-alpha.6_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:352 +node_modules/.pnpm/@hypercerts-org+contracts@1.0.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:352 --- @@ -281,9 +461,9 @@ Represents the possible transfer restrictions of a claim matching the hypercerts #### Defined in -sdk/src/types/hypercerts.ts:9 +[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/hypercerts.ts#L9) -sdk/src/types/hypercerts.ts:15 +[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/types/hypercerts.ts#L15) --- @@ -293,7 +473,7 @@ sdk/src/types/hypercerts.ts:15 #### Defined in -sdk/src/constants.ts:10 +[sdk/src/constants.ts:10](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/constants.ts#L10) --- @@ -312,7 +492,7 @@ sdk/src/constants.ts:10 #### Defined in -sdk/src/utils/logger.ts:24 +[sdk/src/utils/logger.ts:24](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/logger.ts#L24) ## Functions @@ -351,7 +531,7 @@ Formats input data to an object containing HypercertMetadata including appropria #### Defined in -sdk/src/utils/formatter.ts:27 +[sdk/src/utils/formatter.ts:27](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/formatter.ts#L27) --- @@ -385,7 +565,7 @@ Will throw a `StoragjeError` if the data cannot be fetched from either gateway. #### Defined in -sdk/src/utils/fetchers.ts:17 +[sdk/src/utils/fetchers.ts:17](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/fetchers.ts#L17) --- @@ -420,7 +600,82 @@ Will throw an error if the Merkle tree cannot be fetched. #### Defined in -sdk/src/utils/allowlist.ts:35 +[sdk/src/utils/allowlist.ts:35](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/allowlist.ts#L35) + +--- + +### graphql + +▸ **graphql**(`source`): `unknown` + +The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `source` | `string` | + +#### Returns + +`unknown` + +**`Example`** + +```ts +const query = graphql( + ` + query GetUser($id: ID!) { + user(id: $id) { + name + } + } + `, +); +``` + +The query argument is unknown! +Please regenerate the types. + +#### Defined in + +[sdk/src/indexer/gql/gql.ts:34](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/gql.ts#L34) + +▸ **graphql**(`source`): typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}"``] + +The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + +#### Parameters + +| Name | Type | +| :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `source` | `"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}"` | + +#### Returns + +typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}"``] + +#### Defined in + +[sdk/src/indexer/gql/gql.ts:39](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/gql.ts#L39) + +▸ **graphql**(`source`): typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}"``] + +The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + +#### Parameters + +| Name | Type | +| :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `source` | `"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}"` | + +#### Returns + +typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}"``] + +#### Defined in + +[sdk/src/indexer/gql/gql.ts:45](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/gql.ts#L45) --- @@ -440,7 +695,7 @@ sdk/src/utils/allowlist.ts:35 #### Defined in -sdk/src/utils/errors.ts:39 +[sdk/src/utils/errors.ts:39](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/errors.ts#L39) --- @@ -462,7 +717,64 @@ Method to catch errors and log them #### Defined in -sdk/src/utils/errors.ts:22 +[sdk/src/utils/errors.ts:22](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/errors.ts#L22) + +--- + +### isFragmentReady + +▸ **isFragmentReady**<`TQuery`, `TFrag`\>(`queryNode`, `fragmentNode`, `data`): data is [TFrag] extends [Object] ? TKey extends string ? Object : never : never + +#### Type parameters + +| Name | +| :------- | +| `TQuery` | +| `TFrag` | + +#### Parameters + +| Name | Type | +| :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `queryNode` | `DocumentTypeDecoration`<`TQuery`, `any`\> | +| `fragmentNode` | `TypedDocumentNode`<`TFrag`, \{ `[key: string]`: `any`; }\> | +| `data` | `undefined` \| `null` \| [`Incremental`<`TFrag`\>] extends [\{ ` $fragmentName?`: `TKey` }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in string]: Object } } : `never` : `never` | + +#### Returns + +data is [TFrag] extends [Object] ? TKey extends string ? Object : never : never + +#### Defined in + +[sdk/src/indexer/gql/fragment-masking.ts:51](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L51) + +--- + +### makeFragmentData + +▸ **makeFragmentData**<`F`, `FT`\>(`data`, `_fragment`): [`FragmentType`](modules.md#fragmenttype)<`F`\> + +#### Type parameters + +| Name | Type | +| :--- | :---------------------------------------------- | +| `F` | extends `DocumentTypeDecoration`<`any`, `any`\> | +| `FT` | extends `any` | + +#### Parameters + +| Name | Type | +| :---------- | :--- | +| `data` | `FT` | +| `_fragment` | `F` | + +#### Returns + +[`FragmentType`](modules.md#fragmenttype)<`F`\> + +#### Defined in + +[sdk/src/indexer/gql/fragment-masking.ts:45](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L45) --- @@ -552,7 +864,103 @@ An ethers.js `Provider` instance, or `undefined` if no chain is found in the `Pu #### Defined in -sdk/src/utils/adapters.ts:19 +[sdk/src/utils/adapters.ts:19](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/adapters.ts#L19) + +--- + +### useFragment + +▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `TType` + +#### Type parameters + +| Name | +| :------ | +| `TType` | + +#### Parameters + +| Name | Type | +| :-------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- | +| `_documentNode` | `DocumentTypeDecoration`<`TType`, `any`\> | +| `fragmentType` | [`TType`] extends [\{ ` $fragmentName?`: `TKey` }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in string]: TType } } : `never` : `never` | + +#### Returns + +`TType` + +#### Defined in + +[sdk/src/indexer/gql/fragment-masking.ts:15](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L15) + +▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `TType` \| `null` \| `undefined` + +#### Type parameters + +| Name | +| :------ | +| `TType` | + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `_documentNode` | `DocumentTypeDecoration`<`TType`, `any`\> | +| `fragmentType` | `undefined` \| `null` \| [`TType`] extends [\{ ` $fragmentName?`: `TKey` }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in string]: TType } } : `never` : `never` | + +#### Returns + +`TType` \| `null` \| `undefined` + +#### Defined in + +[sdk/src/indexer/gql/fragment-masking.ts:20](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L20) + +▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> + +#### Type parameters + +| Name | +| :------ | +| `TType` | + +#### Parameters + +| Name | Type | +| :-------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `_documentNode` | `DocumentTypeDecoration`<`TType`, `any`\> | +| `fragmentType` | readonly [`TType`] extends [\{ ` $fragmentName?`: `TKey` }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in string]: TType } } : `never` : `never`[] | + +#### Returns + +`ReadonlyArray`<`TType`\> + +#### Defined in + +[sdk/src/indexer/gql/fragment-masking.ts:25](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L25) + +▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> \| `null` \| `undefined` + +#### Type parameters + +| Name | +| :------ | +| `TType` | + +#### Parameters + +| Name | Type | +| :-------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `_documentNode` | `DocumentTypeDecoration`<`TType`, `any`\> | +| `fragmentType` | `undefined` \| `null` \| readonly [`TType`] extends [\{ ` $fragmentName?`: `TKey` }] ? `TKey` extends `string` ? \{ ` $fragmentRefs?`: \{ [key in string]: TType } } : `never` : `never`[] | + +#### Returns + +`ReadonlyArray`<`TType`\> \| `null` \| `undefined` + +#### Defined in + +[sdk/src/indexer/gql/fragment-masking.ts:30](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/indexer/gql/fragment-masking.ts#L30) --- @@ -580,7 +988,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -sdk/src/validator/index.ts:108 +[sdk/src/validator/index.ts:108](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L108) --- @@ -608,7 +1016,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -sdk/src/validator/index.ts:77 +[sdk/src/validator/index.ts:77](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L77) --- @@ -636,7 +1044,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -sdk/src/validator/index.ts:139 +[sdk/src/validator/index.ts:139](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L139) --- @@ -664,7 +1072,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -sdk/src/validator/index.ts:46 +[sdk/src/validator/index.ts:46](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L46) --- @@ -692,7 +1100,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -sdk/src/validator/index.ts:169 +[sdk/src/validator/index.ts:169](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L169) --- @@ -724,7 +1132,7 @@ Will throw a `MintingError` if the signer address is invalid or if the Merkle pr #### Defined in -sdk/src/validator/index.ts:201 +[sdk/src/validator/index.ts:201](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L201) --- @@ -756,7 +1164,7 @@ Will throw a `MintingError` if the lengths of the input arrays are not equal or #### Defined in -sdk/src/validator/index.ts:224 +[sdk/src/validator/index.ts:224](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/validator/index.ts#L224) --- @@ -815,4 +1223,4 @@ An ethers.js `Signer` instance, or `undefined` if no chain is found in the `Wall #### Defined in -sdk/src/utils/adapters.ts:51 +[sdk/src/utils/adapters.ts:51](https://github.com/hypercerts-org/hypercerts/blob/0793659/sdk/src/utils/adapters.ts#L51) From ad5d0c3c49fd6fe2d23e710d72cb0f43376acf83 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Thu, 14 Dec 2023 18:11:02 +0100 Subject: [PATCH 046/118] (feat): add initial version of delete on order fulfilled script --- .../delete-order-on-order-fulfilled.ts | 1895 +++++++++++++++++ 1 file changed, 1895 insertions(+) create mode 100644 defender/src/auto-tasks/delete-order-on-order-fulfilled.ts diff --git a/defender/src/auto-tasks/delete-order-on-order-fulfilled.ts b/defender/src/auto-tasks/delete-order-on-order-fulfilled.ts new file mode 100644 index 00000000..9440950e --- /dev/null +++ b/defender/src/auto-tasks/delete-order-on-order-fulfilled.ts @@ -0,0 +1,1895 @@ +import { + AutotaskEvent, + BlockTriggerEvent, +} from "@openzeppelin/defender-autotask-utils"; +import { getNetworkConfigFromName } from "../networks"; +import { createClient } from "@supabase/supabase-js"; +import fetch from "node-fetch"; +import { ethers } from "ethers"; +import { MissingDataError, NotImplementedError } from "../errors"; + +export async function handler(event: AutotaskEvent) { + console.log( + "Event: ", + JSON.stringify( + { ...event, secrets: "HIDDEN", credentials: "HIDDEN" }, + null, + 2, + ), + ); + const network = getNetworkConfigFromName(event.autotaskName); + const { SUPABASE_URL, SUPABASE_SECRET_API_KEY } = event.secrets; + const ALCHEMY_KEY = event.secrets[network.alchemyKeyEnvName]; + + const client = createClient(SUPABASE_URL, SUPABASE_SECRET_API_KEY, { + global: { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + fetch: (...args) => fetch(...args), + }, + }); + + let provider; + + if (ALCHEMY_KEY) { + provider = new ethers.providers.AlchemyProvider( + network.networkKey, + ALCHEMY_KEY, + ); + } else if (network.rpc) { + provider = new ethers.providers.JsonRpcProvider(network.rpc); + } else { + throw new Error("No provider available"); + } + + // Check data availability + const body = event.request.body; + if (!("type" in body) || body.type !== "BLOCK") { + throw new NotImplementedError("Event body is not a BlockTriggerEvent"); + } + const blockTriggerEvent = body as BlockTriggerEvent; + const contractAddress = blockTriggerEvent.matchedAddresses[0]; + const fromAddress = blockTriggerEvent.transaction.from; + const txnLogs = blockTriggerEvent.transaction.logs; + const tx = await provider.getTransaction(blockTriggerEvent.hash); + + if (!contractAddress) { + throw new MissingDataError(`body.matchedAddresses is missing`); + } else if (!fromAddress) { + throw new MissingDataError(`body.transaction.from is missing`); + } else if (!txnLogs) { + throw new MissingDataError(`body.transaction.logs is missing`); + } else if (!tx) { + throw new MissingDataError(`tx is missing`); + } + + console.log("Contract address", contractAddress); + console.log("From address", fromAddress); + + // TODO: Update contracts so we can use ABI from the @hypercerts-org/contracts package + const contractInterface = new ethers.utils.Interface(HypercertExchangeABI); + + // Parse TransferSingle events + const transferSingleEvents = txnLogs + .map((l) => { + //Ignore unknown events + try { + return contractInterface.parseLog(l); + } catch (e) { + console.log("Failed to parse log", l); + return null; + } + }) + .filter((e) => e !== null && e.name === "TransferSingle"); + + console.log( + "TransferSingle Events: ", + JSON.stringify(transferSingleEvents, null, 2), + ); + + if (transferSingleEvents.length !== 1) { + throw new MissingDataError( + `Unexpected saw ${transferSingleEvents.length} TransferSingle events`, + ); + } + + // Get claimID + const signerAddress = transferSingleEvents[0].args["from"] as string; + const itemId = transferSingleEvents[0].args["id"] as string; + console.log("Signer Address: ", signerAddress, "Fraction ID: ", itemId); + + // Parse TakerBid events + const takerBidEvents = txnLogs + .map((l) => { + //Ignore unknown events + try { + return contractInterface.parseLog(l); + } catch (e) { + console.log("Failed to parse log", l); + return null; + } + }) + .filter((e) => e !== null && e.name === "TakerBid"); + + console.log("TakerBid Events: ", JSON.stringify(takerBidEvents, null, 2)); + + if (takerBidEvents.length !== 1) { + throw new MissingDataError( + `Unexpected saw ${takerBidEvents.length} TakerBid events`, + ); + } + + // Get claimID + const orderNonce = takerBidEvents[0].args[ + "nonceInvalidationParameters" + ][0] as string; + console.log("Order nonce", orderNonce); + + // Remove from DB + if (await tx.wait(5).then((receipt) => receipt.status === 1)) { + const deleteResult = await client + .from("marketplace-orders") + .delete() + .eq("signer", signerAddress) + .eq("chain_id", network.chainId) + .eq("orderNonce", orderNonce) + .containedBy("itemIds", [itemId]) + .select(); + console.log("Deleted", deleteResult); + + if (!deleteResult) { + throw new Error( + `Could not remove from database. Delete result: ${JSON.stringify( + deleteResult, + )}`, + ); + } + } +} + +const HypercertExchangeABI = [ + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "address", + name: "_protocolFeeRecipient", + type: "address", + }, + { + internalType: "address", + name: "_transferManager", + type: "address", + }, + { + internalType: "address", + name: "_weth", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "CallerInvalid", + type: "error", + }, + { + inputs: [], + name: "ChainIdInvalid", + type: "error", + }, + { + inputs: [], + name: "CreatorFeeBpTooHigh", + type: "error", + }, + { + inputs: [], + name: "CurrencyInvalid", + type: "error", + }, + { + inputs: [], + name: "ERC20TransferFromFail", + type: "error", + }, + { + inputs: [], + name: "LengthsInvalid", + type: "error", + }, + { + inputs: [], + name: "MerkleProofInvalid", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "length", + type: "uint256", + }, + ], + name: "MerkleProofTooLarge", + type: "error", + }, + { + inputs: [], + name: "NewGasLimitETHTransferTooLow", + type: "error", + }, + { + inputs: [], + name: "NewProtocolFeeRecipientCannotBeNullAddress", + type: "error", + }, + { + inputs: [], + name: "NoOngoingTransferInProgress", + type: "error", + }, + { + inputs: [], + name: "NoSelectorForStrategy", + type: "error", + }, + { + inputs: [], + name: "NoncesInvalid", + type: "error", + }, + { + inputs: [], + name: "NotAContract", + type: "error", + }, + { + inputs: [], + name: "NotOwner", + type: "error", + }, + { + inputs: [], + name: "NotV2Strategy", + type: "error", + }, + { + inputs: [], + name: "NullSignerAddress", + type: "error", + }, + { + inputs: [], + name: "OutsideOfTimeRange", + type: "error", + }, + { + inputs: [], + name: "QuoteTypeInvalid", + type: "error", + }, + { + inputs: [], + name: "ReentrancyFail", + type: "error", + }, + { + inputs: [], + name: "RenouncementNotInProgress", + type: "error", + }, + { + inputs: [], + name: "SameDomainSeparator", + type: "error", + }, + { + inputs: [], + name: "SignatureEOAInvalid", + type: "error", + }, + { + inputs: [], + name: "SignatureERC1271Invalid", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "length", + type: "uint256", + }, + ], + name: "SignatureLengthInvalid", + type: "error", + }, + { + inputs: [], + name: "SignatureParameterSInvalid", + type: "error", + }, + { + inputs: [ + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + ], + name: "SignatureParameterVInvalid", + type: "error", + }, + { + inputs: [], + name: "StrategyHasNoSelector", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "strategyId", + type: "uint256", + }, + ], + name: "StrategyNotAvailable", + type: "error", + }, + { + inputs: [], + name: "StrategyNotUsed", + type: "error", + }, + { + inputs: [], + name: "StrategyProtocolFeeTooHigh", + type: "error", + }, + { + inputs: [], + name: "TransferAlreadyInProgress", + type: "error", + }, + { + inputs: [], + name: "TransferNotInProgress", + type: "error", + }, + { + inputs: [], + name: "UnsupportedCollectionType", + type: "error", + }, + { + inputs: [], + name: "WrongPotentialOwner", + type: "error", + }, + { + anonymous: false, + inputs: [], + name: "CancelOwnershipTransfer", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "currency", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "isAllowed", + type: "bool", + }, + ], + name: "CurrencyStatusUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [], + name: "InitiateOwnershipRenouncement", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "potentialOwner", + type: "address", + }, + ], + name: "InitiateOwnershipTransfer", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "user", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "bidNonce", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "askNonce", + type: "uint256", + }, + ], + name: "NewBidAskNonces", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "creatorFeeManager", + type: "address", + }, + ], + name: "NewCreatorFeeManager", + type: "event", + }, + { + anonymous: false, + inputs: [], + name: "NewDomainSeparator", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "gasLimitETHTransfer", + type: "uint256", + }, + ], + name: "NewGasLimitETHTransfer", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "maxCreatorFeeBp", + type: "uint256", + }, + ], + name: "NewMaxCreatorFeeBp", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "NewOwner", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "protocolFeeRecipient", + type: "address", + }, + ], + name: "NewProtocolFeeRecipient", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "strategyId", + type: "uint256", + }, + { + indexed: false, + internalType: "uint16", + name: "standardProtocolFeeBp", + type: "uint16", + }, + { + indexed: false, + internalType: "uint16", + name: "minTotalFeeBp", + type: "uint16", + }, + { + indexed: false, + internalType: "uint16", + name: "maxProtocolFeeBp", + type: "uint16", + }, + { + indexed: false, + internalType: "bytes4", + name: "selector", + type: "bytes4", + }, + { + indexed: false, + internalType: "bool", + name: "isMakerBid", + type: "bool", + }, + { + indexed: false, + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "NewStrategy", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "user", + type: "address", + }, + { + indexed: false, + internalType: "uint256[]", + name: "orderNonces", + type: "uint256[]", + }, + ], + name: "OrderNoncesCancelled", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "strategyId", + type: "uint256", + }, + { + indexed: false, + internalType: "bool", + name: "isActive", + type: "bool", + }, + { + indexed: false, + internalType: "uint16", + name: "standardProtocolFeeBp", + type: "uint16", + }, + { + indexed: false, + internalType: "uint16", + name: "minTotalFeeBp", + type: "uint16", + }, + ], + name: "StrategyUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "user", + type: "address", + }, + { + indexed: false, + internalType: "uint256[]", + name: "subsetNonces", + type: "uint256[]", + }, + ], + name: "SubsetNoncesCancelled", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "bytes32", + name: "orderHash", + type: "bytes32", + }, + { + internalType: "uint256", + name: "orderNonce", + type: "uint256", + }, + { + internalType: "bool", + name: "isNonceInvalidated", + type: "bool", + }, + ], + indexed: false, + internalType: "struct ILooksRareProtocol.NonceInvalidationParameters", + name: "nonceInvalidationParameters", + type: "tuple", + }, + { + indexed: false, + internalType: "address", + name: "askUser", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "bidUser", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "strategyId", + type: "uint256", + }, + { + indexed: false, + internalType: "address", + name: "currency", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "collection", + type: "address", + }, + { + indexed: false, + internalType: "uint256[]", + name: "itemIds", + type: "uint256[]", + }, + { + indexed: false, + internalType: "uint256[]", + name: "amounts", + type: "uint256[]", + }, + { + indexed: false, + internalType: "address[2]", + name: "feeRecipients", + type: "address[2]", + }, + { + indexed: false, + internalType: "uint256[3]", + name: "feeAmounts", + type: "uint256[3]", + }, + ], + name: "TakerAsk", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "bytes32", + name: "orderHash", + type: "bytes32", + }, + { + internalType: "uint256", + name: "orderNonce", + type: "uint256", + }, + { + internalType: "bool", + name: "isNonceInvalidated", + type: "bool", + }, + ], + indexed: false, + internalType: "struct ILooksRareProtocol.NonceInvalidationParameters", + name: "nonceInvalidationParameters", + type: "tuple", + }, + { + indexed: false, + internalType: "address", + name: "bidUser", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "bidRecipient", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "strategyId", + type: "uint256", + }, + { + indexed: false, + internalType: "address", + name: "currency", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "collection", + type: "address", + }, + { + indexed: false, + internalType: "uint256[]", + name: "itemIds", + type: "uint256[]", + }, + { + indexed: false, + internalType: "uint256[]", + name: "amounts", + type: "uint256[]", + }, + { + indexed: false, + internalType: "address[2]", + name: "feeRecipients", + type: "address[2]", + }, + { + indexed: false, + internalType: "uint256[3]", + name: "feeAmounts", + type: "uint256[3]", + }, + ], + name: "TakerBid", + type: "event", + }, + { + inputs: [], + name: "MAGIC_VALUE_ORDER_NONCE_EXECUTED", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "WETH", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint16", + name: "standardProtocolFeeBp", + type: "uint16", + }, + { + internalType: "uint16", + name: "minTotalFeeBp", + type: "uint16", + }, + { + internalType: "uint16", + name: "maxProtocolFeeBp", + type: "uint16", + }, + { + internalType: "bytes4", + name: "selector", + type: "bytes4", + }, + { + internalType: "bool", + name: "isMakerBid", + type: "bool", + }, + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "addStrategy", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256[]", + name: "orderNonces", + type: "uint256[]", + }, + ], + name: "cancelOrderNonces", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "cancelOwnershipTransfer", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256[]", + name: "subsetNonces", + type: "uint256[]", + }, + ], + name: "cancelSubsetNonces", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "chainId", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "confirmOwnershipRenouncement", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "confirmOwnershipTransfer", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "creatorFeeManager", + outputs: [ + { + internalType: "contract ICreatorFeeManager", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "domainSeparator", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "bytes", + name: "additionalParameters", + type: "bytes", + }, + ], + internalType: "struct OrderStructs.Taker[]", + name: "takerBids", + type: "tuple[]", + }, + { + components: [ + { + internalType: "enum QuoteType", + name: "quoteType", + type: "uint8", + }, + { + internalType: "uint256", + name: "globalNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "subsetNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "orderNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "strategyId", + type: "uint256", + }, + { + internalType: "enum CollectionType", + name: "collectionType", + type: "uint8", + }, + { + internalType: "address", + name: "collection", + type: "address", + }, + { + internalType: "address", + name: "currency", + type: "address", + }, + { + internalType: "address", + name: "signer", + type: "address", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "price", + type: "uint256", + }, + { + internalType: "uint256[]", + name: "itemIds", + type: "uint256[]", + }, + { + internalType: "uint256[]", + name: "amounts", + type: "uint256[]", + }, + { + internalType: "bytes", + name: "additionalParameters", + type: "bytes", + }, + ], + internalType: "struct OrderStructs.Maker[]", + name: "makerAsks", + type: "tuple[]", + }, + { + internalType: "bytes[]", + name: "makerSignatures", + type: "bytes[]", + }, + { + components: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + components: [ + { + internalType: "bytes32", + name: "value", + type: "bytes32", + }, + { + internalType: "enum OrderStructs.MerkleTreeNodePosition", + name: "position", + type: "uint8", + }, + ], + internalType: "struct OrderStructs.MerkleTreeNode[]", + name: "proof", + type: "tuple[]", + }, + ], + internalType: "struct OrderStructs.MerkleTree[]", + name: "merkleTrees", + type: "tuple[]", + }, + { + internalType: "bool", + name: "isAtomic", + type: "bool", + }, + ], + name: "executeMultipleTakerBids", + // @ts-ignore + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "bytes", + name: "additionalParameters", + type: "bytes", + }, + ], + internalType: "struct OrderStructs.Taker", + name: "takerAsk", + type: "tuple", + }, + { + components: [ + { + internalType: "enum QuoteType", + name: "quoteType", + type: "uint8", + }, + { + internalType: "uint256", + name: "globalNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "subsetNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "orderNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "strategyId", + type: "uint256", + }, + { + internalType: "enum CollectionType", + name: "collectionType", + type: "uint8", + }, + { + internalType: "address", + name: "collection", + type: "address", + }, + { + internalType: "address", + name: "currency", + type: "address", + }, + { + internalType: "address", + name: "signer", + type: "address", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "price", + type: "uint256", + }, + { + internalType: "uint256[]", + name: "itemIds", + type: "uint256[]", + }, + { + internalType: "uint256[]", + name: "amounts", + type: "uint256[]", + }, + { + internalType: "bytes", + name: "additionalParameters", + type: "bytes", + }, + ], + internalType: "struct OrderStructs.Maker", + name: "makerBid", + type: "tuple", + }, + { + internalType: "bytes", + name: "makerSignature", + type: "bytes", + }, + { + components: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + components: [ + { + internalType: "bytes32", + name: "value", + type: "bytes32", + }, + { + internalType: "enum OrderStructs.MerkleTreeNodePosition", + name: "position", + type: "uint8", + }, + ], + internalType: "struct OrderStructs.MerkleTreeNode[]", + name: "proof", + type: "tuple[]", + }, + ], + internalType: "struct OrderStructs.MerkleTree", + name: "merkleTree", + type: "tuple", + }, + ], + name: "executeTakerAsk", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "bytes", + name: "additionalParameters", + type: "bytes", + }, + ], + internalType: "struct OrderStructs.Taker", + name: "takerBid", + type: "tuple", + }, + { + components: [ + { + internalType: "enum QuoteType", + name: "quoteType", + type: "uint8", + }, + { + internalType: "uint256", + name: "globalNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "subsetNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "orderNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "strategyId", + type: "uint256", + }, + { + internalType: "enum CollectionType", + name: "collectionType", + type: "uint8", + }, + { + internalType: "address", + name: "collection", + type: "address", + }, + { + internalType: "address", + name: "currency", + type: "address", + }, + { + internalType: "address", + name: "signer", + type: "address", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "price", + type: "uint256", + }, + { + internalType: "uint256[]", + name: "itemIds", + type: "uint256[]", + }, + { + internalType: "uint256[]", + name: "amounts", + type: "uint256[]", + }, + { + internalType: "bytes", + name: "additionalParameters", + type: "bytes", + }, + ], + internalType: "struct OrderStructs.Maker", + name: "makerAsk", + type: "tuple", + }, + { + internalType: "bytes", + name: "makerSignature", + type: "bytes", + }, + { + components: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + components: [ + { + internalType: "bytes32", + name: "value", + type: "bytes32", + }, + { + internalType: "enum OrderStructs.MerkleTreeNodePosition", + name: "position", + type: "uint8", + }, + ], + internalType: "struct OrderStructs.MerkleTreeNode[]", + name: "proof", + type: "tuple[]", + }, + ], + internalType: "struct OrderStructs.MerkleTree", + name: "merkleTree", + type: "tuple", + }, + ], + name: "executeTakerBid", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + internalType: "uint256", + name: "proofLength", + type: "uint256", + }, + ], + name: "hashBatchOrder", + outputs: [ + { + internalType: "bytes32", + name: "batchOrderHash", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "bid", + type: "bool", + }, + { + internalType: "bool", + name: "ask", + type: "bool", + }, + ], + name: "incrementBidAskNonces", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "initiateOwnershipRenouncement", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newPotentialOwner", + type: "address", + }, + ], + name: "initiateOwnershipTransfer", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "isCurrencyAllowed", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "maxCreatorFeeBp", + outputs: [ + { + internalType: "uint16", + name: "", + type: "uint16", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "ownershipStatus", + outputs: [ + { + internalType: "enum IOwnableTwoSteps.Status", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "potentialOwner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "protocolFeeRecipient", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "bytes", + name: "additionalParameters", + type: "bytes", + }, + ], + internalType: "struct OrderStructs.Taker", + name: "takerBid", + type: "tuple", + }, + { + components: [ + { + internalType: "enum QuoteType", + name: "quoteType", + type: "uint8", + }, + { + internalType: "uint256", + name: "globalNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "subsetNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "orderNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "strategyId", + type: "uint256", + }, + { + internalType: "enum CollectionType", + name: "collectionType", + type: "uint8", + }, + { + internalType: "address", + name: "collection", + type: "address", + }, + { + internalType: "address", + name: "currency", + type: "address", + }, + { + internalType: "address", + name: "signer", + type: "address", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "price", + type: "uint256", + }, + { + internalType: "uint256[]", + name: "itemIds", + type: "uint256[]", + }, + { + internalType: "uint256[]", + name: "amounts", + type: "uint256[]", + }, + { + internalType: "bytes", + name: "additionalParameters", + type: "bytes", + }, + ], + internalType: "struct OrderStructs.Maker", + name: "makerAsk", + type: "tuple", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "bytes32", + name: "orderHash", + type: "bytes32", + }, + ], + name: "restrictedExecuteTakerBid", + outputs: [ + { + internalType: "uint256", + name: "protocolFeeAmount", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "strategyInfo", + outputs: [ + { + internalType: "bool", + name: "isActive", + type: "bool", + }, + { + internalType: "uint16", + name: "standardProtocolFeeBp", + type: "uint16", + }, + { + internalType: "uint16", + name: "minTotalFeeBp", + type: "uint16", + }, + { + internalType: "uint16", + name: "maxProtocolFeeBp", + type: "uint16", + }, + { + internalType: "bytes4", + name: "selector", + type: "bytes4", + }, + { + internalType: "bool", + name: "isMakerBid", + type: "bool", + }, + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "transferManager", + outputs: [ + { + internalType: "contract TransferManager", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newCreatorFeeManager", + type: "address", + }, + ], + name: "updateCreatorFeeManager", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "currency", + type: "address", + }, + { + internalType: "bool", + name: "isAllowed", + type: "bool", + }, + ], + name: "updateCurrencyStatus", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "updateDomainSeparator", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newGasLimitETHTransfer", + type: "uint256", + }, + ], + name: "updateETHGasLimitForTransfer", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint16", + name: "newMaxCreatorFeeBp", + type: "uint16", + }, + ], + name: "updateMaxCreatorFeeBp", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newProtocolFeeRecipient", + type: "address", + }, + ], + name: "updateProtocolFeeRecipient", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "strategyId", + type: "uint256", + }, + { + internalType: "bool", + name: "isActive", + type: "bool", + }, + { + internalType: "uint16", + name: "newStandardProtocolFee", + type: "uint16", + }, + { + internalType: "uint16", + name: "newMinTotalFee", + type: "uint16", + }, + ], + name: "updateStrategy", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "userBidAskNonces", + outputs: [ + { + internalType: "uint256", + name: "bidNonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "askNonce", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "userOrderNonce", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "userSubsetNonce", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +]; From 6dc05921dfb82305770a23000c57bd18c1ae0fe1 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 14 Dec 2023 19:21:26 +0100 Subject: [PATCH 047/118] chore(bump): web3 connectors fe --- frontend/package.json | 8 +- pnpm-lock.yaml | 891 ++++++++++++++++++++++++++++-------------- 2 files changed, 612 insertions(+), 287 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 6b2a9172..52b39cb1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@apollo/client": "^3.7.4", - "@celo/rainbowkit-celo": "^1.1.0", + "@celo/rainbowkit-celo": "^1.1.2", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@graphprotocol/client-cli": "^2.2.16", @@ -34,7 +34,7 @@ "@openzeppelin/merkle-tree": "^1.0.2", "@plasmicapp/host": "^1.0.171", "@plasmicapp/loader-nextjs": "^1.0.345", - "@rainbow-me/rainbowkit": "1.2.0", + "@rainbow-me/rainbowkit": "1.3.1", "@sentry/nextjs": "^7.73.0", "@sentry/utils": "^7.73.0", "@supabase/supabase-js": "^2.1.2", @@ -66,8 +66,8 @@ "react-toastify": "^9.1.1", "react-use": "^17.4.0", "serve": "^14.0.1", - "viem": "1.19.9", - "wagmi": "1.4.5", + "viem": "1.19.15", + "wagmi": "1.4.12", "yup": "^0.32.11" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1799d904..abca0c55 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -321,8 +321,8 @@ importers: specifier: ^3.7.4 version: 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@celo/rainbowkit-celo': - specifier: ^1.1.0 - version: 1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(wagmi@1.4.5)(zod@3.22.4) + specifier: ^1.1.2 + version: 1.1.2(@rainbow-me/rainbowkit@1.3.1)(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(wagmi@1.4.12)(zod@3.22.4) '@emotion/react': specifier: ^11.10.5 version: 11.11.1(@types/react@18.2.33)(react@18.2.0) @@ -366,8 +366,8 @@ importers: specifier: ^1.0.345 version: 1.0.345(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) '@rainbow-me/rainbowkit': - specifier: 1.2.0 - version: 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.5) + specifier: 1.3.1 + version: 1.3.1(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.15)(wagmi@1.4.12) '@sentry/nextjs': specifier: ^7.73.0 version: 7.75.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0) @@ -462,11 +462,11 @@ importers: specifier: ^14.0.1 version: 14.2.1 viem: - specifier: 1.19.9 - version: 1.19.9(typescript@5.1.6)(zod@3.22.4) + specifier: 1.19.15 + version: 1.19.15(typescript@5.1.6)(zod@3.22.4) wagmi: - specifier: 1.4.5 - version: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) + specifier: 1.4.12 + version: 1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) yup: specifier: ^0.32.11 version: 0.32.11 @@ -2575,21 +2575,32 @@ packages: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} dev: false - /@celo/rainbowkit-celo@1.1.0(@rainbow-me/rainbowkit@1.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(wagmi@1.4.5)(zod@3.22.4): - resolution: {integrity: sha512-/G4HFhJNwUk6uU1yqGfQ/LIoNg9UAA4BUcEvFdd0M3DImnKlhodNLUdCmzqv96sjc/I7tMJqBeTnmbhwXdlsjQ==} + /@celo/rainbowkit-celo@1.1.2(@rainbow-me/rainbowkit@1.3.1)(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(wagmi@1.4.12)(zod@3.22.4): + resolution: {integrity: sha512-g5JyhRscwc7OMtBA7Huos8tgwwfhGEKiMZWTzG5K0Lcan5N9as02CtN8v2F+plQQ7v2IRROTmDw0O1xRjQF4GQ==} peerDependencies: '@rainbow-me/rainbowkit': '>=1.0.2 && <=2.0.0' viem: '>=1.2.8 && <=2.0.0' - wagmi: '>=1.0.0 && <=2.0.0' + wagmi: '>=1.4.12 && <=2.0.0' dependencies: '@metamask/providers': 11.1.2 - '@rainbow-me/rainbowkit': 1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.5) - '@wagmi/connectors': 2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) - viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) - transitivePeerDependencies: + '@rainbow-me/rainbowkit': 1.3.1(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.15)(wagmi@1.4.12) + '@wagmi/connectors': 3.1.10(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) + viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' - '@react-native-async-storage/async-storage' - - '@wagmi/chains' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' - bufferutil - encoding - lokijs @@ -7220,7 +7231,7 @@ packages: loglevel: 1.8.1 nft.storage: 7.1.1(node-fetch@3.3.2) urql: 4.0.6(graphql@16.8.1)(react@18.2.0) - viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) web3.storage: 4.5.5(node-fetch@3.3.2) transitivePeerDependencies: - bufferutil @@ -7239,6 +7250,10 @@ packages: resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} dev: true + /@ioredis/commands@1.2.0: + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + dev: false + /@ipld/car@3.2.4: resolution: {integrity: sha512-rezKd+jk8AsTGOoJKqzfjLJ3WVft7NZNH95f0pfPbicROvzTyvHCNy567HzSUd6gRXZ9im29z5ZEv9Hw49jSYw==} dependencies: @@ -7578,10 +7593,6 @@ packages: resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} dev: true - /@ledgerhq/connect-kit-loader@1.1.2: - resolution: {integrity: sha512-mscwGroSJQrCTjtNGBu+18FQbZYA4+q6Tyx6K7CXHl6AwgZKbWfZYdgP2F+fyZcRUdGRsMX8QtvU61VcGGtO1A==} - dev: false - /@leichtgewicht/ip-codec@2.0.4: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} @@ -9124,6 +9135,147 @@ packages: - supports-color dev: true + /@parcel/watcher-android-arm64@2.3.0: + resolution: {integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-arm64@2.3.0: + resolution: {integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-x64@2.3.0: + resolution: {integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-freebsd-x64@2.3.0: + resolution: {integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm-glibc@2.3.0: + resolution: {integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.3.0: + resolution: {integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-musl@2.3.0: + resolution: {integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-glibc@2.3.0: + resolution: {integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-musl@2.3.0: + resolution: {integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-wasm@2.3.0: + resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} + engines: {node: '>= 10.0.0'} + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.5 + dev: false + bundledDependencies: + - napi-wasm + + /@parcel/watcher-win32-arm64@2.3.0: + resolution: {integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-ia32@2.3.0: + resolution: {integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-x64@2.3.0: + resolution: {integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher@2.3.0: + resolution: {integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==} + engines: {node: '>= 10.0.0'} + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.0.0 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.3.0 + '@parcel/watcher-darwin-arm64': 2.3.0 + '@parcel/watcher-darwin-x64': 2.3.0 + '@parcel/watcher-freebsd-x64': 2.3.0 + '@parcel/watcher-linux-arm-glibc': 2.3.0 + '@parcel/watcher-linux-arm64-glibc': 2.3.0 + '@parcel/watcher-linux-arm64-musl': 2.3.0 + '@parcel/watcher-linux-x64-glibc': 2.3.0 + '@parcel/watcher-linux-x64-musl': 2.3.0 + '@parcel/watcher-win32-arm64': 2.3.0 + '@parcel/watcher-win32-ia32': 2.3.0 + '@parcel/watcher-win32-x64': 2.3.0 + dev: false + /@peculiar/asn1-schema@2.3.8: resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==} dependencies: @@ -9396,8 +9548,8 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - /@rainbow-me/rainbowkit@1.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.5): - resolution: {integrity: sha512-XjdeX31GwFdRR/1rCRqPXiO94nbq2qOlnaox5P4K/KMRIUwyelKzak27uWw8Krmor/Hcrd5FisfepGDS0tUfEA==} + /@rainbow-me/rainbowkit@1.3.1(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.15)(wagmi@1.4.12): + resolution: {integrity: sha512-4Upi+S12ZHosimzlUpCiOocg4dtfGU2wkzcpxeat/FYHrvhVIOgm0TuzbsIM96W1p7OXabosd7xuxPvwduUygQ==} engines: {node: '>=12.4'} peerDependencies: react: '>=17' @@ -9415,8 +9567,8 @@ packages: react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.4(@types/react@18.2.33)(react@18.2.0) ua-parser-js: 1.0.36 - viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) + viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) transitivePeerDependencies: - '@types/react' dev: false @@ -10012,10 +10164,10 @@ packages: resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==} dev: true - /@safe-global/safe-apps-provider@0.17.1(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-lYfRqrbbK1aKU1/UGkYWc/X7PgySYcumXKc5FB2uuwAs2Ghj8uETuW5BrwPqyjBknRxutFbTv+gth/JzjxAhdQ==} + /@safe-global/safe-apps-provider@0.18.1(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} dependencies: - '@safe-global/safe-apps-sdk': 8.0.0(typescript@5.1.6)(zod@3.22.4) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.1.6)(zod@3.22.4) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -10024,23 +10176,11 @@ packages: - zod dev: false - /@safe-global/safe-apps-sdk@8.0.0(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw==} - dependencies: - '@safe-global/safe-gateway-typescript-sdk': 3.12.0 - viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - dev: false - /@safe-global/safe-apps-sdk@8.1.0(typescript@5.1.6)(zod@3.22.4): resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.12.0 - viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -12216,65 +12356,40 @@ packages: typescript: 5.3.2 dev: true - /@wagmi/connectors@2.7.0(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): - resolution: {integrity: sha512-1KOL0HTJl5kzSC/YdKwFwiokr6poUQn1V/tcT0TpG3iH2x0lSM7FTkvCjVVY/6lKzTXrLlo9y2aE7AsOPnkvqg==} + /@wagmi/connectors@3.1.10(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4): + resolution: {integrity: sha512-ZLJC1QaeiZarkF07Cr9mOlVjPO1Lf5TBx+JKBms2y5fUIXlKrxCfQgO/gDCureboI+Us2X3IRI659+XacSGpbA==} peerDependencies: - '@wagmi/chains': '>=1.7.0' typescript: '>=5.0.4' viem: '>=0.3.35' peerDependenciesMeta: - '@wagmi/chains': - optional: true typescript: optional: true dependencies: '@coinbase/wallet-sdk': 3.7.2 - '@ledgerhq/connect-kit-loader': 1.1.2 - '@safe-global/safe-apps-provider': 0.17.1(typescript@5.1.6)(zod@3.22.4) + '@safe-global/safe-apps-provider': 0.18.1(typescript@5.1.6)(zod@3.22.4) '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.1.6)(zod@3.22.4) - '@walletconnect/ethereum-provider': 2.9.2(@walletconnect/modal@2.6.1) - '@walletconnect/legacy-provider': 2.0.0 - '@walletconnect/modal': 2.6.1(react@18.2.0) - '@walletconnect/utils': 2.9.2 - abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) - eventemitter3: 4.0.7 - typescript: 5.1.6 - viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - encoding - - lokijs - - react - - supports-color - - utf-8-validate - - zod - dev: false - - /@wagmi/connectors@3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): - resolution: {integrity: sha512-UgwsQKQDFObJVJMf9pDfFoXTv710o4zrTHyhIWKBTMMkLpCMsMxN5+ZaDhBYt/BgoRinfRYQo8uwuwLhxE6Log==} - peerDependencies: - typescript: '>=5.0.4' - viem: '>=0.3.35' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@coinbase/wallet-sdk': 3.7.2 - '@ledgerhq/connect-kit-loader': 1.1.2 - '@safe-global/safe-apps-provider': 0.17.1(typescript@5.1.6)(zod@3.22.4) - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.1.6)(zod@3.22.4) - '@walletconnect/ethereum-provider': 2.10.2(@walletconnect/modal@2.6.2) + '@walletconnect/ethereum-provider': 2.10.6(@types/react@18.2.33)(react@18.2.0) '@walletconnect/legacy-provider': 2.0.0 '@walletconnect/modal': 2.6.2(@types/react@18.2.33)(react@18.2.0) '@walletconnect/utils': 2.10.2 abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) - transitivePeerDependencies: + viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@types/react' + - '@upstash/redis' + - '@vercel/kv' - bufferutil - encoding - lokijs @@ -12284,8 +12399,8 @@ packages: - zod dev: false - /@wagmi/core@1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): - resolution: {integrity: sha512-N9luRb1Uk4tBN9kaYcQSWKE9AsRt/rvZaFt5IZech4JPzNN2sQlfhKd9GEjOXYRDqEPHdDvos7qyBKiDNTz4GA==} + /@wagmi/core@1.4.12(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4): + resolution: {integrity: sha512-bLcYmmGgjtl3jAGo8X3Sm6oUwsdjbVxFMu9SWnwHdE4S9JdYeWM57dEhQgq8SYul2yQ7yY2/gimBf1Or0Ky3dQ==} peerDependencies: typescript: '>=5.0.4' viem: '>=0.3.35' @@ -12293,15 +12408,26 @@ packages: typescript: optional: true dependencies: - '@wagmi/connectors': 3.1.3(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) + '@wagmi/connectors': 3.1.10(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) + viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@types/react' + - '@upstash/redis' + - '@vercel/kv' - bufferutil - encoding - immer @@ -12312,55 +12438,40 @@ packages: - zod dev: false - /@walletconnect/core@2.10.2: - resolution: {integrity: sha512-JQz/xp3SLEpTeRQctdck2ugSBVEpMxoSE+lFi2voJkZop1hv6P+uqr6E4PzjFluAjeAnKlT1xvra0aFWjPWVcw==} + /@walletconnect/core@2.10.6: + resolution: {integrity: sha512-Z4vh4ZdfcoQjgPEOxeuF9HUZCVLtV3MgRbS/awLIj/omDrFnOwlBhxi5Syr4Y8muVGC0ocRetQYHae0/gX5crQ==} 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/jsonrpc-ws-connection': 1.0.14 + '@walletconnect/keyvaluestorage': 1.1.1 '@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.10.2 - '@walletconnect/utils': 2.10.2 + '@walletconnect/types': 2.10.6 + '@walletconnect/utils': 2.10.6 events: 3.3.0 lodash.isequal: 4.5.0 uint8arrays: 3.1.1 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' - bufferutil - - lokijs - - utf-8-validate - dev: false - - /@walletconnect/core@2.9.2: - resolution: {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.1 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - lokijs + - supports-color - utf-8-validate dev: false @@ -12389,55 +12500,37 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/ethereum-provider@2.10.2(@walletconnect/modal@2.6.2): - resolution: {integrity: sha512-QMYFZ6+rVq2CJLdIPdKK0j1Qm66UA27oQU5V2SrL8EVwl7wFfm0Bq7fnL+qAWeDpn612dNeNErpk/ROa1zWlWg==} - peerDependencies: - '@walletconnect/modal': '>=2' - peerDependenciesMeta: - '@walletconnect/modal': - optional: true + /@walletconnect/ethereum-provider@2.10.6(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-bBQ+yUfxLv8VxNttgNKY7nED35gSVayO/BnLHbNKvyV1gpvSCla5mWB9MsXuQs70MK0g+/qtgRVSrOtdSubaNQ==} dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.7 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/modal': 2.6.2(@types/react@18.2.33)(react@18.2.0) - '@walletconnect/sign-client': 2.10.2 - '@walletconnect/types': 2.10.2 - '@walletconnect/universal-provider': 2.10.2 - '@walletconnect/utils': 2.10.2 - events: 3.3.0 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - encoding - - lokijs - - utf-8-validate - dev: false - - /@walletconnect/ethereum-provider@2.9.2(@walletconnect/modal@2.6.1): - resolution: {integrity: sha512-eO1dkhZffV1g7vpG19XUJTw09M/bwGUwwhy1mJ3AOPbOSbMPvwiCuRz2Kbtm1g9B0Jv15Dl+TvJ9vTgYF8zoZg==} - peerDependencies: - '@walletconnect/modal': '>=2' - peerDependenciesMeta: - '@walletconnect/modal': - optional: true - dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.7 - '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/modal': 2.6.1(react@18.2.0) - '@walletconnect/sign-client': 2.9.2 - '@walletconnect/types': 2.9.2 - '@walletconnect/universal-provider': 2.9.2 - '@walletconnect/utils': 2.9.2 + '@walletconnect/sign-client': 2.10.6 + '@walletconnect/types': 2.10.6 + '@walletconnect/universal-provider': 2.10.6 + '@walletconnect/utils': 2.10.6 events: 3.3.0 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' - bufferutil - encoding - - lokijs + - react + - supports-color - utf-8-validate dev: false @@ -12490,13 +12583,12 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/jsonrpc-ws-connection@1.0.13: - resolution: {integrity: sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg==} + /@walletconnect/jsonrpc-ws-connection@1.0.14: + resolution: {integrity: sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA==} dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/safe-json': 1.0.2 events: 3.3.0 - tslib: 1.14.1 ws: 7.5.9 transitivePeerDependencies: - bufferutil @@ -12518,6 +12610,32 @@ packages: tslib: 1.14.1 dev: false + /@walletconnect/keyvaluestorage@1.1.1: + resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.1 + unstorage: 1.10.1(idb-keyval@6.2.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + dev: false + /@walletconnect/legacy-client@2.0.0: resolution: {integrity: sha512-v5L7rYk9loVnfvUf0mF+76bUPFaU5/Vh7mzL6/950CD/yoGdzYZ3Kj+L7mkC6HPMEGeQsBP1+sqBuiVGZ/aODA==} dependencies: @@ -12582,14 +12700,6 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/modal-core@2.6.1(react@18.2.0): - resolution: {integrity: sha512-f2hYlJ5pwzGvjyaZ6BoGR5uiMgXzWXt6w6ktt1N8lmY6PiYp8whZgqx2hTxVWwVlsGnaIfh6UHp1hGnANx0eTQ==} - dependencies: - valtio: 1.11.0(react@18.2.0) - transitivePeerDependencies: - - react - dev: false - /@walletconnect/modal-core@2.6.2(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==} dependencies: @@ -12599,17 +12709,6 @@ packages: - react dev: false - /@walletconnect/modal-ui@2.6.1(react@18.2.0): - resolution: {integrity: sha512-RFUOwDAMijSK8B7W3+KoLKaa1l+KEUG0LCrtHqaB0H0cLnhEGdLR+kdTdygw+W8+yYZbkM5tXBm7MlFbcuyitA==} - dependencies: - '@walletconnect/modal-core': 2.6.1(react@18.2.0) - lit: 2.7.6 - motion: 10.16.2 - qrcode: 1.5.3 - transitivePeerDependencies: - - react - dev: false - /@walletconnect/modal-ui@2.6.2(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==} dependencies: @@ -12622,15 +12721,6 @@ packages: - react dev: false - /@walletconnect/modal@2.6.1(react@18.2.0): - resolution: {integrity: sha512-G84tSzdPKAFk1zimgV7JzIUFT5olZUVtI3GcOk77OeLYjlMfnDT23RVRHm5EyCrjkptnvpD0wQScXePOFd2Xcw==} - dependencies: - '@walletconnect/modal-core': 2.6.1(react@18.2.0) - '@walletconnect/modal-ui': 2.6.1(react@18.2.0) - transitivePeerDependencies: - - react - dev: false - /@walletconnect/modal@2.6.2(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} dependencies: @@ -12674,41 +12764,33 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/sign-client@2.10.2: - resolution: {integrity: sha512-vviSLV3f92I0bReX+OLr1HmbH0uIzYEQQFd1MzIfDk9PkfFT/LLAHhUnDaIAMkIdippqDcJia+5QEtT4JihL3Q==} + /@walletconnect/sign-client@2.10.6: + resolution: {integrity: sha512-EvUWjaZBQu2yKnH5/5F2qzbuiIuUN9ZgrNKgvXkw5z1Dq5RJCks0S9/MFlKH/ZSGqXnLl7uAzBXtoX4sMgbCMA==} dependencies: - '@walletconnect/core': 2.10.2 + '@walletconnect/core': 2.10.6 '@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.10.2 - '@walletconnect/utils': 2.10.2 + '@walletconnect/types': 2.10.6 + '@walletconnect/utils': 2.10.6 events: 3.3.0 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' - bufferutil - - lokijs - - utf-8-validate - dev: false - - /@walletconnect/sign-client@2.9.2: - resolution: {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 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - lokijs + - supports-color - utf-8-validate dev: false @@ -12732,57 +12814,59 @@ packages: - lokijs dev: false - /@walletconnect/types@2.9.2: - resolution: {integrity: sha512-7Rdn30amnJEEal4hk83cdwHUuxI1SWQ+K7fFFHBMqkuHLGi3tpMY6kpyfDxnUScYEZXqgRps4Jo5qQgnRqVM7A==} + /@walletconnect/types@2.10.6: + resolution: {integrity: sha512-WgHfiTG1yakmxheaBRiXhUdEmgxwrvsAdOIWaMf/spvrzVKYh6sHI3oyEEky5qj5jjiMiyQBeB57QamzCotbcQ==} dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.0.1 events: 3.3.0 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' - '@react-native-async-storage/async-storage' - - lokijs - dev: false - - /@walletconnect/universal-provider@2.10.2: - resolution: {integrity: sha512-wFgI0LbQ3D56sgaUMsgOHCM5m8WLxiC71BGuCKQfApgsbNMVKugYVy2zWHyUyi8sqTQHI+uSaVpDev4UHq9LEw==} - dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.7 - '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.0.1 - '@walletconnect/sign-client': 2.10.2 - '@walletconnect/types': 2.10.2 - '@walletconnect/utils': 2.10.2 - events: 3.3.0 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - encoding - - lokijs - - utf-8-validate + - '@upstash/redis' + - '@vercel/kv' + - supports-color dev: false - /@walletconnect/universal-provider@2.9.2: - resolution: {integrity: sha512-JmaolkO8D31UdRaQCHwlr8uIFUI5BYhBzqYFt54Mc6gbIa1tijGOmdyr6YhhFO70LPmS6gHIjljwOuEllmlrxw==} + /@walletconnect/universal-provider@2.10.6: + resolution: {integrity: sha512-CEivusqqoD31BhCTKp08DnrccfGjwD9MFjZs5BNRorDteRFE8zVm9LmP6DSiNJCw82ZajGlZThggLQ/BAATfwA==} dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.7 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.0.1 - '@walletconnect/sign-client': 2.9.2 - '@walletconnect/types': 2.9.2 - '@walletconnect/utils': 2.9.2 + '@walletconnect/sign-client': 2.10.6 + '@walletconnect/types': 2.10.6 + '@walletconnect/utils': 2.10.6 events: 3.3.0 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' - bufferutil - encoding - - lokijs + - supports-color - utf-8-validate dev: false @@ -12808,8 +12892,8 @@ packages: - lokijs dev: false - /@walletconnect/utils@2.9.2: - resolution: {integrity: sha512-D44hwXET/8JhhIjqljY6qxSu7xXnlPrf63UN/Qfl98vDjWlYVcDl2+JIQRxD9GPastw0S8XZXdRq59XDXLuZBg==} + /@walletconnect/utils@2.10.6: + resolution: {integrity: sha512-oRsWWhN2+hi3aiDXrQEOfysz6FHQJGXLsNQPVt+WIBJplO6Szmdau9dbleD88u1iiT4GKPqE0R9FOYvvPm1H/w==} dependencies: '@stablelib/chacha20poly1305': 1.0.1 '@stablelib/hkdf': 1.0.1 @@ -12819,15 +12903,26 @@ packages: '@walletconnect/relay-api': 1.0.9 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.9.2 + '@walletconnect/types': 2.10.6 '@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.1 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' - '@react-native-async-storage/async-storage' - - lokijs + - '@upstash/redis' + - '@vercel/kv' + - supports-color dev: false /@walletconnect/window-getters@1.0.1: @@ -15034,6 +15129,12 @@ packages: inherits: 2.0.4 safe-buffer: 5.2.1 + /citty@0.1.5: + resolution: {integrity: sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==} + dependencies: + consola: 3.2.3 + dev: false + /cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} dev: true @@ -15238,6 +15339,11 @@ packages: engines: {node: '>=6'} dev: false + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + dev: false + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -15482,6 +15588,11 @@ packages: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} dev: false + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: false + /constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} dependencies: @@ -15546,6 +15657,10 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + /cookie-es@1.0.0: + resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} + dev: false + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -16739,6 +16854,10 @@ packages: has-property-descriptors: 1.0.1 object-keys: 1.1.1 + /defu@6.1.3: + resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==} + dev: false + /del@6.1.1: resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} engines: {node: '>=10'} @@ -16781,6 +16900,11 @@ packages: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} dev: false + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: false + /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -16805,6 +16929,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + /destr@2.0.2: + resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} + dev: false + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -16823,6 +16951,12 @@ packages: engines: {node: '>=8'} dev: true + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: false + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -19369,6 +19503,10 @@ packages: engines: {node: '>=8.0.0'} dev: true + /get-port-please@3.1.1: + resolution: {integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==} + dev: false + /get-port@3.2.0: resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} engines: {node: '>=4'} @@ -19953,6 +20091,19 @@ packages: duplexer: 0.1.2 dev: false + /h3@1.9.0: + resolution: {integrity: sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA==} + dependencies: + cookie-es: 1.0.0 + defu: 6.1.3 + destr: 2.0.2 + iron-webcrypto: 1.0.0 + radix3: 1.1.0 + ufo: 1.3.2 + uncrypto: 0.1.3 + unenv: 1.8.0 + dev: false + /hamt-sharding@2.0.1: resolution: {integrity: sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA==} engines: {node: '>=10.0.0', npm: '>=6.0.0'} @@ -20812,6 +20963,11 @@ packages: '@types/node': 10.17.60 dev: true + /http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + /http-signature@1.2.0: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} @@ -21149,6 +21305,23 @@ packages: dependencies: fp-ts: 1.19.3 + /ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4(supports-color@8.1.1) + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /ip-regex@4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} @@ -21422,6 +21595,10 @@ packages: - supports-color dev: false + /iron-webcrypto@1.0.0: + resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==} + dev: false + /is-absolute@1.0.0: resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} engines: {node: '>=0.10.0'} @@ -22192,6 +22369,7 @@ packages: /jayson@4.1.0: resolution: {integrity: sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==} engines: {node: '>=8'} + hasBin: true dependencies: '@types/connect': 3.4.37 '@types/node': 12.20.55 @@ -23172,6 +23350,29 @@ packages: - supports-color dev: true + /listhen@1.5.5: + resolution: {integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==} + hasBin: true + dependencies: + '@parcel/watcher': 2.3.0 + '@parcel/watcher-wasm': 2.3.0 + citty: 0.1.5 + clipboardy: 3.0.0 + consola: 3.2.3 + defu: 6.1.3 + get-port-please: 3.1.1 + h3: 1.9.0 + http-shutdown: 1.2.2 + jiti: 1.20.0 + mlly: 1.4.2 + node-forge: 1.3.1 + pathe: 1.1.1 + std-env: 3.6.0 + ufo: 1.3.1 + untun: 0.1.2 + uqr: 0.1.2 + dev: false + /listr2@3.14.0(enquirer@2.4.1): resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} engines: {node: '>=10.0.0'} @@ -23242,14 +23443,6 @@ packages: '@types/trusted-types': 2.0.5 dev: false - /lit@2.7.6: - resolution: {integrity: sha512-1amFHA7t4VaaDe+vdQejSVBklwtH9svGoG6/dZi9JhxtJBBlqY5D1RV7iLUYY0trCqQc4NfhYYZilZiVHt7Hxg==} - dependencies: - '@lit/reactive-element': 1.6.3 - lit-element: 3.3.3 - lit-html: 2.8.0 - dev: false - /lit@2.8.0: resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} dependencies: @@ -23371,6 +23564,10 @@ packages: /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false + /lodash.escape@4.0.1: resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==} dev: false @@ -23390,6 +23587,10 @@ packages: resolution: {integrity: sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==} dev: false + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: false + /lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} @@ -23617,6 +23818,11 @@ packages: resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} engines: {node: 14 || >=16.14} + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: false + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -25290,7 +25496,6 @@ packages: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} hasBin: true - dev: true /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -25507,7 +25712,6 @@ packages: pathe: 1.1.1 pkg-types: 1.0.3 ufo: 1.3.1 - dev: true /mnemonist@0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} @@ -25856,6 +26060,10 @@ packages: /node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + /node-addon-api@7.0.0: + resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} + dev: false + /node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -25883,6 +26091,10 @@ packages: skin-tone: 2.0.0 dev: false + /node-fetch-native@1.4.1: + resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} + dev: false + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -26195,6 +26407,14 @@ packages: /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + /ofetch@1.3.3: + resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} + dependencies: + destr: 2.0.2 + node-fetch-native: 1.4.1 + ufo: 1.3.1 + dev: false + /on-exit-leak-free@0.2.0: resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} dev: false @@ -26717,7 +26937,6 @@ packages: /pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -26814,6 +27033,7 @@ packages: /pino@7.11.0: resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true dependencies: atomic-sleep: 1.0.0 fast-redact: 3.3.0 @@ -26857,7 +27077,6 @@ packages: jsonc-parser: 3.2.0 mlly: 1.4.2 pathe: 1.1.1 - dev: true /pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} @@ -27638,6 +27857,7 @@ packages: /qrcode@1.5.0: resolution: {integrity: sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==} engines: {node: '>=10.13.0'} + hasBin: true dependencies: dijkstrajs: 1.0.3 encode-utf8: 1.0.3 @@ -27648,6 +27868,7 @@ packages: /qrcode@1.5.3: resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} engines: {node: '>=10.13.0'} + hasBin: true dependencies: dijkstrajs: 1.0.3 encode-utf8: 1.0.3 @@ -27752,6 +27973,10 @@ packages: - supports-color dev: false + /radix3@1.1.0: + resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} + dev: false + /random-words@2.0.0: resolution: {integrity: sha512-uqpnDqFnYrZajgmvgjmBrSZL2V1UA/9bNPGrilo12CmBeBszoff/avElutUlwWxG12gvmCk/8dUhvHefYxzYjw==} dependencies: @@ -28324,6 +28549,18 @@ packages: esprima: 4.0.1 dev: true + /redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + dev: false + + /redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + dependencies: + redis-errors: 1.2.0 + dev: false + /reduce-flatten@2.0.0: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} @@ -30005,6 +30242,10 @@ packages: dependencies: type-fest: 0.7.1 + /standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: false + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -31369,7 +31610,10 @@ packages: /ufo@1.3.1: resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} - dev: true + + /ufo@1.3.2: + resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} + dev: false /uglify-es@3.3.9: resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} @@ -31416,6 +31660,10 @@ packages: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} + /uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + dev: false + /underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} dev: true @@ -31434,6 +31682,16 @@ packages: engines: {node: '>=12.18'} dev: true + /unenv@1.8.0: + resolution: {integrity: sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg==} + dependencies: + consola: 3.2.3 + defu: 6.1.3 + mime: 3.0.0 + node-fetch-native: 1.4.1 + pathe: 1.1.1 + dev: false + /unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} @@ -31615,11 +31873,77 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + /unstorage@1.10.1(idb-keyval@6.2.1): + resolution: {integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==} + peerDependencies: + '@azure/app-configuration': ^1.4.1 + '@azure/cosmos': ^4.0.0 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^3.3.2 + '@azure/keyvault-secrets': ^4.7.0 + '@azure/storage-blob': ^12.16.0 + '@capacitor/preferences': ^5.0.6 + '@netlify/blobs': ^6.2.0 + '@planetscale/database': ^1.11.0 + '@upstash/redis': ^1.23.4 + '@vercel/kv': ^0.2.3 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + dependencies: + anymatch: 3.1.3 + chokidar: 3.5.3 + destr: 2.0.2 + h3: 1.9.0 + idb-keyval: 6.2.1 + ioredis: 5.3.2 + listhen: 1.5.5 + lru-cache: 10.1.0 + mri: 1.2.0 + node-fetch-native: 1.4.1 + ofetch: 1.3.3 + ufo: 1.3.1 + transitivePeerDependencies: + - supports-color + dev: false + /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} dev: true + /untun@0.1.2: + resolution: {integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==} + hasBin: true + dependencies: + citty: 0.1.5 + consola: 3.2.3 + pathe: 1.1.1 + dev: false + /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -31667,6 +31991,10 @@ packages: dependencies: tslib: 2.6.2 + /uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + dev: false + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -31875,20 +32203,6 @@ packages: builtins: 5.0.1 dev: true - /valtio@1.11.0(react@18.2.0): - resolution: {integrity: sha512-65Yd0yU5qs86b5lN1eu/nzcTgQ9/6YnD6iO+DDaDbQLn1Zv2w12Gwk43WkPlUBxk5wL/6cD5YMFf7kj6HZ1Kpg==} - engines: {node: '>=12.20.0'} - peerDependencies: - react: '>=16.8' - peerDependenciesMeta: - react: - optional: true - dependencies: - proxy-compare: 2.5.1 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - dev: false - /valtio@1.11.2(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} engines: {node: '>=12.20.0'} @@ -32024,8 +32338,8 @@ packages: - zod dev: true - /viem@1.19.9(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-Sf9U2x4jU0S/FALqYypcspWOGene0NZyD470oUripNhE0Ta6uOE/OgE4toTDVfRxov8qw0JFinr/wPGxYE3+HQ==} + /viem@1.19.15(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-rc87AkyrUUsoOAgMNYP+X/wN4GYwbhP87DkmsqQCYKxxQyzTX0+yliKs6Bxljbjr8ybU72GOb12Oyus6393AjQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -32336,8 +32650,8 @@ packages: resolution: {integrity: sha512-8l7sIOd3i5GWfTWciPL0+ff/FK/deVK2Q6FN+MPz4vfUcD78i2M/49XJTwF6aml91uIiuXJEsLKWMB2cw/mtKg==} dev: true - /wagmi@1.4.5(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4): - resolution: {integrity: sha512-Ph62E6cO5n2Z8Z5LTyZrkaNprxTsbC4w0qZJT4OJdXrEELziI8z/b4FO6amVFXdu2rDp/wpvF56e4mhKC8/Kdw==} + /wagmi@1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4): + resolution: {integrity: sha512-QRxpjhdMlZmbYTfn9VQkQMKq+l3kwA1O7tF10vaykPrjbGX+IIlyn72ib9oqW9BfQO7n/Sf/mnVz1zbxRhGPWA==} peerDependencies: react: '>=17.0.0' typescript: '>=5.0.4' @@ -32349,15 +32663,26 @@ packages: '@tanstack/query-sync-storage-persister': 4.36.1 '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0) '@tanstack/react-query-persist-client': 4.36.1(@tanstack/react-query@4.36.1) - '@wagmi/core': 1.4.5(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.9)(zod@3.22.4) + '@wagmi/core': 1.4.12(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) react: 18.2.0 typescript: 5.1.6 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 1.19.9(typescript@5.1.6)(zod@3.22.4) - transitivePeerDependencies: + viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@types/react' + - '@upstash/redis' + - '@vercel/kv' - bufferutil - encoding - immer From 4b77727dfc6417873fc7528bbb1b9c3e2e0b1025 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Fri, 15 Dec 2023 23:04:03 +0100 Subject: [PATCH 048/118] chore(report): add report and create checklist --- .../audits/marketplace/Hypercerts_v01-1.md | 12 ++++++++++++ .../audits/marketplace/Hypercerts_v01-1.pdf | Bin 0 -> 517781 bytes .../audits/{ => protocol}/20230201-7naly3er.md | 0 .../audits/{ => protocol}/20230201-slither.md | 0 .../{ => protocol}/20230208-security-review.md | 0 .../Hypercerts-security-review.md | 0 6 files changed, 12 insertions(+) create mode 100644 contracts/audits/marketplace/Hypercerts_v01-1.md create mode 100644 contracts/audits/marketplace/Hypercerts_v01-1.pdf rename contracts/audits/{ => protocol}/20230201-7naly3er.md (100%) rename contracts/audits/{ => protocol}/20230201-slither.md (100%) rename contracts/audits/{ => protocol}/20230208-security-review.md (100%) rename contracts/audits/{ => protocol}/Hypercerts-security-review.md (100%) diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.md b/contracts/audits/marketplace/Hypercerts_v01-1.md new file mode 100644 index 00000000..7c14b4b4 --- /dev/null +++ b/contracts/audits/marketplace/Hypercerts_v01-1.md @@ -0,0 +1,12 @@ +## Findings + +| Severity Level | Finding ID | Description | Status | +| --------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------- | ------ | +| High | TRST-H-1 | A buyer can purchase more token units than the seller intended | | +| High | TRST-H-2 | The fraction offer maker order is not invalidated correctly, leading to orders being replayed | | +| High | TRST-H-3 | When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected | | +| Medium | TRST-M-1 | An attacker could grief buyer into getting a lower-value item than intended | | +| Medium | TRST-M-2 | Fraction offers can be blocked from being fully fulfilled | | +| Low | TRST-L-1 | The strategy validation function for fraction sales could revert | | +| Low | TRST-L-2 | Hypercert orders with invalid amount will pass validations | | +| Recommendations | TRST-R-1 | Improve validation of orders in fraction offers | | diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.pdf b/contracts/audits/marketplace/Hypercerts_v01-1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5cb1a792917dd5f6acb7a36c639b564373cc4096 GIT binary patch literal 517781 zcmeFaWpEx(k|!)?w#WiYwwM_$X0VuumOT)X?XQ)t%R&>E$~_CnSKXI>lgu|>3=`V+1onk*~{A+7|2>#+2hmwJ&B@; zfs=u)w5@@mfvth1-mlW=|CT}C#oB;|U&mg@+{%bXLdVuj)Y8xjA5ibFX9InFKzRmS zTr}TwER9GFEXimj4D5CE0m<=M8EJpj$i)Q@V_>QOn_31yz+YtljSy)aKy~(Z__Q># z26k2sw!dlylr61eZ*O30`TLQM4j4s7ney8LDT>lIAUlsg?`!@qiBYR`OU}2;YGBF3B zOe16tfJMMS&q^QAk#_dB209k-FwSZ9iW*X?yht7-o7|%WNwg=Uo@>2H@^$kC#0`@- z*@vLnN~Yw-Gz*Nc_vsoH-BdoP$SB(T^mgMJs|>A^?S4HyXM*Q1V6#)mIGHyaO0`p* z$7+}pI|I8_l-Ig2xgYImg0-1bn6a0>RD}VoMerLxR)kC)*zZ7SS1Dhlp#dR~Y2&nEW`Y@&iem5m{(Ic9WGPAXW_t ziM9Oz*#6n6=Wtt~=vjvqm!Bfjk?VdrRAtUoK^kq;r~8tJb`7QKdzV5jZ!jG1;G}4c zQJ`wZx2;$kln`~L^fsU{2Pn6_iQRr&cgUj>A79V%A=Qkz>fUiOHIjLy3oW zfEzSa>$i{GX3GiP8Qo-oJi$rY3$N~e*U{qR|$D4`vAjK=Yb zx}(Hg5F!2Nu%HWQ-)ij+d1se`PIxIf`R9j&cn7%opJD>|dftBV52QG$!o7B zPWH#tR>z8T!=bhi7(H7?nro|Y!WJ{b$C}Sl)LR}x3Wd2UDM?xdvFUPnB9_o!%=as|C6xA=3L0zK@C7o(c1zOp_4tt0?BXH3H&|L>75qtg#X7F`}## ziu2V^K7wdcKd+7I>-va9&-TR=^E!R#ijRM@-(T$XmjwJRkN#psQ2_tjT3h{MKYT+S zb31^XwKBJ|m9y5-Gx!H4S2EEDFf1J-6B7-eiM^e)fi1t4g|(F>Kz87>()^vD8R?iA zXhaN5jEwE^*;p9<4c`8nbojdjrIB;cwf`mAf6Gl8ISCy*Gkm(=vhyEhz)2S{Fc1)s zchpCg2Cfj$7n=W&N`#Jqjp;wF68T3h$Y~eduNHP^-AY+NOJ)5-BmX@9LEsMpe-QYC zz<&(_-oC)8n*ZKg-=#D9L(T1Ecv+KNAP|3Tmn0)G(rgTQ}t1b9GQ zt^U15_OEs9UyJPjJJsyJT5{9TGt>U3m)!rj%Kk^yEDU$nfAfy{L;fEG{vhxNfqzC| zL)R1k-x1fpPdof2uKxoc&wia5_}jNLCf0u?pXpiX=>C$=42(?wDU~Sw?_&-BB&=5- z?G$!#A+RqxOH9Gw9`#N^5Qt$8|vk?NaU5oxY;uFp-|K1kxEG- zh1uZBVnLm5`-zOfs_98et}>nTH30HFiQQ_iJaVGtHMsR$-TFMN&~QTi;RoJGt@C)9 z(caqiNzZ-9#lcA;o?8}&IG)$V+#_Q9Hzsg~z_XgqK!}$71U4V)M&sgw*@|>K*URT+Q^+mAkrXZCle`?A8*RzeDD&xiN+L zQ;yL#Mz$4__xGKsgoHf#BZ-*IVd-qM?ZjV!z=o$aPW)DD?vaG#Oiavv9bbVUk_rL> zuHHVn!tS>!wm+L5sDWzpsB)ZpdObah2ItCpcxW6vgJ|<$F&ay+)Y9AtjeE7VY-~=l zfd2q$xVdD@X0h!+!)W1OM*srVoL&9s`n7OkrL`ci0|N-6&5T6ig4?XCkJD2ER77~T zn&74&!%CEX^QD$=9USPR&0CY)YYn>e?9`_xbfCew={t$+#=94Gr<0_~1w4E?Plw)# zSXPAg)_ob1=Y?zk0hMBOU#k9_oS(8fG z_|IE>QU_Gr&zkPtwV}YKo6#yx0c%&a)a3phgFr4*PJ|LpN(Ua?BYWdFC%WECF3$Z_ z*(`6PA#Qj69c@6(a%*m}q(^SVJCSLuZ+F}G-{Nkh>b%4}JY<&(ZD2K8O+s zr#Vg+)keb-M0y@Xb=CxEq`=$Cb$vL_b z4Nb*sS(Sms0U9`dQfozKj977f`>X5$DbUVp>I6r!STWi{B@8aOcbi)6$*aAX#s2)H z4A5Zfbi`P3oT}^z^slH;_OG&JOy^Dz_)U3n)1V2ltoEotR~0Pn*G+-&xLEA)K#vM6 z&erR0`Es_~Xo>y^U_74T+-~Zs;fiuNc-yejR~v#1RQb_=%VKca2+4dyk<}&Qdh_pTPQ!;v~ZIHy;!v_ zl$FR93%WV_BS7+W+?@PW&6gDq;mqy0EA*O9)N;Hm;1m7C>~Au?a5@ZKKRVv9!d?y&XRn^ zrFKqx0iY{grMb1dc^WeN-*EzNj`H=h9Hn^PDaFIt43KfE(*WjSCjx4g&fmXQYBAli z;x7cl$0&Jnee(?6Tf+cEEjnq=A*2`IY#!4DBEaz6d9>{mW5ubO>?cg}0uOeaT8x-U zo7w=_CJRVk%jtO!5Qh>E0D;d49DjSu!wnGIZnHA`6O)|+=%dmv7>S11^n?S)VR#bY zE!dh$0>|ZB-tUUDw?U!|055=&uGHBli?@UFNgLq78aAgD^;97WiUu!Sc4{D%2K_Dq zCW?AzEu(`bApOPhO2zrI-|Z<0VP7&+HVtkp0hZ>p$u4xvpI>(CKls2;0)b!ax?KW* z%j9j<$xjlF$8hfC_T^Pm^FiRC7f635A0tg}1W<#y1|B;j&|=+IzCROneUY8h!6YCy zL1DyH-Bh#~^H-dFD!&l|(!lMl<{To=)7IIzYNBck9QG0lI}6Z9`CLGx{dL?>wjF2` z6V;dm(^va~X*F0pcwAiXGPaJ}1FTNbaxI;amdPpL!IWpq*5bQxMRYd>ZXgr4x8NmQ zc027-!R%Z>=02-=KeBp4=wBJhPFFt`%(}V>*L}ie=LAZQK{azd_?EB2qVeIEcRF?U z2GIGTdt=b)pS(|sDobJKj1AP575y}UfNHjn#0MZL>tzS-CSiei9Ltndw z0C}H07#fr#rn6_lL1O68i3smb(tk{f!UDDXZDY(5OtOs!9z$_Md4+CM_?&R{f*Jt|Te>2Ab;XgAQ9 z8_?!GRn@OWO~$US2D~OhwwA8kRh92mbXJGEpAdYkiS1MsJSCUz( zD6O<~G+F2szot%)Q%zM^Or4#|2)or83C~_uF4ops-JOMu%rv)JwXknha9(z_d(3EL zjOVpd93G0ntRk+lQ32}yuex}sUp~+Z2zvdSJJf#9UH_U_|6iy<{`D-Ije+TZZanxu zo@M{j#5&zY`-33HkJLO1*GX70GO9_w=AD8S+fe)>d^9jHupN{gAsz%79x$1xrARq} zU3mfUOTJyywp}CvUV*bxX>nN2nLMqSbP1=}v2o($bW!5#=TJ$<{dSjgy4J4)sop>k zzFpe1m~j8%_9=VHp9#C}sx(tFz18#erI^5tMe0OerSNk(T2CO9MNL7LJj%9|hn_Me zT^1OpLoX>VA4h?iRd2PlE^FZyOsqT9BI}g2xT;Ek5=u*hvJRY0`ZS_w9+ROncFNsj zMK4lNUU666t)Vk=%Pvs`WHeKhXBd9@S6Lr32`{gnDCN5!j=oXhXMIQm@xyty!v1^T zIXYyFN@5lJ7bZP+M3Gb;0wX?=U1n6tVDyL_Z;Klnx?%~SBOHk~_ShBtWH|z!#(G4c z(s*LEi!h-+OmH49jR?o$Q6<6qe8Q1}Un8CLt%d2+ltPIFm8jY7hcH?8`68$p$?4Ne zZyr%O%tdF2xJe39-$6bb`a|aCu}^9{=3+3g7VbbVw_i=#+cKy{TEG0j&QseZ=5+_X zJ81Gb_;O~&-odNDf1M1&tG|~MVL!5>3nl$7s3w}#rFsF)o8Ok1x#UQpN(l~}2 zVLP0OhB{ZBfEir81Ij2(5k%>HY*a(c-lndsY%CI_iHC!OgNlk-#E?5@%9H{`i$;j` z+G0jUE-a>TURa1#DQHmkd6i4FySKFH8*^Ac3X))=Aj?TZ!W?m4#eJ>V96tRu!6CYs zv}V`JHO>^SU75iu)Zy{%OTH~q^3dm1A;@8}L+|HM%SBzPV?hxetNo@Hoq0{edd(5p7}KJ1p*&Z2{k?etF3^$L>tzkFceF! z305*L{$^jS#)kC345tr6Fh75xoiM`OV~Q#{zj_1So$UP{#Cn1h2kQw_SRD>b?(A>@ zvO&sX%Hm}|*|JQ$MY5$`k^J&Ve~7BevX`Z~RWo$+PT06b-KDmmS3&S` zSSSymkuecLkgqOcy-e1~w_E97nqM$Y{?(}~M&uy(?4dGqm4&WlpEx1i zC=bd%N3PG5pik(fp!CU*je~ zyXWAOYA^?YW)p{_d!rVf^d*S$AI{F0@d?5dF}WmKZrn_!_jXx_+*dN<9Po$)fwvG1 zY25)^TRA>2ZLMtYs~s-4(~k@!kuTO4sZ!i;*2e|#R+Zz*Ps44CGbE9?oVq`wxx0dGRpiIzI|$I%N1uc0^NIjmw10 zFtLg@SC`hH&|uf!oNFBi>UatICDZ6Fo<`ZOH9ZY3&BPNsn{{uO8t2>F-_o7dm#cKP z3#ioA*Y7rk@w~2vBGSKduhyF_7-f3A?IyN5dA*LYtb4W&jCOcD-{Y}5Z~XZF3W;#C z-0F1R!5&98WXLAuP(k94N)o!{>GVCWeUKvfTp<~Ak-W{>X@ zG7Q6W4Q44o+|%oID|nHKMn1;&j5n!rH%v}}?_pjFG|^bF&j;Wt%9OWvLwt0irmot1^peXePFmj3m9b-2yubhz)@NGg-v=AIDY*4b$W?HzC7Jyocx-(BA}2BxWzkDx*B`W(4Wg~=?0F8G8$RV?h-r+* zJIJ=XcmmhaNPFeodzl6zN+n4jeXA&|I2yZ#&9WjsLcD2E{Oa!P3Y-6FXSh3!w9h&? z1ZhU^;Y)-N8Zoh2K@f^>c2iN+j~4|e5{m171#4QK2p&=|WgxZg0I;9;Z!)(E-W6>0 zLVd*Y#j^FLeD3P%eIaPW!oq?=aj=N+Q;?95;Nak@lPXiHQ_9F<&cO1s&1FSYO12}K z9|P3dz-&H8%x+IEsz~9Ly=d#HbQ5~2@RtNKF|cZ{Key8zSfii|A!mqfNCh)|hp)8} zTv->HQF­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

    SLGZxR1CM+n_4q28}mT5iHR0= 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≷rM+eGz>Q_8EIq)mh5cO&-2 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 literal 0 HcmV?d00001 diff --git a/contracts/audits/20230201-7naly3er.md b/contracts/audits/protocol/20230201-7naly3er.md similarity index 100% rename from contracts/audits/20230201-7naly3er.md rename to contracts/audits/protocol/20230201-7naly3er.md diff --git a/contracts/audits/20230201-slither.md b/contracts/audits/protocol/20230201-slither.md similarity index 100% rename from contracts/audits/20230201-slither.md rename to contracts/audits/protocol/20230201-slither.md diff --git a/contracts/audits/20230208-security-review.md b/contracts/audits/protocol/20230208-security-review.md similarity index 100% rename from contracts/audits/20230208-security-review.md rename to contracts/audits/protocol/20230208-security-review.md diff --git a/contracts/audits/Hypercerts-security-review.md b/contracts/audits/protocol/Hypercerts-security-review.md similarity index 100% rename from contracts/audits/Hypercerts-security-review.md rename to contracts/audits/protocol/Hypercerts-security-review.md From e4f3c62fd9b159c6c84fdb93620110699ab2b805 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Sat, 16 Dec 2023 01:36:18 +0100 Subject: [PATCH 049/118] fix(TRST-H-1): a buyer can purchase more token units than the seller --- .../audits/marketplace/Hypercerts_v01-1.md | 15 +++ .../StrategyHypercertFractionOffer.sol | 41 ++++--- .../HypercertFractionOffers.t.sol | 107 +++++++++++++++--- 3 files changed, 128 insertions(+), 35 deletions(-) diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.md b/contracts/audits/marketplace/Hypercerts_v01-1.md index 7c14b4b4..acf30483 100644 --- a/contracts/audits/marketplace/Hypercerts_v01-1.md +++ b/contracts/audits/marketplace/Hypercerts_v01-1.md @@ -10,3 +10,18 @@ | Low | TRST-L-1 | The strategy validation function for fraction sales could revert | | | Low | TRST-L-2 | Hypercert orders with invalid amount will pass validations | | | Recommendations | TRST-R-1 | Improve validation of orders in fraction offers | | + +### TRST-H-1 | A buyer can purchase more token units than the seller + +The original design of the strategy is that the maker, i.e. seller, would split a fraction of the hypercert into a new +fraction. The buyer would then purchase units of the new fraction untill it holds 0 units. If a sale would by a portion +of the available units a split would be initiated and the new fraction would be transfered to the buyer. If a sale would +clear out the fraction (units would become 0), the strategy would then transfer the hypercert fraction to the buyer. + +This implies the intention of the seller is to sell all available units. Admittedly, this can be confusing for users and +indeed introduces risk to the seller. + +To resolve the issue we changed the design of the strategy. Since a hypercert fraction in an NFT, the `amounts` field in +the `MakerAsk` struct is required to be an array of size 1 with value 1. The `additionalParameters` field was expanded +with `minUnitsToKeep` to declare the amount of units that should remain in the hypercert fraction. This has been tested +in `StrategyHypercertFractionOffer.sol`. diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol index 84972b4c..c62f5843 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -37,6 +37,7 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; * - unitAmount: 10000 // Total amount for sale; in `amounts` array * - minUnitAmount: 100 // Minimum amount to buy; in `additionalParameters` * - maxUnitAmount: 1000 // Maximum amount to buy; in `additionalParameters` + * - minUnitsToKeep: 5000 // Minimum amount to keep in the hypercert fraction; in `additionalParameters` * - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) * - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 * - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] @@ -49,7 +50,7 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; * @notice The bidder can only bid on 1 item id at a time. * 1. If ERC721, the amount must be 1. * 2. If ERC1155, the amount can be greater than 1. - * 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. + * 3. If Hypercert, the amount must be 1 because the fractions are NFTs. * @dev Use cases can include tiered pricing; think early bird tickets. * @author LooksRare protocol team (👀,💎); bitbeckers; */ @@ -76,21 +77,23 @@ contract StrategyHypercertFractionOffer is BaseStrategy { revert LengthsInvalid(); } - if (makerAsk.amounts[0] == 0) { + // The amount to fill must be 1 because fractions are NFTs + if (makerAsk.amounts[0] != 1) { revert AmountInvalid(); } //units, pricePerUnit (uint256 unitAmount, uint256 pricePerUnit) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); - //minUnitAmount, maxUnitAmount, root - (uint256 minUnitAmount, uint256 maxUnitAmount) = abi.decode(makerAsk.additionalParameters, (uint256, uint256)); + //minUnitAmount, maxUnitAmount, minUnitsToKeep, root + (uint256 minUnitAmount, uint256 maxUnitAmount, uint256 minUnitsToKeep) = + abi.decode(makerAsk.additionalParameters, (uint256, uint256, uint256)); // A collection order can only be executable for 1 itemId but quantity to fill can vary if ( minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount < minUnitAmount || unitAmount > maxUnitAmount || pricePerUnit < makerAsk.price || makerAsk.price == 0 - || IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) < unitAmount + || (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep ) { revert OrderInvalid(); } @@ -102,7 +105,7 @@ contract StrategyHypercertFractionOffer is BaseStrategy { price = unitAmount * pricePerUnit; // If the amount to fill is equal to the amount of units in the hypercert, we transfer the fraction. // Otherwise, we do not invalidate the nonce because it is a partial fill. - isNonceInvalidated = IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) == unitAmount; + isNonceInvalidated = (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) == minUnitsToKeep; } /** @@ -129,7 +132,7 @@ contract StrategyHypercertFractionOffer is BaseStrategy { revert LengthsInvalid(); } - if (makerAsk.amounts[0] == 0) { + if (makerAsk.amounts[0] != 1) { revert AmountInvalid(); } @@ -137,15 +140,15 @@ contract StrategyHypercertFractionOffer is BaseStrategy { (uint256 unitAmount, uint256 pricePerUnit, bytes32[] memory proof) = abi.decode(takerBid.additionalParameters, (uint256, uint256, bytes32[])); - //minUnitAmount, maxUnitAmount, root - (uint256 minUnitAmount, uint256 maxUnitAmount, bytes32 root) = - abi.decode(makerAsk.additionalParameters, (uint256, uint256, bytes32)); + //minUnitAmount, maxUnitAmount, minUnitsToKeep, root + (uint256 minUnitAmount, uint256 maxUnitAmount, uint256 minUnitsToKeep, bytes32 root) = + abi.decode(makerAsk.additionalParameters, (uint256, uint256, uint256, bytes32)); // A collection order can only be executable for 1 itemId but quantity to fill can vary if ( minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount < minUnitAmount || unitAmount > maxUnitAmount || pricePerUnit < makerAsk.price || makerAsk.price == 0 - || IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) < unitAmount + || (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep ) { revert OrderInvalid(); } @@ -158,7 +161,7 @@ contract StrategyHypercertFractionOffer is BaseStrategy { // If the amount to fill is equal to the amount of units in the hypercert, we transfer the fraction. // Otherwise, we do not invalidate the nonce because it is a partial fill. - isNonceInvalidated = IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) == unitAmount; + isNonceInvalidated = (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) == minUnitsToKeep; bytes32 node = keccak256(abi.encodePacked(takerBid.recipient)); @@ -189,11 +192,12 @@ contract StrategyHypercertFractionOffer is BaseStrategy { return (isValid, QuoteTypeInvalid.selector); } - (uint256 minUnitAmount, uint256 maxUnitAmount) = abi.decode(makerAsk.additionalParameters, (uint256, uint256)); + (uint256 minUnitAmount, uint256 maxUnitAmount, uint256 minUnitsToKeep) = + abi.decode(makerAsk.additionalParameters, (uint256, uint256, uint256)); if ( - makerAsk.amounts.length != 1 || makerAsk.amounts[0] == 0 - || IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[0]) < makerAsk.amounts[0] + makerAsk.amounts.length != 1 || makerAsk.amounts[0] != 1 + || minUnitsToKeep > IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[0]) || makerAsk.itemIds.length != 1 || minUnitAmount > maxUnitAmount || makerAsk.price == 0 || maxUnitAmount == 0 ) { @@ -202,12 +206,13 @@ contract StrategyHypercertFractionOffer is BaseStrategy { // If no root is provided or invalid length, it should be invalid. // @dev It does not mean the merkle root is valid against a specific itemId that exists in the collection. - // @dev 96 is the length of the bytes32 array when the merkle root is provided together with two uint256 params - // declared in the additionalParameters. + // @dev 128 is the length of the bytes32 array when the merkle root is provided together with three uint256 + // params + // declared in the additionalParameters (minUnits, maxUnits, minUnitsToKeep, root). if ( functionSelector == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector - && makerAsk.additionalParameters.length != 96 + && makerAsk.additionalParameters.length != 128 ) { return (isValid, OrderInvalid.selector); } diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol index c04a128a..b8bd460a 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol @@ -49,6 +49,7 @@ contract HypercertFractionOffersTest is ProtocolBase { uint256 private constant minUnitAmount = 1; uint256 private constant maxUnitAmount = 100; + uint256 private constant minUnitsToKeep = 5000; function _createMakerAskAndTakerBidHypercert(bool mint) private @@ -62,7 +63,7 @@ contract HypercertFractionOffersTest is ProtocolBase { itemIds[0] = (1 << 128) + 1; uint256[] memory amounts = new uint256[](1); - amounts[0] = 5000; + amounts[0] = 1; newMakerAsk = _createSingleItemMakerOrder({ quoteType: QuoteType.Ask, @@ -80,7 +81,7 @@ contract HypercertFractionOffersTest is ProtocolBase { newMakerAsk.itemIds = itemIds; newMakerAsk.amounts = amounts; - newMakerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, mockMerkleRoot); + newMakerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, minUnitsToKeep, mockMerkleRoot); // Using startPrice as the maxPrice bytes32[] memory proofs = new bytes32[](0); @@ -171,6 +172,52 @@ contract HypercertFractionOffersTest is ProtocolBase { looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } + function testTakerBidCantBuyMoreThanMakerAskIntended() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + // Selling 5000 units out of 10000 (10000 - 5000 = 5000 minUnitsToKeep) at maximum of 3000 units per sale + // (maxUnitAmount) + makerAsk.additionalParameters = abi.encode(minUnitAmount, 3000, 5000); + takerBid.additionalParameters = abi.encode(3000, price); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Will pass because the taker bid is buying 3000 units out of 5000 + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + _assertSuccessfulTakerBid(makerAsk, takerBid, (1 << 128) + 1); + + // Will fail because the total amount of units bought is 6000, leaving 4000 units in the hypercert (less than + // minUnitsToKeep) + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Will pass on buying 2000 (unitAmount) out of 10000 units (maxUnitAmount) while minUnitsToKeep is 5000 + takerBid.additionalParameters = abi.encode(2000, price); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockHypercertMinter.ownerOf((1 << 128) + 1), makerUser); + assertEq(mockHypercertMinter.ownerOf((1 << 128) + 2), takerUser); + assertEq(mockHypercertMinter.ownerOf((1 << 128) + 3), takerUser); + + // Units have been transfered + assertEq(mockHypercertMinter.unitsOf((1 << 128) + 1), 5000); + assertEq(mockHypercertMinter.unitsOf((1 << 128) + 2), 3000); + assertEq(mockHypercertMinter.unitsOf((1 << 128) + 3), 2000); + } + /** * A collection offer without merkle tree criteria */ @@ -201,7 +248,7 @@ contract HypercertFractionOffersTest is ProtocolBase { (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(true); - makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000); + makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000, 0); takerBid.additionalParameters = abi.encode(10_000, price); // Sign order @@ -224,8 +271,8 @@ contract HypercertFractionOffersTest is ProtocolBase { (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(true); - makerAsk.amounts[0] = 10_000; - makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000); + makerAsk.amounts[0] = 1; + makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000, 0); takerBid.additionalParameters = abi.encode(3000, price); @@ -244,7 +291,6 @@ contract HypercertFractionOffersTest is ProtocolBase { _assertSuccessfulTakerBid(makerAsk, takerBid, fractionId); - makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000); takerBid.additionalParameters = abi.encode(7000, price); // Execute taker ask transaction full fill; buy remaining 7000 units @@ -252,7 +298,7 @@ contract HypercertFractionOffersTest is ProtocolBase { looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); //units, amount, currency, proof[] - (uint256 unitAmount, uint256 bidPrice) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); + (uint256 unitAmount) = abi.decode(takerBid.additionalParameters, (uint256)); // Taker user has received the asset assertEq(mockHypercertMinter.ownerOf(fractionId), takerUser); @@ -270,7 +316,7 @@ contract HypercertFractionOffersTest is ProtocolBase { (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(true); - makerAsk.additionalParameters = abi.encode(minUnitAmount, 100); + makerAsk.additionalParameters = abi.encode(minUnitAmount, 100, 0); takerBid.additionalParameters = abi.encode(101, price); // Sign order @@ -292,7 +338,7 @@ contract HypercertFractionOffersTest is ProtocolBase { (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(true); - makerAsk.additionalParameters = abi.encode(5, 100); + makerAsk.additionalParameters = abi.encode(5, 100, 0); takerBid.additionalParameters = abi.encode(2, price); // Sign order @@ -314,7 +360,7 @@ contract HypercertFractionOffersTest is ProtocolBase { (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(true); - makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount); + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, 0); takerBid.additionalParameters = abi.encode(maxUnitAmount, price - 1); // Sign order @@ -350,7 +396,7 @@ contract HypercertFractionOffersTest is ProtocolBase { }); makerAsk.strategyId = 2; - makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, merkleRoot); + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, minUnitsToKeep, merkleRoot); // Sign order bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); @@ -384,7 +430,7 @@ contract HypercertFractionOffersTest is ProtocolBase { }); makerAsk.strategyId = 2; - makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, merkleRoot); + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, minUnitsToKeep, merkleRoot); // Sign order bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); @@ -442,6 +488,33 @@ contract HypercertFractionOffersTest is ProtocolBase { vm.prank(takerUser); vm.expectRevert(AmountInvalid.selector); looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // 3. Amount is > 1 (without merkle proof) + makerAsk.amounts[0] = 2; + bytes memory signatureAmountsTwo = _signMakerOrder(makerAsk, makerUserPK); + _assertOrderIsInvalid(makerAsk, false); + _assertMakerOrderReturnValidationCode( + makerAsk, signatureAmountsTwo, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE + ); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signatureAmountsTwo, _EMPTY_MERKLE_TREE); + + // 4. Amount is > 1 (with merkle proof) + makerAsk.strategyId = 2; + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, merkleRoot); + makerAsk.amounts[0] = 2; + signature = _signMakerOrder(makerAsk, makerUserPK); + + takerBid.additionalParameters = abi.encode(0, price, proof); + + _assertOrderIsInvalid(makerAsk, true); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } function testMerkleRootLengthIsNot200() public { @@ -450,17 +523,17 @@ contract HypercertFractionOffersTest is ProtocolBase { // Set to use allowlist makerAsk.strategyId = 2; - // Only encode min-max units - makerAsk.additionalParameters = abi.encode(1, 1); + // Only encode min-max units and min units to keep + makerAsk.additionalParameters = abi.encode(1, 1, 1); bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); _assertOrderIsInvalid(makerAsk, true); _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + // It should revert without data (since the root cannot be extracted since the additionalParameters length is 0) vm.prank(takerUser); - vm.expectRevert(); // It should revert without data (since the root cannot be extracted since the - // additionalParameters length is 0) + vm.expectRevert(); looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } @@ -536,7 +609,7 @@ contract HypercertFractionOffersTest is ProtocolBase { bytes32[] memory merkleTreeAccounts = new bytes32[](numberOfAccountsInMerkleTree); vm.startPrank(owner); for (uint256 i; i < numberOfAccountsInMerkleTree; i++) { - mockHypercertMinter.mintClaim(owner, 10_000, "https://examle.com", FROM_CREATOR_ONLY); + mockHypercertMinter.mintClaim(owner, 10_000, "https://example.com", FROM_CREATOR_ONLY); merkleTreeAccounts[i] = keccak256(abi.encodePacked(accountInMerkleTree)); } vm.stopPrank(); From 5f68e7639f2215b0f0570f9d6efe85025d64501f Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Sun, 17 Dec 2023 18:25:33 +0100 Subject: [PATCH 050/118] fix(TRST-H-2): fraction offer invalidation --- .../audits/marketplace/Hypercerts_v01-1.md | 14 +++ .../constants/ValidationCodeConstants.sol | 6 +- .../StrategyHypercertFractionOffer.sol | 2 +- .../marketplace/helpers/OrderValidatorV2A.sol | 27 +++--- .../marketplace/OrderValidatorV2A.t.sol | 26 +++--- .../HypercertFractionOffers.t.sol | 88 ++++++++++++++++++- .../MockHypercertMinterWithoutAnyOwnerOf.sol | 23 +++++ 7 files changed, 150 insertions(+), 36 deletions(-) create mode 100644 contracts/test/mock/MockHypercertMinterWithoutAnyOwnerOf.sol diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.md b/contracts/audits/marketplace/Hypercerts_v01-1.md index acf30483..a455c735 100644 --- a/contracts/audits/marketplace/Hypercerts_v01-1.md +++ b/contracts/audits/marketplace/Hypercerts_v01-1.md @@ -25,3 +25,17 @@ To resolve the issue we changed the design of the strategy. Since a hypercert fr the `MakerAsk` struct is required to be an array of size 1 with value 1. The `additionalParameters` field was expanded with `minUnitsToKeep` to declare the amount of units that should remain in the hypercert fraction. This has been tested in `StrategyHypercertFractionOffer.sol`. + +### TRST-H-2 | The fraction offer maker order is not invalidated correctly, leading to orders being replayed + +We've updated the logic to invalidate the order to test agains the change in balance when the strategu would execute: + +` isNonceInvalidated = (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) == minUnitsToKeep;` + +This has been tested in `StrategyHypercertFractionOffer.sol` under `testMakerAskInvalidation` where we execute multiple +sales to invalidated the order, add additional units to the original hypercert fraction and execute a sale to validate +that the order still cannnot be executed because the nonce of the order has been invalidated. + +Additionally, to underline the paradigm of 'fractions are NFTs` we've updated the ordervalidator to not check on the +units held by the fraction, but whether the fraction is owned by the maker. Check on the units held by the fraction is +still done in the strategy. diff --git a/contracts/src/marketplace/constants/ValidationCodeConstants.sol b/contracts/src/marketplace/constants/ValidationCodeConstants.sol index 5c23fd1a..0ced6380 100644 --- a/contracts/src/marketplace/constants/ValidationCodeConstants.sol +++ b/contracts/src/marketplace/constants/ValidationCodeConstants.sol @@ -259,16 +259,16 @@ uint256 constant ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST = 633; uint256 constant ERC1155_NO_APPROVAL_FOR_ALL = 634; /* - * @dev The Hypercert collaction does not support balanceOf. + * @dev The Hypercert collaction does not support ownerOf. * This maker order can become valid without any user's action. */ -uint256 constant HYPERCERT_UNITS_OF_DOES_NOT_EXIST = 641; +uint256 constant HYPERCERT_OWNER_OF_DOES_NOT_EXIST = 641; /* * @dev The Hypercert fractionId is not owned by the signer (maker ask user). * This maker order can become valid without any user's action. */ -uint256 constant HYPERCERT_UNITS_NOT_HELD_BY_USER = 642; +uint256 constant HYPERCERT_FRACTION_NOT_HELD_BY_USER = 642; /** * 7. Asset-type codes diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol index c62f5843..dddf444b 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -197,7 +197,7 @@ contract StrategyHypercertFractionOffer is BaseStrategy { if ( makerAsk.amounts.length != 1 || makerAsk.amounts[0] != 1 - || minUnitsToKeep > IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[0]) + || IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[0]) <= minUnitsToKeep || makerAsk.itemIds.length != 1 || minUnitAmount > maxUnitAmount || makerAsk.price == 0 || maxUnitAmount == 0 ) { diff --git a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol index e25ed1ca..77050d6a 100644 --- a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol +++ b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol @@ -428,7 +428,7 @@ contract OrderValidatorV2A { } else if (collectionType == CollectionType.ERC1155) { validationCode = _checkValidityERC1155(collection, user, itemIds, amounts); } else if (collectionType == CollectionType.Hypercert) { - validationCode = _checkValidityHypercert(collection, user, itemIds, amounts); + validationCode = _checkValidityHypercert(collection, user, itemIds); } } @@ -570,16 +570,14 @@ contract OrderValidatorV2A { * @param collection Collection address * @param user User address * @param itemIds Array of fraction ids - * @param amounts Array of units held by each fraction * @return validationCode Validation code */ - function _checkValidityHypercert( - address collection, - address user, - uint256[] memory itemIds, - uint256[] memory amounts - ) private view returns (uint256 validationCode) { - // 1. Verify each itemId is owned by user and catch revertion if ERC1155 ownerOf fails + function _checkValidityHypercert(address collection, address user, uint256[] memory itemIds) + private + view + returns (uint256 validationCode) + { + // 1. Verify each itemId is owned by user and catch revertion if ownerOf fails address[] memory users = new address[](1); users[0] = user; @@ -588,24 +586,21 @@ contract OrderValidatorV2A { bool success; bytes memory data; - bytes4 selector = bytes4(keccak256(bytes("unitsOf(address,uint256)"))); for (uint256 i; i < length;) { - (success, data) = collection.staticcall(abi.encodeWithSelector(selector, user, itemIds[i])); + (success, data) = collection.staticcall(abi.encodeCall(IERC721.ownerOf, (itemIds[i]))); if (!success) { - return HYPERCERT_UNITS_OF_DOES_NOT_EXIST; + return HYPERCERT_OWNER_OF_DOES_NOT_EXIST; } - if (abi.decode(data, (uint256)) < amounts[i]) { - return HYPERCERT_UNITS_NOT_HELD_BY_USER; - } + if (abi.decode(data, (address)) != user) return HYPERCERT_FRACTION_NOT_HELD_BY_USER; unchecked { ++i; } } - // 3. Verify if collection is approved by transfer manager + // 2. Verify if collection is approved by transfer manager (success, data) = collection.staticcall(abi.encodeCall(IERC1155.isApprovedForAll, (user, address(transferManager)))); diff --git a/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol b/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol index 90dc0281..2d53b23f 100644 --- a/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol +++ b/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol @@ -19,8 +19,8 @@ import { ERC1155_BALANCE_OF_ITEM_ID_INFERIOR_TO_AMOUNT, ERC1155_IS_APPROVED_FOR_ALL_DOES_NOT_EXIST, ERC1155_NO_APPROVAL_FOR_ALL, - HYPERCERT_UNITS_NOT_HELD_BY_USER, - HYPERCERT_UNITS_OF_DOES_NOT_EXIST, + HYPERCERT_FRACTION_NOT_HELD_BY_USER, + HYPERCERT_OWNER_OF_DOES_NOT_EXIST, MAKER_ORDER_INVALID_STANDARD_SALE, MISSING_IS_VALID_SIGNATURE_FUNCTION_EIP1271, POTENTIAL_INVALID_COLLECTION_TYPE_SHOULD_BE_ERC721, @@ -46,6 +46,8 @@ import {MockHypercertMinter} from "../../mock/MockHypercertMinter.sol"; import {MockHypercertMinterSupportsNoInterface} from "../../mock/MockHypercertMinterSupportsNoInterface.sol"; import {MockHypercertMinterWithoutAnyBalanceOf} from "../../mock/MockHypercertMinterWithoutAnyBalanceOf.sol"; import {MockHypercertMinterWithoutAnyUnitsOf} from "../../mock/MockHypercertMinterWithoutAnyUnitsOf.sol"; +import {MockHypercertMinterWithoutOwnerOf} from "../../mock/MockHypercertMinterWithoutAnyOwnerOf.sol"; + import {MockERC20} from "../../mock/MockERC20.sol"; // Enums @@ -401,15 +403,11 @@ contract OrderValidatorV2ATest is TestParameters { // HYPERCERTS - function _testMakerAskHypercertUnitsInferiorToAmount(bool revertBalanceOf) public { + function _testMakerAskHypercertFractionNotHeldByMaker() public { address collection; - if (revertBalanceOf) { - MockHypercertMinterWithoutAnyBalanceOf mockHypercert = new MockHypercertMinterWithoutAnyBalanceOf(); - collection = address(mockHypercert); - } else { - MockHypercertMinter mockHypercert = new MockHypercertMinter(); - collection = address(mockHypercert); - } + + MockHypercertMinter mockHypercert = new MockHypercertMinter(); + collection = address(mockHypercert); OrderStructs.Maker memory makerAsk; makerAsk.quoteType = QuoteType.Ask; @@ -425,11 +423,11 @@ contract OrderValidatorV2ATest is TestParameters { uint256[9] memory validationCodes = orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); - assertEq(validationCodes[5], HYPERCERT_UNITS_NOT_HELD_BY_USER); + assertEq(validationCodes[5], HYPERCERT_FRACTION_NOT_HELD_BY_USER); } - function testMakerAskHypercertUnitsOfDoesNotExist() public { - MockHypercertMinterWithoutAnyUnitsOf mockHypercert = new MockHypercertMinterWithoutAnyUnitsOf(); + function testMakerAskHypercertOwnerOfDoesNotExist() public { + MockHypercertMinterWithoutOwnerOf mockHypercert = new MockHypercertMinterWithoutOwnerOf(); OrderStructs.Maker memory makerAsk; makerAsk.quoteType = QuoteType.Ask; @@ -445,6 +443,6 @@ contract OrderValidatorV2ATest is TestParameters { uint256[9] memory validationCodes = orderValidator.checkMakerOrderValidity(makerAsk, new bytes(65), _EMPTY_MERKLE_TREE); - assertEq(validationCodes[5], HYPERCERT_UNITS_OF_DOES_NOT_EXIST); + assertEq(validationCodes[5], HYPERCERT_OWNER_OF_DOES_NOT_EXIST); } } diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol index b8bd460a..57a3861a 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol @@ -55,9 +55,11 @@ contract HypercertFractionOffersTest is ProtocolBase { private returns (OrderStructs.Maker memory newMakerAsk, OrderStructs.Taker memory newTakerBid) { - vm.prank(makerUser); // Mint asset - if (mint == true) mockHypercertMinter.mintClaim(makerUser, 10_000, "https://examle.com", FROM_CREATOR_ONLY); + if (mint == true) { + vm.prank(makerUser); + mockHypercertMinter.mintClaim(makerUser, 10_000, "https://examle.com", FROM_CREATOR_ONLY); + } uint256[] memory itemIds = new uint256[](1); itemIds[0] = (1 << 128) + 1; @@ -197,6 +199,7 @@ contract HypercertFractionOffersTest is ProtocolBase { // Will fail because the total amount of units bought is 6000, leaving 4000 units in the hypercert (less than // minUnitsToKeep) + vm.prank(takerUser); vm.expectRevert(OrderInvalid.selector); looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); @@ -218,6 +221,87 @@ contract HypercertFractionOffersTest is ProtocolBase { assertEq(mockHypercertMinter.unitsOf((1 << 128) + 3), 2000); } + function testMakerAskInvalidation() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(false); + + uint256[] memory fractions = new uint256[](2); + fractions[0] = 5000; + fractions[1] = 5000; + + vm.prank(makerUser); + mockHypercertMinter.mintClaimWithFractions( + makerUser, 10_000, fractions, "https://example.com", FROM_CREATOR_ONLY + ); + + // Selling 2500 units out of 5000 (5000 - 2500 = 2500 minUnitsToKeep) at maximum of 2500 units per sale + // (maxUnitAmount) + makerAsk.additionalParameters = abi.encode(minUnitAmount, 2500, 2500); + takerBid.additionalParameters = abi.encode(2000, price); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Will pass because the taker bid is buying 2000 units out of 2500 + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Will fail because the total amount of units bought will be 4000, leaving 1000 units in the hypercert (less + // than + // minUnitsToKeep) + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Will pass on buying 500 (unitAmount) out of 2500 units (maxUnitAmount) while minUnitsToKeep is 2500 + takerBid.additionalParameters = abi.encode(500, price); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockHypercertMinter.ownerOf((1 << 128) + 1), makerUser); + assertEq(mockHypercertMinter.ownerOf((1 << 128) + 2), makerUser); + assertEq(mockHypercertMinter.ownerOf((1 << 128) + 3), takerUser); + assertEq(mockHypercertMinter.ownerOf((1 << 128) + 4), takerUser); + + // Units have been transfered + assertEq(mockHypercertMinter.unitsOf((1 << 128) + 1), 2500); + assertEq(mockHypercertMinter.unitsOf((1 << 128) + 2), 5000); // 2nd fraction + assertEq(mockHypercertMinter.unitsOf((1 << 128) + 3), 2000); + assertEq(mockHypercertMinter.unitsOf((1 << 128) + 4), 500); + + // Will fail because the nonce has been invalidated + vm.prank(takerUser); + vm.expectRevert(NoncesInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + // Merge to add more units to 'sold out' fraction + uint256[] memory fractionIdsToMerge = new uint256[](2); + fractionIdsToMerge[0] = ((1 << 128) + 2); + fractionIdsToMerge[1] = ((1 << 128) + 1); + + vm.prank(makerUser); + mockHypercertMinter.mergeFractions(makerUser, fractionIdsToMerge); + + assertEq(mockHypercertMinter.unitsOf((1 << 128) + 1), 7500); + assertEq(mockHypercertMinter.unitsOf((1 << 128) + 2), 0); // 2nd fraction + + // Will fail because nonce is still invalid, even though the fraction has more units now + vm.prank(takerUser); + vm.expectRevert(NoncesInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + /** * A collection offer without merkle tree criteria */ diff --git a/contracts/test/mock/MockHypercertMinterWithoutAnyOwnerOf.sol b/contracts/test/mock/MockHypercertMinterWithoutAnyOwnerOf.sol new file mode 100644 index 00000000..83cd29d3 --- /dev/null +++ b/contracts/test/mock/MockHypercertMinterWithoutAnyOwnerOf.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; + +import {HypercertMinter} from "@hypercerts/protocol/HypercertMinter.sol"; + +// Empty contract that acts like it's a HypercertMinter by declaring the supported interface +contract MockHypercertMinterWithoutOwnerOf { + constructor() {} + + // Since ownerOf is non-virtual in SemiFungible1155, we need to 'mock' it here + function ownerOf(uint256) public view virtual returns (address) { + revert("Not implemented"); + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return interfaceId == type(IHypercertToken).interfaceId; + } +} From 637955a5fd5b25e3c9b2d8a85dc1e6de130e7331 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 18 Dec 2023 03:14:52 +0100 Subject: [PATCH 051/118] fix(TRST-H-3): fork strategies to check on hc units during trade --- .../audits/marketplace/Hypercerts_v01-1.md | 18 +- contracts/src/marketplace/TransferManager.sol | 4 +- .../src/marketplace/TransferSelectorNFT.sol | 6 +- .../src/marketplace/errors/SharedErrors.sol | 8 +- .../StrategyCollectionOffer.sol | 26 +- .../StrategyDutchAuction.sol | 19 +- .../StrategyHypercertCollectionOffer.sol | 227 ++++++ .../StrategyHypercertDutchAuction.sol | 141 ++++ .../StrategyHypercertFractionOffer.sol | 3 +- .../marketplace/helpers/OrderValidatorV2A.sol | 4 +- .../CollectionOffers.t.sol | 35 +- .../DutchAuctionOrders.t.sol | 41 +- .../HypercertCollectionOffers.t.sol | 729 ++++++++++++++++++ .../HypercertDutchAuctionOrders.t.sol | 502 ++++++++++++ 14 files changed, 1746 insertions(+), 17 deletions(-) create mode 100644 contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol create mode 100644 contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol create mode 100644 contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol create mode 100644 contracts/test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.md b/contracts/audits/marketplace/Hypercerts_v01-1.md index a455c735..0769cf12 100644 --- a/contracts/audits/marketplace/Hypercerts_v01-1.md +++ b/contracts/audits/marketplace/Hypercerts_v01-1.md @@ -30,12 +30,26 @@ in `StrategyHypercertFractionOffer.sol`. We've updated the logic to invalidate the order to test agains the change in balance when the strategu would execute: -` isNonceInvalidated = (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) == minUnitsToKeep;` +```solidity +isNonceInvalidated = (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) == minUnitsToKeep; +``` This has been tested in `StrategyHypercertFractionOffer.sol` under `testMakerAskInvalidation` where we execute multiple sales to invalidated the order, add additional units to the original hypercert fraction and execute a sale to validate that the order still cannnot be executed because the nonce of the order has been invalidated. -Additionally, to underline the paradigm of 'fractions are NFTs` we've updated the ordervalidator to not check on the +Additionally, to underline the paradigm of 'fractions are NFTs` we've updated the OrderValidatorV2A to not check on the units held by the fraction, but whether the fraction is owned by the maker. Check on the units held by the fraction is still done in the strategy. + +### TRST-H-3 | When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected + +Following the recommendation, we've split the `CollectionOffer` and `DutchAuctionOffer` strategies into two separate +strategies for ERC721/ERC1155 and hypercerts. The hypercert specific strategies can be found under +`StrategyHypercertCollectionOffer.sol` and `StrategyHypercertDutchAuctionOffer.sol` and tests have been added to the +foundry folder. To ensure the correct strategy is used checks on `CollectionType` have been added to both the order +validators and executors in the strategies. + +To add checks on the units held by the fraction the units held by a fraction are stored in the order at create time, in +some cases will be provided by the taker at execution time, with additional calls to the `HypercertMinter` contract to +validate the units held by the fraction. diff --git a/contracts/src/marketplace/TransferManager.sol b/contracts/src/marketplace/TransferManager.sol index eaa5231e..7afa9bae 100644 --- a/contracts/src/marketplace/TransferManager.sol +++ b/contracts/src/marketplace/TransferManager.sol @@ -157,13 +157,13 @@ contract TransferManager is _isOperatorValidForTransfer(from, msg.sender); if (length == 1) { - if (amounts[0] == 0) { + if (amounts[0] != 1) { revert AmountInvalid(); } _executeERC1155SafeTransferFrom(collection, from, to, itemIds[0], amounts[0]); } else { for (uint256 i; i < length;) { - if (amounts[i] == 0) { + if (amounts[i] != 1) { revert AmountInvalid(); } diff --git a/contracts/src/marketplace/TransferSelectorNFT.sol b/contracts/src/marketplace/TransferSelectorNFT.sol index d66d40b4..2b423530 100644 --- a/contracts/src/marketplace/TransferSelectorNFT.sol +++ b/contracts/src/marketplace/TransferSelectorNFT.sol @@ -9,6 +9,7 @@ import {StrategyHypercertFractionOffer} from "./executionStrategies/StrategyHype // Libraries import {OrderStructs} from "./libraries/OrderStructs.sol"; +import {CollectionTypeInvalid} from "./errors/SharedErrors.sol"; // Enums import {CollectionType} from "./enums/CollectionType.sol"; @@ -22,7 +23,6 @@ import {IHypercertToken} from "../protocol/interfaces/IHypercertToken.sol"; * @author LooksRare protocol team (👀,💎); bitbeckers; */ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { - error UnsupportedCollectionType(); /** * @notice Transfer manager for ERC721, ERC1155 and Hypercerts. */ @@ -63,7 +63,7 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { } else if (collectionType == CollectionType.ERC1155) { transferManager.transferItemsERC1155(collection, sender, recipient, itemIds, amounts); } else { - revert UnsupportedCollectionType(); + revert CollectionTypeInvalid(); } } @@ -86,7 +86,7 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { uint256[] memory amounts ) internal { if (collectionType != CollectionType.Hypercert) { - revert UnsupportedCollectionType(); + revert CollectionTypeInvalid(); } // Check if split strategies diff --git a/contracts/src/marketplace/errors/SharedErrors.sol b/contracts/src/marketplace/errors/SharedErrors.sol index 9ac87690..5fdd1002 100644 --- a/contracts/src/marketplace/errors/SharedErrors.sol +++ b/contracts/src/marketplace/errors/SharedErrors.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.17; /** * @notice It is returned if the amount is invalid. - * For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. + * For ERC721 and Hypercert, any number that is not 1. For ERC1155, if amount is 0. */ error AmountInvalid(); @@ -63,3 +63,9 @@ error OrderInvalid(); * @notice It is returned if the maker quote type is invalid. */ error QuoteTypeInvalid(); + +/** + * @notice It is returned is the collection type is not supported. + * For instance if the strategy is specific to hypercerts. + */ +error CollectionTypeInvalid(); diff --git a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol index 9a8f2ff7..826636b5 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol @@ -9,9 +9,16 @@ import {MerkleProofMemory} from "../libraries/OpenZeppelin/MerkleProofMemory.sol // Enums import {QuoteType} from "../enums/QuoteType.sol"; +import {CollectionType} from "../enums/CollectionType.sol"; // Shared errors -import {OrderInvalid, FunctionSelectorInvalid, MerkleProofInvalid, QuoteTypeInvalid} from "../errors/SharedErrors.sol"; +import { + OrderInvalid, + FunctionSelectorInvalid, + MerkleProofInvalid, + QuoteTypeInvalid, + CollectionTypeInvalid +} from "../errors/SharedErrors.sol"; // Base strategy contracts import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; @@ -27,7 +34,6 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; * @notice The bidder can only bid on 1 item id at a time. * 1. If ERC721, the amount must be 1. * 2. If ERC1155, the amount can be greater than 1. - * 3. If Hypercert, the amount must be 1 (fractions are NFTs) * @author LooksRare protocol team (👀,💎); bitbeckers */ contract StrategyCollectionOffer is BaseStrategy { @@ -46,6 +52,10 @@ contract StrategyCollectionOffer is BaseStrategy { pure returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) { + if (makerBid.collectionType != CollectionType.ERC721 && makerBid.collectionType != CollectionType.ERC1155) { + revert CollectionTypeInvalid(); + } + price = makerBid.price; amounts = makerBid.amounts; @@ -76,6 +86,10 @@ contract StrategyCollectionOffer is BaseStrategy { pure returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) { + if (makerBid.collectionType != CollectionType.ERC721 && makerBid.collectionType != CollectionType.ERC1155) { + revert CollectionTypeInvalid(); + } + price = makerBid.price; amounts = makerBid.amounts; @@ -116,6 +130,10 @@ contract StrategyCollectionOffer is BaseStrategy { pure returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) { + if (makerBid.collectionType != CollectionType.ERC721 && makerBid.collectionType != CollectionType.ERC1155) { + revert CollectionTypeInvalid(); + } + price = makerBid.price; amounts = makerBid.amounts; @@ -148,6 +166,10 @@ contract StrategyCollectionOffer is BaseStrategy { override returns (bool isValid, bytes4 errorSelector) { + if (makerBid.collectionType != CollectionType.ERC721 && makerBid.collectionType != CollectionType.ERC1155) { + return (isValid, CollectionTypeInvalid.selector); + } + if ( functionSelector != StrategyCollectionOffer.executeCollectionStrategyWithTakerAskWithProof.selector && functionSelector != StrategyCollectionOffer.executeCollectionStrategyWithTakerAsk.selector diff --git a/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol b/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol index 3c4fcf27..a68090ee 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol @@ -6,9 +6,16 @@ import {OrderStructs} from "../libraries/OrderStructs.sol"; // Enums import {QuoteType} from "../enums/QuoteType.sol"; +import {CollectionType} from "../enums/CollectionType.sol"; // Shared errors -import {BidTooLow, OrderInvalid, FunctionSelectorInvalid, QuoteTypeInvalid} from "../errors/SharedErrors.sol"; +import { + BidTooLow, + OrderInvalid, + FunctionSelectorInvalid, + QuoteTypeInvalid, + CollectionTypeInvalid +} from "../errors/SharedErrors.sol"; // Base strategy contracts import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; @@ -16,7 +23,7 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; /** * @title StrategyDutchAuction * @notice This contract offers a single execution strategy for users to create Dutch auctions. - * @author LooksRare protocol team (👀,💎) + * @author LooksRare protocol team (👀,💎); bitbeckers */ contract StrategyDutchAuction is BaseStrategy { /** @@ -32,6 +39,10 @@ contract StrategyDutchAuction is BaseStrategy { view returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) { + if (makerAsk.collectionType != CollectionType.ERC721 && makerAsk.collectionType != CollectionType.ERC1155) { + revert CollectionTypeInvalid(); + } + uint256 itemIdsLength = makerAsk.itemIds.length; if (itemIdsLength == 0 || itemIdsLength != makerAsk.amounts.length) { @@ -70,6 +81,10 @@ contract StrategyDutchAuction is BaseStrategy { override returns (bool isValid, bytes4 errorSelector) { + if (makerAsk.collectionType != CollectionType.ERC721 && makerAsk.collectionType != CollectionType.ERC1155) { + return (isValid, CollectionTypeInvalid.selector); + } + if (functionSelector != StrategyDutchAuction.executeStrategyWithTakerBid.selector) { return (isValid, FunctionSelectorInvalid.selector); } diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol new file mode 100644 index 00000000..141de5de --- /dev/null +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Interface +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; + +// OpenZeppelin's library for verifying Merkle proofs +import {MerkleProofMemory} from "../libraries/OpenZeppelin/MerkleProofMemory.sol"; + +// Enums +import {QuoteType} from "../enums/QuoteType.sol"; +import {CollectionType} from "../enums/CollectionType.sol"; + +// Shared errors +import { + OrderInvalid, + FunctionSelectorInvalid, + MerkleProofInvalid, + QuoteTypeInvalid, + CollectionTypeInvalid, + AmountInvalid +} from "../errors/SharedErrors.sol"; + +// Base strategy contracts +import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; + +/** + * @title StrategyHypercertCollectionOffer + * @notice This contract offers execution strategies for users to create maker bid offers for items in a collection. + * There are two available functions: + * 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection + * 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. + * 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for + * accounts. + * @notice The bidder can only bid on 1 item id at a time. + * 1. The amount must be 1. + * 2. The units held at bid creation and ask execution time must be the same. + * 3. The units held by the item sold must be the same as the units held by the item bid. + * @author LooksRare protocol team (👀,💎); bitbeckers + */ +contract StrategyHypercertCollectionOffer is BaseStrategy { + /** + * @notice This function validates the order under the context of the chosen strategy and + * returns the fulfillable items/amounts/price/nonce invalidation status. + * This strategy executes a collection offer against a taker ask order without the need of merkle proofs. + * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) + * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) + */ + function executeHypercertCollectionStrategyWithTakerAsk( + OrderStructs.Taker calldata takerAsk, + OrderStructs.Maker calldata makerBid + ) + external + view + returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) + { + if (makerBid.collectionType != CollectionType.Hypercert) { + revert CollectionTypeInvalid(); + } + + price = makerBid.price; + amounts = makerBid.amounts; + + (uint256 offeredItemId, uint256 itemUnitsTaker) = abi.decode(takerAsk.additionalParameters, (uint256, uint256)); + (uint256 itemUnitsMaker) = abi.decode(makerBid.additionalParameters, (uint256)); + + // A collection order can only be executable for 1 fraction + if ( + amounts.length != 1 || amounts[0] != 1 || itemUnitsTaker != itemUnitsMaker + || IHypercertToken(makerBid.collection).unitsOf(offeredItemId) != itemUnitsMaker + ) { + revert OrderInvalid(); + } + + itemIds = new uint256[](1); + itemIds[0] = offeredItemId; + isNonceInvalidated = true; + } + + /** + * @notice This function validates the order under the context of the chosen strategy + * and returns the fulfillable items/amounts/price/nonce invalidation status. + * This strategy executes a collection offer against a taker ask order with the need of a merkle proof. + * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) + * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) + * @dev The transaction reverts if the maker does not include a merkle root in the additionalParameters. + */ + function executeHypercertCollectionStrategyWithTakerAskWithProof( + OrderStructs.Taker calldata takerAsk, + OrderStructs.Maker calldata makerBid + ) + external + view + returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) + { + if (makerBid.collectionType != CollectionType.Hypercert) { + revert CollectionTypeInvalid(); + } + + price = makerBid.price; + amounts = makerBid.amounts; + + (uint256 offeredItemId, uint256 itemUnitsTaker, bytes32[] memory proof) = + abi.decode(takerAsk.additionalParameters, (uint256, uint256, bytes32[])); + + (uint256 itemUnitsMaker, bytes32 root) = abi.decode(makerBid.additionalParameters, (uint256, bytes32)); + + // A collection order can only be executable for 1 fraction + if ( + amounts.length != 1 || amounts[0] != 1 || itemUnitsTaker != itemUnitsMaker + || IHypercertToken(makerBid.collection).unitsOf(offeredItemId) != itemUnitsMaker + ) { + revert OrderInvalid(); + } + + itemIds = new uint256[](1); + itemIds[0] = offeredItemId; + isNonceInvalidated = true; + + bytes32 node = keccak256(abi.encodePacked(offeredItemId)); + + // Verify the merkle root for the given merkle proof + if (!MerkleProofMemory.verify(proof, root, node)) { + revert MerkleProofInvalid(); + } + } + + /** + * @notice This function validates the order under the context of the chosen strategy + * and returns the fulfillable items/amounts/price/nonce invalidation status. + * This strategy executes a collection offer against a taker ask order with the need of a merkle proof + * that the address is allowed to fullfil the ask. + * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) + * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) + * @dev The transaction reverts if the maker does not include a merkle root in the additionalParameters. + */ + function executeHypercertCollectionStrategyWithTakerAskWithAllowlist( + OrderStructs.Taker calldata takerAsk, + OrderStructs.Maker calldata makerBid + ) + external + view + returns (uint256 price, uint256[] memory itemIds, uint256[] calldata amounts, bool isNonceInvalidated) + { + if (makerBid.collectionType != CollectionType.Hypercert) { + revert CollectionTypeInvalid(); + } + + price = makerBid.price; + amounts = makerBid.amounts; + + (uint256 offeredItemId, uint256 itemUnitsTaker, bytes32[] memory proof) = + abi.decode(takerAsk.additionalParameters, (uint256, uint256, bytes32[])); + + (uint256 itemUnitsMaker, bytes32 root) = abi.decode(makerBid.additionalParameters, (uint256, bytes32)); + + // A collection order can only be executable for 1 fraction + if ( + amounts.length != 1 || amounts[0] != 1 || itemUnitsTaker != itemUnitsMaker + || IHypercertToken(makerBid.collection).unitsOf(offeredItemId) != itemUnitsMaker + ) { + revert OrderInvalid(); + } + + itemIds = new uint256[](1); + itemIds[0] = offeredItemId; + isNonceInvalidated = true; + + bytes32 node = keccak256(abi.encodePacked(takerAsk.recipient)); + + // Verify the merkle root for the given merkle proof + if (!MerkleProofMemory.verify(proof, root, node)) { + revert MerkleProofInvalid(); + } + } + + /** + * @inheritdoc IStrategy + */ + function isMakerOrderValid(OrderStructs.Maker calldata makerBid, bytes4 functionSelector) + external + pure + override + returns (bool isValid, bytes4 errorSelector) + { + if (makerBid.collectionType != CollectionType.Hypercert) { + return (isValid, CollectionTypeInvalid.selector); + } + + if ( + functionSelector != StrategyHypercertCollectionOffer.executeHypercertCollectionStrategyWithTakerAsk.selector + && functionSelector + != StrategyHypercertCollectionOffer.executeHypercertCollectionStrategyWithTakerAskWithProof.selector + && functionSelector + != StrategyHypercertCollectionOffer.executeHypercertCollectionStrategyWithTakerAskWithAllowlist.selector + ) { + return (isValid, FunctionSelectorInvalid.selector); + } + + if (makerBid.quoteType != QuoteType.Bid) { + return (isValid, QuoteTypeInvalid.selector); + } + + // Check if amounts is length 1 with value 1 and additionalParameters is length 32 to check on expected units + // received + if (makerBid.amounts.length != 1 || makerBid.amounts[0] != 1 || makerBid.additionalParameters.length < 32) { + return (isValid, OrderInvalid.selector); + } + + // If no root is provided or invalid length, it should be invalid. + // @dev It does not mean the merkle root is valid against a specific itemId that exists in the collection. + // @dev 64 is the length of the bytes32 array when the merkle root is provided together with three uint256 + // params declared in the additionalParameters (unitsInItem, root). + if ( + functionSelector + == StrategyHypercertCollectionOffer.executeHypercertCollectionStrategyWithTakerAskWithProof.selector + && makerBid.additionalParameters.length != 64 + ) { + return (isValid, OrderInvalid.selector); + } + + isValid = true; + } +} diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol new file mode 100644 index 00000000..810d1691 --- /dev/null +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Interface +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; + +// Libraries +import {OrderStructs} from "../libraries/OrderStructs.sol"; + +// Enums +import {QuoteType} from "../enums/QuoteType.sol"; +import {CollectionType} from "../enums/CollectionType.sol"; + +// Shared errors +import { + AmountInvalid, + BidTooLow, + OrderInvalid, + FunctionSelectorInvalid, + QuoteTypeInvalid, + CollectionTypeInvalid +} from "../errors/SharedErrors.sol"; + +// Base strategy contracts +import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; + +/** + * @title StrategyHypercertDutchAuction + * @notice This contract offers a single execution strategy for users to create Dutch auctions for hypercerts. + * @author LooksRare protocol team (👀,💎); bitbeckers + */ +contract StrategyHypercertDutchAuction is BaseStrategy { + /** + * @notice This function validates the order under the context of the chosen strategy + * and returns the fulfillable items/amounts/price/nonce invalidation status. + * The execution price set by the seller decreases linearly within the defined period. + * @param takerBid Taker bid struct (taker ask-specific parameters for the execution) + * @param makerAsk Maker ask struct (maker bid-specific parameters for the execution) + * @dev The client has to provide the seller's desired initial start price as the additionalParameters. + */ + function executeStrategyWithTakerBid(OrderStructs.Taker calldata takerBid, OrderStructs.Maker calldata makerAsk) + external + view + returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) + { + if (makerAsk.collectionType != CollectionType.Hypercert) { + revert CollectionTypeInvalid(); + } + + uint256 itemIdsLength = makerAsk.itemIds.length; + + if (itemIdsLength == 0 || itemIdsLength != makerAsk.amounts.length) { + revert OrderInvalid(); + } + + (uint256 startPrice, uint256[] memory unitsPerItem) = + abi.decode(makerAsk.additionalParameters, (uint256, uint256[])); + + if (startPrice < makerAsk.price || unitsPerItem.length == 0 || unitsPerItem.length != itemIdsLength) { + revert OrderInvalid(); + } + + uint256 unitsPerItemLength = unitsPerItem.length; + for (uint256 i; i < unitsPerItemLength;) { + if (IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[i]) != unitsPerItem[i]) { + revert OrderInvalid(); + } + unchecked { + ++i; + } + } + + uint256 startTime = makerAsk.startTime; + uint256 endTime = makerAsk.endTime; + + price = ((endTime - block.timestamp) * startPrice + (block.timestamp - startTime) * makerAsk.price) + / (endTime - startTime); + + uint256 maxPrice = abi.decode(takerBid.additionalParameters, (uint256)); + if (maxPrice < price) { + revert BidTooLow(); + } + + isNonceInvalidated = true; + + itemIds = makerAsk.itemIds; + amounts = makerAsk.amounts; + } + + /** + * @inheritdoc IStrategy + */ + function isMakerOrderValid(OrderStructs.Maker calldata makerAsk, bytes4 functionSelector) + external + view + override + returns (bool isValid, bytes4 errorSelector) + { + if (makerAsk.collectionType != CollectionType.Hypercert) { + return (isValid, CollectionTypeInvalid.selector); + } + + if (functionSelector != StrategyHypercertDutchAuction.executeStrategyWithTakerBid.selector) { + return (isValid, FunctionSelectorInvalid.selector); + } + + if (makerAsk.quoteType != QuoteType.Ask) { + return (isValid, QuoteTypeInvalid.selector); + } + + uint256 itemIdsLength = makerAsk.itemIds.length; + + (uint256 startPrice, uint256[] memory unitsPerItem) = + abi.decode(makerAsk.additionalParameters, (uint256, uint256[])); + + if ( + itemIdsLength == 0 || unitsPerItem.length == 0 || unitsPerItem.length != itemIdsLength + || itemIdsLength != makerAsk.amounts.length + ) { + return (isValid, OrderInvalid.selector); + } + + for (uint256 i; i < itemIdsLength;) { + if ( + makerAsk.amounts[i] != 1 + || (IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[i]) != unitsPerItem[i]) + ) { + return (isValid, OrderInvalid.selector); + } + unchecked { + ++i; + } + } + + if (startPrice < makerAsk.price) { + return (isValid, OrderInvalid.selector); + } + + isValid = true; + } +} diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol index dddf444b..5d5e67c6 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -207,8 +207,7 @@ contract StrategyHypercertFractionOffer is BaseStrategy { // If no root is provided or invalid length, it should be invalid. // @dev It does not mean the merkle root is valid against a specific itemId that exists in the collection. // @dev 128 is the length of the bytes32 array when the merkle root is provided together with three uint256 - // params - // declared in the additionalParameters (minUnits, maxUnits, minUnitsToKeep, root). + // params declared in the additionalParameters (minUnits, maxUnits, minUnitsToKeep, root). if ( functionSelector == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector diff --git a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol index 77050d6a..12ff6367 100644 --- a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol +++ b/contracts/src/marketplace/helpers/OrderValidatorV2A.sol @@ -19,7 +19,7 @@ import {IRoyaltyFeeRegistry} from "../interfaces/IRoyaltyFeeRegistry.sol"; import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; // Shared errors -import {OrderInvalid} from "../errors/SharedErrors.sol"; +import {OrderInvalid, CollectionTypeInvalid} from "../errors/SharedErrors.sol"; // Other dependencies import {LooksRareProtocol} from "../LooksRareProtocol.sol"; @@ -897,6 +897,8 @@ contract OrderValidatorV2A { } else { if (errorSelector == OrderInvalid.selector) { validationCode = MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE; + } else if (errorSelector == CollectionTypeInvalid.selector) { + validationCode = MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE; } else { validationCode = MAKER_ORDER_TEMPORARILY_INVALID_NON_STANDARD_SALE; } diff --git a/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol index a147ede7..432cb6d8 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol @@ -13,7 +13,8 @@ import { OrderInvalid, FunctionSelectorInvalid, MerkleProofInvalid, - QuoteTypeInvalid + QuoteTypeInvalid, + CollectionTypeInvalid } from "@hypercerts/marketplace/errors/SharedErrors.sol"; import {MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; @@ -130,6 +131,30 @@ contract CollectionOrdersTest is ProtocolBase { looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); } + function testCollectionTypeInvalid() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockERC721), address(weth)); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerBid.amounts = amounts; + makerBid.strategyId = 1; + makerBid.collectionType = CollectionType.Hypercert; + makerBid.additionalParameters = abi.encode(mockMerkleRoot); + + takerAsk.additionalParameters = abi.encode(1, 1); + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsInvalidCollection(makerBid, false); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(CollectionTypeInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + /** * Any itemId for ERC721 (where royalties come from the registry) is sold through a collection taker ask using WETH. * We use fuzzing to generate the tokenId that is sold. @@ -506,6 +531,14 @@ contract CollectionOrdersTest is ProtocolBase { assertEq(errorSelector, OrderInvalid.selector); } + function _assertOrderIsInvalidCollection(OrderStructs.Maker memory makerBid, bool withProof) private { + (bool orderIsValid, bytes4 errorSelector) = + strategyCollectionOffer.isMakerOrderValid(makerBid, withProof ? selectorWithProof : selectorNoProof); + + assertFalse(orderIsValid); + assertEq(errorSelector, CollectionTypeInvalid.selector); + } + function _mintNFTsToOwnerAndGetMerkleRootAndProof( address owner, uint256 numberOfItemsInMerkleTree, diff --git a/contracts/test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol b/contracts/test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol index 4370cb3d..e7b1a4c3 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol @@ -12,7 +12,8 @@ import { BidTooLow, OrderInvalid, FunctionSelectorInvalid, - QuoteTypeInvalid + QuoteTypeInvalid, + CollectionTypeInvalid } from "@hypercerts/marketplace/errors/SharedErrors.sol"; import { STRATEGY_NOT_ACTIVE, @@ -391,6 +392,44 @@ contract DutchAuctionOrdersTest is ProtocolBase, IStrategyManager { assertEq(errorSelector, FunctionSelectorInvalid.selector); } + function testCollectionTypeInvalid( + uint256 _startPrice, + uint256 _duration, + uint256 _decayPerSecond, + uint256 _elapsedTime + ) public { + (uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) = + _fuzzAssumptions(_startPrice, _duration, _decayPerSecond, _elapsedTime); + _setUpUsers(); + _setUpNewStrategy(); + + (uint256 endPrice, uint256 executionPrice) = _calculatePrices(startPrice, duration, decayPerSecond, elapsedTime); + + deal(address(weth), takerUser, executionPrice); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: startPrice, + endPrice: endPrice, + endTime: block.timestamp + duration + }); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerAsk.amounts = amounts; + makerAsk.collectionType = CollectionType.Hypercert; + makerAsk.additionalParameters = abi.encode(block.timestamp + 1000); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(CollectionTypeInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + function _assertOrderIsValid(OrderStructs.Maker memory makerAsk) private { (bool isValid, bytes4 errorSelector) = strategyDutchAuction.isMakerOrderValid(makerAsk, selector); assertTrue(isValid); diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol new file mode 100644 index 00000000..edc6cb80 --- /dev/null +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol @@ -0,0 +1,729 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// Murky (third-party) library is used to compute Merkle trees in Solidity +import {Merkle} from "murky/Merkle.sol"; + +// Libraries +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; + +// Shared errors +import { + AmountInvalid, + OrderInvalid, + FunctionSelectorInvalid, + MerkleProofInvalid, + QuoteTypeInvalid, + CollectionTypeInvalid +} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import { + MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE, + ORDER_EXPECTED_TO_BE_VALID +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Strategies +import {StrategyHypercertCollectionOffer} from + "@hypercerts/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol"; + +// Base test +import {ProtocolBase} from "../ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract HypercertCollectionOffersTest is ProtocolBase { + StrategyHypercertCollectionOffer public strategyHypercertCollectionOffer; + bytes4 public selectorNoProof = + strategyHypercertCollectionOffer.executeHypercertCollectionStrategyWithTakerAsk.selector; + bytes4 public selectorWithProof = + strategyHypercertCollectionOffer.executeHypercertCollectionStrategyWithTakerAskWithProof.selector; + bytes4 public selectorWithProofAllowlist = + strategyHypercertCollectionOffer.executeHypercertCollectionStrategyWithTakerAskWithAllowlist.selector; + + uint256 private constant price = 1 ether; // Fixed price of sale + bytes32 private constant mockMerkleRoot = bytes32(keccak256("Mock")); // Mock merkle root + uint256 private constant firstHypercertFractionId = (1 << 128) + 1; + + function setUp() public { + _setUp(); + _setUpNewStrategies(); + } + + function _setUpNewStrategies() private asPrankedUser(_owner) { + strategyHypercertCollectionOffer = new StrategyHypercertCollectionOffer(); + _addStrategy(address(strategyHypercertCollectionOffer), selectorNoProof, true); + _addStrategy(address(strategyHypercertCollectionOffer), selectorWithProof, true); + _addStrategy(address(strategyHypercertCollectionOffer), selectorWithProofAllowlist, true); + } + + function testNewStrategies() public { + _assertStrategyAttributes(address(strategyHypercertCollectionOffer), selectorNoProof, true); + + ( + bool strategyIsActive, + uint16 strategyStandardProtocolFee, + uint16 strategyMinTotalFee, + uint16 strategyMaxProtocolFee, + bytes4 strategySelector, + bool strategyIsMakerBid, + address strategyImplementation + ) = looksRareProtocol.strategyInfo(2); + + assertTrue(strategyIsActive); + assertEq(strategyStandardProtocolFee, _standardProtocolFeeBp); + assertEq(strategyMinTotalFee, _minTotalFeeBp); + assertEq(strategyMaxProtocolFee, _maxProtocolFeeBp); + assertEq(strategySelector, selectorWithProof); + assertTrue(strategyIsMakerBid); + assertEq(strategyImplementation, address(strategyHypercertCollectionOffer)); + } + + function testMakerBidAmountsLengthNotOne() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockHypercertMinter), address(weth), true); + + uint256 itemIdInMerkleTree = 2; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProof({ + owner: takerUser, + numberOfItemsInMerkleTree: 5, + itemIdInMerkleTree: itemIdInMerkleTree + }); + + // Adjust strategy for collection order and sign order + // Change array to make it bigger than expected + uint256[] memory amounts = new uint256[](2); + amounts[0] = 1; + makerBid.strategyId = 1; + makerBid.amounts = amounts; + makerBid.additionalParameters = abi.encode(10_000); + + takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 10_000); + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsInvalid(makerBid, selectorNoProof); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // With proof + makerBid.strategyId = 2; + makerBid.additionalParameters = abi.encode(10_000, merkleRoot); + takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 10_000, proof); + signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsInvalid(makerBid, selectorWithProof); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // With allowlist proof + makerBid.strategyId = 3; + makerBid.additionalParameters = abi.encode(10_000, merkleRoot); + takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 10_000, proof); + + signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsInvalid(makerBid, selectorWithProofAllowlist); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testZeroAmount() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockHypercertMinter), address(weth), true); + + vm.prank(makerUser); + mockHypercertMinter.mintClaim(makerUser, 10_000, "https://example.com", FROM_CREATOR_ONLY); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 0; + makerBid.amounts = amounts; + makerBid.strategyId = 1; + makerBid.additionalParameters = abi.encode(10_000, mockMerkleRoot); + + takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 10_000, 1); + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsInvalid(makerBid, selectorNoProof); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testCollectionTypeInvalid() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockHypercertMinter), address(weth), true); + + vm.prank(takerUser); + mockHypercertMinter.mintClaim(takerUser, 10_000, "https://example.com", FROM_CREATOR_ONLY); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerBid.amounts = amounts; + makerBid.strategyId = 1; + makerBid.collectionType = CollectionType.ERC721; + makerBid.additionalParameters = abi.encode(10_000, mockMerkleRoot); + + takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 10_000, 1); + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsInvalidCollection(makerBid, selectorNoProof); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(CollectionTypeInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testUnitsHeldInvalid() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerBid, OrderStructs.Taker memory takerAsk) = + _createMockMakerBidAndTakerAsk(address(mockHypercertMinter), address(weth), true); + + vm.prank(takerUser); + mockHypercertMinter.mintClaim(takerUser, 10_000, "https://example.com", FROM_CREATOR_ONLY); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + makerBid.amounts = amounts; + makerBid.strategyId = 1; + makerBid.collectionType = CollectionType.Hypercert; + + // Units held by maker don't match current token balance + makerBid.additionalParameters = abi.encode(5000, mockMerkleRoot); + + takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 10_000, 1); + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsValid(makerBid, selectorNoProof); + _assertValidMakerOrder(makerBid, signature); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Units offered by taker doesn't match maker bid + makerBid.additionalParameters = abi.encode(10_000, mockMerkleRoot); + + takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 5000, 1); + signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsValid(makerBid, selectorNoProof); + _assertValidMakerOrder(makerBid, signature); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // Unit balance of item has changed since bid creation + makerBid.additionalParameters = abi.encode(10_000, mockMerkleRoot); + + takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 10_000, 1); + signature = _signMakerOrder(makerBid, makerUserPK); + + uint256[] memory fractions = new uint256[](2); + fractions[0] = 5000; + fractions[1] = 5000; + + vm.prank(takerUser); + mockHypercertMinter.splitFraction(takerUser, firstHypercertFractionId, fractions); + + _assertOrderIsValid(makerBid, selectorNoProof); + _assertValidMakerOrder(makerBid, signature); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + /** + * Any itemId for hypercert (where royalties come from the registry) is sold through a collection taker ask using + * WETH. + * We use fuzzing to generate the tokenId that is sold. + */ + function testTakerAskCollectionOrderHypercert() public { + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 // Not used + }); + + vm.prank(takerUser); + mockHypercertMinter.mintClaim(takerUser, 10_000, "https://example.com", FROM_CREATOR_ONLY); + + makerBid.additionalParameters = abi.encode(10_000); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(firstHypercertFractionId, 10_000)); + + _assertOrderIsValid(makerBid, selectorNoProof); + _assertValidMakerOrder(makerBid, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerAsk(makerBid, firstHypercertFractionId); + } + + /** + * A collection offer with merkle tree criteria + * + * COLLECTION TOKEN IDs + */ + function testTakerAskCollectionOrderWithMerkleTreeHypercert() public { + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 // Not used + }); + + uint256 itemIdInMerkleTree = 2; + uint256 offeredItemId = (1 + itemIdInMerkleTree << 128) + 1; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProof({ + owner: takerUser, + numberOfItemsInMerkleTree: 5, + itemIdInMerkleTree: itemIdInMerkleTree + }); + + makerBid.additionalParameters = abi.encode(10_000, merkleRoot); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(offeredItemId, 10_000, proof)); + + // Verify validity of maker bid order + _assertOrderIsValid(makerBid, selectorWithProof); + _assertValidMakerOrder(makerBid, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerAsk(makerBid, offeredItemId); + } + + function testTakerAskCannotExecuteWithInvalidProof(uint256 itemIdSold) public { + vm.assume(itemIdSold > 5); + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + address owner = takerUser; + uint256 numberOfItemsInMerkleTree = 6; + uint256 itemIdInMerkleTree = 5; + (bytes32 merkleRoot, bytes32[] memory proof) = + _mintNFTsToOwnerAndGetMerkleRootAndProof(owner, numberOfItemsInMerkleTree, itemIdInMerkleTree); + makerBid.additionalParameters = abi.encode(10_000, merkleRoot); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Prepare the taker ask + proof[0] = bytes32(0); // Tamper with the proof + OrderStructs.Taker memory takerAsk = + OrderStructs.Taker(takerUser, abi.encode(((itemIdInMerkleTree << 128) + 1), 10_000, proof)); + + // Verify validity of maker bid order + _assertOrderIsValid(makerBid, selectorWithProof); + _assertValidMakerOrder(makerBid, signature); + + vm.prank(takerUser); + vm.expectRevert(MerkleProofInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + /** + * TAKER ALLOWLIST + */ + function testTakerAskHypercertCollectionOrderWithMerkleTreeAccountAllowlist() public { + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 3, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + address accountInMerkleTree = takerUser; + uint256 tokenIdInMerkleTree = 2; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ + owner: takerUser, + numberOfAccountsInMerkleTree: 5, + accountInMerkleTree: accountInMerkleTree + }); + + makerBid.additionalParameters = abi.encode(10_000, merkleRoot); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = + OrderStructs.Taker(takerUser, abi.encode(((tokenIdInMerkleTree << 128) + 1), 10_000, proof)); + + // Verify validity of maker bid order + _assertOrderIsValid(makerBid, selectorWithProofAllowlist); + _assertValidMakerOrder(makerBid, signature); + + // Execute taker ask transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerAsk(makerBid, (tokenIdInMerkleTree << 128) + 1); + } + + function testTakerAskCannotExecuteWithInvalidProofAccountAllowlist(uint256 itemIdSold) public { + vm.assume(itemIdSold > 5); + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 3, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 // Not used + }); + + address accountInMerkleTree = takerUser; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist({ + owner: takerUser, + numberOfAccountsInMerkleTree: 5, + // Doesn't matter what itemIdInMerkleTree is as we are are going to tamper with the proof + accountInMerkleTree: accountInMerkleTree + }); + makerBid.additionalParameters = abi.encode(10_000, merkleRoot); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Prepare the taker ask + proof[0] = bytes32(0); // Tamper with the proof + OrderStructs.Taker memory takerAsk = + OrderStructs.Taker(takerUser, abi.encode(firstHypercertFractionId, 10_000, proof)); + + // Verify validity of maker bid order + _assertOrderIsValid(makerBid, selectorWithProofAllowlist); + _assertValidMakerOrder(makerBid, signature); + + vm.prank(takerUser); + vm.expectRevert(MerkleProofInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testInvalidAmounts() public { + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + vm.prank(takerUser); + mockHypercertMinter.mintClaim(takerUser, 10_000, "https://example.com", FROM_CREATOR_ONLY); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = OrderStructs.Taker(takerUser, abi.encode(firstHypercertFractionId, 10_000)); + + // 1. Amount is 0 (without merkle proof) + makerBid.amounts[0] = 0; + makerBid.additionalParameters = abi.encode(10_000); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + _assertOrderIsInvalid(makerBid, selectorNoProof); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // 2. Amount is too high for hypercert (without merkle proof) + makerBid.amounts[0] = 2; + makerBid.additionalParameters = abi.encode(10_000); + + signature = _signMakerOrder(makerBid, makerUserPK); + _assertOrderIsInvalid(makerBid, selectorNoProof); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // 3. Amount is 0 (with merkle proof) + makerBid.strategyId = 2; + uint256 itemIdInMerkleTree = 5; + (bytes32 merkleRoot, bytes32[] memory proof) = _mintNFTsToOwnerAndGetMerkleRootAndProof({ + owner: takerUser, + numberOfItemsInMerkleTree: 6, + itemIdInMerkleTree: itemIdInMerkleTree + }); + + makerBid.additionalParameters = abi.encode(10_000, merkleRoot); + makerBid.amounts[0] = 0; + signature = _signMakerOrder(makerBid, makerUserPK); + + takerAsk.additionalParameters = abi.encode(itemIdInMerkleTree, 10_000, proof); + + _assertOrderIsInvalid(makerBid, selectorWithProof); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + + // 4. Amount is too high for hypercert (with merkle proof) + makerBid.amounts[0] = 2; + + makerBid.additionalParameters = abi.encode(10_000, merkleRoot); + + signature = _signMakerOrder(makerBid, makerUserPK); + _assertOrderIsInvalid(makerBid, selectorNoProof); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testMerkleRootLengthIsNot64() public { + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + _assertOrderIsInvalid(makerBid, selectorWithProof); + _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(); // It should revert without data (since the root cannot be extracted since the + // additionalParameters length is 0) + looksRareProtocol.executeTakerAsk(_genericTakerOrder(), makerBid, signature, _EMPTY_MERKLE_TREE); + } + + function testInvalidSelector() public { + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 3, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + (bool orderIsValid, bytes4 errorSelector) = + strategyHypercertCollectionOffer.isMakerOrderValid(makerBid, bytes4(0)); + assertFalse(orderIsValid); + assertEq(errorSelector, FunctionSelectorInvalid.selector); + } + + function testWrongQuoteType() public { + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + (bool orderIsValid, bytes4 errorSelector) = + strategyHypercertCollectionOffer.isMakerOrderValid(makerAsk, selectorNoProof); + + assertFalse(orderIsValid); + assertEq(errorSelector, QuoteTypeInvalid.selector); + } + + function _assertOrderIsValid(OrderStructs.Maker memory makerBid, bytes4 strategySelector) private { + (bool orderIsValid, bytes4 errorSelector) = + strategyHypercertCollectionOffer.isMakerOrderValid(makerBid, strategySelector); + assertTrue(orderIsValid); + assertEq(errorSelector, _EMPTY_BYTES4); + } + + function _assertOrderIsInvalid(OrderStructs.Maker memory makerBid, bytes4 strategySelector) private { + (bool orderIsValid, bytes4 errorSelector) = + strategyHypercertCollectionOffer.isMakerOrderValid(makerBid, strategySelector); + + assertFalse(orderIsValid); + assertEq(errorSelector, OrderInvalid.selector); + } + + function _assertOrderIsInvalidCollection(OrderStructs.Maker memory makerBid, bytes4 strategySelector) private { + (bool orderIsValid, bytes4 errorSelector) = + strategyHypercertCollectionOffer.isMakerOrderValid(makerBid, strategySelector); + + assertFalse(orderIsValid); + assertEq(errorSelector, CollectionTypeInvalid.selector); + } + + function _assertOrderIsInvalidAmount(OrderStructs.Maker memory makerBid, bytes4 strategySelector) private { + (bool orderIsValid, bytes4 errorSelector) = + strategyHypercertCollectionOffer.isMakerOrderValid(makerBid, strategySelector); + + assertFalse(orderIsValid); + assertEq(errorSelector, AmountInvalid.selector); + } + + function _mintNFTsToOwnerAndGetMerkleRootAndProof( + address owner, + uint256 numberOfItemsInMerkleTree, + uint256 itemIdInMerkleTree + ) private returns (bytes32 merkleRoot, bytes32[] memory proof) { + require(itemIdInMerkleTree < numberOfItemsInMerkleTree, "Invalid itemIdInMerkleTree"); + + // Initialize Merkle Tree + Merkle m = new Merkle(); + + bytes32[] memory merkleTreeIds = new bytes32[](numberOfItemsInMerkleTree); + vm.startPrank(owner); + for (uint256 i; i < numberOfItemsInMerkleTree; i++) { + mockHypercertMinter.mintClaim(owner, 10_000, "https://example.com", FROM_CREATOR_ONLY); + merkleTreeIds[i] = keccak256(abi.encodePacked(((1 + i) << 128) + 1)); + } + vm.stopPrank(); + + // Compute merkle root + merkleRoot = m.getRoot(merkleTreeIds); + proof = m.getProof(merkleTreeIds, itemIdInMerkleTree); + + assertTrue(m.verifyProof(merkleRoot, proof, merkleTreeIds[itemIdInMerkleTree])); + } + + function _mintNFTsToOwnerAndGetMerkleRootAndProofAccountAllowlist( + address owner, + uint256 numberOfAccountsInMerkleTree, + address accountInMerkleTree + ) private returns (bytes32 merkleRoot, bytes32[] memory proof) { + // Initialize Merkle Tree + Merkle m = new Merkle(); + + bytes32[] memory merkleTreeAccounts = new bytes32[](numberOfAccountsInMerkleTree); + vm.startPrank(owner); + for (uint256 i; i < numberOfAccountsInMerkleTree; i++) { + mockHypercertMinter.mintClaim(owner, 10_000, "https://example.com", FROM_CREATOR_ONLY); + merkleTreeAccounts[i] = keccak256(abi.encodePacked(accountInMerkleTree)); + } + vm.stopPrank(); + + // Compute merkle root + merkleRoot = m.getRoot(merkleTreeAccounts); + proof = m.getProof(merkleTreeAccounts, 2); + + assertTrue(m.verifyProof(merkleRoot, proof, merkleTreeAccounts[0])); + } + + function _assertSuccessfulTakerAsk(OrderStructs.Maker memory makerBid, uint256 tokenId) private { + // Taker user has received the asset + assertEq(mockHypercertMinter.ownerOf(tokenId), makerUser); + // Maker bid user pays the whole price + assertEq(weth.balanceOf(makerUser), _initialWETHBalanceUser - price); + // Taker ask user receives 99.5% of the whole price (0.5% protocol) + assertEq( + weth.balanceOf(takerUser), + _initialWETHBalanceUser + (price * _sellerProceedBpWithStandardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP + ); + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerBid.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } +} diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol new file mode 100644 index 00000000..88e42882 --- /dev/null +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol @@ -0,0 +1,502 @@ +/// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +// Libraries and interfaces +import {OrderStructs} from "@hypercerts/marketplace/libraries/OrderStructs.sol"; +import {IExecutionManager} from "@hypercerts/marketplace/interfaces/IExecutionManager.sol"; +import {IStrategyManager} from "@hypercerts/marketplace/interfaces/IStrategyManager.sol"; + +// Shared errors +import { + AmountInvalid, + BidTooLow, + OrderInvalid, + FunctionSelectorInvalid, + QuoteTypeInvalid, + CollectionTypeInvalid +} from "@hypercerts/marketplace/errors/SharedErrors.sol"; +import { + STRATEGY_NOT_ACTIVE, + MAKER_ORDER_TEMPORARILY_INVALID_NON_STANDARD_SALE, + MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE +} from "@hypercerts/marketplace/constants/ValidationCodeConstants.sol"; + +// Strategies +import {StrategyHypercertDutchAuction} from + "@hypercerts/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol"; + +// Other tests +import {ProtocolBase} from "../ProtocolBase.t.sol"; + +// Constants +import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/NumericConstants.sol"; + +// Enums +import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; +import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; + +contract HypercertDutchAuctionOrdersTest is ProtocolBase, IStrategyManager { + StrategyHypercertDutchAuction public strategyHypercertDutchAuction; + bytes4 public selector = StrategyHypercertDutchAuction.executeStrategyWithTakerBid.selector; + + function setUp() public { + _setUp(); + } + + function _setUpNewStrategy() private asPrankedUser(_owner) { + strategyHypercertDutchAuction = new StrategyHypercertDutchAuction(); + _addStrategy(address(strategyHypercertDutchAuction), selector, false); + } + + function _createMakerAskAndTakerBid( + uint256 numberOfItems, + uint256 numberOfAmounts, + uint256 startPrice, + uint256 endPrice, + uint256 endTime + ) private returns (OrderStructs.Maker memory newMakerAsk, OrderStructs.Taker memory newTakerBid) { + uint256[] memory itemIds = new uint256[](numberOfItems); + vm.startPrank(makerUser); + for (uint256 i; i < numberOfItems;) { + mockHypercertMinter.mintClaim(makerUser, 10_000, "https://example.com", FROM_CREATOR_ONLY); + + itemIds[i] = ((i + 1) << 128) + 1; + unchecked { + ++i; + } + } + vm.stopPrank(); + + uint256[] memory amounts = new uint256[](numberOfAmounts); + uint256[] memory unitsPerItem = new uint256[](numberOfAmounts); + for (uint256 i; i < numberOfAmounts;) { + amounts[i] = 1; + unitsPerItem[i] = 10_000; + unchecked { + ++i; + } + } + + newMakerAsk = OrderStructs.Maker({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + orderNonce: 0, + strategyId: 1, + collectionType: CollectionType.Hypercert, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + startTime: block.timestamp, + endTime: endTime, + price: endPrice, + itemIds: itemIds, + amounts: amounts, + additionalParameters: abi.encode(startPrice, unitsPerItem) + }); + + // Using startPrice as the maxPrice + newTakerBid = OrderStructs.Taker(takerUser, abi.encode(startPrice)); + } + + function testNewStrategy() public { + _setUpNewStrategy(); + _assertStrategyAttributes(address(strategyHypercertDutchAuction), selector, false); + } + + function _fuzzAssumptions(uint256 _startPrice, uint256 _duration, uint256 _decayPerSecond, uint256 _elapsedTime) + private + returns (uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) + { + // Bound instead of assume to handle too many rejections + // These limits should be realistically way more than enough + // vm.assume(duration > 0 && duration <= 31_536_000); + // Assume the NFT is worth at least 0.01 USD at today's ETH price (2023-01-13 18:00:00 UTC) + // vm.assume(startPrice > 1e12 && startPrice <= 100_000 ether); + // vm.assume(decayPerSecond > 0 && decayPerSecond < startPrice); + // vm.assume(elapsedTime <= duration && startPrice > decayPerSecond * duration); + + duration = bound(_duration, 1, 31_536_600); + startPrice = bound(_startPrice, 1e12, 100_000 ether); + decayPerSecond = bound(_decayPerSecond, 1, startPrice); + + vm.assume(_elapsedTime <= duration && startPrice > decayPerSecond * duration); + elapsedTime = _elapsedTime; + } + + function _calculatePrices(uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) + private + pure + returns (uint256 endPrice, uint256 executionPrice) + { + endPrice = startPrice - decayPerSecond * duration; + uint256 discount = decayPerSecond * elapsedTime; + executionPrice = startPrice - discount; + } + + function testHypercertDutchAuction( + uint256 _startPrice, + uint256 _duration, + uint256 _decayPerSecond, + uint256 _elapsedTime + ) public { + (uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) = + _fuzzAssumptions(_startPrice, _duration, _decayPerSecond, _elapsedTime); + _setUpUsers(); + _setUpNewStrategy(); + + (uint256 endPrice, uint256 executionPrice) = _calculatePrices(startPrice, duration, decayPerSecond, elapsedTime); + + deal(address(weth), takerUser, executionPrice); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: startPrice, + endPrice: endPrice, + endTime: block.timestamp + duration + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertOrderIsValid(makerAsk); + _assertValidMakerOrder(makerAsk, signature); + + vm.warp(block.timestamp + elapsedTime); + + // Execute taker bid transaction + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // Taker user has received the asset + assertEq(mockHypercertMinter.ownerOf((1 << 128) + 1), takerUser); + + // Taker bid user pays the whole price + assertEq(weth.balanceOf(takerUser), 0, "taker balance incorrect"); + // Maker ask user receives 99.5% of the whole price (0.5% protocol) + uint256 protocolFee = (executionPrice * _standardProtocolFeeBp) / ONE_HUNDRED_PERCENT_IN_BP; + assertEq( + weth.balanceOf(makerUser), + _initialWETHBalanceUser + (executionPrice - protocolFee), + "maker balance incorrect" + ); + } + + function testStartPriceTooLow(uint256 _startPrice, uint256 _duration, uint256 _decayPerSecond, uint256 _elapsedTime) + public + { + (uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) = + _fuzzAssumptions(_startPrice, _duration, _decayPerSecond, _elapsedTime); + _setUpUsers(); + _setUpNewStrategy(); + + (uint256 endPrice, uint256 executionPrice) = _calculatePrices(startPrice, duration, decayPerSecond, elapsedTime); + deal(address(weth), takerUser, executionPrice); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: startPrice, + endPrice: endPrice, + endTime: block.timestamp + duration + }); + + makerAsk.price = startPrice + 1 wei; + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testTakerBidTooLow(uint256 _startPrice, uint256 _duration, uint256 _decayPerSecond, uint256 _elapsedTime) + public + { + (uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) = + _fuzzAssumptions(_startPrice, _duration, _decayPerSecond, _elapsedTime); + _setUpUsers(); + _setUpNewStrategy(); + + (uint256 endPrice, uint256 executionPrice) = _calculatePrices(startPrice, duration, decayPerSecond, elapsedTime); + deal(address(weth), takerUser, executionPrice); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: startPrice, + endPrice: endPrice, + endTime: block.timestamp + duration + }); + + takerBid.additionalParameters = abi.encode(executionPrice - 1 wei); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Valid, taker struct validation only happens during execution + _assertOrderIsValid(makerAsk); + _assertValidMakerOrder(makerAsk, signature); + + vm.expectRevert(BidTooLow.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testInactiveStrategy() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: 10 ether, + endPrice: 1 ether, + endTime: block.timestamp + 1 hours + }); + + vm.prank(_owner); + looksRareProtocol.updateStrategy(1, false, _standardProtocolFeeBp, _minTotalFeeBp); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertOrderIsValid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, STRATEGY_NOT_ACTIVE); + + vm.prank(takerUser); + vm.expectRevert(abi.encodeWithSelector(IExecutionManager.StrategyNotAvailable.selector, 1)); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testZeroItemIdsLength() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 0, + numberOfAmounts: 0, + startPrice: 10 ether, + endPrice: 1 ether, + endTime: block.timestamp + 1 hours + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testEmptyUnitsPerItem() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: 10 ether, + endPrice: 1 ether, + endTime: block.timestamp + 1 hours + }); + + // Only encode the startprice + uint256[] memory unitsPerItem = new uint256[](0); + makerAsk.additionalParameters = abi.encode(10 ether, unitsPerItem); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testIncorrectUnitsPerItem() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: 10 ether, + endPrice: 1 ether, + endTime: block.timestamp + 1 hours + }); + + // Only encode the startprice + uint256[] memory unitsPerItem = new uint256[](1); + unitsPerItem[0] = 1; //default is 10_000 + makerAsk.additionalParameters = abi.encode(10 ether, unitsPerItem); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testItemIdsAndAmountsLengthMismatch() public { + _setUpUsers(); + _setUpNewStrategy(); + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 2, + startPrice: 10 ether, + endPrice: 1 ether, + endTime: block.timestamp + 1 hours + }); + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(errorSelector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testInvalidAmounts() public { + _setUpUsers(); + _setUpNewStrategy(); + + // 1. Amount = 0 + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: 10 ether, + endPrice: 1 ether, + endTime: block.timestamp + 1 hours + }); + + makerAsk.amounts[0] = 0; + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + bytes4 errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.expectRevert(AmountInvalid.selector); + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + // 2. Hypercert amount > 1; only sell single fracion + makerAsk.amounts[0] = 2; + signature = _signMakerOrder(makerAsk, makerUserPK); + + errorSelector = _assertOrderIsInvalid(makerAsk); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(AmountInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testWrongQuoteType() public { + _setUpNewStrategy(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 1, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: 1 ether, + itemId: 420 + }); + + (bool orderIsValid, bytes4 errorSelector) = strategyHypercertDutchAuction.isMakerOrderValid(makerBid, selector); + + assertFalse(orderIsValid); + assertEq(errorSelector, QuoteTypeInvalid.selector); + } + + function testInvalidSelector() public { + _setUpNewStrategy(); + + OrderStructs.Maker memory makerAsk = _createSingleItemMakerOrder({ + quoteType: QuoteType.Ask, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: 1 ether, + itemId: 420 + }); + + (bool orderIsValid, bytes4 errorSelector) = strategyHypercertDutchAuction.isMakerOrderValid(makerAsk, bytes4(0)); + assertFalse(orderIsValid); + assertEq(errorSelector, FunctionSelectorInvalid.selector); + } + + function testCollectionTypeInvalid( + uint256 _startPrice, + uint256 _duration, + uint256 _decayPerSecond, + uint256 _elapsedTime + ) public { + (uint256 startPrice, uint256 duration, uint256 decayPerSecond, uint256 elapsedTime) = + _fuzzAssumptions(_startPrice, _duration, _decayPerSecond, _elapsedTime); + _setUpUsers(); + _setUpNewStrategy(); + + (uint256 endPrice, uint256 executionPrice) = _calculatePrices(startPrice, duration, decayPerSecond, elapsedTime); + + deal(address(weth), takerUser, executionPrice); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBid({ + numberOfItems: 1, + numberOfAmounts: 1, + startPrice: startPrice, + endPrice: endPrice, + endTime: block.timestamp + duration + }); + + makerAsk.collectionType = CollectionType.ERC721; + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + vm.prank(takerUser); + vm.expectRevert(CollectionTypeInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function _assertOrderIsValid(OrderStructs.Maker memory makerAsk) private { + (bool isValid, bytes4 errorSelector) = strategyHypercertDutchAuction.isMakerOrderValid(makerAsk, selector); + assertTrue(isValid); + assertEq(errorSelector, _EMPTY_BYTES4); + } + + function _assertOrderIsInvalid(OrderStructs.Maker memory makerAsk) private returns (bytes4) { + (bool isValid, bytes4 errorSelector) = strategyHypercertDutchAuction.isMakerOrderValid(makerAsk, selector); + assertFalse(isValid); + assertEq(errorSelector, OrderInvalid.selector); + + return errorSelector; + } +} From ac466de7367b3a43f520b1f6bd9e0278c8844804 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 18 Dec 2023 05:14:23 +0100 Subject: [PATCH 052/118] fix(TRST-M-1): signed taker bid messages --- .../audits/marketplace/Hypercerts_v01-1.md | 24 +++++- .../StrategyHypercertCollectionOffer.sol | 83 ++++++++++++++++--- .../StrategyHypercertFractionOffer.sol | 5 +- .../HypercertCollectionOffers.t.sol | 81 +++++++++++++++--- .../marketplace/utils/ProtocolHelpers.sol | 15 ++++ 5 files changed, 177 insertions(+), 31 deletions(-) diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.md b/contracts/audits/marketplace/Hypercerts_v01-1.md index 0769cf12..ebc118fb 100644 --- a/contracts/audits/marketplace/Hypercerts_v01-1.md +++ b/contracts/audits/marketplace/Hypercerts_v01-1.md @@ -2,10 +2,10 @@ | Severity Level | Finding ID | Description | Status | | --------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------- | ------ | -| High | TRST-H-1 | A buyer can purchase more token units than the seller intended | | -| High | TRST-H-2 | The fraction offer maker order is not invalidated correctly, leading to orders being replayed | | -| High | TRST-H-3 | When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected | | -| Medium | TRST-M-1 | An attacker could grief buyer into getting a lower-value item than intended | | +| High | TRST-H-1 | A buyer can purchase more token units than the seller intended | Review | +| High | TRST-H-2 | The fraction offer maker order is not invalidated correctly, leading to orders being replayed | Review | +| High | TRST-H-3 | When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected | Review | +| Medium | TRST-M-1 | An attacker could grief buyer into getting a lower-value item than intended | Review | | Medium | TRST-M-2 | Fraction offers can be blocked from being fully fulfilled | | | Low | TRST-L-1 | The strategy validation function for fraction sales could revert | | | Low | TRST-L-2 | Hypercert orders with invalid amount will pass validations | | @@ -53,3 +53,19 @@ validators and executors in the strategies. To add checks on the units held by the fraction the units held by a fraction are stored in the order at create time, in some cases will be provided by the taker at execution time, with additional calls to the `HypercertMinter` contract to validate the units held by the fraction. + +### TRST-M-1 | An attacker could grief buyer into getting a lower-value item than intended + +Following the recommendation, we've added signed messages to the `StrategyHypercertFractionOffer.sol` strategy. This +entailed adding signed message parsing and updating the corresponding tests cases as well. + +To prevent replay attacks, the signed message consists of the following fields: + +```solidity + bytes32 orderHash, + uint256 offeredItemId, + bytes32[] memory proof +``` + +The signature is used to extract the signer, compare that account to the recipient declared in the Taker Bid. +Effectively, the signature can only be used to execute the order for the intended recipient on the provided Maker Ask. diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol index 141de5de..163fc749 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol @@ -42,6 +42,7 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; * @author LooksRare protocol team (👀,💎); bitbeckers */ contract StrategyHypercertCollectionOffer is BaseStrategy { + using OrderStructs for OrderStructs.Maker; /** * @notice This function validates the order under the context of the chosen strategy and * returns the fulfillable items/amounts/price/nonce invalidation status. @@ -49,6 +50,7 @@ contract StrategyHypercertCollectionOffer is BaseStrategy { * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) */ + function executeHypercertCollectionStrategyWithTakerAsk( OrderStructs.Taker calldata takerAsk, OrderStructs.Maker calldata makerBid @@ -152,29 +154,42 @@ contract StrategyHypercertCollectionOffer is BaseStrategy { price = makerBid.price; amounts = makerBid.amounts; - (uint256 offeredItemId, uint256 itemUnitsTaker, bytes32[] memory proof) = - abi.decode(takerAsk.additionalParameters, (uint256, uint256, bytes32[])); + (uint256 offeredItemId, uint256 itemUnitsTaker, bytes32[] memory proof, bytes memory signature) = + abi.decode(takerAsk.additionalParameters, (uint256, uint256, bytes32[], bytes)); (uint256 itemUnitsMaker, bytes32 root) = abi.decode(makerBid.additionalParameters, (uint256, bytes32)); - // A collection order can only be executable for 1 fraction - if ( - amounts.length != 1 || amounts[0] != 1 || itemUnitsTaker != itemUnitsMaker - || IHypercertToken(makerBid.collection).unitsOf(offeredItemId) != itemUnitsMaker - ) { - revert OrderInvalid(); - } + validateAmountsAndUnits(makerBid.collection, offeredItemId, amounts, itemUnitsTaker, itemUnitsMaker); itemIds = new uint256[](1); itemIds[0] = offeredItemId; isNonceInvalidated = true; - - bytes32 node = keccak256(abi.encodePacked(takerAsk.recipient)); + address recipient = takerAsk.recipient; // Verify the merkle root for the given merkle proof - if (!MerkleProofMemory.verify(proof, root, node)) { + if (!MerkleProofMemory.verify(proof, root, keccak256(abi.encodePacked(recipient)))) { revert MerkleProofInvalid(); } + + if (!verifyTakerSignature(makerBid.hash(), offeredItemId, proof, signature, recipient)) { + revert OrderInvalid(); + } + } + + function validateAmountsAndUnits( + address collection, + uint256 offeredItemId, + uint256[] memory amounts, + uint256 itemUnitsTaker, + uint256 itemUnitsMaker + ) internal view { + // A collection order can only be executable for 1 fraction + if ( + amounts.length != 1 || amounts[0] != 1 || itemUnitsTaker != itemUnitsMaker + || IHypercertToken(collection).unitsOf(offeredItemId) != itemUnitsMaker + ) { + revert OrderInvalid(); + } } /** @@ -224,4 +239,48 @@ contract StrategyHypercertCollectionOffer is BaseStrategy { isValid = true; } + + // Function to verify the taker's signature + function verifyTakerSignature( + bytes32 orderHash, + uint256 offeredItemId, + bytes32[] memory proof, + bytes memory signature, + address expectedSigner + ) internal pure returns (bool) { + bytes32 messageHash = getMessageHash(orderHash, offeredItemId, proof); + + return recoverSigner(messageHash, signature) == expectedSigner; + } + + // Internal function to recreate the message hash + function getMessageHash(bytes32 orderHash, uint256 offeredItemId, bytes32[] memory proof) + private + pure + returns (bytes32) + { + return keccak256(abi.encodePacked(orderHash, offeredItemId, proof)); + } + + // Internal function to recover the signer from the signature + function recoverSigner(bytes32 messageHash, bytes memory signature) private pure returns (address) { + bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash)); + + (bytes32 r, bytes32 s, uint8 v) = splitSignature(signature); + + return ecrecover(ethSignedMessageHash, v, r, s); + } + + // Helper function to split the signature into r, s, and v + function splitSignature(bytes memory sig) private pure returns (bytes32 r, bytes32 s, uint8 v) { + if (sig.length != 65) { + revert OrderInvalid(); + } + + assembly { + r := mload(add(sig, 32)) + s := mload(add(sig, 64)) + v := byte(0, mload(add(sig, 96))) + } + } } diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol index 5d5e67c6..202d23e9 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -196,10 +196,9 @@ contract StrategyHypercertFractionOffer is BaseStrategy { abi.decode(makerAsk.additionalParameters, (uint256, uint256, uint256)); if ( - makerAsk.amounts.length != 1 || makerAsk.amounts[0] != 1 + makerAsk.amounts.length != 1 || makerAsk.itemIds.length != 1 || makerAsk.amounts[0] != 1 + || minUnitAmount > maxUnitAmount || makerAsk.price == 0 || maxUnitAmount == 0 || IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[0]) <= minUnitsToKeep - || makerAsk.itemIds.length != 1 || minUnitAmount > maxUnitAmount || makerAsk.price == 0 - || maxUnitAmount == 0 ) { return (isValid, OrderInvalid.selector); } diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol index edc6cb80..17eb71f8 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol @@ -131,14 +131,24 @@ contract HypercertCollectionOffersTest is ProtocolBase { makerBid.additionalParameters = abi.encode(10_000, merkleRoot); takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 10_000, proof); - signature = _signMakerOrder(makerBid, makerUserPK); + // Sign order + bytes memory signatureMaker = _signMakerOrder(makerBid, makerUserPK); + + bytes memory signatureTaker = _signTakerDataCollectionStrategy(makerBid, ((1 << 128) + 1), proof, takerUserPK); + + proof[0] = bytes32(0); // Tamper with the proof + + // Prepare the taker ask + takerAsk = OrderStructs.Taker(takerUser, abi.encode(((1 << 128) + 1), 10_000, proof, signatureTaker)); _assertOrderIsInvalid(makerBid, selectorWithProofAllowlist); - _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + _assertMakerOrderReturnValidationCode( + makerBid, signatureMaker, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE + ); vm.prank(takerUser); vm.expectRevert(OrderInvalid.selector); - looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signatureMaker, _EMPTY_MERKLE_TREE); } function testZeroAmount() public { @@ -390,6 +400,47 @@ contract HypercertCollectionOffersTest is ProtocolBase { looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); } + function testTakerAskCannotExecuteSignatureForDifferentToken(uint256 itemIdSold) public { + vm.assume(itemIdSold > 5); + _setUpUsers(); + + OrderStructs.Maker memory makerBid = _createSingleItemMakerOrder({ + quoteType: QuoteType.Bid, + globalNonce: 0, + subsetNonce: 0, + strategyId: 2, + collectionType: CollectionType.Hypercert, + orderNonce: 0, + collection: address(mockHypercertMinter), + currency: address(weth), + signer: makerUser, + price: price, + itemId: 0 + }); + + address owner = takerUser; + uint256 numberOfItemsInMerkleTree = 6; + uint256 itemIdInMerkleTree = 5; + (bytes32 merkleRoot, bytes32[] memory proof) = + _mintNFTsToOwnerAndGetMerkleRootAndProof(owner, numberOfItemsInMerkleTree, itemIdInMerkleTree); + makerBid.additionalParameters = abi.encode(10_000, merkleRoot); + + // Sign order + bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + + // Prepare the taker ask + OrderStructs.Taker memory takerAsk = + OrderStructs.Taker(takerUser, abi.encode(((itemIdInMerkleTree << 128) + 2), 10_000, proof)); + + // Verify validity of maker bid order + _assertOrderIsValid(makerBid, selectorWithProof); + _assertValidMakerOrder(makerBid, signature); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + } + /** * TAKER ALLOWLIST */ @@ -421,19 +472,22 @@ contract HypercertCollectionOffersTest is ProtocolBase { makerBid.additionalParameters = abi.encode(10_000, merkleRoot); // Sign order - bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + bytes memory signatureMaker = _signMakerOrder(makerBid, makerUserPK); + + bytes memory signatureTaker = + _signTakerDataCollectionStrategy(makerBid, ((tokenIdInMerkleTree << 128) + 1), proof, takerUserPK); // Prepare the taker ask OrderStructs.Taker memory takerAsk = - OrderStructs.Taker(takerUser, abi.encode(((tokenIdInMerkleTree << 128) + 1), 10_000, proof)); + OrderStructs.Taker(takerUser, abi.encode(((tokenIdInMerkleTree << 128) + 1), 10_000, proof, signatureTaker)); // Verify validity of maker bid order _assertOrderIsValid(makerBid, selectorWithProofAllowlist); - _assertValidMakerOrder(makerBid, signature); + _assertValidMakerOrder(makerBid, signatureMaker); // Execute taker ask transaction vm.prank(takerUser); - looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signatureMaker, _EMPTY_MERKLE_TREE); _assertSuccessfulTakerAsk(makerBid, (tokenIdInMerkleTree << 128) + 1); } @@ -466,20 +520,23 @@ contract HypercertCollectionOffersTest is ProtocolBase { makerBid.additionalParameters = abi.encode(10_000, merkleRoot); // Sign order - bytes memory signature = _signMakerOrder(makerBid, makerUserPK); + bytes memory signatureMaker = _signMakerOrder(makerBid, makerUserPK); + + bytes memory signatureTaker = _signTakerDataCollectionStrategy(makerBid, ((1 << 128) + 1), proof, takerUserPK); - // Prepare the taker ask proof[0] = bytes32(0); // Tamper with the proof + + // Prepare the taker ask OrderStructs.Taker memory takerAsk = - OrderStructs.Taker(takerUser, abi.encode(firstHypercertFractionId, 10_000, proof)); + OrderStructs.Taker(takerUser, abi.encode(((1 << 128) + 1), 10_000, proof, signatureTaker)); // Verify validity of maker bid order _assertOrderIsValid(makerBid, selectorWithProofAllowlist); - _assertValidMakerOrder(makerBid, signature); + _assertValidMakerOrder(makerBid, signatureMaker); vm.prank(takerUser); vm.expectRevert(MerkleProofInvalid.selector); - looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); + looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signatureMaker, _EMPTY_MERKLE_TREE); } function testInvalidAmounts() public { diff --git a/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol b/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol index 51c55d94..6b981ae0 100644 --- a/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol +++ b/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol @@ -101,6 +101,21 @@ contract ProtocolHelpers is TestHelpers, TestParameters { return abi.encodePacked(r, s, v); } + function _signTakerDataCollectionStrategy( + OrderStructs.Maker memory maker, + uint256 offeredItemId, + bytes32[] memory proof, + uint256 signerKey + ) internal view returns (bytes memory) { + bytes32 orderHash = _computeOrderHash(maker); + bytes32 dataHash = keccak256(abi.encodePacked(orderHash, offeredItemId, proof)); + + (uint8 v, bytes32 r, bytes32 s) = + vm.sign(signerKey, keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", dataHash))); + + return abi.encodePacked(r, s, v); + } + function _computeOrderHash(OrderStructs.Maker memory maker) internal pure returns (bytes32) { return maker.hash(); } From 911f14896e3725f911eb279a17a3b4d5fe0d57ca Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 18 Dec 2023 06:39:43 +0100 Subject: [PATCH 053/118] fix(l/m/sr): fixing last findings --- .../audits/marketplace/Hypercerts_v01-1.md | 32 ++++++++++++++++--- .../executionStrategies/BaseStrategy.sol | 5 ++- .../StrategyCollectionOffer.sol | 7 ++-- .../StrategyHypercertCollectionOffer.sol | 25 +++++++++++---- .../StrategyHypercertDutchAuction.sol | 13 +++++--- .../StrategyHypercertFractionOffer.sol | 14 ++++++-- contracts/src/protocol/AllowlistMinter.sol | 6 ++++ .../HypercertCollectionOffers.t.sol | 8 ++--- .../HypercertDutchAuctionOrders.t.sol | 2 +- .../HypercertFractionOffers.t.sol | 4 +-- .../foundry/protocol/AllowlistMinter.t.sol | 2 ++ 11 files changed, 92 insertions(+), 26 deletions(-) diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.md b/contracts/audits/marketplace/Hypercerts_v01-1.md index ebc118fb..f25590b6 100644 --- a/contracts/audits/marketplace/Hypercerts_v01-1.md +++ b/contracts/audits/marketplace/Hypercerts_v01-1.md @@ -6,10 +6,12 @@ | High | TRST-H-2 | The fraction offer maker order is not invalidated correctly, leading to orders being replayed | Review | | High | TRST-H-3 | When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected | Review | | Medium | TRST-M-1 | An attacker could grief buyer into getting a lower-value item than intended | Review | -| Medium | TRST-M-2 | Fraction offers can be blocked from being fully fulfilled | | -| Low | TRST-L-1 | The strategy validation function for fraction sales could revert | | -| Low | TRST-L-2 | Hypercert orders with invalid amount will pass validations | | -| Recommendations | TRST-R-1 | Improve validation of orders in fraction offers | | +| Medium | TRST-M-2 | Fraction offers can be blocked from being fully fulfilled | tbd | +| Low | TRST-L-1 | The strategy validation function for fraction sales could revert | Review | +| Low | TRST-L-2 | Hypercert orders with invalid amount will pass validations | Review | +| Recommendations | TRST-R-1 | Improve validation of orders in fraction offers | WIP | +| Systemic Risk | TRST-SR-1 | Risks associated with hypercerts | OK | +| | TRST-OOS | Allowlist tracking | WIP | ### TRST-H-1 | A buyer can purchase more token units than the seller @@ -69,3 +71,25 @@ To prevent replay attacks, the signed message consists of the following fields: The signature is used to extract the signer, compare that account to the recipient declared in the Taker Bid. Effectively, the signature can only be used to execute the order for the intended recipient on the provided Maker Ask. + +### TRST-L-1 | The strategy validation function for fraction sales could revert + +Fixed. + +### TRST-L-2 | Hypercert orders with invalid amount will pass validations + +Added additional logic check in assembly to `_validateAmountNoRevert` and implemented the method in the hypercert +strategies. + +### TRST-R-1 | Improve validation of orders in fraction offers + +Added additional checks on the length of the additional parameters for all hypercert strategies. + +### TRST-SR-1 | Risks associated with hypercerts + +Acknowledged. + +### TRST-OOS | Allowlist tracking + +Credits to Trust for quickly reporting an issue on the allowlist tracking. While we checked on allowlist limits, the +counter for minted units per claim was not updated. This has been fixed in `AllowlistMinter.sol`. diff --git a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol index 9d0bec3c..c8450ae9 100644 --- a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol +++ b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol @@ -36,7 +36,10 @@ abstract contract BaseStrategy is IStrategy { */ function _validateAmountNoRevert(uint256 amount, CollectionType collectionType) internal pure { assembly { - if or(iszero(amount), and(xor(amount, 1), iszero(collectionType))) { + if or( + iszero(amount), + or(and(xor(amount, 1), iszero(collectionType)), and(xor(amount, 1), eq(collectionType, 2))) + ) { mstore(0x00, 0x00) mstore(0x20, shl(224, OrderInvalid_error_selector)) return(0, 0x40) diff --git a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol index 826636b5..cb7e7976 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol @@ -191,8 +191,11 @@ contract StrategyCollectionOffer is BaseStrategy { // If no root is provided or invalid length, it should be invalid. // @dev It does not mean the merkle root is valid against a specific itemId that exists in the collection. if ( - functionSelector == StrategyCollectionOffer.executeCollectionStrategyWithTakerAskWithProof.selector - && makerBid.additionalParameters.length != 32 + ( + functionSelector == StrategyCollectionOffer.executeCollectionStrategyWithTakerAskWithProof.selector + || functionSelector + == StrategyCollectionOffer.executeCollectionStrategyWithTakerAskWithAllowlist.selector + ) && makerBid.additionalParameters.length != 32 ) { return (isValid, OrderInvalid.selector); } diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol index 163fc749..5458669c 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol @@ -221,18 +221,31 @@ contract StrategyHypercertCollectionOffer is BaseStrategy { // Check if amounts is length 1 with value 1 and additionalParameters is length 32 to check on expected units // received - if (makerBid.amounts.length != 1 || makerBid.amounts[0] != 1 || makerBid.additionalParameters.length < 32) { + if (makerBid.amounts.length != 1) { return (isValid, OrderInvalid.selector); } + _validateAmountNoRevert(makerBid.amounts[0], makerBid.collectionType); + // If no root is provided or invalid length, it should be invalid. // @dev It does not mean the merkle root is valid against a specific itemId that exists in the collection. - // @dev 64 is the length of the bytes32 array when the merkle root is provided together with three uint256 - // params declared in the additionalParameters (unitsInItem, root). + // @dev 64 is the length of the bytes32 array when the merkle root is provided together with 1 uint256 + // param declared in the additionalParameters (unitsInItem, root). + if ( + ( + functionSelector + == StrategyHypercertCollectionOffer.executeHypercertCollectionStrategyWithTakerAskWithProof.selector + || functionSelector + == StrategyHypercertCollectionOffer.executeHypercertCollectionStrategyWithTakerAskWithAllowlist.selector + ) && makerBid.additionalParameters.length != 64 + ) { + return (isValid, OrderInvalid.selector); + } + + // Without root if ( - functionSelector - == StrategyHypercertCollectionOffer.executeHypercertCollectionStrategyWithTakerAskWithProof.selector - && makerBid.additionalParameters.length != 64 + functionSelector == StrategyHypercertCollectionOffer.executeHypercertCollectionStrategyWithTakerAsk.selector + && makerBid.additionalParameters.length != 32 ) { return (isValid, OrderInvalid.selector); } diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol index 810d1691..6ac8d863 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol @@ -121,10 +121,8 @@ contract StrategyHypercertDutchAuction is BaseStrategy { } for (uint256 i; i < itemIdsLength;) { - if ( - makerAsk.amounts[i] != 1 - || (IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[i]) != unitsPerItem[i]) - ) { + _validateAmountNoRevert(makerAsk.amounts[i], makerAsk.collectionType); + if ((IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[i]) != unitsPerItem[i])) { return (isValid, OrderInvalid.selector); } unchecked { @@ -136,6 +134,13 @@ contract StrategyHypercertDutchAuction is BaseStrategy { return (isValid, OrderInvalid.selector); } + // If no root is provided or invalid length, it should be invalid. + // @dev 32 is the length of the bytes32 array when the startprice is provided together with an array of + // unitsPerItem. + // params declared in the additionalParameters (uint256 startPrice, uint256[] memory unitsPerItem). + if (makerAsk.additionalParameters.length != 64) { + return (isValid, OrderInvalid.selector); + } isValid = true; } } diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol index 202d23e9..c1d64223 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -196,13 +196,15 @@ contract StrategyHypercertFractionOffer is BaseStrategy { abi.decode(makerAsk.additionalParameters, (uint256, uint256, uint256)); if ( - makerAsk.amounts.length != 1 || makerAsk.itemIds.length != 1 || makerAsk.amounts[0] != 1 - || minUnitAmount > maxUnitAmount || makerAsk.price == 0 || maxUnitAmount == 0 + makerAsk.amounts.length != 1 || makerAsk.itemIds.length != 1 || minUnitAmount > maxUnitAmount + || makerAsk.price == 0 || maxUnitAmount == 0 || IHypercertToken(makerAsk.collection).unitsOf(makerAsk.itemIds[0]) <= minUnitsToKeep ) { return (isValid, OrderInvalid.selector); } + _validateAmountNoRevert(makerAsk.amounts[0], makerAsk.collectionType); + // If no root is provided or invalid length, it should be invalid. // @dev It does not mean the merkle root is valid against a specific itemId that exists in the collection. // @dev 128 is the length of the bytes32 array when the merkle root is provided together with three uint256 @@ -215,6 +217,14 @@ contract StrategyHypercertFractionOffer is BaseStrategy { return (isValid, OrderInvalid.selector); } + // without root + if ( + functionSelector == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector + && makerAsk.additionalParameters.length != 96 + ) { + return (isValid, OrderInvalid.selector); + } + isValid = true; } } diff --git a/contracts/src/protocol/AllowlistMinter.sol b/contracts/src/protocol/AllowlistMinter.sol index 78f1a592..d7197187 100644 --- a/contracts/src/protocol/AllowlistMinter.sol +++ b/contracts/src/protocol/AllowlistMinter.sol @@ -19,6 +19,10 @@ contract AllowlistMinter is IAllowlist { mapping(uint256 => uint256) internal maxUnits; mapping(uint256 => uint256) internal minted; + function getMinted(uint256 claimID) external view returns (uint256 mintedUnits) { + mintedUnits = minted[claimID]; + } + function isAllowedToClaim(bytes32[] calldata proof, uint256 claimID, bytes32 leaf) external view @@ -49,6 +53,8 @@ contract AllowlistMinter is IAllowlist { ) revert Errors.Invalid(); hasBeenClaimed[claimID][leaf] = true; + minted[claimID] += amount; + emit LeafClaimed(claimID, leaf); } diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol index 17eb71f8..0581323a 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol @@ -220,7 +220,7 @@ contract HypercertCollectionOffersTest is ProtocolBase { makerBid.collectionType = CollectionType.Hypercert; // Units held by maker don't match current token balance - makerBid.additionalParameters = abi.encode(5000, mockMerkleRoot); + makerBid.additionalParameters = abi.encode(5000); takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 10_000, 1); bytes memory signature = _signMakerOrder(makerBid, makerUserPK); @@ -233,7 +233,7 @@ contract HypercertCollectionOffersTest is ProtocolBase { looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); // Units offered by taker doesn't match maker bid - makerBid.additionalParameters = abi.encode(10_000, mockMerkleRoot); + makerBid.additionalParameters = abi.encode(10_000); takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 5000, 1); signature = _signMakerOrder(makerBid, makerUserPK); @@ -246,7 +246,7 @@ contract HypercertCollectionOffersTest is ProtocolBase { looksRareProtocol.executeTakerAsk(takerAsk, makerBid, signature, _EMPTY_MERKLE_TREE); // Unit balance of item has changed since bid creation - makerBid.additionalParameters = abi.encode(10_000, mockMerkleRoot); + makerBid.additionalParameters = abi.encode(10_000); takerAsk.additionalParameters = abi.encode(firstHypercertFractionId, 10_000, 1); signature = _signMakerOrder(makerBid, makerUserPK); @@ -614,7 +614,7 @@ contract HypercertCollectionOffersTest is ProtocolBase { makerBid.additionalParameters = abi.encode(10_000, merkleRoot); signature = _signMakerOrder(makerBid, makerUserPK); - _assertOrderIsInvalid(makerBid, selectorNoProof); + _assertOrderIsInvalid(makerBid, selectorWithProof); _assertMakerOrderReturnValidationCode(makerBid, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); vm.prank(takerUser); diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol index 88e42882..53965b2f 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol @@ -234,7 +234,7 @@ contract HypercertDutchAuctionOrdersTest is ProtocolBase, IStrategyManager { endTime: block.timestamp + duration }); - takerBid.additionalParameters = abi.encode(executionPrice - 1 wei); + takerBid.additionalParameters = abi.encode(executionPrice - 1 wei, 10_000); // Sign order bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol index 57a3861a..c3203439 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol @@ -36,7 +36,7 @@ import {ONE_HUNDRED_PERCENT_IN_BP} from "@hypercerts/marketplace/constants/Numer import {CollectionType} from "@hypercerts/marketplace/enums/CollectionType.sol"; import {QuoteType} from "@hypercerts/marketplace/enums/QuoteType.sol"; -contract HypercertFractionOffersTest is ProtocolBase { +contract HypercertFractionOrdersTest is ProtocolBase { using OrderStructs for OrderStructs.Maker; StrategyHypercertFractionOffer public strategyHypercertFractionOffer; @@ -83,7 +83,7 @@ contract HypercertFractionOffersTest is ProtocolBase { newMakerAsk.itemIds = itemIds; newMakerAsk.amounts = amounts; - newMakerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, minUnitsToKeep, mockMerkleRoot); + newMakerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, minUnitsToKeep); // Using startPrice as the maxPrice bytes32[] memory proofs = new bytes32[](0); diff --git a/contracts/test/foundry/protocol/AllowlistMinter.t.sol b/contracts/test/foundry/protocol/AllowlistMinter.t.sol index a5be53c6..e789e10a 100644 --- a/contracts/test/foundry/protocol/AllowlistMinter.t.sol +++ b/contracts/test/foundry/protocol/AllowlistMinter.t.sol @@ -115,6 +115,8 @@ contract AllowlistTest is PRBTest, StdCheats, StdUtils { startHoax(0x23314160c752D6Bb544661DcE13d01C21c64331E, 10 ether); merkle.processClaim(proofZero, claimID, units[0]); merkle.processClaim(proofTwo, claimID, units[2]); + + assertEq(merkle.getMinted(claimID), units[0] + units[2]); } function testBasicAllowlist() public { From f7f0805ccfee632f57c9488b4385c28e00f21887 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Wed, 20 Dec 2023 14:29:34 +0100 Subject: [PATCH 054/118] (feature): Delete order on execute taker bid autotask --- .../delete-order-on-order-fulfilled.ts | 1895 ----------------- defender/src/auto-tasks/execute-taker-bid.ts | 168 ++ defender/webpack.config.cjs | 2 + 3 files changed, 170 insertions(+), 1895 deletions(-) delete mode 100644 defender/src/auto-tasks/delete-order-on-order-fulfilled.ts create mode 100644 defender/src/auto-tasks/execute-taker-bid.ts diff --git a/defender/src/auto-tasks/delete-order-on-order-fulfilled.ts b/defender/src/auto-tasks/delete-order-on-order-fulfilled.ts deleted file mode 100644 index 9440950e..00000000 --- a/defender/src/auto-tasks/delete-order-on-order-fulfilled.ts +++ /dev/null @@ -1,1895 +0,0 @@ -import { - AutotaskEvent, - BlockTriggerEvent, -} from "@openzeppelin/defender-autotask-utils"; -import { getNetworkConfigFromName } from "../networks"; -import { createClient } from "@supabase/supabase-js"; -import fetch from "node-fetch"; -import { ethers } from "ethers"; -import { MissingDataError, NotImplementedError } from "../errors"; - -export async function handler(event: AutotaskEvent) { - console.log( - "Event: ", - JSON.stringify( - { ...event, secrets: "HIDDEN", credentials: "HIDDEN" }, - null, - 2, - ), - ); - const network = getNetworkConfigFromName(event.autotaskName); - const { SUPABASE_URL, SUPABASE_SECRET_API_KEY } = event.secrets; - const ALCHEMY_KEY = event.secrets[network.alchemyKeyEnvName]; - - const client = createClient(SUPABASE_URL, SUPABASE_SECRET_API_KEY, { - global: { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - fetch: (...args) => fetch(...args), - }, - }); - - let provider; - - if (ALCHEMY_KEY) { - provider = new ethers.providers.AlchemyProvider( - network.networkKey, - ALCHEMY_KEY, - ); - } else if (network.rpc) { - provider = new ethers.providers.JsonRpcProvider(network.rpc); - } else { - throw new Error("No provider available"); - } - - // Check data availability - const body = event.request.body; - if (!("type" in body) || body.type !== "BLOCK") { - throw new NotImplementedError("Event body is not a BlockTriggerEvent"); - } - const blockTriggerEvent = body as BlockTriggerEvent; - const contractAddress = blockTriggerEvent.matchedAddresses[0]; - const fromAddress = blockTriggerEvent.transaction.from; - const txnLogs = blockTriggerEvent.transaction.logs; - const tx = await provider.getTransaction(blockTriggerEvent.hash); - - if (!contractAddress) { - throw new MissingDataError(`body.matchedAddresses is missing`); - } else if (!fromAddress) { - throw new MissingDataError(`body.transaction.from is missing`); - } else if (!txnLogs) { - throw new MissingDataError(`body.transaction.logs is missing`); - } else if (!tx) { - throw new MissingDataError(`tx is missing`); - } - - console.log("Contract address", contractAddress); - console.log("From address", fromAddress); - - // TODO: Update contracts so we can use ABI from the @hypercerts-org/contracts package - const contractInterface = new ethers.utils.Interface(HypercertExchangeABI); - - // Parse TransferSingle events - const transferSingleEvents = txnLogs - .map((l) => { - //Ignore unknown events - try { - return contractInterface.parseLog(l); - } catch (e) { - console.log("Failed to parse log", l); - return null; - } - }) - .filter((e) => e !== null && e.name === "TransferSingle"); - - console.log( - "TransferSingle Events: ", - JSON.stringify(transferSingleEvents, null, 2), - ); - - if (transferSingleEvents.length !== 1) { - throw new MissingDataError( - `Unexpected saw ${transferSingleEvents.length} TransferSingle events`, - ); - } - - // Get claimID - const signerAddress = transferSingleEvents[0].args["from"] as string; - const itemId = transferSingleEvents[0].args["id"] as string; - console.log("Signer Address: ", signerAddress, "Fraction ID: ", itemId); - - // Parse TakerBid events - const takerBidEvents = txnLogs - .map((l) => { - //Ignore unknown events - try { - return contractInterface.parseLog(l); - } catch (e) { - console.log("Failed to parse log", l); - return null; - } - }) - .filter((e) => e !== null && e.name === "TakerBid"); - - console.log("TakerBid Events: ", JSON.stringify(takerBidEvents, null, 2)); - - if (takerBidEvents.length !== 1) { - throw new MissingDataError( - `Unexpected saw ${takerBidEvents.length} TakerBid events`, - ); - } - - // Get claimID - const orderNonce = takerBidEvents[0].args[ - "nonceInvalidationParameters" - ][0] as string; - console.log("Order nonce", orderNonce); - - // Remove from DB - if (await tx.wait(5).then((receipt) => receipt.status === 1)) { - const deleteResult = await client - .from("marketplace-orders") - .delete() - .eq("signer", signerAddress) - .eq("chain_id", network.chainId) - .eq("orderNonce", orderNonce) - .containedBy("itemIds", [itemId]) - .select(); - console.log("Deleted", deleteResult); - - if (!deleteResult) { - throw new Error( - `Could not remove from database. Delete result: ${JSON.stringify( - deleteResult, - )}`, - ); - } - } -} - -const HypercertExchangeABI = [ - { - inputs: [ - { - internalType: "address", - name: "_owner", - type: "address", - }, - { - internalType: "address", - name: "_protocolFeeRecipient", - type: "address", - }, - { - internalType: "address", - name: "_transferManager", - type: "address", - }, - { - internalType: "address", - name: "_weth", - type: "address", - }, - ], - stateMutability: "nonpayable", - type: "constructor", - }, - { - inputs: [], - name: "CallerInvalid", - type: "error", - }, - { - inputs: [], - name: "ChainIdInvalid", - type: "error", - }, - { - inputs: [], - name: "CreatorFeeBpTooHigh", - type: "error", - }, - { - inputs: [], - name: "CurrencyInvalid", - type: "error", - }, - { - inputs: [], - name: "ERC20TransferFromFail", - type: "error", - }, - { - inputs: [], - name: "LengthsInvalid", - type: "error", - }, - { - inputs: [], - name: "MerkleProofInvalid", - type: "error", - }, - { - inputs: [ - { - internalType: "uint256", - name: "length", - type: "uint256", - }, - ], - name: "MerkleProofTooLarge", - type: "error", - }, - { - inputs: [], - name: "NewGasLimitETHTransferTooLow", - type: "error", - }, - { - inputs: [], - name: "NewProtocolFeeRecipientCannotBeNullAddress", - type: "error", - }, - { - inputs: [], - name: "NoOngoingTransferInProgress", - type: "error", - }, - { - inputs: [], - name: "NoSelectorForStrategy", - type: "error", - }, - { - inputs: [], - name: "NoncesInvalid", - type: "error", - }, - { - inputs: [], - name: "NotAContract", - type: "error", - }, - { - inputs: [], - name: "NotOwner", - type: "error", - }, - { - inputs: [], - name: "NotV2Strategy", - type: "error", - }, - { - inputs: [], - name: "NullSignerAddress", - type: "error", - }, - { - inputs: [], - name: "OutsideOfTimeRange", - type: "error", - }, - { - inputs: [], - name: "QuoteTypeInvalid", - type: "error", - }, - { - inputs: [], - name: "ReentrancyFail", - type: "error", - }, - { - inputs: [], - name: "RenouncementNotInProgress", - type: "error", - }, - { - inputs: [], - name: "SameDomainSeparator", - type: "error", - }, - { - inputs: [], - name: "SignatureEOAInvalid", - type: "error", - }, - { - inputs: [], - name: "SignatureERC1271Invalid", - type: "error", - }, - { - inputs: [ - { - internalType: "uint256", - name: "length", - type: "uint256", - }, - ], - name: "SignatureLengthInvalid", - type: "error", - }, - { - inputs: [], - name: "SignatureParameterSInvalid", - type: "error", - }, - { - inputs: [ - { - internalType: "uint8", - name: "v", - type: "uint8", - }, - ], - name: "SignatureParameterVInvalid", - type: "error", - }, - { - inputs: [], - name: "StrategyHasNoSelector", - type: "error", - }, - { - inputs: [ - { - internalType: "uint256", - name: "strategyId", - type: "uint256", - }, - ], - name: "StrategyNotAvailable", - type: "error", - }, - { - inputs: [], - name: "StrategyNotUsed", - type: "error", - }, - { - inputs: [], - name: "StrategyProtocolFeeTooHigh", - type: "error", - }, - { - inputs: [], - name: "TransferAlreadyInProgress", - type: "error", - }, - { - inputs: [], - name: "TransferNotInProgress", - type: "error", - }, - { - inputs: [], - name: "UnsupportedCollectionType", - type: "error", - }, - { - inputs: [], - name: "WrongPotentialOwner", - type: "error", - }, - { - anonymous: false, - inputs: [], - name: "CancelOwnershipTransfer", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "currency", - type: "address", - }, - { - indexed: false, - internalType: "bool", - name: "isAllowed", - type: "bool", - }, - ], - name: "CurrencyStatusUpdated", - type: "event", - }, - { - anonymous: false, - inputs: [], - name: "InitiateOwnershipRenouncement", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "previousOwner", - type: "address", - }, - { - indexed: false, - internalType: "address", - name: "potentialOwner", - type: "address", - }, - ], - name: "InitiateOwnershipTransfer", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "user", - type: "address", - }, - { - indexed: false, - internalType: "uint256", - name: "bidNonce", - type: "uint256", - }, - { - indexed: false, - internalType: "uint256", - name: "askNonce", - type: "uint256", - }, - ], - name: "NewBidAskNonces", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "creatorFeeManager", - type: "address", - }, - ], - name: "NewCreatorFeeManager", - type: "event", - }, - { - anonymous: false, - inputs: [], - name: "NewDomainSeparator", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "uint256", - name: "gasLimitETHTransfer", - type: "uint256", - }, - ], - name: "NewGasLimitETHTransfer", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "uint256", - name: "maxCreatorFeeBp", - type: "uint256", - }, - ], - name: "NewMaxCreatorFeeBp", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "newOwner", - type: "address", - }, - ], - name: "NewOwner", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "protocolFeeRecipient", - type: "address", - }, - ], - name: "NewProtocolFeeRecipient", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "uint256", - name: "strategyId", - type: "uint256", - }, - { - indexed: false, - internalType: "uint16", - name: "standardProtocolFeeBp", - type: "uint16", - }, - { - indexed: false, - internalType: "uint16", - name: "minTotalFeeBp", - type: "uint16", - }, - { - indexed: false, - internalType: "uint16", - name: "maxProtocolFeeBp", - type: "uint16", - }, - { - indexed: false, - internalType: "bytes4", - name: "selector", - type: "bytes4", - }, - { - indexed: false, - internalType: "bool", - name: "isMakerBid", - type: "bool", - }, - { - indexed: false, - internalType: "address", - name: "implementation", - type: "address", - }, - ], - name: "NewStrategy", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "user", - type: "address", - }, - { - indexed: false, - internalType: "uint256[]", - name: "orderNonces", - type: "uint256[]", - }, - ], - name: "OrderNoncesCancelled", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "uint256", - name: "strategyId", - type: "uint256", - }, - { - indexed: false, - internalType: "bool", - name: "isActive", - type: "bool", - }, - { - indexed: false, - internalType: "uint16", - name: "standardProtocolFeeBp", - type: "uint16", - }, - { - indexed: false, - internalType: "uint16", - name: "minTotalFeeBp", - type: "uint16", - }, - ], - name: "StrategyUpdated", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "user", - type: "address", - }, - { - indexed: false, - internalType: "uint256[]", - name: "subsetNonces", - type: "uint256[]", - }, - ], - name: "SubsetNoncesCancelled", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - components: [ - { - internalType: "bytes32", - name: "orderHash", - type: "bytes32", - }, - { - internalType: "uint256", - name: "orderNonce", - type: "uint256", - }, - { - internalType: "bool", - name: "isNonceInvalidated", - type: "bool", - }, - ], - indexed: false, - internalType: "struct ILooksRareProtocol.NonceInvalidationParameters", - name: "nonceInvalidationParameters", - type: "tuple", - }, - { - indexed: false, - internalType: "address", - name: "askUser", - type: "address", - }, - { - indexed: false, - internalType: "address", - name: "bidUser", - type: "address", - }, - { - indexed: false, - internalType: "uint256", - name: "strategyId", - type: "uint256", - }, - { - indexed: false, - internalType: "address", - name: "currency", - type: "address", - }, - { - indexed: false, - internalType: "address", - name: "collection", - type: "address", - }, - { - indexed: false, - internalType: "uint256[]", - name: "itemIds", - type: "uint256[]", - }, - { - indexed: false, - internalType: "uint256[]", - name: "amounts", - type: "uint256[]", - }, - { - indexed: false, - internalType: "address[2]", - name: "feeRecipients", - type: "address[2]", - }, - { - indexed: false, - internalType: "uint256[3]", - name: "feeAmounts", - type: "uint256[3]", - }, - ], - name: "TakerAsk", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - components: [ - { - internalType: "bytes32", - name: "orderHash", - type: "bytes32", - }, - { - internalType: "uint256", - name: "orderNonce", - type: "uint256", - }, - { - internalType: "bool", - name: "isNonceInvalidated", - type: "bool", - }, - ], - indexed: false, - internalType: "struct ILooksRareProtocol.NonceInvalidationParameters", - name: "nonceInvalidationParameters", - type: "tuple", - }, - { - indexed: false, - internalType: "address", - name: "bidUser", - type: "address", - }, - { - indexed: false, - internalType: "address", - name: "bidRecipient", - type: "address", - }, - { - indexed: false, - internalType: "uint256", - name: "strategyId", - type: "uint256", - }, - { - indexed: false, - internalType: "address", - name: "currency", - type: "address", - }, - { - indexed: false, - internalType: "address", - name: "collection", - type: "address", - }, - { - indexed: false, - internalType: "uint256[]", - name: "itemIds", - type: "uint256[]", - }, - { - indexed: false, - internalType: "uint256[]", - name: "amounts", - type: "uint256[]", - }, - { - indexed: false, - internalType: "address[2]", - name: "feeRecipients", - type: "address[2]", - }, - { - indexed: false, - internalType: "uint256[3]", - name: "feeAmounts", - type: "uint256[3]", - }, - ], - name: "TakerBid", - type: "event", - }, - { - inputs: [], - name: "MAGIC_VALUE_ORDER_NONCE_EXECUTED", - outputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "WETH", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "uint16", - name: "standardProtocolFeeBp", - type: "uint16", - }, - { - internalType: "uint16", - name: "minTotalFeeBp", - type: "uint16", - }, - { - internalType: "uint16", - name: "maxProtocolFeeBp", - type: "uint16", - }, - { - internalType: "bytes4", - name: "selector", - type: "bytes4", - }, - { - internalType: "bool", - name: "isMakerBid", - type: "bool", - }, - { - internalType: "address", - name: "implementation", - type: "address", - }, - ], - name: "addStrategy", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256[]", - name: "orderNonces", - type: "uint256[]", - }, - ], - name: "cancelOrderNonces", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "cancelOwnershipTransfer", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256[]", - name: "subsetNonces", - type: "uint256[]", - }, - ], - name: "cancelSubsetNonces", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "chainId", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "confirmOwnershipRenouncement", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "confirmOwnershipTransfer", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "creatorFeeManager", - outputs: [ - { - internalType: "contract ICreatorFeeManager", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "domainSeparator", - outputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "address", - name: "recipient", - type: "address", - }, - { - internalType: "bytes", - name: "additionalParameters", - type: "bytes", - }, - ], - internalType: "struct OrderStructs.Taker[]", - name: "takerBids", - type: "tuple[]", - }, - { - components: [ - { - internalType: "enum QuoteType", - name: "quoteType", - type: "uint8", - }, - { - internalType: "uint256", - name: "globalNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "subsetNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "orderNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "strategyId", - type: "uint256", - }, - { - internalType: "enum CollectionType", - name: "collectionType", - type: "uint8", - }, - { - internalType: "address", - name: "collection", - type: "address", - }, - { - internalType: "address", - name: "currency", - type: "address", - }, - { - internalType: "address", - name: "signer", - type: "address", - }, - { - internalType: "uint256", - name: "startTime", - type: "uint256", - }, - { - internalType: "uint256", - name: "endTime", - type: "uint256", - }, - { - internalType: "uint256", - name: "price", - type: "uint256", - }, - { - internalType: "uint256[]", - name: "itemIds", - type: "uint256[]", - }, - { - internalType: "uint256[]", - name: "amounts", - type: "uint256[]", - }, - { - internalType: "bytes", - name: "additionalParameters", - type: "bytes", - }, - ], - internalType: "struct OrderStructs.Maker[]", - name: "makerAsks", - type: "tuple[]", - }, - { - internalType: "bytes[]", - name: "makerSignatures", - type: "bytes[]", - }, - { - components: [ - { - internalType: "bytes32", - name: "root", - type: "bytes32", - }, - { - components: [ - { - internalType: "bytes32", - name: "value", - type: "bytes32", - }, - { - internalType: "enum OrderStructs.MerkleTreeNodePosition", - name: "position", - type: "uint8", - }, - ], - internalType: "struct OrderStructs.MerkleTreeNode[]", - name: "proof", - type: "tuple[]", - }, - ], - internalType: "struct OrderStructs.MerkleTree[]", - name: "merkleTrees", - type: "tuple[]", - }, - { - internalType: "bool", - name: "isAtomic", - type: "bool", - }, - ], - name: "executeMultipleTakerBids", - // @ts-ignore - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "address", - name: "recipient", - type: "address", - }, - { - internalType: "bytes", - name: "additionalParameters", - type: "bytes", - }, - ], - internalType: "struct OrderStructs.Taker", - name: "takerAsk", - type: "tuple", - }, - { - components: [ - { - internalType: "enum QuoteType", - name: "quoteType", - type: "uint8", - }, - { - internalType: "uint256", - name: "globalNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "subsetNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "orderNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "strategyId", - type: "uint256", - }, - { - internalType: "enum CollectionType", - name: "collectionType", - type: "uint8", - }, - { - internalType: "address", - name: "collection", - type: "address", - }, - { - internalType: "address", - name: "currency", - type: "address", - }, - { - internalType: "address", - name: "signer", - type: "address", - }, - { - internalType: "uint256", - name: "startTime", - type: "uint256", - }, - { - internalType: "uint256", - name: "endTime", - type: "uint256", - }, - { - internalType: "uint256", - name: "price", - type: "uint256", - }, - { - internalType: "uint256[]", - name: "itemIds", - type: "uint256[]", - }, - { - internalType: "uint256[]", - name: "amounts", - type: "uint256[]", - }, - { - internalType: "bytes", - name: "additionalParameters", - type: "bytes", - }, - ], - internalType: "struct OrderStructs.Maker", - name: "makerBid", - type: "tuple", - }, - { - internalType: "bytes", - name: "makerSignature", - type: "bytes", - }, - { - components: [ - { - internalType: "bytes32", - name: "root", - type: "bytes32", - }, - { - components: [ - { - internalType: "bytes32", - name: "value", - type: "bytes32", - }, - { - internalType: "enum OrderStructs.MerkleTreeNodePosition", - name: "position", - type: "uint8", - }, - ], - internalType: "struct OrderStructs.MerkleTreeNode[]", - name: "proof", - type: "tuple[]", - }, - ], - internalType: "struct OrderStructs.MerkleTree", - name: "merkleTree", - type: "tuple", - }, - ], - name: "executeTakerAsk", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "address", - name: "recipient", - type: "address", - }, - { - internalType: "bytes", - name: "additionalParameters", - type: "bytes", - }, - ], - internalType: "struct OrderStructs.Taker", - name: "takerBid", - type: "tuple", - }, - { - components: [ - { - internalType: "enum QuoteType", - name: "quoteType", - type: "uint8", - }, - { - internalType: "uint256", - name: "globalNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "subsetNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "orderNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "strategyId", - type: "uint256", - }, - { - internalType: "enum CollectionType", - name: "collectionType", - type: "uint8", - }, - { - internalType: "address", - name: "collection", - type: "address", - }, - { - internalType: "address", - name: "currency", - type: "address", - }, - { - internalType: "address", - name: "signer", - type: "address", - }, - { - internalType: "uint256", - name: "startTime", - type: "uint256", - }, - { - internalType: "uint256", - name: "endTime", - type: "uint256", - }, - { - internalType: "uint256", - name: "price", - type: "uint256", - }, - { - internalType: "uint256[]", - name: "itemIds", - type: "uint256[]", - }, - { - internalType: "uint256[]", - name: "amounts", - type: "uint256[]", - }, - { - internalType: "bytes", - name: "additionalParameters", - type: "bytes", - }, - ], - internalType: "struct OrderStructs.Maker", - name: "makerAsk", - type: "tuple", - }, - { - internalType: "bytes", - name: "makerSignature", - type: "bytes", - }, - { - components: [ - { - internalType: "bytes32", - name: "root", - type: "bytes32", - }, - { - components: [ - { - internalType: "bytes32", - name: "value", - type: "bytes32", - }, - { - internalType: "enum OrderStructs.MerkleTreeNodePosition", - name: "position", - type: "uint8", - }, - ], - internalType: "struct OrderStructs.MerkleTreeNode[]", - name: "proof", - type: "tuple[]", - }, - ], - internalType: "struct OrderStructs.MerkleTree", - name: "merkleTree", - type: "tuple", - }, - ], - name: "executeTakerBid", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes32", - name: "root", - type: "bytes32", - }, - { - internalType: "uint256", - name: "proofLength", - type: "uint256", - }, - ], - name: "hashBatchOrder", - outputs: [ - { - internalType: "bytes32", - name: "batchOrderHash", - type: "bytes32", - }, - ], - stateMutability: "pure", - type: "function", - }, - { - inputs: [ - { - internalType: "bool", - name: "bid", - type: "bool", - }, - { - internalType: "bool", - name: "ask", - type: "bool", - }, - ], - name: "incrementBidAskNonces", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "initiateOwnershipRenouncement", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "newPotentialOwner", - type: "address", - }, - ], - name: "initiateOwnershipTransfer", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - name: "isCurrencyAllowed", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "maxCreatorFeeBp", - outputs: [ - { - internalType: "uint16", - name: "", - type: "uint16", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "owner", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "ownershipStatus", - outputs: [ - { - internalType: "enum IOwnableTwoSteps.Status", - name: "", - type: "uint8", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "potentialOwner", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "protocolFeeRecipient", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "address", - name: "recipient", - type: "address", - }, - { - internalType: "bytes", - name: "additionalParameters", - type: "bytes", - }, - ], - internalType: "struct OrderStructs.Taker", - name: "takerBid", - type: "tuple", - }, - { - components: [ - { - internalType: "enum QuoteType", - name: "quoteType", - type: "uint8", - }, - { - internalType: "uint256", - name: "globalNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "subsetNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "orderNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "strategyId", - type: "uint256", - }, - { - internalType: "enum CollectionType", - name: "collectionType", - type: "uint8", - }, - { - internalType: "address", - name: "collection", - type: "address", - }, - { - internalType: "address", - name: "currency", - type: "address", - }, - { - internalType: "address", - name: "signer", - type: "address", - }, - { - internalType: "uint256", - name: "startTime", - type: "uint256", - }, - { - internalType: "uint256", - name: "endTime", - type: "uint256", - }, - { - internalType: "uint256", - name: "price", - type: "uint256", - }, - { - internalType: "uint256[]", - name: "itemIds", - type: "uint256[]", - }, - { - internalType: "uint256[]", - name: "amounts", - type: "uint256[]", - }, - { - internalType: "bytes", - name: "additionalParameters", - type: "bytes", - }, - ], - internalType: "struct OrderStructs.Maker", - name: "makerAsk", - type: "tuple", - }, - { - internalType: "address", - name: "sender", - type: "address", - }, - { - internalType: "bytes32", - name: "orderHash", - type: "bytes32", - }, - ], - name: "restrictedExecuteTakerBid", - outputs: [ - { - internalType: "uint256", - name: "protocolFeeAmount", - type: "uint256", - }, - ], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - name: "strategyInfo", - outputs: [ - { - internalType: "bool", - name: "isActive", - type: "bool", - }, - { - internalType: "uint16", - name: "standardProtocolFeeBp", - type: "uint16", - }, - { - internalType: "uint16", - name: "minTotalFeeBp", - type: "uint16", - }, - { - internalType: "uint16", - name: "maxProtocolFeeBp", - type: "uint16", - }, - { - internalType: "bytes4", - name: "selector", - type: "bytes4", - }, - { - internalType: "bool", - name: "isMakerBid", - type: "bool", - }, - { - internalType: "address", - name: "implementation", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "transferManager", - outputs: [ - { - internalType: "contract TransferManager", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "newCreatorFeeManager", - type: "address", - }, - ], - name: "updateCreatorFeeManager", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "currency", - type: "address", - }, - { - internalType: "bool", - name: "isAllowed", - type: "bool", - }, - ], - name: "updateCurrencyStatus", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "updateDomainSeparator", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "newGasLimitETHTransfer", - type: "uint256", - }, - ], - name: "updateETHGasLimitForTransfer", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint16", - name: "newMaxCreatorFeeBp", - type: "uint16", - }, - ], - name: "updateMaxCreatorFeeBp", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "newProtocolFeeRecipient", - type: "address", - }, - ], - name: "updateProtocolFeeRecipient", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "strategyId", - type: "uint256", - }, - { - internalType: "bool", - name: "isActive", - type: "bool", - }, - { - internalType: "uint16", - name: "newStandardProtocolFee", - type: "uint16", - }, - { - internalType: "uint16", - name: "newMinTotalFee", - type: "uint16", - }, - ], - name: "updateStrategy", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - name: "userBidAskNonces", - outputs: [ - { - internalType: "uint256", - name: "bidNonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "askNonce", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - name: "userOrderNonce", - outputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - name: "userSubsetNonce", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, -]; diff --git a/defender/src/auto-tasks/execute-taker-bid.ts b/defender/src/auto-tasks/execute-taker-bid.ts new file mode 100644 index 00000000..ccc2c040 --- /dev/null +++ b/defender/src/auto-tasks/execute-taker-bid.ts @@ -0,0 +1,168 @@ +import { + AutotaskEvent, + BlockTriggerEvent, +} from "@openzeppelin/defender-autotask-utils"; +import { getNetworkConfigFromName } from "../networks"; +import { createClient } from "@supabase/supabase-js"; +import fetch from "node-fetch"; +import { BigNumber, ethers } from "ethers"; +import { MissingDataError, NotImplementedError } from "../errors"; +import { + HypercertExchangeAbi, + HypercertMinterAbi, +} from "@hypercerts-org/contracts"; + +export async function handler(event: AutotaskEvent) { + console.log( + "Event: ", + JSON.stringify( + { ...event, secrets: "HIDDEN", credentials: "HIDDEN" }, + null, + 2, + ), + ); + const network = getNetworkConfigFromName(event.autotaskName); + const { SUPABASE_URL, SUPABASE_SECRET_API_KEY } = event.secrets; + const ALCHEMY_KEY = event.secrets[network.alchemyKeyEnvName]; + + const client = createClient(SUPABASE_URL, SUPABASE_SECRET_API_KEY, { + global: { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + fetch: (...args) => fetch(...args), + }, + }); + + let provider; + + if (ALCHEMY_KEY) { + provider = new ethers.providers.AlchemyProvider( + network.networkKey, + ALCHEMY_KEY, + ); + } else if (network.rpc) { + provider = new ethers.providers.JsonRpcProvider(network.rpc); + } else { + throw new Error("No provider available"); + } + + // Check data availability + const body = event.request.body; + if (!("type" in body) || body.type !== "BLOCK") { + throw new NotImplementedError("Event body is not a BlockTriggerEvent"); + } + const blockTriggerEvent = body as BlockTriggerEvent; + const contractAddress = blockTriggerEvent.matchedAddresses[0]; + const fromAddress = blockTriggerEvent.transaction.from; + const txnLogs = blockTriggerEvent.transaction.logs; + const tx = await provider.getTransaction(blockTriggerEvent.hash); + + if (!contractAddress) { + throw new MissingDataError(`body.matchedAddresses is missing`); + } else if (!fromAddress) { + throw new MissingDataError(`body.transaction.from is missing`); + } else if (!txnLogs) { + throw new MissingDataError(`body.transaction.logs is missing`); + } else if (!tx) { + throw new MissingDataError(`tx is missing`); + } + + console.log("Contract address", contractAddress); + console.log("From address", fromAddress); + + // TODO: Update contracts so we can use ABI from the @hypercerts-org/contracts package + const hypercertsMinterContractInterface = new ethers.utils.Interface( + HypercertMinterAbi, + ); + + // Parse TransferSingle events + const parsedLogs = txnLogs.map((l) => { + //Ignore unknown events + try { + return hypercertsMinterContractInterface.parseLog(l); + } catch (e) { + console.log("Failed to parse log", l); + return null; + } + }); + console.log("Parsed logs: ", JSON.stringify(parsedLogs, null, 2)); + const transferSingleEvents = parsedLogs.filter( + (e) => e !== null && e.name === "TransferSingle", + ); + + console.log( + "TransferSingle Events: ", + JSON.stringify(transferSingleEvents, null, 2), + ); + + if (transferSingleEvents.length !== 1) { + throw new MissingDataError( + `Unexpected saw ${transferSingleEvents.length} TransferSingle events`, + ); + } + + // Get claimID + const signerAddress = transferSingleEvents[0].args["from"] as string; + const itemId = BigNumber.from(transferSingleEvents[0].args["id"]).toString(); + + const hypercertExchangeContractInterface = new ethers.utils.Interface( + HypercertExchangeAbi, + ); + // Parse TakerBid events + const takerBidEvents = txnLogs + .map((l) => { + //Ignore unknown events + try { + return hypercertExchangeContractInterface.parseLog(l); + } catch (e) { + console.log("Failed to parse log", l); + return null; + } + }) + .filter((e) => e !== null && e.name === "TakerBid"); + + console.log("TakerBid Events: ", JSON.stringify(takerBidEvents, null, 2)); + + if (takerBidEvents.length !== 1) { + throw new MissingDataError( + `Unexpected saw ${takerBidEvents.length} TakerBid events`, + ); + } + + // Get claimID + const orderNonce = BigNumber.from( + takerBidEvents[0].args["nonceInvalidationParameters"][1], + ).toString(); + console.log( + "Signer Address: ", + signerAddress, + "Order nonce: ", + orderNonce, + "Fraction ID: ", + itemId, + "Chain ID: ", + network.chainId, + ); + + // Remove from DB + if (await tx.wait(5).then((receipt) => receipt.status === 1)) { + const deleteResult = await client + .from("marketplace-orders") + .delete() + .eq("signer", signerAddress) + .eq("chainId", network.chainId) + .eq("orderNonce", orderNonce) + .containedBy("itemIds", [itemId]) + .select() + .throwOnError(); + console.log("Deleted", deleteResult); + + if (!deleteResult) { + throw new Error( + `Could not remove from database. Delete result: ${JSON.stringify( + deleteResult, + )}`, + ); + } + } +} diff --git a/defender/webpack.config.cjs b/defender/webpack.config.cjs index bf701568..749abaf2 100644 --- a/defender/webpack.config.cjs +++ b/defender/webpack.config.cjs @@ -9,6 +9,8 @@ module.exports = { "on-allowlist-created": "./src/auto-tasks/on-allowlist-created.ts", "mint-claim-from-allowlist": "./src/auto-tasks/mint-claim-from-allowlist.ts", + "execute-taker-bid": + "./src/auto-tasks/execute-taker-bid.ts", }, target: "node", mode: "development", From 06193836ac13e45f45d65cce20e3bb1f1d5d99d0 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Wed, 20 Dec 2023 15:18:56 +0100 Subject: [PATCH 055/118] (feat): fix setup and rollouts, update scripts --- defender/package.json | 2 +- defender/src/create-sentinel.ts | 11 +++-- defender/src/networks.ts | 17 ++++--- defender/src/rollout.ts | 58 ++++++++++++++++++++--- defender/src/update.ts | 37 +++++++++++++-- pnpm-lock.yaml | 84 +++++++++++++++++++++++++++++++-- 6 files changed, 186 insertions(+), 23 deletions(-) diff --git a/defender/package.json b/defender/package.json index b682499d..5fbc4d36 100644 --- a/defender/package.json +++ b/defender/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@graphql-mesh/cache-localforage": "^0.95.7", - "@hypercerts-org/contracts": "0.8.11", + "@hypercerts-org/contracts": "1.0.0", "@openzeppelin/defender-autotask-client": "1.50.0", "@openzeppelin/defender-autotask-utils": "1.50.0", "@openzeppelin/defender-base-client": "1.49.0", diff --git a/defender/src/create-sentinel.ts b/defender/src/create-sentinel.ts index 58acfd90..b0f6a560 100644 --- a/defender/src/create-sentinel.ts +++ b/defender/src/create-sentinel.ts @@ -13,22 +13,27 @@ export const createSentinel = async ({ autotaskID, functionConditions = [], eventConditions = [], + overrideContractAddress, + overrideABI, }: { name: string; network: NetworkConfig; autotaskID: string; eventConditions?: EventCondition[]; functionConditions?: FunctionCondition[]; + overrideContractAddress?: string; + overrideABI?: any; }) => { const client = new SentinelClient(config.credentials); + const contractAddress = overrideContractAddress || network.contractAddress; await client .create({ type: "BLOCK", network: network.networkKey, confirmLevel: 1, // if not set, we pick the blockwatcher for the chosen network with the lowest offset name, - addresses: [network.contractAddress], - abi: abi, + addresses: [contractAddress], + abi: overrideABI || abi, paused: false, eventConditions, functionConditions, @@ -41,7 +46,7 @@ export const createSentinel = async ({ `Created sentinel`, res.name, "- monitoring address", - network.contractAddress, + contractAddress, "- linked to autotask", autotaskID, ); diff --git a/defender/src/networks.ts b/defender/src/networks.ts index 80aa187b..237d48f7 100644 --- a/defender/src/networks.ts +++ b/defender/src/networks.ts @@ -55,23 +55,28 @@ export const NETWORKS: SupportedNetworks = { * We'll then subsequently use `getNetworkConfigFromName` * to extract the network name from within the Autotask * @param network + * @param contract * @param name - name pre-encoding * @returns */ -export const encodeName = (network: NetworkConfig, name: string) => - `[${network.networkKey}] ${name}`; +export const encodeName = ( + network: NetworkConfig, + contract: "minter" | "exchange", + name: string, +) => `[${network.networkKey}][${contract}] ${name}`; export const decodeName = ( encodedName: string, -): { networkKey: string; name: string } => { - const regex = /^\[(.+)\]\s(.+)$/; +): { networkKey: string; contract: string; name: string } => { + const regex = /^\[(.+)\]\[(.+)\]\s(.+)$/; const match = encodedName.match(regex); if (!match) { throw new Error(`Invalid encoded name: ${encodedName}`); } const networkKey = match[1]; - const name = match[2]; - return { networkKey, name }; + const contract = match[2]; + const name = match[3]; + return { networkKey, contract, name }; }; /** diff --git a/defender/src/rollout.ts b/defender/src/rollout.ts index 3904cd36..6197cf75 100644 --- a/defender/src/rollout.ts +++ b/defender/src/rollout.ts @@ -2,25 +2,39 @@ import { createTask } from "./create-autotask"; import { createSentinel } from "./create-sentinel"; import { ApiError } from "./errors"; import { NetworkConfig, encodeName } from "./networks"; +import { + HypercertExchangeAbi, + deployments, + asDeployedChain, +} from "@hypercerts-org/contracts"; export const rollOut = async (networks: NetworkConfig[]) => { return await Promise.all( networks.map(async (network) => { + console.log( + "Contract address", + network.chainId.toString(), + asDeployedChain(network.chainId.toString()), + deployments[asDeployedChain(network.chainId.toString())], + deployments[asDeployedChain(network.chainId.toString())] + .HypercertExchange, + ); // On allowlist created const autoTaskOnAllowlistCreated = await createTask( - encodeName(network, "on-allowlist-created"), + encodeName(network, "minter", "on-allowlist-created"), "on-allowlist-created", ); if (!autoTaskOnAllowlistCreated) { throw new ApiError( encodeName( network, + "minter", "Could not create autoTask for on-allowlist-created", ), ); } await createSentinel({ - name: encodeName(network, "AllowlistCreated"), + name: encodeName(network, "minter", "AllowlistCreated"), network: network, eventConditions: [ { eventSignature: "AllowlistCreated(uint256,bytes32)" }, @@ -30,19 +44,20 @@ export const rollOut = async (networks: NetworkConfig[]) => { // On batch minted const autoTaskOnBatchMintClaimsFromAllowlists = await createTask( - encodeName(network, "batch-mint-claims-from-allowlists"), + encodeName(network, "minter", "batch-mint-claims-from-allowlists"), "batch-mint-claims-from-allowlists", ); if (!autoTaskOnBatchMintClaimsFromAllowlists) { throw new ApiError( encodeName( network, + "minter", "Could not create autoTask for batch-mint-claims-from-allowlists", ), ); } await createSentinel({ - name: encodeName(network, "batchMintClaimsFromAllowlists"), + name: encodeName(network, "minter", "batchMintClaimsFromAllowlists"), network: network, autotaskID: autoTaskOnBatchMintClaimsFromAllowlists.autotaskId, functionConditions: [ @@ -55,19 +70,20 @@ export const rollOut = async (networks: NetworkConfig[]) => { // On single minted from allowlist const autoTaskOnMintClaimFromAllowlist = await createTask( - encodeName(network, "mint-claim-from-allowlist"), + encodeName(network, "minter", "mint-claim-from-allowlist"), "mint-claim-from-allowlist", ); if (!autoTaskOnMintClaimFromAllowlist) { throw new ApiError( encodeName( network, + "minter", "Could not create autoTask for mint-claim-from-allowlist", ), ); } await createSentinel({ - name: encodeName(network, "mintClaimFromAllowlist"), + name: encodeName(network, "minter", "mintClaimFromAllowlist"), network: network, autotaskID: autoTaskOnMintClaimFromAllowlist.autotaskId, functionConditions: [ @@ -77,6 +93,36 @@ export const rollOut = async (networks: NetworkConfig[]) => { }, ], }); + + // On execute taker bid + const autoTaskExecuteTakerBid = await createTask( + encodeName(network, "exchange", "execute-taker-bid"), + "execute-taker-bid", + ); + if (!autoTaskExecuteTakerBid) { + throw new ApiError( + encodeName( + network, + "exchange", + "Could not create autoTask for execute-taker-bid", + ), + ); + } + await createSentinel({ + name: encodeName(network, "exchange", "executeTakerBid"), + network: network, + autotaskID: autoTaskExecuteTakerBid.autotaskId, + overrideContractAddress: + deployments[asDeployedChain(network.chainId.toString())] + .HypercertExchange, + overrideABI: HypercertExchangeAbi, + functionConditions: [ + { + functionSignature: + "executeTakerBid((address,bytes),(uint8,uint256,uint256,uint256,uint256,uint8,address,address,address,uint256,uint256,uint256,uint256[],uint256[],bytes),bytes,(bytes32,(bytes32,uint8)[]))", + }, + ], + }); }), ); }; diff --git a/defender/src/update.ts b/defender/src/update.ts index f7fbf463..dee78669 100644 --- a/defender/src/update.ts +++ b/defender/src/update.ts @@ -1,8 +1,13 @@ -import { abi } from "./HypercertMinterABI"; +import { abi as HypercertMinterAbi } from "./HypercertMinterABI"; import config from "./config"; import { NetworkConfig, decodeName } from "./networks"; import { AutotaskClient } from "@openzeppelin/defender-autotask-client"; import { SentinelClient } from "@openzeppelin/defender-sentinel-client"; +import { + asDeployedChain, + deployments, + HypercertExchangeAbi, +} from "@hypercerts-org/contracts"; export const updateAutotask = async (networks: NetworkConfig[]) => { const autotaskClient = new AutotaskClient(config.credentials); @@ -44,12 +49,17 @@ export const updateSentinel = async (networks: NetworkConfig[]) => { const targetNetworks = networks.map((network) => network.networkKey); const oldSentinels = await sentinelClient.list(); + return await Promise.all([ ...oldSentinels.items.map((sentinel) => { // Get name and network - const { name, networkKey } = decodeName(sentinel.name); + const { name, networkKey, contract } = decodeName(sentinel.name); // Validate if in target networks + + let address: string | undefined; + let abi: any; + if (!targetNetworks.includes(networkKey as NetworkConfig["networkKey"])) { return; } @@ -57,6 +67,27 @@ export const updateSentinel = async (networks: NetworkConfig[]) => { (network) => network.networkKey === networkKey, ); + if (contract === "minter") { + address = network?.contractAddress; + abi = HypercertMinterAbi; + } + + if (contract === "exchange") { + const deployment = + deployments[asDeployedChain(network.chainId.toString())]; + address = deployment.HypercertExchange; + abi = HypercertExchangeAbi; + } + + if (!address) { + console.error(`No address found for ${sentinel.subscriberId}`); + return; + } + if (!abi) { + console.error(`No abi found for ${sentinel.subscriberId}`); + return; + } + // Update sentinel console.log( `Updating ${sentinel.subscriberId} from ./build/relay/${name} on ${networkKey}`, @@ -65,7 +96,7 @@ export const updateSentinel = async (networks: NetworkConfig[]) => { sentinelClient .update(sentinel.subscriberId, { ...sentinel, - addresses: [network.contractAddress], + addresses: [address], abi, }) .then((res) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1439bc98..d21a199f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -202,8 +202,8 @@ importers: specifier: ^0.95.7 version: 0.95.8(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@hypercerts-org/contracts': - specifier: 0.8.11 - version: 0.8.11 + specifier: 1.0.0 + version: 1.0.0(ts-node@10.9.1)(typescript@4.9.5) '@openzeppelin/defender-autotask-client': specifier: 1.50.0 version: 1.50.0 @@ -7318,8 +7318,16 @@ packages: /@humanwhocodes/object-schema@2.0.1: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - /@hypercerts-org/contracts@0.8.11: - resolution: {integrity: sha512-n6fwMsaoR50VITM2upR4OOi4EZJmZvU6vvXrHWCSakP9e1OeDuAOk+kHiK+egqDRYj6uKtg9VTUFKZBYvu3jRg==} + /@hypercerts-org/contracts@1.0.0(ts-node@10.9.1)(typescript@4.9.5): + resolution: {integrity: sha512-pGdG3BGDz93IZXAAHcvwzRQOMgi9dOzy2ZLdRFKIdWMBoVz8uCQL03HCYutT5DOtVm2g+j2dcor+zSV5yUM5Dg==} + dependencies: + hardhat: 2.19.1(ts-node@10.9.1)(typescript@4.9.5) + transitivePeerDependencies: + - bufferutil + - supports-color + - ts-node + - typescript + - utf-8-validate dev: false /@hypercerts-org/contracts@1.0.0(ts-node@10.9.1)(typescript@5.3.2): @@ -20380,6 +20388,74 @@ packages: - supports-color - utf-8-validate + /hardhat@2.19.1(ts-node@10.9.1)(typescript@4.9.5): + resolution: {integrity: sha512-bsWa63g1GB78ZyMN08WLhFElLPA+J+pShuKD1BFO2+88g3l+BL3R07vj9deIi9dMbssxgE714Gof1dBEDGqnCw==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-blockchain': 7.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-evm': 2.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-statemanager': 2.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + '@nomicfoundation/ethereumjs-vm': 7.0.2 + '@nomicfoundation/solidity-analyzer': 0.1.1 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.3 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + chalk: 2.4.2 + chokidar: 3.5.3 + ci-info: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 2.1.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + glob: 7.2.0 + immutable: 4.3.4 + io-ts: 1.10.4 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.2.0 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.7.3(debug@4.3.4) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + ts-node: 10.9.1(@types/node@18.18.7)(typescript@4.9.5) + tsort: 0.0.1 + typescript: 4.9.5 + undici: 5.26.5 + uuid: 8.3.2 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /hardhat@2.19.1(ts-node@10.9.1)(typescript@5.3.2): resolution: {integrity: sha512-bsWa63g1GB78ZyMN08WLhFElLPA+J+pShuKD1BFO2+88g3l+BL3R07vj9deIi9dMbssxgE714Gof1dBEDGqnCw==} hasBin: true From 13a4852a632ff2d620d6a168238a3b86ecc01a85 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Wed, 20 Dec 2023 15:24:51 +0100 Subject: [PATCH 056/118] (feat): remove redundancy from create-sentinel.ts config --- defender/src/create-sentinel.ts | 12 +++++------- defender/src/rollout.ts | 11 +++++++++-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/defender/src/create-sentinel.ts b/defender/src/create-sentinel.ts index b0f6a560..55274f0d 100644 --- a/defender/src/create-sentinel.ts +++ b/defender/src/create-sentinel.ts @@ -1,4 +1,3 @@ -import { abi } from "./HypercertMinterABI.js"; import config from "./config.js"; import { NetworkConfig } from "./networks"; import { SentinelClient } from "@openzeppelin/defender-sentinel-client"; @@ -13,19 +12,18 @@ export const createSentinel = async ({ autotaskID, functionConditions = [], eventConditions = [], - overrideContractAddress, - overrideABI, + contractAddress, + abi, }: { name: string; network: NetworkConfig; autotaskID: string; eventConditions?: EventCondition[]; functionConditions?: FunctionCondition[]; - overrideContractAddress?: string; - overrideABI?: any; + contractAddress: string; + abi: any; }) => { const client = new SentinelClient(config.credentials); - const contractAddress = overrideContractAddress || network.contractAddress; await client .create({ type: "BLOCK", @@ -33,7 +31,7 @@ export const createSentinel = async ({ confirmLevel: 1, // if not set, we pick the blockwatcher for the chosen network with the lowest offset name, addresses: [contractAddress], - abi: overrideABI || abi, + abi, paused: false, eventConditions, functionConditions, diff --git a/defender/src/rollout.ts b/defender/src/rollout.ts index 6197cf75..3139fadd 100644 --- a/defender/src/rollout.ts +++ b/defender/src/rollout.ts @@ -6,6 +6,7 @@ import { HypercertExchangeAbi, deployments, asDeployedChain, + HypercertMinterAbi, } from "@hypercerts-org/contracts"; export const rollOut = async (networks: NetworkConfig[]) => { @@ -36,6 +37,8 @@ export const rollOut = async (networks: NetworkConfig[]) => { await createSentinel({ name: encodeName(network, "minter", "AllowlistCreated"), network: network, + contractAddress: network.contractAddress, + abi: HypercertMinterAbi, eventConditions: [ { eventSignature: "AllowlistCreated(uint256,bytes32)" }, ], @@ -59,6 +62,8 @@ export const rollOut = async (networks: NetworkConfig[]) => { await createSentinel({ name: encodeName(network, "minter", "batchMintClaimsFromAllowlists"), network: network, + contractAddress: network.contractAddress, + abi: HypercertMinterAbi, autotaskID: autoTaskOnBatchMintClaimsFromAllowlists.autotaskId, functionConditions: [ { @@ -85,6 +90,8 @@ export const rollOut = async (networks: NetworkConfig[]) => { await createSentinel({ name: encodeName(network, "minter", "mintClaimFromAllowlist"), network: network, + contractAddress: network.contractAddress, + abi: HypercertMinterAbi, autotaskID: autoTaskOnMintClaimFromAllowlist.autotaskId, functionConditions: [ { @@ -112,10 +119,10 @@ export const rollOut = async (networks: NetworkConfig[]) => { name: encodeName(network, "exchange", "executeTakerBid"), network: network, autotaskID: autoTaskExecuteTakerBid.autotaskId, - overrideContractAddress: + contractAddress: deployments[asDeployedChain(network.chainId.toString())] .HypercertExchange, - overrideABI: HypercertExchangeAbi, + abi: HypercertExchangeAbi, functionConditions: [ { functionSignature: From 659fece0544c73e795419a830b7a875b5910ad2b Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 21 Dec 2023 00:12:03 +0100 Subject: [PATCH 057/118] fix(TRST-M-2): add sellLeftover boolean to hypercert fraction strategy --- .../audits/marketplace/Hypercerts_v01-1.md | 9 ++ .../StrategyHypercertCollectionOffer.sol | 7 + .../StrategyHypercertDutchAuction.sol | 2 + .../StrategyHypercertFractionOffer.sol | 93 ++++++++----- .../HypercertFractionOffers.t.sol | 128 ++++++++++++++++-- graph/tests/.latest.json | 2 +- 6 files changed, 192 insertions(+), 49 deletions(-) diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.md b/contracts/audits/marketplace/Hypercerts_v01-1.md index f25590b6..fb8a819d 100644 --- a/contracts/audits/marketplace/Hypercerts_v01-1.md +++ b/contracts/audits/marketplace/Hypercerts_v01-1.md @@ -72,6 +72,15 @@ To prevent replay attacks, the signed message consists of the following fields: The signature is used to extract the signer, compare that account to the recipient declared in the Taker Bid. Effectively, the signature can only be used to execute the order for the intended recipient on the provided Maker Ask. +### TRST-M-2 | Fraction offers can be blocked from being fully fulfilled + +The `StrategyHypercertFractionOffer.sol` strategy has been updated to allow the maker to set whether they want to sell +the leftover units. + +We find that it's expected behaviour that you can be left over with a bit of the fraction, but can understand that this +can be confusing for users. The parameter `sellLeftover` has been added to the `additionalParameters` field of the +`MakerAsk` struct. If set to `true` the strategy will sell the leftover units to the taker. + ### TRST-L-1 | The strategy validation function for fraction sales could revert Fixed. diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol index 5458669c..a6ef859b 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol @@ -47,6 +47,8 @@ contract StrategyHypercertCollectionOffer is BaseStrategy { * @notice This function validates the order under the context of the chosen strategy and * returns the fulfillable items/amounts/price/nonce invalidation status. * This strategy executes a collection offer against a taker ask order without the need of merkle proofs. + * @dev Taker ask additionalParameters: uint256 offeredItemId, uint256 itemUnitsTaker + * @dev Maker bid additionalParameters: uint256 itemUnitsMaker * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) */ @@ -86,6 +88,8 @@ contract StrategyHypercertCollectionOffer is BaseStrategy { * @notice This function validates the order under the context of the chosen strategy * and returns the fulfillable items/amounts/price/nonce invalidation status. * This strategy executes a collection offer against a taker ask order with the need of a merkle proof. + * @dev Taker ask additionalParameters: uint256 offeredItemId, uint256 itemUnitsTaker, bytes32[] proof + * @dev Maker bid additionalParameters: uint256 itemUnitsMaker, bytes32 root * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) * @dev The transaction reverts if the maker does not include a merkle root in the additionalParameters. @@ -135,6 +139,9 @@ contract StrategyHypercertCollectionOffer is BaseStrategy { * and returns the fulfillable items/amounts/price/nonce invalidation status. * This strategy executes a collection offer against a taker ask order with the need of a merkle proof * that the address is allowed to fullfil the ask. + * @dev Taker ask additionalParameters: uint256 offeredItemId, uint256 itemUnitsTaker, bytes32[] proof, bytes + * signature + * @dev Maker bid additionalParameters: uint256 itemUnitsMaker, bytes32 root * @param takerAsk Taker ask struct (taker ask-specific parameters for the execution) * @param makerBid Maker bid struct (maker bid-specific parameters for the execution) * @dev The transaction reverts if the maker does not include a merkle root in the additionalParameters. diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol index 6ac8d863..87f2f7fc 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol @@ -34,6 +34,8 @@ contract StrategyHypercertDutchAuction is BaseStrategy { * @notice This function validates the order under the context of the chosen strategy * and returns the fulfillable items/amounts/price/nonce invalidation status. * The execution price set by the seller decreases linearly within the defined period. + * @dev Taker bid additionalParameters uint256 startPrice, uint256[] memory unitsPerItem + * @dev Maker ask additionalParameters uint256 maxPrice * @param takerBid Taker bid struct (taker ask-specific parameters for the execution) * @param makerAsk Maker ask struct (maker bid-specific parameters for the execution) * @dev The client has to provide the seller's desired initial start price as the additionalParameters. diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol index c1d64223..b15fe31d 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -34,23 +34,18 @@ import {BaseStrategy, IStrategy} from "./BaseStrategy.sol"; * Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. * Bob wants to buy 10 units. * Bob can create a taker bid order with the following parameters: - * - unitAmount: 10000 // Total amount for sale; in `amounts` array - * - minUnitAmount: 100 // Minimum amount to buy; in `additionalParameters` - * - maxUnitAmount: 1000 // Maximum amount to buy; in `additionalParameters` - * - minUnitsToKeep: 5000 // Minimum amount to keep in the hypercert fraction; in `additionalParameters` - * - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - * - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - * - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] + * - unitAmount: 10000 // in `additionalParameters` + * - pricePerUnit: 10 // amount of accepted token paid; in `additionalParameters` + * - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] // proof to the root defined in the maker ask; in + * `additionalParameters` * This strategy will validate the available units and the price. * @notice This contract offers execution strategies for users to create maker bid offers for items in a collection. * There are three available functions: - * 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection - * 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for + * 1. executeHypercertFractionStrategyWithTakerBid --> it applies to all itemIds in a collection + * 2. executeHypercertFractionStrategyWithTakerBidWithAllowlist --> it allows adding merkle proof criteria for * accounts. * @notice The bidder can only bid on 1 item id at a time. - * 1. If ERC721, the amount must be 1. - * 2. If ERC1155, the amount can be greater than 1. - * 3. If Hypercert, the amount must be 1 because the fractions are NFTs. + * 1. If Hypercert, the amount must be 1 because the fractions are NFTs. * @dev Use cases can include tiered pricing; think early bird tickets. * @author LooksRare protocol team (👀,💎); bitbeckers; */ @@ -59,6 +54,9 @@ contract StrategyHypercertFractionOffer is BaseStrategy { * @notice This function validates the order under the context of the chosen strategy and * returns the fulfillable items/amounts/price/nonce invalidation status. * This strategy executes a collection offer against a taker ask order without the need of merkle proofs. + * @dev Taker bid additionalParameters uint256 unitAmount, uint256 pricePerUnit + * @dev Maker ask additionalParameters uint256 minUnitAmount, uint256 maxUnitAmount, uint256 minUnitsToKeep, + * bool sellLeftover * @param takerBid Taker ask struct (taker ask-specific parameters for the execution) * @param makerAsk Maker bid struct (maker bid-specific parameters for the execution) */ @@ -85,19 +83,29 @@ contract StrategyHypercertFractionOffer is BaseStrategy { //units, pricePerUnit (uint256 unitAmount, uint256 pricePerUnit) = abi.decode(takerBid.additionalParameters, (uint256, uint256)); - //minUnitAmount, maxUnitAmount, minUnitsToKeep, root - (uint256 minUnitAmount, uint256 maxUnitAmount, uint256 minUnitsToKeep) = - abi.decode(makerAsk.additionalParameters, (uint256, uint256, uint256)); - - // A collection order can only be executable for 1 itemId but quantity to fill can vary - if ( - minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount < minUnitAmount || unitAmount > maxUnitAmount - || pricePerUnit < makerAsk.price || makerAsk.price == 0 - || (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep - ) { - revert OrderInvalid(); + //minUnitAmount, maxUnitAmount, minUnitsToKeep, sellLeftover, root + (uint256 minUnitAmount, uint256 maxUnitAmount, uint256 minUnitsToKeep, bool sellLeftover) = + abi.decode(makerAsk.additionalParameters, (uint256, uint256, uint256, bool)); + + if (sellLeftover) { + if ( + minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount > maxUnitAmount + || pricePerUnit < makerAsk.price || makerAsk.price == 0 + || (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep + ) { + revert OrderInvalid(); + } + } else { + if ( + minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount < minUnitAmount + || unitAmount > maxUnitAmount || pricePerUnit < makerAsk.price || makerAsk.price == 0 + || (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep + ) { + revert OrderInvalid(); + } } + // A collection order can only be executable for 1 itemId but quantity to fill can vary uint256[] memory amountsToFill = new uint256[](1); amountsToFill[0] = unitAmount; amounts = amountsToFill; @@ -113,6 +121,10 @@ contract StrategyHypercertFractionOffer is BaseStrategy { * and returns the fulfillable items/amounts/price/nonce invalidation status. * This strategy executes a fraction offer against a taker bid order with the need of a merkle proof * that the address is allowed to fullfil the ask. + * @dev Taker bid additionalParameters uint256 unitAmount, uint256 pricePerUnit, bytes32[] memory + * proof + * @dev Maker ask additionalParameters uint256 minUnitAmount, uint256 maxUnitAmount, uint256 minUnitsToKeep, + * bool sellLeftover, bytes32 root * @param takerBid Taker bid struct (taker bid-specific parameters for the execution) * @param makerAsk Maker ask struct (maker ask-specific parameters for the execution) * @dev The transaction reverts if the maker does not include a merkle root in the additionalParameters. @@ -140,17 +152,27 @@ contract StrategyHypercertFractionOffer is BaseStrategy { (uint256 unitAmount, uint256 pricePerUnit, bytes32[] memory proof) = abi.decode(takerBid.additionalParameters, (uint256, uint256, bytes32[])); - //minUnitAmount, maxUnitAmount, minUnitsToKeep, root - (uint256 minUnitAmount, uint256 maxUnitAmount, uint256 minUnitsToKeep, bytes32 root) = - abi.decode(makerAsk.additionalParameters, (uint256, uint256, uint256, bytes32)); + //minUnitAmount, maxUnitAmount, minUnitsToKeep, sellLeftover, root + (uint256 minUnitAmount, uint256 maxUnitAmount, uint256 minUnitsToKeep, bool sellLeftover, bytes32 root) = + abi.decode(makerAsk.additionalParameters, (uint256, uint256, uint256, bool, bytes32)); // A collection order can only be executable for 1 itemId but quantity to fill can vary - if ( - minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount < minUnitAmount || unitAmount > maxUnitAmount - || pricePerUnit < makerAsk.price || makerAsk.price == 0 - || (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep - ) { - revert OrderInvalid(); + if (sellLeftover) { + if ( + minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount > maxUnitAmount + || pricePerUnit < makerAsk.price || makerAsk.price == 0 + || (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep + ) { + revert OrderInvalid(); + } + } else { + if ( + minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount < minUnitAmount + || unitAmount > maxUnitAmount || pricePerUnit < makerAsk.price || makerAsk.price == 0 + || (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep + ) { + revert OrderInvalid(); + } } uint256[] memory amountsToFill = new uint256[](1); @@ -208,11 +230,12 @@ contract StrategyHypercertFractionOffer is BaseStrategy { // If no root is provided or invalid length, it should be invalid. // @dev It does not mean the merkle root is valid against a specific itemId that exists in the collection. // @dev 128 is the length of the bytes32 array when the merkle root is provided together with three uint256 - // params declared in the additionalParameters (minUnits, maxUnits, minUnitsToKeep, root). + // params declared in the additionalParameters (minUnits, maxUnits, minUnitsToKeep, sellLeftover, root). Boolean + // is at least 1 byte. if ( functionSelector == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector - && makerAsk.additionalParameters.length != 128 + && makerAsk.additionalParameters.length <= 128 ) { return (isValid, OrderInvalid.selector); } @@ -220,7 +243,7 @@ contract StrategyHypercertFractionOffer is BaseStrategy { // without root if ( functionSelector == StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector - && makerAsk.additionalParameters.length != 96 + && makerAsk.additionalParameters.length <= 96 ) { return (isValid, OrderInvalid.selector); } diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol index c3203439..fbc312cb 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol @@ -50,6 +50,7 @@ contract HypercertFractionOrdersTest is ProtocolBase { uint256 private constant minUnitAmount = 1; uint256 private constant maxUnitAmount = 100; uint256 private constant minUnitsToKeep = 5000; + bool private constant sellLeftover = false; function _createMakerAskAndTakerBidHypercert(bool mint) private @@ -83,7 +84,7 @@ contract HypercertFractionOrdersTest is ProtocolBase { newMakerAsk.itemIds = itemIds; newMakerAsk.amounts = amounts; - newMakerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, minUnitsToKeep); + newMakerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, minUnitsToKeep, sellLeftover); // Using startPrice as the maxPrice bytes32[] memory proofs = new bytes32[](0); @@ -182,7 +183,7 @@ contract HypercertFractionOrdersTest is ProtocolBase { // Selling 5000 units out of 10000 (10000 - 5000 = 5000 minUnitsToKeep) at maximum of 3000 units per sale // (maxUnitAmount) - makerAsk.additionalParameters = abi.encode(minUnitAmount, 3000, 5000); + makerAsk.additionalParameters = abi.encode(minUnitAmount, 3000, 5000, sellLeftover); takerBid.additionalParameters = abi.encode(3000, price); // Sign order @@ -238,7 +239,7 @@ contract HypercertFractionOrdersTest is ProtocolBase { // Selling 2500 units out of 5000 (5000 - 2500 = 2500 minUnitsToKeep) at maximum of 2500 units per sale // (maxUnitAmount) - makerAsk.additionalParameters = abi.encode(minUnitAmount, 2500, 2500); + makerAsk.additionalParameters = abi.encode(minUnitAmount, 2500, 2500, sellLeftover); takerBid.additionalParameters = abi.encode(2000, price); // Sign order @@ -332,7 +333,7 @@ contract HypercertFractionOrdersTest is ProtocolBase { (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(true); - makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000, 0); + makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000, 0, sellLeftover); takerBid.additionalParameters = abi.encode(10_000, price); // Sign order @@ -356,7 +357,7 @@ contract HypercertFractionOrdersTest is ProtocolBase { _createMakerAskAndTakerBidHypercert(true); makerAsk.amounts[0] = 1; - makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000, 0); + makerAsk.additionalParameters = abi.encode(minUnitAmount, 10_000, 0, sellLeftover); takerBid.additionalParameters = abi.encode(3000, price); @@ -394,13 +395,92 @@ contract HypercertFractionOrdersTest is ProtocolBase { assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); } + function testTakerBidHypercertFractionOrderPartialAndFullFillSellLeftoverTrue() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.amounts[0] = 1; + makerAsk.additionalParameters = abi.encode(100, 10_000, 0, true); + + takerBid.additionalParameters = abi.encode(9901, price); + + uint256 fractionId = (1 << 128) + 1; + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction partial fill; buy 3000 units + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerBid(makerAsk, takerBid, fractionId); + + // Try to but the remaining 99 units with sellLeftover is true + takerBid.additionalParameters = abi.encode(99, price); + + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + //units, amount, currency, proof[] + (uint256 unitAmount) = abi.decode(takerBid.additionalParameters, (uint256)); + + // Taker user has received the asset + assertEq(mockHypercertMinter.ownerOf(fractionId), takerUser); + + // Units have been transfered + assertEq(mockHypercertMinter.unitsOf(fractionId), unitAmount); + + // Verify the nonce is marked as executed + assertEq(looksRareProtocol.userOrderNonce(makerUser, makerAsk.orderNonce), MAGIC_VALUE_ORDER_NONCE_EXECUTED); + } + + function testTakerBidHypercertFractionOrderPartialAndFullFillSellLeftoverFalse() public { + _setUpUsers(); + + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + makerAsk.amounts[0] = 1; + makerAsk.additionalParameters = abi.encode(100, 10_000, 0, false); + + takerBid.additionalParameters = abi.encode(9901, price); + + uint256 fractionId = (1 << 128) + 1; + + // Sign order + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + // Verify validity of maker bid order + _assertOrderIsValid(makerAsk, false); + _assertValidMakerOrder(makerAsk, signature); + + // Execute taker ask transaction partial fill; buy 3000 units + vm.prank(takerUser); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + + _assertSuccessfulTakerBid(makerAsk, takerBid, fractionId); + + // Try to but the remaining 99 units with sellLeftover is true + takerBid.additionalParameters = abi.encode(99, price); + + vm.prank(takerUser); + vm.expectRevert(OrderInvalid.selector); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + function testTakerBidHypercertFractionOrderUnitsOutOfMaxRange() public { _setUpUsers(); (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(true); - makerAsk.additionalParameters = abi.encode(minUnitAmount, 100, 0); + makerAsk.additionalParameters = abi.encode(minUnitAmount, 100, 0, sellLeftover); takerBid.additionalParameters = abi.encode(101, price); // Sign order @@ -422,7 +502,7 @@ contract HypercertFractionOrdersTest is ProtocolBase { (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(true); - makerAsk.additionalParameters = abi.encode(5, 100, 0); + makerAsk.additionalParameters = abi.encode(5, 100, 0, sellLeftover); takerBid.additionalParameters = abi.encode(2, price); // Sign order @@ -444,7 +524,7 @@ contract HypercertFractionOrdersTest is ProtocolBase { (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(true); - makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, 0); + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, 0, sellLeftover); takerBid.additionalParameters = abi.encode(maxUnitAmount, price - 1); // Sign order @@ -480,7 +560,8 @@ contract HypercertFractionOrdersTest is ProtocolBase { }); makerAsk.strategyId = 2; - makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, minUnitsToKeep, merkleRoot); + makerAsk.additionalParameters = + abi.encode(minUnitAmount, maxUnitAmount, minUnitsToKeep, sellLeftover, merkleRoot); // Sign order bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); @@ -514,7 +595,8 @@ contract HypercertFractionOrdersTest is ProtocolBase { }); makerAsk.strategyId = 2; - makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, minUnitsToKeep, merkleRoot); + makerAsk.additionalParameters = + abi.encode(minUnitAmount, maxUnitAmount, minUnitsToKeep, sellLeftover, merkleRoot); // Sign order bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); @@ -560,7 +642,7 @@ contract HypercertFractionOrdersTest is ProtocolBase { accountInMerkleTree: accountInMerkleTree }); - makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, merkleRoot); + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, sellLeftover, merkleRoot); makerAsk.amounts[0] = 0; signature = _signMakerOrder(makerAsk, makerUserPK); @@ -587,7 +669,7 @@ contract HypercertFractionOrdersTest is ProtocolBase { // 4. Amount is > 1 (with merkle proof) makerAsk.strategyId = 2; - makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, merkleRoot); + makerAsk.additionalParameters = abi.encode(minUnitAmount, maxUnitAmount, sellLeftover, merkleRoot); makerAsk.amounts[0] = 2; signature = _signMakerOrder(makerAsk, makerUserPK); @@ -601,13 +683,33 @@ contract HypercertFractionOrdersTest is ProtocolBase { looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); } - function testMerkleRootLengthIsNot200() public { + function testAdditionalParameterLengthAllowlistIsNotAbove128() public { (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = _createMakerAskAndTakerBidHypercert(true); // Set to use allowlist makerAsk.strategyId = 2; // Only encode min-max units and min units to keep + makerAsk.additionalParameters = abi.encode(1, 1, 1, sellLeftover); + + bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); + + _assertOrderIsInvalid(makerAsk, true); + _assertMakerOrderReturnValidationCode(makerAsk, signature, MAKER_ORDER_PERMANENTLY_INVALID_NON_STANDARD_SALE); + + // It should revert without data (since the root cannot be extracted since the additionalParameters length is 0) + vm.prank(takerUser); + vm.expectRevert(); + looksRareProtocol.executeTakerBid(takerBid, makerAsk, signature, _EMPTY_MERKLE_TREE); + } + + function testAdditionalParameterLengthIsNot96() public { + (OrderStructs.Maker memory makerAsk, OrderStructs.Taker memory takerBid) = + _createMakerAskAndTakerBidHypercert(true); + + // Set to use allowlist + makerAsk.strategyId = 1; + // Only encode min-max units and min units to keep makerAsk.additionalParameters = abi.encode(1, 1, 1); bytes memory signature = _signMakerOrder(makerAsk, makerUserPK); diff --git a/graph/tests/.latest.json b/graph/tests/.latest.json index 39dc3ab6..60dc70e3 100644 --- a/graph/tests/.latest.json +++ b/graph/tests/.latest.json @@ -1,4 +1,4 @@ { "version": "0.6.0", - "timestamp": 1699545675983 + "timestamp": 1703099907928 } From 0bac185174c6febd03cd610d73f090b2ecf72482 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 21 Dec 2023 00:16:42 +0100 Subject: [PATCH 058/118] fix(test): fix failing test dutch auction --- .../executionStrategies/StrategyHypercertDutchAuction.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol index 87f2f7fc..861c1d75 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol @@ -140,7 +140,7 @@ contract StrategyHypercertDutchAuction is BaseStrategy { // @dev 32 is the length of the bytes32 array when the startprice is provided together with an array of // unitsPerItem. // params declared in the additionalParameters (uint256 startPrice, uint256[] memory unitsPerItem). - if (makerAsk.additionalParameters.length != 64) { + if (makerAsk.additionalParameters.length <= 64) { return (isValid, OrderInvalid.selector); } isValid = true; From 6cbeb8d60471320e2b64fa2a894256513c3a5f9c Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 21 Dec 2023 01:22:16 +0100 Subject: [PATCH 059/118] chore(deploy): fresh sepolia deploy --- .../{unknown-11155111.json => sepolia.json} | 330 +--- contracts/package.json | 5 +- .../deployment-marketplace-hardhat.json | 1 + .../deployment-marketplace-sepolia.json | 1352 +---------------- .../executionStrategies/BaseStrategy.sol | 2 +- contracts/tasks/deploy-marketplace.ts | 507 +++---- contracts/tasks/force-import.ts | 1 - .../marketplace/LooksRareProtocol.md | 14 +- .../contracts/marketplace/TransferManager.md | 2 +- .../marketplace/TransferSelectorNFT.md | 6 - .../executionStrategies/BaseStrategy.md | 2 +- .../StrategyCollectionOffer.md | 10 +- .../StrategyDutchAuction.md | 10 +- .../StrategyHypercertCollectionOffer.md | 135 ++ .../StrategyHypercertDutchAuction.md | 91 ++ .../StrategyHypercertFractionOffer.md | 4 +- .../api/contracts/protocol/AllowlistMinter.md | 18 + .../api/contracts/protocol/HypercertMinter.md | 18 + 18 files changed, 614 insertions(+), 1894 deletions(-) rename contracts/.openzeppelin/{unknown-11155111.json => sepolia.json} (51%) create mode 100644 contracts/src/deployments/deployment-marketplace-hardhat.json create mode 100644 docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertCollectionOffer.md create mode 100644 docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertDutchAuction.md diff --git a/contracts/.openzeppelin/unknown-11155111.json b/contracts/.openzeppelin/sepolia.json similarity index 51% rename from contracts/.openzeppelin/unknown-11155111.json rename to contracts/.openzeppelin/sepolia.json index aa073377..808736e1 100644 --- a/contracts/.openzeppelin/unknown-11155111.json +++ b/contracts/.openzeppelin/sepolia.json @@ -1,21 +1,14 @@ { "manifestVersion": "3.2", "proxies": [ - { - "address": "0x2E5C3A3015a4A25819Bb2277C65df7Fe2e909CC8", - "txHash": "0x500be413be84d4feff9fbd41ff85850e210f32e8cdf61d252d13215339a3af7e", - "kind": "uups" - }, { "address": "0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941", - "txHash": "0x7c21c6f1a75c84d43c6e11adcf8135c14d17301b482c6537dbc6d439c72c354b", "kind": "uups" } ], "impls": { - "403e1a15fd253f82a1aadee7d23b6765ce0ddd74c411835cc7a84975aa512c47": { - "address": "0x1f2621d89f4F585979cB8f5505D0606474C6DaeE", - "txHash": "0x8708da6b1bd99bde93395458bd0c7042909ccf95a0aa31c4c7c876f248c023ef", + "030e0101c01e933929a2efcd3396e960802166732a863419a7ab502c6da71509": { + "address": "0xDb77A1fDC905685B4052a512522D502638DdA5E3", "layout": { "solcVersion": "0.8.17", "storage": [ @@ -154,291 +147,7 @@ "slot": "401", "type": "t_uint256", "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:18" - }, - { - "label": "owners", - "offset": 0, - "slot": "402", - "type": "t_mapping(t_uint256,t_address)", - "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:29" - }, - { - "label": "creators", - "offset": 0, - "slot": "403", - "type": "t_mapping(t_uint256,t_address)", - "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:30" - }, - { - "label": "tokenValues", - "offset": 0, - "slot": "404", - "type": "t_mapping(t_uint256,t_uint256)", - "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:32" - }, - { - "label": "maxIndex", - "offset": 0, - "slot": "405", - "type": "t_mapping(t_uint256,t_uint256)", - "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:33" - }, - { - "label": "tokenUserBalances", - "offset": 0, - "slot": "406", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", - "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:34" - }, - { - "label": "merkleRoots", - "offset": 0, - "slot": "407", - "type": "t_mapping(t_uint256,t_bytes32)", - "contract": "AllowlistMinter", - "src": "src/AllowlistMinter.sol:16" - }, - { - "label": "hasBeenClaimed", - "offset": 0, - "slot": "408", - "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))", - "contract": "AllowlistMinter", - "src": "src/AllowlistMinter.sol:17" - } - ], - "types": { - "t_address": { - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)47_storage": { - "label": "uint256[47]", - "numberOfBytes": "1504" - }, - "t_array(t_uint256)48_storage": { - "label": "uint256[48]", - "numberOfBytes": "1536" - }, - "t_array(t_uint256)49_storage": { - "label": "uint256[49]", - "numberOfBytes": "1568" - }, - "t_array(t_uint256)50_storage": { - "label": "uint256[50]", - "numberOfBytes": "1600" - }, - "t_bool": { - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_bool)": { - "label": "mapping(address => bool)", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_mapping(t_address,t_bool))": { - "label": "mapping(address => mapping(address => bool))", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_uint256)": { - "label": "mapping(address => uint256)", - "numberOfBytes": "32" - }, - "t_mapping(t_bytes32,t_bool)": { - "label": "mapping(bytes32 => bool)", - "numberOfBytes": "32" - }, - "t_mapping(t_uint256,t_address)": { - "label": "mapping(uint256 => address)", - "numberOfBytes": "32" - }, - "t_mapping(t_uint256,t_bytes32)": { - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32" - }, - "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { - "label": "mapping(uint256 => mapping(address => uint256))", - "numberOfBytes": "32" - }, - "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))": { - "label": "mapping(uint256 => mapping(bytes32 => bool))", - "numberOfBytes": "32" - }, - "t_mapping(t_uint256,t_string_storage)": { - "label": "mapping(uint256 => string)", - "numberOfBytes": "32" - }, - "t_mapping(t_uint256,t_uint256)": { - "label": "mapping(uint256 => uint256)", - "numberOfBytes": "32" - }, - "t_string_storage": { - "label": "string", - "numberOfBytes": "32" - }, - "t_uint256": { - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint8": { - "label": "uint8", - "numberOfBytes": "1" - } - } - } - }, - "31f9c6a26cf17ca4bb624cde3829d09c9a5a4a1d419afe174e7bd6d46cc5c0d9": { - "address": "0x0a0DF97bDdb36eeF95fef089A4aEb7acEaBF2101", - "txHash": "0x95e7b03bd5295f681d2b499e0c227c73f7616d822b01a2c0ece101e0be451fe5", - "layout": { - "solcVersion": "0.8.16", - "storage": [ - { - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8", - "contract": "Initializable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:62", - "retypedFrom": "bool" - }, - { - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool", - "contract": "Initializable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:67" - }, - { - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage", - "contract": "ContextUpgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36" - }, - { - "label": "__gap", - "offset": 0, - "slot": "51", - "type": "t_array(t_uint256)50_storage", - "contract": "ERC165Upgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol:41" - }, - { - "label": "_balances", - "offset": 0, - "slot": "101", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", - "contract": "ERC1155Upgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:25" - }, - { - "label": "_operatorApprovals", - "offset": 0, - "slot": "102", - "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", - "contract": "ERC1155Upgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:28" - }, - { - "label": "_uri", - "offset": 0, - "slot": "103", - "type": "t_string_storage", - "contract": "ERC1155Upgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:31" - }, - { - "label": "__gap", - "offset": 0, - "slot": "104", - "type": "t_array(t_uint256)47_storage", - "contract": "ERC1155Upgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:528" - }, - { - "label": "__gap", - "offset": 0, - "slot": "151", - "type": "t_array(t_uint256)50_storage", - "contract": "ERC1155BurnableUpgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol:52" - }, - { - "label": "_baseURI", - "offset": 0, - "slot": "201", - "type": "t_string_storage", - "contract": "ERC1155URIStorageUpgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:27" - }, - { - "label": "_tokenURIs", - "offset": 0, - "slot": "202", - "type": "t_mapping(t_uint256,t_string_storage)", - "contract": "ERC1155URIStorageUpgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:30" - }, - { - "label": "__gap", - "offset": 0, - "slot": "203", - "type": "t_array(t_uint256)48_storage", - "contract": "ERC1155URIStorageUpgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:77" - }, - { - "label": "_owner", - "offset": 0, - "slot": "251", - "type": "t_address", - "contract": "OwnableUpgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22" - }, - { - "label": "__gap", - "offset": 0, - "slot": "252", - "type": "t_array(t_uint256)49_storage", - "contract": "OwnableUpgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94" - }, - { - "label": "__gap", - "offset": 0, - "slot": "301", - "type": "t_array(t_uint256)50_storage", - "contract": "ERC1967UpgradeUpgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" - }, - { - "label": "__gap", - "offset": 0, - "slot": "351", - "type": "t_array(t_uint256)50_storage", - "contract": "UUPSUpgradeable", - "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol:107" - }, - { - "label": "typeCounter", - "offset": 0, - "slot": "401", - "type": "t_uint256", - "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:27" + "src": "src/protocol/SemiFungible1155.sol:27" }, { "label": "owners", @@ -446,7 +155,7 @@ "slot": "402", "type": "t_mapping(t_uint256,t_address)", "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:38" + "src": "src/protocol/SemiFungible1155.sol:38" }, { "label": "creators", @@ -454,7 +163,7 @@ "slot": "403", "type": "t_mapping(t_uint256,t_address)", "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:41" + "src": "src/protocol/SemiFungible1155.sol:41" }, { "label": "tokenValues", @@ -462,7 +171,7 @@ "slot": "404", "type": "t_mapping(t_uint256,t_uint256)", "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:44" + "src": "src/protocol/SemiFungible1155.sol:44" }, { "label": "maxIndex", @@ -470,7 +179,7 @@ "slot": "405", "type": "t_mapping(t_uint256,t_uint256)", "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:47" + "src": "src/protocol/SemiFungible1155.sol:47" }, { "label": "__gap", @@ -478,7 +187,7 @@ "slot": "406", "type": "t_array(t_uint256)25_storage", "contract": "SemiFungible1155", - "src": "src/SemiFungible1155.sol:432" + "src": "src/protocol/SemiFungible1155.sol:640" }, { "label": "merkleRoots", @@ -486,7 +195,7 @@ "slot": "431", "type": "t_mapping(t_uint256,t_bytes32)", "contract": "AllowlistMinter", - "src": "src/AllowlistMinter.sol:17" + "src": "src/protocol/AllowlistMinter.sol:17" }, { "label": "hasBeenClaimed", @@ -494,7 +203,7 @@ "slot": "432", "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))", "contract": "AllowlistMinter", - "src": "src/AllowlistMinter.sol:18" + "src": "src/protocol/AllowlistMinter.sol:18" }, { "label": "maxUnits", @@ -502,7 +211,7 @@ "slot": "433", "type": "t_mapping(t_uint256,t_uint256)", "contract": "AllowlistMinter", - "src": "src/AllowlistMinter.sol:19" + "src": "src/protocol/AllowlistMinter.sol:19" }, { "label": "minted", @@ -510,7 +219,7 @@ "slot": "434", "type": "t_mapping(t_uint256,t_uint256)", "contract": "AllowlistMinter", - "src": "src/AllowlistMinter.sol:20" + "src": "src/protocol/AllowlistMinter.sol:20" }, { "label": "__gap", @@ -518,7 +227,7 @@ "slot": "435", "type": "t_array(t_uint256)26_storage", "contract": "AllowlistMinter", - "src": "src/AllowlistMinter.sol:69" + "src": "src/protocol/AllowlistMinter.sol:75" }, { "label": "_paused", @@ -540,9 +249,9 @@ "label": "typeRestrictions", "offset": 0, "slot": "511", - "type": "t_mapping(t_uint256,t_enum(TransferRestrictions)6761)", + "type": "t_mapping(t_uint256,t_enum(TransferRestrictions)18919)", "contract": "HypercertMinter", - "src": "src/HypercertMinter.sol:20" + "src": "src/protocol/HypercertMinter.sol:20" }, { "label": "__gap", @@ -550,7 +259,7 @@ "slot": "512", "type": "t_array(t_uint256)29_storage", "contract": "HypercertMinter", - "src": "src/HypercertMinter.sol:228" + "src": "src/protocol/HypercertMinter.sol:258" } ], "types": { @@ -594,7 +303,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_enum(TransferRestrictions)6761": { + "t_enum(TransferRestrictions)18919": { "label": "enum IHypercertToken.TransferRestrictions", "members": [ "AllowAll", @@ -627,7 +336,7 @@ "label": "mapping(uint256 => bytes32)", "numberOfBytes": "32" }, - "t_mapping(t_uint256,t_enum(TransferRestrictions)6761)": { + "t_mapping(t_uint256,t_enum(TransferRestrictions)18919)": { "label": "mapping(uint256 => enum IHypercertToken.TransferRestrictions)", "numberOfBytes": "32" }, @@ -659,7 +368,8 @@ "label": "uint8", "numberOfBytes": "1" } - } + }, + "namespaces": {} } } } diff --git a/contracts/package.json b/contracts/package.json index 2b7597b1..4443bde7 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -93,10 +93,7 @@ "build": "pnpm clean && forge compile && hardhat compile && pnpm tsc -p tsconfig.build.json && rollup -c", "build:forge": "pnpm clean && forge build", "clean": "rimraf abi artifacts build cache cache_hardhat dist out types", - "deploy:marketplace:goerli": "forge script scripts/deployment/Deployment.s.sol:Deployment --broadcast --verify --fork-url goerli", - "deploy:marketplace:sepolia": "forge script scripts/deployment/Deployment.s.sol:Deployment --broadcast --verify --fork-url sepolia", - "deploy:marketplace:test": "pnpm deploy:marketplace:goerli && pnpm deploy:marketplace:sepolia", - "deploy:marketplace:dryrun": "forge script scripts/deployment/Deployment.s.sol:Deployment --fork-url", + "deploy:marketplace:dryrun": "pnpm hardhat deploy-marketplace", "docs": "hardhat dodoc", "lint": "pnpm lint:sol && pnpm prettier:check", "lint:sol": "forge fmt --check && solhint \"./{src,test/foundry/protocol,test/foundry/marketplace}/**/*.sol\"", diff --git a/contracts/src/deployments/deployment-marketplace-hardhat.json b/contracts/src/deployments/deployment-marketplace-hardhat.json new file mode 100644 index 00000000..836c8a44 --- /dev/null +++ b/contracts/src/deployments/deployment-marketplace-hardhat.json @@ -0,0 +1 @@ +{"TransferManager":{"address":"0xC90326503eb2f23D21e628579E4CDFCBBC3cA9d6","fullNamespace":"TransferManager","args":["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a"],"encodedArgs":"0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a","tx":"0x8733112b0fdbaf6d850abec2f87e4dd9a54a3083fadcf471304ef929a1a66d72"},"ProtocolFeeRecipient":{"address":"0xf7856Beb393E9FBDe01C1444Fec8965e671D1EFd","fullNamespace":"ProtocolFeeRecipient","args":["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a","0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6"],"encodedArgs":"0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199ab4fbf271143f4fbf7b91a5ded31805e42b2208d6","tx":"0xdd0fb084a4eacc53e3a6eb13d83f10ae2a1f6b75ff2f0c373bc5b04eb722ef93"},"HypercertExchange":{"address":"0x57D011E0faB5718e0ffCceBbD876c3CeBC05d983","fullNamespace":"LooksRareProtocol","args":["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a","0xf7856Beb393E9FBDe01C1444Fec8965e671D1EFd","0xC90326503eb2f23D21e628579E4CDFCBBC3cA9d6","0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6"],"encodedArgs":"0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199af7856beb393e9fbde01c1444fec8965e671d1efdc90326503eb2f23d21e628579e4cdfcbbc3ca9d6b4fbf271143f4fbf7b91a5ded31805e42b2208d6","tx":"0x04fc1e3849f9b236b9ad3f402b76ed6a04701a8b020e611c80c16a22ab487975"},"OrderValidator":{"address":"0xc7c884c81740a3ec1e6cbf0d1aea1991f7ddf4b8","fullNamespace":"OrderValidatorV2A","args":["0x57D011E0faB5718e0ffCceBbD876c3CeBC05d983"],"encodedArgs":"0x57d011e0fab5718e0ffccebbd876c3cebc05d983","tx":"0x2bec70d4e7a40e567c2e89df91e70d80a1a733221d1da52824f38875ff69e504"},"CreatorFeeManager":{"address":"0xc88b5d92648361373eb78ddc6c40d0e059b34340","fullNamespace":"CreatorFeeManagerWithRoyalties","args":["0x12405dB79325D06a973aD913D6e9BdA1343cD526"],"encodedArgs":"0x12405db79325d06a973ad913d6e9bda1343cd526","tx":"0xac8bb8b9211cc8c98e9a623d53507b794101862da17e9695ad491777a34a2766"},"StrategyCollectionOffer":{"address":"0x853da9e437b360f5f1a45e3f21104ab776398f67","fullNamespace":"StrategyCollectionOffer","args":[],"encodedArgs":"0x","tx":"0x2be2e0b98e02b38b2706c9468606b07fc2d667796a6707b7f849cb5740415cba"},"StrategyDutchAuction":{"address":"0x69f4c77d0f51876346067dde325ab18b49863fff","fullNamespace":"StrategyDutchAuction","args":[],"encodedArgs":"0x","tx":"0xaa52584ca20b0685a81a543f9c151983408ba1eeab8ece2fa20fc9a59d3614a9"},"StrategyItemIdsRange":{"address":"0x25370812dbe35ce2665605cf0bc206c3395180a9","fullNamespace":"StrategyItemIdsRange","args":[],"encodedArgs":"0x","tx":"0xc53a3e0065aa5fcf1cf330c994a3106d126a7c804b94dcb31403937b68d87ad2"},"StrategyHypercertCollectionOffer":{"address":"0xdfa561b7ef886c4daedfbd64f6965eb04c520aea","fullNamespace":"StrategyHypercertCollectionOffer","args":[],"encodedArgs":"0x","tx":"0x5287a47d52c56d8f26b0351c3cc5af23c8b30bd4e02c6494671f8fcf4796cb94"},"StrategyHypercertDutchAuction":{"address":"0x93b9ec7255f74ea7d048c8a1e523d2509328d623","fullNamespace":"StrategyHypercertDutchAuction","args":[],"encodedArgs":"0x","tx":"0x754e1b187c71220b3c34db4a0c316bb4f95ef6c3a631af46f5257bdc2f440935"},"StrategyHypercertFractionOffer":{"address":"0xa1f0f6feaae844115e9288c54fde5759f61dea96","fullNamespace":"StrategyHypercertFractionOffer","args":[],"encodedArgs":"0x","tx":"0xe29f637401fe413f415c8e27b8160d4d00b47153c8636a2da809cd7f0def25d9"}} \ No newline at end of file diff --git a/contracts/src/deployments/deployment-marketplace-sepolia.json b/contracts/src/deployments/deployment-marketplace-sepolia.json index 904ace20..08f4c12e 100644 --- a/contracts/src/deployments/deployment-marketplace-sepolia.json +++ b/contracts/src/deployments/deployment-marketplace-sepolia.json @@ -1,1296 +1,84 @@ { - "hypercerts-exchange": { - "address": "0x4072ABD45a95c56372eAA00059B101C95191ea2A", - "abi": [ - { - "inputs": [ - { "internalType": "address", "name": "_owner", "type": "address" }, - { "internalType": "address", "name": "_protocolFeeRecipient", "type": "address" }, - { "internalType": "address", "name": "_transferManager", "type": "address" }, - { "internalType": "address", "name": "_weth", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { "inputs": [], "name": "CallerInvalid", "type": "error" }, - { "inputs": [], "name": "ChainIdInvalid", "type": "error" }, - { "inputs": [], "name": "CreatorFeeBpTooHigh", "type": "error" }, - { "inputs": [], "name": "CurrencyInvalid", "type": "error" }, - { "inputs": [], "name": "ERC20TransferFromFail", "type": "error" }, - { "inputs": [], "name": "LengthsInvalid", "type": "error" }, - { "inputs": [], "name": "MerkleProofInvalid", "type": "error" }, - { - "inputs": [{ "internalType": "uint256", "name": "length", "type": "uint256" }], - "name": "MerkleProofTooLarge", - "type": "error" - }, - { "inputs": [], "name": "NewGasLimitETHTransferTooLow", "type": "error" }, - { "inputs": [], "name": "NewProtocolFeeRecipientCannotBeNullAddress", "type": "error" }, - { "inputs": [], "name": "NoOngoingTransferInProgress", "type": "error" }, - { "inputs": [], "name": "NoSelectorForStrategy", "type": "error" }, - { "inputs": [], "name": "NoncesInvalid", "type": "error" }, - { "inputs": [], "name": "NotAContract", "type": "error" }, - { "inputs": [], "name": "NotOwner", "type": "error" }, - { "inputs": [], "name": "NotV2Strategy", "type": "error" }, - { "inputs": [], "name": "NullSignerAddress", "type": "error" }, - { "inputs": [], "name": "OutsideOfTimeRange", "type": "error" }, - { "inputs": [], "name": "QuoteTypeInvalid", "type": "error" }, - { "inputs": [], "name": "ReentrancyFail", "type": "error" }, - { "inputs": [], "name": "RenouncementNotInProgress", "type": "error" }, - { "inputs": [], "name": "SameDomainSeparator", "type": "error" }, - { "inputs": [], "name": "SignatureEOAInvalid", "type": "error" }, - { "inputs": [], "name": "SignatureERC1271Invalid", "type": "error" }, - { - "inputs": [{ "internalType": "uint256", "name": "length", "type": "uint256" }], - "name": "SignatureLengthInvalid", - "type": "error" - }, - { "inputs": [], "name": "SignatureParameterSInvalid", "type": "error" }, - { - "inputs": [{ "internalType": "uint8", "name": "v", "type": "uint8" }], - "name": "SignatureParameterVInvalid", - "type": "error" - }, - { "inputs": [], "name": "StrategyHasNoSelector", "type": "error" }, - { - "inputs": [{ "internalType": "uint256", "name": "strategyId", "type": "uint256" }], - "name": "StrategyNotAvailable", - "type": "error" - }, - { "inputs": [], "name": "StrategyNotUsed", "type": "error" }, - { "inputs": [], "name": "StrategyProtocolFeeTooHigh", "type": "error" }, - { "inputs": [], "name": "TransferAlreadyInProgress", "type": "error" }, - { "inputs": [], "name": "TransferNotInProgress", "type": "error" }, - { "inputs": [], "name": "UnsupportedCollectionType", "type": "error" }, - { "inputs": [], "name": "WrongPotentialOwner", "type": "error" }, - { "anonymous": false, "inputs": [], "name": "CancelOwnershipTransfer", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, - { "indexed": false, "internalType": "bool", "name": "isAllowed", "type": "bool" } - ], - "name": "CurrencyStatusUpdated", - "type": "event" - }, - { "anonymous": false, "inputs": [], "name": "InitiateOwnershipRenouncement", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "potentialOwner", "type": "address" } - ], - "name": "InitiateOwnershipTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "bidNonce", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "askNonce", "type": "uint256" } - ], - "name": "NewBidAskNonces", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "creatorFeeManager", "type": "address" }], - "name": "NewCreatorFeeManager", - "type": "event" - }, - { "anonymous": false, "inputs": [], "name": "NewDomainSeparator", "type": "event" }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "gasLimitETHTransfer", "type": "uint256" }], - "name": "NewGasLimitETHTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "maxCreatorFeeBp", "type": "uint256" }], - "name": "NewMaxCreatorFeeBp", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "NewOwner", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "protocolFeeRecipient", "type": "address" }], - "name": "NewProtocolFeeRecipient", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "indexed": false, "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, - { "indexed": false, "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, - { "indexed": false, "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, - { "indexed": false, "internalType": "bytes4", "name": "selector", "type": "bytes4" }, - { "indexed": false, "internalType": "bool", "name": "isMakerBid", "type": "bool" }, - { "indexed": false, "internalType": "address", "name": "implementation", "type": "address" } - ], - "name": "NewStrategy", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "uint256[]", "name": "orderNonces", "type": "uint256[]" } - ], - "name": "OrderNoncesCancelled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "indexed": false, "internalType": "bool", "name": "isActive", "type": "bool" }, - { "indexed": false, "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, - { "indexed": false, "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" } - ], - "name": "StrategyUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "uint256[]", "name": "subsetNonces", "type": "uint256[]" } - ], - "name": "SubsetNoncesCancelled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "components": [ - { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } - ], - "indexed": false, - "internalType": "struct ILooksRareProtocol.NonceInvalidationParameters", - "name": "nonceInvalidationParameters", - "type": "tuple" - }, - { "indexed": false, "internalType": "address", "name": "askUser", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "bidUser", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "collection", "type": "address" }, - { "indexed": false, "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "indexed": false, "internalType": "address[2]", "name": "feeRecipients", "type": "address[2]" }, - { "indexed": false, "internalType": "uint256[3]", "name": "feeAmounts", "type": "uint256[3]" } - ], - "name": "TakerAsk", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "components": [ - { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } - ], - "indexed": false, - "internalType": "struct ILooksRareProtocol.NonceInvalidationParameters", - "name": "nonceInvalidationParameters", - "type": "tuple" - }, - { "indexed": false, "internalType": "address", "name": "bidUser", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "bidRecipient", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "indexed": false, "internalType": "address", "name": "currency", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "collection", "type": "address" }, - { "indexed": false, "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "indexed": false, "internalType": "address[2]", "name": "feeRecipients", "type": "address[2]" }, - { "indexed": false, "internalType": "uint256[3]", "name": "feeAmounts", "type": "uint256[3]" } - ], - "name": "TakerBid", - "type": "event" - }, - { - "inputs": [], - "name": "MAGIC_VALUE_ORDER_NONCE_EXECUTED", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "WETH", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, - { "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, - { "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, - { "internalType": "bytes4", "name": "selector", "type": "bytes4" }, - { "internalType": "bool", "name": "isMakerBid", "type": "bool" }, - { "internalType": "address", "name": "implementation", "type": "address" } - ], - "name": "addStrategy", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256[]", "name": "orderNonces", "type": "uint256[]" }], - "name": "cancelOrderNonces", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "cancelOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256[]", "name": "subsetNonces", "type": "uint256[]" }], - "name": "cancelSubsetNonces", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "chainId", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "confirmOwnershipRenouncement", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "confirmOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "creatorFeeManager", - "outputs": [{ "internalType": "contract ICreatorFeeManager", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "domainSeparator", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker[]", - "name": "takerBids", - "type": "tuple[]" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker[]", - "name": "makerAsks", - "type": "tuple[]" - }, - { "internalType": "bytes[]", "name": "makerSignatures", "type": "bytes[]" }, - { - "components": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { - "components": [ - { "internalType": "bytes32", "name": "value", "type": "bytes32" }, - { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } - ], - "internalType": "struct OrderStructs.MerkleTreeNode[]", - "name": "proof", - "type": "tuple[]" - } - ], - "internalType": "struct OrderStructs.MerkleTree[]", - "name": "merkleTrees", - "type": "tuple[]" - }, - { "internalType": "bool", "name": "isAtomic", "type": "bool" } - ], - "name": "executeMultipleTakerBids", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker", - "name": "takerAsk", - "type": "tuple" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerBid", - "type": "tuple" - }, - { "internalType": "bytes", "name": "makerSignature", "type": "bytes" }, - { - "components": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { - "components": [ - { "internalType": "bytes32", "name": "value", "type": "bytes32" }, - { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } - ], - "internalType": "struct OrderStructs.MerkleTreeNode[]", - "name": "proof", - "type": "tuple[]" - } - ], - "internalType": "struct OrderStructs.MerkleTree", - "name": "merkleTree", - "type": "tuple" - } - ], - "name": "executeTakerAsk", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker", - "name": "takerBid", - "type": "tuple" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerAsk", - "type": "tuple" - }, - { "internalType": "bytes", "name": "makerSignature", "type": "bytes" }, - { - "components": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { - "components": [ - { "internalType": "bytes32", "name": "value", "type": "bytes32" }, - { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } - ], - "internalType": "struct OrderStructs.MerkleTreeNode[]", - "name": "proof", - "type": "tuple[]" - } - ], - "internalType": "struct OrderStructs.MerkleTree", - "name": "merkleTree", - "type": "tuple" - } - ], - "name": "executeTakerBid", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { "internalType": "uint256", "name": "proofLength", "type": "uint256" } - ], - "name": "hashBatchOrder", - "outputs": [{ "internalType": "bytes32", "name": "batchOrderHash", "type": "bytes32" }], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bool", "name": "bid", "type": "bool" }, - { "internalType": "bool", "name": "ask", "type": "bool" } - ], - "name": "incrementBidAskNonces", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "initiateOwnershipRenouncement", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newPotentialOwner", "type": "address" }], - "name": "initiateOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "isCurrencyAllowed", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxCreatorFeeBp", - "outputs": [{ "internalType": "uint16", "name": "", "type": "uint16" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ownershipStatus", - "outputs": [{ "internalType": "enum IOwnableTwoSteps.Status", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "potentialOwner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "protocolFeeRecipient", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker", - "name": "takerBid", - "type": "tuple" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerAsk", - "type": "tuple" - }, - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" } - ], - "name": "restrictedExecuteTakerBid", - "outputs": [{ "internalType": "uint256", "name": "protocolFeeAmount", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "strategyInfo", - "outputs": [ - { "internalType": "bool", "name": "isActive", "type": "bool" }, - { "internalType": "uint16", "name": "standardProtocolFeeBp", "type": "uint16" }, - { "internalType": "uint16", "name": "minTotalFeeBp", "type": "uint16" }, - { "internalType": "uint16", "name": "maxProtocolFeeBp", "type": "uint16" }, - { "internalType": "bytes4", "name": "selector", "type": "bytes4" }, - { "internalType": "bool", "name": "isMakerBid", "type": "bool" }, - { "internalType": "address", "name": "implementation", "type": "address" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "transferManager", - "outputs": [{ "internalType": "contract TransferManager", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newCreatorFeeManager", "type": "address" }], - "name": "updateCreatorFeeManager", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "bool", "name": "isAllowed", "type": "bool" } - ], - "name": "updateCurrencyStatus", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "updateDomainSeparator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "newGasLimitETHTransfer", "type": "uint256" }], - "name": "updateETHGasLimitForTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint16", "name": "newMaxCreatorFeeBp", "type": "uint16" }], - "name": "updateMaxCreatorFeeBp", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newProtocolFeeRecipient", "type": "address" }], - "name": "updateProtocolFeeRecipient", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "bool", "name": "isActive", "type": "bool" }, - { "internalType": "uint16", "name": "newStandardProtocolFee", "type": "uint16" }, - { "internalType": "uint16", "name": "newMinTotalFee", "type": "uint16" } - ], - "name": "updateStrategy", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "userBidAskNonces", - "outputs": [ - { "internalType": "uint256", "name": "bidNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "askNonce", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "name": "userOrderNonce", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "name": "userSubsetNonce", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - } - ], + "TransferManager": { + "address": "0x02BFF2Aa8C9a733cFc41BcC02773bf8D1E1425f8", + "fullNamespace": "TransferManager", + "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a"], + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", + "tx": "0xd45d3bfe9929031f96053b014242209446ab6d27112f2d3e9b84315a730a5406" + }, + "ProtocolFeeRecipient": { + "address": "0x58737b0281A094550f6048E84E332dF3ba8Ea609", + "fullNamespace": "ProtocolFeeRecipient", + "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6"], + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199ab4fbf271143f4fbf7b91a5ded31805e42b2208d6", + "tx": "0x648fa64938c43a2550961cbe775816e27c9362a7683a7641fa7766b249d568f1" + }, + "HypercertExchange": { + "address": "0x2d7C5512bC3BBE1A12FB9EC1F8CD7Ab0C99E6de5", "fullNamespace": "LooksRareProtocol", "args": [ "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", - "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", - "0x7AAC4C1407f5F83256581eCc913dC8b20F7bdab1", + "0x58737b0281A094550f6048E84E332dF3ba8Ea609", + "0x02BFF2Aa8C9a733cFc41BcC02773bf8D1E1425f8", "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6" ], - "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199adf2c3dace6f31e650fd03b8ff72bee82cb1c199a7aac4c1407f5f83256581ecc913dc8b20f7bdab1b4fbf271143f4fbf7b91a5ded31805e42b2208d6", - "tx": "0xaf695468ed6ad7ce6cdf04fb553e658dc268f45dea036119e636b272bf2db9ce" + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a58737b0281a094550f6048e84e332df3ba8ea60902bff2aa8c9a733cfc41bcc02773bf8d1e1425f8b4fbf271143f4fbf7b91a5ded31805e42b2208d6", + "tx": "0xaacd3ea603a117e7ceb25e9b9501d795b696f6568e7b6b968d28f10dd247c98a" }, - "transfer-manager": { - "address": "0x7AAC4C1407f5F83256581eCc913dC8b20F7bdab1", - "abi": [ - { - "inputs": [{ "internalType": "address", "name": "_owner", "type": "address" }], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { "inputs": [], "name": "AmountInvalid", "type": "error" }, - { "inputs": [], "name": "ERC1155SafeBatchTransferFromFail", "type": "error" }, - { "inputs": [], "name": "ERC1155SafeTransferFromFail", "type": "error" }, - { "inputs": [], "name": "ERC721TransferFromFail", "type": "error" }, - { "inputs": [], "name": "LengthsInvalid", "type": "error" }, - { "inputs": [], "name": "NoOngoingTransferInProgress", "type": "error" }, - { "inputs": [], "name": "NotAContract", "type": "error" }, - { "inputs": [], "name": "NotOwner", "type": "error" }, - { "inputs": [], "name": "OperatorAlreadyAllowed", "type": "error" }, - { "inputs": [], "name": "OperatorAlreadyApprovedByUser", "type": "error" }, - { "inputs": [], "name": "OperatorNotAllowed", "type": "error" }, - { "inputs": [], "name": "OperatorNotApprovedByUser", "type": "error" }, - { "inputs": [], "name": "RenouncementNotInProgress", "type": "error" }, - { "inputs": [], "name": "TransferAlreadyInProgress", "type": "error" }, - { "inputs": [], "name": "TransferCallerInvalid", "type": "error" }, - { "inputs": [], "name": "TransferNotInProgress", "type": "error" }, - { "inputs": [], "name": "WrongPotentialOwner", "type": "error" }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "address[]", "name": "operators", "type": "address[]" } - ], - "name": "ApprovalsGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "address[]", "name": "operators", "type": "address[]" } - ], - "name": "ApprovalsRemoved", - "type": "event" - }, - { "anonymous": false, "inputs": [], "name": "CancelOwnershipTransfer", "type": "event" }, - { "anonymous": false, "inputs": [], "name": "InitiateOwnershipRenouncement", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "potentialOwner", "type": "address" } - ], - "name": "InitiateOwnershipTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "NewOwner", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "operator", "type": "address" }], - "name": "OperatorAllowed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "operator", "type": "address" }], - "name": "OperatorRemoved", - "type": "event" - }, - { - "inputs": [{ "internalType": "address", "name": "operator", "type": "address" }], - "name": "allowOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "cancelOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "confirmOwnershipRenouncement", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "confirmOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address[]", "name": "operators", "type": "address[]" }], - "name": "grantApprovals", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "address", "name": "", "type": "address" } - ], - "name": "hasUserApprovedOperator", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "initiateOwnershipRenouncement", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newPotentialOwner", "type": "address" }], - "name": "initiateOwnershipTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "isOperatorAllowed", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ownershipStatus", - "outputs": [{ "internalType": "enum IOwnableTwoSteps.Status", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "potentialOwner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "operator", "type": "address" }], - "name": "removeOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address[]", "name": "operators", "type": "address[]" }], - "name": "revokeApprovals", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } - ], - "internalType": "struct ITransferManager.BatchTransferItem[]", - "name": "items", - "type": "tuple[]" - }, - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" } - ], - "name": "transferBatchItemsAcrossCollections", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } - ], - "name": "transferItemsERC1155", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } - ], - "name": "transferItemsERC721", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } - ], - "name": "transferItemsHyperboard", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } - ], - "name": "transferItemsHypercert", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "fullNamespace": "TransferManager", - "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a"], - "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", - "tx": "0xdd3e6cf435bd446c9d53d74968396e82560443ca9629c4c2cfd521e389a85f1e" - }, - "order-validator": { - "address": "0x11cf91a633b292e90afc1dd063db9ce0b94a89ae", - "abi": [ - { - "inputs": [{ "internalType": "address", "name": "_looksRareProtocol", "type": "address" }], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "CRITERIA_GROUPS", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ERC1155_INTERFACE_ID", - "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ERC721_INTERFACE_ID_1", - "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ERC721_INTERFACE_ID_2", - "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAGIC_VALUE_ORDER_NONCE_EXECUTED", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerOrder", - "type": "tuple" - }, - { "internalType": "bytes", "name": "signature", "type": "bytes" }, - { - "components": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { - "components": [ - { "internalType": "bytes32", "name": "value", "type": "bytes32" }, - { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } - ], - "internalType": "struct OrderStructs.MerkleTreeNode[]", - "name": "proof", - "type": "tuple[]" - } - ], - "internalType": "struct OrderStructs.MerkleTree", - "name": "merkleTree", - "type": "tuple" - } - ], - "name": "checkMakerOrderValidity", - "outputs": [{ "internalType": "uint256[9]", "name": "validationCodes", "type": "uint256[9]" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker[]", - "name": "makerOrders", - "type": "tuple[]" - }, - { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }, - { - "components": [ - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { - "components": [ - { "internalType": "bytes32", "name": "value", "type": "bytes32" }, - { "internalType": "enum OrderStructs.MerkleTreeNodePosition", "name": "position", "type": "uint8" } - ], - "internalType": "struct OrderStructs.MerkleTreeNode[]", - "name": "proof", - "type": "tuple[]" - } - ], - "internalType": "struct OrderStructs.MerkleTree[]", - "name": "merkleTrees", - "type": "tuple[]" - } - ], - "name": "checkMultipleMakerOrderValidities", - "outputs": [{ "internalType": "uint256[9][]", "name": "validationCodes", "type": "uint256[9][]" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "creatorFeeManager", - "outputs": [{ "internalType": "contract ICreatorFeeManager", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "deriveProtocolParameters", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "domainSeparator", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "looksRareProtocol", - "outputs": [{ "internalType": "contract LooksRareProtocol", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxCreatorFeeBp", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "transferManager", - "outputs": [{ "internalType": "contract TransferManager", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - } - ], + "OrderValidator": { + "address": "0xf689c1f8475102efdee73ed359fc039e385f3786", "fullNamespace": "OrderValidatorV2A", - "args": ["0x4072ABD45a95c56372eAA00059B101C95191ea2A"], - "encodedArgs": "0x4072abd45a95c56372eaa00059b101c95191ea2a", - "tx": "0xebbaed0b616b5e4acce94c7de515f99722fec238e7cb3d2a6b6e6c102e9606b3" + "args": ["0x2d7C5512bC3BBE1A12FB9EC1F8CD7Ab0C99E6de5"], + "encodedArgs": "0x2d7c5512bc3bbe1a12fb9ec1f8cd7ab0c99e6de5", + "tx": "0xd997ae4c388cd2f62e6cf51cd5f38fe6d7401ecefe1cf7dfbd06b43993579c2a" }, - "strategy-collection-offer": { - "address": "0x478b6d99efa2689649762a4b4e2590872184078f", - "abi": [ - { "inputs": [], "name": "MerkleProofInvalid", "type": "error" }, - { "inputs": [], "name": "OrderInvalid", "type": "error" }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker", - "name": "takerAsk", - "type": "tuple" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerBid", - "type": "tuple" - } - ], - "name": "executeCollectionStrategyWithTakerAsk", - "outputs": [ - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Taker", - "name": "takerAsk", - "type": "tuple" - }, - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerBid", - "type": "tuple" - } - ], - "name": "executeCollectionStrategyWithTakerAskWithProof", - "outputs": [ - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bool", "name": "isNonceInvalidated", "type": "bool" } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "isLooksRareV2Strategy", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "enum QuoteType", "name": "quoteType", "type": "uint8" }, - { "internalType": "uint256", "name": "globalNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "subsetNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "orderNonce", "type": "uint256" }, - { "internalType": "uint256", "name": "strategyId", "type": "uint256" }, - { "internalType": "enum CollectionType", "name": "collectionType", "type": "uint8" }, - { "internalType": "address", "name": "collection", "type": "address" }, - { "internalType": "address", "name": "currency", "type": "address" }, - { "internalType": "address", "name": "signer", "type": "address" }, - { "internalType": "uint256", "name": "startTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endTime", "type": "uint256" }, - { "internalType": "uint256", "name": "price", "type": "uint256" }, - { "internalType": "uint256[]", "name": "itemIds", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "additionalParameters", "type": "bytes" } - ], - "internalType": "struct OrderStructs.Maker", - "name": "makerBid", - "type": "tuple" - }, - { "internalType": "bytes4", "name": "functionSelector", "type": "bytes4" } - ], - "name": "isMakerOrderValid", - "outputs": [ - { "internalType": "bool", "name": "isValid", "type": "bool" }, - { "internalType": "bytes4", "name": "errorSelector", "type": "bytes4" } - ], - "stateMutability": "pure", - "type": "function" - } - ], + "CreatorFeeManager": { + "address": "0x27dcab314d7145a7a93addcab4e006c28071454c", + "fullNamespace": "CreatorFeeManagerWithRoyalties", + "args": ["0x12405dB79325D06a973aD913D6e9BdA1343cD526"], + "encodedArgs": "0x12405db79325d06a973ad913d6e9bda1343cd526", + "tx": "0x2ecf9a12a2cfaa50fade45aa99878e797b865bcdacd652d6e130d9b435634cc7" + }, + "StrategyCollectionOffer": { + "address": "0x1b64fc6b1d7ec3533fd8085a50fa8c30748650ff", "fullNamespace": "StrategyCollectionOffer", "args": [], "encodedArgs": "0x", - "tx": "0xbd5e6bbb524df8747ef58974f6dd68f5ad41db59183d1849e6b9b588d777eefa" + "tx": "0x18b8e6af7063b825113c14ef9577dd87f0533609873512e91d07272628e176de" + }, + "StrategyDutchAuction": { + "address": "0xff15b1de4921e8832f688f9660c97454ea448a16", + "fullNamespace": "StrategyDutchAuction", + "args": [], + "encodedArgs": "0x", + "tx": "0xd7339188d8368e1e6d90311b68448b106d0958985e86d9983c265556605cda69" + }, + "StrategyItemIdsRange": { + "address": "0xf55a35d866e7e05e9f115dbd91e1e80d744713f0", + "fullNamespace": "StrategyItemIdsRange", + "args": [], + "encodedArgs": "0x", + "tx": "0x67eeb224a84918f029ecc486c1f4d47d73755d855f8cb12cfad819c9e01faf68" + }, + "StrategyHypercertCollectionOffer": { + "address": "0xe2d5d9e473cc1e39e5139feb80fbdd8ee4a73ae2", + "fullNamespace": "StrategyHypercertCollectionOffer", + "args": [], + "encodedArgs": "0x", + "tx": "0xac17c63ffc2061fca3b1fbd31de6aafa9bbbac96566ef2875bcad3db4e89f0af" + }, + "StrategyHypercertDutchAuction": { + "address": "0x9f0223dfea44f03727f399b5c08c49c269b7e8d3", + "fullNamespace": "StrategyHypercertDutchAuction", + "args": [], + "encodedArgs": "0x", + "tx": "0x51196676e32878214d5c85c306d8c0a62ecd5bf7fe369a2b9b5a716a6a24d652" + }, + "StrategyHypercertFractionOffer": { + "address": "0xe6638876f4bf911d1ae52ec0770d070286712861", + "fullNamespace": "StrategyHypercertFractionOffer", + "args": [], + "encodedArgs": "0x", + "tx": "0x14702738cfe788270e38e404f9b046e7b5c4a9705852a30b9c25020462810437" } } diff --git a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol index c8450ae9..69f02ff7 100644 --- a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol +++ b/contracts/src/marketplace/executionStrategies/BaseStrategy.sol @@ -15,7 +15,7 @@ import {CollectionType} from "../enums/CollectionType.sol"; /** * @title BaseStrategy - * @author LooksRare protocol team (👀,💎) + * @author LooksRare protocol team (👀,💎); bitbeckers */ abstract contract BaseStrategy is IStrategy { /** diff --git a/contracts/tasks/deploy-marketplace.ts b/contracts/tasks/deploy-marketplace.ts index 2e75931b..cf1bfe77 100644 --- a/contracts/tasks/deploy-marketplace.ts +++ b/contracts/tasks/deploy-marketplace.ts @@ -1,15 +1,63 @@ import { task } from "hardhat/config"; import { solidityPacked } from "ethers"; -import { getContractAddress, slice, encodeDeployData, getContract, WalletClient, encodePacked } from "viem"; +import { + getContractAddress, + slice, + encodeDeployData, + getContract, + WalletClient, + encodePacked, + PublicClient, +} from "viem"; import { writeFile } from "node:fs/promises"; import creatorFeeManagerContract from "../out/CreatorFeeManagerWithRoyalties.sol/CreatorFeeManagerWithRoyalties.json"; import exchangeContract from "../out/LooksRareProtocol.sol/LooksRareProtocol.json"; import transferManagerContract from "../out/TransferManager.sol/TransferManager.json"; import orderValidatorContract from "../out/OrderValidatorV2A.sol/OrderValidatorV2A.json"; import strategyCollectionOfferContract from "../out/StrategyCollectionOffer.sol/StrategyCollectionOffer.json"; +import strategyDutchAuctionContract from "../out/StrategyDutchAuction.sol/StrategyDutchAuction.json"; +import strategyItemIdsRangeContract from "../out/StrategyItemIdsRange.sol/StrategyItemIdsRange.json"; +import strategyHypercertCollectionOfferContract from "../out/StrategyHypercertCollectionOffer.sol/StrategyHypercertCollectionOffer.json"; +import strategyHypercertDutchAuctionContract from "../out/StrategyHypercertDutchAuction.sol/StrategyHypercertDutchAuction.json"; import strategyHypercertFractionOfferContract from "../out/StrategyHypercertFractionOffer.sol/StrategyHypercertFractionOffer.json"; import protocolFeeRecipientContract from "../out/ProtocolFeeRecipient.sol/ProtocolFeeRecipient.json"; +const strategies = [ + { + contract: strategyCollectionOfferContract, + name: "StrategyCollectionOffer", + strategies: [ + "executeCollectionStrategyWithTakerAsk", + "executeCollectionStrategyWithTakerAskWithProof", + "executeCollectionStrategyWithTakerAskWithAllowlist", + ], + }, + { contract: strategyDutchAuctionContract, name: "StrategyDutchAuction", strategies: ["executeStrategyWithTakerBid"] }, + { contract: strategyItemIdsRangeContract, name: "StrategyItemIdsRange", strategies: ["executeStrategyWithTakerAsk"] }, + { + contract: strategyHypercertCollectionOfferContract, + name: "StrategyHypercertCollectionOffer", + strategies: [ + "executeHypercertCollectionStrategyWithTakerAsk", + "executeHypercertCollectionStrategyWithTakerAskWithProof", + "executeHypercertCollectionStrategyWithTakerAskWithAllowlist", + ], + }, + { + contract: strategyHypercertDutchAuctionContract, + name: "StrategyHypercertDutchAuction", + strategies: ["executeStrategyWithTakerBid"], + }, + { + contract: strategyHypercertFractionOfferContract, + name: "StrategyHypercertFractionOffer", + strategies: [ + "executeHypercertFractionStrategyWithTakerBid", + "executeHypercertFractionStrategyWithTakerBidWithAllowlist", + ], + }, +]; + const getCreate2Address = async ( deployer: WalletClient, factory: `0x${string}`, @@ -29,6 +77,42 @@ const getCreate2Address = async ( return { address, salt, deployData: bytecode }; }; +const runCreate2Deployment = async ( + publicClient: PublicClient, + create2Instance: ReturnType, + contractName: string, + create2: { + address: `0x${string}`; + salt: `0x${string}`; + deployData: `0x${string}`; + }, + args: string[], +) => { + console.log(`deploying ${contractName} with args: ${args}`); + const hash = await create2Instance.write.safeCreate2([create2.salt, create2.deployData]); + const deployTx = await publicClient.waitForTransactionReceipt({ + hash, + }); + + console.log( + deployTx.status === "success" ? `Deployed ${contractName} successfully` : `Failed to deploy ${contractName}`, + ); + + return hash; +}; + +interface ContractDeployment { + address: string; + fullNamespace: string; + args: string[]; + encodedArgs: string; + tx: `0x${string}`; +} + +type ContractDeployments = { + [name: string]: ContractDeployment; +}; + task("deploy-marketplace", "Deploy marketplace contracts and verify") .addOptionalParam("output", "write the details of the deployment to this file if this is set") .setAction(async ({ output }, hre) => { @@ -50,7 +134,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") const _minTotalFeeBp = 50; const _maxProtocolFeeBp = 200; - const releaseCounter = "h"; + const releaseCounter = "i"; const salt = slice( encodePacked(["address", "string", "address"], [deployer.account?.address, releaseCounter, create2Address]), @@ -59,6 +143,8 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") ); console.log("Calculated salt: ", salt); + const contracts: ContractDeployments = {}; + // Create2 Transfermanager const transferManagerArgs = [deployer.account.address]; const transferManagerCreate2 = await getCreate2Address( @@ -118,73 +204,66 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") const orderValidatorArgs = [hypercertsExchangeCreate2.address]; - const strategyCollectionOfferCreate2 = await getCreate2Address( - deployer, - create2Address, - encodeDeployData({ - abi: strategyCollectionOfferContract.abi, - bytecode: strategyCollectionOfferContract.bytecode.object as `0x${string}`, - args: [], - }), - salt, - ); - console.log("Calculated exchange address using CREATE2: ", hypercertsExchangeCreate2.address); console.log("Calculated transferManager address using CREATE2: ", transferManagerCreate2.address); console.log("Calculated protocolFeeRecipient address using CREATE2: ", protocolFeeRecipientCreate2.address); - console.log("Calculated strategyCollectionOffer address using CREATE2: ", strategyCollectionOfferCreate2.address); // Deploy transferManager - console.log("Deploying TransferManager..."); - const transferManagerCreation = await create2Instance.write.safeCreate2([salt, transferManagerCreate2.deployData]); - const transferManagerTx = await publicClient.waitForTransactionReceipt({ - hash: transferManagerCreation, - }); - - console.log( - transferManagerTx.status === "success" - ? "Deployed TransferManager successfully" - : "Failed to deploy TransferManager", + const transferManagerTx = await runCreate2Deployment( + publicClient, + create2Instance, + "TransferManager", + transferManagerCreate2, + transferManagerArgs, ); - // // Transfer 1 wei to hypercertsExchange + contracts.TransferManager = { + address: transferManagerCreate2.address, + fullNamespace: "TransferManager", + args: transferManagerArgs, + encodedArgs: solidityPacked(["address"], transferManagerArgs), + tx: transferManagerTx, + }; + + // Transfer 1 wei to hypercertsExchange await deployer.sendTransaction({ to: hypercertsExchangeCreate2.address, value: 1n, }); // Deploy ProtocolFeeRecipient - console.log("Deploying ProtocolFeeRecipient..."); - const protocolFeeRecipientCreation = await create2Instance.write.safeCreate2([ - salt, - protocolFeeRecipientCreate2.deployData, - ]); - - const protocolFeeRecipientTx = await publicClient.waitForTransactionReceipt({ - hash: protocolFeeRecipientCreation, - }); - - console.log( - protocolFeeRecipientTx.status === "success" - ? "Deployed ProtocolFeeRecipient successfully" - : "Failed to deploy ProtocolFeeRecipient", + const protocolFeeRecipientTx = await runCreate2Deployment( + publicClient, + create2Instance, + "ProtocolFeeRecipient", + protocolFeeRecipientCreate2, + protocolFeeRecipientArgs, ); - // Deploy HypercertsExchange - console.log("Deploying HypercertsExchange..."); - const hypercertsExchange = await create2Instance.write.safeCreate2([salt, hypercertsExchangeCreate2.deployData]); - const hypercertsExchangeTx = await publicClient.waitForTransactionReceipt({ - hash: hypercertsExchange, - }); + contracts.ProtocolFeeRecipient = { + address: protocolFeeRecipientCreate2.address, + fullNamespace: "ProtocolFeeRecipient", + args: protocolFeeRecipientArgs, + encodedArgs: solidityPacked(["address", "address"], protocolFeeRecipientArgs), + tx: protocolFeeRecipientTx, + }; - console.log( - hypercertsExchangeTx.status === "success" - ? "Deployed HypercertsExchange successfully" - : "Failed to deploy HypercertsExchange", + // Deploy HypercertsExchange + const hypercertsExchangeTx = await runCreate2Deployment( + publicClient, + create2Instance, + "HypercertExchange", + hypercertsExchangeCreate2, + hypercertsExchangeArgs, ); - // Parse logs to get the address of the deployed HypercertsExchange - console.log("Deploying HypercertsExchange... done!"); + contracts.HypercertExchange = { + address: hypercertsExchangeCreate2.address, + fullNamespace: "LooksRareProtocol", + args: hypercertsExchangeArgs, + encodedArgs: solidityPacked(["address", "address", "address", "address"], hypercertsExchangeArgs), + tx: hypercertsExchangeTx, + }; // Allow Exchange as operator on transferManager const transferManagerInstance = getContract({ @@ -194,6 +273,33 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") walletClient: deployer, }); + // Deploy OrderValidator + + const deployOrderValidator = await deployer.deployContract({ + abi: orderValidatorContract.abi, + account: deployer.account, + args: orderValidatorArgs, + bytecode: orderValidatorContract.bytecode.object as `0x${string}`, + }); + + const orderValidatorTx = await publicClient.waitForTransactionReceipt({ + hash: deployOrderValidator, + }); + + console.log( + orderValidatorTx.status === "success" + ? "Deployed OrderValidator successfully" + : "Failed to deploy OrderValidator", + ); + + contracts.OrderValidator = { + address: orderValidatorTx.contractAddress, + fullNamespace: "OrderValidatorV2A", + args: orderValidatorArgs, + encodedArgs: solidityPacked(["address"], orderValidatorArgs), + tx: orderValidatorTx.transactionHash, + }; + // Deploy CreatorFeeManager const deployCreatorFeeManager = await deployer.deployContract({ abi: creatorFeeManagerContract.abi, @@ -212,6 +318,14 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") : "Failed to deploy CreatorFeeManager", ); + contracts.CreatorFeeManager = { + address: creatorFeeManagerTx.contractAddress, + fullNamespace: "CreatorFeeManagerWithRoyalties", + args: ["0x12405dB79325D06a973aD913D6e9BdA1343cD526"], + encodedArgs: solidityPacked(["address"], ["0x12405dB79325D06a973aD913D6e9BdA1343cD526"]), + tx: creatorFeeManagerTx.transactionHash, + }; + await transferManagerInstance.write.allowOperator([hypercertsExchangeCreate2.address]); const hypercertsExchangeInstance = getContract({ @@ -226,11 +340,6 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") console.log("TransferManager address: ", transferManager); // read deriveProtocolParams from HypercertsExchange - // - // domainSeparator = looksRareProtocol.domainSeparator(); - // creatorFeeManager = looksRareProtocol.creatorFeeManager(); - // maxCreatorFeeBp = looksRareProtocol.maxCreatorFeeBp(); - const domainSeparator = await hypercertsExchangeInstance.read.domainSeparator(); console.log("domainSeparator: ", domainSeparator); @@ -249,12 +358,24 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") hash: updateCurrencyStatusEth, }); + console.log( + updateCurrencyStatusEthTx.status === "success" + ? "Updated currency status for ETH successfully" + : "Failed to update currency status for ETH", + ); + // Update currencyStatus address(weth) to true const updateCurrencyStatusTxWeth = await hypercertsExchangeInstance.write.updateCurrencyStatus([wethAddress, true]); const updateCurrencyStatusTxWethTx = await publicClient.waitForTransactionReceipt({ hash: updateCurrencyStatusTxWeth, }); + console.log( + updateCurrencyStatusTxWethTx.status === "success" + ? "Updated currency status for WETH successfully" + : "Failed to update currency status for WETH", + ); + // Update creatorFeeManager address const updateCreatorFeeManager = await hypercertsExchangeInstance.write.updateCreatorFeeManager([ creatorFeeManagerTx.contractAddress, @@ -270,235 +391,65 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") : "Failed to update creatorFeeManager", ); - console.log( - updateCurrencyStatusEthTx.status === "success" - ? "Updated currency status for ETH successfully" - : "Failed to update currency status for ETH", - ); - - console.log( - updateCurrencyStatusTxWethTx.status === "success" - ? "Updated currency status for WETH successfully" - : "Failed to update currency status for WETH", - ); - - // Deploy OrderValidator - - const deployOrderValidator = await deployer.deployContract({ - abi: orderValidatorContract.abi, - account: deployer.account, - args: orderValidatorArgs, - bytecode: orderValidatorContract.bytecode.object as `0x${string}`, - }); - - const orderValidatorTx = await publicClient.waitForTransactionReceipt({ - hash: deployOrderValidator, - }); - - console.log( - orderValidatorTx.status === "success" - ? "Deployed OrderValidator successfully" - : "Failed to deploy OrderValidator", - ); - // DEPLOYING STRATEGIES console.log("Deploying and adding strategies...."); - // Deploy strategyCollectionOffer - - const deployStrategyCollectionOffer = await deployer.deployContract({ - abi: strategyCollectionOfferContract.abi, - account: deployer.account, - args: [], - bytecode: strategyCollectionOfferContract.bytecode.object as `0x${string}`, - }); - - const strategyCollectionOfferTx = await publicClient.waitForTransactionReceipt({ - hash: deployStrategyCollectionOffer, - }); - - console.log( - strategyCollectionOfferTx.status === "success" - ? "Deployed StrategyCollectionOffer successfully" - : "Failed to deploy StrategyCollectionOffer", - ); - - // Add executeCollectionStrategyWithTakerAsk strategy to HypercertsExchange - - const strategyCollectionOfferFactory = await ethers.getContractFactory("StrategyCollectionOffer"); - - const addStratTakerAsk = await hypercertsExchangeInstance.write.addStrategy([ - _standardProtocolFeeBP, - _minTotalFeeBp, - _maxProtocolFeeBp, - strategyCollectionOfferFactory.interface.getFunction("executeCollectionStrategyWithTakerAsk")?.selector, - true, - strategyCollectionOfferTx.contractAddress, - ]); - - console.log("Adding strategy CollectionWithTakerAsk [strategyId 1] to exchange..."); - const addStratTakerAskTx = await publicClient.waitForTransactionReceipt({ - hash: addStratTakerAsk, - }); - - console.log( - addStratTakerAskTx.status === "success" - ? "Added strategy executeCollectionStrategyWithTakerAsk to exchange successfully" - : "Failed to add strategy executeCollectionStrategyWithTakerAsk to exchange", - ); - - // Add executeCollectionStrategyWithTakerAskWithProof strategy to HypercertsExchange - - const addStratTakerAskProof = await hypercertsExchangeInstance.write.addStrategy([ - _standardProtocolFeeBP, - _minTotalFeeBp, - _maxProtocolFeeBp, - strategyCollectionOfferFactory.interface.getFunction("executeCollectionStrategyWithTakerAskWithProof")?.selector, - true, - strategyCollectionOfferTx.contractAddress, - ]); - - console.log("Adding strategy CollectionWithTakerAskWithProof [strategyId 2] to exchange..."); - const addStratTakerAskProofTx = await publicClient.waitForTransactionReceipt({ - hash: addStratTakerAskProof, - }); - - console.log( - addStratTakerAskProofTx.status === "success" - ? "Added strategy executeCollectionStrategyWithTakerAskWithProof to exchange successfully" - : "Failed to add strategy executeCollectionStrategyWithTakerAskWithProof to exchange", - ); - - // Deploy strategyHypercertFractionOffer - - const deployStrategyHypercertFractionOffer = await deployer.deployContract({ - abi: strategyHypercertFractionOfferContract.abi, - account: deployer.account, - args: [], - bytecode: strategyHypercertFractionOfferContract.bytecode.object as `0x${string}`, - }); - - const strategyHypercertFractionOfferTx = await publicClient.waitForTransactionReceipt({ - hash: deployStrategyHypercertFractionOffer, - }); - - console.log( - strategyHypercertFractionOfferTx.status === "success" - ? "Deployed StrategyHypercertOffer successfully" - : "Failed to deploy StrategyHypercertOffer", - ); - - // Add executeHypercertFractionStrategyWithTakerBid strategy to HypercertsExchange - - const strategyHypercertFractionOfferFactory = await ethers.getContractFactory("StrategyHypercertFractionOffer"); - - const addHypercertFractionStrategyWithTakerBid = await hypercertsExchangeInstance.write.addStrategy([ - _standardProtocolFeeBP, - _minTotalFeeBp, - _maxProtocolFeeBp, - strategyHypercertFractionOfferFactory.interface.getFunction("executeHypercertFractionStrategyWithTakerBid") - ?.selector, - true, - strategyHypercertFractionOfferTx.contractAddress, - ]); - - console.log("Adding strategy HypercertFraction to exchange..."); - const addHypercertFractionStrategyWithTakerBidTx = await publicClient.waitForTransactionReceipt({ - hash: addHypercertFractionStrategyWithTakerBid, - }); - - console.log( - addHypercertFractionStrategyWithTakerBidTx.status === "success" - ? "Added strategy executeHypercertFractionStrategyWithTakerBid to exchange successfully" - : "Failed to add strategy executeHypercertFractionStrategyWithTakerBid to exchange", - ); - - // Add executeHypercertFractionStrategyWithTakerBidWithAllowlist strategy to HypercertsExchange - - const addHypercertFractionStrategyWithTakerBidWithAllowlist = await hypercertsExchangeInstance.write.addStrategy([ - _standardProtocolFeeBP, - _minTotalFeeBp, - _maxProtocolFeeBp, - strategyHypercertFractionOfferFactory.interface.getFunction( - "executeHypercertFractionStrategyWithTakerBidWithAllowlist", - )?.selector, - true, - strategyHypercertFractionOfferTx.contractAddress, - ]); - - console.log("Adding strategy HypercertFraction WithAllowlist to exchange..."); - const addHypercertFractionStrategyWithTakerBidWithAllowlistTx = await publicClient.waitForTransactionReceipt({ - hash: addHypercertFractionStrategyWithTakerBidWithAllowlist, - }); - - console.log( - addHypercertFractionStrategyWithTakerBidWithAllowlistTx.status === "success" - ? "Added strategy executeHypercertFractionStrategyWithTakerBidWithAllowlist to exchange successfully" - : "Failed to add strategy executeHypercertFractionStrategyWithTakerBidWithAllowlist to exchange", - ); - - console.log("🚀 Done!"); - - interface ContractDeployment { - address: string; - fullNamespace: string; - args: string[]; - encodedArgs: string; - tx: `0x${string}`; - } - - type ContractDeployments = { - [name: string]: ContractDeployment; - }; - - const contracts: ContractDeployments = { - HypercertExchange: { - address: hypercertsExchangeCreate2.address, - fullNamespace: "LooksRareProtocol", - args: hypercertsExchangeArgs, - encodedArgs: solidityPacked(["address", "address", "address", "address"], hypercertsExchangeArgs), - tx: hypercertsExchangeTx.transactionHash, - }, - ProtocolFeeRecipient: { - address: protocolFeeRecipientCreate2.address, - fullNamespace: "ProtocolFeeRecipient", - args: [deployer.account.address, wethAddress], - encodedArgs: solidityPacked(["address", "address"], [deployer.account.address, wethAddress]), - tx: protocolFeeRecipientTx.transactionHash, - }, - TransferManager: { - address: transferManagerCreate2.address, - fullNamespace: "TransferManager", - args: transferManagerArgs, - encodedArgs: solidityPacked(["address"], transferManagerArgs), - tx: transferManagerTx.transactionHash, - }, - OrderValidator: { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - address: orderValidatorTx.contractAddress!, - fullNamespace: "OrderValidatorV2A", - args: orderValidatorArgs, - encodedArgs: solidityPacked(["address"], orderValidatorArgs), - tx: orderValidatorTx.transactionHash, - }, - StrategyCollectionOffer: { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - address: strategyCollectionOfferTx.contractAddress!, - fullNamespace: "StrategyCollectionOffer", + for (const strategy of strategies) { + // Deploy strategy + const deployStrategy = await deployer.deployContract({ + abi: strategy.contract.abi, + account: deployer.account, args: [], - encodedArgs: solidityPacked([], []), - tx: strategyCollectionOfferTx.transactionHash, - }, - StrategyHypercertFractionOffer: { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - address: strategyHypercertFractionOfferTx.contractAddress!, - fullNamespace: "StrategyCollectionOffer", + bytecode: strategy.contract.bytecode.object as `0x${string}`, + }); + + const strategyTx = await publicClient.waitForTransactionReceipt({ + hash: deployStrategy, + }); + + console.log( + strategyTx.status === "success" + ? `Deployed ${strategy.name} successfully` + : `Failed to deploy ${strategy.name}`, + ); + + // Add strategies to HypercertsExchange + + const strategyFactory = await ethers.getContractFactory(strategy.name); + + for (const strat of strategy.strategies) { + const addStrat = await hypercertsExchangeInstance.write.addStrategy([ + _standardProtocolFeeBP, + _minTotalFeeBp, + _maxProtocolFeeBp, + strategyFactory.interface.getFunction(strat)?.selector, + true, + strategyTx.contractAddress, + ]); + + console.log(`Adding strategy ${strat} to exchange...`); + const addStratTx = await publicClient.waitForTransactionReceipt({ + hash: addStrat, + }); + + console.log( + addStratTx.status === "success" + ? `Added strategy ${strat} to exchange successfully` + : `Failed to add ${strat}`, + ); + } + + contracts[strategy.name] = { + address: strategyTx.contractAddress, + fullNamespace: strategy.name, args: [], encodedArgs: solidityPacked([], []), - tx: strategyHypercertFractionOfferTx.transactionHash, - }, - }; + tx: strategyTx.transactionHash, + }; + } + + console.log("🚀 Done!"); await writeFile(`src/deployments/deployment-marketplace-${network.name}.json`, JSON.stringify(contracts), "utf-8"); if (network.name !== "hardhat" && network.name !== "localhost") { diff --git a/contracts/tasks/force-import.ts b/contracts/tasks/force-import.ts index 7bc07f10..9c919855 100644 --- a/contracts/tasks/force-import.ts +++ b/contracts/tasks/force-import.ts @@ -7,6 +7,5 @@ task("force-import", "Deploy contracts and verify") const hypercertMinter = await upgrades.forceImport(proxy, HypercertMinter, { kind: "uups", }); - await hypercertMinter.deployed(); console.log(`HypercertMinter imported: ${hypercertMinter.address}`); }); diff --git a/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md index cc542c7e..69e09e0d 100644 --- a/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md +++ b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -862,6 +862,14 @@ error ChainIdInvalid() It is returned if the domain separator should change. +### CollectionTypeInvalid + +```solidity +error CollectionTypeInvalid() +``` + +It is returned is the collection type is not supported. For instance if the strategy is specific to hypercerts. + ### CreatorFeeBpTooHigh ```solidity @@ -1142,12 +1150,6 @@ error TransferNotInProgress() This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. -### UnsupportedCollectionType - -```solidity -error UnsupportedCollectionType() -``` - ### WrongPotentialOwner ```solidity diff --git a/docs/docs/developer/api/contracts/marketplace/TransferManager.md b/docs/docs/developer/api/contracts/marketplace/TransferManager.md index c6766114..f042e290 100644 --- a/docs/docs/developer/api/contracts/marketplace/TransferManager.md +++ b/docs/docs/developer/api/contracts/marketplace/TransferManager.md @@ -412,7 +412,7 @@ It is emitted if an operator is removed from the global allowlist. error AmountInvalid() ``` -It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. +It is returned if the amount is invalid. For ERC721 and Hypercert, any number that is not 1. For ERC1155, if amount is 0. ### ERC1155SafeBatchTransferFromFail diff --git a/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md b/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md index 9011bd50..168bab88 100644 --- a/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md +++ b/docs/docs/developer/api/contracts/marketplace/TransferSelectorNFT.md @@ -764,12 +764,6 @@ error TransferNotInProgress() This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. -### UnsupportedCollectionType - -```solidity -error UnsupportedCollectionType() -``` - ### WrongPotentialOwner ```solidity diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md index 37866658..6767c2c2 100644 --- a/docs/docs/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md @@ -1,6 +1,6 @@ # BaseStrategy -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers_ > BaseStrategy diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md index ddec4495..cecc9324 100644 --- a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md @@ -4,7 +4,7 @@ _LooksRare protocol team (👀,💎); bitbeckers_ > StrategyCollectionOffer -This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount must be 1 (fractions are NFTs) +This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. ## Methods @@ -110,6 +110,14 @@ function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) ## Errors +### CollectionTypeInvalid + +```solidity +error CollectionTypeInvalid() +``` + +It is returned is the collection type is not supported. For instance if the strategy is specific to hypercerts. + ### MerkleProofInvalid ```solidity diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md index 1227878d..65fd5b25 100644 --- a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md @@ -1,6 +1,6 @@ # StrategyDutchAuction -_LooksRare protocol team (👀,💎)_ +_LooksRare protocol team (👀,💎); bitbeckers_ > StrategyDutchAuction @@ -74,6 +74,14 @@ error BidTooLow() It is returned if the bid price is too low for the ask user. +### CollectionTypeInvalid + +```solidity +error CollectionTypeInvalid() +``` + +It is returned is the collection type is not supported. For instance if the strategy is specific to hypercerts. + ### OrderInvalid ```solidity diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertCollectionOffer.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertCollectionOffer.md new file mode 100644 index 00000000..17b10115 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertCollectionOffer.md @@ -0,0 +1,135 @@ +# StrategyHypercertCollectionOffer + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> StrategyHypercertCollectionOffer + +This contract offers execution strategies for users to create maker bid offers for items in a collection. There are two available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithProof --> it allows adding merkle proof criteria for tokenIds. 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. The amount must be 1. 2. The units held at bid creation and ask execution time must be the same. 3. The units held by the item sold must be the same as the units held by the item bid. + +## Methods + +### executeHypercertCollectionStrategyWithTakerAsk + +```solidity +function executeHypercertCollectionStrategyWithTakerAsk(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeHypercertCollectionStrategyWithTakerAskWithAllowlist + +```solidity +function executeHypercertCollectionStrategyWithTakerAskWithAllowlist(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### executeHypercertCollectionStrategyWithTakerAskWithProof + +```solidity +function executeHypercertCollectionStrategyWithTakerAskWithProof(OrderStructs.Taker takerAsk, OrderStructs.Maker makerBid) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerAsk | OrderStructs.Taker | undefined | +| makerBid | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerBid, bytes4 functionSelector) external pure returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerBid | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### CollectionTypeInvalid + +```solidity +error CollectionTypeInvalid() +``` + +It is returned is the collection type is not supported. For instance if the strategy is specific to hypercerts. + +### MerkleProofInvalid + +```solidity +error MerkleProofInvalid() +``` + +It is returned if the merkle proof provided is invalid. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertDutchAuction.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertDutchAuction.md new file mode 100644 index 00000000..a1c37e73 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertDutchAuction.md @@ -0,0 +1,91 @@ +# StrategyHypercertDutchAuction + +_LooksRare protocol team (👀,💎); bitbeckers_ + +> StrategyHypercertDutchAuction + +This contract offers a single execution strategy for users to create Dutch auctions for hypercerts. + +## Methods + +### executeStrategyWithTakerBid + +```solidity +function executeStrategyWithTakerBid(OrderStructs.Taker takerBid, OrderStructs.Maker makerAsk) external view returns (uint256 price, uint256[] itemIds, uint256[] amounts, bool isNonceInvalidated) +``` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------------ | ----------- | +| takerBid | OrderStructs.Taker | undefined | +| makerAsk | OrderStructs.Maker | undefined | + +#### Returns + +| Name | Type | Description | +| ------------------ | --------- | ----------- | +| price | uint256 | undefined | +| itemIds | uint256[] | undefined | +| amounts | uint256[] | undefined | +| isNonceInvalidated | bool | undefined | + +### isLooksRareV2Strategy + +```solidity +function isLooksRareV2Strategy() external pure returns (bool) +``` + +This function acts as a safety check for the protocol's owner when adding new execution strategies. + +#### Returns + +| Name | Type | Description | +| ---- | ---- | ---------------------------------------------- | +| \_0 | bool | Whether it is a LooksRare V2 protocol strategy | + +### isMakerOrderValid + +```solidity +function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) external view returns (bool isValid, bytes4 errorSelector) +``` + +#### Parameters + +| Name | Type | Description | +| ---------------- | ------------------ | ----------- | +| makerAsk | OrderStructs.Maker | undefined | +| functionSelector | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +| ------------- | ------ | ----------- | +| isValid | bool | undefined | +| errorSelector | bytes4 | undefined | + +## Errors + +### BidTooLow + +```solidity +error BidTooLow() +``` + +It is returned if the bid price is too low for the ask user. + +### CollectionTypeInvalid + +```solidity +error CollectionTypeInvalid() +``` + +It is returned is the collection type is not supported. For instance if the strategy is specific to hypercerts. + +### OrderInvalid + +```solidity +error OrderInvalid() +``` + +It is returned if the order is permanently invalid. There may be an issue with the order formatting. diff --git a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md index daa427e4..30b21a56 100644 --- a/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md +++ b/docs/docs/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md @@ -4,7 +4,7 @@ _LooksRare protocol team (👀,💎); bitbeckers;_ > StrategyHypercertFractionOffer -This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10 - acceptedTokenAmount: 1000000000000000 (0.001 ETH in wei) - acceptedTokenAddress: 0x0000000000000000000000000000000000000000 - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeCollectionStrategyWithTakerAsk --> it applies to all itemIds in a collection 2. executeCollectionStrategyWithTakerAskWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If ERC721, the amount must be 1. 2. If ERC1155, the amount can be greater than 1. 3. If Hypercert, the amount can be greater than 1 because they represent units held by the hypercert. +This contract offers a single execution strategy for users to bid on a specific amount of units in an hypercerts that's for sale. Example: Alice has 100 units of a hypercert (id: 42) for sale at a minimum price of 0.001 ETH/unit. Bob wants to buy 10 units. Bob can create a taker bid order with the following parameters: - unitAmount: 10000 // in `additionalParameters` - pricePerUnit: 10 // amount of accepted token paid; in `additionalParameters` - proof: [0xsdadfa....s9fds,0xdasdas...asff8e] // proof to the root defined in the maker ask; in `additionalParameters` This strategy will validate the available units and the price.This contract offers execution strategies for users to create maker bid offers for items in a collection. There are three available functions: 1. executeHypercertFractionStrategyWithTakerBid --> it applies to all itemIds in a collection 2. executeHypercertFractionStrategyWithTakerBidWithAllowlist --> it allows adding merkle proof criteria for accounts.The bidder can only bid on 1 item id at a time. 1. If Hypercert, the amount must be 1 because the fractions are NFTs. _Use cases can include tiered pricing; think early bird tickets._ @@ -96,7 +96,7 @@ function isMakerOrderValid(OrderStructs.Maker makerAsk, bytes4 functionSelector) error AmountInvalid() ``` -It is returned if the amount is invalid. For ERC721, any number that is not 1. For ERC1155 and Hypercert, if amount is 0. +It is returned if the amount is invalid. For ERC721 and Hypercert, any number that is not 1. For ERC1155, if amount is 0. ### LengthsInvalid diff --git a/docs/docs/developer/api/contracts/protocol/AllowlistMinter.md b/docs/docs/developer/api/contracts/protocol/AllowlistMinter.md index 4684053c..ed412b6b 100644 --- a/docs/docs/developer/api/contracts/protocol/AllowlistMinter.md +++ b/docs/docs/developer/api/contracts/protocol/AllowlistMinter.md @@ -8,6 +8,24 @@ This interface declares the required functionality for a hypercert tokenThis int ## Methods +### getMinted + +```solidity +function getMinted(uint256 claimID) external view returns (uint256 mintedUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| claimID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| mintedUnits | uint256 | undefined | + ### hasBeenClaimed ```solidity diff --git a/docs/docs/developer/api/contracts/protocol/HypercertMinter.md b/docs/docs/developer/api/contracts/protocol/HypercertMinter.md index 518efa42..b2780935 100644 --- a/docs/docs/developer/api/contracts/protocol/HypercertMinter.md +++ b/docs/docs/developer/api/contracts/protocol/HypercertMinter.md @@ -169,6 +169,24 @@ _Calls SemiFungible1155 to store the claim referenced in `uri` with amount of `u | \_uri | string | undefined | | restrictions | enum IHypercertToken.TransferRestrictions | undefined | +### getMinted + +```solidity +function getMinted(uint256 claimID) external view returns (uint256 mintedUnits) +``` + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ----------- | +| claimID | uint256 | undefined | + +#### Returns + +| Name | Type | Description | +| ----------- | ------- | ----------- | +| mintedUnits | uint256 | undefined | + ### hasBeenClaimed ```solidity From 898b5bf1be6884790f4f1feb5ebbee4fb76fb4dc Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 21 Dec 2023 01:25:29 +0100 Subject: [PATCH 060/118] fix(report): update finding status --- contracts/audits/marketplace/Hypercerts_v01-1.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.md b/contracts/audits/marketplace/Hypercerts_v01-1.md index fb8a819d..b6e4d2d9 100644 --- a/contracts/audits/marketplace/Hypercerts_v01-1.md +++ b/contracts/audits/marketplace/Hypercerts_v01-1.md @@ -6,10 +6,10 @@ | High | TRST-H-2 | The fraction offer maker order is not invalidated correctly, leading to orders being replayed | Review | | High | TRST-H-3 | When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected | Review | | Medium | TRST-M-1 | An attacker could grief buyer into getting a lower-value item than intended | Review | -| Medium | TRST-M-2 | Fraction offers can be blocked from being fully fulfilled | tbd | +| Medium | TRST-M-2 | Fraction offers can be blocked from being fully fulfilled | Review | | Low | TRST-L-1 | The strategy validation function for fraction sales could revert | Review | | Low | TRST-L-2 | Hypercert orders with invalid amount will pass validations | Review | -| Recommendations | TRST-R-1 | Improve validation of orders in fraction offers | WIP | +| Recommendations | TRST-R-1 | Improve validation of orders in fraction offers | Review | | Systemic Risk | TRST-SR-1 | Risks associated with hypercerts | OK | | | TRST-OOS | Allowlist tracking | WIP | From 112740343db976e165a7b23d5119e1a22199a903 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 21 Dec 2023 14:07:04 +0100 Subject: [PATCH 061/118] fix(allowlist): rollout celo and propose op --- contracts/.openzeppelin/celo.json | 366 ++++++++++++++++++ .../{unknown-10.json => optimism.json} | 366 ++++++++++++++++++ contracts/tasks/upgrade.ts | 2 +- 3 files changed, 733 insertions(+), 1 deletion(-) rename contracts/.openzeppelin/{unknown-10.json => optimism.json} (66%) diff --git a/contracts/.openzeppelin/celo.json b/contracts/.openzeppelin/celo.json index 2d9a5c85..1ce42cd6 100644 --- a/contracts/.openzeppelin/celo.json +++ b/contracts/.openzeppelin/celo.json @@ -373,6 +373,372 @@ }, "namespaces": {} } + }, + "030e0101c01e933929a2efcd3396e960802166732a863419a7ab502c6da71509": { + "address": "0x17B58b38B1347BF950c31755d86245A3B890e6bD", + "txHash": "0x01e9c2664d3d3a5f7d763d2c69b7dbce658590aa539e2bbfedb7a1081d6e680f", + "layout": { + "solcVersion": "0.8.17", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_balances", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:25" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:28" + }, + { + "label": "_uri", + "offset": 0, + "slot": "103", + "type": "t_string_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "104", + "type": "t_array(t_uint256)47_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:528" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1155BurnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol:52" + }, + { + "label": "_baseURI", + "offset": 0, + "slot": "201", + "type": "t_string_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:27" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "202", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:30" + }, + { + "label": "__gap", + "offset": 0, + "slot": "203", + "type": "t_array(t_uint256)48_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:77" + }, + { + "label": "_owner", + "offset": 0, + "slot": "251", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "351", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "typeCounter", + "offset": 0, + "slot": "401", + "type": "t_uint256", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:27" + }, + { + "label": "owners", + "offset": 0, + "slot": "402", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:38" + }, + { + "label": "creators", + "offset": 0, + "slot": "403", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:41" + }, + { + "label": "tokenValues", + "offset": 0, + "slot": "404", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:44" + }, + { + "label": "maxIndex", + "offset": 0, + "slot": "405", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:47" + }, + { + "label": "__gap", + "offset": 0, + "slot": "406", + "type": "t_array(t_uint256)25_storage", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:640" + }, + { + "label": "merkleRoots", + "offset": 0, + "slot": "431", + "type": "t_mapping(t_uint256,t_bytes32)", + "contract": "AllowlistMinter", + "src": "src/protocol/AllowlistMinter.sol:17" + }, + { + "label": "hasBeenClaimed", + "offset": 0, + "slot": "432", + "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))", + "contract": "AllowlistMinter", + "src": "src/protocol/AllowlistMinter.sol:18" + }, + { + "label": "maxUnits", + "offset": 0, + "slot": "433", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/protocol/AllowlistMinter.sol:19" + }, + { + "label": "minted", + "offset": 0, + "slot": "434", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/protocol/AllowlistMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "435", + "type": "t_array(t_uint256)26_storage", + "contract": "AllowlistMinter", + "src": "src/protocol/AllowlistMinter.sol:75" + }, + { + "label": "_paused", + "offset": 0, + "slot": "461", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "462", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:116" + }, + { + "label": "typeRestrictions", + "offset": 0, + "slot": "511", + "type": "t_mapping(t_uint256,t_enum(TransferRestrictions)18919)", + "contract": "HypercertMinter", + "src": "src/protocol/HypercertMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "512", + "type": "t_array(t_uint256)29_storage", + "contract": "HypercertMinter", + "src": "src/protocol/HypercertMinter.sol:258" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)25_storage": { + "label": "uint256[25]", + "numberOfBytes": "800" + }, + "t_array(t_uint256)26_storage": { + "label": "uint256[26]", + "numberOfBytes": "832" + }, + "t_array(t_uint256)29_storage": { + "label": "uint256[29]", + "numberOfBytes": "928" + }, + "t_array(t_uint256)47_storage": { + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_enum(TransferRestrictions)18919": { + "label": "enum IHypercertToken.TransferRestrictions", + "members": [ + "AllowAll", + "DisallowAll", + "FromCreatorOnly" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bytes32)": { + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_enum(TransferRestrictions)18919)": { + "label": "mapping(uint256 => enum IHypercertToken.TransferRestrictions)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))": { + "label": "mapping(uint256 => mapping(bytes32 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/contracts/.openzeppelin/unknown-10.json b/contracts/.openzeppelin/optimism.json similarity index 66% rename from contracts/.openzeppelin/unknown-10.json rename to contracts/.openzeppelin/optimism.json index 11c44802..61def59e 100644 --- a/contracts/.openzeppelin/unknown-10.json +++ b/contracts/.openzeppelin/optimism.json @@ -735,6 +735,372 @@ } } } + }, + "030e0101c01e933929a2efcd3396e960802166732a863419a7ab502c6da71509": { + "address": "0xc695a9f30131C3566f5E7A577Cf39Ad7F305eD55", + "txHash": "0x11b92b34289c6926fd9673c234cb75c9cea9ee1b1c8462ab60745f0061c19ef5", + "layout": { + "solcVersion": "0.8.17", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_balances", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:25" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:28" + }, + { + "label": "_uri", + "offset": 0, + "slot": "103", + "type": "t_string_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "104", + "type": "t_array(t_uint256)47_storage", + "contract": "ERC1155Upgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol:528" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1155BurnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol:52" + }, + { + "label": "_baseURI", + "offset": 0, + "slot": "201", + "type": "t_string_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:27" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "202", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:30" + }, + { + "label": "__gap", + "offset": 0, + "slot": "203", + "type": "t_array(t_uint256)48_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:77" + }, + { + "label": "_owner", + "offset": 0, + "slot": "251", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "351", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "typeCounter", + "offset": 0, + "slot": "401", + "type": "t_uint256", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:27" + }, + { + "label": "owners", + "offset": 0, + "slot": "402", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:38" + }, + { + "label": "creators", + "offset": 0, + "slot": "403", + "type": "t_mapping(t_uint256,t_address)", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:41" + }, + { + "label": "tokenValues", + "offset": 0, + "slot": "404", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:44" + }, + { + "label": "maxIndex", + "offset": 0, + "slot": "405", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:47" + }, + { + "label": "__gap", + "offset": 0, + "slot": "406", + "type": "t_array(t_uint256)25_storage", + "contract": "SemiFungible1155", + "src": "src/protocol/SemiFungible1155.sol:640" + }, + { + "label": "merkleRoots", + "offset": 0, + "slot": "431", + "type": "t_mapping(t_uint256,t_bytes32)", + "contract": "AllowlistMinter", + "src": "src/protocol/AllowlistMinter.sol:17" + }, + { + "label": "hasBeenClaimed", + "offset": 0, + "slot": "432", + "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))", + "contract": "AllowlistMinter", + "src": "src/protocol/AllowlistMinter.sol:18" + }, + { + "label": "maxUnits", + "offset": 0, + "slot": "433", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/protocol/AllowlistMinter.sol:19" + }, + { + "label": "minted", + "offset": 0, + "slot": "434", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "AllowlistMinter", + "src": "src/protocol/AllowlistMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "435", + "type": "t_array(t_uint256)26_storage", + "contract": "AllowlistMinter", + "src": "src/protocol/AllowlistMinter.sol:75" + }, + { + "label": "_paused", + "offset": 0, + "slot": "461", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "462", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol:116" + }, + { + "label": "typeRestrictions", + "offset": 0, + "slot": "511", + "type": "t_mapping(t_uint256,t_enum(TransferRestrictions)18919)", + "contract": "HypercertMinter", + "src": "src/protocol/HypercertMinter.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "512", + "type": "t_array(t_uint256)29_storage", + "contract": "HypercertMinter", + "src": "src/protocol/HypercertMinter.sol:258" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)25_storage": { + "label": "uint256[25]", + "numberOfBytes": "800" + }, + "t_array(t_uint256)26_storage": { + "label": "uint256[26]", + "numberOfBytes": "832" + }, + "t_array(t_uint256)29_storage": { + "label": "uint256[29]", + "numberOfBytes": "928" + }, + "t_array(t_uint256)47_storage": { + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_enum(TransferRestrictions)18919": { + "label": "enum IHypercertToken.TransferRestrictions", + "members": [ + "AllowAll", + "DisallowAll", + "FromCreatorOnly" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bytes32)": { + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_enum(TransferRestrictions)18919)": { + "label": "mapping(uint256 => enum IHypercertToken.TransferRestrictions)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))": { + "label": "mapping(uint256 => mapping(bytes32 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/contracts/tasks/upgrade.ts b/contracts/tasks/upgrade.ts index 082e36a4..6e783646 100644 --- a/contracts/tasks/upgrade.ts +++ b/contracts/tasks/upgrade.ts @@ -86,7 +86,7 @@ task("propose-upgrade-minter", "Propose an upgrade to OpenZeppelin Defender") .addOptionalParam("description", "Description of upgrade") .setAction(async ({ proxy, multisig, description = "Upgrade Minter contract" }, { ethers, defender }) => { const HypercertMinter = await ethers.getContractFactory("HypercertMinter"); - console.log(`Proposing upgrade to multisig ${multisig} as address ${proxy}`); + console.log(`Proposing upgrade to multisig ${multisig} to address ${proxy}`); const proposal = await defender.proposeUpgrade(proxy, HypercertMinter, { description, multisig, From 38ed2bf08404550ec8f0ef540f5a1fd2340f7ae5 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Mon, 25 Dec 2023 13:53:36 +0100 Subject: [PATCH 062/118] (chore): delete goerli from SDK --- sdk/.env.template | 4 ---- sdk/README.md | 10 ++++---- sdk/RELEASE.md | 4 ++++ sdk/src/client.ts | 2 +- sdk/src/constants.ts | 5 ---- sdk/src/types/client.ts | 2 +- sdk/src/utils/config.ts | 5 ++-- sdk/test/client.test.ts | 6 ++--- sdk/test/client/allowlist.minting.test.ts | 2 +- sdk/test/client/burn.test.ts | 2 +- sdk/test/client/minting.test.ts | 2 +- sdk/test/client/split.merge.test.ts | 2 +- sdk/test/evaluations/evaluator.test.ts | 4 ++-- sdk/test/utils/config.test.ts | 28 +++++++++++------------ sdk/test/utils/errors.test.ts | 2 +- 15 files changed, 37 insertions(+), 43 deletions(-) diff --git a/sdk/.env.template b/sdk/.env.template index d864c413..b4b5a396 100644 --- a/sdk/.env.template +++ b/sdk/.env.template @@ -1,6 +1,3 @@ -# Specifies the default chain ID to use if no chain ID is specified. -DEFAULT_CHAIN_ID=5 - # Specifies the contract address to use for the Hypercert system. CONTRACT_ADDRESS=0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07 @@ -15,7 +12,6 @@ NFT_STORAGE_TOKEN=your-nft-storage-token # Specifies the NFT.storage API token to use for storing Hypercert metadata in a Next.js application. NEXT_PUBLIC_NFT_STORAGE_TOKEN=your-next-public-nft-storage-token - # Specifies the Web3.storage API token to use for storing Hypercert data. WEB3_STORAGE_TOKEN=your-web3-storage-token diff --git a/sdk/README.md b/sdk/README.md index 40bf074b..3a29041d 100644 --- a/sdk/README.md +++ b/sdk/README.md @@ -24,7 +24,7 @@ import { HypercertClient } from "@hypercerts-org/sdk"; ```js const client = new HypercertClient({ - chain: { id: 5 } // required + chain: { id: 11155111 }, // required nftStorageToken, web3StorageToken, }); @@ -46,7 +46,7 @@ This will validate the metadata, store it on IPFS, create a new hypercert on-cha You can also use the client to query the subgraph and retrieve which claims an address owns: ```js -const claims = await client.indexer.fractionsByOwner(owner), +const claims = await client.indexer.fractionsByOwner(owner); ``` For more information on how to use the SDK, check out the @@ -103,7 +103,7 @@ HypercertIndexer, and HypercertMinter classes, respectively. ```js const { client: { storage }, -} = new HypercertClient({ chain: { id: 5 } }); +} = new HypercertClient({ chain: { id: 11155111 } }); ``` The `storage` is a utility class that provides methods for storing and retrieving Hypercert metadata on IPFS and @@ -112,7 +112,7 @@ NFT.storage. It is used by the HypercertClient to store metadata when creating n ```js const { client: { indexer }, -} = new HypercertClient({ chain: { id: 5 } }); +} = new HypercertClient({ chain: { id: 11155111 } }); ``` The `indexer` is a utility class that provides methods for indexing and searching Hypercerts based on various criteria. @@ -121,7 +121,7 @@ It is used by the HypercertClient to retrieve event-based data via the subgraph ```js const { client: { contract }, -} = new HypercertClient({ chain: { id: 5 } }); +} = new HypercertClient({ chain: { id: 11155111 } }); ``` Finally we have a `contract` that provides methods for interacting with the HypercertMinter smart contract. It is used diff --git a/sdk/RELEASE.md b/sdk/RELEASE.md index 11f5fb65..4cd559c4 100644 --- a/sdk/RELEASE.md +++ b/sdk/RELEASE.md @@ -1,5 +1,9 @@ # Release notes +## 1.0.4 + +- Deprecate goerli chain + ## 0.3.1 Update dependencies - Updated graph package dependencies diff --git a/sdk/src/client.ts b/sdk/src/client.ts index 6f8c14e9..fd9f2e4a 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -28,7 +28,7 @@ import { logger } from "./utils"; * * @example * const config: Partial = { - * chain: {id: 5}, + * chain: {id: 11155111 }, * }; * const client = new HypercertClient(config); * diff --git a/sdk/src/constants.ts b/sdk/src/constants.ts index deebf21c..4c24aa5b 100644 --- a/sdk/src/constants.ts +++ b/sdk/src/constants.ts @@ -8,11 +8,6 @@ const DEFAULT_GRAPH_BASE_URL = "https://api.thegraph.com/subgraphs/name/hypercer // These are the deployments we manage const DEPLOYMENTS: { [key in SupportedChainIds]: Partial } = { - 5: { - contractAddress: "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - graphName: "hypercerts-testnet", - graphUrl: `${DEFAULT_GRAPH_BASE_URL}/hypercerts-testnet`, - } as const, 10: { contractAddress: "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", graphName: "hypercerts-optimism-mainnet", diff --git a/sdk/src/types/client.ts b/sdk/src/types/client.ts index 37d5100c..fae217eb 100644 --- a/sdk/src/types/client.ts +++ b/sdk/src/types/client.ts @@ -10,7 +10,7 @@ import { HypercertMetadata } from "./metadata"; import { ByteArray, Chain, Hex, PublicClient, WalletClient, GetContractReturnType } from "viem"; import { HypercertMinterAbi } from "@hypercerts-org/contracts"; -export type SupportedChainIds = 5 | 10 | 42220 | 11155111; +export type SupportedChainIds = 10 | 42220 | 11155111; export type SupportedOverrides = { value?: bigint; gasPrice?: bigint; diff --git a/sdk/src/utils/config.ts b/sdk/src/utils/config.ts index 5d873cc7..89964c29 100644 --- a/sdk/src/utils/config.ts +++ b/sdk/src/utils/config.ts @@ -1,4 +1,4 @@ -import { sepolia, goerli, optimism, celo, Chain } from "viem/chains"; +import { sepolia, optimism, celo, Chain } from "viem/chains"; import { DEPLOYMENTS } from "../constants"; import { @@ -22,7 +22,6 @@ import { deployments } from "../../src"; * environment variables to create the final configuration object. If any required properties are missing, it logs a warning. * * Current supported chain IDs are: - * - 5: Goerli * - 10: Optimism * - 42220: Celo * - 11155111: Sepolia @@ -208,7 +207,7 @@ const getEasContractAddress = (overrides: Partial) => { }; const getDefaultChain = (chainId: number) => { - const _chains = [sepolia, goerli, optimism, celo]; + const _chains = [sepolia, optimism, celo]; for (const chain of Object.values(_chains)) { if ("id" in chain) { diff --git a/sdk/test/client.test.ts b/sdk/test/client.test.ts index 260791f6..01ceff58 100644 --- a/sdk/test/client.test.ts +++ b/sdk/test/client.test.ts @@ -14,7 +14,7 @@ describe("HypercertClient setup tests", () => { it("should be able to create a new read only instance when missing storage keys", () => { const readOnlyClient = new HypercertClient({ - chain: { id: 5 }, + chain: { id: 11155111 }, publicClient, }); @@ -24,7 +24,7 @@ describe("HypercertClient setup tests", () => { it("should be able to create a new instance", () => { const client = new HypercertClient({ - chain: { id: 5 }, + chain: { id: 11155111 }, publicClient, walletClient, nftStorageToken: "test", @@ -51,7 +51,7 @@ describe("HypercertClient setup tests", () => { }); it("should throw an error when executing write method in readonly mode", async () => { - const client = new HypercertClient({ chain: { id: 5 } }); + const client = new HypercertClient({ chain: { id: 11155111 } }); // mintClaim try { diff --git a/sdk/test/client/allowlist.minting.test.ts b/sdk/test/client/allowlist.minting.test.ts index c9cbce48..44f22a81 100644 --- a/sdk/test/client/allowlist.minting.test.ts +++ b/sdk/test/client/allowlist.minting.test.ts @@ -19,7 +19,7 @@ describe("Allows for minting claims from an allowlist", () => { const wallet = walletClient; const userAddress = wallet.account?.address; const client = new HypercertClient({ - chain: { id: 5 }, + chain: { id: 11155111 }, walletClient, publicClient, nftStorageToken: "test", diff --git a/sdk/test/client/burn.test.ts b/sdk/test/client/burn.test.ts index 9c097aa7..fed00e1d 100644 --- a/sdk/test/client/burn.test.ts +++ b/sdk/test/client/burn.test.ts @@ -15,7 +15,7 @@ describe("burn fraction tokens in HypercertClient", () => { const wallet = walletClient; const userAddress = wallet.account?.address; const client = new HypercertClient({ - chain: { id: 5 }, + chain: { id: 11155111 }, walletClient, publicClient, nftStorageToken: "test", diff --git a/sdk/test/client/minting.test.ts b/sdk/test/client/minting.test.ts index fa4e3f00..61726021 100644 --- a/sdk/test/client/minting.test.ts +++ b/sdk/test/client/minting.test.ts @@ -23,7 +23,7 @@ describe("mintClaim in HypercertClient", () => { const storeBlobMock = sinon.stub(NFTStorage, "storeBlob").resolves(mockCorrectMetadataCid); const client = new HypercertClient({ - chain: { id: 5 }, + chain: { id: 11155111 }, walletClient, publicClient, nftStorageToken: "test", diff --git a/sdk/test/client/split.merge.test.ts b/sdk/test/client/split.merge.test.ts index bfd3cf54..1b13b2fa 100644 --- a/sdk/test/client/split.merge.test.ts +++ b/sdk/test/client/split.merge.test.ts @@ -21,7 +21,7 @@ describe("split and merge", () => { let writeSpy = sinon.stub(walletClient, "writeContract"); const client = new HypercertClient({ - chain: { id: 5 }, + chain: { id: 11155111 }, walletClient, publicClient, nftStorageToken: "test", diff --git a/sdk/test/evaluations/evaluator.test.ts b/sdk/test/evaluations/evaluator.test.ts index 5e7c3864..bd0c50ee 100644 --- a/sdk/test/evaluations/evaluator.test.ts +++ b/sdk/test/evaluations/evaluator.test.ts @@ -13,7 +13,7 @@ chai.use(assertionsCount); describe("HypercertEvaluator", () => { const signer = walletClient.account; const evaluator = new HypercertEvaluator({ - chain: { id: 5 }, + chain: { id: 11155111 }, easContractAddress: "0xC2679fBD37d54388Ce493F1DB75320D236e1815e", publicClient, }); @@ -72,7 +72,7 @@ describe("HypercertEvaluator", () => { const evaluation: HypercertEvaluationSchema = getEvaluationData({ creator: signer?.address }); const readonlyEvaluator = new HypercertEvaluator({ - chain: { id: 5 }, + chain: { id: 11155111 }, easContractAddress: "0xC2679fBD37d54388Ce493F1DB75320D236e1815e", publicClient, }); diff --git a/sdk/test/utils/config.test.ts b/sdk/test/utils/config.test.ts index b3e7d32f..035782f4 100644 --- a/sdk/test/utils/config.test.ts +++ b/sdk/test/utils/config.test.ts @@ -20,7 +20,7 @@ describe("Config: contractAddress", () => { it("should return the contract address specified by overrides", () => { const overrides: Partial = { - chain: { id: 5 }, + chain: { id: 11155111 }, contractAddress: "0x1234567890123456789012345678901234567890", }; const config = getConfig(overrides); @@ -51,7 +51,7 @@ describe("Config: graphUrl", () => { it("should return the config specified by overrides", () => { const overrides: Partial = { - chain: { id: 5 }, + chain: { id: 11155111 }, graphUrl: "https://api.example.com", contractAddress: "0x1234567890123456789012345678901234567890", unsafeForceOverrideConfig: true, @@ -62,7 +62,7 @@ describe("Config: graphUrl", () => { it("should throw an error when the graph URL specified by overrides is invalid", () => { const overrides: Partial = { - chain: { id: 5 }, + chain: { id: 11155111 }, graphUrl: "incorrect-url", contractAddress: "0x1234567890123456789012345678901234567890", unsafeForceOverrideConfig: true, @@ -79,7 +79,7 @@ describe("Config: graphUrl", () => { it("should throw an error when the graph URL specified by overrides is missing", () => { const overrides: Partial = { - chain: { id: 5 }, + chain: { id: 11155111 }, contractAddress: "0x1234567890123456789012345678901234567890", unsafeForceOverrideConfig: true, }; @@ -90,7 +90,7 @@ describe("Config: graphUrl", () => { expect(e instanceof InvalidOrMissingError).to.be.true; const error = e as InvalidOrMissingError; expect(error.message).to.eq( - "attempted to override with chainId=5, but requires chainName, graphUrl, and contractAddress to be set", + "attempted to override with chainId=11155111, but requires chainName, graphUrl, and contractAddress to be set", ); } }); @@ -103,13 +103,13 @@ describe("Config: nftStorageToken & web3storageToken", () => { reloadEnv(); }); it("should return an empty object when no overrides or environment variables are specified", () => { - const result = getConfig({ chain: { id: 5 } }); + const result = getConfig({ chain: { id: 11155111 } }); expect(result.nftStorageToken).to.be.undefined; }); it("should return the nftStorageToken specified by overrides", () => { const overrides: Partial = { - chain: { id: 5 }, + chain: { id: 11155111 }, nftStorageToken: "NFTSTOR", web3StorageToken: "WEB3STOR", }; @@ -121,11 +121,11 @@ describe("Config: nftStorageToken & web3storageToken", () => { }); it("should return the nftStorageToken specified by the NFT_STORAGE_TOKEN environment variable", () => { - const result = getConfig({ chain: { id: 5 }, nftStorageToken: "NFTSTOR" }); + const result = getConfig({ chain: { id: 11155111 }, nftStorageToken: "NFTSTOR" }); expect(result.nftStorageToken).to.be.eq("NFTSTOR"); }); it("should not throw an error when the nftStorageToken specified by overrides is invalid", () => { - const overrides: Partial = { chain: { id: 5 }, nftStorageToken: undefined }; + const overrides: Partial = { chain: { id: 11155111 }, nftStorageToken: undefined }; expect(() => getConfig(overrides)).to.not.throw(); }); }); @@ -139,7 +139,7 @@ describe("Config: getPublicClient", () => { it("should return the operator specified by overrides", () => { const overrides: Partial = { - chain: { id: 5 }, + chain: { id: 11155111 }, publicClient, }; const result = getConfig(overrides); @@ -156,7 +156,7 @@ describe("Config: getWalletClient", () => { it("should return the operator specified by overrides", () => { const overrides: Partial = { - chain: { id: 5 }, + chain: { id: 11155111 }, walletClient, }; const result = getConfig(overrides); @@ -172,13 +172,13 @@ describe("Config: web3StorageToken", () => { }); it("should return an empty object when no overrides or environment variables are specified", () => { - const result = getConfig({ chain: { id: 5 } }); + const result = getConfig({ chain: { id: 11155111 } }); expect(result.web3StorageToken).to.be.undefined; }); it("should return the web3StorageToken specified by overrides", () => { const overrides: Partial = { - chain: { id: 5 }, + chain: { id: 11155111 }, web3StorageToken: "WEB3STOR", }; @@ -189,7 +189,7 @@ describe("Config: web3StorageToken", () => { }); it("should not throw an error when the web3StorageToken specified by overrides is invalid", () => { - const overrides: Partial = { chain: { id: 5 }, web3StorageToken: undefined }; + const overrides: Partial = { chain: { id: 11155111 }, web3StorageToken: undefined }; expect(() => getConfig(overrides)).to.not.throw(); }); }); diff --git a/sdk/test/utils/errors.test.ts b/sdk/test/utils/errors.test.ts index a69cc8e0..5d7b66eb 100644 --- a/sdk/test/utils/errors.test.ts +++ b/sdk/test/utils/errors.test.ts @@ -34,7 +34,7 @@ describe("Contract Error handler", () => { const storeBlobMock = sinon.stub(NFTStorage, "storeBlob").resolves(mockCorrectMetadataCid); const client = new HypercertClient({ - chain: { id: 5 }, + chain: { id: 11155111 }, walletClient, publicClient, nftStorageToken: "test", From 4386d02409b5aed647fc4df653b55cf1eee4e8a7 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Mon, 25 Dec 2023 13:54:01 +0100 Subject: [PATCH 063/118] (chore): delete goerli from defender config --- defender/src/networks.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/defender/src/networks.ts b/defender/src/networks.ts index 80aa187b..9f48c5de 100644 --- a/defender/src/networks.ts +++ b/defender/src/networks.ts @@ -21,12 +21,6 @@ export interface SupportedNetworks { export const NETWORKS: SupportedNetworks = { TEST: [ - { - networkKey: "goerli", - contractAddress: "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - alchemyKeyEnvName: "ALCHEMY_GOERLI_KEY", - chainId: 5, - }, { networkKey: "sepolia", contractAddress: "0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941", From f4409b3c8a67ca025450c131ed76468a45cbe50f Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Mon, 25 Dec 2023 13:55:24 +0100 Subject: [PATCH 064/118] (chore): delete goerli from graph --- graph/networks.json | 6 ------ graph/package.json | 3 +-- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/graph/networks.json b/graph/networks.json index 28925338..5babcf29 100644 --- a/graph/networks.json +++ b/graph/networks.json @@ -5,12 +5,6 @@ "startBlock": 22079542 } }, - "goerli": { - "HypercertMinter": { - "address": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "startBlock": 8537999 - } - }, "optimism": { "HypercertMinter": { "address": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", diff --git a/graph/package.json b/graph/package.json index c6ab7e5f..f983c57d 100644 --- a/graph/package.json +++ b/graph/package.json @@ -9,10 +9,9 @@ "build": "pnpm build:graph && pnpm build:codegen", "build:graph": "graph build", "build:codegen": "graph codegen", - "deploy:test": "pnpm auth && pnpm deploy:goerli && pnpm deploy:sepolia", + "deploy:test": "pnpm auth && pnpm deploy:sepolia", "deploy:prod": "pnpm auth && pnpm deploy:optimism && pnpm deploy:celo", "deploy:celo": "graph deploy --node https://api.thegraph.com/deploy/ --network celo hypercerts-admin/hypercerts-celo", - "deploy:goerli": "graph deploy --node https://api.thegraph.com/deploy/ --network goerli hypercerts-admin/hypercerts-testnet", "deploy:optimism": "graph deploy --node https://api.thegraph.com/deploy/ --network optimism hypercerts-admin/hypercerts-optimism-mainnet", "deploy:sepolia": "graph deploy --node https://api.thegraph.com/deploy/ --network sepolia hypercerts-admin/hypercerts-sepolia", "create-local": "graph create --node http://localhost:8020/ hypercerts-admin/hypercerts-testnet", From 1635b01979140abab4b1e622d614ed8d6de7b85a Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Mon, 25 Dec 2023 13:59:50 +0100 Subject: [PATCH 065/118] (chore): delete goerli from frontend --- frontend/.env.local.example | 4 ++-- frontend/README.md | 2 +- frontend/components/dapp-context.tsx | 4 ++-- frontend/components/dapp-state.tsx | 4 ++-- frontend/lib/formatting.ts | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/.env.local.example b/frontend/.env.local.example index d6275350..6db8ed46 100644 --- a/frontend/.env.local.example +++ b/frontend/.env.local.example @@ -8,9 +8,9 @@ NEXT_PUBLIC_DOMAIN=testnet.hypercerts.org ## Web3 ####### ### UUPS proxy contract address -NEXT_PUBLIC_CONTRACT_ADDRESS=0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07 +NEXT_PUBLIC_CONTRACT_ADDRESS=0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941 ### Subgraph URL - currently using hosted service -NEXT_PUBLIC_GRAPH_URL=https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet +NEXT_PUBLIC_GRAPH_URL=https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-sepolia ### Wallet connect ID NEXT_PUBLIC_WALLETCONNECT_ID=GET_FROM_https://cloud.walletconnect.com/app diff --git a/frontend/README.md b/frontend/README.md index 5f35cd8a..4c8bac0a 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -6,7 +6,7 @@ This frontend application is currently configured to use Next.js as a static sit All configurations are currently stored in environment variables. See `.env.local.example` to see which variables need to be set. -We have pre-populated the file with the current testnet deployment on Goerli. +We have pre-populated the file with the current testnet deployment on Sepolia. The easiest way to get started is to copy this into `.env.local` and modify the file directly, which `next` will automatically load when running the dev server below. diff --git a/frontend/components/dapp-context.tsx b/frontend/components/dapp-context.tsx index e0d4c179..bed7f318 100644 --- a/frontend/components/dapp-context.tsx +++ b/frontend/components/dapp-context.tsx @@ -31,7 +31,7 @@ import { import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import React, { ReactNode, useEffect } from "react"; -import { celo, Chain, goerli, optimism, sepolia } from "viem/chains"; +import { celo, Chain, optimism, sepolia } from "viem/chains"; import { configureChains, WagmiConfig, createConfig } from "wagmi"; import { publicProvider } from "wagmi/providers/public"; @@ -44,7 +44,7 @@ import { const queryClient = new QueryClient(); -const TEST_CHAINS = [goerli, sepolia]; +const TEST_CHAINS = [sepolia]; const PROD_CHAINS = [optimism, celo]; export const CHAINS = (isProduction ? PROD_CHAINS : TEST_CHAINS) as Chain[]; diff --git a/frontend/components/dapp-state.tsx b/frontend/components/dapp-state.tsx index 6b4e661a..31e45512 100644 --- a/frontend/components/dapp-state.tsx +++ b/frontend/components/dapp-state.tsx @@ -5,12 +5,12 @@ import { PlasmicCanvasContext } from "@plasmicapp/loader-nextjs"; import { DataProvider } from "@plasmicapp/loader-nextjs"; import "@rainbow-me/rainbowkit/styles.css"; import React, { ReactNode } from "react"; -import { goerli, optimism, hardhat, Chain, sepolia } from "viem/chains"; +import { optimism, hardhat, Chain, sepolia } from "viem/chains"; import { useNetwork } from "wagmi"; const DAPP_STATE_NAME = "DappState"; -const ALL_CHAINS = [optimism, goerli, hardhat, sepolia]; +const ALL_CHAINS = [optimism, hardhat, sepolia]; export interface DappStateData { myAddress?: string; diff --git a/frontend/lib/formatting.ts b/frontend/lib/formatting.ts index 260f7c39..6bfff01a 100644 --- a/frontend/lib/formatting.ts +++ b/frontend/lib/formatting.ts @@ -59,7 +59,7 @@ export const getOpenSeaFractionUrl = ( _tokenId = _tokenId.slice(0, -1); } - return `https://testnets.opensea.io/assets/goerli/${contractAddress}/${_tokenId}`; + return `https://testnets.opensea.io/assets/sepolia/${contractAddress}/${_tokenId}`; }; export const formatAddress = (address: string) => From f172a1952da4dafd75f7af1fc8a0d0cc0756dcc7 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Mon, 25 Dec 2023 14:37:38 +0100 Subject: [PATCH 066/118] (chore): update tests for goerli deprecation --- contracts/hardhat.config.ts | 1 - graph/tests/.latest.json | 2 +- sdk/test/utils/config.test.ts | 6 +++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index e4bb0221..c82c7039 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -59,7 +59,6 @@ const OPENZEPPELIN_SECRET_KEY = requireEnv(process.env.OPENZEPPELIN_SECRET_KEY, const chainIds = { hardhat: 31337, // Ethereum: https://docs.infura.io/infura/networks/ethereum/how-to/choose-a-network - goerli: 5, sepolia: 11155111, mainnet: 1, // Optimism: https://docs.infura.io/infura/networks/optimism/how-to/choose-a-network diff --git a/graph/tests/.latest.json b/graph/tests/.latest.json index 4f9a5e79..59d5886d 100644 --- a/graph/tests/.latest.json +++ b/graph/tests/.latest.json @@ -1,4 +1,4 @@ { "version": "0.6.0", - "timestamp": 1702070097153 + "timestamp": 1703510468280 } diff --git a/sdk/test/utils/config.test.ts b/sdk/test/utils/config.test.ts index 035782f4..b33e607b 100644 --- a/sdk/test/utils/config.test.ts +++ b/sdk/test/utils/config.test.ts @@ -28,7 +28,7 @@ describe("Config: contractAddress", () => { }); it("should throw an error when the contract address specified by overrides is invalid", () => { - const overrides: Partial = { chain: { id: 5 }, contractAddress: "invalid-address" }; + const overrides: Partial = { chain: { id: 11155111 }, contractAddress: "invalid-address" }; try { getConfig(overrides); } catch (e) { @@ -45,8 +45,8 @@ describe("Config: graphUrl", () => { }); it("should return the default graphUrl when no overrides are specified", () => { - const result = getConfig({ chain: { id: 5 } }); - expect(result.graphUrl).to.equal("https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-testnet"); + const result = getConfig({ chain: { id: 11155111 } }); + expect(result.graphUrl).to.equal("https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-sepolia"); }); it("should return the config specified by overrides", () => { From 3faff23fd8d9a05f17d3745d0afb288ef7c92621 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 4 Jan 2024 11:43:26 +0100 Subject: [PATCH 067/118] feat(deploy): sepolia with verification --- contracts/hardhat.config.ts | 4 + contracts/package.json | 1 + .../deployment-marketplace-goerli.json | 49 ------ .../deployment-marketplace-hardhat.json | 1 - .../deployment-marketplace-sepolia.json | 54 +++--- contracts/tasks/deploy-marketplace.ts | 75 ++++---- pnpm-lock.yaml | 162 ++++++++++++++++-- 7 files changed, 221 insertions(+), 125 deletions(-) delete mode 100644 contracts/src/deployments/deployment-marketplace-goerli.json delete mode 100644 contracts/src/deployments/deployment-marketplace-hardhat.json diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 9958691f..a46543f9 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -116,7 +116,11 @@ const config: HardhatUserConfig = { "StrategyManager", "TransferManager", "StrategyCollectionOffer", + "StrategyDutchAuction", + "StrategyHypercertCollectionOffer", + "StrategyHypercertDutchAuction", "StrategyHypercertFractionOffer", + "StrategyItemIdsRange", "CreatorFeeManagerWithRoyalties", ], except: ["@openzeppelin"], diff --git a/contracts/package.json b/contracts/package.json index 4443bde7..8fc54bec 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -45,6 +45,7 @@ "@rollup/plugin-commonjs": "^24.0.1", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", + "@tenderly/hardhat-tenderly": "^2.1.0", "@trivago/prettier-plugin-sort-imports": "^3.3.0", "@types/node": "^18.11.11", "@typescript-eslint/eslint-plugin": "^5.38.0", diff --git a/contracts/src/deployments/deployment-marketplace-goerli.json b/contracts/src/deployments/deployment-marketplace-goerli.json deleted file mode 100644 index 2c3c30ca..00000000 --- a/contracts/src/deployments/deployment-marketplace-goerli.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "HypercertExchange": { - "address": "0x89524d8a0B1D7742579A7d8AE46D7679a4de1198", - "fullNamespace": "LooksRareProtocol", - "args": [ - "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", - "0xfB4A7359d3767781dB5dF63789c478E2F007bD6A", - "0x61eDE0F0CaD4D51Df761DccDaB08B57e6Cb8f712", - "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6" - ], - "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199afb4a7359d3767781db5df63789c478e2f007bd6a61ede0f0cad4d51df761dccdab08b57e6cb8f712b4fbf271143f4fbf7b91a5ded31805e42b2208d6", - "tx": "0x97facbd3ee5637e05b2b49d6535d2cc8e5a6607d16e728922bc5890cf76d0a86" - }, - "ProtocolFeeRecipient": { - "address": "0xfB4A7359d3767781dB5dF63789c478E2F007bD6A", - "fullNamespace": "ProtocolFeeRecipient", - "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6"], - "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199ab4fbf271143f4fbf7b91a5ded31805e42b2208d6", - "tx": "0xbdfdcec3db949405f2531ed0d1ef1c3fcf43d127be8ff7bbb51c27a466349c50" - }, - "TransferManager": { - "address": "0x61eDE0F0CaD4D51Df761DccDaB08B57e6Cb8f712", - "fullNamespace": "TransferManager", - "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a"], - "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", - "tx": "0xa16188ed346db49d99d5d2005214084fc15a09843a20a20f6b8532ae65b50530" - }, - "OrderValidator": { - "address": "0x51c9277d2b3e7ae460eb710053367bfe3872027b", - "fullNamespace": "OrderValidatorV2A", - "args": ["0x89524d8a0B1D7742579A7d8AE46D7679a4de1198"], - "encodedArgs": "0x89524d8a0b1d7742579a7d8ae46d7679a4de1198", - "tx": "0xa245695a4f6be256e68b83f1cd1f2503106126894053812ad6297f412a74359d" - }, - "StrategyCollectionOffer": { - "address": "0x947bbd2e69e8d777171139c3fd242638e4e78bf0", - "fullNamespace": "StrategyCollectionOffer", - "args": [], - "encodedArgs": "0x", - "tx": "0x94aaa40fc99eb28853a34160143d5e856f57e323b029dfddd919e46534b8fb17" - }, - "StrategyHypercertFractionOffer": { - "address": "0x9f233a07bd4ce69c0d7ed6553e796dba41892cf6", - "fullNamespace": "StrategyCollectionOffer", - "args": [], - "encodedArgs": "0x", - "tx": "0xf87db995c8c325a2d2663b51fadbfdc8ac8bb733ae5a0aae58566309a2aff674" - } -} diff --git a/contracts/src/deployments/deployment-marketplace-hardhat.json b/contracts/src/deployments/deployment-marketplace-hardhat.json deleted file mode 100644 index 836c8a44..00000000 --- a/contracts/src/deployments/deployment-marketplace-hardhat.json +++ /dev/null @@ -1 +0,0 @@ -{"TransferManager":{"address":"0xC90326503eb2f23D21e628579E4CDFCBBC3cA9d6","fullNamespace":"TransferManager","args":["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a"],"encodedArgs":"0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a","tx":"0x8733112b0fdbaf6d850abec2f87e4dd9a54a3083fadcf471304ef929a1a66d72"},"ProtocolFeeRecipient":{"address":"0xf7856Beb393E9FBDe01C1444Fec8965e671D1EFd","fullNamespace":"ProtocolFeeRecipient","args":["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a","0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6"],"encodedArgs":"0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199ab4fbf271143f4fbf7b91a5ded31805e42b2208d6","tx":"0xdd0fb084a4eacc53e3a6eb13d83f10ae2a1f6b75ff2f0c373bc5b04eb722ef93"},"HypercertExchange":{"address":"0x57D011E0faB5718e0ffCceBbD876c3CeBC05d983","fullNamespace":"LooksRareProtocol","args":["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a","0xf7856Beb393E9FBDe01C1444Fec8965e671D1EFd","0xC90326503eb2f23D21e628579E4CDFCBBC3cA9d6","0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6"],"encodedArgs":"0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199af7856beb393e9fbde01c1444fec8965e671d1efdc90326503eb2f23d21e628579e4cdfcbbc3ca9d6b4fbf271143f4fbf7b91a5ded31805e42b2208d6","tx":"0x04fc1e3849f9b236b9ad3f402b76ed6a04701a8b020e611c80c16a22ab487975"},"OrderValidator":{"address":"0xc7c884c81740a3ec1e6cbf0d1aea1991f7ddf4b8","fullNamespace":"OrderValidatorV2A","args":["0x57D011E0faB5718e0ffCceBbD876c3CeBC05d983"],"encodedArgs":"0x57d011e0fab5718e0ffccebbd876c3cebc05d983","tx":"0x2bec70d4e7a40e567c2e89df91e70d80a1a733221d1da52824f38875ff69e504"},"CreatorFeeManager":{"address":"0xc88b5d92648361373eb78ddc6c40d0e059b34340","fullNamespace":"CreatorFeeManagerWithRoyalties","args":["0x12405dB79325D06a973aD913D6e9BdA1343cD526"],"encodedArgs":"0x12405db79325d06a973ad913d6e9bda1343cd526","tx":"0xac8bb8b9211cc8c98e9a623d53507b794101862da17e9695ad491777a34a2766"},"StrategyCollectionOffer":{"address":"0x853da9e437b360f5f1a45e3f21104ab776398f67","fullNamespace":"StrategyCollectionOffer","args":[],"encodedArgs":"0x","tx":"0x2be2e0b98e02b38b2706c9468606b07fc2d667796a6707b7f849cb5740415cba"},"StrategyDutchAuction":{"address":"0x69f4c77d0f51876346067dde325ab18b49863fff","fullNamespace":"StrategyDutchAuction","args":[],"encodedArgs":"0x","tx":"0xaa52584ca20b0685a81a543f9c151983408ba1eeab8ece2fa20fc9a59d3614a9"},"StrategyItemIdsRange":{"address":"0x25370812dbe35ce2665605cf0bc206c3395180a9","fullNamespace":"StrategyItemIdsRange","args":[],"encodedArgs":"0x","tx":"0xc53a3e0065aa5fcf1cf330c994a3106d126a7c804b94dcb31403937b68d87ad2"},"StrategyHypercertCollectionOffer":{"address":"0xdfa561b7ef886c4daedfbd64f6965eb04c520aea","fullNamespace":"StrategyHypercertCollectionOffer","args":[],"encodedArgs":"0x","tx":"0x5287a47d52c56d8f26b0351c3cc5af23c8b30bd4e02c6494671f8fcf4796cb94"},"StrategyHypercertDutchAuction":{"address":"0x93b9ec7255f74ea7d048c8a1e523d2509328d623","fullNamespace":"StrategyHypercertDutchAuction","args":[],"encodedArgs":"0x","tx":"0x754e1b187c71220b3c34db4a0c316bb4f95ef6c3a631af46f5257bdc2f440935"},"StrategyHypercertFractionOffer":{"address":"0xa1f0f6feaae844115e9288c54fde5759f61dea96","fullNamespace":"StrategyHypercertFractionOffer","args":[],"encodedArgs":"0x","tx":"0xe29f637401fe413f415c8e27b8160d4d00b47153c8636a2da809cd7f0def25d9"}} \ No newline at end of file diff --git a/contracts/src/deployments/deployment-marketplace-sepolia.json b/contracts/src/deployments/deployment-marketplace-sepolia.json index 08f4c12e..04b5235e 100644 --- a/contracts/src/deployments/deployment-marketplace-sepolia.json +++ b/contracts/src/deployments/deployment-marketplace-sepolia.json @@ -1,84 +1,84 @@ { "TransferManager": { - "address": "0x02BFF2Aa8C9a733cFc41BcC02773bf8D1E1425f8", + "address": "0x2aDc7d015701e347C75415477dEb0203C36E082e", "fullNamespace": "TransferManager", "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a"], "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", - "tx": "0xd45d3bfe9929031f96053b014242209446ab6d27112f2d3e9b84315a730a5406" + "tx": "0x0c0e82c9548a8f7ccda38f9bb1727a1ff28bf2c52404017bf021ccae694defa8" }, "ProtocolFeeRecipient": { - "address": "0x58737b0281A094550f6048E84E332dF3ba8Ea609", + "address": "0xE2eDDB38CA8660Aee27F5a268D572cC160Cc8214", "fullNamespace": "ProtocolFeeRecipient", "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6"], "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199ab4fbf271143f4fbf7b91a5ded31805e42b2208d6", - "tx": "0x648fa64938c43a2550961cbe775816e27c9362a7683a7641fa7766b249d568f1" + "tx": "0x539e0ddfc830afe54c8ad7afbf54cb20b58590cdd2f720426ff2981146926b53" }, "HypercertExchange": { - "address": "0x2d7C5512bC3BBE1A12FB9EC1F8CD7Ab0C99E6de5", + "address": "0x7d7b6011c7BaB5A850Bd44f7A5B29C3502fd6491", "fullNamespace": "LooksRareProtocol", "args": [ "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", - "0x58737b0281A094550f6048E84E332dF3ba8Ea609", - "0x02BFF2Aa8C9a733cFc41BcC02773bf8D1E1425f8", + "0xE2eDDB38CA8660Aee27F5a268D572cC160Cc8214", + "0x2aDc7d015701e347C75415477dEb0203C36E082e", "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6" ], - "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a58737b0281a094550f6048e84e332df3ba8ea60902bff2aa8c9a733cfc41bcc02773bf8d1e1425f8b4fbf271143f4fbf7b91a5ded31805e42b2208d6", - "tx": "0xaacd3ea603a117e7ceb25e9b9501d795b696f6568e7b6b968d28f10dd247c98a" + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199ae2eddb38ca8660aee27f5a268d572cc160cc82142adc7d015701e347c75415477deb0203c36e082eb4fbf271143f4fbf7b91a5ded31805e42b2208d6", + "tx": "0xc98391c8ac0f7fcb61c74656fdd2f51d948fe509961b41dbd07a7f1c1a489204" }, "OrderValidator": { - "address": "0xf689c1f8475102efdee73ed359fc039e385f3786", + "address": "0xff9ef4786bf31158ba152638746c2a678d2c4ade", "fullNamespace": "OrderValidatorV2A", - "args": ["0x2d7C5512bC3BBE1A12FB9EC1F8CD7Ab0C99E6de5"], - "encodedArgs": "0x2d7c5512bc3bbe1a12fb9ec1f8cd7ab0c99e6de5", - "tx": "0xd997ae4c388cd2f62e6cf51cd5f38fe6d7401ecefe1cf7dfbd06b43993579c2a" + "args": ["0x7d7b6011c7BaB5A850Bd44f7A5B29C3502fd6491"], + "encodedArgs": "0x7d7b6011c7bab5a850bd44f7a5b29c3502fd6491", + "tx": "0x06b247d48d9d3bfbc88216606815dbbb541b8c0e0a37992ba44de328fea0986f" }, "CreatorFeeManager": { - "address": "0x27dcab314d7145a7a93addcab4e006c28071454c", + "address": "0x37a6fd35b38419258b3c30e523d39b73084beb4e", "fullNamespace": "CreatorFeeManagerWithRoyalties", "args": ["0x12405dB79325D06a973aD913D6e9BdA1343cD526"], "encodedArgs": "0x12405db79325d06a973ad913d6e9bda1343cd526", - "tx": "0x2ecf9a12a2cfaa50fade45aa99878e797b865bcdacd652d6e130d9b435634cc7" + "tx": "0x308a623f8fca6501b8ead30b645e7235752a3784d676b90803b4eb09414e5877" }, "StrategyCollectionOffer": { - "address": "0x1b64fc6b1d7ec3533fd8085a50fa8c30748650ff", + "address": "0x4113412bc98cb0b85b556c3ba041429a8699fb7f", "fullNamespace": "StrategyCollectionOffer", "args": [], "encodedArgs": "0x", - "tx": "0x18b8e6af7063b825113c14ef9577dd87f0533609873512e91d07272628e176de" + "tx": "0x3069ce4356ec284fe0897f7a0617ce9f5b8246dac361403e1e957deac30bab11" }, "StrategyDutchAuction": { - "address": "0xff15b1de4921e8832f688f9660c97454ea448a16", + "address": "0x8b6619c3641f8eb8a8ae0560a7f4e549e59f73ea", "fullNamespace": "StrategyDutchAuction", "args": [], "encodedArgs": "0x", - "tx": "0xd7339188d8368e1e6d90311b68448b106d0958985e86d9983c265556605cda69" + "tx": "0x4ff7a0bdf19b5bdb0cd585bddcbe685c3e41eb8ed3125888d9f6201d32584bfe" }, "StrategyItemIdsRange": { - "address": "0xf55a35d866e7e05e9f115dbd91e1e80d744713f0", + "address": "0x9874463e1821d8f8de3eb84fc91e7c10e14bfa83", "fullNamespace": "StrategyItemIdsRange", "args": [], "encodedArgs": "0x", - "tx": "0x67eeb224a84918f029ecc486c1f4d47d73755d855f8cb12cfad819c9e01faf68" + "tx": "0xeaafc39b109fb79f618904572d2f92c1fbde52cdf70fbd9fc16c09d7b4f2ddfd" }, "StrategyHypercertCollectionOffer": { - "address": "0xe2d5d9e473cc1e39e5139feb80fbdd8ee4a73ae2", + "address": "0xe551b176fdcb2ede7a01b21986f75072e98c4eff", "fullNamespace": "StrategyHypercertCollectionOffer", "args": [], "encodedArgs": "0x", - "tx": "0xac17c63ffc2061fca3b1fbd31de6aafa9bbbac96566ef2875bcad3db4e89f0af" + "tx": "0x8cd8164195472bfe2a84fcbe6452ce5ac0ff9bbab5a972d72be2198b6192933a" }, "StrategyHypercertDutchAuction": { - "address": "0x9f0223dfea44f03727f399b5c08c49c269b7e8d3", + "address": "0x1404f57e11b98b08501c32aa163b4d18681708bf", "fullNamespace": "StrategyHypercertDutchAuction", "args": [], "encodedArgs": "0x", - "tx": "0x51196676e32878214d5c85c306d8c0a62ecd5bf7fe369a2b9b5a716a6a24d652" + "tx": "0xb62474f026fe9969a8869bed55564c5fa4320dca51835cd1de019e3cc57e6d70" }, "StrategyHypercertFractionOffer": { - "address": "0xe6638876f4bf911d1ae52ec0770d070286712861", + "address": "0x9ec492f34707b591c4b6dc1c76acad722df4a9ad", "fullNamespace": "StrategyHypercertFractionOffer", "args": [], "encodedArgs": "0x", - "tx": "0x14702738cfe788270e38e404f9b046e7b5c4a9705852a30b9c25020462810437" + "tx": "0x7e48f304ec8dd9532541288429afeef786bc7ae3d9194354fdbc72442c58e9bd" } } diff --git a/contracts/tasks/deploy-marketplace.ts b/contracts/tasks/deploy-marketplace.ts index cf1bfe77..d7642582 100644 --- a/contracts/tasks/deploy-marketplace.ts +++ b/contracts/tasks/deploy-marketplace.ts @@ -10,17 +10,17 @@ import { PublicClient, } from "viem"; import { writeFile } from "node:fs/promises"; -import creatorFeeManagerContract from "../out/CreatorFeeManagerWithRoyalties.sol/CreatorFeeManagerWithRoyalties.json"; -import exchangeContract from "../out/LooksRareProtocol.sol/LooksRareProtocol.json"; -import transferManagerContract from "../out/TransferManager.sol/TransferManager.json"; -import orderValidatorContract from "../out/OrderValidatorV2A.sol/OrderValidatorV2A.json"; -import strategyCollectionOfferContract from "../out/StrategyCollectionOffer.sol/StrategyCollectionOffer.json"; -import strategyDutchAuctionContract from "../out/StrategyDutchAuction.sol/StrategyDutchAuction.json"; -import strategyItemIdsRangeContract from "../out/StrategyItemIdsRange.sol/StrategyItemIdsRange.json"; -import strategyHypercertCollectionOfferContract from "../out/StrategyHypercertCollectionOffer.sol/StrategyHypercertCollectionOffer.json"; -import strategyHypercertDutchAuctionContract from "../out/StrategyHypercertDutchAuction.sol/StrategyHypercertDutchAuction.json"; -import strategyHypercertFractionOfferContract from "../out/StrategyHypercertFractionOffer.sol/StrategyHypercertFractionOffer.json"; -import protocolFeeRecipientContract from "../out/ProtocolFeeRecipient.sol/ProtocolFeeRecipient.json"; +import creatorFeeManagerContract from "../artifacts/src/marketplace/CreatorFeeManagerWithRoyalties.sol/CreatorFeeManagerWithRoyalties.json"; +import exchangeContract from "../artifacts/src/marketplace/LooksRareProtocol.sol/LooksRareProtocol.json"; +import transferManagerContract from "../artifacts/src/marketplace/TransferManager.sol/TransferManager.json"; +import orderValidatorContract from "../artifacts/src/marketplace/helpers/OrderValidatorV2A.sol/OrderValidatorV2A.json"; +import strategyCollectionOfferContract from "../artifacts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol/StrategyCollectionOffer.json"; +import strategyDutchAuctionContract from "../artifacts/src/marketplace/executionStrategies/StrategyDutchAuction.sol/StrategyDutchAuction.json"; +import strategyItemIdsRangeContract from "../artifacts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol/StrategyItemIdsRange.json"; +import strategyHypercertCollectionOfferContract from "../artifacts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol/StrategyHypercertCollectionOffer.json"; +import strategyHypercertDutchAuctionContract from "../artifacts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol/StrategyHypercertDutchAuction.json"; +import strategyHypercertFractionOfferContract from "../artifacts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol/StrategyHypercertFractionOffer.json"; +import protocolFeeRecipientContract from "../artifacts/src/marketplace/ProtocolFeeRecipient.sol/ProtocolFeeRecipient.json"; const strategies = [ { @@ -134,7 +134,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") const _minTotalFeeBp = 50; const _maxProtocolFeeBp = 200; - const releaseCounter = "i"; + const releaseCounter = "v0.3"; const salt = slice( encodePacked(["address", "string", "address"], [deployer.account?.address, releaseCounter, create2Address]), @@ -152,24 +152,12 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") create2Address, encodeDeployData({ abi: transferManagerContract.abi, - bytecode: transferManagerContract.bytecode.object as `0x${string}`, + bytecode: transferManagerContract.bytecode as `0x${string}`, args: transferManagerArgs, }), salt, ); - // read findCreate2Address from IImmutableCreate2Factory - const findCreate2Address = await create2Instance.read.findCreate2Address([ - salt, - encodeDeployData({ - abi: transferManagerContract.abi, - bytecode: transferManagerContract.bytecode.object as `0x${string}`, - args: transferManagerArgs, - }), - ]); - - console.log(`Comparing calculated address: ${transferManagerCreate2.address} with ${findCreate2Address}`); - // Create2 ProtocolFeeRecipient const protocolFeeRecipientArgs = [deployer.account.address, wethAddress]; const protocolFeeRecipientCreate2 = await getCreate2Address( @@ -177,7 +165,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") create2Address, encodeDeployData({ abi: protocolFeeRecipientContract.abi, - bytecode: protocolFeeRecipientContract.bytecode.object as `0x${string}`, + bytecode: protocolFeeRecipientContract.bytecode as `0x${string}`, args: protocolFeeRecipientArgs, }), salt, @@ -196,7 +184,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") create2Address, encodeDeployData({ abi: exchangeContract.abi, - bytecode: exchangeContract.bytecode.object as `0x${string}`, + bytecode: exchangeContract.bytecode as `0x${string}`, args: hypercertsExchangeArgs, }), salt, @@ -279,7 +267,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") abi: orderValidatorContract.abi, account: deployer.account, args: orderValidatorArgs, - bytecode: orderValidatorContract.bytecode.object as `0x${string}`, + bytecode: orderValidatorContract.bytecode as `0x${string}`, }); const orderValidatorTx = await publicClient.waitForTransactionReceipt({ @@ -305,7 +293,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") abi: creatorFeeManagerContract.abi, account: deployer.account, args: ["0x12405dB79325D06a973aD913D6e9BdA1343cD526"], - bytecode: creatorFeeManagerContract.bytecode.object as `0x${string}`, + bytecode: creatorFeeManagerContract.bytecode as `0x${string}`, }); const creatorFeeManagerTx = await publicClient.waitForTransactionReceipt({ @@ -401,7 +389,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") abi: strategy.contract.abi, account: deployer.account, args: [], - bytecode: strategy.contract.bytecode.object as `0x${string}`, + bytecode: strategy.contract.bytecode as `0x${string}`, }); const strategyTx = await publicClient.waitForTransactionReceipt({ @@ -451,22 +439,35 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") console.log("🚀 Done!"); - await writeFile(`src/deployments/deployment-marketplace-${network.name}.json`, JSON.stringify(contracts), "utf-8"); if (network.name !== "hardhat" && network.name !== "localhost") { + await writeFile( + `src/deployments/deployment-marketplace-${network.name}.json`, + JSON.stringify(contracts), + "utf-8", + ); + // Verify contracts - for (const [name, { address, tx }] of Object.entries(contracts)) { + for (const [name, { address, tx, args }] of Object.entries(contracts)) { try { + console.log(`Verifying ${name}...`); + const code = await publicClient.getBytecode({ address: address as `0x${string}` }); if (code === "0x") { console.log(`${name} contract deployment has not completed. waiting to verify...`); - await publicClient.waitForTransactionReceipt({ + const receipt = await publicClient.waitForTransactionReceipt({ hash: tx, }); + + await run("verify:verify", { + address: receipt.contractAddress, + constructorArguments: args, + }); + } else { + await run("verify:verify", { + address, + constructorArguments: args, + }); } - await run("verify:verify", { - address, - constructorArguments: contracts[name].args, - }); } catch (error) { const errorMessage = (error as Error).message; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 298843ec..2ad4b23c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -81,6 +81,9 @@ importers: '@rollup/plugin-node-resolve': specifier: ^15.0.1 version: 15.2.3(rollup@4.1.4) + '@tenderly/hardhat-tenderly': + specifier: ^2.1.0 + version: 2.1.0(@types/node@18.18.7)(ethers@6.8.0)(hardhat@2.18.3) '@trivago/prettier-plugin-sort-imports': specifier: ^3.3.0 version: 3.4.0(prettier@2.8.8) @@ -6665,7 +6668,7 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@whatwg-node/server': 0.9.16 @@ -6828,7 +6831,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6842,10 +6845,10 @@ packages: '@envelop/core': 5.0.0 '@envelop/extended-validation': 4.0.0(@envelop/core@5.0.0)(graphql@16.8.1) '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) - '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(react-native@0.72.6) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -6857,7 +6860,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): + /@graphql-mesh/runtime@0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2): resolution: {integrity: sha512-eZIW/gdEVLvCLEEae8e3lny7d89CFfDyu0Z0xu4yVEdYeVpG9Ki2mDYFHztusIIkZikecvdsoM9MZX6LYcPOkg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -6873,8 +6876,8 @@ packages: '@envelop/graphql-jit': 8.0.1(@envelop/core@5.0.0)(graphql@16.8.1) '@graphql-mesh/cross-helpers': 0.4.1(@graphql-tools/utils@9.2.1)(graphql@16.8.1) '@graphql-mesh/string-interpolation': 0.5.3(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.8.1) '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) '@graphql-tools/executor': 1.2.0(graphql@16.8.1) @@ -7812,7 +7815,7 @@ packages: '@graphql-mesh/graphql': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(@types/node@18.18.7)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(tslib@2.6.2) '@graphql-mesh/http': 0.96.14(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/runtime@0.96.13)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/merger-bare': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) - '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.96.13(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/store': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-mesh/utils@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/types': 0.95.8(@graphql-mesh/store@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) '@graphql-mesh/utils': 0.95.8(@graphql-mesh/cross-helpers@0.4.1)(@graphql-mesh/types@0.95.8)(@graphql-tools/utils@9.2.1)(graphql@16.8.1)(tslib@2.6.2) @@ -12440,6 +12443,33 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false + /@tenderly/hardhat-tenderly@2.1.0(@types/node@18.18.7)(ethers@6.8.0)(hardhat@2.18.3): + resolution: {integrity: sha512-wy6WnvrT4fxqTsln5DH3MgT+lvUV7AyqHVtSyGJgQh6NX0Q59ZXKoqedB8Hi3IkYMOhbjbPFlR0Z/zr8sYGEzQ==} + peerDependencies: + ethers: ^6.8.1 + hardhat: ^2.19.0 + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@nomicfoundation/hardhat-ethers': 3.0.4(ethers@6.8.0)(hardhat@2.18.3) + axios: 0.27.2(debug@4.3.4) + ethers: 6.8.0 + fs-extra: 10.1.0 + hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) + hardhat-deploy: 0.11.45 + tenderly: 0.8.0(ts-node@10.9.1)(typescript@5.3.3) + ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.3.3) + tslog: 4.9.2 + typescript: 5.3.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: true + /@testing-library/cypress@9.0.0(cypress@12.17.4): resolution: {integrity: sha512-c1XiCGeHGGTWn0LAU12sFUfoX3qfId5gcSE2yHode+vsyHDWraxDPALjVnHd4/Fa3j4KBcc5k++Ccy6A9qnkMA==} engines: {node: '>=12', npm: '>=6'} @@ -17059,7 +17089,6 @@ packages: /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - dev: false /commitizen@4.3.0(typescript@4.9.5): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} @@ -21002,7 +21031,6 @@ packages: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - dev: false /fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} @@ -21842,6 +21870,39 @@ packages: hardhat: 2.18.3(ts-node@10.9.1)(typescript@4.9.5) dev: true + /hardhat-deploy@0.11.45: + resolution: {integrity: sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@types/qs': 6.9.9 + axios: 0.21.4(debug@4.3.4) + chalk: 4.1.2 + chokidar: 3.5.3 + debug: 4.3.4(supports-color@8.1.1) + enquirer: 2.4.1 + ethers: 5.7.2 + form-data: 4.0.0 + fs-extra: 10.1.0 + match-all: 1.2.6 + murmur-128: 0.2.1 + qs: 6.11.2 + zksync-web3: 0.14.4(ethers@5.7.2) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /hardhat-gas-reporter@1.0.9(hardhat@2.18.3): resolution: {integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==} peerDependencies: @@ -26340,6 +26401,10 @@ packages: hasBin: true dev: true + /match-all@1.2.6: + resolution: {integrity: sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==} + dev: true + /matchstick-as@0.6.0: resolution: {integrity: sha512-E36fWsC1AbCkBFt05VsDDRoFvGSdcZg6oZJrtIe/YDBbuFh8SKbR5FcoqDhNWqSN+F7bN/iS2u8Md0SM+4pUpw==} dependencies: @@ -32683,6 +32748,30 @@ packages: rimraf: 2.6.3 dev: false + /tenderly@0.8.0(ts-node@10.9.1)(typescript@5.3.3): + resolution: {integrity: sha512-4Faw9jkwMuBOva82lAtvhTa9isc503GkWwVWSsR8ONm+i3SeFatv7hNyYPZIifQBeuU9GOVNkWHCAXon6NE/aw==} + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + dependencies: + axios: 0.27.2(debug@4.3.4) + cli-table3: 0.6.3 + commander: 9.5.0 + js-yaml: 4.1.0 + open: 8.4.2 + prompts: 2.4.2 + ts-node: 10.9.1(@types/node@18.18.7)(typescript@5.3.3) + tslog: 4.9.2 + typescript: 5.3.3 + transitivePeerDependencies: + - debug + dev: true + /terser-webpack-plugin@5.3.9(webpack@5.89.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} @@ -33176,6 +33265,37 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + /ts-node@10.9.1(@types/node@18.18.7)(typescript@5.3.3): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.18.7 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.3.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + /ts-node@10.9.1(@types/node@20.5.1)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -33262,6 +33382,11 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslog@4.9.2: + resolution: {integrity: sha512-wBM+LRJoNl34Bdu8mYEFxpvmOUedpNUwMNQB/NcuPIZKwdDde6xLHUev3bBjXQU7gdurX++X/YE7gLH8eXYsiQ==} + engines: {node: '>=16'} + dev: true + /tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} @@ -33566,6 +33691,12 @@ packages: engines: {node: '>=14.17'} hasBin: true + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} @@ -35791,6 +35922,15 @@ packages: requiresBuild: true dev: false + /zksync-web3@0.14.4(ethers@5.7.2): + resolution: {integrity: sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg==} + deprecated: This package has been deprecated in favor of zksync-ethers@5.0.0 + peerDependencies: + ethers: ^5.7.0 + dependencies: + ethers: 5.7.2 + dev: true + /zod-to-json-schema@3.21.4(zod@3.22.4): resolution: {integrity: sha512-fjUZh4nQ1s6HMccgIeE0VP4QG/YRGPmyjO9sAh890aQKPEk3nqbfUXhMFaC+Dr5KvYBm8BCyvfpZf2jY9aGSsw==} peerDependencies: From f391c1adb9746a1fa2e9cbbcb49556ceca9f236f Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 4 Jan 2024 14:29:07 +0100 Subject: [PATCH 068/118] chore(report): add audit report and init comments --- contracts/audits/marketplace/Hypercerts_v02.md | 9 +++++++++ .../audits/marketplace/Hypercerts_v02.pdf | Bin 0 -> 549131 bytes 2 files changed, 9 insertions(+) create mode 100644 contracts/audits/marketplace/Hypercerts_v02.md create mode 100644 contracts/audits/marketplace/Hypercerts_v02.pdf diff --git a/contracts/audits/marketplace/Hypercerts_v02.md b/contracts/audits/marketplace/Hypercerts_v02.md new file mode 100644 index 00000000..c2a078ec --- /dev/null +++ b/contracts/audits/marketplace/Hypercerts_v02.md @@ -0,0 +1,9 @@ +### TRST-H-1 A buyer can purchase more token units than the seller intended + +We acknowledge that the user can increase the amounts of units during the sale periode, potentially leading to a sale of +more units than the seller intended. This is a risk that is inherent to the design of the strategy. We've updated the +documentation to reflect this risk. + +The risk can be mitigated by splitting the fraction between units to sell and units to hold. + +### TRST-H-3 When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected diff --git a/contracts/audits/marketplace/Hypercerts_v02.pdf b/contracts/audits/marketplace/Hypercerts_v02.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fe254b716db477d0449866c41c3936eb01e3d81f GIT binary patch literal 549131 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

    Z1PsId{~x7cRI(P~ml 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 z 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


    fEY3N0b%w+r?%C~S}aF`V#*#!eP-%S!2g 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
    8mBkZ3-IAsZM~c=N43@f^IfYG{o{4onb|pQ>#7* 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 z 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%0DvjM0014ETM@ZN|w;da4xRs`A+ti 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 literal 0 HcmV?d00001 From 8547cdc7caf6e37599ef1badd67c36315a47ca42 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 4 Jan 2024 14:30:04 +0100 Subject: [PATCH 069/118] chore(deploy): add looksrare registry and sep weth --- contracts/hardhat.config.ts | 1 + .../deployment-marketplace-sepolia.json | 71 ++++---- contracts/src/deployments/index.ts | 2 - contracts/src/index.ts | 6 - .../libraries/RoyaltyFeeRegistry.sol | 88 ++++++++++ contracts/tasks/deploy-marketplace.ts | 164 ++++++++++++------ 6 files changed, 239 insertions(+), 93 deletions(-) create mode 100644 contracts/src/marketplace/libraries/RoyaltyFeeRegistry.sol diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index a46543f9..11aba0c6 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -122,6 +122,7 @@ const config: HardhatUserConfig = { "StrategyHypercertFractionOffer", "StrategyItemIdsRange", "CreatorFeeManagerWithRoyalties", + "RoyaltyFeeRegistry", ], except: ["@openzeppelin"], }, diff --git a/contracts/src/deployments/deployment-marketplace-sepolia.json b/contracts/src/deployments/deployment-marketplace-sepolia.json index 04b5235e..321c4af0 100644 --- a/contracts/src/deployments/deployment-marketplace-sepolia.json +++ b/contracts/src/deployments/deployment-marketplace-sepolia.json @@ -1,84 +1,91 @@ { "TransferManager": { - "address": "0x2aDc7d015701e347C75415477dEb0203C36E082e", + "address": "0xF0983523e44A0c1EE3a02E7F6e7E53A3FBc52aD8", "fullNamespace": "TransferManager", "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a"], "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", - "tx": "0x0c0e82c9548a8f7ccda38f9bb1727a1ff28bf2c52404017bf021ccae694defa8" + "tx": "0x9201deac4acc079637fd8550c3b23ca0991150bf87943afd6c8f14ecddd3621f" }, "ProtocolFeeRecipient": { - "address": "0xE2eDDB38CA8660Aee27F5a268D572cC160Cc8214", + "address": "0x76DB24D89EEe9f1E591A43C734a0a04A6762a29e", "fullNamespace": "ProtocolFeeRecipient", - "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6"], - "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199ab4fbf271143f4fbf7b91a5ded31805e42b2208d6", - "tx": "0x539e0ddfc830afe54c8ad7afbf54cb20b58590cdd2f720426ff2981146926b53" + "args": ["0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", "0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9"], + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a7b79995e5f793a07bc00c21412e50ecae098e7f9", + "tx": "0x527753c230b7d8673a79c8b3aa5ca9b0ce75180cb378760d3af1db793293559c" }, "HypercertExchange": { - "address": "0x7d7b6011c7BaB5A850Bd44f7A5B29C3502fd6491", + "address": "0xfCC76C05867dad129f1D89a593Da8d55821084Eb", "fullNamespace": "LooksRareProtocol", "args": [ "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a", - "0xE2eDDB38CA8660Aee27F5a268D572cC160Cc8214", - "0x2aDc7d015701e347C75415477dEb0203C36E082e", - "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6" + "0x76DB24D89EEe9f1E591A43C734a0a04A6762a29e", + "0xF0983523e44A0c1EE3a02E7F6e7E53A3FBc52aD8", + "0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9" ], - "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199ae2eddb38ca8660aee27f5a268d572cc160cc82142adc7d015701e347c75415477deb0203c36e082eb4fbf271143f4fbf7b91a5ded31805e42b2208d6", - "tx": "0xc98391c8ac0f7fcb61c74656fdd2f51d948fe509961b41dbd07a7f1c1a489204" + "encodedArgs": "0xdf2c3dace6f31e650fd03b8ff72bee82cb1c199a76db24d89eee9f1e591a43c734a0a04a6762a29ef0983523e44a0c1ee3a02e7f6e7e53a3fbc52ad87b79995e5f793a07bc00c21412e50ecae098e7f9", + "tx": "0x12adf8ad8166b6df9c506c9f09091e3903785c98e175099b5c962f3d5a459d78" + }, + "RoyaltyFeeRegistry": { + "address": "0xa0C9e21e18A6Eff0ea075325Ec71c4f95b0DE5C4", + "fullNamespace": "RoyaltyFeeRegistry", + "args": ["1000"], + "encodedArgs": "0x00000000000000000000000000000000000000000000000000000000000003e8", + "tx": "0x2682f3c13de931f47baebf864a66727183121e82f22e8d97008864d90e023f59" }, "OrderValidator": { - "address": "0xff9ef4786bf31158ba152638746c2a678d2c4ade", + "address": "0x45cae10e94d31f9d04f007fafd989d2cf7193ba6", "fullNamespace": "OrderValidatorV2A", - "args": ["0x7d7b6011c7BaB5A850Bd44f7A5B29C3502fd6491"], - "encodedArgs": "0x7d7b6011c7bab5a850bd44f7a5b29c3502fd6491", - "tx": "0x06b247d48d9d3bfbc88216606815dbbb541b8c0e0a37992ba44de328fea0986f" + "args": ["0xfCC76C05867dad129f1D89a593Da8d55821084Eb"], + "encodedArgs": "0xfcc76c05867dad129f1d89a593da8d55821084eb", + "tx": "0xdb0798ea42157958e194e82afeb10474ae147c46a5eac3ad080252cff8f62fc8" }, "CreatorFeeManager": { - "address": "0x37a6fd35b38419258b3c30e523d39b73084beb4e", + "address": "0xe9179d10249b5c20412f8421eee2c0177f0a3beb", "fullNamespace": "CreatorFeeManagerWithRoyalties", - "args": ["0x12405dB79325D06a973aD913D6e9BdA1343cD526"], - "encodedArgs": "0x12405db79325d06a973ad913d6e9bda1343cd526", - "tx": "0x308a623f8fca6501b8ead30b645e7235752a3784d676b90803b4eb09414e5877" + "args": ["0xa0C9e21e18A6Eff0ea075325Ec71c4f95b0DE5C4"], + "encodedArgs": "0xa0c9e21e18a6eff0ea075325ec71c4f95b0de5c4", + "tx": "0xcde3521039b8a9382b5c94e364add8d0a8ea8db8cf66b6b5cd3de2b22c565221" }, "StrategyCollectionOffer": { - "address": "0x4113412bc98cb0b85b556c3ba041429a8699fb7f", + "address": "0xc7c884c81740a3ec1e6cbf0d1aea1991f7ddf4b8", "fullNamespace": "StrategyCollectionOffer", "args": [], "encodedArgs": "0x", - "tx": "0x3069ce4356ec284fe0897f7a0617ce9f5b8246dac361403e1e957deac30bab11" + "tx": "0xf8c202c2fc6978b2d48314594739918fa77db4552aa2b2baef8e7839133b5c10" }, "StrategyDutchAuction": { - "address": "0x8b6619c3641f8eb8a8ae0560a7f4e549e59f73ea", + "address": "0x1c91994909fb224b89dbb42e0f62ced998bdea21", "fullNamespace": "StrategyDutchAuction", "args": [], "encodedArgs": "0x", - "tx": "0x4ff7a0bdf19b5bdb0cd585bddcbe685c3e41eb8ed3125888d9f6201d32584bfe" + "tx": "0xae44f43b2641cab5105f05ff97fe7874f882d2d77a1c56db307d3b89dcbc80a9" }, "StrategyItemIdsRange": { - "address": "0x9874463e1821d8f8de3eb84fc91e7c10e14bfa83", + "address": "0x853da9e437b360f5f1a45e3f21104ab776398f67", "fullNamespace": "StrategyItemIdsRange", "args": [], "encodedArgs": "0x", - "tx": "0xeaafc39b109fb79f618904572d2f92c1fbde52cdf70fbd9fc16c09d7b4f2ddfd" + "tx": "0x38875ae84530c89685b0b4ce778fadd6e0d0da4552f706d89f509faf8bbb579a" }, "StrategyHypercertCollectionOffer": { - "address": "0xe551b176fdcb2ede7a01b21986f75072e98c4eff", + "address": "0x919e0638b1915784c6eb012f716013089fed036e", "fullNamespace": "StrategyHypercertCollectionOffer", "args": [], "encodedArgs": "0x", - "tx": "0x8cd8164195472bfe2a84fcbe6452ce5ac0ff9bbab5a972d72be2198b6192933a" + "tx": "0x11080958f3e75da847f8c6fbcb911db02e553e2febca7f8ccf4769fd2da1d7b9" }, "StrategyHypercertDutchAuction": { - "address": "0x1404f57e11b98b08501c32aa163b4d18681708bf", + "address": "0x25370812dbe35ce2665605cf0bc206c3395180a9", "fullNamespace": "StrategyHypercertDutchAuction", "args": [], "encodedArgs": "0x", - "tx": "0xb62474f026fe9969a8869bed55564c5fa4320dca51835cd1de019e3cc57e6d70" + "tx": "0x43564e0766be9a537f34fe9e0e4937d3abb9725c033f2fee0cbabbfb6b8023a3" }, "StrategyHypercertFractionOffer": { - "address": "0x9ec492f34707b591c4b6dc1c76acad722df4a9ad", + "address": "0xdfa561b7ef886c4daedfbd64f6965eb04c520aea", "fullNamespace": "StrategyHypercertFractionOffer", "args": [], "encodedArgs": "0x", - "tx": "0x7e48f304ec8dd9532541288429afeef786bc7ae3d9194354fdbc72442c58e9bd" + "tx": "0x29e124fea536fde38ceb5cad9641c64140547cbf737363d0415f444b544eab54" } } diff --git a/contracts/src/deployments/index.ts b/contracts/src/deployments/index.ts index 8adbeb2c..6ec8096b 100644 --- a/contracts/src/deployments/index.ts +++ b/contracts/src/deployments/index.ts @@ -1,9 +1,7 @@ -import deployments_marketplace_goerli from "./deployment-marketplace-goerli.json"; import deployments_marketplace_sepolia from "./deployment-marketplace-sepolia.json"; import deployments_protocol from "./deployments-protocol.json"; const deployments_marketplace = { - "5": deployments_marketplace_goerli, "11155111": deployments_marketplace_sepolia, }; diff --git a/contracts/src/index.ts b/contracts/src/index.ts index ee478287..99200025 100644 --- a/contracts/src/index.ts +++ b/contracts/src/index.ts @@ -49,12 +49,6 @@ export type DeployedChains = keyof typeof DEPLOYMENTS.protocol; // Deployments const deployments = { - 5: { - ...DEPLOYMENTS.protocol["5"], - HypercertExchange: DEPLOYMENTS.marketplace[5].HypercertExchange.address, - TransferManager: DEPLOYMENTS.marketplace[5].TransferManager.address, - OrderValidatorV2A: DEPLOYMENTS.marketplace[5].OrderValidator.address, - }, 10: { ...DEPLOYMENTS.protocol["10"], }, diff --git a/contracts/src/marketplace/libraries/RoyaltyFeeRegistry.sol b/contracts/src/marketplace/libraries/RoyaltyFeeRegistry.sol new file mode 100644 index 00000000..321dea59 --- /dev/null +++ b/contracts/src/marketplace/libraries/RoyaltyFeeRegistry.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; + +import {IRoyaltyFeeRegistry} from "../interfaces/IRoyaltyFeeRegistry.sol"; + +/** + * @title RoyaltyFeeRegistry + * @notice It is a royalty fee registry for the LooksRare exchange. + */ +contract RoyaltyFeeRegistry is IRoyaltyFeeRegistry, Ownable { + struct FeeInfo { + address setter; + address receiver; + uint256 fee; + } + + // Limit (if enforced for fee royalty in percentage (10,000 = 100%) + uint256 public royaltyFeeLimit; + + mapping(address => FeeInfo) private _royaltyFeeInfoCollection; + + event NewRoyaltyFeeLimit(uint256 royaltyFeeLimit); + event RoyaltyFeeUpdate(address indexed collection, address indexed setter, address indexed receiver, uint256 fee); + + /** + * @notice Constructor + * @param _royaltyFeeLimit new royalty fee limit (500 = 5%, 1,000 = 10%) + */ + constructor(uint256 _royaltyFeeLimit) { + require(_royaltyFeeLimit <= 9500, "Owner: Royalty fee limit too high"); + royaltyFeeLimit = _royaltyFeeLimit; + } + + /** + * @notice Update royalty info for collection + * @param _royaltyFeeLimit new royalty fee limit (500 = 5%, 1,000 = 10%) + */ + function updateRoyaltyFeeLimit(uint256 _royaltyFeeLimit) external onlyOwner { + require(_royaltyFeeLimit <= 9500, "Owner: Royalty fee limit too high"); + royaltyFeeLimit = _royaltyFeeLimit; + + emit NewRoyaltyFeeLimit(_royaltyFeeLimit); + } + + /** + * @notice Update royalty info for collection + * @param collection address of the NFT contract + * @param setter address that sets the receiver + * @param receiver receiver for the royalty fee + * @param fee fee (500 = 5%, 1,000 = 10%) + */ + function updateRoyaltyInfoForCollection(address collection, address setter, address receiver, uint256 fee) + external + onlyOwner + { + require(fee <= royaltyFeeLimit, "Registry: Royalty fee too high"); + _royaltyFeeInfoCollection[collection] = FeeInfo({setter: setter, receiver: receiver, fee: fee}); + + emit RoyaltyFeeUpdate(collection, setter, receiver, fee); + } + + /** + * @notice Calculate royalty info for a collection address and a sale gross amount + * @param collection collection address + * @param amount amount + * @return receiver address and amount received by royalty recipient + */ + function royaltyInfo(address collection, uint256 amount) external view override returns (address, uint256) { + return ( + _royaltyFeeInfoCollection[collection].receiver, + (amount * _royaltyFeeInfoCollection[collection].fee) / 10_000 + ); + } + + /** + * @notice View royalty info for a collection address + * @param collection collection address + */ + function royaltyFeeInfoCollection(address collection) external view returns (address, address, uint256) { + return ( + _royaltyFeeInfoCollection[collection].setter, + _royaltyFeeInfoCollection[collection].receiver, + _royaltyFeeInfoCollection[collection].fee + ); + } +} diff --git a/contracts/tasks/deploy-marketplace.ts b/contracts/tasks/deploy-marketplace.ts index d7642582..42ead511 100644 --- a/contracts/tasks/deploy-marketplace.ts +++ b/contracts/tasks/deploy-marketplace.ts @@ -10,53 +10,14 @@ import { PublicClient, } from "viem"; import { writeFile } from "node:fs/promises"; -import creatorFeeManagerContract from "../artifacts/src/marketplace/CreatorFeeManagerWithRoyalties.sol/CreatorFeeManagerWithRoyalties.json"; -import exchangeContract from "../artifacts/src/marketplace/LooksRareProtocol.sol/LooksRareProtocol.json"; -import transferManagerContract from "../artifacts/src/marketplace/TransferManager.sol/TransferManager.json"; -import orderValidatorContract from "../artifacts/src/marketplace/helpers/OrderValidatorV2A.sol/OrderValidatorV2A.json"; -import strategyCollectionOfferContract from "../artifacts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol/StrategyCollectionOffer.json"; -import strategyDutchAuctionContract from "../artifacts/src/marketplace/executionStrategies/StrategyDutchAuction.sol/StrategyDutchAuction.json"; -import strategyItemIdsRangeContract from "../artifacts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol/StrategyItemIdsRange.json"; -import strategyHypercertCollectionOfferContract from "../artifacts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol/StrategyHypercertCollectionOffer.json"; -import strategyHypercertDutchAuctionContract from "../artifacts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol/StrategyHypercertDutchAuction.json"; -import strategyHypercertFractionOfferContract from "../artifacts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol/StrategyHypercertFractionOffer.json"; -import protocolFeeRecipientContract from "../artifacts/src/marketplace/ProtocolFeeRecipient.sol/ProtocolFeeRecipient.json"; - -const strategies = [ - { - contract: strategyCollectionOfferContract, - name: "StrategyCollectionOffer", - strategies: [ - "executeCollectionStrategyWithTakerAsk", - "executeCollectionStrategyWithTakerAskWithProof", - "executeCollectionStrategyWithTakerAskWithAllowlist", - ], - }, - { contract: strategyDutchAuctionContract, name: "StrategyDutchAuction", strategies: ["executeStrategyWithTakerBid"] }, - { contract: strategyItemIdsRangeContract, name: "StrategyItemIdsRange", strategies: ["executeStrategyWithTakerAsk"] }, - { - contract: strategyHypercertCollectionOfferContract, - name: "StrategyHypercertCollectionOffer", - strategies: [ - "executeHypercertCollectionStrategyWithTakerAsk", - "executeHypercertCollectionStrategyWithTakerAskWithProof", - "executeHypercertCollectionStrategyWithTakerAskWithAllowlist", - ], - }, - { - contract: strategyHypercertDutchAuctionContract, - name: "StrategyHypercertDutchAuction", - strategies: ["executeStrategyWithTakerBid"], - }, - { - contract: strategyHypercertFractionOfferContract, - name: "StrategyHypercertFractionOffer", - strategies: [ - "executeHypercertFractionStrategyWithTakerBid", - "executeHypercertFractionStrategyWithTakerBidWithAllowlist", - ], - }, -]; + +type WETHType = { sepolia: string; [key: string]: string }; + +const WETH: WETHType = { + localhost: "0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9", //dummy + hardhat: "0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9", //dummy + sepolia: "0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9", +}; const getCreate2Address = async ( deployer: WalletClient, @@ -120,7 +81,11 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") const { ethers, network, run, viem } = hre; const owner = "0xdf2C3dacE6F31e650FD03B8Ff72beE82Cb1C199A"; const create2Address = "0x0000000000ffe8b47b3e2130213b802212439497"; - const wethAddress = "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6"; + const wethAddress = WETH[network.name]; + + if (!wethAddress) { + throw new Error("WETH address not found for network"); + } const publicClient = await viem.getPublicClient(); const [deployer] = await viem.getWalletClients(); @@ -134,7 +99,7 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") const _minTotalFeeBp = 50; const _maxProtocolFeeBp = 200; - const releaseCounter = "v0.3"; + const releaseCounter = "v0.4"; const salt = slice( encodePacked(["address", "string", "address"], [deployer.account?.address, releaseCounter, create2Address]), @@ -145,6 +110,65 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") const contracts: ContractDeployments = {}; + const creatorFeeManagerContract = await hre.artifacts.readArtifact("CreatorFeeManagerWithRoyalties"); + const exchangeContract = await hre.artifacts.readArtifact("LooksRareProtocol"); + const transferManagerContract = await hre.artifacts.readArtifact("TransferManager"); + const orderValidatorContract = await hre.artifacts.readArtifact("OrderValidatorV2A"); + const strategyCollectionOfferContract = await hre.artifacts.readArtifact("StrategyCollectionOffer"); + const strategyDutchAuctionContract = await hre.artifacts.readArtifact("StrategyDutchAuction"); + const strategyItemIdsRangeContract = await hre.artifacts.readArtifact("StrategyItemIdsRange"); + const strategyHypercertCollectionOfferContract = await hre.artifacts.readArtifact( + "StrategyHypercertCollectionOffer", + ); + const strategyHypercertDutchAuctionContract = await hre.artifacts.readArtifact("StrategyHypercertDutchAuction"); + const strategyHypercertFractionOfferContract = await hre.artifacts.readArtifact("StrategyHypercertFractionOffer"); + const protocolFeeRecipientContract = await hre.artifacts.readArtifact("ProtocolFeeRecipient"); + const royaltyFeeRegistryContract = await hre.artifacts.readArtifact("RoyaltyFeeRegistry"); + + const strategies = [ + { + contract: strategyCollectionOfferContract, + name: "StrategyCollectionOffer", + strategies: [ + "executeCollectionStrategyWithTakerAsk", + "executeCollectionStrategyWithTakerAskWithProof", + "executeCollectionStrategyWithTakerAskWithAllowlist", + ], + }, + { + contract: strategyDutchAuctionContract, + name: "StrategyDutchAuction", + strategies: ["executeStrategyWithTakerBid"], + }, + { + contract: strategyItemIdsRangeContract, + name: "StrategyItemIdsRange", + strategies: ["executeStrategyWithTakerAsk"], + }, + { + contract: strategyHypercertCollectionOfferContract, + name: "StrategyHypercertCollectionOffer", + strategies: [ + "executeHypercertCollectionStrategyWithTakerAsk", + "executeHypercertCollectionStrategyWithTakerAskWithProof", + "executeHypercertCollectionStrategyWithTakerAskWithAllowlist", + ], + }, + { + contract: strategyHypercertDutchAuctionContract, + name: "StrategyHypercertDutchAuction", + strategies: ["executeStrategyWithTakerBid"], + }, + { + contract: strategyHypercertFractionOfferContract, + name: "StrategyHypercertFractionOffer", + strategies: [ + "executeHypercertFractionStrategyWithTakerBid", + "executeHypercertFractionStrategyWithTakerBidWithAllowlist", + ], + }, + ]; + // Create2 Transfermanager const transferManagerArgs = [deployer.account.address]; const transferManagerCreate2 = await getCreate2Address( @@ -190,11 +214,24 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") salt, ); - const orderValidatorArgs = [hypercertsExchangeCreate2.address]; + // Create2 RoyaltyFeeManager + const royaltyFeeRegistryArgs = ["1000"]; + + const royaltyFeeRegistryCreate2 = await getCreate2Address( + deployer, + create2Address, + encodeDeployData({ + abi: royaltyFeeRegistryContract.abi, + bytecode: royaltyFeeRegistryContract.bytecode as `0x${string}`, + args: royaltyFeeRegistryArgs, + }), + salt, + ); console.log("Calculated exchange address using CREATE2: ", hypercertsExchangeCreate2.address); console.log("Calculated transferManager address using CREATE2: ", transferManagerCreate2.address); console.log("Calculated protocolFeeRecipient address using CREATE2: ", protocolFeeRecipientCreate2.address); + console.log("Calculated royaltyFeeRegistry address using CREATE2: ", royaltyFeeRegistryCreate2.address); // Deploy transferManager const transferManagerTx = await runCreate2Deployment( @@ -253,6 +290,23 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") tx: hypercertsExchangeTx, }; + // Deploy RoyaltyFeeRegistry + const royaltyFeeRegistryTx = await runCreate2Deployment( + publicClient, + create2Instance, + "RoyaltyFeeRegistry", + royaltyFeeRegistryCreate2, + royaltyFeeRegistryArgs, + ); + + contracts.RoyaltyFeeRegistry = { + address: royaltyFeeRegistryCreate2.address, + fullNamespace: "RoyaltyFeeRegistry", + args: royaltyFeeRegistryArgs, + encodedArgs: solidityPacked(["uint256"], royaltyFeeRegistryArgs), + tx: royaltyFeeRegistryTx, + }; + // Allow Exchange as operator on transferManager const transferManagerInstance = getContract({ address: transferManagerCreate2.address, @@ -263,6 +317,8 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") // Deploy OrderValidator + const orderValidatorArgs = [hypercertsExchangeCreate2.address]; + const deployOrderValidator = await deployer.deployContract({ abi: orderValidatorContract.abi, account: deployer.account, @@ -289,10 +345,12 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") }; // Deploy CreatorFeeManager + + const creatorFeeManagerArgs = [royaltyFeeRegistryCreate2.address]; const deployCreatorFeeManager = await deployer.deployContract({ abi: creatorFeeManagerContract.abi, account: deployer.account, - args: ["0x12405dB79325D06a973aD913D6e9BdA1343cD526"], + args: creatorFeeManagerArgs, bytecode: creatorFeeManagerContract.bytecode as `0x${string}`, }); @@ -309,8 +367,8 @@ task("deploy-marketplace", "Deploy marketplace contracts and verify") contracts.CreatorFeeManager = { address: creatorFeeManagerTx.contractAddress, fullNamespace: "CreatorFeeManagerWithRoyalties", - args: ["0x12405dB79325D06a973aD913D6e9BdA1343cD526"], - encodedArgs: solidityPacked(["address"], ["0x12405dB79325D06a973aD913D6e9BdA1343cD526"]), + args: creatorFeeManagerArgs, + encodedArgs: solidityPacked(["address"], creatorFeeManagerArgs), tx: creatorFeeManagerTx.transactionHash, }; From 5a2392451f932bc3c920b8d84a0d05cf921fc5d6 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Thu, 4 Jan 2024 20:56:39 +0100 Subject: [PATCH 070/118] fix(audit): additional findings --- .../audits/marketplace/Hypercerts_v02.md | 64 +++++++++++++++++-- .../StrategyHypercertFractionOffer.sol | 42 ++++++++---- 2 files changed, 90 insertions(+), 16 deletions(-) diff --git a/contracts/audits/marketplace/Hypercerts_v02.md b/contracts/audits/marketplace/Hypercerts_v02.md index c2a078ec..ba4bce67 100644 --- a/contracts/audits/marketplace/Hypercerts_v02.md +++ b/contracts/audits/marketplace/Hypercerts_v02.md @@ -1,9 +1,65 @@ ### TRST-H-1 A buyer can purchase more token units than the seller intended We acknowledge that the user can increase the amounts of units during the sale periode, potentially leading to a sale of -more units than the seller intended. This is a risk that is inherent to the design of the strategy. We've updated the -documentation to reflect this risk. - -The risk can be mitigated by splitting the fraction between units to sell and units to hold. +more units than the seller intended. This is a risk that is inherent to the design of the strategy. However, this would +require the user to actively increase the amount of units during the sale periode, which is not a common use case. ### TRST-H-3 When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected + +> This would end up transferring ownership of the Hypercert, but it never checks that the unitsPerItem declared in the +> maker bid is actually transferred. A malicious user can transfer all but one unit out of the tokenID to complete the +> exploit. + +> Note that Hypercerts units can be donated to other tokenIDs inside the same base type. This means that any logic that +> assumes an order maker’s token amount is controlled by them is fragile. + +The hypercerts protocol does not allow for transfering of units, or merging of fractions, between fractions not held by +the owner or without approval provided by the owner (i.e. `isApprovedForAll`). As such, the attacker would be either an +entity with allowance over the fractions held by the owner, or the owner itself. + +### TRST-M-2 Fraction offers can be blocked from being fully fulfilled + +> Note that if sellLeftover is true, there is no check for unitAmount < minUnitAmount. However this check should still +> be applied in all but the last sale. In the current implementation, the minUnitAmount becomes devoid of meaning + +The checks have been updated to explicity handle the `sellLeftover` case. For readibility, the checks have been split +and made more verbose, where the check +`(IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep` is duplicated. + +```solidity + // Check on prices + if (pricePerUnit < makerAsk.price || makerAsk.price == 0) { + revert OrderInvalid(); + } + + // Check on unitAmount except for selling leftover units + if (minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount > maxUnitAmount) { + revert OrderInvalid(); + } + + // Handle the case where the user wants to sell the leftover units (to prevent dusting) + if (sellLeftover) { + // If the unitAmount is lower than the specified minUnitAmount to sell + if (unitAmount < minUnitAmount) { + // We expect to sale to be executed only if the units held are equal to the minUnitsToKeep + if (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount != minUnitsToKeep) { + revert OrderInvalid(); + } + } else { + // Don't allow the sale to let the units held get below the minUnitsToKeep + if ((IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep) { + revert OrderInvalid(); + } + } + } else { + // If selling the leftover is not allowed, the unitAmount must not be smaller than the minUnitAmount + if (unitAmount < minUnitAmount) { + revert OrderInvalid(); + } + + // Don't allow the sale to let the units held get below the minUnitsToKeep + if ((IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep) { + revert OrderInvalid(); + } + } +``` diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol index b15fe31d..05697719 100644 --- a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol +++ b/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol @@ -69,7 +69,6 @@ contract StrategyHypercertFractionOffer is BaseStrategy { returns (uint256 price, uint256[] memory itemIds, uint256[] memory amounts, bool isNonceInvalidated) { itemIds = makerAsk.itemIds; - // A collection order can only be executable for 1 itemId but the actual quantity to fill can vary if (makerAsk.amounts.length != 1 || itemIds.length != 1) { revert LengthsInvalid(); @@ -87,20 +86,38 @@ contract StrategyHypercertFractionOffer is BaseStrategy { (uint256 minUnitAmount, uint256 maxUnitAmount, uint256 minUnitsToKeep, bool sellLeftover) = abi.decode(makerAsk.additionalParameters, (uint256, uint256, uint256, bool)); + // Check on prices + if (pricePerUnit < makerAsk.price || makerAsk.price == 0) { + revert OrderInvalid(); + } + + // Check on unitAmount except for selling leftover units + if (minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount > maxUnitAmount) { + revert OrderInvalid(); + } + + // Handle the case where the user wants to sell the leftover units (to prevent dusting) if (sellLeftover) { - if ( - minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount > maxUnitAmount - || pricePerUnit < makerAsk.price || makerAsk.price == 0 - || (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep - ) { - revert OrderInvalid(); + // If the unitAmount is lower than the specified minUnitAmount to sell + if (unitAmount < minUnitAmount) { + // We expect to sale to be executed only if the units held are equal to the minUnitsToKeep + if (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount != minUnitsToKeep) { + revert OrderInvalid(); + } + } else { + // Don't allow the sale to let the units held get below the minUnitsToKeep + if ((IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep) { + revert OrderInvalid(); + } } } else { - if ( - minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount < minUnitAmount - || unitAmount > maxUnitAmount || pricePerUnit < makerAsk.price || makerAsk.price == 0 - || (IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep - ) { + // If selling the leftover is not allowed, the unitAmount must not be smaller than the minUnitAmount + if (unitAmount < minUnitAmount) { + revert OrderInvalid(); + } + + // Don't allow the sale to let the units held get below the minUnitsToKeep + if ((IHypercertToken(makerAsk.collection).unitsOf(itemIds[0]) - unitAmount) < minUnitsToKeep) { revert OrderInvalid(); } } @@ -158,6 +175,7 @@ contract StrategyHypercertFractionOffer is BaseStrategy { // A collection order can only be executable for 1 itemId but quantity to fill can vary if (sellLeftover) { + // Allow for selling a fraction holding units lower if ( minUnitAmount > maxUnitAmount || unitAmount == 0 || unitAmount > maxUnitAmount || pricePerUnit < makerAsk.price || makerAsk.price == 0 From 6d6e4f2da600034c044b829842c96e0346180a04 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 8 Jan 2024 01:22:29 +0100 Subject: [PATCH 071/118] feat(apis): refactor to use hypercerts APIs --- pnpm-lock.yaml | 67 ++- sdk/RELEASE.md | 10 + sdk/package.json | 6 +- sdk/src/client.ts | 46 +- sdk/src/constants.ts | 9 +- sdk/src/index.ts | 3 +- sdk/src/indexer/gql/graphql.ts | 569 ++++++++++++++++++++++ sdk/src/storage.ts | 159 ++---- sdk/src/types/client.ts | 25 +- sdk/src/utils/allowlist.ts | 10 +- sdk/src/utils/apis.ts | 53 ++ sdk/src/utils/config.ts | 14 - sdk/src/utils/fetchers.ts | 12 +- sdk/src/utils/index.ts | 6 +- sdk/src/validator/index.ts | 10 +- sdk/test/client/allowlist.minting.test.ts | 40 +- sdk/test/client/minting.test.ts | 21 +- sdk/test/storage.test.ts | 47 +- sdk/test/storage/nft.storage.test.ts | 82 ---- sdk/test/storage/storeAllowList.test.ts | 71 +++ sdk/test/storage/storeMetadata.test.ts | 60 +++ sdk/test/storage/web3.storage.test.ts | 44 -- sdk/test/utils/config.test.ts | 64 --- sdk/test/utils/errors.test.ts | 14 +- 24 files changed, 958 insertions(+), 484 deletions(-) create mode 100644 sdk/src/utils/apis.ts delete mode 100644 sdk/test/storage/nft.storage.test.ts create mode 100644 sdk/test/storage/storeAllowList.test.ts create mode 100644 sdk/test/storage/storeMetadata.test.ts delete mode 100644 sdk/test/storage/web3.storage.test.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d21a199f..798540f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -566,7 +566,7 @@ importers: version: 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': specifier: 1.0.0 - version: 1.0.0(ts-node@10.9.1)(typescript@5.3.2) + version: link:../contracts '@openzeppelin/merkle-tree': specifier: ^1.0.5 version: 1.0.5 @@ -581,7 +581,7 @@ importers: version: 8.12.0 axios: specifier: ^1.6.2 - version: 1.6.2(debug@4.3.4) + version: 1.6.2 dotenv: specifier: ^16.0.3 version: 16.3.1 @@ -594,18 +594,12 @@ importers: loglevel: specifier: ^1.8.1 version: 1.8.1 - nft.storage: - specifier: ^7.1.1 - version: 7.1.1(node-fetch@3.3.2) urql: specifier: ^4.0.6 version: 4.0.6(graphql@16.8.1)(react@18.2.0) viem: specifier: ^1.19.9 version: 1.19.9(typescript@5.3.2) - web3.storage: - specifier: ^4.5.5 - version: 4.5.5(node-fetch@3.3.2) devDependencies: '@babel/core': specifier: ^7.23.5 @@ -6687,7 +6681,7 @@ packages: graphql-ws: 5.14.2(graphql@16.8.1) isomorphic-ws: 5.0.0(ws@8.14.2) tslib: 2.6.2 - ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.14.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -6756,7 +6750,7 @@ packages: graphql: 16.8.1 isomorphic-ws: 5.0.0(ws@8.14.2) tslib: 2.6.2 - ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.14.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -7172,7 +7166,7 @@ packages: isomorphic-ws: 5.0.0(ws@8.14.2) tslib: 2.6.2 value-or-promise: 1.0.12 - ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.14.2 transitivePeerDependencies: - '@types/node' - bufferutil @@ -7330,18 +7324,6 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/contracts@1.0.0(ts-node@10.9.1)(typescript@5.3.2): - resolution: {integrity: sha512-pGdG3BGDz93IZXAAHcvwzRQOMgi9dOzy2ZLdRFKIdWMBoVz8uCQL03HCYutT5DOtVm2g+j2dcor+zSV5yUM5Dg==} - dependencies: - hardhat: 2.19.1(ts-node@10.9.1)(typescript@5.3.2) - transitivePeerDependencies: - - bufferutil - - supports-color - - ts-node - - typescript - - utf-8-validate - dev: false - /@hypercerts-org/contracts@1.0.0(typescript@5.1.6): resolution: {integrity: sha512-pGdG3BGDz93IZXAAHcvwzRQOMgi9dOzy2ZLdRFKIdWMBoVz8uCQL03HCYutT5DOtVm2g+j2dcor+zSV5yUM5Dg==} dependencies: @@ -12357,8 +12339,8 @@ packages: dependencies: execa: 7.2.0 get-port: 6.1.2 - http-proxy: 1.18.1(debug@4.3.4) - ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + http-proxy: 1.18.1 + ws: 8.14.2 transitivePeerDependencies: - bufferutil - debug @@ -14208,6 +14190,16 @@ packages: transitivePeerDependencies: - debug + /axios@1.6.2: + resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} + dependencies: + follow-redirects: 1.15.3(debug@4.3.4) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axios@1.6.2(debug@4.3.4): resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} dependencies: @@ -21156,6 +21148,17 @@ packages: transitivePeerDependencies: - debug + /http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.3(debug@4.3.4) + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + /http-proxy@1.18.1(debug@4.3.4): resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} @@ -22338,7 +22341,7 @@ packages: peerDependencies: ws: '*' dependencies: - ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.14.2 /isows@1.0.3(ws@8.13.0): resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} @@ -33841,6 +33844,18 @@ packages: utf-8-validate: optional: true + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + /ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} engines: {node: '>=10.0.0'} diff --git a/sdk/RELEASE.md b/sdk/RELEASE.md index 11f5fb65..1d1dabb0 100644 --- a/sdk/RELEASE.md +++ b/sdk/RELEASE.md @@ -1,5 +1,15 @@ # Release notes +## 1.1.0 + +- Refactored `HypercertStorage` to use hypercert APIs instead if web3.storage and nft.storage for uploading metadata and + allowlist data +- Added `uploadMetaData` and `uploadAllowList` methods to `HypercertStorage` and as exports from the SDK. +- Removed `storeData` methods from `HypercertStorage` and as exports from the SDK. +- Added `apis` as export from the SDK. + +.... + ## 0.3.1 Update dependencies - Updated graph package dependencies diff --git a/sdk/package.json b/sdk/package.json index ba1f5749..0c985241 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.0.3", + "version": "1.1.0", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -34,10 +34,8 @@ "ethers": "5.7.2", "graphql": "^16.8.1", "loglevel": "^1.8.1", - "nft.storage": "^7.1.1", "urql": "^4.0.6", - "viem": "^1.19.9", - "web3.storage": "^4.5.5" + "viem": "^1.19.9" }, "devDependencies": { "@babel/core": "^7.23.5", diff --git a/sdk/src/client.ts b/sdk/src/client.ts index 6f8c14e9..80ade4c0 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -1,5 +1,4 @@ import { HypercertMinterAbi } from "@hypercerts-org/contracts"; -import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; import { Account, ByteArray, GetContractReturnType, Hex, PublicClient, WalletClient, getContract } from "viem"; import { HypercertEvaluator } from "./evaluations"; import { HypercertIndexer } from "./indexer"; @@ -11,20 +10,20 @@ import { HypercertClientInterface, HypercertMetadata, InvalidOrMissingError, - MalformedDataError, SupportedOverrides, TransferRestrictions, } from "./types"; import { getConfig } from "./utils/config"; -import { validateAllowlist, validateMetaData, verifyMerkleProof, verifyMerkleProofs } from "./validator"; +import { verifyMerkleProof, verifyMerkleProofs } from "./validator"; import { handleSimulatedContractError } from "./utils/errors"; import { logger } from "./utils"; +import { parseAllowListEntriesToMerkleTree } from "./utils/allowlist"; /** * The `HypercertClient` is a core class in the hypercerts SDK, providing a high-level interface to interact with the hypercerts system. * * It encapsulates the logic for storage, evaluation, indexing, and wallet interactions, abstracting the complexity and providing a simple API for users. - * The client is read-only if the storage is read-only (no nft.storage/web3.storage keys) or if no walletClient was found. + * The client is read-only if no walletClient was found. * * @example * const config: Partial = { @@ -61,11 +60,11 @@ export class HypercertClient implements HypercertClientInterface { this._publicClient = this._config.publicClient; this._walletClient = this._config?.walletClient; - this._storage = new HypercertsStorage(this._config); + this._storage = new HypercertsStorage(); this._indexer = new HypercertIndexer(this._config); - this.readonly = this._config.readOnly || this._storage.readonly || !this._walletClient; + this.readonly = this._config.readOnly || !this._walletClient; if (this.readonly) { logger.warn("HypercertsClient is in readonly mode", "client"); @@ -132,19 +131,13 @@ export class HypercertClient implements HypercertClientInterface { ): Promise<`0x${string}` | undefined> => { const { account } = this.getWallet(); - // validate metadata - const { valid, errors } = validateMetaData(metaData); - if (!valid && Object.keys(errors).length > 0) { - throw new MalformedDataError("Metadata validation failed", errors); - } - - // store metadata on IPFS - const cid = await this.storage.storeMetadata(metaData); + // validate and store metadata + const metadataCID = await this.storage.storeMetadata(metaData); const request = await this.simulateRequest( account, "mintClaim", - [account?.address, totalUnits, cid, transferRestriction], + [account?.address, totalUnits, metadataCID, transferRestriction], overrides, ); @@ -249,30 +242,19 @@ export class HypercertClient implements HypercertClientInterface { ): Promise<`0x${string}` | undefined> => { const { account } = this.getWallet(); - // validate allowlist - const { valid: validAllowlist, errors: allowlistErrors } = validateAllowlist(allowList, totalUnits); - if (!validAllowlist && Object.keys(allowlistErrors).length > 0) { - throw new MalformedDataError("Allowlist validation failed", allowlistErrors); - } - - // validate metadata - const { valid: validMetaData, errors: metaDataErrors } = validateMetaData(metaData); - if (!validMetaData && Object.keys(metaDataErrors).length > 0) { - throw new MalformedDataError("Metadata validation failed", metaDataErrors); - } - // create allowlist - const tuples = allowList.map((p) => [p.address, p.units.toString()]); - const tree = StandardMerkleTree.of(tuples, ["address", "uint256"]); - const cidMerkle = await this.storage.storeData(JSON.stringify(tree.dump())); + const tree = parseAllowListEntriesToMerkleTree(allowList); + + // store allowlist on IPFS + const allowListCID = await this.storage.storeAllowList(allowList, totalUnits); // store metadata on IPFS - const cid = await this.storage.storeMetadata({ ...metaData, allowList: cidMerkle }); + const metadataCID = await this.storage.storeMetadata({ ...metaData, allowList: allowListCID }); const request = await this.simulateRequest( account, "createAllowlist", - [account?.address, totalUnits, tree.root, cid, transferRestriction], + [account?.address, totalUnits, tree.root, metadataCID, transferRestriction], overrides, ); diff --git a/sdk/src/constants.ts b/sdk/src/constants.ts index deebf21c..6e428083 100644 --- a/sdk/src/constants.ts +++ b/sdk/src/constants.ts @@ -6,6 +6,13 @@ import { Deployment, SupportedChainIds } from "./types"; const DEFAULT_GRAPH_BASE_URL = "https://api.thegraph.com/subgraphs/name/hypercerts-admin"; +// The APIs we expose + +const APIS: { [key: string]: string } = { + metadata: "https://hypercerts-api.vercel.app/api/v1/web3up/metadata", + allowlist: "https://hypercerts-api.vercel.app/api/v1/web3up/allowlist", +}; + // These are the deployments we manage const DEPLOYMENTS: { [key in SupportedChainIds]: Partial } = { 5: { @@ -45,4 +52,4 @@ const EAS_SCHEMAS = { }, } as const; -export { DEPLOYMENTS, EAS_SCHEMAS }; +export { APIS, DEPLOYMENTS, EAS_SCHEMAS }; diff --git a/sdk/src/index.ts b/sdk/src/index.ts index 9e798de5..d8047a32 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -2,13 +2,14 @@ import { HypercertMinterAbi, HypercertExchangeAbi } from "@hypercerts-org/contra import { HypercertClient } from "./client"; import { HypercertsStorage } from "./storage"; -import { DEPLOYMENTS } from "./constants"; +import { APIS, DEPLOYMENTS } from "./constants"; /** * Protocol */ export { HypercertMinterAbi, HypercertExchangeAbi }; export { DEPLOYMENTS as deployments }; +export { APIS as apis }; /** * Client diff --git a/sdk/src/indexer/gql/graphql.ts b/sdk/src/indexer/gql/graphql.ts index eb7fef8c..26091837 100644 --- a/sdk/src/indexer/gql/graphql.ts +++ b/sdk/src/indexer/gql/graphql.ts @@ -24,6 +24,85 @@ export type Scalars = { Int8: { input: any; output: any }; }; +export type AcceptedToken = { + __typename?: "AcceptedToken"; + accepted: Scalars["Boolean"]["output"]; + id: Scalars["String"]["output"]; + minimumAmountPerUnit: Scalars["BigInt"]["output"]; + token: Token; +}; + +export type AcceptedToken_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + accepted?: InputMaybe; + accepted_in?: InputMaybe>; + accepted_not?: InputMaybe; + accepted_not_in?: InputMaybe>; + and?: InputMaybe>>; + id?: InputMaybe; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + id_not_in?: InputMaybe>; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + minimumAmountPerUnit?: InputMaybe; + minimumAmountPerUnit_gt?: InputMaybe; + minimumAmountPerUnit_gte?: InputMaybe; + minimumAmountPerUnit_in?: InputMaybe>; + minimumAmountPerUnit_lt?: InputMaybe; + minimumAmountPerUnit_lte?: InputMaybe; + minimumAmountPerUnit_not?: InputMaybe; + minimumAmountPerUnit_not_in?: InputMaybe>; + or?: InputMaybe>>; + token?: InputMaybe; + token_?: InputMaybe; + token_contains?: InputMaybe; + token_contains_nocase?: InputMaybe; + token_ends_with?: InputMaybe; + token_ends_with_nocase?: InputMaybe; + token_gt?: InputMaybe; + token_gte?: InputMaybe; + token_in?: InputMaybe>; + token_lt?: InputMaybe; + token_lte?: InputMaybe; + token_not?: InputMaybe; + token_not_contains?: InputMaybe; + token_not_contains_nocase?: InputMaybe; + token_not_ends_with?: InputMaybe; + token_not_ends_with_nocase?: InputMaybe; + token_not_in?: InputMaybe>; + token_not_starts_with?: InputMaybe; + token_not_starts_with_nocase?: InputMaybe; + token_starts_with?: InputMaybe; + token_starts_with_nocase?: InputMaybe; +}; + +export enum AcceptedToken_OrderBy { + Accepted = "accepted", + Id = "id", + MinimumAmountPerUnit = "minimumAmountPerUnit", + Token = "token", + TokenDecimals = "token__decimals", + TokenId = "token__id", + TokenName = "token__name", + TokenSymbol = "token__symbol", +} + export type Allowlist = { __typename?: "Allowlist"; claim: Claim; @@ -130,11 +209,20 @@ export type ClaimToken = { __typename?: "ClaimToken"; claim: Claim; id: Scalars["String"]["output"]; + offers?: Maybe>; owner: Scalars["Bytes"]["output"]; tokenID: Scalars["BigInt"]["output"]; units: Scalars["BigInt"]["output"]; }; +export type ClaimTokenOffersArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + export type ClaimToken_Filter = { /** Filter for the block changed event. */ _change_block?: InputMaybe; @@ -180,6 +268,7 @@ export type ClaimToken_Filter = { id_not_starts_with_nocase?: InputMaybe; id_starts_with?: InputMaybe; id_starts_with_nocase?: InputMaybe; + offers_?: InputMaybe; or?: InputMaybe>>; owner?: InputMaybe; owner_contains?: InputMaybe; @@ -220,6 +309,7 @@ export enum ClaimToken_OrderBy { ClaimTotalUnits = "claim__totalUnits", ClaimUri = "claim__uri", Id = "id", + Offers = "offers", Owner = "owner", TokenId = "tokenID", Units = "units", @@ -371,6 +461,128 @@ export enum Claim_OrderBy { Uri = "uri", } +export type Offer = { + __typename?: "Offer"; + acceptedTokens: Array; + fractionID: ClaimToken; + id: Scalars["String"]["output"]; + maxUnitsPerTrade: Scalars["BigInt"]["output"]; + minUnitsPerTrade: Scalars["BigInt"]["output"]; + status: OfferStatus; + unitsAvailable: Scalars["BigInt"]["output"]; +}; + +export type OfferAcceptedTokensArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + +export enum OfferStatus { + Cancelled = "Cancelled", + Fulfilled = "Fulfilled", + Open = "Open", +} + +export type Offer_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + acceptedTokens?: InputMaybe>; + acceptedTokens_?: InputMaybe; + acceptedTokens_contains?: InputMaybe>; + acceptedTokens_contains_nocase?: InputMaybe>; + acceptedTokens_not?: InputMaybe>; + acceptedTokens_not_contains?: InputMaybe>; + acceptedTokens_not_contains_nocase?: InputMaybe>; + and?: InputMaybe>>; + fractionID?: InputMaybe; + fractionID_?: InputMaybe; + fractionID_contains?: InputMaybe; + fractionID_contains_nocase?: InputMaybe; + fractionID_ends_with?: InputMaybe; + fractionID_ends_with_nocase?: InputMaybe; + fractionID_gt?: InputMaybe; + fractionID_gte?: InputMaybe; + fractionID_in?: InputMaybe>; + fractionID_lt?: InputMaybe; + fractionID_lte?: InputMaybe; + fractionID_not?: InputMaybe; + fractionID_not_contains?: InputMaybe; + fractionID_not_contains_nocase?: InputMaybe; + fractionID_not_ends_with?: InputMaybe; + fractionID_not_ends_with_nocase?: InputMaybe; + fractionID_not_in?: InputMaybe>; + fractionID_not_starts_with?: InputMaybe; + fractionID_not_starts_with_nocase?: InputMaybe; + fractionID_starts_with?: InputMaybe; + fractionID_starts_with_nocase?: InputMaybe; + id?: InputMaybe; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + id_not_in?: InputMaybe>; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + maxUnitsPerTrade?: InputMaybe; + maxUnitsPerTrade_gt?: InputMaybe; + maxUnitsPerTrade_gte?: InputMaybe; + maxUnitsPerTrade_in?: InputMaybe>; + maxUnitsPerTrade_lt?: InputMaybe; + maxUnitsPerTrade_lte?: InputMaybe; + maxUnitsPerTrade_not?: InputMaybe; + maxUnitsPerTrade_not_in?: InputMaybe>; + minUnitsPerTrade?: InputMaybe; + minUnitsPerTrade_gt?: InputMaybe; + minUnitsPerTrade_gte?: InputMaybe; + minUnitsPerTrade_in?: InputMaybe>; + minUnitsPerTrade_lt?: InputMaybe; + minUnitsPerTrade_lte?: InputMaybe; + minUnitsPerTrade_not?: InputMaybe; + minUnitsPerTrade_not_in?: InputMaybe>; + or?: InputMaybe>>; + status?: InputMaybe; + status_in?: InputMaybe>; + status_not?: InputMaybe; + status_not_in?: InputMaybe>; + unitsAvailable?: InputMaybe; + unitsAvailable_gt?: InputMaybe; + unitsAvailable_gte?: InputMaybe; + unitsAvailable_in?: InputMaybe>; + unitsAvailable_lt?: InputMaybe; + unitsAvailable_lte?: InputMaybe; + unitsAvailable_not?: InputMaybe; + unitsAvailable_not_in?: InputMaybe>; +}; + +export enum Offer_OrderBy { + AcceptedTokens = "acceptedTokens", + FractionId = "fractionID", + FractionIdId = "fractionID__id", + FractionIdOwner = "fractionID__owner", + FractionIdTokenId = "fractionID__tokenID", + FractionIdUnits = "fractionID__units", + Id = "id", + MaxUnitsPerTrade = "maxUnitsPerTrade", + MinUnitsPerTrade = "minUnitsPerTrade", + Status = "status", + UnitsAvailable = "unitsAvailable", +} + /** Defines the order direction, either ascending or descending */ export enum OrderDirection { Asc = "asc", @@ -381,18 +593,42 @@ export type Query = { __typename?: "Query"; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; + acceptedToken?: Maybe; + acceptedTokens: Array; allowlist?: Maybe; allowlists: Array; claim?: Maybe; claimToken?: Maybe; claimTokens: Array; claims: Array; + offer?: Maybe; + offers: Array; + token?: Maybe; + tokens: Array; + trade?: Maybe; + trades: Array; }; export type Query_MetaArgs = { block?: InputMaybe; }; +export type QueryAcceptedTokenArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type QueryAcceptedTokensArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + export type QueryAllowlistArgs = { block?: InputMaybe; id: Scalars["ID"]["input"]; @@ -441,22 +677,94 @@ export type QueryClaimsArgs = { where?: InputMaybe; }; +export type QueryOfferArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type QueryOffersArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type QueryTokenArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type QueryTokensArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type QueryTradeArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type QueryTradesArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + export type Subscription = { __typename?: "Subscription"; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; + acceptedToken?: Maybe; + acceptedTokens: Array; allowlist?: Maybe; allowlists: Array; claim?: Maybe; claimToken?: Maybe; claimTokens: Array; claims: Array; + offer?: Maybe; + offers: Array; + token?: Maybe; + tokens: Array; + trade?: Maybe; + trades: Array; }; export type Subscription_MetaArgs = { block?: InputMaybe; }; +export type SubscriptionAcceptedTokenArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type SubscriptionAcceptedTokensArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + export type SubscriptionAllowlistArgs = { block?: InputMaybe; id: Scalars["ID"]["input"]; @@ -505,6 +813,267 @@ export type SubscriptionClaimsArgs = { where?: InputMaybe; }; +export type SubscriptionOfferArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type SubscriptionOffersArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type SubscriptionTokenArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type SubscriptionTokensArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type SubscriptionTradeArgs = { + block?: InputMaybe; + id: Scalars["ID"]["input"]; + subgraphError?: _SubgraphErrorPolicy_; +}; + +export type SubscriptionTradesArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + +export type Token = { + __typename?: "Token"; + decimals?: Maybe; + id: Scalars["String"]["output"]; + name: Scalars["String"]["output"]; + symbol?: Maybe; +}; + +export type Token_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + decimals?: InputMaybe; + decimals_gt?: InputMaybe; + decimals_gte?: InputMaybe; + decimals_in?: InputMaybe>; + decimals_lt?: InputMaybe; + decimals_lte?: InputMaybe; + decimals_not?: InputMaybe; + decimals_not_in?: InputMaybe>; + id?: InputMaybe; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + id_not_in?: InputMaybe>; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + name?: InputMaybe; + name_contains?: InputMaybe; + name_contains_nocase?: InputMaybe; + name_ends_with?: InputMaybe; + name_ends_with_nocase?: InputMaybe; + name_gt?: InputMaybe; + name_gte?: InputMaybe; + name_in?: InputMaybe>; + name_lt?: InputMaybe; + name_lte?: InputMaybe; + name_not?: InputMaybe; + name_not_contains?: InputMaybe; + name_not_contains_nocase?: InputMaybe; + name_not_ends_with?: InputMaybe; + name_not_ends_with_nocase?: InputMaybe; + name_not_in?: InputMaybe>; + name_not_starts_with?: InputMaybe; + name_not_starts_with_nocase?: InputMaybe; + name_starts_with?: InputMaybe; + name_starts_with_nocase?: InputMaybe; + or?: InputMaybe>>; + symbol?: InputMaybe; + symbol_contains?: InputMaybe; + symbol_contains_nocase?: InputMaybe; + symbol_ends_with?: InputMaybe; + symbol_ends_with_nocase?: InputMaybe; + symbol_gt?: InputMaybe; + symbol_gte?: InputMaybe; + symbol_in?: InputMaybe>; + symbol_lt?: InputMaybe; + symbol_lte?: InputMaybe; + symbol_not?: InputMaybe; + symbol_not_contains?: InputMaybe; + symbol_not_contains_nocase?: InputMaybe; + symbol_not_ends_with?: InputMaybe; + symbol_not_ends_with_nocase?: InputMaybe; + symbol_not_in?: InputMaybe>; + symbol_not_starts_with?: InputMaybe; + symbol_not_starts_with_nocase?: InputMaybe; + symbol_starts_with?: InputMaybe; + symbol_starts_with_nocase?: InputMaybe; +}; + +export enum Token_OrderBy { + Decimals = "decimals", + Id = "id", + Name = "name", + Symbol = "symbol", +} + +export type Trade = { + __typename?: "Trade"; + amountPerUnit: Scalars["BigInt"]["output"]; + buyer: Scalars["Bytes"]["output"]; + id: Scalars["String"]["output"]; + offerID: Offer; + token: Token; + unitsSold: Scalars["BigInt"]["output"]; +}; + +export type Trade_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + amountPerUnit?: InputMaybe; + amountPerUnit_gt?: InputMaybe; + amountPerUnit_gte?: InputMaybe; + amountPerUnit_in?: InputMaybe>; + amountPerUnit_lt?: InputMaybe; + amountPerUnit_lte?: InputMaybe; + amountPerUnit_not?: InputMaybe; + amountPerUnit_not_in?: InputMaybe>; + and?: InputMaybe>>; + buyer?: InputMaybe; + buyer_contains?: InputMaybe; + buyer_gt?: InputMaybe; + buyer_gte?: InputMaybe; + buyer_in?: InputMaybe>; + buyer_lt?: InputMaybe; + buyer_lte?: InputMaybe; + buyer_not?: InputMaybe; + buyer_not_contains?: InputMaybe; + buyer_not_in?: InputMaybe>; + id?: InputMaybe; + id_contains?: InputMaybe; + id_contains_nocase?: InputMaybe; + id_ends_with?: InputMaybe; + id_ends_with_nocase?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_contains?: InputMaybe; + id_not_contains_nocase?: InputMaybe; + id_not_ends_with?: InputMaybe; + id_not_ends_with_nocase?: InputMaybe; + id_not_in?: InputMaybe>; + id_not_starts_with?: InputMaybe; + id_not_starts_with_nocase?: InputMaybe; + id_starts_with?: InputMaybe; + id_starts_with_nocase?: InputMaybe; + offerID?: InputMaybe; + offerID_?: InputMaybe; + offerID_contains?: InputMaybe; + offerID_contains_nocase?: InputMaybe; + offerID_ends_with?: InputMaybe; + offerID_ends_with_nocase?: InputMaybe; + offerID_gt?: InputMaybe; + offerID_gte?: InputMaybe; + offerID_in?: InputMaybe>; + offerID_lt?: InputMaybe; + offerID_lte?: InputMaybe; + offerID_not?: InputMaybe; + offerID_not_contains?: InputMaybe; + offerID_not_contains_nocase?: InputMaybe; + offerID_not_ends_with?: InputMaybe; + offerID_not_ends_with_nocase?: InputMaybe; + offerID_not_in?: InputMaybe>; + offerID_not_starts_with?: InputMaybe; + offerID_not_starts_with_nocase?: InputMaybe; + offerID_starts_with?: InputMaybe; + offerID_starts_with_nocase?: InputMaybe; + or?: InputMaybe>>; + token?: InputMaybe; + token_?: InputMaybe; + token_contains?: InputMaybe; + token_contains_nocase?: InputMaybe; + token_ends_with?: InputMaybe; + token_ends_with_nocase?: InputMaybe; + token_gt?: InputMaybe; + token_gte?: InputMaybe; + token_in?: InputMaybe>; + token_lt?: InputMaybe; + token_lte?: InputMaybe; + token_not?: InputMaybe; + token_not_contains?: InputMaybe; + token_not_contains_nocase?: InputMaybe; + token_not_ends_with?: InputMaybe; + token_not_ends_with_nocase?: InputMaybe; + token_not_in?: InputMaybe>; + token_not_starts_with?: InputMaybe; + token_not_starts_with_nocase?: InputMaybe; + token_starts_with?: InputMaybe; + token_starts_with_nocase?: InputMaybe; + unitsSold?: InputMaybe; + unitsSold_gt?: InputMaybe; + unitsSold_gte?: InputMaybe; + unitsSold_in?: InputMaybe>; + unitsSold_lt?: InputMaybe; + unitsSold_lte?: InputMaybe; + unitsSold_not?: InputMaybe; + unitsSold_not_in?: InputMaybe>; +}; + +export enum Trade_OrderBy { + AmountPerUnit = "amountPerUnit", + Buyer = "buyer", + Id = "id", + OfferId = "offerID", + OfferIdId = "offerID__id", + OfferIdMaxUnitsPerTrade = "offerID__maxUnitsPerTrade", + OfferIdMinUnitsPerTrade = "offerID__minUnitsPerTrade", + OfferIdStatus = "offerID__status", + OfferIdUnitsAvailable = "offerID__unitsAvailable", + Token = "token", + TokenDecimals = "token__decimals", + TokenId = "token__id", + TokenName = "token__name", + TokenSymbol = "token__symbol", + UnitsSold = "unitsSold", +} + export type _Block_ = { __typename?: "_Block_"; /** The hash of the block */ diff --git a/sdk/src/storage.ts b/sdk/src/storage.ts index 3bf2fdbe..587268a8 100644 --- a/sdk/src/storage.ts +++ b/sdk/src/storage.ts @@ -1,69 +1,58 @@ -//eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import { CIDString, NFTStorage } from "nft.storage"; -//eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import { Blob, File, Web3Storage } from "web3.storage"; - -import { validateMetaData } from "./validator"; +import { validateAllowlist, validateMetaData } from "./validator"; import { - HypercertStorageConfig, HypercertStorageInterface, HypercertMetadata, MalformedDataError, StorageError, + AllowlistEntry, } from "./types"; -import { logger, getFromIPFS } from "./utils"; -import { getNftStorageToken, getWeb3StorageToken } from "./utils/config"; +import { logger, getFromIPFS, parseAllowListEntriesToMerkleTree } from "./utils"; +import { uploadAllowlist, uploadMetadata } from "./utils/apis"; /** * A class that provides storage functionality for Hypercerts. * * This class implements the `HypercertStorageInterface` and provides methods for storing and retrieving Hypercerts. It uses the NFT Storage and Web3 Storage APIs for storage, and can be configured to be read-only. * - * @property {boolean} readonly - Whether the storage is read-only. If true, the storage methods will not perform any write operations. - * @property {NFTStorage} nftStorageClient - The NFT Storage client used for storing and retrieving Hypercerts. - * @property {Web3Storage} web3StorageClient - The Web3 Storage client used for storing and retrieving Hypercerts. - * * @example - * const storage = new HypercertsStorage({ nftStorageToken: 'your-nft-storage-token', web3StorageToken: 'your-web3-storage-token' }); + * const storage = new HypercertsStorage(); * const metadata = await storage.getMetadata('your-hypercert-id'); */ export class HypercertsStorage implements HypercertStorageInterface { - /** Whether the storage is read-only. */ - readonly: boolean = true; - /** The NFT storage client. */ - nftStorageClient?: NFTStorage; - /** The Web3 storage client. */ - web3StorageClient?: Web3Storage; - /** - * Creates a new instance of the `HypercertsStorage` class. + * Stores hypercerts allowlist on IPFS. * - * This constructor takes an optional `overrides` parameter that can be used to override the default configuration. If the NFT Storage or Web3 Storage API keys are missing or invalid, the storage will be read-only. + * This method first checks if the storage is read-only or if the NFT Storage client is not configured. If either of these conditions is true, it throws a `StorageError`. + * It then validates the provided metadata using the `validateMetaData` function. If the metadata is invalid, it throws a `MalformedDataError`. + * If the metadata is valid, it creates a new Blob from the metadata and stores it using the NFT Storage client. If the storage operation fails, it throws a `StorageError`. * - * @param {Partial} overrides - The configuration overrides for the storage. + * @param {AllowlistEntry[]} allowList - The allowList to store. + * @returns {Promise} A promise that resolves to the CID of the stored metadata. + * @throws {StorageError} Will throw a `StorageError` if the storage is read-only, if the NFT Storage client is not configured, or if the storage operation fails. + * @throws {MalformedDataError} Will throw a `MalformedDataError` if the provided metadata is invalid. */ - constructor(overrides: Partial) { - const nftStorageToken = getNftStorageToken(overrides); - const web3StorageToken = getWeb3StorageToken(overrides); - - if (!nftStorageToken || !web3StorageToken) { - logger.warn("HypercertsStorage is read only", "storage"); - this.readonly = true; - - if (!nftStorageToken) { - logger.warn(`NFT Storage API key is missing or invalid: ${nftStorageToken}}`); - } - - if (!web3StorageToken) { - logger.warn(`Web3 Storage API key is missing or invalid: ${web3StorageToken}`); - } - } else { - this.nftStorageClient = new NFTStorage({ token: nftStorageToken.nftStorageToken || "" }); - this.web3StorageClient = new Web3Storage({ token: web3StorageToken.web3StorageToken || "" }); - this.readonly = false; + public async storeAllowList(allowList: AllowlistEntry[], totalUnits: bigint): Promise { + const { valid, data, errors: allowlistErrors } = validateAllowlist(allowList, totalUnits); + if (!valid) { + throw new MalformedDataError(`Invalid allowList.`, { errors: allowlistErrors }); } + + logger.debug("Storing allowlist: ", "storage", [data]); + + const tree = parseAllowListEntriesToMerkleTree(allowList); + + const { cid: allowlistCID, errors: uploadAllowlistErrors } = await uploadAllowlist({ + allowList: JSON.stringify(tree.dump()), + totalUnits: totalUnits.toString(), + }); + + if ((uploadAllowlistErrors && Object.keys(uploadAllowlistErrors).length > 0) || !allowlistCID) { + throw new StorageError(`Allowlist upload failed.`, { errors: uploadAllowlistErrors, allowlistCID }); + } + + logger.debug(`Stored metadata at ${allowlistCID}`); + + return allowlistCID; } /** @@ -74,26 +63,22 @@ export class HypercertsStorage implements HypercertStorageInterface { * If the metadata is valid, it creates a new Blob from the metadata and stores it using the NFT Storage client. If the storage operation fails, it throws a `StorageError`. * * @param {HypercertMetadata} data - The Hypercert metadata to store. This should be an object that conforms to the HypercertMetadata type. - * @returns {Promise} A promise that resolves to the CID of the stored metadata. + * @returns {Promise} A promise that resolves to the CID of the stored metadata. * @throws {StorageError} Will throw a `StorageError` if the storage is read-only, if the NFT Storage client is not configured, or if the storage operation fails. * @throws {MalformedDataError} Will throw a `MalformedDataError` if the provided metadata is invalid. */ - public async storeMetadata(data: HypercertMetadata): Promise { - if (this.readonly || !this.nftStorageClient) { - throw new StorageError("NFT.storage client is not configured"); - } - - const validation = validateMetaData(data); - if (!validation.valid) { - throw new MalformedDataError(`Invalid metadata.`, { errors: validation.errors }); + public async storeMetadata(metadata: HypercertMetadata): Promise { + const { data, valid, errors: validationErrors } = validateMetaData(metadata); + if (!valid) { + throw new MalformedDataError(`Invalid metadata.`, { errors: validationErrors }); } logger.debug("Storing HypercertMetaData: ", "storage", [data]); - const blob = new Blob([JSON.stringify(data)], { type: "application/json" }); - const cid: CIDString = await this.nftStorageClient.storeBlob(blob); - if (!cid) { - throw new StorageError("Failed to store metadata"); + const { errors, cid } = await uploadMetadata(metadata); + + if (!cid || (errors && Object.keys(errors).length > 0)) { + throw new StorageError("Failed to store metadata", { errors, cid }); } logger.debug(`Stored metadata at ${cid}`); @@ -122,36 +107,6 @@ export class HypercertsStorage implements HypercertStorageInterface { return validation.data as HypercertMetadata; } - /** - * Stores data using the Web3 Storage client. - * - * This method first checks if the storage is read-only or if the Web3 Storage client is not configured. If either of these conditions is true, it throws a `StorageError`. - * It then creates a new Blob from the provided data and stores it using the Web3 Storage client. If the storage operation fails, it throws a `StorageError`. - * - * @param {unknown} data - The data to store. This can be any type of data. - * @returns {Promise} A promise that resolves to the CID of the stored data. - * @throws {StorageError} Will throw a `StorageError` if the storage is read-only, if the Web3 Storage client is not configured, or if the storage operation fails. - * - * @remarks Even though web3.storage takes a list of files, we'll assume we're only storing 1 JSON blob. - * Because we pay for storage quotas, this data is stored best effort. - * If you are using our default keys, we may delete older data if we hit our storage quota. - */ - public async storeData(data: unknown): Promise { - if (this.readonly || !this.web3StorageClient) { - throw new StorageError("Web3.storage client is not configured"); - } - const blob = new Blob([JSON.stringify(data)], { type: "application/json" }); - const files = [new File([blob], "data.json")]; - logger.debug("Storing blob of: ", "storage", [data]); - const cid: CIDString = await this.web3StorageClient.put(files, { wrapWithDirectory: false }); - - if (!cid) { - throw new StorageError("Failed to store data"); - } - - return cid; - } - /** * Retrieves data from IPFS using the provided CID or IPFS URI. * @@ -165,33 +120,7 @@ export class HypercertsStorage implements HypercertStorageInterface { * @remarkts Note: The original implementation using the Web3 Storage client is currently commented out due to issues with upstream repos. This will be replaced once those issues are resolved. */ public async getData(cidOrIpfsUri: string): Promise { - /** - // Using the default web3.storage client is not working in upstream repos. Needs further testing. - const cid = getCid(cidOrIpfsUri); - - // Get the data - const res = await this.web3StorageClient.get(cid); - if (!res || !res.ok) { - throw new FetchError(`Failed to get ${cidOrIpfsUri}`); - } - - // Assert there's only 1 file - // TODO: because we are storing with `wrapDirectory: false`, this call fails - // on upstream projects (e.g. frontend) - // which is confusing because there's no other way to retrieve the file - // doubly confusing because the unit tests work fine. - // Need further investigating, but using `getMetadata` works as a workaround atm - const files = await res.files(); - if (files.length !== 1) { - throw new MalformedDataError(`Expected 1 file but got ${files.length}`); - } - const dataStr = await files[0].text(); - const data = JSON.parse(dataStr); - console.log(`Getting data ${cidOrIpfsUri}: `, data); - return data; - */ - - // TODO: replace current temporary fix of just using NFT.Storage IPFS gateway + // TODO: replace current temporary fix or just using NFT.Storage IPFS gateway return await getFromIPFS(cidOrIpfsUri); } } diff --git a/sdk/src/types/client.ts b/sdk/src/types/client.ts index 37d5100c..176f9e35 100644 --- a/sdk/src/types/client.ts +++ b/sdk/src/types/client.ts @@ -1,7 +1,4 @@ import { PartialTypedDataConfig } from "@ethereum-attestation-service/eas-sdk"; -//eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import { CIDString } from "nft.storage"; import { HypercertIndexer } from "../indexer"; import { AllowlistEntry, TransferRestrictions } from "./hypercerts"; @@ -53,8 +50,6 @@ export type HypercertClientConfig = Deployment & export type HypercertStorageConfig = { /** The API token for NFT.storage. */ nftStorageToken?: string; - /** The API token for Web3.storage. */ - web3StorageToken?: string; }; /** @@ -70,26 +65,26 @@ export type HypercertEvaluatorConfig = Omit & */ export interface HypercertStorageInterface { /** - * Stores the metadata for a Hypercert evaluation. + * Stores the allowlost for a hypercert. + * @param allowList The metadata to store. + * @returns A Promise that resolves to the CID of the stored metadata. + */ + storeAllowList: (allowList: AllowlistEntry[], totalUnits: bigint) => Promise; + + /** + * Stores the metadata for a hypercert. * @param metadata The metadata to store. * @returns A Promise that resolves to the CID of the stored metadata. */ - storeMetadata: (metadata: HypercertMetadata) => Promise; + storeMetadata: (metadata: HypercertMetadata) => Promise; /** - * Retrieves the metadata for a Hypercert evaluation. + * Retrieves the metadata for a hypercerts. * @param cidOrIpfsUri The CID or IPFS URI of the metadata to retrieve. * @returns A Promise that resolves to the retrieved metadata. */ getMetadata: (cidOrIpfsUri: string) => Promise; - /** - * Stores arbitrary data on IPFS. - * @param data The data to store. - * @returns A Promise that resolves to the CID of the stored data. - */ - storeData: (data: unknown) => Promise; - /** * Retrieves arbitrary data from IPFS. * @param cidOrIpfsUri The CID or IPFS URI of the data to retrieve. diff --git a/sdk/src/utils/allowlist.ts b/sdk/src/utils/allowlist.ts index a0f840e2..58c26686 100644 --- a/sdk/src/utils/allowlist.ts +++ b/sdk/src/utils/allowlist.ts @@ -1,6 +1,14 @@ import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; import { getFromIPFS } from "./fetchers"; import { logger } from "./logger"; +import { AllowlistEntry } from "src/types"; + +const parseAllowListEntriesToMerkleTree = (allowList: AllowlistEntry[]) => { + const tuples = allowList.map((p) => [p.address, p.units.toString()]); + const tree = StandardMerkleTree.of(tuples, ["address", "uint256"]); + + return tree; +}; const getMerkleTreeFromIPFS = async (cidOrIpfsUri: string) => { const data = await getFromIPFS(cidOrIpfsUri); @@ -43,4 +51,4 @@ const getProofsFromAllowlist = async (cidOrIpfsUri: string, account: `0x${string } }; -export { getProofsFromAllowlist }; +export { getProofsFromAllowlist, parseAllowListEntriesToMerkleTree }; diff --git a/sdk/src/utils/apis.ts b/sdk/src/utils/apis.ts new file mode 100644 index 00000000..659d5cee --- /dev/null +++ b/sdk/src/utils/apis.ts @@ -0,0 +1,53 @@ +import axios from "axios"; +import { HypercertMetadata } from "src/types"; + +/** + * Type for the request body when posting to the allowlist endpoint. + */ +type AllowListPostRequest = { + allowList: string; + totalUnits: string; +}; + +/** + * Type for the response data from the API. + */ +type ResponseData = { + message: string; + cid?: string; + errors?: Record; +}; + +/** + * Axios instance configured with the base URL for the hypercert API. + */ +const api = axios.create({ + baseURL: "https://hypercerts-api.vercel.app/api/v1/web3up/", +}); + +/** + * Uploads metadata to the API. + * + * @param metadata - The metadata to upload. Should be an object that conforms to the HypercertMetadata type. + * @returns The response data from the API. + */ +const uploadMetadata = async (metadata: HypercertMetadata) => { + const response = await api.post("metadata", metadata); + + return response.data; +}; + +/** + * Uploads an allowlist to the API. + * + * @param req - The request body containing the allowlist and total units. The allowList should be a stringified Merkle tree dump. + * @returns The response data from the API. + * + */ +const uploadAllowlist = async (req: AllowListPostRequest) => { + const response = await api.post("allowlist", req); + + return response.data; +}; + +export { uploadMetadata, uploadAllowlist }; diff --git a/sdk/src/utils/config.ts b/sdk/src/utils/config.ts index 5d873cc7..397c8519 100644 --- a/sdk/src/utils/config.ts +++ b/sdk/src/utils/config.ts @@ -84,8 +84,6 @@ export const getConfig = (overrides: Partial): Partial) => { return { publicClient }; }; -export const getNftStorageToken = (overrides: Partial) => { - if (overrides.nftStorageToken) { - return { nftStorageToken: overrides.nftStorageToken }; - } -}; - -export const getWeb3StorageToken = (overrides: Partial) => { - if (overrides.web3StorageToken) { - return { web3StorageToken: overrides.web3StorageToken }; - } -}; - const getEasContractAddress = (overrides: Partial) => { return { easContractAddress: overrides.easContractAddress }; }; diff --git a/sdk/src/utils/fetchers.ts b/sdk/src/utils/fetchers.ts index 6b0144a6..9c9111e1 100644 --- a/sdk/src/utils/fetchers.ts +++ b/sdk/src/utils/fetchers.ts @@ -3,9 +3,9 @@ import { logger } from "./logger"; import axios from "axios"; /** - * Fetches data from IPFS using either the NFT Storage gateway or the Web3 Storage gateway. + * Fetches data from IPFS using either the NFT Storage gateway or the Web3Up gateway. * - * This function attempts to fetch data from the NFT Storage gateway first. If the request times out, it then tries to fetch the data from the Web3 Storage gateway. + * This function attempts to fetch data from the NFT Storage gateway first. If the request times out, it then tries to fetch the data from the Web3Up gateway. * If the data cannot be fetched from either gateway, it throws a `StorageError`. * * @param {string} cidOrIpfsUri - The CID or IPFS URI of the data to fetch. @@ -16,13 +16,13 @@ import axios from "axios"; */ const getFromIPFS = async (cidOrIpfsUri: string, timeout: number = 10000): Promise => { const nftStorageGatewayLink = getNftStorageGatewayUri(cidOrIpfsUri); - const web3StorageGatewayLink = getWeb3StorageGatewayUri(cidOrIpfsUri); + const web3upGatewayLink = getWeb3UpGatewayUri(cidOrIpfsUri); logger.debug(`Getting metadata ${cidOrIpfsUri} at ${nftStorageGatewayLink}`); const res = await axios.get(nftStorageGatewayLink, { timeout }).catch(() => { logger.debug(`${nftStorageGatewayLink} timed out.`); - logger.debug(`Getting metadata ${cidOrIpfsUri} at ${web3StorageGatewayLink}`); - return axios.get(web3StorageGatewayLink, { timeout }); + logger.debug(`Getting metadata ${cidOrIpfsUri} at ${web3upGatewayLink}`); + return axios.get(web3upGatewayLink, { timeout }); }); if (!res || !res.data) { @@ -39,7 +39,7 @@ const getNftStorageGatewayUri = (cidOrIpfsUri: string) => { return NFT_STORAGE_IPFS_GATEWAY.replace("{cid}", getCid(cidOrIpfsUri)); }; -const getWeb3StorageGatewayUri = (cidOrIpfsUri: string) => { +const getWeb3UpGatewayUri = (cidOrIpfsUri: string) => { const WEB3_STORAGE_IPFS_GATEWAY = "https://w3s.link/ipfs/{cid}"; return WEB3_STORAGE_IPFS_GATEWAY.replace("{cid}", getCid(cidOrIpfsUri)); }; diff --git a/sdk/src/utils/index.ts b/sdk/src/utils/index.ts index 53113f75..ccc4d04d 100644 --- a/sdk/src/utils/index.ts +++ b/sdk/src/utils/index.ts @@ -1,10 +1,11 @@ import { walletClientToSigner, publicClientToProvider } from "./adapters"; -import { getProofsFromAllowlist } from "./allowlist"; +import { getProofsFromAllowlist, parseAllowListEntriesToMerkleTree } from "./allowlist"; import { getFromIPFS } from "./fetchers"; import { formatHypercertData } from "./formatter"; import { logger } from "./logger"; import { handleSdkError, handleContractError } from "./errors"; +import { uploadMetadata, uploadAllowlist } from "./apis"; export { walletClientToSigner, @@ -15,4 +16,7 @@ export { formatHypercertData, handleSdkError, handleContractError, + uploadMetadata, + uploadAllowlist, + parseAllowListEntriesToMerkleTree, }; diff --git a/sdk/src/validator/index.ts b/sdk/src/validator/index.ts index dc592083..6a25b92d 100644 --- a/sdk/src/validator/index.ts +++ b/sdk/src/validator/index.ts @@ -58,7 +58,7 @@ const validateMetaData = (data: unknown): ValidationResult => { errors[key] = e.message; } } - return { data, valid: false, errors }; + return { data: data as unknown, valid: false, errors }; } return { data: data as HypercertMetadata, valid: true, errors: {} }; @@ -89,7 +89,7 @@ const validateClaimData = (data: unknown): ValidationResult => { errors[key] = e.message; } } - return { data, valid: false, errors }; + return { data: data as unknown, valid: false, errors }; } return { data: data as HypercertClaimdata, valid: true, errors: {} }; @@ -123,7 +123,11 @@ const validateAllowlist = (data: AllowlistEntry[], units: bigint): ValidationRes errors["address"] = filteredAddresses.map((entry) => entry.address); } - return { data, valid: Object.keys(errors).length === 0, errors }; + if (Object.keys(errors).length > 0) { + return { data: data as unknown, valid: Object.keys(errors).length === 0, errors }; + } + + return { data: data as AllowlistEntry[], valid: Object.keys(errors).length === 0, errors }; }; /** diff --git a/sdk/test/client/allowlist.minting.test.ts b/sdk/test/client/allowlist.minting.test.ts index c9cbce48..bfc1d845 100644 --- a/sdk/test/client/allowlist.minting.test.ts +++ b/sdk/test/client/allowlist.minting.test.ts @@ -13,9 +13,9 @@ import { encodeFunctionResult, isHex, stringToHex } from "viem"; chai.use(assertionsCount); describe("Allows for minting claims from an allowlist", () => { - const { hypercertData, hypercertMetadata } = mockDataSets; - const metaDataStub = sinon.stub(HypercertsStorage.prototype, "storeMetadata").resolves(hypercertMetadata.cid); - const dataStub = sinon.stub(HypercertsStorage.prototype, "storeData").resolves(hypercertData.cid); + const { someData } = mockDataSets; + const metaDataStub = sinon.stub(HypercertsStorage.prototype, "storeMetadata"); + const allowListStub = sinon.stub(HypercertsStorage.prototype, "storeAllowList"); const wallet = walletClient; const userAddress = wallet.account?.address; const client = new HypercertClient({ @@ -23,7 +23,6 @@ describe("Allows for minting claims from an allowlist", () => { walletClient, publicClient, nftStorageToken: "test", - web3StorageToken: "test", }); const readSpy = sinon.stub(publicClient, "readContract"); @@ -57,7 +56,7 @@ describe("Allows for minting claims from an allowlist", () => { writeSpy.resetHistory(); metaDataStub.resetHistory(); - dataStub.resetHistory(); + allowListStub.resetHistory(); }); afterAll(() => { @@ -69,13 +68,14 @@ describe("Allows for minting claims from an allowlist", () => { const { allowlist, totalUnits } = getAllowlist(); const metaData = getFormattedMetadata(); + allowListStub.resolves(someData.cid); writeSpy = writeSpy.resolves(mintClaimResult); const hash = await client.createAllowlist(allowlist, metaData, totalUnits, TransferRestrictions.FromCreatorOnly); expect(isHex(hash)).to.be.true; expect(metaDataStub.callCount).to.eq(1); - expect(dataStub.callCount).to.eq(1); + expect(allowListStub.callCount).to.eq(1); expect(readSpy.callCount).to.eq(0); expect(writeSpy.callCount).to.eq(1); }); @@ -85,6 +85,12 @@ describe("Allows for minting claims from an allowlist", () => { const { allowlist, totalUnits } = getAllowlist(); const metaData = getFormattedMetadata(); + allowListStub.throws( + new MalformedDataError("Allowlist validation failed", { + units: "Total units in allowlist must match total units [expected: 11, got: 10]", + }), + ); + let hash; try { hash = await client.createAllowlist(allowlist, metaData, totalUnits + 1n, TransferRestrictions.FromCreatorOnly); @@ -100,7 +106,7 @@ describe("Allows for minting claims from an allowlist", () => { expect(hash).to.be.undefined; expect(metaDataStub.callCount).to.eq(0); - expect(dataStub.callCount).to.eq(0); + expect(allowListStub.callCount).to.eq(1); expect(readSpy.callCount).to.eq(0); expect(writeSpy.callCount).to.eq(0); }); @@ -114,6 +120,12 @@ describe("Allows for minting claims from an allowlist", () => { allowlist[0].units = 0n; + allowListStub.throws( + new MalformedDataError("Allowlist validation failed", { + units: "Total units in allowlist must match total units [expected: 10, got: 9]", + }), + ); + try { hash = await client.createAllowlist(allowlist, metaData, totalUnits, TransferRestrictions.FromCreatorOnly); } catch (e) { @@ -128,7 +140,7 @@ describe("Allows for minting claims from an allowlist", () => { expect(hash).to.be.undefined; expect(metaDataStub.callCount).to.eq(0); - expect(dataStub.callCount).to.eq(0); + expect(allowListStub.callCount).to.eq(1); expect(readSpy.callCount).to.eq(0); expect(writeSpy.callCount).to.eq(0); }); @@ -149,7 +161,7 @@ describe("Allows for minting claims from an allowlist", () => { expect(isHex(hash)).to.be.true; expect(metaDataStub.callCount).to.eq(0); - expect(dataStub.callCount).to.eq(0); + expect(allowListStub.callCount).to.eq(0); expect(readSpy.callCount).to.eq(0); expect(writeSpy.callCount).to.eq(1); }); @@ -169,7 +181,7 @@ describe("Allows for minting claims from an allowlist", () => { expect(isHex(hash)).to.be.true; expect(metaDataStub.callCount).to.eq(0); - expect(dataStub.callCount).to.eq(0); + expect(allowListStub.callCount).to.eq(0); expect(readSpy.callCount).to.eq(0); expect(writeSpy.callCount).to.eq(1); }); @@ -201,7 +213,7 @@ describe("Allows for minting claims from an allowlist", () => { expect(hash).to.be.undefined; expect(metaDataStub.callCount).to.eq(0); - expect(dataStub.callCount).to.eq(0); + expect(allowListStub.callCount).to.eq(0); expect(readSpy.callCount).to.eq(0); expect(writeSpy.callCount).to.eq(0); }); @@ -231,7 +243,7 @@ describe("Allows for minting claims from an allowlist", () => { expect(isHex(hash)).to.be.true; expect(metaDataStub.callCount).to.eq(0); - expect(dataStub.callCount).to.eq(0); + expect(allowListStub.callCount).to.eq(0); expect(readSpy.callCount).to.eq(0); expect(writeSpy.callCount).to.eq(1); }); @@ -260,7 +272,7 @@ describe("Allows for minting claims from an allowlist", () => { expect(isHex(hash)).to.be.true; expect(metaDataStub.callCount).to.eq(0); - expect(dataStub.callCount).to.eq(0); + expect(allowListStub.callCount).to.eq(0); expect(readSpy.callCount).to.eq(0); expect(writeSpy.callCount).to.eq(1); }); @@ -303,7 +315,7 @@ describe("Allows for minting claims from an allowlist", () => { expect(hash).to.be.undefined; expect(metaDataStub.callCount).to.eq(0); - expect(dataStub.callCount).to.eq(0); + expect(allowListStub.callCount).to.eq(0); expect(readSpy.callCount).to.eq(0); expect(writeSpy.callCount).to.eq(0); }); diff --git a/sdk/test/client/minting.test.ts b/sdk/test/client/minting.test.ts index fa4e3f00..da10c547 100644 --- a/sdk/test/client/minting.test.ts +++ b/sdk/test/client/minting.test.ts @@ -5,7 +5,7 @@ import sinon from "sinon"; import { encodeFunctionResult, isHex, parseEther } from "viem"; import { HypercertClient } from "../../src/client"; -import { HypercertMetadata, formatHypercertData } from "../../src"; +import { HypercertMetadata, HypercertsStorage, formatHypercertData } from "../../src"; import { ContractError, MalformedDataError } from "../../src/types/errors"; import { TransferRestrictions } from "../../src/types/hypercerts"; import { getRawInputData, publicClient, walletClient, testClient } from "../helpers"; @@ -13,21 +13,20 @@ import { HypercertMinterAbi } from "@hypercerts-org/contracts"; //eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -import { CIDString, NFTStorage } from "nft.storage"; +import { CIDString } from "nft.storage"; chai.use(assertionsCount); describe("mintClaim in HypercertClient", () => { const mockCorrectMetadataCid = "testCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u" as CIDString; - const storeBlobMock = sinon.stub(NFTStorage, "storeBlob").resolves(mockCorrectMetadataCid); + const storeMetadataMock = sinon.stub(HypercertsStorage.prototype, "storeMetadata"); const client = new HypercertClient({ chain: { id: 5 }, walletClient, publicClient, nftStorageToken: "test", - web3StorageToken: "test", }); const readSpy = sinon.stub(publicClient, "readContract"); @@ -49,7 +48,8 @@ describe("mintClaim in HypercertClient", () => { writeSpy.resetBehavior(); writeSpy.resetHistory(); - storeBlobMock.resetHistory(); + storeMetadataMock.resetBehavior(); + storeMetadataMock.resetHistory(); }); afterAll(() => { @@ -62,6 +62,7 @@ describe("mintClaim in HypercertClient", () => { const rawData = getRawInputData(); const { data: formattedData } = formatHypercertData(rawData); + storeMetadataMock.resolves(mockCorrectMetadataCid); writeSpy = writeSpy.resolves(mintClaimResult); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -70,19 +71,22 @@ describe("mintClaim in HypercertClient", () => { expect(isHex(hash)).to.be.true; expect(readSpy.callCount).to.equal(0); expect(writeSpy.callCount).to.equal(1); - expect(storeBlobMock.callCount).to.equal(1); + expect(storeMetadataMock.callCount).to.equal(1); }); it("throws on malformed metadata", async () => { + storeMetadataMock.callThrough(); try { await client.mintClaim({} as HypercertMetadata, 1000n, TransferRestrictions.AllowAll); expect.fail("Should throw MalformedDataError"); } catch (e) { + console.log(e); expect(e).to.be.instanceOf(MalformedDataError); const error = e as MalformedDataError; - expect(error.message).to.equal("Metadata validation failed"); + expect(error.message).to.equal("Invalid metadata."); } expect(writeSpy.callCount).to.equal(0); + expect(storeMetadataMock.callCount).to.equal(1); }); it("mints a hypercerts with override params", async () => { @@ -90,6 +94,7 @@ describe("mintClaim in HypercertClient", () => { const { data: formattedData } = formatHypercertData(rawData); + storeMetadataMock.resolves(mockCorrectMetadataCid); writeSpy = writeSpy.resolves(mintClaimResult); let hash; @@ -112,6 +117,6 @@ describe("mintClaim in HypercertClient", () => { expect(isHex(hash)).to.be.true; expect(readSpy.callCount).to.equal(0); expect(writeSpy.callCount).to.equal(1); - expect(storeBlobMock.callCount).to.equal(2); + expect(storeMetadataMock.callCount).to.equal(2); }); }); diff --git a/sdk/test/storage.test.ts b/sdk/test/storage.test.ts index f79d0f2c..9f761bfc 100644 --- a/sdk/test/storage.test.ts +++ b/sdk/test/storage.test.ts @@ -1,10 +1,8 @@ import { describe, it, afterAll } from "vitest"; import { expect } from "chai"; -import { HypercertMetadata } from "../src"; import { HypercertsStorage } from "../src/storage"; -import { StorageError } from "../src/types/errors"; import { reloadEnv } from "./setup-env"; describe("HypercertsStorage", () => { @@ -13,55 +11,14 @@ describe("HypercertsStorage", () => { }); it("should be able to create a new instance without valid storage keys", () => { - const storage = new HypercertsStorage({}); + const storage = new HypercertsStorage(); expect(storage).to.be.an.instanceOf(HypercertsStorage); - expect(storage.readonly).to.be.true; }); it("should be able to create a new instance with valid storage keys", () => { - const storage = new HypercertsStorage({ nftStorageToken: "test", web3StorageToken: "test" }); + const storage = new HypercertsStorage(); expect(storage).to.be.an.instanceOf(HypercertsStorage); - expect(storage.readonly).to.be.false; - }); - - it("should block calls to store data when in read only mode", async () => { - const storage = new HypercertsStorage({}); - - expect(async () => storage.storeData({}).should.throw(StorageError, "Web3.storage client is not configured")); - expect(async () => - storage.storeMetadata({} as HypercertMetadata).should.throw(StorageError, "NFT.storage client is not configured"), - ); - }); - - it("should throw an error when executing write method in readonly mode", async () => { - const client = new HypercertsStorage({}); - - // storeMetadata - try { - const metaData = { name: "test" } as HypercertMetadata; - - await client.storeMetadata(metaData); - expect.fail("Should throw StorageError"); - } catch (e) { - expect(e instanceof StorageError).to.be.true; - - const error = e as StorageError; - expect(error.message).to.eq("NFT.storage client is not configured"); - } - - // storeData - try { - const data = { name: "test" }; - - await client.storeData(data); - expect.fail("Should throw ClientError"); - } catch (e) { - expect(e instanceof StorageError).to.be.true; - - const error = e as StorageError; - expect(error.message).to.eq("Web3.storage client is not configured"); - } }); }); diff --git a/sdk/test/storage/nft.storage.test.ts b/sdk/test/storage/nft.storage.test.ts deleted file mode 100644 index 60b9ec86..00000000 --- a/sdk/test/storage/nft.storage.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { describe, it, afterEach, afterAll, vi } from "vitest"; -import chai, { expect } from "chai"; -import assertionsCount from "chai-assertions-count"; - -//eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import { NFTStorage } from "nft.storage"; - -import { HypercertsStorage } from "../../src/storage"; -import { MalformedDataError } from "../../src/types/errors"; -import { HypercertMetadata } from "../../src/types/metadata"; -import { getFormattedMetadata, mockDataSets } from "../helpers"; -import sinon from "sinon"; -import axios from "axios"; - -chai.use(assertionsCount); - -describe("NFT.Storage Client", () => { - const { hypercertMetadata } = mockDataSets; - - const storeBlobMock = sinon.stub(NFTStorage.prototype, "storeBlob").resolves(hypercertMetadata.cid); - - const storage = new HypercertsStorage({ - nftStorageToken: process.env.NFT_STORAGE_TOKEN, - web3StorageToken: process.env.WEB3_STORAGE_TOKEN, - }); - - afterEach(() => { - chai.Assertion.resetAssertsCheck(); - vi.clearAllMocks(); - sinon.restore(); - }); - - afterAll(() => { - vi.resetAllMocks(); - sinon.resetBehavior(); - }); - - /** - * Currently just testing against the production NFT.Storage service. - */ - it("Smoke test - add metadata", async () => { - await storage.storeMetadata(getFormattedMetadata()); - expect(storeBlobMock.callCount).to.eq(1); - }); - - it("Smoke test - get metadata", async () => { - sinon.stub(axios, "get").resolves(Promise.resolve({ data: hypercertMetadata.data })); - const res = await storage.getMetadata(hypercertMetadata.cid); - - expect(res).to.deep.eq(hypercertMetadata.data); - }); - - it("Throws when trying to store incorrect metadata", async () => { - chai.Assertion.expectAssertions(2); - // storeData - try { - await storage.storeMetadata({ data: "false" } as unknown as HypercertMetadata); - } catch (e) { - expect(e).to.be.an.instanceOf(MalformedDataError); - - const error = e as MalformedDataError; - expect(error.message).to.eq("Invalid metadata."); - } - }); - - it("Throws when trying to fetch incorrect metadata", async () => { - chai.Assertion.expectAssertions(2); - const incorrectCID = "incorrect-cid"; - sinon.stub(axios, "get").resolves(Promise.resolve({ data: "false" })); - - // storeData - try { - await storage.getMetadata(incorrectCID); - } catch (e) { - expect(e).to.be.an.instanceOf(MalformedDataError); - - const error = e as MalformedDataError; - expect(error.message).to.be.eq(`Invalid metadata at ${incorrectCID}`); - } - }); -}); diff --git a/sdk/test/storage/storeAllowList.test.ts b/sdk/test/storage/storeAllowList.test.ts new file mode 100644 index 00000000..4c385293 --- /dev/null +++ b/sdk/test/storage/storeAllowList.test.ts @@ -0,0 +1,71 @@ +import { describe, it, afterEach, afterAll, vi, expect } from "vitest"; + +import { HypercertsStorage } from "../../src/storage"; +import { MalformedDataError } from "../../src/types/errors"; +import { mockDataSets } from "../helpers"; +import sinon from "sinon"; +import { faker } from "@faker-js/faker"; +import { AllowlistEntry } from "src"; + +const mocks = vi.hoisted(() => { + return { + uploadAllowlist: vi.fn(), + }; +}); + +vi.mock("../../src/utils/apis", () => { + return { + uploadAllowlist: mocks.uploadAllowlist, + }; +}); + +describe("Storage - store allowlist", () => { + const { someData } = mockDataSets; + + const storage = new HypercertsStorage(); + + afterEach(() => { + vi.clearAllMocks(); + sinon.restore(); + }); + + afterAll(() => { + vi.resetAllMocks(); + sinon.resetBehavior(); + }); + + it("Store allowlist", async () => { + const allowList = [ + { + address: faker.finance.ethereumAddress(), + units: BigInt(100), + }, + ]; + + mocks.uploadAllowlist.mockResolvedValue({ cid: someData.cid }); + const res = await storage.storeAllowList(allowList, 100n); + expect(res).to.eq(someData.cid); + expect(mocks.uploadAllowlist).toHaveBeenCalledTimes(1); + }); + + it("Throws when trying to store incorrect allowList", async () => { + const allowList = [ + { + address: faker.finance.ethereumAddress(), + units: 50n, + }, + ]; + + // storeData + try { + await storage.storeAllowList(allowList as unknown as AllowlistEntry[], 100n); + } catch (e) { + expect(e).to.be.an.instanceOf(MalformedDataError); + + const error = e as MalformedDataError; + expect(error.message).to.eq("Invalid allowList."); + } + + expect(mocks.uploadAllowlist).toHaveBeenCalledTimes(0); + }); +}); diff --git a/sdk/test/storage/storeMetadata.test.ts b/sdk/test/storage/storeMetadata.test.ts new file mode 100644 index 00000000..336e2072 --- /dev/null +++ b/sdk/test/storage/storeMetadata.test.ts @@ -0,0 +1,60 @@ +import { describe, it, afterEach, afterAll, vi, expect } from "vitest"; + +import { HypercertsStorage } from "../../src/storage"; +import { MalformedDataError } from "../../src/types/errors"; +import { mockDataSets } from "../helpers"; +import sinon from "sinon"; + +const mocks = vi.hoisted(() => { + return { + uploadMetadata: vi.fn(), + }; +}); + +vi.mock("../../src/utils/apis", () => { + return { + uploadMetadata: mocks.uploadMetadata, + }; +}); + +describe("Storage - store metadata", () => { + const { hypercertMetadata } = mockDataSets; + + const storage = new HypercertsStorage(); + + afterEach(() => { + vi.clearAllMocks(); + sinon.restore(); + }); + + afterAll(() => { + vi.resetAllMocks(); + sinon.resetBehavior(); + }); + + it("Store metadata", async () => { + mocks.uploadMetadata.mockResolvedValue({ cid: hypercertMetadata.cid }); + const res = await storage.storeMetadata(hypercertMetadata.data); + expect(res).to.eq(hypercertMetadata.cid); + expect(mocks.uploadMetadata).toHaveBeenCalledTimes(1); + }); + + it("Throws when trying to store incorrect metadata", async () => { + const _metadata = { + ...hypercertMetadata.data, + name: undefined, + }; + + // storeData + try { + await storage.storeMetadata(_metadata); + } catch (e) { + expect(e).to.be.an.instanceOf(MalformedDataError); + + const error = e as MalformedDataError; + expect(error.message).to.eq("Invalid metadata."); + } + + expect(mocks.uploadMetadata).toHaveBeenCalledTimes(0); + }); +}); diff --git a/sdk/test/storage/web3.storage.test.ts b/sdk/test/storage/web3.storage.test.ts deleted file mode 100644 index 4210cd5c..00000000 --- a/sdk/test/storage/web3.storage.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { describe, it, afterEach, afterAll } from "vitest"; -import { expect } from "chai"; -//eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import { Web3Storage } from "web3.storage"; - -import { HypercertsStorage } from "../../src/storage"; -import { mockDataSets } from "../helpers"; -import axios from "axios"; -import sinon from "sinon"; - -describe("Web3.Storage Client", () => { - const { hypercertData, hypercertMetadata } = mockDataSets; - - const storeBlobMock = sinon.stub(Web3Storage.prototype, "put").resolves(hypercertMetadata.cid); - - const storage = new HypercertsStorage({ - nftStorageToken: process.env.NFT_STORAGE_TOKEN, - web3StorageToken: process.env.WEB3_STORAGE_TOKEN, - }); - - afterEach(() => { - sinon.restore(); - }); - - afterAll(() => { - sinon.resetBehavior(); - }); - - /** - * Currently just testing against the production NFT.Storage service. - */ - it("Smoke test - add data", async () => { - await storage.storeData(hypercertData.data); - expect(storeBlobMock.callCount).to.eq(1); - }); - - it("Smoke test - get data", async () => { - sinon.stub(axios, "get").resolves(Promise.resolve({ data: hypercertData.data })); - const res = await storage.getData(hypercertData.cid); - - expect(res).to.deep.eq(hypercertData.data); - }); -}); diff --git a/sdk/test/utils/config.test.ts b/sdk/test/utils/config.test.ts index b3e7d32f..ea4d0d41 100644 --- a/sdk/test/utils/config.test.ts +++ b/sdk/test/utils/config.test.ts @@ -96,40 +96,6 @@ describe("Config: graphUrl", () => { }); }); -describe("Config: nftStorageToken & web3storageToken", () => { - afterEach(() => { - sinon.restore(); - - reloadEnv(); - }); - it("should return an empty object when no overrides or environment variables are specified", () => { - const result = getConfig({ chain: { id: 5 } }); - expect(result.nftStorageToken).to.be.undefined; - }); - - it("should return the nftStorageToken specified by overrides", () => { - const overrides: Partial = { - chain: { id: 5 }, - nftStorageToken: "NFTSTOR", - web3StorageToken: "WEB3STOR", - }; - const result = getConfig(overrides); - expect(result).to.deep.include({ - nftStorageToken: overrides.nftStorageToken, - web3StorageToken: overrides.web3StorageToken, - }); - }); - - it("should return the nftStorageToken specified by the NFT_STORAGE_TOKEN environment variable", () => { - const result = getConfig({ chain: { id: 5 }, nftStorageToken: "NFTSTOR" }); - expect(result.nftStorageToken).to.be.eq("NFTSTOR"); - }); - it("should not throw an error when the nftStorageToken specified by overrides is invalid", () => { - const overrides: Partial = { chain: { id: 5 }, nftStorageToken: undefined }; - expect(() => getConfig(overrides)).to.not.throw(); - }); -}); - describe("Config: getPublicClient", () => { afterEach(() => { sinon.restore(); @@ -163,33 +129,3 @@ describe("Config: getWalletClient", () => { expect(result.walletClient).to.equal(overrides.walletClient); }); }); - -describe("Config: web3StorageToken", () => { - afterEach(() => { - sinon.restore(); - - reloadEnv(); - }); - - it("should return an empty object when no overrides or environment variables are specified", () => { - const result = getConfig({ chain: { id: 5 } }); - expect(result.web3StorageToken).to.be.undefined; - }); - - it("should return the web3StorageToken specified by overrides", () => { - const overrides: Partial = { - chain: { id: 5 }, - web3StorageToken: "WEB3STOR", - }; - - const result = getConfig(overrides); - expect(result).to.deep.include({ - web3StorageToken: overrides.web3StorageToken, - }); - }); - - it("should not throw an error when the web3StorageToken specified by overrides is invalid", () => { - const overrides: Partial = { chain: { id: 5 }, web3StorageToken: undefined }; - expect(() => getConfig(overrides)).to.not.throw(); - }); -}); diff --git a/sdk/test/utils/errors.test.ts b/sdk/test/utils/errors.test.ts index a69cc8e0..c99358d6 100644 --- a/sdk/test/utils/errors.test.ts +++ b/sdk/test/utils/errors.test.ts @@ -8,10 +8,7 @@ import { handleSdkError } from "../../src/utils/errors"; import { getRawInputData, publicClient, walletClient, testClient } from "../helpers"; -//eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import { CIDString, NFTStorage } from "nft.storage"; -import { HypercertClient, HypercertMinterAbi, TransferRestrictions, formatHypercertData } from "src"; +import { HypercertClient, HypercertMinterAbi, HypercertsStorage, TransferRestrictions, formatHypercertData } from "src"; import { parseEther, encodeErrorResult } from "viem"; chai.use(assertionsCount); @@ -29,16 +26,15 @@ describe("SDK Error handler", () => { }); describe("Contract Error handler", () => { - const mockCorrectMetadataCid = "testCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u" as CIDString; + const mockCorrectMetadataCid = "testCID1234fkreigdm2flneb4khd7eixodagst5nrndptgezrjux7gohxcngjn67x6u"; - const storeBlobMock = sinon.stub(NFTStorage, "storeBlob").resolves(mockCorrectMetadataCid); + const storeMetadataStub = sinon.stub(HypercertsStorage.prototype, "storeMetadata"); const client = new HypercertClient({ chain: { id: 5 }, walletClient, publicClient, nftStorageToken: "test", - web3StorageToken: "test", }); const readSpy = sinon.stub(publicClient, "readContract"); @@ -54,7 +50,7 @@ describe("Contract Error handler", () => { writeSpy.resetBehavior(); writeSpy.resetHistory(); - storeBlobMock.resetHistory(); + storeMetadataStub.resetHistory(); }); afterAll(() => { @@ -74,6 +70,8 @@ describe("Contract Error handler", () => { }); writeSpy.resolves(value); + storeMetadataStub.resolves(mockCorrectMetadataCid); + try { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion await client.mintClaim(formattedData!, 0n, TransferRestrictions.DisallowAll); From 0f59f972a08cf3bce48e980f23b89342350e70e0 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 8 Jan 2024 05:07:27 +0100 Subject: [PATCH 072/118] fix(api): migrate to railway --- frontend/package.json | 2 +- pnpm-lock.yaml | 713 ++++++------------------------------------ sdk/src/utils/apis.ts | 14 +- 3 files changed, 110 insertions(+), 619 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 52b39cb1..d67d2a05 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -25,7 +25,7 @@ "@graphprotocol/client-cli": "^2.2.16", "@hypercerts-org/contracts": "1.0.0", "@hypercerts-org/observabletreemap": "workspace: *", - "@hypercerts-org/sdk": "1.0.3", + "@hypercerts-org/sdk": "workspace: *", "@mui/icons-material": "^5.11.9", "@mui/material": "^5.11.2", "@mui/x-date-pickers": "^5.0.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 798540f7..28122cce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -348,8 +348,8 @@ importers: specifier: 'workspace: *' version: link:../vendor/observabletreemap '@hypercerts-org/sdk': - specifier: 1.0.3 - version: 1.0.3(node-fetch@3.3.2)(react@18.2.0)(typescript@5.1.6)(zod@3.22.4) + specifier: 'workspace: *' + version: link:../sdk '@mui/icons-material': specifier: ^5.11.9 version: 5.14.15(@mui/material@5.14.15)(@types/react@18.2.33)(react@18.2.0) @@ -566,7 +566,7 @@ importers: version: 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': specifier: 1.0.0 - version: link:../contracts + version: 1.0.0(ts-node@10.9.1)(typescript@5.3.2) '@openzeppelin/merkle-tree': specifier: ^1.0.5 version: 1.0.5 @@ -581,7 +581,7 @@ importers: version: 8.12.0 axios: specifier: ^1.6.2 - version: 1.6.2 + version: 1.6.2(debug@4.3.4) dotenv: specifier: ^16.0.3 version: 16.3.1 @@ -966,10 +966,6 @@ packages: transitivePeerDependencies: - encoding - /@assemblyscript/loader@0.9.4: - resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} - dev: false - /@aws-crypto/sha256-js@1.2.2: resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} dependencies: @@ -5058,18 +5054,6 @@ packages: - utf-8-validate dev: false - /@ethereum-attestation-service/eas-contracts@1.3.7(typescript@5.1.6): - resolution: {integrity: sha512-msCKGDhqSjfkx0lbs0PPkf/Z6bWxaYT9ze/uLoRh1tM7W8N27mobX4g6AsjATqGC+eWHRfliK9eCwJQj7TU8WA==} - dependencies: - hardhat: 2.19.1(typescript@5.1.6) - transitivePeerDependencies: - - bufferutil - - supports-color - - ts-node - - typescript - - utf-8-validate - dev: false - /@ethereum-attestation-service/eas-sdk@1.3.7(ts-node@10.9.1)(typescript@5.3.2): resolution: {integrity: sha512-7dmy3w/hIeUYGTvkoFIo/JSviiTK8qhjr0BKf7qK+xSPYt9rW9Qksw1njqC5G3OXyp5teaXCH05v75NOASYoSQ==} dependencies: @@ -5088,24 +5072,6 @@ packages: - utf-8-validate dev: false - /@ethereum-attestation-service/eas-sdk@1.3.7(typescript@5.1.6): - resolution: {integrity: sha512-7dmy3w/hIeUYGTvkoFIo/JSviiTK8qhjr0BKf7qK+xSPYt9rW9Qksw1njqC5G3OXyp5teaXCH05v75NOASYoSQ==} - dependencies: - '@ethereum-attestation-service/eas-contracts': 1.3.7(typescript@5.1.6) - ethers: 6.9.0 - js-base64: 3.7.5 - lodash: 4.17.21 - multiformats: 9.9.0 - pako: 2.1.0 - semver: 7.5.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - ts-node - - typescript - - utf-8-validate - dev: false - /@ethereumjs/common@2.6.5: resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} dependencies: @@ -6681,7 +6647,7 @@ packages: graphql-ws: 5.14.2(graphql@16.8.1) isomorphic-ws: 5.0.0(ws@8.14.2) tslib: 2.6.2 - ws: 8.14.2 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -6750,7 +6716,7 @@ packages: graphql: 16.8.1 isomorphic-ws: 5.0.0(ws@8.14.2) tslib: 2.6.2 - ws: 8.14.2 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -7166,7 +7132,7 @@ packages: isomorphic-ws: 5.0.0(ws@8.14.2) tslib: 2.6.2 value-or-promise: 1.0.12 - ws: 8.14.2 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@types/node' - bufferutil @@ -7324,10 +7290,10 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/contracts@1.0.0(typescript@5.1.6): + /@hypercerts-org/contracts@1.0.0(ts-node@10.9.1)(typescript@5.3.2): resolution: {integrity: sha512-pGdG3BGDz93IZXAAHcvwzRQOMgi9dOzy2ZLdRFKIdWMBoVz8uCQL03HCYutT5DOtVm2g+j2dcor+zSV5yUM5Dg==} dependencies: - hardhat: 2.19.1(typescript@5.1.6) + hardhat: 2.19.1(ts-node@10.9.1)(typescript@5.3.2) transitivePeerDependencies: - bufferutil - supports-color @@ -7336,37 +7302,16 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/sdk@1.0.3(node-fetch@3.3.2)(react@18.2.0)(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-drZy1kVFuSbelIBgM51ScJNOyahDKTrNIALO9ApIA7ZnoBC5hr3zsMwzpUCmq3AvPQTu6PssPoeJY28Hru40+A==} + /@hypercerts-org/contracts@1.0.0(typescript@5.1.6): + resolution: {integrity: sha512-pGdG3BGDz93IZXAAHcvwzRQOMgi9dOzy2ZLdRFKIdWMBoVz8uCQL03HCYutT5DOtVm2g+j2dcor+zSV5yUM5Dg==} dependencies: - '@ethereum-attestation-service/eas-sdk': 1.3.7(typescript@5.1.6) - '@ethersproject/abstract-signer': 5.7.0 - '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@hypercerts-org/contracts': 1.0.0(typescript@5.1.6) - '@openzeppelin/merkle-tree': 1.0.5 - '@urql/core': 4.2.0(graphql@16.8.1) - '@whatwg-node/fetch': 0.9.14 - ajv: 8.12.0 - axios: 1.6.2(debug@4.3.4) - dotenv: 16.3.1 - ethers: 5.7.2 - graphql: 16.8.1 - loglevel: 1.8.1 - nft.storage: 7.1.1(node-fetch@3.3.2) - urql: 4.0.6(graphql@16.8.1)(react@18.2.0) - viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) - web3.storage: 4.5.5(node-fetch@3.3.2) + hardhat: 2.19.1(typescript@5.1.6) transitivePeerDependencies: - bufferutil - - debug - - encoding - - node-fetch - - react - supports-color - ts-node - typescript - utf-8-validate - - zod dev: false /@iarna/toml@2.2.5: @@ -7377,26 +7322,12 @@ packages: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false - /@ipld/car@3.2.4: - resolution: {integrity: sha512-rezKd+jk8AsTGOoJKqzfjLJ3WVft7NZNH95f0pfPbicROvzTyvHCNy567HzSUd6gRXZ9im29z5ZEv9Hw49jSYw==} - dependencies: - '@ipld/dag-cbor': 7.0.3 - multiformats: 9.9.0 - varint: 6.0.0 - dev: false - - /@ipld/dag-cbor@6.0.15: - resolution: {integrity: sha512-Vm3VTSTwlmGV92a3C5aeY+r2A18zbH2amehNhsX8PBa3muXICaWrN8Uri85A5hLH7D7ElhE8PdjxD6kNqUmTZA==} - dependencies: - cborg: 1.10.2 - multiformats: 9.9.0 - dev: false - /@ipld/dag-cbor@7.0.3: resolution: {integrity: sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==} dependencies: cborg: 1.10.2 multiformats: 9.9.0 + dev: true /@ipld/dag-json@8.0.11: resolution: {integrity: sha512-Pea7JXeYHTWXRTIhBqBlhw7G53PJ7yta3G/sizGEZyzdeEwhZRr0od5IQ0r2ZxOt1Do+2czddjeEPp+YTxDwCA==} @@ -7409,6 +7340,7 @@ packages: resolution: {integrity: sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg==} dependencies: multiformats: 9.9.0 + dev: true /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -8293,13 +8225,6 @@ packages: - '@types/react' dev: false - /@multiformats/murmur3@1.1.3: - resolution: {integrity: sha512-wAPLUErGR8g6Lt+bAZn6218k9YQPym+sjszsXL6o4zfxbA22P+gxWZuuD9wDbwL55xrKO5idpcuQUX7/E3oHcw==} - dependencies: - multiformats: 9.9.0 - murmurhash3js-revisited: 3.0.0 - dev: false - /@next/env@13.5.6: resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} dev: false @@ -8414,10 +8339,6 @@ packages: dependencies: '@noble/hashes': 1.3.2 - /@noble/ed25519@1.7.3: - resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} - dev: false - /@noble/hashes@1.2.0: resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -9641,36 +9562,46 @@ packages: /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: true /@protobufjs/base64@1.1.2: resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: true /@protobufjs/codegen@2.0.4: resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: true /@protobufjs/eventemitter@1.1.0: resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: true /@protobufjs/fetch@1.1.0: resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 + dev: true /@protobufjs/float@1.0.2: resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: true /@protobufjs/inquire@1.1.0: resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: true /@protobufjs/path@1.1.2: resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: true /@protobufjs/pool@1.1.0: resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: true /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: true /@rainbow-me/rainbowkit@1.3.1(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.15)(wagmi@1.4.12): resolution: {integrity: sha512-4Upi+S12ZHosimzlUpCiOocg4dtfGU2wkzcpxeat/FYHrvhVIOgm0TuzbsIM96W1p7OXabosd7xuxPvwduUygQ==} @@ -11659,6 +11590,7 @@ packages: /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: true /@types/lru-cache@5.1.1: resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} @@ -11687,6 +11619,7 @@ packages: /@types/minimatch@3.0.5: resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} @@ -11694,6 +11627,7 @@ packages: /@types/minimist@1.2.4: resolution: {integrity: sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==} + dev: true /@types/mocha@9.1.0: resolution: {integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==} @@ -11736,6 +11670,7 @@ packages: /@types/normalize-package-data@2.4.3: resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==} + dev: true /@types/papaparse@5.3.10: resolution: {integrity: sha512-mS1Fta/xJ9EDYmAvpeWzcV9Gr0cOl1ClpW7di9+wSUNDIDO55tBtyXg97O7K+Syrd9rDEmuejM2iqmJIJ1SO5g==} @@ -12339,8 +12274,8 @@ packages: dependencies: execa: 7.2.0 get-port: 6.1.2 - http-proxy: 1.18.1 - ws: 8.14.2 + http-proxy: 1.18.1(debug@4.3.4) + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -13062,59 +12997,6 @@ packages: tslib: 1.14.1 dev: false - /@web-std/blob@3.0.5: - resolution: {integrity: sha512-Lm03qr0eT3PoLBuhkvFBLf0EFkAsNz/G/AYCzpOdi483aFaVX86b4iQs0OHhzHJfN5C15q17UtDbyABjlzM96A==} - dependencies: - '@web-std/stream': 1.0.0 - web-encoding: 1.1.5 - dev: false - - /@web-std/fetch@4.2.1: - resolution: {integrity: sha512-M6sgHDgKegcjuVsq8J6jb/4XvhPGui8uwp3EIoADGXUnBl9vKzKLk9H9iFzrPJ6fSV6zZzFWXPyziBJp9hxzBA==} - engines: {node: ^10.17 || >=12.3} - dependencies: - '@web-std/blob': 3.0.5 - '@web-std/file': 3.0.3 - '@web-std/form-data': 3.1.0 - '@web-std/stream': 1.0.3 - '@web3-storage/multipart-parser': 1.0.0 - abort-controller: 3.0.0 - data-uri-to-buffer: 3.0.1 - mrmime: 1.0.1 - dev: false - - /@web-std/file@3.0.3: - resolution: {integrity: sha512-X7YYyvEERBbaDfJeC9lBKC5Q5lIEWYCP1SNftJNwNH/VbFhdHm+3neKOQP+kWEYJmosbDFq+NEUG7+XIvet/Jw==} - dependencies: - '@web-std/blob': 3.0.5 - dev: false - - /@web-std/form-data@3.1.0: - resolution: {integrity: sha512-WkOrB8rnc2hEK2iVhDl9TFiPMptmxJA1HaIzSdc2/qk3XS4Ny4cCt6/V36U3XmoYKz0Md2YyK2uOZecoZWPAcA==} - dependencies: - web-encoding: 1.1.5 - dev: false - - /@web-std/stream@1.0.0: - resolution: {integrity: sha512-jyIbdVl+0ZJyKGTV0Ohb9E6UnxP+t7ZzX4Do3AHjZKxUXKMs9EmqnBDQgHF7bEw0EzbQygOjtt/7gvtmi//iCQ==} - dependencies: - web-streams-polyfill: 3.2.1 - dev: false - - /@web-std/stream@1.0.3: - resolution: {integrity: sha512-5MIngxWyq4rQiGoDAC2WhjLuDraW8+ff2LD2et4NRY933K3gL8CHlUXrh8ZZ3dC9A9Xaub8c9sl5exOJE58D9Q==} - dependencies: - web-streams-polyfill: 3.2.1 - dev: false - - /@web3-storage/multipart-parser@1.0.0: - resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} - dev: false - - /@web3-storage/parse-link-header@3.1.0: - resolution: {integrity: sha512-K1undnK70vLLauqdE8bq/l98isTF2FDhcP0UPpXVSjkSWe3xhAn5eRXk5jfA1E5ycNm84Ws/rQFUD7ue11nciw==} - dev: false - /@webassemblyjs/ast@1.11.6: resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} dependencies: @@ -13335,12 +13217,6 @@ packages: resolution: {integrity: sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==} dev: false - /@zxing/text-encoding@0.9.0: - resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} - requiresBuild: true - dev: false - optional: true - /JSONStream@1.3.2: resolution: {integrity: sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==} dependencies: @@ -13766,9 +13642,11 @@ packages: dependencies: abort-controller: 3.0.0 native-abort-controller: 1.0.4(abort-controller@3.0.0) + dev: true /any-signal@3.0.1: resolution: {integrity: sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==} + dev: true /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -13987,6 +13865,7 @@ packages: /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} + dev: true /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -14190,16 +14069,6 @@ packages: transitivePeerDependencies: - debug - /axios@1.6.2: - resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} - dependencies: - follow-redirects: 1.15.3(debug@4.3.4) - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - /axios@1.6.2(debug@4.3.4): resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} dependencies: @@ -14546,14 +14415,6 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 - /bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} - dependencies: - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - /blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} dev: true @@ -14565,24 +14426,12 @@ packages: resolution: {integrity: sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA==} dependencies: browser-readablestream-to-it: 1.0.3 + dev: true /blob-util@2.0.2: resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} dev: true - /blockstore-core@1.0.5: - resolution: {integrity: sha512-i/9CUMMvBALVbtSqUIuiWB3tk//a4Q2I2CEWiBuYNnhJvk/DWplXjLt8Sqc5VGkRVXVPSsEuH8fUtqJt5UFYcA==} - dependencies: - err-code: 3.0.1 - interface-blockstore: 2.0.3 - interface-store: 2.0.2 - it-all: 1.0.6 - it-drain: 1.0.5 - it-filter: 1.0.3 - it-take: 1.0.2 - multiformats: 9.9.0 - dev: false - /bluebird@3.7.1: resolution: {integrity: sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==} dev: true @@ -14703,6 +14552,7 @@ packages: /browser-readablestream-to-it@1.0.3: resolution: {integrity: sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==} + dev: true /browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} @@ -14942,6 +14792,7 @@ packages: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 + dev: true /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} @@ -14975,15 +14826,6 @@ packages: tslib: 2.6.2 upper-case-first: 2.0.2 - /carbites@1.0.6: - resolution: {integrity: sha512-dS9IQvnrb5VIRvSTNz5Ff+mB9d2MFfi5mojtJi7Rlss79VeF190jr0sZdA7eW0CGHotvHkZaWuM6wgfD9PEFRg==} - dependencies: - '@ipld/car': 3.2.4 - '@ipld/dag-cbor': 6.0.15 - '@ipld/dag-pb': 2.1.18 - multiformats: 9.9.0 - dev: false - /cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} dependencies: @@ -15019,6 +14861,7 @@ packages: /cborg@1.10.2: resolution: {integrity: sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==} + dev: true /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -15275,6 +15118,7 @@ packages: /class-is@1.1.0: resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + dev: true /classic-level@1.3.0: resolution: {integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==} @@ -16717,11 +16561,6 @@ packages: assert-plus: 1.0.0 dev: true - /data-uri-to-buffer@3.0.1: - resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} - engines: {node: '>= 6'} - dev: false - /data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -16793,6 +16632,7 @@ packages: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 + dev: true /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} @@ -17177,6 +17017,7 @@ packages: transitivePeerDependencies: - node-fetch - supports-color + dev: true /dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} @@ -17448,6 +17289,7 @@ packages: engines: {node: '>=6'} dependencies: encoding: 0.1.13 + dev: true /electron-to-chromium@1.4.567: resolution: {integrity: sha512-8KR114CAYQ4/r5EIEsOmOMqQ9j0MRbJZR3aXD/KFA8RuKzyoUB4XrUCg+l8RUGqTVQgKNIgTpjaG8YHRPAbX2w==} @@ -17505,6 +17347,7 @@ packages: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} dependencies: iconv-lite: 0.6.3 + dev: true /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -17568,6 +17411,7 @@ packages: /err-code@3.0.1: resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + dev: true /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -18880,6 +18724,7 @@ packages: /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: true /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} @@ -19112,15 +18957,6 @@ packages: trim-repeated: 1.0.0 dev: true - /files-from-path@0.2.6: - resolution: {integrity: sha512-Mz4UNkv+WcRLxcCXAORbfpwYiXI60SN9C1ZfeyGFv0xQUmblgbOkSWwFwX+Ov/TaR3FEyzwDyPnCQjpPRGSxKA==} - dependencies: - err-code: 3.0.1 - graceful-fs: 4.2.11 - ipfs-unixfs: 6.0.9 - it-glob: 0.0.13 - dev: false - /filesize@8.0.7: resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} engines: {node: '>= 0.4.0'} @@ -19621,6 +19457,7 @@ packages: /get-iterator@1.0.2: resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==} + dev: true /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} @@ -20237,14 +20074,6 @@ packages: unenv: 1.8.0 dev: false - /hamt-sharding@2.0.1: - resolution: {integrity: sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA==} - engines: {node: '>=10.0.0', npm: '>=6.0.0'} - dependencies: - sparse-array: 1.3.2 - uint8arrays: 3.1.1 - dev: false - /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -20276,6 +20105,7 @@ packages: /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} + dev: true /hardhat-abi-exporter@2.10.1(hardhat@2.18.3): resolution: {integrity: sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ==} @@ -20921,12 +20751,14 @@ packages: /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true /hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 + dev: true /hotscript@1.0.13: resolution: {integrity: sha512-C++tTF1GqkGYecL+2S1wJTfoH6APGAsbb7PAWQ3iVIwgG/EFseAfEVOKFgAFq4yK3+6j1EjUD4UQ9dRJHX/sSQ==} @@ -21148,17 +20980,6 @@ packages: transitivePeerDependencies: - debug - /http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.3(debug@4.3.4) - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - dev: true - /http-proxy@1.18.1(debug@4.3.4): resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} @@ -21456,22 +21277,17 @@ packages: wrap-ansi: 7.0.0 dev: true - /interface-blockstore@2.0.3: - resolution: {integrity: sha512-OwVUnlNcx7H5HloK0Myv6c/C1q9cNG11HX6afdeU6q6kbuNj8jKCwVnmJHhC94LZaJ+9hvVOk4IUstb3Esg81w==} - dependencies: - interface-store: 2.0.2 - multiformats: 9.9.0 - dev: false - /interface-datastore@6.1.1: resolution: {integrity: sha512-AmCS+9CT34pp2u0QQVXjKztkuq3y5T+BIciuiHDDtDZucZD8VudosnSdUyXJV6IsRkN5jc4RFDhCk1O6Q3Gxjg==} dependencies: interface-store: 2.0.2 nanoid: 3.3.6 uint8arrays: 3.1.1 + dev: true /interface-store@2.0.2: resolution: {integrity: sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg==} + dev: true /internal-slot@1.0.6: resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} @@ -21537,6 +21353,7 @@ packages: /ip-regex@4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} + dev: true /ip@1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} @@ -21550,77 +21367,6 @@ packages: resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} engines: {node: '>= 10'} - /ipfs-car@0.6.2(node-fetch@3.3.2): - resolution: {integrity: sha512-tliuakkKKtCa4TTnFT3zJKjq/aD8EGKX8Y0ybCyrAW0fo/n2koZpxiLjBvtTs47Rqyji6ggXo+atPbJJ60hJmg==} - dependencies: - '@ipld/car': 3.2.4 - '@web-std/blob': 3.0.5 - bl: 5.1.0 - blockstore-core: 1.0.5 - browser-readablestream-to-it: 1.0.3 - idb-keyval: 6.2.1 - interface-blockstore: 2.0.3 - ipfs-core-types: 0.8.4(node-fetch@3.3.2) - ipfs-core-utils: 0.12.2(node-fetch@3.3.2) - ipfs-unixfs-exporter: 7.0.11 - ipfs-unixfs-importer: 9.0.10 - ipfs-utils: 9.0.14 - it-all: 1.0.6 - it-last: 1.0.6 - it-pipe: 1.1.0 - meow: 9.0.0 - move-file: 2.1.0 - multiformats: 9.9.0 - stream-to-it: 0.2.4 - streaming-iterables: 6.2.0 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - encoding - - node-fetch - - supports-color - dev: false - - /ipfs-car@0.7.0(node-fetch@3.3.2): - resolution: {integrity: sha512-9ser6WWZ1ZMTCGbcVkRXUzOrpQ4SIiLfzIEnk+3LQsXbV09yeZg3ijhRuEXozEIYE68Go9JmOFshamsK9iKlNQ==} - dependencies: - '@ipld/car': 3.2.4 - '@web-std/blob': 3.0.5 - bl: 5.1.0 - blockstore-core: 1.0.5 - browser-readablestream-to-it: 1.0.3 - idb-keyval: 6.2.1 - interface-blockstore: 2.0.3 - ipfs-core-types: 0.8.4(node-fetch@3.3.2) - ipfs-core-utils: 0.12.2(node-fetch@3.3.2) - ipfs-unixfs-exporter: 7.0.11 - ipfs-unixfs-importer: 9.0.10 - ipfs-utils: 9.0.14 - it-all: 1.0.6 - it-last: 1.0.6 - it-pipe: 1.1.0 - meow: 9.0.0 - move-file: 2.1.0 - multiformats: 9.9.0 - stream-to-it: 0.2.4 - streaming-iterables: 6.2.0 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - encoding - - node-fetch - - supports-color - dev: false - - /ipfs-core-types@0.8.4(node-fetch@3.3.2): - resolution: {integrity: sha512-sbRZA1QX3xJ6ywTiVQZMOxhlhp4osAZX2SXx3azOLxAtxmGWDMkHYt722VV4nZ2GyJy8qyk5GHQIZ0uvQnpaTg==} - dependencies: - interface-datastore: 6.1.1 - multiaddr: 10.0.1(node-fetch@3.3.2) - multiformats: 9.9.0 - transitivePeerDependencies: - - node-fetch - - supports-color - dev: false - /ipfs-core-types@0.9.0(node-fetch@3.3.2): resolution: {integrity: sha512-VJ8vJSHvI1Zm7/SxsZo03T+zzpsg8pkgiIi5hfwSJlsrJ1E2v68QPlnLshGHUSYw89Oxq0IbETYl2pGTFHTWfg==} dependencies: @@ -21632,35 +21378,6 @@ packages: - supports-color dev: true - /ipfs-core-utils@0.12.2(node-fetch@3.3.2): - resolution: {integrity: sha512-RfxP3rPhXuqKIUmTAUhmee6fmaV3A7LMnjOUikRKpSyqESz/DR7aGK7tbttMxkZdkSEr0rFXlqbyb0vVwmn0wQ==} - dependencies: - any-signal: 2.1.2 - blob-to-it: 1.0.4 - browser-readablestream-to-it: 1.0.3 - debug: 4.3.4(supports-color@8.1.1) - err-code: 3.0.1 - ipfs-core-types: 0.8.4(node-fetch@3.3.2) - ipfs-unixfs: 6.0.9 - ipfs-utils: 9.0.14 - it-all: 1.0.6 - it-map: 1.0.6 - it-peekable: 1.0.3 - it-to-stream: 1.0.0 - merge-options: 3.0.4 - multiaddr: 10.0.1(node-fetch@3.3.2) - multiaddr-to-uri: 8.0.0(node-fetch@3.3.2) - multiformats: 9.9.0 - nanoid: 3.3.6 - parse-duration: 1.1.0 - timeout-abort-controller: 1.1.1 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - encoding - - node-fetch - - supports-color - dev: false - /ipfs-core-utils@0.13.0(node-fetch@3.3.2): resolution: {integrity: sha512-HP5EafxU4/dLW3U13CFsgqVO5Ika8N4sRSIb/dTg16NjLOozMH31TXV0Grtu2ZWo1T10ahTzMvrfT5f4mhioXw==} dependencies: @@ -21719,52 +21436,13 @@ packages: - supports-color dev: true - /ipfs-unixfs-exporter@7.0.11: - resolution: {integrity: sha512-qTYa69J7HbI2EIYNUddKPg9Y3rHkYZV0bNdmzZKA5+ZbwRVoUEuBW/cguEqTp22zHygh3sMnzYZFm0naVIdMgQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@ipld/dag-cbor': 7.0.3 - '@ipld/dag-pb': 2.1.18 - '@multiformats/murmur3': 1.1.3 - err-code: 3.0.1 - hamt-sharding: 2.0.1 - interface-blockstore: 2.0.3 - ipfs-unixfs: 6.0.9 - it-last: 1.0.6 - multiformats: 9.9.0 - uint8arrays: 3.1.1 - dev: false - - /ipfs-unixfs-importer@9.0.10: - resolution: {integrity: sha512-W+tQTVcSmXtFh7FWYWwPBGXJ1xDgREbIyI1E5JzDcimZLIyT5gGMfxR3oKPxxWj+GKMpP5ilvMQrbsPzWcm3Fw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@ipld/dag-pb': 2.1.18 - '@multiformats/murmur3': 1.1.3 - bl: 5.1.0 - err-code: 3.0.1 - hamt-sharding: 2.0.1 - interface-blockstore: 2.0.3 - ipfs-unixfs: 6.0.9 - it-all: 1.0.6 - it-batch: 1.0.9 - it-first: 1.0.7 - it-parallel-batch: 1.0.11 - merge-options: 3.0.4 - multiformats: 9.9.0 - rabin-wasm: 0.1.5 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - /ipfs-unixfs@6.0.9: resolution: {integrity: sha512-0DQ7p0/9dRB6XCb0mVCTli33GzIzSVx5udpJuVM47tGcD+W+Bl4LsnoLswd3ggNnNEakMv1FdoFITiEnchXDqQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: err-code: 3.0.1 protobufjs: 6.11.4 + dev: true /ipfs-utils@9.0.14: resolution: {integrity: sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==} @@ -21788,24 +21466,7 @@ packages: stream-to-it: 0.2.4 transitivePeerDependencies: - encoding - - /ipns@0.16.0: - resolution: {integrity: sha512-fBYkRjN3/fc6IQujUF4WBEyOXegK715w+wx9IErV6H2B5JXsMnHOBceUKn3L90dj+wJfHs6T+hM/OZiTT6mQCw==} - dependencies: - cborg: 1.10.2 - debug: 4.3.4(supports-color@8.1.1) - err-code: 3.0.1 - interface-datastore: 6.1.1 - libp2p-crypto: 0.21.2 - long: 4.0.0 - multiformats: 9.9.0 - peer-id: 0.16.0 - protobufjs: 6.11.4 - timestamp-nano: 1.0.1 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: false + dev: true /iron-webcrypto@1.0.0: resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==} @@ -21924,6 +21585,7 @@ packages: /is-electron@2.2.2: resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + dev: true /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} @@ -21999,6 +21661,7 @@ packages: engines: {node: '>=8'} dependencies: ip-regex: 4.3.0 + dev: true /is-lower-case@2.0.2: resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} @@ -22063,6 +21726,7 @@ packages: /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} + dev: true /is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} @@ -22285,17 +21949,10 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /iso-random-stream@2.0.2: - resolution: {integrity: sha512-yJvs+Nnelic1L2vH2JzWvvPQFA4r7kSTnpST/+LkAQjSz0hos2oqLD+qIVi9Qk38Hoe7mNDt3j0S27R58MVjLQ==} - engines: {node: '>=10'} - dependencies: - events: 3.3.0 - readable-stream: 3.6.2 - dev: false - /iso-url@1.2.1: resolution: {integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==} engines: {node: '>=12'} + dev: true /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} @@ -22341,7 +21998,7 @@ packages: peerDependencies: ws: '*' dependencies: - ws: 8.14.2 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) /isows@1.0.3(ws@8.13.0): resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} @@ -22459,61 +22116,34 @@ packages: /it-all@1.0.6: resolution: {integrity: sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==} + dev: true /it-all@3.0.4: resolution: {integrity: sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==} dev: true - /it-batch@1.0.9: - resolution: {integrity: sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA==} - dev: false - - /it-drain@1.0.5: - resolution: {integrity: sha512-r/GjkiW1bZswC04TNmUnLxa6uovme7KKwPhc+cb1hHU65E3AByypHH6Pm91WHuvqfFsm+9ws0kPtDBV3/8vmIg==} - dev: false - - /it-filter@1.0.3: - resolution: {integrity: sha512-EI3HpzUrKjTH01miLHWmhNWy3Xpbx4OXMXltgrNprL5lDpF3giVpHIouFpr5l+evXw6aOfxhnt01BIB+4VQA+w==} - dev: false - /it-first@1.0.7: resolution: {integrity: sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==} - - /it-glob@0.0.13: - resolution: {integrity: sha512-0Hcd5BraJUPzL28NWiFbdNrcdyNxNTKKdU3sjdFiYynNTQpwlG2UKW31X7bp+XhJwux/oPzIquo5ioztVmc2RQ==} - dependencies: - '@types/minimatch': 3.0.5 - minimatch: 3.1.2 - dev: false + dev: true /it-glob@1.0.2: resolution: {integrity: sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==} dependencies: '@types/minimatch': 3.0.5 minimatch: 3.1.2 + dev: true /it-last@1.0.6: resolution: {integrity: sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q==} + dev: true /it-map@1.0.6: resolution: {integrity: sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ==} - - /it-parallel-batch@1.0.11: - resolution: {integrity: sha512-UWsWHv/kqBpMRmyZJzlmZeoAMA0F3SZr08FBdbhtbe+MtoEBgr/ZUAKrnenhXCBrsopy76QjRH2K/V8kNdupbQ==} - dependencies: - it-batch: 1.0.9 - dev: false + dev: true /it-peekable@1.0.3: resolution: {integrity: sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ==} - - /it-pipe@1.1.0: - resolution: {integrity: sha512-lF0/3qTVeth13TOnHVs0BTFaziwQF7m5Gg+E6JV0BXcLKutC92YjSi7bASgkPOXaLEb+YvNZrPorGMBIJvZfxg==} - dev: false - - /it-take@1.0.2: - resolution: {integrity: sha512-u7I6qhhxH7pSevcYNaMECtkvZW365ARqAIt9K+xjdK1B2WUDEjQSfETkOCT8bxFq/59LqrN3cMLUtTgmDBaygw==} - dev: false + dev: true /it-to-stream@1.0.0: resolution: {integrity: sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==} @@ -22524,6 +22154,7 @@ packages: p-defer: 3.0.0 p-fifo: 1.0.0 readable-stream: 3.6.2 + dev: true /iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} @@ -23511,20 +23142,6 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /libp2p-crypto@0.21.2: - resolution: {integrity: sha512-EXFrhSpiHtJ+/L8xXDvQNK5VjUMG51u878jzZcaT5XhuN/zFg6PWJFnl/qB2Y2j7eMWnvCRP7Kp+ua2H36cG4g==} - engines: {node: '>=12.0.0'} - dependencies: - '@noble/ed25519': 1.7.3 - '@noble/secp256k1': 1.7.1 - err-code: 3.0.1 - iso-random-stream: 2.0.2 - multiformats: 9.9.0 - node-forge: 1.3.1 - protobufjs: 6.11.4 - uint8arrays: 3.1.1 - dev: false - /lie@3.1.1: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} dependencies: @@ -23973,6 +23590,7 @@ packages: /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: true /long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} @@ -24134,10 +23752,12 @@ packages: /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} + dev: true /map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} + dev: true /markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} @@ -24622,24 +24242,6 @@ packages: yargs-parser: 20.2.9 dev: true - /meow@9.0.0: - resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} - engines: {node: '>=10'} - dependencies: - '@types/minimist': 1.2.4 - camelcase-keys: 6.2.2 - decamelize: 1.2.0 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: false - /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} @@ -24648,6 +24250,7 @@ packages: engines: {node: '>=10'} dependencies: is-plain-obj: 2.1.0 + dev: true /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -25735,6 +25338,7 @@ packages: /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + dev: true /mini-css-extract-plugin@2.7.6(webpack@5.89.0): resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} @@ -25838,6 +25442,7 @@ packages: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 + dev: true /minimist@1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} @@ -25975,13 +25580,6 @@ packages: '@motionone/vue': 10.16.4 dev: false - /move-file@2.1.0: - resolution: {integrity: sha512-i9qLW6gqboJ5Ht8bauZi7KlTnQ3QFpBCvMvFfEcHADKgHGeJ9BZMO7SFCTwHPV9Qa0du9DYY1Yx3oqlGt30nXA==} - engines: {node: '>=10.17'} - dependencies: - path-exists: 4.0.0 - dev: false - /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -26008,6 +25606,7 @@ packages: transitivePeerDependencies: - node-fetch - supports-color + dev: true /multiaddr@10.0.1(node-fetch@3.3.2): resolution: {integrity: sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg==} @@ -26021,6 +25620,7 @@ packages: transitivePeerDependencies: - node-fetch - supports-color + dev: true /multibase@0.6.1: resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} @@ -26078,11 +25678,6 @@ packages: imul: 1.0.1 dev: true - /murmurhash3js-revisited@3.0.0: - resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} - engines: {node: '>=8.0.0'} - dev: false - /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} dev: true @@ -26151,6 +25746,7 @@ packages: abort-controller: '*' dependencies: abort-controller: 3.0.0 + dev: true /native-fetch@3.0.0(node-fetch@2.7.0): resolution: {integrity: sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==} @@ -26158,6 +25754,7 @@ packages: node-fetch: '*' dependencies: node-fetch: 2.7.0 + dev: true /native-fetch@3.0.0(node-fetch@3.3.2): resolution: {integrity: sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==} @@ -26165,6 +25762,7 @@ packages: node-fetch: '*' dependencies: node-fetch: 3.3.2 + dev: true /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -26226,28 +25824,6 @@ packages: - babel-plugin-macros dev: false - /nft.storage@7.1.1(node-fetch@3.3.2): - resolution: {integrity: sha512-OHFeRiWLcGCWHX8Kx3yvSt7qGbHwEROl0kcN2xaHWBaR0ApYH5DnjlqczXSwP9WwBDtjhyDk4IHReXSwuZkB7Q==} - dependencies: - '@ipld/car': 3.2.4 - '@ipld/dag-cbor': 6.0.15 - '@web-std/blob': 3.0.5 - '@web-std/fetch': 4.2.1 - '@web-std/file': 3.0.3 - '@web-std/form-data': 3.1.0 - carbites: 1.0.6 - ipfs-car: 0.6.2(node-fetch@3.3.2) - it-pipe: 1.1.0 - multiformats: 9.9.0 - p-retry: 4.6.2 - streaming-iterables: 6.2.0 - throttled-queue: 2.1.4 - transitivePeerDependencies: - - encoding - - node-fetch - - supports-color - dev: false - /nise@5.1.5: resolution: {integrity: sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==} dependencies: @@ -26392,6 +25968,7 @@ packages: resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 + dev: true /normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} @@ -26401,6 +25978,7 @@ packages: is-core-module: 2.13.1 semver: 7.5.4 validate-npm-package-license: 3.0.4 + dev: true /normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} @@ -26801,6 +26379,7 @@ packages: /p-defer@3.0.0: resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} engines: {node: '>=8'} + dev: true /p-event@2.3.1: resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==} @@ -26814,6 +26393,7 @@ packages: dependencies: fast-fifo: 1.3.2 p-defer: 3.0.0 + dev: true /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} @@ -26971,6 +26551,7 @@ packages: /parse-duration@1.1.0: resolution: {integrity: sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==} + dev: true /parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} @@ -27172,17 +26753,6 @@ packages: safe-buffer: 5.2.1 sha.js: 2.4.11 - /peer-id@0.16.0: - resolution: {integrity: sha512-EmL7FurFUduU9m1PS9cfJ5TAuCvxKQ7DKpfx3Yj6IKWyBRtosriFuOag/l3ni/dtPgPLwiA4R9IvpL7hsDLJuQ==} - engines: {node: '>=15.0.0'} - dependencies: - class-is: 1.1.0 - libp2p-crypto: 0.21.2 - multiformats: 9.9.0 - protobufjs: 6.11.4 - uint8arrays: 3.1.1 - dev: false - /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -27965,6 +27535,7 @@ packages: '@types/long': 4.0.2 '@types/node': 18.18.7 long: 4.0.0 + dev: true /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -28174,25 +27745,12 @@ packages: /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} + dev: true /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - /rabin-wasm@0.1.5: - resolution: {integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==} - dependencies: - '@assemblyscript/loader': 0.9.4 - bl: 5.1.0 - debug: 4.3.4(supports-color@8.1.1) - minimist: 1.2.8 - node-fetch: 2.7.0 - readable-stream: 3.6.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - /radix3@1.1.0: resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} dev: false @@ -28403,6 +27961,7 @@ packages: resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==} dependencies: p-defer: 3.0.0 + dev: true /react-native-fs@2.20.0(react-native@0.72.6): resolution: {integrity: sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ==} @@ -28657,6 +28216,7 @@ packages: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 + dev: true /read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} @@ -28675,6 +28235,7 @@ packages: normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 + dev: true /readable-stream@1.0.34: resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} @@ -28737,6 +28298,7 @@ packages: resolution: {integrity: sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==} dependencies: ms: 2.1.3 + dev: true /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} @@ -28762,6 +28324,7 @@ packages: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 + dev: true /redeyed@2.1.1: resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} @@ -29218,10 +28781,6 @@ packages: signal-exit: 3.0.7 dev: true - /retimer@2.0.0: - resolution: {integrity: sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg==} - dev: false - /retimer@3.0.0: resolution: {integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==} dev: true @@ -30292,10 +29851,6 @@ packages: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} dev: false - /sparse-array@1.3.2: - resolution: {integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==} - dev: false - /spawn-wrap@2.0.0: resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} engines: {node: '>=8'} @@ -30313,18 +29868,22 @@ packages: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.16 + dev: true /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.16 + dev: true /spdx-license-ids@3.0.16: resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + dev: true /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -30503,11 +30062,7 @@ packages: resolution: {integrity: sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==} dependencies: get-iterator: 1.0.2 - - /streaming-iterables@6.2.0: - resolution: {integrity: sha512-3AYC8oB60WyD1ic7uHmN/vm2oRGzRnQ3XFBl/bFMDi1q1+nc5/vjMmiE4vroIya3jG59t87VpyAj/iXYxyw9AA==} - engines: {node: '>=10'} - dev: false + dev: true /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} @@ -30709,6 +30264,7 @@ packages: engines: {node: '>=8'} dependencies: min-indent: 1.0.1 + dev: true /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} @@ -31138,10 +30694,6 @@ packages: engines: {node: '>=10'} dev: false - /throttled-queue@2.1.4: - resolution: {integrity: sha512-YGdk8sdmr4ge3g+doFj/7RLF5kLM+Mi7DEciu9PHxnMJZMeVuZeTj31g4VE7ekUffx/IdbvrtOCiz62afg0mkg==} - dev: false - /throttleit@1.0.0: resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==} dev: true @@ -31170,13 +30722,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /timeout-abort-controller@1.1.1: - resolution: {integrity: sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ==} - dependencies: - abort-controller: 3.0.0 - retimer: 2.0.0 - dev: false - /timeout-abort-controller@2.0.0: resolution: {integrity: sha512-2FAPXfzTPYEgw27bQGTHc0SzrbmnU2eso4qo172zMLZzaGqeu09PFa5B2FCUHM1tflgRqPgn5KQgp6+Vex4uNA==} dependencies: @@ -31192,11 +30737,6 @@ packages: next-tick: 1.1.0 dev: true - /timestamp-nano@1.0.1: - resolution: {integrity: sha512-4oGOVZWTu5sl89PtCDnhQBSt7/vL1zVEwAfxH1p49JhTosxzVQWYBYFRFZ8nJmo0G6f824iyP/44BFAwIoKvIA==} - engines: {node: '>= 4.5.0'} - dev: false - /tiny-invariant@1.3.1: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: false @@ -31337,6 +30877,7 @@ packages: /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} + dev: true /trim-repeated@1.0.0: resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} @@ -31677,6 +31218,7 @@ packages: /type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} + dev: true /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} @@ -31689,6 +31231,7 @@ packages: /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} + dev: true /type-fest@0.7.1: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} @@ -31697,6 +31240,7 @@ packages: /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + dev: true /type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} @@ -32424,6 +31968,7 @@ packages: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + dev: true /validate-npm-package-name@4.0.0: resolution: {integrity: sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==} @@ -32464,6 +32009,7 @@ packages: /varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + dev: true /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} @@ -32861,20 +32407,6 @@ packages: xml-name-validator: 4.0.0 dev: true - /w3name@1.0.8: - resolution: {integrity: sha512-MjCUGATeNm70YE1Zro4mykaoRI9dTTlr44AB83Qt6OaRlcLvH9g0gyLwAMd3gBm8oDVU/RrDAxsDGcO8r+RIuQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@web-std/fetch': 4.2.1 - cborg: 1.10.2 - ipns: 0.16.0 - libp2p-crypto: 0.21.2 - throttled-queue: 2.1.4 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: false - /wabt@1.0.24: resolution: {integrity: sha512-8l7sIOd3i5GWfTWciPL0+ff/FK/deVK2Q6FN+MPz4vfUcD78i2M/49XJTwF6aml91uIiuXJEsLKWMB2cw/mtKg==} dev: true @@ -32958,14 +32490,6 @@ packages: dependencies: defaults: 1.0.4 - /web-encoding@1.1.5: - resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} - dependencies: - util: 0.12.5 - optionalDependencies: - '@zxing/text-encoding': 0.9.0 - dev: false - /web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} dev: false @@ -33253,31 +32777,6 @@ packages: utf8: 3.0.0 dev: true - /web3.storage@4.5.5(node-fetch@3.3.2): - resolution: {integrity: sha512-ABW1Gk4gpkVkEIgeQTcoqZ1pI1YKQiBbZDploAcyldFWCXtdBpsijrRHg0S5Mwlvllw4E8OsRm/9HG2nVaGsCg==} - dependencies: - '@ipld/car': 3.2.4 - '@web-std/blob': 3.0.5 - '@web-std/fetch': 4.2.1 - '@web-std/file': 3.0.3 - '@web3-storage/parse-link-header': 3.1.0 - browser-readablestream-to-it: 1.0.3 - carbites: 1.0.6 - cborg: 1.10.2 - files-from-path: 0.2.6 - ipfs-car: 0.7.0(node-fetch@3.3.2) - libp2p-crypto: 0.21.2 - p-retry: 4.6.2 - streaming-iterables: 6.2.0 - throttled-queue: 2.1.4 - uint8arrays: 3.1.1 - w3name: 1.0.8 - transitivePeerDependencies: - - encoding - - node-fetch - - supports-color - dev: false - /web3@1.10.3: resolution: {integrity: sha512-DgUdOOqC/gTqW+VQl1EdPxrVRPB66xVNtuZ5KD4adVBtko87hkgM8BTZ0lZ8IbUfnQk6DyjcDujMiH3oszllAw==} engines: {node: '>=8.0.0'} @@ -33844,18 +33343,6 @@ packages: utf-8-validate: optional: true - /ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - /ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} engines: {node: '>=10.0.0'} diff --git a/sdk/src/utils/apis.ts b/sdk/src/utils/apis.ts index 659d5cee..a3a2e60d 100644 --- a/sdk/src/utils/apis.ts +++ b/sdk/src/utils/apis.ts @@ -21,9 +21,7 @@ type ResponseData = { /** * Axios instance configured with the base URL for the hypercert API. */ -const api = axios.create({ - baseURL: "https://hypercerts-api.vercel.app/api/v1/web3up/", -}); +const api = axios.create({ timeout: 10000, headers: { "Content-Type": "application/json" } }); /** * Uploads metadata to the API. @@ -32,7 +30,10 @@ const api = axios.create({ * @returns The response data from the API. */ const uploadMetadata = async (metadata: HypercertMetadata) => { - const response = await api.post("metadata", metadata); + const response = await api.post( + "https://hypercerts-api-production.up.railway.app/api/v1/web3up/metadata", + metadata, + ); return response.data; }; @@ -45,7 +46,10 @@ const uploadMetadata = async (metadata: HypercertMetadata) => { * */ const uploadAllowlist = async (req: AllowListPostRequest) => { - const response = await api.post("allowlist", req); + const response = await api.post( + "https://hypercerts-api-production.up.railway.app/api/v1/web3up/allowlist", + req, + ); return response.data; }; From 808e65528464c7db2528f0536b001d4846762305 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 8 Jan 2024 05:11:21 +0100 Subject: [PATCH 073/118] fix(build): update viem and fe client config --- frontend/hooks/hypercerts-client.ts | 3 --- pnpm-lock.yaml | 8 ++++---- sdk/package.json | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/frontend/hooks/hypercerts-client.ts b/frontend/hooks/hypercerts-client.ts index ca7a63af..63143661 100644 --- a/frontend/hooks/hypercerts-client.ts +++ b/frontend/hooks/hypercerts-client.ts @@ -1,6 +1,5 @@ import React, { useEffect } from "react"; -import { NFT_STORAGE_TOKEN, WEB3_STORAGE_TOKEN } from "../lib/config"; import { HypercertClient, HypercertClientConfig } from "@hypercerts-org/sdk"; import { useWalletClient, useNetwork } from "wagmi"; @@ -17,8 +16,6 @@ export const useHypercertClient = ({ const { chain } = useNetwork(); const clientConfig = { chain: overrideChainId ? { id: overrideChainId } : chain, - nftStorageToken: NFT_STORAGE_TOKEN, - web3StorageToken: WEB3_STORAGE_TOKEN, }; const [client, setClient] = React.useState(() => { if (clientConfig.chain?.id && isSupportedChain(clientConfig.chain.id)) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28122cce..f3e2f98b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -598,8 +598,8 @@ importers: specifier: ^4.0.6 version: 4.0.6(graphql@16.8.1)(react@18.2.0) viem: - specifier: ^1.19.9 - version: 1.19.9(typescript@5.3.2) + specifier: ^1.19.15 + version: 1.19.15(typescript@5.3.2) devDependencies: '@babel/core': specifier: ^7.23.5 @@ -32136,8 +32136,8 @@ packages: - zod dev: false - /viem@1.19.9(typescript@5.3.2): - resolution: {integrity: sha512-Sf9U2x4jU0S/FALqYypcspWOGene0NZyD470oUripNhE0Ta6uOE/OgE4toTDVfRxov8qw0JFinr/wPGxYE3+HQ==} + /viem@1.19.15(typescript@5.3.2): + resolution: {integrity: sha512-rc87AkyrUUsoOAgMNYP+X/wN4GYwbhP87DkmsqQCYKxxQyzTX0+yliKs6Bxljbjr8ybU72GOb12Oyus6393AjQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: diff --git a/sdk/package.json b/sdk/package.json index 0c985241..87c3e49a 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -35,7 +35,7 @@ "graphql": "^16.8.1", "loglevel": "^1.8.1", "urql": "^4.0.6", - "viem": "^1.19.9" + "viem": "^1.19.15" }, "devDependencies": { "@babel/core": "^7.23.5", From fd70875dc2f0d05bf1020e5c043fdf8dd436c399 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 8 Jan 2024 05:14:13 +0100 Subject: [PATCH 074/118] chore(bump): sdk 1.1.0 release and bump fe --- frontend/package.json | 2 +- pnpm-lock.yaml | 63 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index d67d2a05..a0913ccb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -25,7 +25,7 @@ "@graphprotocol/client-cli": "^2.2.16", "@hypercerts-org/contracts": "1.0.0", "@hypercerts-org/observabletreemap": "workspace: *", - "@hypercerts-org/sdk": "workspace: *", + "@hypercerts-org/sdk": "1.1.0", "@mui/icons-material": "^5.11.9", "@mui/material": "^5.11.2", "@mui/x-date-pickers": "^5.0.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f3e2f98b..5525eda1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -348,8 +348,8 @@ importers: specifier: 'workspace: *' version: link:../vendor/observabletreemap '@hypercerts-org/sdk': - specifier: 'workspace: *' - version: link:../sdk + specifier: 1.1.0 + version: 1.1.0(react@18.2.0)(typescript@5.1.6)(zod@3.22.4) '@mui/icons-material': specifier: ^5.11.9 version: 5.14.15(@mui/material@5.14.15)(@types/react@18.2.33)(react@18.2.0) @@ -5054,6 +5054,18 @@ packages: - utf-8-validate dev: false + /@ethereum-attestation-service/eas-contracts@1.3.7(typescript@5.1.6): + resolution: {integrity: sha512-msCKGDhqSjfkx0lbs0PPkf/Z6bWxaYT9ze/uLoRh1tM7W8N27mobX4g6AsjATqGC+eWHRfliK9eCwJQj7TU8WA==} + dependencies: + hardhat: 2.19.1(typescript@5.1.6) + transitivePeerDependencies: + - bufferutil + - supports-color + - ts-node + - typescript + - utf-8-validate + dev: false + /@ethereum-attestation-service/eas-sdk@1.3.7(ts-node@10.9.1)(typescript@5.3.2): resolution: {integrity: sha512-7dmy3w/hIeUYGTvkoFIo/JSviiTK8qhjr0BKf7qK+xSPYt9rW9Qksw1njqC5G3OXyp5teaXCH05v75NOASYoSQ==} dependencies: @@ -5072,6 +5084,24 @@ packages: - utf-8-validate dev: false + /@ethereum-attestation-service/eas-sdk@1.3.7(typescript@5.1.6): + resolution: {integrity: sha512-7dmy3w/hIeUYGTvkoFIo/JSviiTK8qhjr0BKf7qK+xSPYt9rW9Qksw1njqC5G3OXyp5teaXCH05v75NOASYoSQ==} + dependencies: + '@ethereum-attestation-service/eas-contracts': 1.3.7(typescript@5.1.6) + ethers: 6.9.0 + js-base64: 3.7.5 + lodash: 4.17.21 + multiformats: 9.9.0 + pako: 2.1.0 + semver: 7.5.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - ts-node + - typescript + - utf-8-validate + dev: false + /@ethereumjs/common@2.6.5: resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} dependencies: @@ -7314,6 +7344,35 @@ packages: - utf-8-validate dev: false + /@hypercerts-org/sdk@1.1.0(react@18.2.0)(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-kaNg/ehgR4wAJC0QGHzBSVyZ1yLWNaWCNLf9HrzOId8D2r1RnEqZHtEc0/C3WGrtRzvMoguUAXLS3tOtJ3wRcw==} + dependencies: + '@ethereum-attestation-service/eas-sdk': 1.3.7(typescript@5.1.6) + '@ethersproject/abstract-signer': 5.7.0 + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + '@hypercerts-org/contracts': 1.0.0(typescript@5.1.6) + '@openzeppelin/merkle-tree': 1.0.5 + '@urql/core': 4.2.0(graphql@16.8.1) + '@whatwg-node/fetch': 0.9.14 + ajv: 8.12.0 + axios: 1.6.2(debug@4.3.4) + dotenv: 16.3.1 + ethers: 5.7.2 + graphql: 16.8.1 + loglevel: 1.8.1 + urql: 4.0.6(graphql@16.8.1)(react@18.2.0) + viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - debug + - react + - supports-color + - ts-node + - typescript + - utf-8-validate + - zod + dev: false + /@iarna/toml@2.2.5: resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} dev: true From 0df2168a798923061aef69abd884a6467b1da465 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Mon, 8 Jan 2024 09:53:26 +0100 Subject: [PATCH 075/118] (chore): update changelog --- sdk/RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/RELEASE.md b/sdk/RELEASE.md index 4cd559c4..cd8ffb37 100644 --- a/sdk/RELEASE.md +++ b/sdk/RELEASE.md @@ -1,6 +1,6 @@ # Release notes -## 1.0.4 +## 1.1.1 - Deprecate goerli chain From d87fa08d0c78bb5acbb5d3974be4d193b763fa7b Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 8 Jan 2024 12:31:26 +0100 Subject: [PATCH 076/118] fix(ci): linting --- contracts/package.json | 2 +- contracts/src/marketplace/LooksRareProtocol.sol | 1 - contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol | 1 - contracts/src/marketplace/libraries/OrderStructs.sol | 1 - contracts/test/foundry/marketplace/TransferManager.t.sol | 2 -- .../executionStrategies/HypercertFractionOffers.t.sol | 1 - contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol | 1 - 7 files changed, 1 insertion(+), 8 deletions(-) diff --git a/contracts/package.json b/contracts/package.json index a8fa9340..d12b0684 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -99,7 +99,7 @@ "deploy:marketplace:dryrun": "forge script scripts/deployment/Deployment.s.sol:Deployment --fork-url", "docs": "pnpm hardhat dodoc", "lint": "pnpm lint:sol && pnpm prettier:check", - "lint:sol": "forge fmt --check && solhint \"./{src,test/foundry/protocol,test/foundry/marketplace}/**/*.sol\"", + "lint:sol": "forge fmt && solhint \"./{src,test/foundry/protocol,test/foundry/marketplace}/**/*.sol\"", "prepublish": "pnpm build", "prettier": "prettier --config \"./.prettierrc.yml\" --write \"**/*.{json,md,ts,yml}\"", "prettier:check": "prettier --config \"./.prettierrc.yml\" --check \"**/*.{json,md,ts,yml}\"", diff --git a/contracts/src/marketplace/LooksRareProtocol.sol b/contracts/src/marketplace/LooksRareProtocol.sol index 9f3eb107..676df3b0 100644 --- a/contracts/src/marketplace/LooksRareProtocol.sol +++ b/contracts/src/marketplace/LooksRareProtocol.sol @@ -83,7 +83,6 @@ import {CollectionType} from "./enums/CollectionType.sol"; * ~~~~~~ * @author LooksRare protocol team (👀,💎); bitbeckers */ - contract LooksRareProtocol is ILooksRareProtocol, TransferSelectorNFT, diff --git a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol index 5c330c38..38165f8e 100644 --- a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol +++ b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol @@ -20,7 +20,6 @@ contract LowLevelHypercertCaller { * @param tokenId tokenId to transfer * @param amounts split distribution */ - function _executeHypercertSplitFraction(address collection, address to, uint256 tokenId, uint256[] memory amounts) internal { diff --git a/contracts/src/marketplace/libraries/OrderStructs.sol b/contracts/src/marketplace/libraries/OrderStructs.sol index 38c632b2..9feafddb 100644 --- a/contracts/src/marketplace/libraries/OrderStructs.sol +++ b/contracts/src/marketplace/libraries/OrderStructs.sol @@ -69,7 +69,6 @@ library OrderStructs { /** * 3. Merkle tree struct */ - enum MerkleTreeNodePosition { Left, Right diff --git a/contracts/test/foundry/marketplace/TransferManager.t.sol b/contracts/test/foundry/marketplace/TransferManager.t.sol index e9e56855..7760a511 100644 --- a/contracts/test/foundry/marketplace/TransferManager.t.sol +++ b/contracts/test/foundry/marketplace/TransferManager.t.sol @@ -56,7 +56,6 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { /** * 0. Internal helper functions */ - function _grantApprovals(address user) private asPrankedUser(user) { mockERC721.setApprovalForAll(address(transferManager), true); mockERC1155.setApprovalForAll(address(transferManager), true); @@ -93,7 +92,6 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { /** * 1. Happy cases */ - function testTransferSingleItemERC721() public { _allowOperator(_transferrer); _grantApprovals(_sender); diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol index c04a128a..d8ae2a99 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol @@ -174,7 +174,6 @@ contract HypercertFractionOffersTest is ProtocolBase { /** * A collection offer without merkle tree criteria */ - function testTakerBidHypercertFractionOrderPartialFill() public { _setUpUsers(); diff --git a/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol b/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol index 43857193..b28c68a6 100644 --- a/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol +++ b/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol @@ -13,7 +13,6 @@ contract MerkleWithPosition { * PROOF GENERATION * * */ - function getRoot(OrderStructs.MerkleTreeNode[] memory data) public pure returns (bytes32) { require(data.length > 1, "won't generate root for single leaf"); while (data.length > 1) { From 8d44aebe7a2a624f4743d6bca752b88e4fe01d97 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 8 Jan 2024 16:00:24 +0100 Subject: [PATCH 077/118] fix(v02): final mitigation findings --- .../audits/marketplace/Hypercerts_v01-1.md | 18 +- .../audits/marketplace/Hypercerts_v02.md | 75 +++++++- .../src/marketplace/LooksRareProtocol.sol | 70 ++++++- .../marketplace/helpers/ProtocolHelpers.sol | 3 + contracts/src/protocol/SemiFungible1155.sol | 6 +- .../foundry/protocol/SemiFungible1155.t.sol | 76 ++++++++ .../libraries/RoyaltyFeeRegistry.md | 172 ++++++++++++++++++ 7 files changed, 398 insertions(+), 22 deletions(-) create mode 100644 docs/docs/developer/api/contracts/marketplace/libraries/RoyaltyFeeRegistry.md diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.md b/contracts/audits/marketplace/Hypercerts_v01-1.md index b6e4d2d9..02e08ac4 100644 --- a/contracts/audits/marketplace/Hypercerts_v01-1.md +++ b/contracts/audits/marketplace/Hypercerts_v01-1.md @@ -2,16 +2,16 @@ | Severity Level | Finding ID | Description | Status | | --------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------- | ------ | -| High | TRST-H-1 | A buyer can purchase more token units than the seller intended | Review | -| High | TRST-H-2 | The fraction offer maker order is not invalidated correctly, leading to orders being replayed | Review | -| High | TRST-H-3 | When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected | Review | -| Medium | TRST-M-1 | An attacker could grief buyer into getting a lower-value item than intended | Review | -| Medium | TRST-M-2 | Fraction offers can be blocked from being fully fulfilled | Review | -| Low | TRST-L-1 | The strategy validation function for fraction sales could revert | Review | -| Low | TRST-L-2 | Hypercert orders with invalid amount will pass validations | Review | -| Recommendations | TRST-R-1 | Improve validation of orders in fraction offers | Review | +| High | TRST-H-1 | A buyer can purchase more token units than the seller intended | in V02 | +| High | TRST-H-2 | The fraction offer maker order is not invalidated correctly, leading to orders being replayed | Fixed | +| High | TRST-H-3 | When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected | in V02 | +| Medium | TRST-M-1 | An attacker could grief buyer into getting a lower-value item than intended | Fixed | +| Medium | TRST-M-2 | Fraction offers can be blocked from being fully fulfilled | inV02 | +| Low | TRST-L-1 | The strategy validation function for fraction sales could revert | Fixed | +| Low | TRST-L-2 | Hypercert orders with invalid amount will pass validations | Fixed | +| Recommendations | TRST-R-1 | Improve validation of orders in fraction offers | Done | | Systemic Risk | TRST-SR-1 | Risks associated with hypercerts | OK | -| | TRST-OOS | Allowlist tracking | WIP | +| | TRST-OOS | Allowlist tracking | Fixed | ### TRST-H-1 | A buyer can purchase more token units than the seller diff --git a/contracts/audits/marketplace/Hypercerts_v02.md b/contracts/audits/marketplace/Hypercerts_v02.md index ba4bce67..1a4710fa 100644 --- a/contracts/audits/marketplace/Hypercerts_v02.md +++ b/contracts/audits/marketplace/Hypercerts_v02.md @@ -1,21 +1,76 @@ +## Findings + +| Severity Level | Finding ID | Description | Status | +| -------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------ | +| High | TRST-H-1 | A buyer can purchase more token units than the seller intended | Acknowledged | +| High | TRST-H-3 | When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected | Review | +| Medium | TRST-M-2 | Fraction offers can be blocked from being fully fulfilled | Review | +| ??? | TRST-OOS | Gas optimisation `_beforeUnitTransfer` | Fixed | + ### TRST-H-1 A buyer can purchase more token units than the seller intended We acknowledge that the user can increase the amounts of units during the sale periode, potentially leading to a sale of more units than the seller intended. This is a risk that is inherent to the design of the strategy. However, this would -require the user to actively increase the amount of units during the sale periode, which is not a common use case. +require the user to actively increase the amount of units during the sale period, which is not a common use case. ### TRST-H-3 When Hypercerts are traded in Collection or Dutch auction offers, one of the sides can provide a lower unit amount than expected +#### H.3.A + > This would end up transferring ownership of the Hypercert, but it never checks that the unitsPerItem declared in the > maker bid is actually transferred. A malicious user can transfer all but one unit out of the tokenID to complete the > exploit. +Validations have been added to the order execution steps to ensure that the amount of units transferred is equal to the +amount of units declared in the order. + +First we get the total of the units to be transfered based on the `itemIds` returned by the strategy: + +```solidity + uint256 unitsHeldByItems; + if (makerBid.collectionType == CollectionType.Hypercert) { + unitsHeldByItems += _getUnitsHeldByHypercertFractions(makerBid.collection, itemIds); + } +``` + +After the transfer of funds, we validate the amount of units still held by the provided `itemIds`: + +````solidity +if (makerBid.collectionType == CollectionType.Hypercert) { + // If not a fractional sale + if ( + strategyInfo[makerBid.strategyId].selector + != StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector + && strategyInfo[makerBid.strategyId].selector + != StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector + ) { + if (_getUnitsHeldByHypercertFractions(makerBid.collection, itemIds) != unitsHeldByItems) { + revert UnitAmountInvalid(); + } + } + } +``` + +Lastly, the fraction is transfered to the buyer. + +#### H.3.B + > Note that Hypercerts units can be donated to other tokenIDs inside the same base type. This means that any logic that > assumes an order maker’s token amount is controlled by them is fragile. -The hypercerts protocol does not allow for transfering of units, or merging of fractions, between fractions not held by -the owner or without approval provided by the owner (i.e. `isApprovedForAll`). As such, the attacker would be either an -entity with allowance over the fractions held by the owner, or the owner itself. +A bug in the protocol has been identified with this finding. During the execution of +`_mergeTokensUnits(address _account, uint256[] memory _fractionIDs)` ownership of the units held by the `_account` is +validation, with an additional check on allowances for `msg.sender` as an operator. This check is not executed on the +receiving fraction. As an effect, an owner of hypercert units can send units to a fraction not held by the same owner. + +We added the following check to the `_mergeTokensUnits` function (and test cases): + +```solidity +if (_account == address(0) || owners[_fractionID] != _account || owners[target] != _account) + { + revert Errors.NotAllowed(); + } +``` ### TRST-M-2 Fraction offers can be blocked from being fully fulfilled @@ -63,3 +118,15 @@ and made more verbose, where the check } } ``` + +### TRST-OOS Gas optimisation `_beforeUnitTransfer` + +The followin check was executed in the loop for all items in a batch: + +```solidity +if (from != _msgSender() && !isApprovedForAll(from, _msgSender())) revert Errors.NotApprovedOrOwner(); +``` + +Since the answer to this check is the same for all items in the batch, we moved the check outside of the loop. Credit to +Trust for reporting this optimisation. +```` diff --git a/contracts/src/marketplace/LooksRareProtocol.sol b/contracts/src/marketplace/LooksRareProtocol.sol index 9f3eb107..1d6cce63 100644 --- a/contracts/src/marketplace/LooksRareProtocol.sol +++ b/contracts/src/marketplace/LooksRareProtocol.sol @@ -27,6 +27,7 @@ import { MerkleProofTooLarge, QuoteTypeInvalid } from "./errors/SharedErrors.sol"; +import {UnitAmountInvalid} from "./errors/HypercertErrors.sol"; // Direct dependencies import {TransferSelectorNFT} from "./TransferSelectorNFT.sol"; @@ -39,6 +40,9 @@ import {MAX_CALLDATA_PROOF_LENGTH, ONE_HUNDRED_PERCENT_IN_BP} from "./constants/ import {QuoteType} from "./enums/QuoteType.sol"; import {CollectionType} from "./enums/CollectionType.sol"; +// Strategies +import {StrategyHypercertFractionOffer} from "./executionStrategies/StrategyHypercertFractionOffer.sol"; + /** * @title LooksRareProtocol * @notice This contract is the core smart contract of the LooksRare protocol ("v2"). @@ -83,7 +87,6 @@ import {CollectionType} from "./enums/CollectionType.sol"; * ~~~~~~ * @author LooksRare protocol team (👀,💎); bitbeckers */ - contract LooksRareProtocol is ILooksRareProtocol, TransferSelectorNFT, @@ -367,12 +370,31 @@ contract LooksRareProtocol is bool isNonceInvalidated ) = _executeStrategyForTakerOrder(takerAsk, makerBid, msg.sender); + uint256 unitsHeldByItems; + if (makerBid.collectionType == CollectionType.Hypercert) { + unitsHeldByItems += _getUnitsHeldByHypercertFractions(makerBid.collection, itemIds); + } + // Order nonce status is updated _updateUserOrderNonce(isNonceInvalidated, signer, makerBid.orderNonce, orderHash); // Taker action goes first _executeTakerAskTakerAction(makerBid, takerAsk, msg.sender, signer, itemIds, amounts); + if (makerBid.collectionType == CollectionType.Hypercert) { + // If not a fractional sale + if ( + strategyInfo[makerBid.strategyId].selector + != StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector + && strategyInfo[makerBid.strategyId].selector + != StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector + ) { + if (_getUnitsHeldByHypercertFractions(makerBid.collection, itemIds) != unitsHeldByItems) { + revert UnitAmountInvalid(); + } + } + } + // Maker action goes second _transferToAskRecipientAndCreatorIfAny(recipients, feeAmounts, makerBid.currency, signer); @@ -415,14 +437,13 @@ contract LooksRareProtocol is revert QuoteTypeInvalid(); } - address signer = makerAsk.signer; { // Verify nonces - bytes32 userOrderNonceStatus = userOrderNonce[signer][makerAsk.orderNonce]; + bytes32 userOrderNonceStatus = userOrderNonce[makerAsk.signer][makerAsk.orderNonce]; if ( - userBidAskNonces[signer].askNonce != makerAsk.globalNonce - || userSubsetNonce[signer][makerAsk.subsetNonce] + userBidAskNonces[makerAsk.signer].askNonce != makerAsk.globalNonce + || userSubsetNonce[makerAsk.signer][makerAsk.subsetNonce] || (userOrderNonceStatus != bytes32(0) && userOrderNonceStatus != orderHash) ) { revert NoncesInvalid(); @@ -437,14 +458,33 @@ contract LooksRareProtocol is bool isNonceInvalidated ) = _executeStrategyForTakerOrder(takerBid, makerAsk, msg.sender); + uint256 unitsHeldByItems; + if (makerAsk.collectionType == CollectionType.Hypercert) { + unitsHeldByItems += _getUnitsHeldByHypercertFractions(makerAsk.collection, itemIds); + } + // Order nonce status is updated - _updateUserOrderNonce(isNonceInvalidated, signer, makerAsk.orderNonce, orderHash); + _updateUserOrderNonce(isNonceInvalidated, makerAsk.signer, makerAsk.orderNonce, orderHash); // Taker action goes first _transferToAskRecipientAndCreatorIfAny(recipients, feeAmounts, makerAsk.currency, sender); + if (makerAsk.collectionType == CollectionType.Hypercert) { + // If not a fractional sale + if ( + strategyInfo[makerAsk.strategyId].selector + != StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBid.selector + && strategyInfo[makerAsk.strategyId].selector + != StrategyHypercertFractionOffer.executeHypercertFractionStrategyWithTakerBidWithAllowlist.selector + ) { + if (_getUnitsHeldByHypercertFractions(makerAsk.collection, itemIds) != unitsHeldByItems) { + revert UnitAmountInvalid(); + } + } + } + // Maker action goes second - _executeTakerBidMakerAction(makerAsk, takerBid, signer, sender, itemIds, amounts); + _executeTakerBidMakerAction(makerAsk, takerBid, makerAsk.signer, sender, itemIds, amounts); emit TakerBid( NonceInvalidationParameters({ @@ -469,7 +509,7 @@ contract LooksRareProtocol is function _executeTakerAskTakerAction( OrderStructs.Maker calldata makerBid, - OrderStructs.Taker calldata takerAsk, + OrderStructs.Taker calldata, /* takerAsk */ address sender, address recipient, uint256[] memory itemIds, @@ -662,4 +702,18 @@ contract LooksRareProtocol is _computeDigestAndVerify(orderHash, signature, signer); } + + function _getUnitsHeldByHypercertFractions(address collection, uint256[] memory itemIds) + public + view + returns (uint256 unitsHeldByItems) + { + for (uint256 i; i < itemIds.length;) { + unitsHeldByItems += IHypercertToken(collection).unitsOf(itemIds[i]); + + unchecked { + ++i; + } + } + } } diff --git a/contracts/src/marketplace/helpers/ProtocolHelpers.sol b/contracts/src/marketplace/helpers/ProtocolHelpers.sol index 99c37c0d..6b599d89 100644 --- a/contracts/src/marketplace/helpers/ProtocolHelpers.sol +++ b/contracts/src/marketplace/helpers/ProtocolHelpers.sol @@ -10,6 +10,9 @@ import {OrderStructs} from "../libraries/OrderStructs.sol"; // Other dependencies import {LooksRareProtocol} from "../LooksRareProtocol.sol"; +// Interfaces +import {IHypercertToken} from "@hypercerts/protocol/interfaces/IHypercertToken.sol"; + /** * @title ProtocolHelpers * @notice This contract contains helper view functions for order creation. diff --git a/contracts/src/protocol/SemiFungible1155.sol b/contracts/src/protocol/SemiFungible1155.sol index ff6c94f2..3d562595 100644 --- a/contracts/src/protocol/SemiFungible1155.sol +++ b/contracts/src/protocol/SemiFungible1155.sol @@ -389,6 +389,10 @@ contract SemiFungible1155 is amounts[i] = 1; values[i] = tokenValues[_fractionID]; + if (_account == address(0) || owners[_fractionID] != _account || owners[target] != _account) { + revert Errors.NotAllowed(); + } + unchecked { ++i; } @@ -523,6 +527,7 @@ contract SemiFungible1155 is bytes memory /*data*/ ) internal virtual { uint256 len = fromIDs.length; + if (from != _msgSender() && !isApprovedForAll(from, _msgSender())) revert Errors.NotApprovedOrOwner(); for (uint256 i; i < len;) { uint256 _from = fromIDs[i]; @@ -530,7 +535,6 @@ contract SemiFungible1155 is if (isBaseType(_from)) revert Errors.NotAllowed(); if (getBaseType(_from) != getBaseType(_to)) revert Errors.TypeMismatch(); - if (from != _msgSender() && !isApprovedForAll(from, _msgSender())) revert Errors.NotApprovedOrOwner(); unchecked { ++i; } diff --git a/contracts/test/foundry/protocol/SemiFungible1155.t.sol b/contracts/test/foundry/protocol/SemiFungible1155.t.sol index 3ad7df59..fa04e45e 100644 --- a/contracts/test/foundry/protocol/SemiFungible1155.t.sol +++ b/contracts/test/foundry/protocol/SemiFungible1155.t.sol @@ -5,6 +5,7 @@ import {PRBTest} from "prb-test/PRBTest.sol"; import {StdCheats} from "forge-std/StdCheats.sol"; import {StdUtils} from "forge-std/StdUtils.sol"; import {SemiFungible1155Helper} from "./SemiFungibleHelper.sol"; +import {Errors} from "@hypercerts/protocol/libs/Errors.sol"; /// @dev See the "Writing Tests" section in the Foundry Book if this is your first time with Forge. /// https://book.getfoundry.sh/forge/writing-tests @@ -131,4 +132,79 @@ contract SemiFungible1155DefaultTest is PRBTest, StdCheats, StdUtils, SemiFungib assertEq(semiFungible.balanceOf(alice, tokenIDs[tokenIDs.length - 1]), 1); assertEq(semiFungible.unitsOf(alice, tokenIDs[tokenIDs.length - 1]), totalValue); } + + function testCannotMergeValueToZeroOrOther() public { + uint256 baseID = 1 << 128; + uint256 size = 10; + uint256 value = 2000; + uint256 totalValue = size * value; + + uint256[] memory values = semiFungible.buildValues(size, value); + uint256[] memory tokenIDs = semiFungible.buildIDs(baseID, size); + + startHoax(alice, 100 ether); + + semiFungible.mintValue(alice, values, _uri); + assertEq(semiFungible.unitsOf(baseID), totalValue); + + for (uint256 i = 0; i < (tokenIDs.length - 1); i++) { + semiFungible.validateOwnerBalanceUnits(tokenIDs[i], alice, 1, value); + + semiFungible.validateNotOwnerNoBalanceNoUnits(tokenIDs[i], bob); + } + + vm.expectRevert(Errors.NotAllowed.selector); + semiFungible.mergeValue(address(0), tokenIDs); + + vm.expectRevert(Errors.NotAllowed.selector); + semiFungible.mergeValue(bob, tokenIDs); + + semiFungible.mergeValue(alice, tokenIDs); + + for (uint256 i = 0; i < (tokenIDs.length - 1); i++) { + assertEq(semiFungible.ownerOf(tokenIDs[i]), address(0)); + + semiFungible.validateNotOwnerNoBalanceNoUnits(tokenIDs[i], alice); + } + + assertEq(semiFungible.balanceOf(alice, tokenIDs[tokenIDs.length - 1]), 1); + assertEq(semiFungible.unitsOf(alice, tokenIDs[tokenIDs.length - 1]), totalValue); + } + + function testAllFractionsOwnedByAccount() public { + uint256 baseID = 1 << 128; + uint256 size = 10; + uint256 value = 2000; + uint256 totalValue = size * value; + + uint256[] memory values = semiFungible.buildValues(size, value); + uint256[] memory tokenIDs = semiFungible.buildIDs(baseID, size); + + startHoax(alice, 100 ether); + + semiFungible.mintValue(alice, values, _uri); + assertEq(semiFungible.unitsOf(baseID), totalValue); + + semiFungible.safeTransferFrom(alice, bob, tokenIDs[tokenIDs.length - 1], 1, ""); + + for (uint256 i = 0; i < (tokenIDs.length - 1); i++) { + semiFungible.validateOwnerBalanceUnits(tokenIDs[i], alice, 1, value); + + semiFungible.validateNotOwnerNoBalanceNoUnits(tokenIDs[i], bob); + } + + vm.expectRevert(Errors.NotAllowed.selector); + semiFungible.mergeValue(alice, tokenIDs); + + vm.expectRevert(Errors.NotAllowed.selector); + semiFungible.mergeValue(bob, tokenIDs); + + semiFungible.setApprovalForAll(bob, true); + + vm.expectRevert(Errors.NotAllowed.selector); + semiFungible.mergeValue(alice, tokenIDs); + + vm.expectRevert(Errors.NotAllowed.selector); + semiFungible.mergeValue(bob, tokenIDs); + } } diff --git a/docs/docs/developer/api/contracts/marketplace/libraries/RoyaltyFeeRegistry.md b/docs/docs/developer/api/contracts/marketplace/libraries/RoyaltyFeeRegistry.md new file mode 100644 index 00000000..781ab041 --- /dev/null +++ b/docs/docs/developer/api/contracts/marketplace/libraries/RoyaltyFeeRegistry.md @@ -0,0 +1,172 @@ +# RoyaltyFeeRegistry + +> RoyaltyFeeRegistry + +It is a royalty fee registry for the LooksRare exchange. + +## Methods + +### owner + +```solidity +function owner() external view returns (address) +``` + +_Returns the address of the current owner._ + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | + +### renounceOwnership + +```solidity +function renounceOwnership() external nonpayable +``` + +_Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner._ + +### royaltyFeeInfoCollection + +```solidity +function royaltyFeeInfoCollection(address collection) external view returns (address, address, uint256) +``` + +View royalty info for a collection address + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| collection | address | collection address | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | address | undefined | +| \_1 | address | undefined | +| \_2 | uint256 | undefined | + +### royaltyFeeLimit + +```solidity +function royaltyFeeLimit() external view returns (uint256) +``` + +#### Returns + +| Name | Type | Description | +| ---- | ------- | ----------- | +| \_0 | uint256 | undefined | + +### royaltyInfo + +```solidity +function royaltyInfo(address collection, uint256 amount) external view returns (address, uint256) +``` + +Calculate royalty info for a collection address and a sale gross amount + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ------------------ | +| collection | address | collection address | +| amount | uint256 | amount | + +#### Returns + +| Name | Type | Description | +| ---- | ------- | --------------------------------------------------------- | +| \_0 | address | receiver address and amount received by royalty recipient | +| \_1 | uint256 | undefined | + +### transferOwnership + +```solidity +function transferOwnership(address newOwner) external nonpayable +``` + +_Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner._ + +#### Parameters + +| Name | Type | Description | +| -------- | ------- | ----------- | +| newOwner | address | undefined | + +### updateRoyaltyFeeLimit + +```solidity +function updateRoyaltyFeeLimit(uint256 _royaltyFeeLimit) external nonpayable +``` + +Update royalty info for collection + +#### Parameters + +| Name | Type | Description | +| ----------------- | ------- | --------------------------------------------- | +| \_royaltyFeeLimit | uint256 | new royalty fee limit (500 = 5%, 1,000 = 10%) | + +### updateRoyaltyInfoForCollection + +```solidity +function updateRoyaltyInfoForCollection(address collection, address setter, address receiver, uint256 fee) external nonpayable +``` + +Update royalty info for collection + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | ------------------------------ | +| collection | address | address of the NFT contract | +| setter | address | address that sets the receiver | +| receiver | address | receiver for the royalty fee | +| fee | uint256 | fee (500 = 5%, 1,000 = 10%) | + +## Events + +### NewRoyaltyFeeLimit + +```solidity +event NewRoyaltyFeeLimit(uint256 royaltyFeeLimit) +``` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------- | ----------- | +| royaltyFeeLimit | uint256 | undefined | + +### OwnershipTransferred + +```solidity +event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +``` + +#### Parameters + +| Name | Type | Description | +| ----------------------- | ------- | ----------- | +| previousOwner `indexed` | address | undefined | +| newOwner `indexed` | address | undefined | + +### RoyaltyFeeUpdate + +```solidity +event RoyaltyFeeUpdate(address indexed collection, address indexed setter, address indexed receiver, uint256 fee) +``` + +#### Parameters + +| Name | Type | Description | +| -------------------- | ------- | ----------- | +| collection `indexed` | address | undefined | +| setter `indexed` | address | undefined | +| receiver `indexed` | address | undefined | +| fee | uint256 | undefined | From 7f35ea7d3146df314bce885848b96d460e1edeab Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 8 Jan 2024 16:09:11 +0100 Subject: [PATCH 078/118] fix(lint): lint errors and registry sol version --- .../src/marketplace/TransferSelectorNFT.sol | 1 - .../libraries/LowLevelHypercertCaller.sol | 1 - .../marketplace/libraries/OrderStructs.sol | 1 - .../libraries/RoyaltyFeeRegistry.sol | 2 +- .../foundry/marketplace/TransferManager.t.sol | 2 -- .../HypercertFractionOffers.t.sol | 1 - .../marketplace/utils/MerkleWithPosition.sol | 1 - .../marketplace/LooksRareProtocol.md | 27 +++++++++++++++++++ 8 files changed, 28 insertions(+), 8 deletions(-) diff --git a/contracts/src/marketplace/TransferSelectorNFT.sol b/contracts/src/marketplace/TransferSelectorNFT.sol index 2b423530..004120e7 100644 --- a/contracts/src/marketplace/TransferSelectorNFT.sol +++ b/contracts/src/marketplace/TransferSelectorNFT.sol @@ -26,7 +26,6 @@ contract TransferSelectorNFT is ExecutionManager, PackableReentrancyGuard { /** * @notice Transfer manager for ERC721, ERC1155 and Hypercerts. */ - TransferManager public immutable transferManager; /** diff --git a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol index 5c330c38..38165f8e 100644 --- a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol +++ b/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol @@ -20,7 +20,6 @@ contract LowLevelHypercertCaller { * @param tokenId tokenId to transfer * @param amounts split distribution */ - function _executeHypercertSplitFraction(address collection, address to, uint256 tokenId, uint256[] memory amounts) internal { diff --git a/contracts/src/marketplace/libraries/OrderStructs.sol b/contracts/src/marketplace/libraries/OrderStructs.sol index 38c632b2..9feafddb 100644 --- a/contracts/src/marketplace/libraries/OrderStructs.sol +++ b/contracts/src/marketplace/libraries/OrderStructs.sol @@ -69,7 +69,6 @@ library OrderStructs { /** * 3. Merkle tree struct */ - enum MerkleTreeNodePosition { Left, Right diff --git a/contracts/src/marketplace/libraries/RoyaltyFeeRegistry.sol b/contracts/src/marketplace/libraries/RoyaltyFeeRegistry.sol index 321dea59..6a190b24 100644 --- a/contracts/src/marketplace/libraries/RoyaltyFeeRegistry.sol +++ b/contracts/src/marketplace/libraries/RoyaltyFeeRegistry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.17; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; diff --git a/contracts/test/foundry/marketplace/TransferManager.t.sol b/contracts/test/foundry/marketplace/TransferManager.t.sol index e9e56855..7760a511 100644 --- a/contracts/test/foundry/marketplace/TransferManager.t.sol +++ b/contracts/test/foundry/marketplace/TransferManager.t.sol @@ -56,7 +56,6 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { /** * 0. Internal helper functions */ - function _grantApprovals(address user) private asPrankedUser(user) { mockERC721.setApprovalForAll(address(transferManager), true); mockERC1155.setApprovalForAll(address(transferManager), true); @@ -93,7 +92,6 @@ contract TransferManagerTest is ITransferManager, TestHelpers, TestParameters { /** * 1. Happy cases */ - function testTransferSingleItemERC721() public { _allowOperator(_transferrer); _grantApprovals(_sender); diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol index fbc312cb..4c6b7b16 100644 --- a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol +++ b/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol @@ -306,7 +306,6 @@ contract HypercertFractionOrdersTest is ProtocolBase { /** * A collection offer without merkle tree criteria */ - function testTakerBidHypercertFractionOrderPartialFill() public { _setUpUsers(); diff --git a/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol b/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol index 43857193..b28c68a6 100644 --- a/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol +++ b/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol @@ -13,7 +13,6 @@ contract MerkleWithPosition { * PROOF GENERATION * * */ - function getRoot(OrderStructs.MerkleTreeNode[] memory data) public pure returns (bytes32) { require(data.length > 1, "won't generate root for single leaf"); while (data.length > 1) { diff --git a/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md index 69e09e0d..66bb61e8 100644 --- a/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md +++ b/docs/docs/developer/api/contracts/marketplace/LooksRareProtocol.md @@ -36,6 +36,25 @@ Wrapped ETH. | ---- | ------- | ----------- | | \_0 | address | undefined | +### \_getUnitsHeldByHypercertFractions + +```solidity +function _getUnitsHeldByHypercertFractions(address collection, uint256[] itemIds) external view returns (uint256 unitsHeldByItems) +``` + +#### Parameters + +| Name | Type | Description | +| ---------- | --------- | ----------- | +| collection | address | undefined | +| itemIds | uint256[] | undefined | + +#### Returns + +| Name | Type | Description | +| ---------------- | ------- | ----------- | +| unitsHeldByItems | uint256 | undefined | + ### addStrategy ```solidity @@ -1150,6 +1169,14 @@ error TransferNotInProgress() This is returned when there is no ownership transfer in progress but the ownership change tries to be approved. +### UnitAmountInvalid + +```solidity +error UnitAmountInvalid() +``` + +It is returned if the available amount of fraction units is not available for the selected type of transaction. For instance, a split transaction cannot be executed if the amount of fraction units is not higher than the amount of fraction units available. + ### WrongPotentialOwner ```solidity From 3a641882ef4fb182a6ea8867aab9b8b053b8dbba Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 8 Jan 2024 17:31:38 +0100 Subject: [PATCH 079/118] chore(bump): fe sdk dep --- frontend/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index a0913ccb..7d3c08fb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -25,7 +25,7 @@ "@graphprotocol/client-cli": "^2.2.16", "@hypercerts-org/contracts": "1.0.0", "@hypercerts-org/observabletreemap": "workspace: *", - "@hypercerts-org/sdk": "1.1.0", + "@hypercerts-org/sdk": "1.2.0", "@mui/icons-material": "^5.11.9", "@mui/material": "^5.11.2", "@mui/x-date-pickers": "^5.0.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5525eda1..1934926e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -348,8 +348,8 @@ importers: specifier: 'workspace: *' version: link:../vendor/observabletreemap '@hypercerts-org/sdk': - specifier: 1.1.0 - version: 1.1.0(react@18.2.0)(typescript@5.1.6)(zod@3.22.4) + specifier: 1.2.0 + version: 1.2.0(react@18.2.0)(typescript@5.1.6)(zod@3.22.4) '@mui/icons-material': specifier: ^5.11.9 version: 5.14.15(@mui/material@5.14.15)(@types/react@18.2.33)(react@18.2.0) @@ -7344,8 +7344,8 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/sdk@1.1.0(react@18.2.0)(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-kaNg/ehgR4wAJC0QGHzBSVyZ1yLWNaWCNLf9HrzOId8D2r1RnEqZHtEc0/C3WGrtRzvMoguUAXLS3tOtJ3wRcw==} + /@hypercerts-org/sdk@1.2.0(react@18.2.0)(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-khaB4m8PYaZ/Kv69miu0t/WfQf56T/pJ8V7+U1VWs8rGdVExi62NntIxkWdJ0LQMsrmlN3kLSAEQAlIpYujHpg==} dependencies: '@ethereum-attestation-service/eas-sdk': 1.3.7(typescript@5.1.6) '@ethersproject/abstract-signer': 5.7.0 From ed88850ca5a008361fd2b772b7a9cfef0b016efd Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Wed, 10 Jan 2024 13:47:57 +0100 Subject: [PATCH 080/118] chore(lint): audit v2 comments linting --- contracts/audits/marketplace/Hypercerts_v02.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/contracts/audits/marketplace/Hypercerts_v02.md b/contracts/audits/marketplace/Hypercerts_v02.md index 1a4710fa..fa95733b 100644 --- a/contracts/audits/marketplace/Hypercerts_v02.md +++ b/contracts/audits/marketplace/Hypercerts_v02.md @@ -35,8 +35,8 @@ First we get the total of the units to be transfered based on the `itemIds` retu After the transfer of funds, we validate the amount of units still held by the provided `itemIds`: -````solidity -if (makerBid.collectionType == CollectionType.Hypercert) { +```solidity + if (makerBid.collectionType == CollectionType.Hypercert) { // If not a fractional sale if ( strategyInfo[makerBid.strategyId].selector @@ -129,4 +129,7 @@ if (from != _msgSender() && !isApprovedForAll(from, _msgSender())) revert Errors Since the answer to this check is the same for all items in the batch, we moved the check outside of the loop. Credit to Trust for reporting this optimisation. -```` + +``` + +``` From 0f8ce6f526d88c99ee4ac06daf9aea01ce06eaaf Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 15 Jan 2024 11:17:44 +0100 Subject: [PATCH 081/118] chore(bump): migrate to viem v2 --- pnpm-lock.yaml | 38 +++++++++++++++++++------------------- sdk/package.json | 2 +- sdk/src/client.ts | 25 +++++++++++++++++++------ 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9893f34c..63852fd2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -601,8 +601,8 @@ importers: specifier: ^4.0.6 version: 4.0.6(graphql@16.8.1)(react@18.2.0) viem: - specifier: ^1.19.15 - version: 1.19.15(typescript@5.3.2) + specifier: ^2.0.10 + version: 2.0.10(typescript@5.3.2) devDependencies: '@babel/core': specifier: ^7.23.5 @@ -13327,6 +13327,20 @@ packages: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} dev: true + /abitype@0.10.0(typescript@5.3.2): + resolution: {integrity: sha512-QvMHEUzgI9nPj9TWtUGnS2scas80/qaL5PBxGdwWhhvzqXfOph+IEiiiWrzuisu3U3JgDQVruW9oLbJoQ3oZ3A==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.3.2 + dev: false + /abitype@0.10.3(typescript@5.3.2): resolution: {integrity: sha512-tRN+7XIa7J9xugdbRzFv/95ka5ivR/sRe01eiWvM0HWWjHuigSZEACgKa0sj4wGuekTDtghCx+5Izk/cOi78pQ==} peerDependencies: @@ -13395,20 +13409,6 @@ packages: zod: 3.22.4 dev: false - /abitype@0.9.8(typescript@5.3.2): - resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.19.1 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: - typescript: 5.3.2 - dev: false - /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -32299,8 +32299,8 @@ packages: - zod dev: false - /viem@1.19.15(typescript@5.3.2): - resolution: {integrity: sha512-rc87AkyrUUsoOAgMNYP+X/wN4GYwbhP87DkmsqQCYKxxQyzTX0+yliKs6Bxljbjr8ybU72GOb12Oyus6393AjQ==} + /viem@2.0.10(typescript@5.3.2): + resolution: {integrity: sha512-ncdvXJ0v8Qc83qQaPzPG7pTr7gbg9hRUCNL7n/1b5ZFE17YIeQVtGTx6zqg4zdjTXlTKPrecKvqeKUUjKrmnYg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -32312,7 +32312,7 @@ packages: '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.3.2) + abitype: 0.10.0(typescript@5.3.2) isows: 1.0.3(ws@8.13.0) typescript: 5.3.2 ws: 8.13.0 diff --git a/sdk/package.json b/sdk/package.json index 87c3e49a..5f09147e 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -35,7 +35,7 @@ "graphql": "^16.8.1", "loglevel": "^1.8.1", "urql": "^4.0.6", - "viem": "^1.19.15" + "viem": "^2.0.10" }, "devDependencies": { "@babel/core": "^7.23.5", diff --git a/sdk/src/client.ts b/sdk/src/client.ts index 288d3d9c..9558eb87 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -103,8 +103,10 @@ export class HypercertClient implements HypercertClientInterface { return getContract({ address: this._config.contractAddress as `0x${string}`, abi: HypercertMinterAbi, - publicClient: this._publicClient, - walletClient: this._walletClient, + client: { + public: this._publicClient, + wallet: this._walletClient, + }, }); } @@ -155,7 +157,9 @@ export class HypercertClient implements HypercertClientInterface { getTransferRestrictions = async (fractionId: bigint): Promise => { const readContract = getContract({ ...this.getContractConfig(), - publicClient: this._publicClient, + client: { + public: this._publicClient, + }, }); return readContract.read.readTransferRestriction([fractionId]) as Promise; @@ -284,7 +288,9 @@ export class HypercertClient implements HypercertClientInterface { const readContract = getContract({ ...this.getContractConfig(), - publicClient: this._publicClient, + client: { + public: this._publicClient, + }, }); const fractionOwner = (await readContract.read.ownerOf([fractionId])) as `0x${string}`; @@ -328,7 +334,9 @@ export class HypercertClient implements HypercertClientInterface { const readContract = getContract({ ...this.getContractConfig(), - publicClient: this._publicClient, + client: { + public: this._publicClient, + }, }); const fractions = await Promise.all( @@ -368,7 +376,9 @@ export class HypercertClient implements HypercertClientInterface { const readContract = getContract({ ...this.getContractConfig(), - publicClient: this._publicClient, + client: { + public: this._publicClient, + }, }); const claimOwner = (await readContract.read.ownerOf([claimId])) as `0x${string}`; @@ -477,6 +487,9 @@ export class HypercertClient implements HypercertClientInterface { return getContract({ address: this.config.contractAddress as `0x${string}`, abi: HypercertMinterAbi, + client: { + public: this._publicClient, + }, }); }; From cc27c8621aea5ded955737e0673255a9f4b57a58 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 15 Jan 2024 22:31:23 +0100 Subject: [PATCH 082/118] feat(parse): add initial parser --- pnpm-lock.yaml | 63 +++++++++++++++++++--------- sdk/package.json | 4 +- sdk/src/client.ts | 33 +++++++-------- sdk/src/storage.ts | 2 + sdk/src/utils/index.ts | 2 + sdk/src/utils/txParser.ts | 86 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 149 insertions(+), 41 deletions(-) create mode 100644 sdk/src/utils/txParser.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 63852fd2..c2713712 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -601,8 +601,8 @@ importers: specifier: ^4.0.6 version: 4.0.6(graphql@16.8.1)(react@18.2.0) viem: - specifier: ^2.0.10 - version: 2.0.10(typescript@5.3.2) + specifier: ^1.21.4 + version: 1.21.4(typescript@5.3.2) devDependencies: '@babel/core': specifier: ^7.23.5 @@ -10297,7 +10297,7 @@ packages: resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.12.0 - viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) + viem: 1.21.4(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -13327,20 +13327,6 @@ packages: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} dev: true - /abitype@0.10.0(typescript@5.3.2): - resolution: {integrity: sha512-QvMHEUzgI9nPj9TWtUGnS2scas80/qaL5PBxGdwWhhvzqXfOph+IEiiiWrzuisu3U3JgDQVruW9oLbJoQ3oZ3A==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: - typescript: 5.3.2 - dev: false - /abitype@0.10.3(typescript@5.3.2): resolution: {integrity: sha512-tRN+7XIa7J9xugdbRzFv/95ka5ivR/sRe01eiWvM0HWWjHuigSZEACgKa0sj4wGuekTDtghCx+5Izk/cOi78pQ==} peerDependencies: @@ -13409,6 +13395,20 @@ packages: zod: 3.22.4 dev: false + /abitype@0.9.8(typescript@5.3.2): + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.3.2 + dev: false + /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -32299,8 +32299,31 @@ packages: - zod dev: false - /viem@2.0.10(typescript@5.3.2): - resolution: {integrity: sha512-ncdvXJ0v8Qc83qQaPzPG7pTr7gbg9hRUCNL7n/1b5ZFE17YIeQVtGTx6zqg4zdjTXlTKPrecKvqeKUUjKrmnYg==} + /viem@1.21.4(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 0.9.8(typescript@5.1.6)(zod@3.22.4) + isows: 1.0.3(ws@8.13.0) + typescript: 5.1.6 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + + /viem@1.21.4(typescript@5.3.2): + resolution: {integrity: sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -32312,7 +32335,7 @@ packages: '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 0.10.0(typescript@5.3.2) + abitype: 0.9.8(typescript@5.3.2) isows: 1.0.3(ws@8.13.0) typescript: 5.3.2 ws: 8.13.0 diff --git a/sdk/package.json b/sdk/package.json index 5f09147e..0f5137e5 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.1.0", + "version": "1.3.0", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", @@ -35,7 +35,7 @@ "graphql": "^16.8.1", "loglevel": "^1.8.1", "urql": "^4.0.6", - "viem": "^2.0.10" + "viem": "^1.21.4" }, "devDependencies": { "@babel/core": "^7.23.5", diff --git a/sdk/src/client.ts b/sdk/src/client.ts index 9558eb87..4192b01b 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -18,6 +18,8 @@ import { verifyMerkleProof, verifyMerkleProofs } from "./validator"; import { handleSimulatedContractError } from "./utils/errors"; import { logger } from "./utils"; import { parseAllowListEntriesToMerkleTree } from "./utils/allowlist"; +import { getClaimStoredDataFromTxHash } from "./utils"; +import { ParserReturnType } from "./utils/txParser"; /** * The `HypercertClient` is a core class in the hypercerts SDK, providing a high-level interface to interact with the hypercerts system. @@ -103,10 +105,7 @@ export class HypercertClient implements HypercertClientInterface { return getContract({ address: this._config.contractAddress as `0x${string}`, abi: HypercertMinterAbi, - client: { - public: this._publicClient, - wallet: this._walletClient, - }, + publicClient: this._publicClient, }); } @@ -157,9 +156,7 @@ export class HypercertClient implements HypercertClientInterface { getTransferRestrictions = async (fractionId: bigint): Promise => { const readContract = getContract({ ...this.getContractConfig(), - client: { - public: this._publicClient, - }, + publicClient: this._publicClient, }); return readContract.read.readTransferRestriction([fractionId]) as Promise; @@ -288,9 +285,7 @@ export class HypercertClient implements HypercertClientInterface { const readContract = getContract({ ...this.getContractConfig(), - client: { - public: this._publicClient, - }, + publicClient: this._publicClient, }); const fractionOwner = (await readContract.read.ownerOf([fractionId])) as `0x${string}`; @@ -334,9 +329,7 @@ export class HypercertClient implements HypercertClientInterface { const readContract = getContract({ ...this.getContractConfig(), - client: { - public: this._publicClient, - }, + publicClient: this._publicClient, }); const fractions = await Promise.all( @@ -376,9 +369,7 @@ export class HypercertClient implements HypercertClientInterface { const readContract = getContract({ ...this.getContractConfig(), - client: { - public: this._publicClient, - }, + publicClient: this._publicClient, }); const claimOwner = (await readContract.read.ownerOf([claimId])) as `0x${string}`; @@ -481,15 +472,19 @@ export class HypercertClient implements HypercertClientInterface { return this.submitRequest(request); }; + getClaimStoredDataFromTxHash = async (hash: `0x${string}`): Promise => { + const { data, errors, success } = await getClaimStoredDataFromTxHash(this._publicClient, hash); + + return { data, errors, success }; + }; + private getContractConfig = () => { if (!this.config?.contractAddress) throw new ClientError("No contract address found", { config: this.config }); return getContract({ address: this.config.contractAddress as `0x${string}`, abi: HypercertMinterAbi, - client: { - public: this._publicClient, - }, + publicClient: this._publicClient, }); }; diff --git a/sdk/src/storage.ts b/sdk/src/storage.ts index 587268a8..ee340f88 100644 --- a/sdk/src/storage.ts +++ b/sdk/src/storage.ts @@ -41,6 +41,8 @@ export class HypercertsStorage implements HypercertStorageInterface { const tree = parseAllowListEntriesToMerkleTree(allowList); + logger.debug("Allowlist tree: ", "storage", [tree]); + const { cid: allowlistCID, errors: uploadAllowlistErrors } = await uploadAllowlist({ allowList: JSON.stringify(tree.dump()), totalUnits: totalUnits.toString(), diff --git a/sdk/src/utils/index.ts b/sdk/src/utils/index.ts index ccc4d04d..37e88876 100644 --- a/sdk/src/utils/index.ts +++ b/sdk/src/utils/index.ts @@ -6,6 +6,7 @@ import { formatHypercertData } from "./formatter"; import { logger } from "./logger"; import { handleSdkError, handleContractError } from "./errors"; import { uploadMetadata, uploadAllowlist } from "./apis"; +import { getClaimStoredDataFromTxHash } from "./txParser"; export { walletClientToSigner, @@ -19,4 +20,5 @@ export { uploadMetadata, uploadAllowlist, parseAllowListEntriesToMerkleTree, + getClaimStoredDataFromTxHash, }; diff --git a/sdk/src/utils/txParser.ts b/sdk/src/utils/txParser.ts new file mode 100644 index 00000000..6cf26b9c --- /dev/null +++ b/sdk/src/utils/txParser.ts @@ -0,0 +1,86 @@ +import { Hash, PublicClient, decodeEventLog } from "viem"; +import { HypercertMinterAbi } from "@hypercerts-org/contracts"; + +export type ClaimStoredEvent = { + claimId: bigint; + uri: string; + totalUnits: bigint; +}; + +export type ParserReturnType = { + success: boolean; + data?: ClaimStoredEvent; + errors?: Record; +}; + +/** + * + * Utility method to parse a hypercert mint transaction (createAllowlist, mintClaim) and get the ID of the minted claim + * + * @notice This method is a wrapper around basic viem utilties to parse ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits). + * + * @param client public client provided by viem + * @param hash transaction hash returned from the transaction + * @returns {Promise} returns a promise with the parsed data or errors + */ +export const getClaimStoredDataFromTxHash = async (client: PublicClient, hash: Hash): Promise => { + const receipt = await client.getTransactionReceipt({ + hash, + }); + + const events = receipt.logs.map((log) => + decodeEventLog({ + abi: HypercertMinterAbi, + data: log.data, + topics: log.topics, + }), + ); + + if (!events) { + return { + errors: { + noEvents: "No events found for this transaction", + }, + success: false, + }; + } + + const claimEvent = events.find((e) => e.eventName === "ClaimStored"); + + if (!claimEvent) { + return { + errors: { + noClaimStoredEvent: "No ClaimStored event found", + }, + success: false, + }; + } + + if (isClaimStoredLog(claimEvent.args)) { + return { + data: claimEvent.args, + success: true, + }; + } else { + return { + errors: { + couldNotParseLog: "Log arguments could not be mapped to ClaimStoredEvent", + dataToParse: JSON.stringify(claimEvent.args), + }, + success: false, + }; + } +}; + +const isClaimStoredLog = (args: unknown): args is ClaimStoredEvent => { + return ( + typeof args === "object" && + args !== null && + "claimId" in args && + typeof args.claimId === "bigint" && + "uri" in args && + typeof args.uri === "string" && + "totalUnits" in args && + typeof args.totalUnits === "bigint" + ); +}; From ace0f727309e3e9f9a504ed29ba921aef2320442 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 16 Jan 2024 12:30:01 +0100 Subject: [PATCH 083/118] feat(marketplace): release sepolia deploy --- contracts/RELEASE.md | 5 +++ contracts/package.json | 2 +- .../src/deployments/deployments-protocol.json | 12 +------ contracts/src/deployments/index.ts | 13 ++++++- contracts/src/index.ts | 34 +++++++++++++++---- .../src/auto-tasks/on-allowlist-created.ts | 5 ++- 6 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 contracts/RELEASE.md diff --git a/contracts/RELEASE.md b/contracts/RELEASE.md new file mode 100644 index 00000000..2eab98da --- /dev/null +++ b/contracts/RELEASE.md @@ -0,0 +1,5 @@ +# 1.1.0 + +- Added Sepolia marketplace deployment +- Added marketplace abis +- Added marketplace addresses diff --git a/contracts/package.json b/contracts/package.json index 4f6447e8..03d098ef 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@hypercerts-org/contracts", "description": "EVM compatible protocol for managing impact claims", - "version": "1.0.0", + "version": "1.1.0", "author": { "name": "Hypercerts Foundation", "url": "https://github.com/hypercerts-org/hypercerts" diff --git a/contracts/src/deployments/deployments-protocol.json b/contracts/src/deployments/deployments-protocol.json index 1ed7832c..2cad766f 100644 --- a/contracts/src/deployments/deployments-protocol.json +++ b/contracts/src/deployments/deployments-protocol.json @@ -1,17 +1,7 @@ { - "5": { - "HypercertMinterUUPS": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", - "HypercertMinterImplementation": "0x0a00a2f09cd37b24e7429c5238323bfebcff3ed9", - "TransferManager": "0xeec4DFb4A230e92c854a643130BA7F89617CD8e6", - "HypercertExchange": "0x54E196903c7E71182025aBa9DBE5Dd136755D05a", - "OrderValidatorV2A": "0x9626265537c50528a6579e23d44f4d877d27af0b" - }, "11155111": { "HypercertMinterUUPS": "0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941", - "HypercertMinterImplementation": "0x0a0df97bddb36eef95fef089a4aeb7aceabf2101", - "TransferManager": "0x7AAC4C1407f5F83256581eCc913dC8b20F7bdab1", - "HypercertExchange": "0x4072ABD45a95c56372eAA00059B101C95191ea2A", - "OrderValidatorV2A": "0x11cf91a633b292e90afc1dd063db9ce0b94a89ae" + "HypercertMinterImplementation": "0x0a0df97bddb36eef95fef089a4aeb7aceabf2101" }, "10": { "HypercertMinterUUPS": "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", diff --git a/contracts/src/deployments/index.ts b/contracts/src/deployments/index.ts index 6ec8096b..f15baaeb 100644 --- a/contracts/src/deployments/index.ts +++ b/contracts/src/deployments/index.ts @@ -2,7 +2,18 @@ import deployments_marketplace_sepolia from "./deployment-marketplace-sepolia.js import deployments_protocol from "./deployments-protocol.json"; const deployments_marketplace = { - "11155111": deployments_marketplace_sepolia, + "11155111": { + TransferManager: deployments_marketplace_sepolia.TransferManager.address, + HypercertExchange: deployments_marketplace_sepolia.HypercertExchange.address, + OrderValidatorV2A: deployments_marketplace_sepolia.OrderValidator.address, + RoyaltyFeeRegistry: deployments_marketplace_sepolia.RoyaltyFeeRegistry.address, + StrategyCollectionOffer: deployments_marketplace_sepolia.StrategyCollectionOffer.address, + StrategyDutchAuction: deployments_marketplace_sepolia.StrategyDutchAuction.address, + StrategyItemIdsRange: deployments_marketplace_sepolia.StrategyItemIdsRange.address, + StrategyHypercertCollectionOffer: deployments_marketplace_sepolia.StrategyHypercertCollectionOffer.address, + StrategyHypercertDutchAuction: deployments_marketplace_sepolia.StrategyHypercertDutchAuction.address, + StrategyHypercertFractionOffer: deployments_marketplace_sepolia.StrategyHypercertFractionOffer.address, + }, }; export default { marketplace: deployments_marketplace, protocol: deployments_protocol }; diff --git a/contracts/src/index.ts b/contracts/src/index.ts index 99200025..147ce320 100644 --- a/contracts/src/index.ts +++ b/contracts/src/index.ts @@ -6,8 +6,12 @@ import OrderValidatorV2AAbi from "../abi/src/marketplace/helpers/OrderValidatorV import StrategyManagerAbi from "../abi/src/marketplace/StrategyManager.sol/StrategyManager.json"; import TransferManagerAbi from "../abi/src/marketplace/TransferManager.sol/TransferManager.json"; import StrategyCollectionOfferAbi from "../abi/src/marketplace/executionStrategies/StrategyCollectionOffer.sol/StrategyCollectionOffer.json"; +import StrategyDutchAuctionAbi from "../abi/src/marketplace/executionStrategies/StrategyDutchAuction.sol/StrategyDutchAuction.json"; import StrategyHypercertFractionOfferAbi from "../abi/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol/StrategyHypercertFractionOffer.json"; import CreatorFeeManagerWithRoyaltiesAbi from "../abi/src/marketplace/CreatorFeeManagerWithRoyalties.sol/CreatorFeeManagerWithRoyalties.json"; +import StrategyHypercertCollectionOfferAbi from "../abi/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol/StrategyHypercertCollectionOffer.json"; +import StrategyHypercertDutchAuctionAbi from "../abi/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol/StrategyHypercertDutchAuction.json"; +import StrategyItemIdsRangeAbi from "../abi/src/marketplace/executionStrategies/StrategyItemIdsRange.sol/StrategyItemIdsRange.json"; import ExecutionManagerAbi from "../abi/src/marketplace/ExecutionManager.sol/ExecutionManager.json"; import { @@ -16,11 +20,15 @@ import { IHypercertToken, LooksRareProtocol as HypercertExchange, ILooksRareProtocol as IHypercertExchange, + CreatorFeeManagerWithRoyalties, + OrderValidatorV2A, TransferManager, StrategyCollectionOffer, + StrategyDutchAuction, + StrategyItemIdsRange, StrategyHypercertFractionOffer, - CreatorFeeManagerWithRoyalties, - OrderValidatorV2A, + StrategyHypercertCollectionOffer, + StrategyHypercertDutchAuction, } from "types"; /* @@ -34,14 +42,19 @@ import { export type DeploymentProtocol = { HypercertMinterUUPS: `0x${string}`; HypercertMinterImplementation: `0x${string}`; - TransferManager?: `0x${string}`; - HypercertExchange?: `0x${string}`; }; export type DeploymentMarketplace = { - HypercertExchange: `0x${string}`; TransferManager: `0x${string}`; + HypercertExchange: `0x${string}`; OrderValidatorV2A: `0x${string}`; + RoyaltyFeeRegistry: `0x${string}`; + StrategyCollectionOffer: `0x${string}`; + StrategyDutchAuction: `0x${string}`; + StrategyItemIdsRange: `0x${string}`; + StrategyHypercertCollectionOffer: `0x${string}`; + StrategyHypercertDutchAuction: `0x${string}`; + StrategyHypercertFractionOffer: `0x${string}`; }; export type Deployment = DeploymentProtocol & Partial; @@ -57,6 +70,7 @@ const deployments = { }, 11155111: { ...DEPLOYMENTS.protocol["11155111"], + ...DEPLOYMENTS.marketplace["11155111"], }, } as Record; @@ -74,10 +88,14 @@ export { HypercertMinterAbi, HypercertExchangeAbi, OrderValidatorV2AAbi, + TransferManagerAbi, StrategyManagerAbi, StrategyCollectionOfferAbi, + StrategyDutchAuctionAbi, + StrategyItemIdsRangeAbi, StrategyHypercertFractionOfferAbi, - TransferManagerAbi, + StrategyHypercertCollectionOfferAbi, + StrategyHypercertDutchAuctionAbi, }; // Interfaces @@ -91,5 +109,9 @@ export type { OrderValidatorV2A, TransferManager, StrategyCollectionOffer, + StrategyDutchAuction, + StrategyItemIdsRange, StrategyHypercertFractionOffer, + StrategyHypercertCollectionOffer, + StrategyHypercertDutchAuction, }; diff --git a/defender/src/auto-tasks/on-allowlist-created.ts b/defender/src/auto-tasks/on-allowlist-created.ts index 0e73472b..d5fdeb98 100644 --- a/defender/src/auto-tasks/on-allowlist-created.ts +++ b/defender/src/auto-tasks/on-allowlist-created.ts @@ -119,7 +119,10 @@ export async function handler(event: AutotaskEvent) { if (!treeResponse) { throw new Error("Could not fetch json tree dump for allowlist"); } - const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); + const tree = + typeof treeResponse === "string" + ? StandardMerkleTree.load(JSON.parse(treeResponse)) + : StandardMerkleTree.load(treeResponse); // Find the proof const addresses: string[] = []; From fc172655007278b10755be50f1ca27ccc96f74be Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 16 Jan 2024 13:22:13 +0100 Subject: [PATCH 084/118] feat(sdk): add all deployments to SDK --- .../src/auto-tasks/on-allowlist-created.ts | 5 +-- pnpm-lock.yaml | 14 ++++---- sdk/package.json | 2 +- sdk/src/client.ts | 20 ++++++++++-- sdk/src/constants.ts | 7 ++-- sdk/src/index.ts | 32 +++++++++++++++++-- sdk/src/types/client.ts | 23 ++++++++++++- sdk/src/utils/config.ts | 16 ++-------- sdk/test/utils/config.test.ts | 31 ------------------ 9 files changed, 84 insertions(+), 66 deletions(-) diff --git a/defender/src/auto-tasks/on-allowlist-created.ts b/defender/src/auto-tasks/on-allowlist-created.ts index d5fdeb98..0e73472b 100644 --- a/defender/src/auto-tasks/on-allowlist-created.ts +++ b/defender/src/auto-tasks/on-allowlist-created.ts @@ -119,10 +119,7 @@ export async function handler(event: AutotaskEvent) { if (!treeResponse) { throw new Error("Could not fetch json tree dump for allowlist"); } - const tree = - typeof treeResponse === "string" - ? StandardMerkleTree.load(JSON.parse(treeResponse)) - : StandardMerkleTree.load(treeResponse); + const tree = StandardMerkleTree.load(JSON.parse(treeResponse)); // Find the proof const addresses: string[] = []; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9893f34c..8293bd5e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -568,8 +568,8 @@ importers: specifier: ^3.2.0 version: 3.2.0(graphql@16.8.1) '@hypercerts-org/contracts': - specifier: 1.0.0 - version: 1.0.0(ts-node@10.9.1)(typescript@5.3.2) + specifier: 1.1.0 + version: 1.1.0(ts-node@10.9.1)(typescript@5.3.2) '@openzeppelin/merkle-tree': specifier: ^1.0.5 version: 1.0.5 @@ -7323,10 +7323,10 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/contracts@1.0.0(ts-node@10.9.1)(typescript@5.3.2): + /@hypercerts-org/contracts@1.0.0(typescript@5.1.6): resolution: {integrity: sha512-pGdG3BGDz93IZXAAHcvwzRQOMgi9dOzy2ZLdRFKIdWMBoVz8uCQL03HCYutT5DOtVm2g+j2dcor+zSV5yUM5Dg==} dependencies: - hardhat: 2.19.1(ts-node@10.9.1)(typescript@5.3.2) + hardhat: 2.19.1(typescript@5.1.6) transitivePeerDependencies: - bufferutil - supports-color @@ -7335,10 +7335,10 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/contracts@1.0.0(typescript@5.1.6): - resolution: {integrity: sha512-pGdG3BGDz93IZXAAHcvwzRQOMgi9dOzy2ZLdRFKIdWMBoVz8uCQL03HCYutT5DOtVm2g+j2dcor+zSV5yUM5Dg==} + /@hypercerts-org/contracts@1.1.0(ts-node@10.9.1)(typescript@5.3.2): + resolution: {integrity: sha512-iEEJP9LQTfgcFjnJj82AwkAob3kfFcTmxm6AGrCXFzt7CU3Xo2odCFKZ81UPFV9C4PyI8tPTSGd12NmUzjLlqA==} dependencies: - hardhat: 2.19.1(typescript@5.1.6) + hardhat: 2.19.1(ts-node@10.9.1)(typescript@5.3.2) transitivePeerDependencies: - bufferutil - supports-color diff --git a/sdk/package.json b/sdk/package.json index 87c3e49a..8da06df9 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -24,7 +24,7 @@ "@ethereum-attestation-service/eas-sdk": "1.3.7", "@ethersproject/abstract-signer": "^5.7.0", "@graphql-typed-document-node/core": "^3.2.0", - "@hypercerts-org/contracts": "1.0.0", + "@hypercerts-org/contracts": "1.1.0", "@openzeppelin/merkle-tree": "^1.0.5", "@urql/core": "^4.2.0", "@whatwg-node/fetch": "^0.9.13", diff --git a/sdk/src/client.ts b/sdk/src/client.ts index 288d3d9c..106d7a11 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -10,6 +10,7 @@ import { HypercertClientInterface, HypercertMetadata, InvalidOrMissingError, + SupportedChainIds, SupportedOverrides, TransferRestrictions, } from "./types"; @@ -18,6 +19,7 @@ import { verifyMerkleProof, verifyMerkleProofs } from "./validator"; import { handleSimulatedContractError } from "./utils/errors"; import { logger } from "./utils"; import { parseAllowListEntriesToMerkleTree } from "./utils/allowlist"; +import { DEPLOYMENTS } from "./constants"; /** * The `HypercertClient` is a core class in the hypercerts SDK, providing a high-level interface to interact with the hypercerts system. @@ -98,16 +100,26 @@ export class HypercertClient implements HypercertClientInterface { /** * Gets the HypercertMinter contract used by the client. * @returns The contract. + * @deprecated Use getDeployments instead. */ get contract(): GetContractReturnType { return getContract({ - address: this._config.contractAddress as `0x${string}`, + address: this._config.addresses?.HypercertMinter as `0x${string}`, abi: HypercertMinterAbi, publicClient: this._publicClient, walletClient: this._walletClient, }); } + /** + * Gets the contract addresses and graph urls for the provided `chainId` + * @returns The addresses, graph name and graph url. + * @deprecated Use getDeployments instead. + */ + getDeployment = (chainId: SupportedChainIds) => { + return DEPLOYMENTS[chainId]; + }; + /** * Mints a new claim. * @@ -472,10 +484,12 @@ export class HypercertClient implements HypercertClientInterface { }; private getContractConfig = () => { - if (!this.config?.contractAddress) throw new ClientError("No contract address found", { config: this.config }); + console.log(this.config); + if (!this.config?.addresses?.HypercertMinterUUPS) + throw new ClientError("No contract address found", { config: this.config }); return getContract({ - address: this.config.contractAddress as `0x${string}`, + address: this.config.addresses.HypercertMinterUUPS as `0x${string}`, abi: HypercertMinterAbi, }); }; diff --git a/sdk/src/constants.ts b/sdk/src/constants.ts index b87a672e..dffe3011 100644 --- a/sdk/src/constants.ts +++ b/sdk/src/constants.ts @@ -3,6 +3,7 @@ */ import { Deployment, SupportedChainIds } from "./types"; +import { deployments } from "@hypercerts-org/contracts"; const DEFAULT_GRAPH_BASE_URL = "https://api.thegraph.com/subgraphs/name/hypercerts-admin"; @@ -16,17 +17,17 @@ const APIS: { [key: string]: string } = { // These are the deployments we manage const DEPLOYMENTS: { [key in SupportedChainIds]: Partial } = { 10: { - contractAddress: "0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07", + addresses: deployments[10], graphName: "hypercerts-optimism-mainnet", graphUrl: `${DEFAULT_GRAPH_BASE_URL}/hypercerts-optimism-mainnet`, } as const, 42220: { - contractAddress: "0x16ba53b74c234c870c61efc04cd418b8f2865959", + addresses: deployments[42220], graphName: "hypercerts-celo", graphUrl: `${DEFAULT_GRAPH_BASE_URL}/hypercerts-celo`, }, 11155111: { - contractAddress: "0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941", + addresses: deployments[11155111], graphName: "hypercerts-sepolia", graphUrl: `${DEFAULT_GRAPH_BASE_URL}/hypercerts-sepolia`, } as const, diff --git a/sdk/src/index.ts b/sdk/src/index.ts index d8047a32..2825e8b8 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -1,4 +1,18 @@ -import { HypercertMinterAbi, HypercertExchangeAbi } from "@hypercerts-org/contracts"; +import { + HypercertMinterAbi, + HypercertExchangeAbi, + OrderValidatorV2AAbi, + StrategyCollectionOfferAbi, + StrategyManagerAbi, + TransferManagerAbi, + StrategyDutchAuctionAbi, + StrategyItemIdsRangeAbi, + StrategyHypercertFractionOfferAbi, + StrategyHypercertCollectionOfferAbi, + StrategyHypercertDutchAuctionAbi, + CreatorFeeManagerWithRoyaltiesAbi, + ExecutionManagerAbi, +} from "@hypercerts-org/contracts"; import { HypercertClient } from "./client"; import { HypercertsStorage } from "./storage"; @@ -7,7 +21,21 @@ import { APIS, DEPLOYMENTS } from "./constants"; /** * Protocol */ -export { HypercertMinterAbi, HypercertExchangeAbi }; +export { + HypercertMinterAbi, + HypercertExchangeAbi, + OrderValidatorV2AAbi, + StrategyCollectionOfferAbi, + StrategyManagerAbi, + TransferManagerAbi, + StrategyDutchAuctionAbi, + StrategyItemIdsRangeAbi, + StrategyHypercertFractionOfferAbi, + StrategyHypercertCollectionOfferAbi, + StrategyHypercertDutchAuctionAbi, + CreatorFeeManagerWithRoyaltiesAbi, + ExecutionManagerAbi, +}; export { DEPLOYMENTS as deployments }; export { APIS as apis }; diff --git a/sdk/src/types/client.ts b/sdk/src/types/client.ts index 0255e64f..ce0dd69d 100644 --- a/sdk/src/types/client.ts +++ b/sdk/src/types/client.ts @@ -14,13 +14,28 @@ export type SupportedOverrides = { gasLimit?: bigint; }; +export type Contracts = + | "HypercertMinterUUPS" + | "TransferManager" + | "ProtocolFeeRecipient" + | "HypercertExchange" + | "RoyaltyFeeRegistry" + | "OrderValidator" + | "CreatorFeeManager" + | "StrategyCollectionOffer" + | "StrategyDutchAuction" + | "StrategyItemIdsRange" + | "StrategyHypercertCollectionOffer" + | "StrategyHypercertDutchAuction" + | "StrategyHypercertFractionOffer"; + /** * Represents a deployment of a contract on a specific network. */ export type Deployment = { chain: Partial; /** The address of the deployed contract. */ - contractAddress: string; + addresses: Partial>; /** The url to the subgraph that indexes the contract events. Override for localized testing */ graphUrl: string; graphName: string; @@ -123,6 +138,12 @@ export interface HypercertClientState { * The methods for the Hypercert client. */ export interface HypercertClientMethods { + /** + * Gets the contract addresses and graph urls for the provided `chainId` + * @returns The addresses, graph name and graph url. + */ + getDeployment: (chainId: SupportedChainIds) => Partial; + /** * Mints a new claim. * @param metaData The metadata for the claim. diff --git a/sdk/src/utils/config.ts b/sdk/src/utils/config.ts index a4afa1fd..3f2dec35 100644 --- a/sdk/src/utils/config.ts +++ b/sdk/src/utils/config.ts @@ -10,7 +10,7 @@ import { UnsupportedChainError, } from "../types"; import { logger } from "./logger"; -import { createPublicClient, http, isAddress } from "viem"; +import { createPublicClient, http } from "viem"; import { deployments } from "../../src"; /** @@ -41,19 +41,17 @@ export const getConfig = (overrides: Partial): Partial & { unsafeForceOverrideConfig?: boolean }) | undefined; if (overrides.unsafeForceOverrideConfig) { - if (!overrides.chain?.id || !overrides.contractAddress || !overrides.graphUrl) { + if (!overrides.chain?.id || !overrides.graphUrl) { throw new InvalidOrMissingError( `attempted to override with chainId=${overrides.chain?.id}, but requires chainName, graphUrl, and contractAddress to be set`, { chainID: overrides.chain?.id?.toString(), graphUrl: overrides.graphUrl, - contractAddress: overrides.contractAddress, }, ); } baseDeployment = { chain: { ...chain, id: overrides.chain?.id }, - contractAddress: overrides.contractAddress, graphUrl: overrides.graphUrl, unsafeForceOverrideConfig: overrides.unsafeForceOverrideConfig, }; @@ -81,7 +79,6 @@ export const getConfig = (overrides: Partial): Partial) => { return chain; }; -const getContractAddress = (overrides: Partial) => { - if (overrides.contractAddress) { - if (!isAddress(overrides.contractAddress)) { - throw new InvalidOrMissingError("Invalid contract address.", { contractAddress: overrides.contractAddress }); - } - return { contractAddress: overrides.contractAddress }; - } -}; - const getGraphUrl = (overrides: Partial) => { let graphUrl; if (overrides.unsafeForceOverrideConfig) { diff --git a/sdk/test/utils/config.test.ts b/sdk/test/utils/config.test.ts index 340f68b1..b1af9e36 100644 --- a/sdk/test/utils/config.test.ts +++ b/sdk/test/utils/config.test.ts @@ -11,34 +11,6 @@ import { walletClient, publicClient } from "../helpers"; chai.use(chaiSubset); -describe("Config: contractAddress", () => { - afterEach(() => { - sinon.restore(); - - reloadEnv(); - }); - - it("should return the contract address specified by overrides", () => { - const overrides: Partial = { - chain: { id: 11155111 }, - contractAddress: "0x1234567890123456789012345678901234567890", - }; - const config = getConfig(overrides); - expect(config.contractAddress).to.equal(overrides.contractAddress); - }); - - it("should throw an error when the contract address specified by overrides is invalid", () => { - const overrides: Partial = { chain: { id: 11155111 }, contractAddress: "invalid-address" }; - try { - getConfig(overrides); - } catch (e) { - expect(e instanceof InvalidOrMissingError).to.be.true; - const error = e as InvalidOrMissingError; - expect(error.message).to.eq("Invalid contract address."); - } - }); -}); - describe("Config: graphUrl", () => { afterEach(() => { reloadEnv(); @@ -53,7 +25,6 @@ describe("Config: graphUrl", () => { const overrides: Partial = { chain: { id: 11155111 }, graphUrl: "https://api.example.com", - contractAddress: "0x1234567890123456789012345678901234567890", unsafeForceOverrideConfig: true, }; const result = getConfig(overrides); @@ -64,7 +35,6 @@ describe("Config: graphUrl", () => { const overrides: Partial = { chain: { id: 11155111 }, graphUrl: "incorrect-url", - contractAddress: "0x1234567890123456789012345678901234567890", unsafeForceOverrideConfig: true, }; @@ -80,7 +50,6 @@ describe("Config: graphUrl", () => { it("should throw an error when the graph URL specified by overrides is missing", () => { const overrides: Partial = { chain: { id: 11155111 }, - contractAddress: "0x1234567890123456789012345678901234567890", unsafeForceOverrideConfig: true, }; From 3a7701aededa0b94fd2d661f8368fa3e587f8931 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 16 Jan 2024 13:28:23 +0100 Subject: [PATCH 085/118] chore(bump): release notes and 1.4.0 --- sdk/RELEASE.md | 11 +++++++++++ sdk/package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/sdk/RELEASE.md b/sdk/RELEASE.md index ea8f7acb..b70da040 100644 --- a/sdk/RELEASE.md +++ b/sdk/RELEASE.md @@ -1,5 +1,16 @@ # Release notes +## 1.4.0 + +- Added all deployments from `@hypercerts-org/contracts` to the SDK under deploments. +- Deprecated `getContract` because we no longer have one contract address per network. +- Added `getDeployments` to retrieve all deployments for a network. + +## 1.3.0 + +- Added `txParser` util to parse transaction hashes and return the required data +- Added `getClaimStoredDataFromTxHash` to retrieve the claim data from a transaction hash + ## 1.1.1 - Deprecate goerli chain diff --git a/sdk/package.json b/sdk/package.json index d41ab889..a61cc5ca 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.3.0", + "version": "1.4.0", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", From d7df0bc22d231886969eccb88da3582f838a3bfe Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 16 Jan 2024 13:37:34 +0100 Subject: [PATCH 086/118] fix(type): response data type --- sdk/src/storage.ts | 8 ++++++-- sdk/src/utils/apis.ts | 9 +++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/sdk/src/storage.ts b/sdk/src/storage.ts index ee340f88..76ad29e0 100644 --- a/sdk/src/storage.ts +++ b/sdk/src/storage.ts @@ -43,11 +43,13 @@ export class HypercertsStorage implements HypercertStorageInterface { logger.debug("Allowlist tree: ", "storage", [tree]); - const { cid: allowlistCID, errors: uploadAllowlistErrors } = await uploadAllowlist({ + const { data: resData, errors: uploadAllowlistErrors } = await uploadAllowlist({ allowList: JSON.stringify(tree.dump()), totalUnits: totalUnits.toString(), }); + const allowlistCID = resData?.cid; + if ((uploadAllowlistErrors && Object.keys(uploadAllowlistErrors).length > 0) || !allowlistCID) { throw new StorageError(`Allowlist upload failed.`, { errors: uploadAllowlistErrors, allowlistCID }); } @@ -77,7 +79,9 @@ export class HypercertsStorage implements HypercertStorageInterface { logger.debug("Storing HypercertMetaData: ", "storage", [data]); - const { errors, cid } = await uploadMetadata(metadata); + const { errors, data: resData } = await uploadMetadata(metadata); + + const cid = resData?.cid; if (!cid || (errors && Object.keys(errors).length > 0)) { throw new StorageError("Failed to store metadata", { errors, cid }); diff --git a/sdk/src/utils/apis.ts b/sdk/src/utils/apis.ts index a3a2e60d..0ad33e31 100644 --- a/sdk/src/utils/apis.ts +++ b/sdk/src/utils/apis.ts @@ -12,9 +12,10 @@ type AllowListPostRequest = { /** * Type for the response data from the API. */ -type ResponseData = { +type ResponseData = { + success: boolean; message: string; - cid?: string; + data?: T; errors?: Record; }; @@ -30,7 +31,7 @@ const api = axios.create({ timeout: 10000, headers: { "Content-Type": "applicati * @returns The response data from the API. */ const uploadMetadata = async (metadata: HypercertMetadata) => { - const response = await api.post( + const response = await api.post>( "https://hypercerts-api-production.up.railway.app/api/v1/web3up/metadata", metadata, ); @@ -46,7 +47,7 @@ const uploadMetadata = async (metadata: HypercertMetadata) => { * */ const uploadAllowlist = async (req: AllowListPostRequest) => { - const response = await api.post( + const response = await api.post>( "https://hypercerts-api-production.up.railway.app/api/v1/web3up/allowlist", req, ); From c71ce460dc9773d14b6cd4aec6b1ce6e0c405ded Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 16 Jan 2024 13:38:13 +0100 Subject: [PATCH 087/118] chroe(bump): 1.4.1 --- sdk/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/package.json b/sdk/package.json index a61cc5ca..91e1c814 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hypercerts-org/sdk", - "version": "1.4.0", + "version": "1.4.1", "description": "SDK for hypercerts protocol", "repository": "git@github.com:hypercerts-org/hypercerts.git", "author": "Hypercerts team", From 2a8e11ecbf6b377cd17e6890993644e5bd003a31 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 16 Jan 2024 14:08:08 +0100 Subject: [PATCH 088/118] fix(test): mock storage return types --- graph/tests/.latest.json | 2 +- sdk/src/client.ts | 3 --- sdk/test/storage/storeAllowList.test.ts | 2 +- sdk/test/storage/storeMetadata.test.ts | 2 +- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/graph/tests/.latest.json b/graph/tests/.latest.json index 59d5886d..69792a9d 100644 --- a/graph/tests/.latest.json +++ b/graph/tests/.latest.json @@ -1,4 +1,4 @@ { "version": "0.6.0", - "timestamp": 1703510468280 + "timestamp": 1705410292091 } diff --git a/sdk/src/client.ts b/sdk/src/client.ts index 431bf7af..3531d76d 100644 --- a/sdk/src/client.ts +++ b/sdk/src/client.ts @@ -359,8 +359,6 @@ export class HypercertClient implements HypercertClientInterface { const request = await this.simulateRequest(account, "mergeFractions", [account?.address, fractionIds], overrides); - console.log(request); - return this.submitRequest(request); }; @@ -491,7 +489,6 @@ export class HypercertClient implements HypercertClientInterface { }; private getContractConfig = () => { - console.log(this.config); if (!this.config?.addresses?.HypercertMinterUUPS) throw new ClientError("No contract address found", { config: this.config }); diff --git a/sdk/test/storage/storeAllowList.test.ts b/sdk/test/storage/storeAllowList.test.ts index 4c385293..fb29cd96 100644 --- a/sdk/test/storage/storeAllowList.test.ts +++ b/sdk/test/storage/storeAllowList.test.ts @@ -42,7 +42,7 @@ describe("Storage - store allowlist", () => { }, ]; - mocks.uploadAllowlist.mockResolvedValue({ cid: someData.cid }); + mocks.uploadAllowlist.mockResolvedValue({ data: { cid: someData.cid } }); const res = await storage.storeAllowList(allowList, 100n); expect(res).to.eq(someData.cid); expect(mocks.uploadAllowlist).toHaveBeenCalledTimes(1); diff --git a/sdk/test/storage/storeMetadata.test.ts b/sdk/test/storage/storeMetadata.test.ts index 336e2072..bb339127 100644 --- a/sdk/test/storage/storeMetadata.test.ts +++ b/sdk/test/storage/storeMetadata.test.ts @@ -33,7 +33,7 @@ describe("Storage - store metadata", () => { }); it("Store metadata", async () => { - mocks.uploadMetadata.mockResolvedValue({ cid: hypercertMetadata.cid }); + mocks.uploadMetadata.mockResolvedValue({ data: { cid: hypercertMetadata.cid } }); const res = await storage.storeMetadata(hypercertMetadata.data); expect(res).to.eq(hypercertMetadata.cid); expect(mocks.uploadMetadata).toHaveBeenCalledTimes(1); From d4ff8ba62537d2d32f576764acee023991e61061 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 16 Jan 2024 14:19:28 +0100 Subject: [PATCH 089/118] chore(bump): fe sdk to 1.4.1 --- frontend/hooks/hypercerts-client.ts | 2 +- frontend/package.json | 4 ++-- pnpm-lock.yaml | 26 +++++++++++++------------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/frontend/hooks/hypercerts-client.ts b/frontend/hooks/hypercerts-client.ts index 63143661..1d3dd052 100644 --- a/frontend/hooks/hypercerts-client.ts +++ b/frontend/hooks/hypercerts-client.ts @@ -4,7 +4,7 @@ import { HypercertClient, HypercertClientConfig } from "@hypercerts-org/sdk"; import { useWalletClient, useNetwork } from "wagmi"; const isSupportedChain = (chainId: number) => { - const supportedChainIds = [5, 10, 42220, 11155111]; // Replace with actual chain IDs + const supportedChainIds = [10, 42220, 11155111]; // Replace with actual chain IDs return supportedChainIds.includes(chainId); }; diff --git a/frontend/package.json b/frontend/package.json index 7d3c08fb..9e4e4a49 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,9 +23,9 @@ "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@graphprotocol/client-cli": "^2.2.16", - "@hypercerts-org/contracts": "1.0.0", + "@hypercerts-org/contracts": "1.1.0", "@hypercerts-org/observabletreemap": "workspace: *", - "@hypercerts-org/sdk": "1.2.0", + "@hypercerts-org/sdk": "1.4.1", "@mui/icons-material": "^5.11.9", "@mui/material": "^5.11.2", "@mui/x-date-pickers": "^5.0.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0234c68..28bdddad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -345,14 +345,14 @@ importers: specifier: ^2.2.16 version: 2.2.22(@babel/core@7.23.5)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35)(@graphql-tools/merge@8.4.2)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@9.4.2)(@types/node@18.18.7)(graphql-tag@2.12.6)(graphql@16.8.1)(react-native@0.72.6) '@hypercerts-org/contracts': - specifier: 1.0.0 - version: 1.0.0(typescript@5.1.6) + specifier: 1.1.0 + version: 1.1.0(typescript@5.1.6) '@hypercerts-org/observabletreemap': specifier: 'workspace: *' version: link:../vendor/observabletreemap '@hypercerts-org/sdk': - specifier: 1.2.0 - version: 1.2.0(react@18.2.0)(typescript@5.1.6)(zod@3.22.4) + specifier: 1.4.1 + version: 1.4.1(react@18.2.0)(typescript@5.1.6)(zod@3.22.4) '@mui/icons-material': specifier: ^5.11.9 version: 5.14.15(@mui/material@5.14.15)(@types/react@18.2.33)(react@18.2.0) @@ -7323,10 +7323,10 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/contracts@1.0.0(typescript@5.1.6): - resolution: {integrity: sha512-pGdG3BGDz93IZXAAHcvwzRQOMgi9dOzy2ZLdRFKIdWMBoVz8uCQL03HCYutT5DOtVm2g+j2dcor+zSV5yUM5Dg==} + /@hypercerts-org/contracts@1.1.0(ts-node@10.9.1)(typescript@5.3.2): + resolution: {integrity: sha512-iEEJP9LQTfgcFjnJj82AwkAob3kfFcTmxm6AGrCXFzt7CU3Xo2odCFKZ81UPFV9C4PyI8tPTSGd12NmUzjLlqA==} dependencies: - hardhat: 2.19.1(typescript@5.1.6) + hardhat: 2.19.1(ts-node@10.9.1)(typescript@5.3.2) transitivePeerDependencies: - bufferutil - supports-color @@ -7335,10 +7335,10 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/contracts@1.1.0(ts-node@10.9.1)(typescript@5.3.2): + /@hypercerts-org/contracts@1.1.0(typescript@5.1.6): resolution: {integrity: sha512-iEEJP9LQTfgcFjnJj82AwkAob3kfFcTmxm6AGrCXFzt7CU3Xo2odCFKZ81UPFV9C4PyI8tPTSGd12NmUzjLlqA==} dependencies: - hardhat: 2.19.1(ts-node@10.9.1)(typescript@5.3.2) + hardhat: 2.19.1(typescript@5.1.6) transitivePeerDependencies: - bufferutil - supports-color @@ -7347,13 +7347,13 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/sdk@1.2.0(react@18.2.0)(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-khaB4m8PYaZ/Kv69miu0t/WfQf56T/pJ8V7+U1VWs8rGdVExi62NntIxkWdJ0LQMsrmlN3kLSAEQAlIpYujHpg==} + /@hypercerts-org/sdk@1.4.1(react@18.2.0)(typescript@5.1.6)(zod@3.22.4): + resolution: {integrity: sha512-lTDnaqJffPuK8iKU9LnxGQjdpPASXUq6U+fumJQHyZwhVb2FQnomLu7GNrh6yuCahw8mbj3AXq01GcuNkerLiA==} dependencies: '@ethereum-attestation-service/eas-sdk': 1.3.7(typescript@5.1.6) '@ethersproject/abstract-signer': 5.7.0 '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@hypercerts-org/contracts': 1.0.0(typescript@5.1.6) + '@hypercerts-org/contracts': 1.1.0(typescript@5.1.6) '@openzeppelin/merkle-tree': 1.0.5 '@urql/core': 4.2.0(graphql@16.8.1) '@whatwg-node/fetch': 0.9.14 @@ -7364,7 +7364,7 @@ packages: graphql: 16.8.1 loglevel: 1.8.1 urql: 4.0.6(graphql@16.8.1)(react@18.2.0) - viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) + viem: 1.21.4(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - bufferutil - debug From 34e78b5b9261236696067d57fb6ccdf8c27d808b Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 16 Jan 2024 14:24:08 +0100 Subject: [PATCH 090/118] chore(bump): fe viem to 1.21.4 --- .../developer/api/sdk/classes/ClientError.md | 4 +- .../api/sdk/classes/ConfigurationError.md | 4 +- .../api/sdk/classes/ContractError.md | 4 +- .../developer/api/sdk/classes/FetchError.md | 4 +- .../api/sdk/classes/HypercertClient.md | 114 ++++-- .../api/sdk/classes/HypercertsStorage.md | 8 +- .../api/sdk/classes/InvalidOrMissingError.md | 4 +- .../api/sdk/classes/MalformedDataError.md | 4 +- .../developer/api/sdk/classes/MintingError.md | 4 +- .../developer/api/sdk/classes/StorageError.md | 4 +- .../api/sdk/classes/UnknownSchemaError.md | 4 +- .../api/sdk/classes/UnsupportedChainError.md | 4 +- .../api/sdk/interfaces/CustomError.md | 2 +- .../api/sdk/interfaces/DuplicateEvaluation.md | 8 +- .../api/sdk/interfaces/EASEvaluation.md | 8 +- .../api/sdk/interfaces/HypercertClaimdata.md | 12 +- .../interfaces/HypercertClientInterface.md | 60 ++- .../sdk/interfaces/HypercertClientMethods.md | 48 ++- .../sdk/interfaces/HypercertClientState.md | 8 +- .../interfaces/HypercertEvaluationSchema.md | 6 +- .../interfaces/HypercertIndexerInterface.md | 14 +- .../api/sdk/interfaces/HypercertMetadata.md | 18 +- .../api/sdk/interfaces/HypercertPointer.md | 6 +- .../interfaces/HypercertStorageInterface.md | 8 +- .../api/sdk/interfaces/IPFSEvaluation.md | 4 +- .../sdk/interfaces/SimpleTextEvaluation.md | 6 +- docs/docs/developer/api/sdk/modules.md | 342 ++++++++++++++---- frontend/package.json | 2 +- pnpm-lock.yaml | 65 ++-- 29 files changed, 540 insertions(+), 239 deletions(-) diff --git a/docs/docs/developer/api/sdk/classes/ClientError.md b/docs/docs/developer/api/sdk/classes/ClientError.md index 1ab27a18..bc8fdf6c 100644 --- a/docs/docs/developer/api/sdk/classes/ClientError.md +++ b/docs/docs/developer/api/sdk/classes/ClientError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:27](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L27) +[sdk/src/types/errors.ts:27](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L27) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:20](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L20) +[sdk/src/types/errors.ts:20](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L20) --- diff --git a/docs/docs/developer/api/sdk/classes/ConfigurationError.md b/docs/docs/developer/api/sdk/classes/ConfigurationError.md index b11df2df..6e480b06 100644 --- a/docs/docs/developer/api/sdk/classes/ConfigurationError.md +++ b/docs/docs/developer/api/sdk/classes/ConfigurationError.md @@ -41,7 +41,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:188](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L188) +[sdk/src/types/errors.ts:188](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L188) ## Properties @@ -103,7 +103,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:187](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L187) +[sdk/src/types/errors.ts:187](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L187) --- diff --git a/docs/docs/developer/api/sdk/classes/ContractError.md b/docs/docs/developer/api/sdk/classes/ContractError.md index a6cc7b7e..13f5c6a7 100644 --- a/docs/docs/developer/api/sdk/classes/ContractError.md +++ b/docs/docs/developer/api/sdk/classes/ContractError.md @@ -42,7 +42,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:43](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L43) +[sdk/src/types/errors.ts:43](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L43) ## Properties @@ -104,7 +104,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:41](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L41) +[sdk/src/types/errors.ts:41](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L41) --- diff --git a/docs/docs/developer/api/sdk/classes/FetchError.md b/docs/docs/developer/api/sdk/classes/FetchError.md index f6465954..59db0099 100644 --- a/docs/docs/developer/api/sdk/classes/FetchError.md +++ b/docs/docs/developer/api/sdk/classes/FetchError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:65](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L65) +[sdk/src/types/errors.ts:65](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L65) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:58](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L58) +[sdk/src/types/errors.ts:58](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L58) --- diff --git a/docs/docs/developer/api/sdk/classes/HypercertClient.md b/docs/docs/developer/api/sdk/classes/HypercertClient.md index 6f02910b..5c0e700b 100644 --- a/docs/docs/developer/api/sdk/classes/HypercertClient.md +++ b/docs/docs/developer/api/sdk/classes/HypercertClient.md @@ -54,7 +54,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:54](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L54) +[sdk/src/client.ts:58](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L58) ## Properties @@ -64,7 +64,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:37](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L37) +[sdk/src/client.ts:41](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L41) --- @@ -74,7 +74,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:40](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L40) +[sdk/src/client.ts:44](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L44) --- @@ -84,7 +84,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:41](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L41) +[sdk/src/client.ts:45](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L45) --- @@ -158,7 +158,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:42](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L42) +[sdk/src/client.ts:46](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L46) --- @@ -168,7 +168,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:38](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L38) +[sdk/src/client.ts:42](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L42) --- @@ -212,7 +212,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:43](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L43) +[sdk/src/client.ts:47](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L47) --- @@ -228,7 +228,7 @@ Whether the client is in read-only mode. #### Defined in -[sdk/src/client.ts:44](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L44) +[sdk/src/client.ts:48](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L48) ## Accessors @@ -246,7 +246,7 @@ The client config. #### Defined in -[sdk/src/client.ts:78](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L78) +[sdk/src/client.ts:82](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L82) --- @@ -262,13 +262,17 @@ Gets the HypercertMinter contract used by the client. The contract. +**`Deprecated`** + +Use getDeployments instead. + #### Implementation of [HypercertClientInterface](../interfaces/HypercertClientInterface.md).[contract](../interfaces/HypercertClientInterface.md#contract) #### Defined in -[sdk/src/client.ts:102](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L102) +[sdk/src/client.ts:107](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L107) --- @@ -290,7 +294,7 @@ The indexer. #### Defined in -[sdk/src/client.ts:94](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L94) +[sdk/src/client.ts:98](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L98) --- @@ -312,7 +316,7 @@ The storage layer. #### Defined in -[sdk/src/client.ts:86](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L86) +[sdk/src/client.ts:90](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L90) ## Methods @@ -351,7 +355,7 @@ Will throw an `InvalidOrMissingError` if any of the proofs are invalid. #### Defined in -[sdk/src/client.ts:443](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L443) +[sdk/src/client.ts:454](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L454) --- @@ -384,7 +388,7 @@ A promise that resolves to the transaction hash. #### Defined in -[sdk/src/client.ts:203](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L203) +[sdk/src/client.ts:216](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L216) --- @@ -421,7 +425,7 @@ Will throw a `ClientError` if the claim is not owned by the account. #### Defined in -[sdk/src/client.ts:366](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L366) +[sdk/src/client.ts:377](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L377) --- @@ -462,7 +466,27 @@ Will throw a `MalformedDataError` if the provided allowlist or metadata is inval #### Defined in -[sdk/src/client.ts:236](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L236) +[sdk/src/client.ts:249](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L249) + +--- + +### getClaimStoredDataFromTxHash + +▸ **getClaimStoredDataFromTxHash**(`hash`): `Promise`<`ParserReturnType`\> + +#### Parameters + +| Name | Type | +| :----- | :--------------- | +| `hash` | \`0x$\{string}\` | + +#### Returns + +`Promise`<`ParserReturnType`\> + +#### Defined in + +[sdk/src/client.ts:485](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L485) --- @@ -482,21 +506,53 @@ Will throw a `MalformedDataError` if the provided allowlist or metadata is inval #### Defined in -[sdk/src/client.ts:483](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L483) +[sdk/src/client.ts:502](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L502) --- ### getContractConfig -▸ **getContractConfig**(): `GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[], `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`\>, `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`\>, \`0x$\{string}\`, `string`, `string`, `string`, `false`\> +▸ **getContractConfig**(): `GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[], \{ `account`: `undefined` ; `batch?`: \{ `multicall?`: `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } } ; `cacheTime`: `number` ; `call`: (`parameters`: `CallParameters`<`undefined` \| `Chain`\>) => `Promise`<`CallReturnType`\> ; `chain`: `undefined` \| `Chain` ; `createBlockFilter`: () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"block"` }\> ; `createContractEventFilter`: (`args`: `CreateContractEventFilterParameters`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`CreateContractEventFilterReturnType`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>\> ; `createEventFilter`: (`args?`: `CreateEventFilterParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`, `_EventName`, `_Args`\>) => `Promise`<\{ [K in keyof Filter<"event", TAbiEvents, \_EventName, \_Args, TStrict, TFromBlock, TToBlock\>]: Filter<"event", TAbiEvents, ... 4 more ..., TToBlock\>[K]; }\> ; `createPendingTransactionFilter`: () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"transaction"` }\> ; `estimateContractGas`: (`args`: `EstimateContractGasParameters`<`TAbi`, `TFunctionName`, `TChain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> ; `estimateFeesPerGas`: (`args?`: `EstimateFeesPerGasParameters`<`undefined` \| `Chain`, `TChainOverride`, `TType`\>) => `Promise`<`EstimateFeesPerGasReturnType`\> ; `estimateGas`: (`args`: `EstimateGasParameters`<`undefined` \| `Chain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> ; `estimateMaxPriorityFeePerGas`: (`args?`: \{ `chain`: `null` \| `TChainOverride` }) => `Promise`<`bigint`\> ; `extend`: (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, `PublicActions`<`Transport`, `undefined` \| `Chain`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, \{ [K in keyof client]: client[K]; } & `PublicActions`<`Transport`, `undefined` \| `Chain`\>\> ; `getBalance`: (`args`: `GetBalanceParameters`) => `Promise`<`bigint`\> ; `getBlock`: (`args?`: `GetBlockParameters`<`TIncludeTransactions`, `TBlockTag`\>) => `Promise`<`GetBlockReturnType`<`undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>\> ; `getBlockNumber`: (`args?`: `GetBlockNumberParameters`) => `Promise`<`bigint`\> ; `getBlockTransactionCount`: (`args?`: `GetBlockTransactionCountParameters`) => `Promise`<`number`\> ; `getBytecode`: (`args`: `GetBytecodeParameters`) => `Promise`<`GetBytecodeReturnType`\> ; `getChainId`: () => `Promise`<`number`\> ; `getContractEvents`: (`args`: `GetContractEventsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetContractEventsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> ; `getEnsAddress`: (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; coinType?: number \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsAddressReturnType`\> ; `getEnsAvatar`: (`args`: \{ name: string; blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; universalResolverAddress?: \`0x$\{string}\` \| undefined; gatewayUrls?: AssetGatewayUrls \| undefined; }) => `Promise`<`GetEnsAvatarReturnType`\> ; `getEnsName`: (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; address: \`0x$\{string}\`; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsNameReturnType`\> ; `getEnsResolver`: (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<\`0x$\{string}\`\> ; `getEnsText`: (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; key: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsTextReturnType`\> ; `getFeeHistory`: (`args`: `GetFeeHistoryParameters`) => `Promise`<`GetFeeHistoryReturnType`\> ; `getFilterChanges`: (`args`: `GetFilterChangesParameters`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterChangesReturnType`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> ; `getFilterLogs`: (`args`: `GetFilterLogsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterLogsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> ; `getGasPrice`: () => `Promise`<`bigint`\> ; `getLogs`: (`args?`: `GetLogsParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetLogsReturnType`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>\> ; `getProof`: (`args`: `GetProofParameters`) => `Promise`<`GetProofReturnType`\> ; `getStorageAt`: (`args`: `GetStorageAtParameters`) => `Promise`<`GetStorageAtReturnType`\> ; `getTransaction`: (`args`: `GetTransactionParameters`<`TBlockTag`\>) => `Promise`<`GetTransactionReturnType`<`undefined` \| `Chain`, `TBlockTag`\>\> ; `getTransactionConfirmations`: (`args`: `GetTransactionConfirmationsParameters`<`undefined` \| `Chain`\>) => `Promise`<`bigint`\> ; `getTransactionCount`: (`args`: `GetTransactionCountParameters`) => `Promise`<`number`\> ; `getTransactionReceipt`: (`args`: `GetTransactionReceiptParameters`) => `Promise`<`TransactionReceipt`\> ; `key`: `string` ; `multicall`: (`args`: `MulticallParameters`<`TContracts`, `TAllowFailure`\>) => `Promise`<`MulticallReturnType`<`TContracts`, `TAllowFailure`\>\> ; `name`: `string` ; `pollingInterval`: `number` ; `prepareTransactionRequest`: (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> ; `readContract`: (`args`: `ReadContractParameters`<`TAbi`, `TFunctionName`\>) => `Promise`<`ReadContractReturnType`<`TAbi`, `TFunctionName`\>\> ; `request`: `EIP1193RequestFn`<`PublicRpcSchema`\> ; `sendRawTransaction`: (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> ; `simulateContract`: (`args`: `SimulateContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>) => `Promise`<`SimulateContractReturnType`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>\> ; `transport`: `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> ; `type`: `string` ; `uid`: `string` ; `uninstallFilter`: (`args`: `UninstallFilterParameters`) => `Promise`<`boolean`\> ; `verifyMessage`: (`args`: `VerifyMessageParameters`) => `Promise`<`boolean`\> ; `verifyTypedData`: (`args`: `VerifyTypedDataParameters`) => `Promise`<`boolean`\> ; `waitForTransactionReceipt`: (`args`: `WaitForTransactionReceiptParameters`<`undefined` \| `Chain`\>) => `Promise`<`TransactionReceipt`\> ; `watchBlockNumber`: (`args`: `WatchBlockNumberParameters`) => `WatchBlockNumberReturnType` ; `watchBlocks`: (`args`: `WatchBlocksParameters`<`Transport`, `undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>) => `WatchBlocksReturnType` ; `watchContractEvent`: (`args`: `WatchContractEventParameters`<`TAbi`, `TEventName`, `TStrict`\>) => `WatchContractEventReturnType` ; `watchEvent`: (`args`: `WatchEventParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`\>) => `WatchEventReturnType` ; `watchPendingTransactions`: (`args`: `WatchPendingTransactionsParameters`<`Transport`\>) => `WatchPendingTransactionsReturnType` }, `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`\>, \`0x$\{string}\`, `string`, `string`, `string`, `false`\> #### Returns -`GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[], `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`\>, `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`\>, \`0x$\{string}\`, `string`, `string`, `string`, `false`\> +`GetContractReturnType`<(\{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AlreadyClaimed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "previousAdmin"; `type`: `string` = "address" }[] ; `name`: `string` = "AdminChanged"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "account"; `type`: `string` = "address" }[] ; `name`: `string` = "balanceOf"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = ""; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[], \{ `account`: `undefined` ; `batch?`: \{ `multicall?`: `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } } ; `cacheTime`: `number` ; `call`: (`parameters`: `CallParameters`<`undefined` \| `Chain`\>) => `Promise`<`CallReturnType`\> ; `chain`: `undefined` \| `Chain` ; `createBlockFilter`: () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"block"` }\> ; `createContractEventFilter`: (`args`: `CreateContractEventFilterParameters`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`CreateContractEventFilterReturnType`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>\> ; `createEventFilter`: (`args?`: `CreateEventFilterParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`, `_EventName`, `_Args`\>) => `Promise`<\{ [K in keyof Filter<"event", TAbiEvents, \_EventName, \_Args, TStrict, TFromBlock, TToBlock\>]: Filter<"event", TAbiEvents, ... 4 more ..., TToBlock\>[K]; }\> ; `createPendingTransactionFilter`: () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"transaction"` }\> ; `estimateContractGas`: (`args`: `EstimateContractGasParameters`<`TAbi`, `TFunctionName`, `TChain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> ; `estimateFeesPerGas`: (`args?`: `EstimateFeesPerGasParameters`<`undefined` \| `Chain`, `TChainOverride`, `TType`\>) => `Promise`<`EstimateFeesPerGasReturnType`\> ; `estimateGas`: (`args`: `EstimateGasParameters`<`undefined` \| `Chain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> ; `estimateMaxPriorityFeePerGas`: (`args?`: \{ `chain`: `null` \| `TChainOverride` }) => `Promise`<`bigint`\> ; `extend`: (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, `PublicActions`<`Transport`, `undefined` \| `Chain`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, \{ [K in keyof client]: client[K]; } & `PublicActions`<`Transport`, `undefined` \| `Chain`\>\> ; `getBalance`: (`args`: `GetBalanceParameters`) => `Promise`<`bigint`\> ; `getBlock`: (`args?`: `GetBlockParameters`<`TIncludeTransactions`, `TBlockTag`\>) => `Promise`<`GetBlockReturnType`<`undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>\> ; `getBlockNumber`: (`args?`: `GetBlockNumberParameters`) => `Promise`<`bigint`\> ; `getBlockTransactionCount`: (`args?`: `GetBlockTransactionCountParameters`) => `Promise`<`number`\> ; `getBytecode`: (`args`: `GetBytecodeParameters`) => `Promise`<`GetBytecodeReturnType`\> ; `getChainId`: () => `Promise`<`number`\> ; `getContractEvents`: (`args`: `GetContractEventsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetContractEventsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> ; `getEnsAddress`: (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; coinType?: number \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsAddressReturnType`\> ; `getEnsAvatar`: (`args`: \{ name: string; blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; universalResolverAddress?: \`0x$\{string}\` \| undefined; gatewayUrls?: AssetGatewayUrls \| undefined; }) => `Promise`<`GetEnsAvatarReturnType`\> ; `getEnsName`: (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; address: \`0x$\{string}\`; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsNameReturnType`\> ; `getEnsResolver`: (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<\`0x$\{string}\`\> ; `getEnsText`: (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; key: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsTextReturnType`\> ; `getFeeHistory`: (`args`: `GetFeeHistoryParameters`) => `Promise`<`GetFeeHistoryReturnType`\> ; `getFilterChanges`: (`args`: `GetFilterChangesParameters`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterChangesReturnType`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> ; `getFilterLogs`: (`args`: `GetFilterLogsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterLogsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> ; `getGasPrice`: () => `Promise`<`bigint`\> ; `getLogs`: (`args?`: `GetLogsParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetLogsReturnType`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>\> ; `getProof`: (`args`: `GetProofParameters`) => `Promise`<`GetProofReturnType`\> ; `getStorageAt`: (`args`: `GetStorageAtParameters`) => `Promise`<`GetStorageAtReturnType`\> ; `getTransaction`: (`args`: `GetTransactionParameters`<`TBlockTag`\>) => `Promise`<`GetTransactionReturnType`<`undefined` \| `Chain`, `TBlockTag`\>\> ; `getTransactionConfirmations`: (`args`: `GetTransactionConfirmationsParameters`<`undefined` \| `Chain`\>) => `Promise`<`bigint`\> ; `getTransactionCount`: (`args`: `GetTransactionCountParameters`) => `Promise`<`number`\> ; `getTransactionReceipt`: (`args`: `GetTransactionReceiptParameters`) => `Promise`<`TransactionReceipt`\> ; `key`: `string` ; `multicall`: (`args`: `MulticallParameters`<`TContracts`, `TAllowFailure`\>) => `Promise`<`MulticallReturnType`<`TContracts`, `TAllowFailure`\>\> ; `name`: `string` ; `pollingInterval`: `number` ; `prepareTransactionRequest`: (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> ; `readContract`: (`args`: `ReadContractParameters`<`TAbi`, `TFunctionName`\>) => `Promise`<`ReadContractReturnType`<`TAbi`, `TFunctionName`\>\> ; `request`: `EIP1193RequestFn`<`PublicRpcSchema`\> ; `sendRawTransaction`: (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> ; `simulateContract`: (`args`: `SimulateContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>) => `Promise`<`SimulateContractReturnType`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>\> ; `transport`: `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> ; `type`: `string` ; `uid`: `string` ; `uninstallFilter`: (`args`: `UninstallFilterParameters`) => `Promise`<`boolean`\> ; `verifyMessage`: (`args`: `VerifyMessageParameters`) => `Promise`<`boolean`\> ; `verifyTypedData`: (`args`: `VerifyTypedDataParameters`) => `Promise`<`boolean`\> ; `waitForTransactionReceipt`: (`args`: `WaitForTransactionReceiptParameters`<`undefined` \| `Chain`\>) => `Promise`<`TransactionReceipt`\> ; `watchBlockNumber`: (`args`: `WatchBlockNumberParameters`) => `WatchBlockNumberReturnType` ; `watchBlocks`: (`args`: `WatchBlocksParameters`<`Transport`, `undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>) => `WatchBlocksReturnType` ; `watchContractEvent`: (`args`: `WatchContractEventParameters`<`TAbi`, `TEventName`, `TStrict`\>) => `WatchContractEventReturnType` ; `watchEvent`: (`args`: `WatchEventParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`\>) => `WatchEventReturnType` ; `watchPendingTransactions`: (`args`: `WatchPendingTransactionsParameters`<`Transport`\>) => `WatchPendingTransactionsReturnType` }, `undefined` \| `Client`<`Transport`, `undefined` \| `Chain`, `undefined` \| `Account`\>, \`0x$\{string}\`, `string`, `string`, `string`, `false`\> + +#### Defined in + +[sdk/src/client.ts:491](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L491) + +--- + +### getDeployment + +▸ **getDeployment**(`chainId`): `Partial`<[`Deployment`](../modules.md#deployment)\> + +Gets the contract addresses and graph urls for the provided `chainId` + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------- | +| `chainId` | [`SupportedChainIds`](../modules.md#supportedchainids) | + +#### Returns + +`Partial`<[`Deployment`](../modules.md#deployment)\> + +The addresses, graph name and graph url. + +**`Deprecated`** + +Use getDeployments instead. + +#### Implementation of + +[HypercertClientInterface](../interfaces/HypercertClientInterface.md).[getDeployment](../interfaces/HypercertClientInterface.md#getdeployment) #### Defined in -[sdk/src/client.ts:474](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L474) +[sdk/src/client.ts:120](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L120) --- @@ -526,7 +582,7 @@ a Promise that resolves to the applicable transfer restrictions. #### Defined in -[sdk/src/client.ts:155](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L155) +[sdk/src/client.ts:168](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L168) --- @@ -574,7 +630,7 @@ a Promise that resolves to the applicable transfer restrictions. #### Defined in -[sdk/src/client.ts:493](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L493) +[sdk/src/client.ts:512](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L512) --- @@ -611,7 +667,7 @@ Will throw a `ClientError` if any of the fractions are not owned by the account. #### Defined in -[sdk/src/client.ts:323](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L323) +[sdk/src/client.ts:336](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L336) --- @@ -651,7 +707,7 @@ Will throw a `MalformedDataError` if the provided metadata is invalid. #### Defined in -[sdk/src/client.ts:126](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L126) +[sdk/src/client.ts:139](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L139) --- @@ -690,7 +746,7 @@ Will throw an `InvalidOrMissingError` if the proof is invalid. #### Defined in -[sdk/src/client.ts:399](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L399) +[sdk/src/client.ts:410](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L410) --- @@ -713,7 +769,7 @@ Will throw an `InvalidOrMissingError` if the proof is invalid. #### Defined in -[sdk/src/client.ts:503](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L503) +[sdk/src/client.ts:522](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L522) --- @@ -752,7 +808,7 @@ Will throw a `ClientError` if the fraction is not owned by the account or if the #### Defined in -[sdk/src/client.ts:278](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L278) +[sdk/src/client.ts:291](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L291) --- @@ -782,7 +838,7 @@ Will throw a `ClientError` if the request fails. #### Defined in -[sdk/src/client.ts:534](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L534) +[sdk/src/client.ts:553](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L553) --- @@ -815,4 +871,4 @@ A promise that resolves to the transaction hash. #### Defined in -[sdk/src/client.ts:175](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/client.ts#L175) +[sdk/src/client.ts:188](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L188) diff --git a/docs/docs/developer/api/sdk/classes/HypercertsStorage.md b/docs/docs/developer/api/sdk/classes/HypercertsStorage.md index 2eb84eee..6729be6f 100644 --- a/docs/docs/developer/api/sdk/classes/HypercertsStorage.md +++ b/docs/docs/developer/api/sdk/classes/HypercertsStorage.md @@ -71,7 +71,7 @@ Note: The original implementation using the Web3 Storage client is currently com #### Defined in -[sdk/src/storage.ts:122](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/storage.ts#L122) +[sdk/src/storage.ts:128](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/storage.ts#L128) --- @@ -106,7 +106,7 @@ Will throw a `MalformedDataError` if the retrieved data is invalid. #### Defined in -[sdk/src/storage.ts:99](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/storage.ts#L99) +[sdk/src/storage.ts:105](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/storage.ts#L105) --- @@ -147,7 +147,7 @@ Will throw a `MalformedDataError` if the provided metadata is invalid. #### Defined in -[sdk/src/storage.ts:34](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/storage.ts#L34) +[sdk/src/storage.ts:34](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/storage.ts#L34) --- @@ -187,4 +187,4 @@ Will throw a `MalformedDataError` if the provided metadata is invalid. #### Defined in -[sdk/src/storage.ts:70](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/storage.ts#L70) +[sdk/src/storage.ts:74](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/storage.ts#L74) diff --git a/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md index 7c8bc0a8..e487ebfe 100644 --- a/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md +++ b/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:83](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L83) +[sdk/src/types/errors.ts:83](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L83) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:76](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L76) +[sdk/src/types/errors.ts:76](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L76) --- diff --git a/docs/docs/developer/api/sdk/classes/MalformedDataError.md b/docs/docs/developer/api/sdk/classes/MalformedDataError.md index 7f553e20..c4f094c7 100644 --- a/docs/docs/developer/api/sdk/classes/MalformedDataError.md +++ b/docs/docs/developer/api/sdk/classes/MalformedDataError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:155](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L155) +[sdk/src/types/errors.ts:155](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L155) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:148](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L148) +[sdk/src/types/errors.ts:148](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L148) --- diff --git a/docs/docs/developer/api/sdk/classes/MintingError.md b/docs/docs/developer/api/sdk/classes/MintingError.md index 221c46c7..ae67a9ab 100644 --- a/docs/docs/developer/api/sdk/classes/MintingError.md +++ b/docs/docs/developer/api/sdk/classes/MintingError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:101](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L101) +[sdk/src/types/errors.ts:101](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L101) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:94](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L94) +[sdk/src/types/errors.ts:94](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L94) --- diff --git a/docs/docs/developer/api/sdk/classes/StorageError.md b/docs/docs/developer/api/sdk/classes/StorageError.md index 59ed8dfb..4cfc9f73 100644 --- a/docs/docs/developer/api/sdk/classes/StorageError.md +++ b/docs/docs/developer/api/sdk/classes/StorageError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:119](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L119) +[sdk/src/types/errors.ts:119](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L119) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:112](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L112) +[sdk/src/types/errors.ts:112](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L112) --- diff --git a/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md b/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md index 4f7cb558..35d2d426 100644 --- a/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md +++ b/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md @@ -44,7 +44,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:137](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L137) +[sdk/src/types/errors.ts:137](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L137) ## Properties @@ -108,7 +108,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:130](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L130) +[sdk/src/types/errors.ts:130](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L130) --- diff --git a/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md b/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md index c19302d3..e54388fe 100644 --- a/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md +++ b/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md @@ -45,7 +45,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:174](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L174) +[sdk/src/types/errors.ts:174](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L174) ## Properties @@ -109,7 +109,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:167](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L167) +[sdk/src/types/errors.ts:167](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L167) --- diff --git a/docs/docs/developer/api/sdk/interfaces/CustomError.md b/docs/docs/developer/api/sdk/interfaces/CustomError.md index 14d3a968..3be7a437 100644 --- a/docs/docs/developer/api/sdk/interfaces/CustomError.md +++ b/docs/docs/developer/api/sdk/interfaces/CustomError.md @@ -35,4 +35,4 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:10](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L10) +[sdk/src/types/errors.ts:10](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L10) diff --git a/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md index 2ddc1502..35b87c49 100644 --- a/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:22](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L22) +[sdk/src/types/evaluation.d.ts:22](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L22) --- @@ -28,7 +28,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:24](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L24) +[sdk/src/types/evaluation.d.ts:24](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L24) --- @@ -38,7 +38,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L23) +[sdk/src/types/evaluation.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L23) --- @@ -48,4 +48,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:21](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L21) +[sdk/src/types/evaluation.d.ts:21](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md b/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md index c3f23db0..97886bf6 100644 --- a/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:41](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L41) +[sdk/src/types/evaluation.d.ts:41](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L41) --- @@ -28,7 +28,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:42](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L42) +[sdk/src/types/evaluation.d.ts:42](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L42) --- @@ -38,7 +38,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L40) +[sdk/src/types/evaluation.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L40) --- @@ -48,4 +48,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:43](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L43) +[sdk/src/types/evaluation.d.ts:43](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md index 46890c56..f4940137 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -34,7 +34,7 @@ Contributors #### Defined in -[sdk/src/types/claimdata.d.ts:53](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/claimdata.d.ts#L53) +[sdk/src/types/claimdata.d.ts:53](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L53) --- @@ -59,7 +59,7 @@ Scopes of impact #### Defined in -[sdk/src/types/claimdata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/claimdata.d.ts#L15) +[sdk/src/types/claimdata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L15) --- @@ -83,7 +83,7 @@ Impact time period. The value is UNIX time in seconds from epoch. #### Defined in -[sdk/src/types/claimdata.d.ts:44](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/claimdata.d.ts#L44) +[sdk/src/types/claimdata.d.ts:44](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L44) --- @@ -108,7 +108,7 @@ Rights #### Defined in -[sdk/src/types/claimdata.d.ts:62](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/claimdata.d.ts#L62) +[sdk/src/types/claimdata.d.ts:62](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L62) --- @@ -133,7 +133,7 @@ Scopes of work #### Defined in -[sdk/src/types/claimdata.d.ts:25](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/claimdata.d.ts#L25) +[sdk/src/types/claimdata.d.ts:25](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L25) --- @@ -157,4 +157,4 @@ Work time period. The value is UNIX time in seconds from epoch. #### Defined in -[sdk/src/types/claimdata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/claimdata.d.ts#L35) +[sdk/src/types/claimdata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md index 0e0040ab..4443f615 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -62,7 +62,7 @@ The order of the arrays must be equal. #### Defined in -[sdk/src/types/client.ts:232](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L232) +[sdk/src/types/client.ts:253](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L253) --- @@ -96,7 +96,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:166](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L166) +[sdk/src/types/client.ts:187](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L187) --- @@ -128,7 +128,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:207](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L207) +[sdk/src/types/client.ts:228](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L228) --- @@ -142,7 +142,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:119](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L119) +[sdk/src/types/client.ts:134](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L134) --- @@ -177,7 +177,39 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:180](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L180) +[sdk/src/types/client.ts:201](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L201) + +--- + +### getDeployment + +• **getDeployment**: (`chainId`: [`SupportedChainIds`](../modules.md#supportedchainids)) => `Partial`<[`Deployment`](../modules.md#deployment)\> + +#### Type declaration + +▸ (`chainId`): `Partial`<[`Deployment`](../modules.md#deployment)\> + +Gets the contract addresses and graph urls for the provided `chainId` + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------- | +| `chainId` | [`SupportedChainIds`](../modules.md#supportedchainids) | + +##### Returns + +`Partial`<[`Deployment`](../modules.md#deployment)\> + +The addresses, graph name and graph url. + +#### Inherited from + +[HypercertClientMethods](HypercertClientMethods.md).[getDeployment](HypercertClientMethods.md#getdeployment) + +#### Defined in + +[sdk/src/types/client.ts:145](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L145) --- @@ -209,7 +241,7 @@ A Promise that resolves to the applicable transfer restrictions. #### Defined in -[sdk/src/types/client.ts:144](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L144) +[sdk/src/types/client.ts:165](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L165) --- @@ -225,7 +257,7 @@ The indexer used by the client. #### Defined in -[sdk/src/types/client.ts:118](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L118) +[sdk/src/types/client.ts:133](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L133) --- @@ -257,7 +289,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:200](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L200) +[sdk/src/types/client.ts:221](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L221) --- @@ -291,7 +323,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:133](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L133) +[sdk/src/types/client.ts:154](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L154) --- @@ -325,7 +357,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:216](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L216) +[sdk/src/types/client.ts:237](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L237) --- @@ -341,7 +373,7 @@ Whether the client is in read-only mode. #### Defined in -[sdk/src/types/client.ts:114](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L114) +[sdk/src/types/client.ts:129](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L129) --- @@ -374,7 +406,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:193](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L193) +[sdk/src/types/client.ts:214](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L214) --- @@ -390,7 +422,7 @@ The storage layer used by the client. #### Defined in -[sdk/src/types/client.ts:116](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L116) +[sdk/src/types/client.ts:131](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L131) --- @@ -424,4 +456,4 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:153](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L153) +[sdk/src/types/client.ts:174](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L174) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md index f931b253..07e47e33 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -52,7 +52,7 @@ The order of the arrays must be equal. #### Defined in -[sdk/src/types/client.ts:232](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L232) +[sdk/src/types/client.ts:253](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L253) --- @@ -82,7 +82,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:166](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L166) +[sdk/src/types/client.ts:187](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L187) --- @@ -110,7 +110,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:207](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L207) +[sdk/src/types/client.ts:228](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L228) --- @@ -141,7 +141,35 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:180](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L180) +[sdk/src/types/client.ts:201](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L201) + +--- + +### getDeployment + +• **getDeployment**: (`chainId`: [`SupportedChainIds`](../modules.md#supportedchainids)) => `Partial`<[`Deployment`](../modules.md#deployment)\> + +#### Type declaration + +▸ (`chainId`): `Partial`<[`Deployment`](../modules.md#deployment)\> + +Gets the contract addresses and graph urls for the provided `chainId` + +##### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------- | +| `chainId` | [`SupportedChainIds`](../modules.md#supportedchainids) | + +##### Returns + +`Partial`<[`Deployment`](../modules.md#deployment)\> + +The addresses, graph name and graph url. + +#### Defined in + +[sdk/src/types/client.ts:145](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L145) --- @@ -169,7 +197,7 @@ A Promise that resolves to the applicable transfer restrictions. #### Defined in -[sdk/src/types/client.ts:144](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L144) +[sdk/src/types/client.ts:165](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L165) --- @@ -197,7 +225,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:200](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L200) +[sdk/src/types/client.ts:221](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L221) --- @@ -227,7 +255,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:133](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L133) +[sdk/src/types/client.ts:154](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L154) --- @@ -257,7 +285,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:216](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L216) +[sdk/src/types/client.ts:237](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L237) --- @@ -286,7 +314,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:193](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L193) +[sdk/src/types/client.ts:214](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L214) --- @@ -316,4 +344,4 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:153](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L153) +[sdk/src/types/client.ts:174](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L174) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md index a5356f30..03e2c6fb 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md @@ -22,7 +22,7 @@ The state of the Hypercert client. #### Defined in -[sdk/src/types/client.ts:119](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L119) +[sdk/src/types/client.ts:134](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L134) --- @@ -34,7 +34,7 @@ The indexer used by the client. #### Defined in -[sdk/src/types/client.ts:118](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L118) +[sdk/src/types/client.ts:133](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L133) --- @@ -46,7 +46,7 @@ Whether the client is in read-only mode. #### Defined in -[sdk/src/types/client.ts:114](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L114) +[sdk/src/types/client.ts:129](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L129) --- @@ -58,4 +58,4 @@ The storage layer used by the client. #### Defined in -[sdk/src/types/client.ts:116](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L116) +[sdk/src/types/client.ts:131](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L131) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md index 5f83ccfd..73316c03 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -20,7 +20,7 @@ Schema for evaluating Hypercerts across different sources and evaluation types #### Defined in -[sdk/src/types/evaluation.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L15) +[sdk/src/types/evaluation.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L15) --- @@ -30,7 +30,7 @@ Schema for evaluating Hypercerts across different sources and evaluation types #### Defined in -[sdk/src/types/evaluation.d.ts:16](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L16) +[sdk/src/types/evaluation.d.ts:16](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L16) --- @@ -40,4 +40,4 @@ Schema for evaluating Hypercerts across different sources and evaluation types #### Defined in -[sdk/src/types/evaluation.d.ts:17](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L17) +[sdk/src/types/evaluation.d.ts:17](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md index 7f8f2fd7..8d4f8430 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -28,7 +28,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:20](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/indexer.ts#L20) +[sdk/src/types/indexer.ts:20](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L20) --- @@ -53,7 +53,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:19](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/indexer.ts#L19) +[sdk/src/types/indexer.ts:19](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L19) --- @@ -77,7 +77,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:21](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/indexer.ts#L21) +[sdk/src/types/indexer.ts:21](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L21) --- @@ -101,7 +101,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:24](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/indexer.ts#L24) +[sdk/src/types/indexer.ts:24](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L24) --- @@ -126,7 +126,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:23](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/indexer.ts#L23) +[sdk/src/types/indexer.ts:23](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L23) --- @@ -151,7 +151,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:22](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/indexer.ts#L22) +[sdk/src/types/indexer.ts:22](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L22) --- @@ -161,4 +161,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:18](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/indexer.ts#L18) +[sdk/src/types/indexer.ts:18](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L18) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md index 26829109..d65901c4 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md @@ -18,7 +18,7 @@ A CID pointer to the merke tree proof json on ipfs #### Defined in -[sdk/src/types/metadata.d.ts:39](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/metadata.d.ts#L39) +[sdk/src/types/metadata.d.ts:39](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L39) --- @@ -30,7 +30,7 @@ Describes the asset to which this token represents #### Defined in -[sdk/src/types/metadata.d.ts:19](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/metadata.d.ts#L19) +[sdk/src/types/metadata.d.ts:19](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L19) --- @@ -42,7 +42,7 @@ An url pointing to the external website of the project #### Defined in -[sdk/src/types/metadata.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/metadata.d.ts#L23) +[sdk/src/types/metadata.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L23) --- @@ -52,7 +52,7 @@ An url pointing to the external website of the project #### Defined in -[sdk/src/types/metadata.d.ts:45](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/metadata.d.ts#L45) +[sdk/src/types/metadata.d.ts:45](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L45) --- @@ -64,7 +64,7 @@ A URI pointing to a resource with mime type image/\* representing the asset to w #### Defined in -[sdk/src/types/metadata.d.ts:27](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/metadata.d.ts#L27) +[sdk/src/types/metadata.d.ts:27](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L27) --- @@ -76,7 +76,7 @@ Identifies the asset to which this token represents #### Defined in -[sdk/src/types/metadata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/metadata.d.ts#L15) +[sdk/src/types/metadata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L15) --- @@ -86,7 +86,7 @@ Identifies the asset to which this token represents #### Defined in -[sdk/src/types/metadata.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/metadata.d.ts#L40) +[sdk/src/types/metadata.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L40) --- @@ -98,7 +98,7 @@ Describes the asset to which this token represents #### Defined in -[sdk/src/types/metadata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/metadata.d.ts#L35) +[sdk/src/types/metadata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L35) --- @@ -110,4 +110,4 @@ The version of Hypercert schema used to describe this hypercert #### Defined in -[sdk/src/types/metadata.d.ts:31](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/metadata.d.ts#L31) +[sdk/src/types/metadata.d.ts:31](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md b/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md index 5e5e4ed9..09435a74 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:28](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L28) +[sdk/src/types/evaluation.d.ts:28](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L28) --- @@ -28,7 +28,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:30](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L30) +[sdk/src/types/evaluation.d.ts:30](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L30) --- @@ -38,4 +38,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:29](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L29) +[sdk/src/types/evaluation.d.ts:29](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md index c7fc579b..05c148bd 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -38,7 +38,7 @@ A Promise that resolves to the retrieved data. #### Defined in -[sdk/src/types/client.ts:93](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L93) +[sdk/src/types/client.ts:108](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L108) --- @@ -66,7 +66,7 @@ A Promise that resolves to the retrieved metadata. #### Defined in -[sdk/src/types/client.ts:86](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L86) +[sdk/src/types/client.ts:101](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L101) --- @@ -95,7 +95,7 @@ A Promise that resolves to the CID of the stored metadata. #### Defined in -[sdk/src/types/client.ts:72](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L72) +[sdk/src/types/client.ts:87](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L87) --- @@ -123,4 +123,4 @@ A Promise that resolves to the CID of the stored metadata. #### Defined in -[sdk/src/types/client.ts:79](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L79) +[sdk/src/types/client.ts:94](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L94) diff --git a/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md index 8cc2dd82..57e8d6aa 100644 --- a/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:48](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L48) +[sdk/src/types/evaluation.d.ts:48](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L48) --- @@ -28,4 +28,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:47](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L47) +[sdk/src/types/evaluation.d.ts:47](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md index 04258586..705077f0 100644 --- a/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L35) +[sdk/src/types/evaluation.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L35) --- @@ -28,7 +28,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:36](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L36) +[sdk/src/types/evaluation.d.ts:36](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L36) --- @@ -38,4 +38,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:34](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L34) +[sdk/src/types/evaluation.d.ts:34](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/docs/developer/api/sdk/modules.md b/docs/docs/developer/api/sdk/modules.md index a123fb74..2b9037b7 100644 --- a/docs/docs/developer/api/sdk/modules.md +++ b/docs/docs/developer/api/sdk/modules.md @@ -55,7 +55,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/types/hypercerts.ts:24](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/hypercerts.ts#L24) +[sdk/src/types/hypercerts.ts:24](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/hypercerts.ts#L24) --- @@ -80,7 +80,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:195](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/graphql.ts#L195) +[sdk/src/indexer/gql/graphql.ts:195](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L195) --- @@ -97,7 +97,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:1167](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/graphql.ts#L1167) +[sdk/src/indexer/gql/graphql.ts:1156](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1156) --- @@ -119,7 +119,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:208](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/graphql.ts#L208) +[sdk/src/indexer/gql/graphql.ts:208](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L208) --- @@ -136,7 +136,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:1194](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/graphql.ts#L1194) +[sdk/src/indexer/gql/graphql.ts:1205](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1205) --- @@ -153,7 +153,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:1187](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/graphql.ts#L1187) +[sdk/src/indexer/gql/graphql.ts:1196](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1196) --- @@ -170,7 +170,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:1177](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/graphql.ts#L1177) +[sdk/src/indexer/gql/graphql.ts:1177](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1177) --- @@ -187,7 +187,17 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:1151](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/graphql.ts#L1151) +[sdk/src/indexer/gql/graphql.ts:1118](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1118) + +--- + +### Contracts + +Ƭ **Contracts**: `"HypercertMinterUUPS"` \| `"TransferManager"` \| `"ProtocolFeeRecipient"` \| `"HypercertExchange"` \| `"RoyaltyFeeRegistry"` \| `"OrderValidator"` \| `"CreatorFeeManager"` \| `"StrategyCollectionOffer"` \| `"StrategyDutchAuction"` \| `"StrategyItemIdsRange"` \| `"StrategyHypercertCollectionOffer"` \| `"StrategyHypercertDutchAuction"` \| `"StrategyHypercertFractionOffer"` + +#### Defined in + +[sdk/src/types/client.ts:17](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L17) --- @@ -199,16 +209,16 @@ Represents a deployment of a contract on a specific network. #### Type declaration -| Name | Type | Description | -| :---------------- | :------------------ | :--------------------------------------------------------------------------------------- | -| `chain` | `Partial`<`Chain`\> | - | -| `contractAddress` | `string` | The address of the deployed contract. | -| `graphName` | `string` | - | -| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | +| Name | Type | Description | +| :---------- | :--------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- | +| `addresses` | `Partial`<`Record`<[`Contracts`](modules.md#contracts), \`0x$\{string}\`\>\> | The address of the deployed contract. | +| `chain` | `Partial`<`Chain`\> | - | +| `graphName` | `string` | - | +| `graphUrl` | `string` | The url to the subgraph that indexes the contract events. Override for localized testing | #### Defined in -[sdk/src/types/client.ts:20](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L20) +[sdk/src/types/client.ts:35](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L35) --- @@ -224,7 +234,7 @@ Represents a deployment of a contract on a specific network. #### Defined in -[sdk/src/indexer/gql/gql.ts:47](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/gql.ts#L47) +[sdk/src/indexer/gql/gql.ts:53](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/gql.ts#L53) --- @@ -238,7 +248,7 @@ and run json-schema-to-typescript to regenerate this file. #### Defined in -[sdk/src/types/evaluation.d.ts:8](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L8) +[sdk/src/types/evaluation.d.ts:8](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L8) --- @@ -248,7 +258,7 @@ and run json-schema-to-typescript to regenerate this file. #### Defined in -[sdk/src/types/evaluation.d.ts:9](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/evaluation.d.ts#L9) +[sdk/src/types/evaluation.d.ts:9](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L9) --- @@ -264,7 +274,7 @@ and run json-schema-to-typescript to regenerate this file. #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:6](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/fragment-masking.ts#L6) +[sdk/src/indexer/gql/fragment-masking.ts:5](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L5) --- @@ -276,7 +286,7 @@ Configuration options for the Hypercert client. #### Defined in -[sdk/src/types/client.ts:32](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L32) +[sdk/src/types/client.ts:47](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L47) --- @@ -294,7 +304,7 @@ The props for the Hypercert client. #### Defined in -[sdk/src/types/client.ts:99](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L99) +[sdk/src/types/client.ts:114](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L114) --- @@ -310,7 +320,7 @@ The signer is required for submitting evaluations. #### Defined in -[sdk/src/types/client.ts:59](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L59) +[sdk/src/types/client.ts:74](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L74) --- @@ -332,7 +342,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/client.ts:50](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L50) +[sdk/src/types/client.ts:65](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L65) --- @@ -342,7 +352,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/errors.ts:195](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/errors.ts#L195) +[sdk/src/types/errors.ts:195](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L195) --- @@ -364,7 +374,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/indexer.ts:10](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/indexer.ts#L10) +[sdk/src/types/indexer.ts:10](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L10) --- @@ -381,7 +391,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/indexer/gql/graphql.ts:1160](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/graphql.ts#L1160) +[sdk/src/indexer/gql/graphql.ts:1138](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1138) --- @@ -391,7 +401,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/client.ts:10](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L10) +[sdk/src/types/client.ts:10](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L10) --- @@ -409,7 +419,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/client.ts:11](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/client.ts#L11) +[sdk/src/types/client.ts:11](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L11) --- @@ -419,19 +429,39 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/hypercerts.ts#L9) +[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/hypercerts.ts#L9) -[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/hypercerts.ts#L15) +[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/hypercerts.ts#L15) ## Variables +### CreatorFeeManagerWithRoyaltiesAbi + +• **CreatorFeeManagerWithRoyaltiesAbi**: (\{ `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "\_royaltyFeeRegistry"; `type`: `string` = "address" }[] ; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "collection"; `type`: `string` = "address" }[] ; `name`: `string` = "BundleEIP2981NotAllowed"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "collection"; `type`: `string` = "address" }[] ; `name`: `string` = "viewCreatorFeeInfo"; `outputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "creator"; `type`: `string` = "address" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:5782 + +--- + +### ExecutionManagerAbi + +• **ExecutionManagerAbi**: (\{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "\_owner"; `type`: `string` = "address" }[] ; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = "strategyId"; `type`: `string` = "uint256" }[] ; `name`: `string` = "StrategyNotAvailable"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "currency"; `type`: `string` = "address" }[] ; `name`: `string` = "CurrencyStatusUpdated"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = ""; `type`: `string` = "address" }[] ; `name`: `string` = "isCurrencyAllowed"; `outputs`: \{ `internalType`: `string` = "bool"; `name`: `string` = ""; `type`: `string` = "bool" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:6906 + +--- + ### HypercertExchangeAbi • **HypercertExchangeAbi**: (\{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "\_owner"; `type`: `string` = "address" }[] ; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = "length"; `type`: `string` = "uint256" }[] ; `name`: `string` = "MerkleProofTooLarge"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: (\{ `components`: \{ `internalType`: `string` = "bytes32"; `name`: `string` = "orderHash"; `type`: `string` = "bytes32" }[] ; `indexed`: `boolean` = false; `internalType`: `string` = "struct ILooksRareProtocol.NonceInvalidationParameters"; `name`: `string` = "nonceInvalidationParameters"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "askUser"; `type`: `string` = "address" })[] ; `name`: `string` = "TakerAsk"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: (\{ `components?`: `undefined` ; `internalType`: `string` = "bytes[]"; `name`: `string` = "makerSignatures"; `type`: `string` = "bytes[]" } \| \{ `components`: (\{ `components?`: `undefined` ; `internalType`: `string` = "bytes32"; `name`: `string` = "root"; `type`: `string` = "bytes32" } \| \{ `components`: \{ `internalType`: `string` = "bytes32"; `name`: `string` = "value"; `type`: `string` = "bytes32" }[] ; `internalType`: `string` = "struct OrderStructs.MerkleTreeNode[]"; `name`: `string` = "proof"; `type`: `string` = "tuple[]" })[] ; `internalType`: `string` = "struct OrderStructs.MerkleTree[]"; `name`: `string` = "merkleTrees"; `type`: `string` = "tuple[]" })[] ; `name`: `string` = "executeMultipleTakerBids"; `outputs`: `never`[] = []; `stateMutability`: `string` = "payable"; `type`: `string` = "function" } \| \{ `anonymous?`: `undefined` = false; `inputs`: (\{ `components`: \{ `internalType`: `string` = "address"; `name`: `string` = "recipient"; `type`: `string` = "address" }[] ; `internalType`: `string` = "struct OrderStructs.Taker"; `name`: `string` = "takerBid"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `internalType`: `string` = "address"; `name`: `string` = "sender"; `type`: `string` = "address" })[] ; `name`: `string` = "restrictedExecuteTakerBid"; `outputs`: \{ `internalType`: `string` = "uint256"; `name`: `string` = "protocolFeeAmount"; `type`: `string` = "uint256" }[] ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "function" })[] #### Defined in -node_modules/.pnpm/@hypercerts-org+contracts@1.0.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:1524 +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:1226 --- @@ -441,7 +471,97 @@ node_modules/.pnpm/@hypercerts-org+contracts@1.0.0_ts-node@10.9.1_typescript@5.3 #### Defined in -node_modules/.pnpm/@hypercerts-org+contracts@1.0.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:352 +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:35 + +--- + +### OrderValidatorV2AAbi + +• **OrderValidatorV2AAbi**: (\{ `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "\_looksRareProtocol"; `type`: `string` = "address" }[] ; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `inputs`: (\{ `components?`: `undefined` ; `internalType`: `string` = "bytes"; `name`: `string` = "signature"; `type`: `string` = "bytes" } \| \{ `components`: (\{ `components?`: `undefined` ; `internalType`: `string` = "bytes32"; `name`: `string` = "root"; `type`: `string` = "bytes32" } \| \{ `components`: \{ `internalType`: `string` = "bytes32"; `name`: `string` = "value"; `type`: `string` = "bytes32" }[] ; `internalType`: `string` = "struct OrderStructs.MerkleTreeNode[]"; `name`: `string` = "proof"; `type`: `string` = "tuple[]" })[] ; `internalType`: `string` = "struct OrderStructs.MerkleTree"; `name`: `string` = "merkleTree"; `type`: `string` = "tuple" })[] ; `name`: `string` = "checkMakerOrderValidity"; `outputs`: \{ `internalType`: `string` = "uint256[9]"; `name`: `string` = "validationCodes"; `type`: `string` = "uint256[9]" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:3071 + +--- + +### StrategyCollectionOfferAbi + +• **StrategyCollectionOfferAbi**: (\{ `inputs`: `never`[] = []; `name`: `string` = "CollectionTypeInvalid"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `inputs`: (\{ `components`: \{ `internalType`: `string` = "enum QuoteType"; `name`: `string` = "quoteType"; `type`: `string` = "uint8" }[] ; `internalType`: `string` = "struct OrderStructs.Maker"; `name`: `string` = "makerBid"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `internalType`: `string` = "bytes4"; `name`: `string` = "functionSelector"; `type`: `string` = "bytes4" })[] ; `name`: `string` = "isMakerOrderValid"; `outputs`: \{ `internalType`: `string` = "bool"; `name`: `string` = "isValid"; `type`: `string` = "bool" }[] ; `stateMutability`: `string` = "pure"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:4585 + +--- + +### StrategyDutchAuctionAbi + +• **StrategyDutchAuctionAbi**: (\{ `inputs`: `never`[] = []; `name`: `string` = "BidTooLow"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `inputs`: (\{ `components`: \{ `internalType`: `string` = "enum QuoteType"; `name`: `string` = "quoteType"; `type`: `string` = "uint8" }[] ; `internalType`: `string` = "struct OrderStructs.Maker"; `name`: `string` = "makerAsk"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `internalType`: `string` = "bytes4"; `name`: `string` = "functionSelector"; `type`: `string` = "bytes4" })[] ; `name`: `string` = "isMakerOrderValid"; `outputs`: \{ `internalType`: `string` = "bool"; `name`: `string` = "isValid"; `type`: `string` = "bool" }[] ; `stateMutability`: `string` = "pure"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:5110 + +--- + +### StrategyHypercertCollectionOfferAbi + +• **StrategyHypercertCollectionOfferAbi**: (\{ `inputs`: `never`[] = []; `name`: `string` = "CollectionTypeInvalid"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `inputs`: (\{ `components`: \{ `internalType`: `string` = "enum QuoteType"; `name`: `string` = "quoteType"; `type`: `string` = "uint8" }[] ; `internalType`: `string` = "struct OrderStructs.Maker"; `name`: `string` = "makerBid"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `internalType`: `string` = "bytes4"; `name`: `string` = "functionSelector"; `type`: `string` = "bytes4" })[] ; `name`: `string` = "isMakerOrderValid"; `outputs`: \{ `internalType`: `string` = "bool"; `name`: `string` = "isValid"; `type`: `string` = "bool" }[] ; `stateMutability`: `string` = "pure"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:5855 + +--- + +### StrategyHypercertDutchAuctionAbi + +• **StrategyHypercertDutchAuctionAbi**: (\{ `inputs`: `never`[] = []; `name`: `string` = "BidTooLow"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `inputs`: (\{ `components`: \{ `internalType`: `string` = "enum QuoteType"; `name`: `string` = "quoteType"; `type`: `string` = "uint8" }[] ; `internalType`: `string` = "struct OrderStructs.Maker"; `name`: `string` = "makerAsk"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `internalType`: `string` = "bytes4"; `name`: `string` = "functionSelector"; `type`: `string` = "bytes4" })[] ; `name`: `string` = "isMakerOrderValid"; `outputs`: \{ `internalType`: `string` = "bool"; `name`: `string` = "isValid"; `type`: `string` = "bool" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:6380 + +--- + +### StrategyHypercertFractionOfferAbi + +• **StrategyHypercertFractionOfferAbi**: (\{ `inputs`: `never`[] = []; `name`: `string` = "AmountInvalid"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `inputs`: (\{ `components`: \{ `internalType`: `string` = "enum QuoteType"; `name`: `string` = "quoteType"; `type`: `string` = "uint8" }[] ; `internalType`: `string` = "struct OrderStructs.Maker"; `name`: `string` = "makerAsk"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `internalType`: `string` = "bytes4"; `name`: `string` = "functionSelector"; `type`: `string` = "bytes4" })[] ; `name`: `string` = "isMakerOrderValid"; `outputs`: \{ `internalType`: `string` = "bool"; `name`: `string` = "isValid"; `type`: `string` = "bool" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:5379 + +--- + +### StrategyItemIdsRangeAbi + +• **StrategyItemIdsRangeAbi**: (\{ `inputs`: `never`[] = []; `name`: `string` = "OrderInvalid"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `inputs`: (\{ `components`: \{ `internalType`: `string` = "enum QuoteType"; `name`: `string` = "quoteType"; `type`: `string` = "uint8" }[] ; `internalType`: `string` = "struct OrderStructs.Maker"; `name`: `string` = "makerBid"; `type`: `string` = "tuple" } \| \{ `components?`: `undefined` ; `internalType`: `string` = "bytes4"; `name`: `string` = "functionSelector"; `type`: `string` = "bytes4" })[] ; `name`: `string` = "isMakerOrderValid"; `outputs`: \{ `internalType`: `string` = "bool"; `name`: `string` = "isValid"; `type`: `string` = "bool" }[] ; `stateMutability`: `string` = "pure"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:6649 + +--- + +### StrategyManagerAbi + +• **StrategyManagerAbi**: (\{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "\_owner"; `type`: `string` = "address" }[] ; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "NoOngoingTransferInProgress"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "currency"; `type`: `string` = "address" }[] ; `name`: `string` = "CurrencyStatusUpdated"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = ""; `type`: `string` = "address" }[] ; `name`: `string` = "isCurrencyAllowed"; `outputs`: \{ `internalType`: `string` = "bool"; `name`: `string` = ""; `type`: `string` = "bool" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:3508 + +--- + +### TransferManagerAbi + +• **TransferManagerAbi**: (\{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = "\_owner"; `type`: `string` = "address" }[] ; `name?`: `undefined` = "balanceOf"; `outputs?`: `undefined` ; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "constructor" } \| \{ `anonymous?`: `undefined` = false; `inputs`: `never`[] = []; `name`: `string` = "AmountInvalid"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "error" } \| \{ `anonymous`: `boolean` = false; `inputs`: \{ `indexed`: `boolean` = false; `internalType`: `string` = "address"; `name`: `string` = "user"; `type`: `string` = "address" }[] ; `name`: `string` = "ApprovalsGranted"; `outputs?`: `undefined` ; `stateMutability?`: `undefined` = "view"; `type`: `string` = "event" } \| \{ `anonymous?`: `undefined` = false; `inputs`: \{ `internalType`: `string` = "address"; `name`: `string` = ""; `type`: `string` = "address" }[] ; `name`: `string` = "hasUserApprovedOperator"; `outputs`: \{ `internalType`: `string` = "bool"; `name`: `string` = ""; `type`: `string` = "bool" }[] ; `stateMutability`: `string` = "view"; `type`: `string` = "function" } \| \{ `anonymous?`: `undefined` = false; `inputs`: (\{ `components`: \{ `internalType`: `string` = "address"; `name`: `string` = "collection"; `type`: `string` = "address" }[] ; `internalType`: `string` = "struct ITransferManager.BatchTransferItem[]"; `name`: `string` = "items"; `type`: `string` = "tuple[]" } \| \{ `components?`: `undefined` ; `internalType`: `string` = "address"; `name`: `string` = "from"; `type`: `string` = "address" })[] ; `name`: `string` = "transferBatchItemsAcrossCollections"; `outputs`: `never`[] = []; `stateMutability`: `string` = "nonpayable"; `type`: `string` = "function" })[] + +#### Defined in + +node_modules/.pnpm/@hypercerts-org+contracts@1.1.0_ts-node@10.9.1_typescript@5.3.2/node_modules/@hypercerts-org/contracts/dist/index.d.ts:3974 --- @@ -461,9 +581,9 @@ Represents the possible transfer restrictions of a claim matching the hypercerts #### Defined in -[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/hypercerts.ts#L9) +[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/hypercerts.ts#L9) -[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/types/hypercerts.ts#L15) +[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/hypercerts.ts#L15) --- @@ -477,7 +597,7 @@ Represents the possible transfer restrictions of a claim matching the hypercerts #### Defined in -[sdk/src/constants.ts:11](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/constants.ts#L11) +[sdk/src/constants.ts:12](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/constants.ts#L12) --- @@ -487,7 +607,7 @@ Represents the possible transfer restrictions of a claim matching the hypercerts #### Defined in -[sdk/src/constants.ts:17](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/constants.ts#L17) +[sdk/src/constants.ts:18](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/constants.ts#L18) --- @@ -506,7 +626,7 @@ Represents the possible transfer restrictions of a claim matching the hypercerts #### Defined in -[sdk/src/utils/logger.ts:24](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/utils/logger.ts#L24) +[sdk/src/utils/logger.ts:24](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/logger.ts#L24) ## Functions @@ -545,7 +665,95 @@ Formats input data to an object containing HypercertMetadata including appropria #### Defined in -[sdk/src/utils/formatter.ts:27](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/utils/formatter.ts#L27) +[sdk/src/utils/formatter.ts:27](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/formatter.ts#L27) + +--- + +### getClaimStoredDataFromTxHash + +▸ **getClaimStoredDataFromTxHash**(`client`, `hash`): `Promise`<`ParserReturnType`\> + +Utility method to parse a hypercert mint transaction (createAllowlist, mintClaim) and get the ID of the minted claim + +#### Parameters + +| Name | Type | Description | +| :-------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `client` | `Object` | public client provided by viem | +| `client.account` | `undefined` | The Account of the Client. | +| `client.batch?` | `Object` | Flags for batch settings. | +| `client.batch.multicall?` | `boolean` \| \{ batchSize?: number \| undefined; wait?: number \| undefined; } | Toggle to enable `eth_call` multicall aggregation. | +| `client.cacheTime` | `number` | Time (in ms) that cached data will remain in memory. | +| `client.call` | (`parameters`: `CallParameters`<`undefined` \| `Chain`\>) => `Promise`<`CallReturnType`\> | Executes a new message call immediately without submitting a transaction to the network. - Docs: https://viem.sh/docs/actions/public/call.html - JSON-RPC Methods: [`eth_call`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const data = await client.call({ account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', }) ` | +| `client.chain` | `undefined` \| `Chain` | Chain for the client. | +| `client.createBlockFilter` | () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"block"` }\> | Creates a Filter to listen for new block hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createBlockFilter.html - JSON-RPC Methods: [`eth_newBlockFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newBlockFilter) **`Example`** `ts import { createPublicClient, createBlockFilter, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await createBlockFilter(client) // { id: "0x345a6572337856574a76364e457a4366", type: 'block' } ` | +| `client.createContractEventFilter` | (`args`: `CreateContractEventFilterParameters`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`CreateContractEventFilterReturnType`<`TAbi`, `TEventName`, `TArgs`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Creates a Filter to retrieve event logs that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html) or [`getFilterLogs`](https://viem.sh/docs/actions/public/getFilterLogs.html). - Docs: https://viem.sh/docs/contract/createContractEventFilter.html **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createContractEventFilter({ abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']), }) ` | +| `client.createEventFilter` | (`args?`: `CreateEventFilterParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`, `_EventName`, `_Args`\>) => `Promise`<\{ [K in keyof Filter<"event", TAbiEvents, \_EventName, \_Args, TStrict, TFromBlock, TToBlock\>]: Filter<"event", TAbiEvents, ... 4 more ..., TToBlock\>[K]; }\> | Creates a [`Filter`](https://viem.sh/docs/glossary/types.html#filter) to listen for new events that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createEventFilter.html - JSON-RPC Methods: [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2', }) ` | +| `client.createPendingTransactionFilter` | () => `Promise`<\{ `id`: \`0x$\{string}\` ; `request`: `EIP1193RequestFn` ; `type`: `"transaction"` }\> | Creates a Filter to listen for new pending transaction hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges.html). - Docs: https://viem.sh/docs/actions/public/createPendingTransactionFilter.html - JSON-RPC Methods: [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createPendingTransactionFilter() // { id: "0x345a6572337856574a76364e457a4366", type: 'transaction' } ` | +| `client.estimateContractGas` | (`args`: `EstimateContractGasParameters`<`TAbi`, `TFunctionName`, `TChain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> | Estimates the gas required to successfully execute a contract write function call. - Docs: https://viem.sh/docs/contract/estimateContractGas.html **`Remarks`** Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`estimateGas` action](https://viem.sh/docs/actions/public/estimateGas.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gas = await client.estimateContractGas({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint() public']), functionName: 'mint', account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', }) ` | +| `client.estimateFeesPerGas` | (`args?`: `EstimateFeesPerGasParameters`<`undefined` \| `Chain`, `TChainOverride`, `TType`\>) => `Promise`<`EstimateFeesPerGasReturnType`\> | Returns an estimate for the fees per gas for a transaction to be included in the next block. - Docs: https://viem.sh/docs/actions/public/estimateFeesPerGas.html **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const maxPriorityFeePerGas = await client.estimateFeesPerGas() // { maxFeePerGas: ..., maxPriorityFeePerGas: ... } ` | +| `client.estimateGas` | (`args`: `EstimateGasParameters`<`undefined` \| `Chain`, `undefined` \| `Account`\>) => `Promise`<`bigint`\> | Estimates the gas necessary to complete a transaction without submitting it to the network. - Docs: https://viem.sh/docs/actions/public/estimateGas.html - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas) **`Example`** `ts import { createPublicClient, http, parseEther } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gasEstimate = await client.estimateGas({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: parseEther('1'), }) ` | +| `client.estimateMaxPriorityFeePerGas` | (`args?`: \{ `chain`: `null` \| `TChainOverride` }) => `Promise`<`bigint`\> | Returns an estimate for the max priority fee per gas (in wei) for a transaction to be included in the next block. - Docs: https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas.html **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const maxPriorityFeePerGas = await client.estimateMaxPriorityFeePerGas() // 10000000n ` | +| `client.extend` | (`fn`: (`client`: `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, `PublicActions`<`Transport`, `undefined` \| `Chain`\>\>) => `client`) => `Client`<`Transport`, `undefined` \| `Chain`, `undefined`, `PublicRpcSchema`, \{ [K in keyof client]: client[K]; } & `PublicActions`<`Transport`, `undefined` \| `Chain`\>\> | - | +| `client.getBalance` | (`args`: `GetBalanceParameters`) => `Promise`<`bigint`\> | Returns the balance of an address in wei. - Docs: https://viem.sh/docs/actions/public/getBalance.html - JSON-RPC Methods: [`eth_getBalance`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance) **`Remarks`** You can convert the balance to ether units with [`formatEther`](https://viem.sh/docs/utilities/formatEther.html). `ts const balance = await getBalance(client, { address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', blockTag: 'safe' }) const balanceAsEther = formatEther(balance) // "6.942" ` **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const balance = await client.getBalance({ address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) // 10000000000000000000000n (wei) ` | +| `client.getBlock` | (`args?`: `GetBlockParameters`<`TIncludeTransactions`, `TBlockTag`\>) => `Promise`<`GetBlockReturnType`<`undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>\> | Returns information about a block at a block number, hash, or tag. - Docs: https://viem.sh/docs/actions/public/getBlock.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks/fetching-blocks - JSON-RPC Methods: - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) for `blockNumber` & `blockTag`. - Calls [`eth_getBlockByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbyhash) for `blockHash`. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const block = await client.getBlock() ` | +| `client.getBlockNumber` | (`args?`: `GetBlockNumberParameters`) => `Promise`<`bigint`\> | Returns the number of the most recent block seen. - Docs: https://viem.sh/docs/actions/public/getBlockNumber.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks/fetching-blocks - JSON-RPC Methods: [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const blockNumber = await client.getBlockNumber() // 69420n ` | +| `client.getBlockTransactionCount` | (`args?`: `GetBlockTransactionCountParameters`) => `Promise`<`number`\> | Returns the number of Transactions at a block number, hash, or tag. - Docs: https://viem.sh/docs/actions/public/getBlockTransactionCount.html - JSON-RPC Methods: - Calls [`eth_getBlockTransactionCountByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbynumber) for `blockNumber` & `blockTag`. - Calls [`eth_getBlockTransactionCountByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbyhash) for `blockHash`. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const count = await client.getBlockTransactionCount() ` | +| `client.getBytecode` | (`args`: `GetBytecodeParameters`) => `Promise`<`GetBytecodeReturnType`\> | Retrieves the bytecode at an address. - Docs: https://viem.sh/docs/contract/getBytecode.html - JSON-RPC Methods: [`eth_getCode`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getcode) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const code = await client.getBytecode({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', }) ` | +| `client.getChainId` | () => `Promise`<`number`\> | Returns the chain ID associated with the current network. - Docs: https://viem.sh/docs/actions/public/getChainId.html - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const chainId = await client.getChainId() // 1 ` | +| `client.getContractEvents` | (`args`: `GetContractEventsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetContractEventsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs emitted by a contract. - Docs: https://viem.sh/docs/actions/public/getContractEvents.html - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { wagmiAbi } from './abi' const client = createPublicClient({ chain: mainnet, transport: http(), }) const logs = await client.getContractEvents(client, { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: wagmiAbi, eventName: 'Transfer' }) ` | +| `client.getEnsAddress` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; coinType?: number \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsAddressReturnType`\> | Gets address for ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsAddress.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens **`Remarks`** Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensAddress = await client.getEnsAddress({ name: normalize('wevm.eth'), }) // '0xd2135CfB216b74109775236E36d4b433F1DF507B' ` | +| `client.getEnsAvatar` | (`args`: \{ name: string; blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; universalResolverAddress?: \`0x$\{string}\` \| undefined; gatewayUrls?: AssetGatewayUrls \| undefined; }) => `Promise`<`GetEnsAvatarReturnType`\> | Gets the avatar of an ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsAvatar.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens **`Remarks`** Calls [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText.html) with `key` set to `'avatar'`. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensAvatar = await client.getEnsAvatar({ name: normalize('wevm.eth'), }) // 'https://ipfs.io/ipfs/Qma8mnp6xV3J2cRNf3mTth5C8nV11CAnceVinc3y8jSbio' ` | +| `client.getEnsName` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; address: \`0x$\{string}\`; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsNameReturnType`\> | Gets primary name for specified address. - Docs: https://viem.sh/docs/ens/actions/getEnsName.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens **`Remarks`** Calls `reverse(bytes)` on ENS Universal Resolver Contract to "reverse resolve" the address to the primary ENS name. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const ensName = await client.getEnsName({ address: '0xd2135CfB216b74109775236E36d4b433F1DF507B', }) // 'wevm.eth' ` | +| `client.getEnsResolver` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<\`0x$\{string}\`\> | Gets resolver for ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsResolver.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens **`Remarks`** Calls `findResolver(bytes)` on ENS Universal Resolver Contract to retrieve the resolver of an ENS name. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const resolverAddress = await client.getEnsResolver({ name: normalize('wevm.eth'), }) // '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41' ` | +| `client.getEnsText` | (`args`: \{ blockNumber?: bigint \| undefined; blockTag?: BlockTag \| undefined; name: string; key: string; universalResolverAddress?: \`0x$\{string}\` \| undefined; }) => `Promise`<`GetEnsTextReturnType`\> | Gets a text record for specified ENS name. - Docs: https://viem.sh/docs/ens/actions/getEnsResolver.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens **`Remarks`** Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract. Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function for this. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { normalize } from 'viem/ens' const client = createPublicClient({ chain: mainnet, transport: http(), }) const twitterRecord = await client.getEnsText({ name: normalize('wevm.eth'), key: 'com.twitter', }) // 'wagmi_sh' ` | +| `client.getFeeHistory` | (`args`: `GetFeeHistoryParameters`) => `Promise`<`GetFeeHistoryReturnType`\> | Returns a collection of historical gas information. - Docs: https://viem.sh/docs/actions/public/getFeeHistory.html - JSON-RPC Methods: [`eth_feeHistory`](https://docs.alchemy.com/reference/eth-feehistory) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const feeHistory = await client.getFeeHistory({ blockCount: 4, rewardPercentiles: [25, 75], }) ` | +| `client.getFilterChanges` | (`args`: `GetFilterChangesParameters`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterChangesReturnType`<`TFilterType`, `TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of logs or hashes based on a [Filter](/docs/glossary/terms#filter) since the last time it was called. - Docs: https://viem.sh/docs/actions/public/getFilterChanges.html - JSON-RPC Methods: [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges) **`Remarks`** A Filter can be created from the following actions: - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter.html) - [`createContractEventFilter`](https://viem.sh/docs/contract/createContractEventFilter.html) - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter.html) - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter.html) Depending on the type of filter, the return value will be different: - If the filter was created with `createContractEventFilter` or `createEventFilter`, it returns a list of logs. - If the filter was created with `createPendingTransactionFilter`, it returns a list of transaction hashes. - If the filter was created with `createBlockFilter`, it returns a list of block hashes. **`Example`** `ts // Blocks import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createBlockFilter() const hashes = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Contract Events import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createContractEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']), eventName: 'Transfer', }) const logs = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Raw Events import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'), }) const logs = await client.getFilterChanges({ filter }) ` **`Example`** `ts // Transactions import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createPendingTransactionFilter() const hashes = await client.getFilterChanges({ filter }) ` | +| `client.getFilterLogs` | (`args`: `GetFilterLogsParameters`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetFilterLogsReturnType`<`TAbi`, `TEventName`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs since the filter was created. - Docs: https://viem.sh/docs/actions/public/getFilterLogs.html - JSON-RPC Methods: [`eth_getFilterLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterlogs) **`Remarks`** `getFilterLogs` is only compatible with **event filters**. **`Example`** `ts import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const filter = await client.createEventFilter({ address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'), }) const logs = await client.getFilterLogs({ filter }) ` | +| `client.getGasPrice` | () => `Promise`<`bigint`\> | Returns the current price of gas (in wei). - Docs: https://viem.sh/docs/actions/public/getGasPrice.html - JSON-RPC Methods: [`eth_gasPrice`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gasprice) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const gasPrice = await client.getGasPrice() ` | +| `client.getLogs` | (`args?`: `GetLogsParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>) => `Promise`<`GetLogsReturnType`<`TAbiEvent`, `TAbiEvents`, `TStrict`, `TFromBlock`, `TToBlock`\>\> | Returns a list of event logs matching the provided parameters. - Docs: https://viem.sh/docs/actions/public/getLogs.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/filters-and-logs/event-logs - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) **`Example`** `ts import { createPublicClient, http, parseAbiItem } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const logs = await client.getLogs() ` | +| `client.getProof` | (`args`: `GetProofParameters`) => `Promise`<`GetProofReturnType`\> | Returns the account and storage values of the specified account including the Merkle-proof. - Docs: https://viem.sh/docs/actions/public/getProof.html - JSON-RPC Methods: - Calls [`eth_getProof`](https://eips.ethereum.org/EIPS/eip-1186) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const block = await client.getProof({ address: '0x...', storageKeys: ['0x...'], }) ` | +| `client.getStorageAt` | (`args`: `GetStorageAtParameters`) => `Promise`<`GetStorageAtReturnType`\> | Returns the value from a storage slot at a given address. - Docs: https://viem.sh/docs/contract/getStorageAt.html - JSON-RPC Methods: [`eth_getStorageAt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { getStorageAt } from 'viem/contract' const client = createPublicClient({ chain: mainnet, transport: http(), }) const code = await client.getStorageAt({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', slot: toHex(0), }) ` | +| `client.getTransaction` | (`args`: `GetTransactionParameters`<`TBlockTag`\>) => `Promise`<`GetTransactionReturnType`<`undefined` \| `Chain`, `TBlockTag`\>\> | Returns information about a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) given a hash or block identifier. - Docs: https://viem.sh/docs/actions/public/getTransaction.html - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionByHash) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transaction = await client.getTransaction({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `client.getTransactionConfirmations` | (`args`: `GetTransactionConfirmationsParameters`<`undefined` \| `Chain`\>) => `Promise`<`bigint`\> | Returns the number of blocks passed (confirmations) since the transaction was processed on a block. - Docs: https://viem.sh/docs/actions/public/getTransactionConfirmations.html - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionConfirmations`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionConfirmations) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const confirmations = await client.getTransactionConfirmations({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `client.getTransactionCount` | (`args`: `GetTransactionCountParameters`) => `Promise`<`number`\> | Returns the number of [Transactions](https://viem.sh/docs/glossary/terms.html#transaction) an Account has broadcast / sent. - Docs: https://viem.sh/docs/actions/public/getTransactionCount.html - JSON-RPC Methods: [`eth_getTransactionCount`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactioncount) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionCount = await client.getTransactionCount({ address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) ` | +| `client.getTransactionReceipt` | (`args`: `GetTransactionReceiptParameters`) => `Promise`<`TransactionReceipt`\> | Returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) hash. - Docs: https://viem.sh/docs/actions/public/getTransactionReceipt.html - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions/fetching-transactions - JSON-RPC Methods: [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionReceipt = await client.getTransactionReceipt({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `client.key` | `string` | A key for the client. | +| `client.multicall` | (`args`: `MulticallParameters`<`TContracts`, `TAllowFailure`\>) => `Promise`<`MulticallReturnType`<`TContracts`, `TAllowFailure`\>\> | Similar to [`readContract`](https://viem.sh/docs/contract/readContract.html), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall). - Docs: https://viem.sh/docs/contract/multicall.html **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const abi = parseAbi([ 'function balanceOf(address) view returns (uint256)', 'function totalSupply() view returns (uint256)', ]) const result = await client.multicall({ contracts: [ { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi, functionName: 'balanceOf', args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'], }, { address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi, functionName: 'totalSupply', }, ], }) // [{ result: 424122n, status: 'success' }, { result: 1000000n, status: 'success' }] ` | +| `client.name` | `string` | A name for the client. | +| `client.pollingInterval` | `number` | Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. | +| `client.prepareTransactionRequest` | (`args`: `PrepareTransactionRequestParameters`<`undefined` \| `Chain`, `undefined` \| `Account`, `TChainOverride`\>) => `Promise`<`PrepareTransactionRequestReturnType`\> | Prepares a transaction request for signing. - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest.html **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` **`Example`** `ts // Account Hoisting import { createWalletClient, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' const client = createWalletClient({ account: privateKeyToAccount('0x…'), chain: mainnet, transport: custom(window.ethereum), }) const request = await client.prepareTransactionRequest({ to: '0x0000000000000000000000000000000000000000', value: 1n, }) ` | +| `client.readContract` | (`args`: `ReadContractParameters`<`TAbi`, `TFunctionName`\>) => `Promise`<`ReadContractReturnType`<`TAbi`, `TFunctionName`\>\> | Calls a read-only function on a contract, and returns the response. - Docs: https://viem.sh/docs/contract/readContract.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts/reading-contracts **`Remarks`** A "read-only" function (constant function) on a Solidity contract is denoted by a `view` or `pure` keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas. Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' import { readContract } from 'viem/contract' const client = createPublicClient({ chain: mainnet, transport: http(), }) const result = await client.readContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function balanceOf(address) view returns (uint256)']), functionName: 'balanceOf', args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'], }) // 424122n ` | +| `client.request` | `EIP1193RequestFn`<`PublicRpcSchema`\> | Request function wrapped with friendly error handling | +| `client.sendRawTransaction` | (`args`: `SendRawTransactionParameters`) => `Promise`<\`0x$\{string}\`\> | Sends a **signed** transaction to the network - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction.html - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/) **`Example`** `ts import { createWalletClient, custom } from 'viem' import { mainnet } from 'viem/chains' import { sendRawTransaction } from 'viem/wallet' const client = createWalletClient({ chain: mainnet, transport: custom(window.ethereum), }) const hash = await client.sendRawTransaction({ serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33' }) ` | +| `client.simulateContract` | (`args`: `SimulateContractParameters`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>) => `Promise`<`SimulateContractReturnType`<`TAbi`, `TFunctionName`, `undefined` \| `Chain`, `TChainOverride`\>\> | Simulates/validates a contract interaction. This is useful for retrieving **return data** and **revert reasons** of contract write functions. - Docs: https://viem.sh/docs/contract/simulateContract.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts/writing-to-contracts **`Remarks`** This function does not require gas to execute and _**does not**_ change the state of the blockchain. It is almost identical to [`readContract`](https://viem.sh/docs/contract/readContract.html), but also supports contract write functions. Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html). **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const result = await client.simulateContract({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['function mint(uint32) view returns (uint32)']), functionName: 'mint', args: ['69420'], account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', }) ` | +| `client.transport` | `TransportConfig`<`string`, `EIP1193RequestFn`\> & `Record`<`string`, `any`\> | The RPC transport | +| `client.type` | `string` | The type of client. | +| `client.uid` | `string` | A unique ID for the client. | +| `client.uninstallFilter` | (`args`: `UninstallFilterParameters`) => `Promise`<`boolean`\> | Destroys a Filter that was created from one of the following Actions: - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter.html) - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter.html) - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter.html) - Docs: https://viem.sh/docs/actions/public/uninstallFilter.html - JSON-RPC Methods: [`eth_uninstallFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_uninstallFilter) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' import { createPendingTransactionFilter, uninstallFilter } from 'viem/public' const filter = await client.createPendingTransactionFilter() const uninstalled = await client.uninstallFilter({ filter }) // true ` | +| `client.verifyMessage` | (`args`: `VerifyMessageParameters`) => `Promise`<`boolean`\> | - | +| `client.verifyTypedData` | (`args`: `VerifyTypedDataParameters`) => `Promise`<`boolean`\> | - | +| `client.waitForTransactionReceipt` | (`args`: `WaitForTransactionReceiptParameters`<`undefined` \| `Chain`\>) => `Promise`<`TransactionReceipt`\> | Waits for the [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) to be included on a [Block](https://viem.sh/docs/glossary/terms.html#block) (one confirmation), and then returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt). If the Transaction reverts, then the action will throw an error. - Docs: https://viem.sh/docs/actions/public/waitForTransactionReceipt.html - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions/sending-transactions - JSON-RPC Methods: - Polls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) on each block until it has been processed. - If a Transaction has been replaced: - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) and extracts the transactions - Checks if one of the Transactions is a replacement - If so, calls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt). **`Remarks`** The `waitForTransactionReceipt` action additionally supports Replacement detection (e.g. sped up Transactions). Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel). Transactions are replaced when they are sent from the same nonce. There are 3 types of Transaction Replacement reasons: - `repriced`: The gas price has been modified (e.g. different `maxFeePerGas`) - `cancelled`: The Transaction has been cancelled (e.g. `value === 0n`) - `replaced`: The Transaction has been replaced (e.g. different `value` or `data`) **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const transactionReceipt = await client.waitForTransactionReceipt({ hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', }) ` | +| `client.watchBlockNumber` | (`args`: `WatchBlockNumberParameters`) => `WatchBlockNumberReturnType` | Watches and returns incoming block numbers. - Docs: https://viem.sh/docs/actions/public/watchBlockNumber.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks/watching-blocks - JSON-RPC Methods: - When `poll: true`, calls [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchBlockNumber({ onBlockNumber: (blockNumber) => console.log(blockNumber), }) ` | +| `client.watchBlocks` | (`args`: `WatchBlocksParameters`<`Transport`, `undefined` \| `Chain`, `TIncludeTransactions`, `TBlockTag`\>) => `WatchBlocksReturnType` | Watches and returns information for incoming blocks. - Docs: https://viem.sh/docs/actions/public/watchBlocks.html - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks/watching-blocks - JSON-RPC Methods: - When `poll: true`, calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getBlockByNumber) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchBlocks({ onBlock: (block) => console.log(block), }) ` | +| `client.watchContractEvent` | (`args`: `WatchContractEventParameters`<`TAbi`, `TEventName`, `TStrict`\>) => `WatchContractEventReturnType` | Watches and returns emitted contract event logs. - Docs: https://viem.sh/docs/contract/watchContractEvent.html **`Remarks`** This Action will batch up all the event logs found within the [`pollingInterval`](https://viem.sh/docs/contract/watchContractEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/contract/watchContractEvent.html#onLogs). `watchContractEvent` will attempt to create an [Event Filter](https://viem.sh/docs/contract/createContractEventFilter.html) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchContractEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs.html) instead. **`Example`** `ts import { createPublicClient, http, parseAbi } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = client.watchContractEvent({ address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', abi: parseAbi(['event Transfer(address indexed from, address indexed to, uint256 value)']), eventName: 'Transfer', args: { from: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b' }, onLogs: (logs) => console.log(logs), }) ` | +| `client.watchEvent` | (`args`: `WatchEventParameters`<`TAbiEvent`, `TAbiEvents`, `TStrict`\>) => `WatchEventReturnType` | Watches and returns emitted [Event Logs](https://viem.sh/docs/glossary/terms.html#event-log). - Docs: https://viem.sh/docs/actions/public/watchEvent.html - JSON-RPC Methods: - **RPC Provider supports `eth_newFilter`:** - Calls [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) to create a filter (called on initialize). - On a polling interval, it will call [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges). - **RPC Provider does not support `eth_newFilter`:** - Calls [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) for each block between the polling interval. **`Remarks`** This Action will batch up all the Event Logs found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/actions/public/watchEvent.html#onLogs). `watchEvent` will attempt to create an [Event Filter](https://viem.sh/docs/actions/public/createEventFilter.html) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs.html) instead. **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = client.watchEvent({ onLogs: (logs) => console.log(logs), }) ` | +| `client.watchPendingTransactions` | (`args`: `WatchPendingTransactionsParameters`<`Transport`\>) => `WatchPendingTransactionsReturnType` | Watches and returns pending transaction hashes. - Docs: https://viem.sh/docs/actions/public/watchPendingTransactions.html - JSON-RPC Methods: - When `poll: true` - Calls [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) to initialize the filter. - Calls [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getFilterChanges) on a polling interval. - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newPendingTransactions"` event. **`Remarks`** This Action will batch up all the pending transactions found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchPendingTransactions.html#pollinginterval-optional), and invoke them via [`onTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions.html#ontransactions). **`Example`** `ts import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(), }) const unwatch = await client.watchPendingTransactions({ onTransactions: (hashes) => console.log(hashes), }) ` | +| `hash` | \`0x$\{string}\` | transaction hash returned from the transaction | + +#### Returns + +`Promise`<`ParserReturnType`\> + +returns a promise with the parsed data or errors + +**`Notice`** + +This method is a wrapper around basic viem utilties to parse ClaimStored(uint256 indexed claimID, string uri, uint256 totalUnits). + +#### Defined in + +[sdk/src/utils/txParser.ts:26](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/txParser.ts#L26) --- @@ -579,7 +787,7 @@ Will throw a `StoragjeError` if the data cannot be fetched from either gateway. #### Defined in -[sdk/src/utils/fetchers.ts:17](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/utils/fetchers.ts#L17) +[sdk/src/utils/fetchers.ts:17](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/fetchers.ts#L17) --- @@ -614,7 +822,7 @@ Will throw an error if the Merkle tree cannot be fetched. #### Defined in -[sdk/src/utils/allowlist.ts:43](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/utils/allowlist.ts#L43) +[sdk/src/utils/allowlist.ts:43](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/allowlist.ts#L43) --- @@ -653,7 +861,7 @@ Please regenerate the types. #### Defined in -[sdk/src/indexer/gql/gql.ts:32](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/gql.ts#L32) +[sdk/src/indexer/gql/gql.ts:34](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/gql.ts#L34) ▸ **graphql**(`source`): typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}"``] @@ -671,7 +879,7 @@ typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: #### Defined in -[sdk/src/indexer/gql/gql.ts:37](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/gql.ts#L37) +[sdk/src/indexer/gql/gql.ts:39](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/gql.ts#L39) ▸ **graphql**(`source`): typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}"``] @@ -689,7 +897,7 @@ typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirec #### Defined in -[sdk/src/indexer/gql/gql.ts:41](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/gql.ts#L41) +[sdk/src/indexer/gql/gql.ts:45](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/gql.ts#L45) --- @@ -709,7 +917,7 @@ typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirec #### Defined in -[sdk/src/utils/errors.ts:39](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/utils/errors.ts#L39) +[sdk/src/utils/errors.ts:39](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/errors.ts#L39) --- @@ -731,7 +939,7 @@ Method to catch errors and log them #### Defined in -[sdk/src/utils/errors.ts:22](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/utils/errors.ts#L22) +[sdk/src/utils/errors.ts:22](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/errors.ts#L22) --- @@ -760,7 +968,7 @@ data is [TFrag] extends [Object] ? TKey extends string ? Object : never : never #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:51](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/fragment-masking.ts#L51) +[sdk/src/indexer/gql/fragment-masking.ts:51](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L51) --- @@ -788,7 +996,7 @@ data is [TFrag] extends [Object] ? TKey extends string ? Object : never : never #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:45](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/fragment-masking.ts#L45) +[sdk/src/indexer/gql/fragment-masking.ts:45](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L45) --- @@ -808,7 +1016,7 @@ data is [TFrag] extends [Object] ? TKey extends string ? Object : never : never #### Defined in -[sdk/src/utils/allowlist.ts:6](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/utils/allowlist.ts#L6) +[sdk/src/utils/allowlist.ts:6](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/allowlist.ts#L6) --- @@ -898,13 +1106,13 @@ An ethers.js `Provider` instance, or `undefined` if no chain is found in the `Pu #### Defined in -[sdk/src/utils/adapters.ts:19](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/utils/adapters.ts#L19) +[sdk/src/utils/adapters.ts:19](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/adapters.ts#L19) --- ### uploadAllowlist -▸ **uploadAllowlist**(`req`): `Promise`<`ResponseData`\> +▸ **uploadAllowlist**(`req`): `Promise`<`ResponseData`<\{ `cid`: `string` }\>\> Uploads an allowlist to the API. @@ -916,19 +1124,19 @@ Uploads an allowlist to the API. #### Returns -`Promise`<`ResponseData`\> +`Promise`<`ResponseData`<\{ `cid`: `string` }\>\> The response data from the API. #### Defined in -[sdk/src/utils/apis.ts:48](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/utils/apis.ts#L48) +[sdk/src/utils/apis.ts:49](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/apis.ts#L49) --- ### uploadMetadata -▸ **uploadMetadata**(`metadata`): `Promise`<`ResponseData`\> +▸ **uploadMetadata**(`metadata`): `Promise`<`ResponseData`<\{ `cid`: `string` }\>\> Uploads metadata to the API. @@ -940,13 +1148,13 @@ Uploads metadata to the API. #### Returns -`Promise`<`ResponseData`\> +`Promise`<`ResponseData`<\{ `cid`: `string` }\>\> The response data from the API. #### Defined in -[sdk/src/utils/apis.ts:32](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/utils/apis.ts#L32) +[sdk/src/utils/apis.ts:33](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/apis.ts#L33) --- @@ -973,7 +1181,7 @@ The response data from the API. #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:18](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/fragment-masking.ts#L18) +[sdk/src/indexer/gql/fragment-masking.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L15) ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `TType` \| `null` \| `undefined` @@ -996,7 +1204,7 @@ The response data from the API. #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:23](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/fragment-masking.ts#L23) +[sdk/src/indexer/gql/fragment-masking.ts:20](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L20) ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> @@ -1019,7 +1227,7 @@ The response data from the API. #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:28](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/fragment-masking.ts#L28) +[sdk/src/indexer/gql/fragment-masking.ts:25](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L25) ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> \| `null` \| `undefined` @@ -1042,7 +1250,7 @@ The response data from the API. #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:33](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/indexer/gql/fragment-masking.ts#L33) +[sdk/src/indexer/gql/fragment-masking.ts:30](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L30) --- @@ -1070,7 +1278,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -[sdk/src/validator/index.ts:108](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/validator/index.ts#L108) +[sdk/src/validator/index.ts:108](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L108) --- @@ -1098,7 +1306,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -[sdk/src/validator/index.ts:77](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/validator/index.ts#L77) +[sdk/src/validator/index.ts:77](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L77) --- @@ -1126,7 +1334,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -[sdk/src/validator/index.ts:143](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/validator/index.ts#L143) +[sdk/src/validator/index.ts:143](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L143) --- @@ -1154,7 +1362,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -[sdk/src/validator/index.ts:46](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/validator/index.ts#L46) +[sdk/src/validator/index.ts:46](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L46) --- @@ -1182,7 +1390,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -[sdk/src/validator/index.ts:173](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/validator/index.ts#L173) +[sdk/src/validator/index.ts:173](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L173) --- @@ -1214,7 +1422,7 @@ Will throw a `MintingError` if the signer address is invalid or if the Merkle pr #### Defined in -[sdk/src/validator/index.ts:205](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/validator/index.ts#L205) +[sdk/src/validator/index.ts:205](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L205) --- @@ -1246,7 +1454,7 @@ Will throw a `MintingError` if the lengths of the input arrays are not equal or #### Defined in -[sdk/src/validator/index.ts:228](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/validator/index.ts#L228) +[sdk/src/validator/index.ts:228](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L228) --- @@ -1305,4 +1513,4 @@ An ethers.js `Signer` instance, or `undefined` if no chain is found in the `Wall #### Defined in -[sdk/src/utils/adapters.ts:51](https://github.com/hypercerts-org/hypercerts/blob/ceaeca8/sdk/src/utils/adapters.ts#L51) +[sdk/src/utils/adapters.ts:51](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/adapters.ts#L51) diff --git a/frontend/package.json b/frontend/package.json index 9e4e4a49..385ac6e3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -66,7 +66,7 @@ "react-toastify": "^9.1.1", "react-use": "^17.4.0", "serve": "^14.0.1", - "viem": "1.19.15", + "viem": "1.21.4", "wagmi": "1.4.12", "yup": "^0.32.11" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28bdddad..2c60649a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -334,7 +334,7 @@ importers: version: 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@celo/rainbowkit-celo': specifier: ^1.1.2 - version: 1.1.2(@rainbow-me/rainbowkit@1.3.1)(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(wagmi@1.4.12)(zod@3.22.4) + version: 1.1.2(@rainbow-me/rainbowkit@1.3.1)(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.21.4)(wagmi@1.4.12)(zod@3.22.4) '@emotion/react': specifier: ^11.10.5 version: 11.11.1(@types/react@18.2.33)(react@18.2.0) @@ -379,7 +379,7 @@ importers: version: 1.0.345(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) '@rainbow-me/rainbowkit': specifier: 1.3.1 - version: 1.3.1(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.15)(wagmi@1.4.12) + version: 1.3.1(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.21.4)(wagmi@1.4.12) '@sentry/nextjs': specifier: ^7.73.0 version: 7.75.1(next@13.5.6)(react@18.2.0)(webpack@5.89.0) @@ -474,11 +474,11 @@ importers: specifier: ^14.0.1 version: 14.2.1 viem: - specifier: 1.19.15 - version: 1.19.15(typescript@5.1.6)(zod@3.22.4) + specifier: 1.21.4 + version: 1.21.4(typescript@5.1.6)(zod@3.22.4) wagmi: specifier: 1.4.12 - version: 1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) + version: 1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.21.4)(zod@3.22.4) yup: specifier: ^0.32.11 version: 0.32.11 @@ -2577,7 +2577,7 @@ packages: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} dev: false - /@celo/rainbowkit-celo@1.1.2(@rainbow-me/rainbowkit@1.3.1)(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(wagmi@1.4.12)(zod@3.22.4): + /@celo/rainbowkit-celo@1.1.2(@rainbow-me/rainbowkit@1.3.1)(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.21.4)(wagmi@1.4.12)(zod@3.22.4): resolution: {integrity: sha512-g5JyhRscwc7OMtBA7Huos8tgwwfhGEKiMZWTzG5K0Lcan5N9as02CtN8v2F+plQQ7v2IRROTmDw0O1xRjQF4GQ==} peerDependencies: '@rainbow-me/rainbowkit': '>=1.0.2 && <=2.0.0' @@ -2585,10 +2585,10 @@ packages: wagmi: '>=1.4.12 && <=2.0.0' dependencies: '@metamask/providers': 11.1.2 - '@rainbow-me/rainbowkit': 1.3.1(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.15)(wagmi@1.4.12) - '@wagmi/connectors': 3.1.10(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) - viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) + '@rainbow-me/rainbowkit': 1.3.1(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.21.4)(wagmi@1.4.12) + '@wagmi/connectors': 3.1.10(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.21.4)(zod@3.22.4) + viem: 1.21.4(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.21.4)(zod@3.22.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -9665,7 +9665,7 @@ packages: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: true - /@rainbow-me/rainbowkit@1.3.1(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.15)(wagmi@1.4.12): + /@rainbow-me/rainbowkit@1.3.1(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)(viem@1.21.4)(wagmi@1.4.12): resolution: {integrity: sha512-4Upi+S12ZHosimzlUpCiOocg4dtfGU2wkzcpxeat/FYHrvhVIOgm0TuzbsIM96W1p7OXabosd7xuxPvwduUygQ==} engines: {node: '>=12.4'} peerDependencies: @@ -9684,8 +9684,8 @@ packages: react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.4(@types/react@18.2.33)(react@18.2.0) ua-parser-js: 1.0.36 - viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) - wagmi: 1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) + viem: 1.21.4(typescript@5.1.6)(zod@3.22.4) + wagmi: 1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.21.4)(zod@3.22.4) transitivePeerDependencies: - '@types/react' dev: false @@ -12504,7 +12504,7 @@ packages: typescript: 5.3.2 dev: true - /@wagmi/connectors@3.1.10(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4): + /@wagmi/connectors@3.1.10(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.21.4)(zod@3.22.4): resolution: {integrity: sha512-ZLJC1QaeiZarkF07Cr9mOlVjPO1Lf5TBx+JKBms2y5fUIXlKrxCfQgO/gDCureboI+Us2X3IRI659+XacSGpbA==} peerDependencies: typescript: '>=5.0.4' @@ -12523,7 +12523,7 @@ packages: abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) + viem: 1.21.4(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12547,7 +12547,7 @@ packages: - zod dev: false - /@wagmi/core@1.4.12(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4): + /@wagmi/core@1.4.12(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.21.4)(zod@3.22.4): resolution: {integrity: sha512-bLcYmmGgjtl3jAGo8X3Sm6oUwsdjbVxFMu9SWnwHdE4S9JdYeWM57dEhQgq8SYul2yQ7yY2/gimBf1Or0Ky3dQ==} peerDependencies: typescript: '>=5.0.4' @@ -12556,11 +12556,11 @@ packages: typescript: optional: true dependencies: - '@wagmi/connectors': 3.1.10(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) + '@wagmi/connectors': 3.1.10(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.21.4)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.1.6 - viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) + viem: 1.21.4(typescript@5.1.6)(zod@3.22.4) zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: - '@azure/app-configuration' @@ -32276,29 +32276,6 @@ packages: - zod dev: true - /viem@1.19.15(typescript@5.1.6)(zod@3.22.4): - resolution: {integrity: sha512-rc87AkyrUUsoOAgMNYP+X/wN4GYwbhP87DkmsqQCYKxxQyzTX0+yliKs6Bxljbjr8ybU72GOb12Oyus6393AjQ==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.1.6)(zod@3.22.4) - isows: 1.0.3(ws@8.13.0) - typescript: 5.1.6 - ws: 8.13.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - dev: false - /viem@1.21.4(typescript@5.1.6)(zod@3.22.4): resolution: {integrity: sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==} peerDependencies: @@ -32597,7 +32574,7 @@ packages: resolution: {integrity: sha512-8l7sIOd3i5GWfTWciPL0+ff/FK/deVK2Q6FN+MPz4vfUcD78i2M/49XJTwF6aml91uIiuXJEsLKWMB2cw/mtKg==} dev: true - /wagmi@1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4): + /wagmi@1.4.12(@types/react@18.2.33)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.1.6)(viem@1.21.4)(zod@3.22.4): resolution: {integrity: sha512-QRxpjhdMlZmbYTfn9VQkQMKq+l3kwA1O7tF10vaykPrjbGX+IIlyn72ib9oqW9BfQO7n/Sf/mnVz1zbxRhGPWA==} peerDependencies: react: '>=17.0.0' @@ -32610,12 +32587,12 @@ packages: '@tanstack/query-sync-storage-persister': 4.36.1 '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0) '@tanstack/react-query-persist-client': 4.36.1(@tanstack/react-query@4.36.1) - '@wagmi/core': 1.4.12(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.19.15)(zod@3.22.4) + '@wagmi/core': 1.4.12(@types/react@18.2.33)(react@18.2.0)(typescript@5.1.6)(viem@1.21.4)(zod@3.22.4) abitype: 0.8.7(typescript@5.1.6)(zod@3.22.4) react: 18.2.0 typescript: 5.1.6 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 1.19.15(typescript@5.1.6)(zod@3.22.4) + viem: 1.21.4(typescript@5.1.6)(zod@3.22.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' From fd9bfdd3fba371a757d49f43516a0d979b13c5cd Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Tue, 16 Jan 2024 14:47:49 +0100 Subject: [PATCH 091/118] chore(docs): cleanup and add announcements --- .../2024_01_16_An_Impactful_Year.md | 24 + .../developer/api/sdk/classes/ClientError.md | 4 +- .../api/sdk/classes/ConfigurationError.md | 4 +- .../api/sdk/classes/ContractError.md | 4 +- .../developer/api/sdk/classes/FetchError.md | 4 +- .../api/sdk/classes/HypercertClient.md | 58 +- .../api/sdk/classes/HypercertsStorage.md | 8 +- .../api/sdk/classes/InvalidOrMissingError.md | 4 +- .../api/sdk/classes/MalformedDataError.md | 4 +- .../developer/api/sdk/classes/MintingError.md | 4 +- .../developer/api/sdk/classes/StorageError.md | 4 +- .../api/sdk/classes/UnknownSchemaError.md | 4 +- .../api/sdk/classes/UnsupportedChainError.md | 4 +- .../api/sdk/interfaces/CustomError.md | 2 +- .../api/sdk/interfaces/DuplicateEvaluation.md | 8 +- .../api/sdk/interfaces/EASEvaluation.md | 8 +- .../api/sdk/interfaces/HypercertClaimdata.md | 12 +- .../interfaces/HypercertClientInterface.md | 30 +- .../sdk/interfaces/HypercertClientMethods.md | 22 +- .../sdk/interfaces/HypercertClientState.md | 8 +- .../interfaces/HypercertEvaluationSchema.md | 6 +- .../interfaces/HypercertIndexerInterface.md | 14 +- .../api/sdk/interfaces/HypercertMetadata.md | 18 +- .../api/sdk/interfaces/HypercertPointer.md | 6 +- .../interfaces/HypercertStorageInterface.md | 8 +- .../api/sdk/interfaces/IPFSEvaluation.md | 4 +- .../sdk/interfaces/SimpleTextEvaluation.md | 6 +- docs/docs/developer/api/sdk/modules.md | 114 +- docs/docusaurus.config.js | 7 + docs/sidebars.js | 11 + docs/versioned_docs/static | 1 - docs/versioned_docs/static/.nojekyll | 0 docs/versioned_docs/static/img/creating.png | Bin 0 -> 6616 bytes docs/versioned_docs/static/img/docusaurus.png | Bin 0 -> 5142 bytes docs/versioned_docs/static/img/favicon.ico | Bin 0 -> 15086 bytes .../static/img/hypercert_data_layer.png | Bin 0 -> 140253 bytes .../static/img/hypercert_evaluations.png | Bin 0 -> 34662 bytes .../static/img/hypercert_example.png | Bin 0 -> 166342 bytes .../static/img/hypercert_id.png | Bin 0 -> 19982 bytes .../static/img/hypercert_tech_report.png | Bin 0 -> 130584 bytes .../versioned_docs/static/img/icons/beige.svg | 3 + .../static/img/icons/github-mark.png | Bin 0 -> 6393 bytes .../versioned_docs/static/img/icons/green.svg | 3 + .../img/icons/hypercerts_logo_beige.png | Bin 0 -> 26553 bytes .../img/icons/hypercerts_logo_green.png | Bin 0 -> 26071 bytes .../static/img/icons/hypercerts_logo_red.png | Bin 0 -> 26477 bytes .../img/icons/hypercerts_logo_yellow.png | Bin 0 -> 27098 bytes docs/versioned_docs/static/img/icons/red.svg | 3 + .../static/img/icons/yellow.svg | 3 + .../static/img/increasing_rewards.png | Bin 0 -> 9721 bytes docs/versioned_docs/static/img/logo.svg | 1 + docs/versioned_docs/static/img/merging.png | Bin 0 -> 7467 bytes .../static/img/retrospective_funding.png | Bin 0 -> 22631 bytes docs/versioned_docs/static/img/splitting.png | Bin 0 -> 11673 bytes .../static/img/undraw_docusaurus_mountain.svg | 171 ++ .../static/img/undraw_docusaurus_react.svg | 170 ++ .../static/img/undraw_docusaurus_tree.svg | 40 + .../pdf/hypercerts_Tech_Report_draft.pdf | Bin 0 -> 209344 bytes .../pdf/hypercerts_slides_FtC202203.pdf | Bin 0 -> 599063 bytes .../pdf/hypercerts_slides_FtC202206.pdf | Bin 0 -> 669137 bytes .../static/pdf/hypercerts_whitepaper_v0.pdf | Bin 0 -> 858405 bytes .../developer/allowlists.md | 101 -- .../api/contracts/AllowlistMinter.md | 84 - .../api/contracts/HypercertMinter.md | 895 ---------- .../api/contracts/HypercertTrader.md | 434 ----- .../api/contracts/IHypercertMinter.md | 39 - .../v0.8/interfaces/AggregatorV3Interface.md | 77 - .../api/contracts/forge-std/src/console.md | 1 - .../api/contracts/forge-std/src/console2.md | 3 - .../contracts/interfaces/IHypercertTrader.md | 133 -- .../executionStrategies/BaseStrategy.md | 41 - .../StrategyHypercertFractionOffer.md | 123 -- .../api/contracts/protocol/AllowlistMinter.md | 84 - .../api/contracts/protocol/HypercertMinter.md | 895 ---------- .../contracts/protocol/SemiFungible1155.md | 457 ----- .../protocol/interfaces/IAllowlist.md | 29 - .../protocol/interfaces/IHypercertToken.md | 192 --- .../api/contracts/protocol/libs/Errors.md | 59 - .../developer/api/sdk/.nojekyll | 1 - .../developer/api/sdk/README.md | 185 -- .../developer/api/sdk/classes/ClientError.md | 68 - .../api/sdk/classes/ConfigurationError.md | 66 - .../developer/api/sdk/classes/FetchError.md | 68 - .../api/sdk/classes/HypercertClient.md | 493 ------ .../api/sdk/classes/HypercertsStorage.md | 250 --- .../api/sdk/classes/InvalidOrMissingError.md | 68 - .../api/sdk/classes/MalformedDataError.md | 68 - .../developer/api/sdk/classes/MintingError.md | 68 - .../developer/api/sdk/classes/StorageError.md | 68 - .../api/sdk/classes/UnknownSchemaError.md | 71 - .../api/sdk/classes/UnsupportedChainError.md | 72 - .../api/sdk/classes/internal.default-1.md | 278 --- .../api/sdk/classes/internal.default-2.md | 131 -- .../api/sdk/classes/internal.default.md | 110 -- .../api/sdk/interfaces/CustomError.md | 39 - .../api/sdk/interfaces/DuplicateEvaluation.md | 56 - .../api/sdk/interfaces/EASEvaluation.md | 56 - .../interfaces/HypercertClientInterface.md | 341 ---- .../sdk/interfaces/HypercertClientMethods.md | 239 --- .../sdk/interfaces/HypercertClientState.md | 68 - .../interfaces/HypercertEvaluationSchema.md | 47 - .../interfaces/HypercertIndexerInterface.md | 176 -- .../api/sdk/interfaces/HypercertMetadata.md | 123 -- .../api/sdk/interfaces/HypercertPointer.md | 45 - .../interfaces/HypercertStorageInterface.md | 130 -- .../api/sdk/interfaces/IPFSEvaluation.md | 34 - .../sdk/interfaces/SimpleTextEvaluation.md | 45 - .../interfaces/internal.EvaluatorInterface.md | 43 - .../interfaces/internal.HypercertClaimdata.md | 169 -- .../interfaces/internal.HypercertMinter.md | 17 - .../developer/api/sdk/modules.md | 638 ------- .../developer/api/sdk/modules/internal.md | 307 ---- .../version-1.0.0-alpha.0/developer/config.md | 112 -- .../version-1.0.0-alpha.0/developer/errors.md | 18 - .../developer/evaluations.md | 13 - .../developer/querying.md | 306 ---- .../developer/split-merge.md | 29 - .../developer/supported-networks.md | 13 - .../version-1.0.0-alpha.1/about.md | 24 - .../api/contracts/AllowlistMinter.md | 84 - .../api/contracts/HypercertTrader.md | 434 ----- .../api/contracts/IHypercertMinter.md | 39 - .../api/contracts/SemiFungible1155.md | 457 ----- .../v0.8/interfaces/AggregatorV3Interface.md | 77 - .../api/contracts/forge-std/src/console.md | 1 - .../api/contracts/forge-std/src/console2.md | 3 - .../api/contracts/interfaces/IAllowlist.md | 29 - .../contracts/interfaces/IHypercertToken.md | 192 --- .../contracts/interfaces/IHypercertTrader.md | 133 -- .../developer/api/contracts/libs/Errors.md | 59 - .../marketplace/BatchOrderTypehashRegistry.md | 46 - .../CreatorFeeManagerWithRebates.md | 76 - .../CreatorFeeManagerWithRoyalties.md | 64 - .../contracts/marketplace/CurrencyManager.md | 250 --- .../contracts/marketplace/ExecutionManager.md | 751 -------- .../marketplace/InheritedStrategy.md | 9 - .../marketplace/LooksRareProtocol.md | 1157 ------------- .../api/contracts/marketplace/NonceManager.md | 193 --- .../marketplace/ProtocolFeeRecipient.md | 75 - .../contracts/marketplace/StrategyManager.md | 391 ----- .../contracts/marketplace/TransferManager.md | 553 ------ .../marketplace/TransferSelectorNFT.md | 779 --------- .../BaseStrategyChainlinkPriceLatency.md | 212 --- .../StrategyChainlinkUSDDynamicAsk.md | 342 ---- .../StrategyItemIdsRange.md | 75 - .../marketplace/helpers/OrderValidatorV2A.md | 215 --- .../marketplace/helpers/ProtocolHelpers.md | 159 -- .../interfaces/ICreatorFeeManager.md | 60 - .../interfaces/ICurrencyManager.md | 22 - .../interfaces/IExecutionManager.md | 99 -- .../interfaces/IImmutableCreate2Factory.md | 41 - .../interfaces/ILooksRareProtocol.md | 157 -- .../marketplace/interfaces/INonceManager.md | 53 - .../interfaces/IRoyaltyFeeRegistry.md | 29 - .../marketplace/interfaces/IStrategy.md | 41 - .../interfaces/IStrategyManager.md | 84 - .../interfaces/ITransferManager.md | 111 -- .../libraries/CurrencyValidator.md | 7 - .../libraries/LowLevelHypercertCaller.md | 21 - .../MerkleProofCalldataWithNodes.md | 7 - .../OpenZeppelin/MerkleProofMemory.md | 7 - .../marketplace/libraries/OrderStructs.md | 7 - .../api/contracts/protocol/HypercertMinter.md | 895 ---------- .../contracts/protocol/SemiFungible1155.md | 457 ----- .../protocol/interfaces/IAllowlist.md | 29 - .../protocol/interfaces/IHypercertToken.md | 192 --- .../api/contracts/protocol/libs/Errors.md | 59 - .../developer/api/sdk/.nojekyll | 1 - .../developer/api/sdk/README.md | 185 -- .../developer/api/sdk/classes/ClientError.md | 68 - .../api/sdk/classes/ConfigurationError.md | 66 - .../developer/api/sdk/classes/FetchError.md | 68 - .../api/sdk/classes/HypercertClient.md | 493 ------ .../api/sdk/classes/HypercertsStorage.md | 250 --- .../api/sdk/classes/InvalidOrMissingError.md | 68 - .../api/sdk/classes/MalformedDataError.md | 68 - .../developer/api/sdk/classes/MintingError.md | 68 - .../developer/api/sdk/classes/StorageError.md | 68 - .../api/sdk/classes/UnknownSchemaError.md | 71 - .../api/sdk/classes/UnsupportedChainError.md | 72 - .../api/sdk/classes/internal.default-1.md | 278 --- .../api/sdk/classes/internal.default-2.md | 131 -- .../api/sdk/classes/internal.default.md | 110 -- .../api/sdk/interfaces/DuplicateEvaluation.md | 56 - .../api/sdk/interfaces/EASEvaluation.md | 56 - .../api/sdk/interfaces/HypercertClaimdata.md | 167 -- .../interfaces/HypercertClientInterface.md | 341 ---- .../sdk/interfaces/HypercertClientMethods.md | 239 --- .../sdk/interfaces/HypercertClientState.md | 68 - .../interfaces/HypercertEvaluationSchema.md | 47 - .../interfaces/HypercertIndexerInterface.md | 176 -- .../api/sdk/interfaces/HypercertMetadata.md | 123 -- .../api/sdk/interfaces/HypercertPointer.md | 45 - .../api/sdk/interfaces/IPFSEvaluation.md | 34 - .../sdk/interfaces/SimpleTextEvaluation.md | 45 - .../interfaces/internal.EvaluatorInterface.md | 43 - .../interfaces/internal.HypercertClaimdata.md | 169 -- .../interfaces/internal.HypercertMinter.md | 17 - .../developer/api/sdk/modules.md | 638 ------- .../developer/api/sdk/modules/internal.md | 307 ---- .../developer/burning.md | 12 - .../version-1.0.0-alpha.1/developer/errors.md | 18 - .../developer/evaluations.md | 13 - .../developer/minting.md | 57 - .../developer/quickstart-javascript.md | 101 -- .../developer/quickstart-solidity.md | 41 - .../developer/split-merge.md | 29 - .../developer/supported-networks.md | 13 - .../devops/deploy-proxy.md | 120 -- .../version-1.0.0-alpha.1/devops/errors.md | 45 - .../version-1.0.0-alpha.1/devops/index.md | 18 - .../version-1.0.0-alpha.1/devops/pause.md | 29 - .../version-1.0.0-alpha.1/devops/plasmic.md | 76 - .../version-1.0.0-alpha.1/devops/setup.md | 41 - .../version-1.0.0-alpha.1/devops/upgrade.md | 35 - .../version-1.0.0-alpha.1/faq.md | 139 -- .../further-resources.md | 37 - .../implementation/glossary.md | 139 -- .../implementation/metadata.md | 188 -- .../implementation/token-standard.md | 29 - .../version-1.0.0-alpha.1/intro.md | 58 - .../minting-guide/gitcoin-round.md | 166 -- .../minting-guide/minting-guide-start.md | 44 - .../minting-guide/step-by-step.md | 130 -- .../whitepaper/evaluation.md | 23 - .../whitepaper/hypercerts-intro.md | 104 -- .../version-1.0.0-alpha.1/whitepaper/ifs.md | 103 -- .../whitepaper/impact-space.md | 35 - .../whitepaper/retrospective-funding.md | 42 - .../whitepaper/whitepaper-intro.md | 24 - .../about.md | 0 .../2024_01_16_An_Impactful_Year.md | 24 + .../developer/allowlists.md | 18 +- .../marketplace/BatchOrderTypehashRegistry.md | 0 .../CreatorFeeManagerWithRebates.md | 0 .../CreatorFeeManagerWithRoyalties.md | 0 .../contracts/marketplace/CurrencyManager.md | 0 .../contracts/marketplace/ExecutionManager.md | 0 .../marketplace/InheritedStrategy.md | 0 .../marketplace/LooksRareProtocol.md | 33 +- .../api/contracts/marketplace/NonceManager.md | 0 .../marketplace/ProtocolFeeRecipient.md | 0 .../contracts/marketplace/StrategyManager.md | 0 .../contracts/marketplace/TransferManager.md | 2 +- .../marketplace/TransferSelectorNFT.md | 6 - .../executionStrategies/BaseStrategy.md | 2 +- .../BaseStrategyChainlinkPriceLatency.md | 0 .../StrategyChainlinkUSDDynamicAsk.md | 0 .../StrategyCollectionOffer.md | 10 +- .../StrategyDutchAuction.md | 10 +- .../StrategyHypercertCollectionOffer.md} | 26 +- .../StrategyHypercertDutchAuction.md} | 18 +- .../StrategyHypercertFractionOffer.md | 4 +- .../StrategyItemIdsRange.md | 0 .../marketplace/helpers/OrderValidatorV2A.md | 0 .../marketplace/helpers/ProtocolHelpers.md | 0 .../interfaces/ICreatorFeeManager.md | 0 .../interfaces/ICurrencyManager.md | 0 .../interfaces/IExecutionManager.md | 0 .../interfaces/IImmutableCreate2Factory.md | 0 .../interfaces/ILooksRareProtocol.md | 0 .../marketplace/interfaces/INonceManager.md | 0 .../interfaces/IRoyaltyFeeRegistry.md | 0 .../marketplace/interfaces/IStrategy.md | 0 .../interfaces/IStrategyManager.md | 0 .../interfaces/ITransferManager.md | 0 .../libraries/CurrencyValidator.md | 0 .../libraries/LowLevelHypercertCaller.md | 0 .../MerkleProofCalldataWithNodes.md | 0 .../OpenZeppelin/MerkleProofMemory.md | 0 .../marketplace/libraries/OrderStructs.md | 0 .../libraries/RoyaltyFeeRegistry.md | 172 ++ .../api/contracts/protocol/AllowlistMinter.md | 18 + .../contracts/protocol}/HypercertMinter.md | 18 + .../contracts/protocol}/SemiFungible1155.md | 0 .../protocol}/interfaces/IAllowlist.md | 0 .../protocol}/interfaces/IHypercertToken.md | 0 .../api/contracts/protocol}/libs/Errors.md | 0 .../version-1.4.1/developer/api/index.md | 0 .../developer/api/sdk/_category_.yml | 3 + .../developer/api/sdk/classes/ClientError.md | 198 +++ .../api/sdk/classes/ConfigurationError.md | 196 +++ .../api/sdk/classes/ContractError.md | 197 +++ .../developer/api/sdk/classes/FetchError.md | 198 +++ .../api/sdk/classes/HypercertClient.md | 874 ++++++++++ .../api/sdk/classes/HypercertsStorage.md | 190 +++ .../api/sdk/classes/InvalidOrMissingError.md | 198 +++ .../api/sdk/classes/MalformedDataError.md | 198 +++ .../developer/api/sdk/classes/MintingError.md | 198 +++ .../developer/api/sdk/classes/StorageError.md | 198 +++ .../api/sdk/classes/UnknownSchemaError.md | 201 +++ .../api/sdk/classes/UnsupportedChainError.md | 202 +++ .../developer/api/sdk/classes/_category_.yml | 2 + .../version-1.4.1/developer/api/sdk/index.md | 147 ++ .../api/sdk/interfaces/CustomError.md | 19 +- .../api/sdk/interfaces/DuplicateEvaluation.md | 51 + .../api/sdk/interfaces/EASEvaluation.md | 51 + .../api/sdk/interfaces/HypercertClaimdata.md | 33 +- .../interfaces/HypercertClientInterface.md | 459 +++++ .../sdk/interfaces/HypercertClientMethods.md | 347 ++++ .../sdk/interfaces/HypercertClientState.md | 61 + .../interfaces/HypercertEvaluationSchema.md | 43 + .../interfaces/HypercertIndexerInterface.md | 164 ++ .../api/sdk/interfaces/HypercertMetadata.md | 113 ++ .../api/sdk/interfaces/HypercertPointer.md | 41 + .../interfaces/HypercertStorageInterface.md | 56 +- .../api/sdk/interfaces/IPFSEvaluation.md | 31 + .../sdk/interfaces/SimpleTextEvaluation.md | 41 + .../api/sdk/interfaces/_category_.yml | 2 + .../developer/api/sdk/modules.md | 1516 +++++++++++++++++ .../developer/burning.md | 2 +- .../developer/config.md | 55 +- .../version-1.4.1/developer/errors.md | 20 + .../version-1.4.1/developer/index.md | 49 + .../developer/minting.md | 4 +- .../developer/querying.md | 137 +- .../developer/quickstart-javascript.md | 15 +- .../developer/quickstart-solidity.md | 0 .../version-1.4.1/developer/split-merge.md | 15 + .../developer/supported-networks.md | 15 + .../devops/deploy-proxy.md | 26 +- .../devops/errors.md | 0 .../devops/index.md | 0 .../devops/pause.md | 0 .../devops/plasmic.md | 0 .../devops/setup.md | 0 .../devops/upgrade.md | 0 .../faq.md | 0 .../further-resources.md | 0 .../implementation/glossary.md | 2 +- .../implementation/metadata.md | 0 .../implementation/token-standard.md | 0 .../intro.md | 0 .../minting-guide/gitcoin-round.md | 0 .../minting-guide/minting-guide-start.md | 0 .../minting-guide/step-by-step.md | 0 .../whitepaper/evaluation.md | 0 .../whitepaper/hypercerts-intro.md | 0 .../whitepaper/ifs.md | 0 .../whitepaper/impact-space.md | 0 .../whitepaper/retrospective-funding.md | 0 .../whitepaper/whitepaper-intro.md | 0 .../version-1.0.0-alpha.1-sidebars.json | 165 -- ...ebars.json => version-1.4.1-sidebars.json} | 31 +- docs/versions.json | 2 +- 345 files changed, 7338 insertions(+), 25176 deletions(-) create mode 100644 docs/docs/announcements/2024_01_16_An_Impactful_Year.md delete mode 120000 docs/versioned_docs/static create mode 100644 docs/versioned_docs/static/.nojekyll create mode 100644 docs/versioned_docs/static/img/creating.png create mode 100644 docs/versioned_docs/static/img/docusaurus.png create mode 100644 docs/versioned_docs/static/img/favicon.ico create mode 100644 docs/versioned_docs/static/img/hypercert_data_layer.png create mode 100644 docs/versioned_docs/static/img/hypercert_evaluations.png create mode 100644 docs/versioned_docs/static/img/hypercert_example.png create mode 100644 docs/versioned_docs/static/img/hypercert_id.png create mode 100644 docs/versioned_docs/static/img/hypercert_tech_report.png create mode 100644 docs/versioned_docs/static/img/icons/beige.svg create mode 100644 docs/versioned_docs/static/img/icons/github-mark.png create mode 100644 docs/versioned_docs/static/img/icons/green.svg create mode 100644 docs/versioned_docs/static/img/icons/hypercerts_logo_beige.png create mode 100644 docs/versioned_docs/static/img/icons/hypercerts_logo_green.png create mode 100644 docs/versioned_docs/static/img/icons/hypercerts_logo_red.png create mode 100644 docs/versioned_docs/static/img/icons/hypercerts_logo_yellow.png create mode 100644 docs/versioned_docs/static/img/icons/red.svg create mode 100644 docs/versioned_docs/static/img/icons/yellow.svg create mode 100644 docs/versioned_docs/static/img/increasing_rewards.png create mode 100644 docs/versioned_docs/static/img/logo.svg create mode 100644 docs/versioned_docs/static/img/merging.png create mode 100644 docs/versioned_docs/static/img/retrospective_funding.png create mode 100644 docs/versioned_docs/static/img/splitting.png create mode 100644 docs/versioned_docs/static/img/undraw_docusaurus_mountain.svg create mode 100644 docs/versioned_docs/static/img/undraw_docusaurus_react.svg create mode 100644 docs/versioned_docs/static/img/undraw_docusaurus_tree.svg create mode 100644 docs/versioned_docs/static/pdf/hypercerts_Tech_Report_draft.pdf create mode 100644 docs/versioned_docs/static/pdf/hypercerts_slides_FtC202203.pdf create mode 100644 docs/versioned_docs/static/pdf/hypercerts_slides_FtC202206.pdf create mode 100644 docs/versioned_docs/static/pdf/hypercerts_whitepaper_v0.pdf delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/allowlists.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/HypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/IHypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/forge-std/src/console2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/interfaces/IHypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/contracts/protocol/libs/Errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/.nojekyll delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/README.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ClientError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/ConfigurationError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/FetchError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertClient.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/HypercertsStorage.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/InvalidOrMissingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MalformedDataError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/MintingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/StorageError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnknownSchemaError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/UnsupportedChainError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-1.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default-2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/classes/internal.default.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/CustomError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/DuplicateEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/EASEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientMethods.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertClientState.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertEvaluationSchema.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertIndexerInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertMetadata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertPointer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/HypercertStorageInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/IPFSEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/SimpleTextEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.EvaluatorInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/interfaces/internal.HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/api/sdk/modules/internal.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/config.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/evaluations.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/querying.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/split-merge.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.0/developer/supported-networks.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/about.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/AllowlistMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/HypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/IHypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/ainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/forge-std/src/console2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/interfaces/IHypercertTrader.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/libs/Errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/CurrencyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ExecutionManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/InheritedStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/LooksRareProtocol.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/NonceManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/ProtocolFeeRecipient.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/StrategyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/TransferSelectorNFT.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IExecutionManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/INonceManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/IStrategyManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/interfaces/ITransferManager.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/CurrencyValidator.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/marketplace/libraries/OrderStructs.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/SemiFungible1155.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IAllowlist.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/interfaces/IHypercertToken.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/contracts/protocol/libs/Errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/.nojekyll delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/README.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ClientError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/ConfigurationError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/FetchError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertClient.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/HypercertsStorage.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/InvalidOrMissingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MalformedDataError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/MintingError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/StorageError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnknownSchemaError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/UnsupportedChainError.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-1.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default-2.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/classes/internal.default.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/DuplicateEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/EASEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientMethods.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertClientState.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertMetadata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/HypercertPointer.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/IPFSEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.EvaluatorInterface.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertClaimdata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/interfaces/internal.HypercertMinter.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/api/sdk/modules/internal.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/burning.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/evaluations.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/minting.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-javascript.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/quickstart-solidity.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/split-merge.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/developer/supported-networks.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/deploy-proxy.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/errors.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/index.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/pause.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/plasmic.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/setup.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/devops/upgrade.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/faq.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/further-resources.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/glossary.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/metadata.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/implementation/token-standard.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/gitcoin-round.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/minting-guide-start.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/minting-guide/step-by-step.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/evaluation.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/hypercerts-intro.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/ifs.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/impact-space.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/retrospective-funding.md delete mode 100644 docs/versioned_docs/version-1.0.0-alpha.1/whitepaper/whitepaper-intro.md rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/about.md (100%) create mode 100644 docs/versioned_docs/version-1.4.1/announcements/2024_01_16_An_Impactful_Year.md rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.4.1}/developer/allowlists.md (91%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/BatchOrderTypehashRegistry.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/CreatorFeeManagerWithRebates.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/CreatorFeeManagerWithRoyalties.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/CurrencyManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/ExecutionManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/InheritedStrategy.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/LooksRareProtocol.md (96%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/NonceManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/ProtocolFeeRecipient.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/StrategyManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/TransferManager.md (99%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/TransferSelectorNFT.md (99%) rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.4.1}/developer/api/contracts/marketplace/executionStrategies/BaseStrategy.md (95%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.4.1}/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md (95%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md (90%) rename docs/versioned_docs/{version-1.0.0-alpha.0/developer/api/contracts/marketplace/executionStrategies/StrategyCollectionOffer.md => version-1.4.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertCollectionOffer.md} (73%) rename docs/versioned_docs/{version-1.0.0-alpha.1/developer/api/contracts/marketplace/executionStrategies/StrategyDutchAuction.md => version-1.4.1/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertDutchAuction.md} (83%) rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.4.1}/developer/api/contracts/marketplace/executionStrategies/StrategyHypercertFractionOffer.md (79%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/executionStrategies/StrategyItemIdsRange.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/helpers/OrderValidatorV2A.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/helpers/ProtocolHelpers.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/interfaces/ICreatorFeeManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/interfaces/ICurrencyManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/interfaces/IExecutionManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/interfaces/IImmutableCreate2Factory.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/interfaces/ILooksRareProtocol.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/interfaces/INonceManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/interfaces/IRoyaltyFeeRegistry.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/interfaces/IStrategy.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/interfaces/IStrategyManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/interfaces/ITransferManager.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/libraries/CurrencyValidator.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/libraries/LowLevelHypercertCaller.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/libraries/OpenZeppelin/MerkleProofMemory.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/contracts/marketplace/libraries/OrderStructs.md (100%) create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/contracts/marketplace/libraries/RoyaltyFeeRegistry.md rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.4.1}/developer/api/contracts/protocol/AllowlistMinter.md (81%) rename docs/versioned_docs/{version-1.0.0-alpha.1/developer/api/contracts => version-1.4.1/developer/api/contracts/protocol}/HypercertMinter.md (98%) rename docs/versioned_docs/{version-1.0.0-alpha.0/developer/api/contracts => version-1.4.1/developer/api/contracts/protocol}/SemiFungible1155.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0/developer/api/contracts => version-1.4.1/developer/api/contracts/protocol}/interfaces/IAllowlist.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0/developer/api/contracts => version-1.4.1/developer/api/contracts/protocol}/interfaces/IHypercertToken.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0/developer/api/contracts => version-1.4.1/developer/api/contracts/protocol}/libs/Errors.md (100%) create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/index.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/_category_.yml create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/ClientError.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/ConfigurationError.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/ContractError.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/FetchError.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/HypercertClient.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/HypercertsStorage.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/InvalidOrMissingError.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/MalformedDataError.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/MintingError.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/StorageError.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/UnknownSchemaError.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/UnsupportedChainError.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/classes/_category_.yml create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/index.md rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.4.1}/developer/api/sdk/interfaces/CustomError.md (70%) create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/DuplicateEvaluation.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/EASEvaluation.md rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/api/sdk/interfaces/HypercertClaimdata.md (65%) create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/HypercertClientInterface.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/HypercertClientMethods.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/HypercertClientState.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/HypercertEvaluationSchema.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/HypercertIndexerInterface.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/HypercertMetadata.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/HypercertPointer.md rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.4.1}/developer/api/sdk/interfaces/HypercertStorageInterface.md (55%) create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/IPFSEvaluation.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/SimpleTextEvaluation.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/interfaces/_category_.yml create mode 100644 docs/versioned_docs/version-1.4.1/developer/api/sdk/modules.md rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/burning.md (84%) rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.4.1}/developer/config.md (53%) create mode 100644 docs/versioned_docs/version-1.4.1/developer/errors.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/index.md rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/minting.md (95%) rename docs/versioned_docs/{version-1.0.0-alpha.1 => version-1.4.1}/developer/querying.md (66%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/quickstart-javascript.md (88%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/developer/quickstart-solidity.md (100%) create mode 100644 docs/versioned_docs/version-1.4.1/developer/split-merge.md create mode 100644 docs/versioned_docs/version-1.4.1/developer/supported-networks.md rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/devops/deploy-proxy.md (80%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/devops/errors.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/devops/index.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/devops/pause.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/devops/plasmic.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/devops/setup.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/devops/upgrade.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/faq.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/further-resources.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/implementation/glossary.md (96%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/implementation/metadata.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/implementation/token-standard.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/intro.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/minting-guide/gitcoin-round.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/minting-guide/minting-guide-start.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/minting-guide/step-by-step.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/whitepaper/evaluation.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/whitepaper/hypercerts-intro.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/whitepaper/ifs.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/whitepaper/impact-space.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/whitepaper/retrospective-funding.md (100%) rename docs/versioned_docs/{version-1.0.0-alpha.0 => version-1.4.1}/whitepaper/whitepaper-intro.md (100%) delete mode 100644 docs/versioned_sidebars/version-1.0.0-alpha.1-sidebars.json rename docs/versioned_sidebars/{version-1.0.0-alpha.0-sidebars.json => version-1.4.1-sidebars.json} (86%) diff --git a/docs/docs/announcements/2024_01_16_An_Impactful_Year.md b/docs/docs/announcements/2024_01_16_An_Impactful_Year.md new file mode 100644 index 00000000..3ec4a3d1 --- /dev/null +++ b/docs/docs/announcements/2024_01_16_An_Impactful_Year.md @@ -0,0 +1,24 @@ +--- +title: An Impactful Year +id: an-impactful-year.md +--- + +# Announcements + +### Hypercerts are a new token standard for tracking and rewarding positive impact. + +Gm gm. We’re wishing you an impactful 2024. We’re excited for the things ahead! + +2023 has been a year of maturing the foundations laid by the release of the protocol. Together with Grants Stack, Funding the Commons, da0, Zuzalu and many other partners, we’ve successfully run a set of hypercerts pilots. We are grateful for our partners and the enthusiasm of their communities about hypercerts. At every event, we feel the positive energy about hypercerts and about the value mechanism they can unlock. + +At the end of the year, we started developing the hypercert marketplace, which will be released on Sepolia later this week. The marketplace is a fork of LooksRare with modifications to add native support for hypercerts. Thanks to their high quality open source code we were able to use both their exchange contracts as well as the SDK. Special credits go to [Trust Security](https://x.com/trust__90) for not only thoroughly reviewing the changes we’ve made to the stack, but also for going beyond their scope to help us improve our protocol. + +To help developers get onboarded with our tec,h we’ve released a [Next.JS starter app](https://github.com/hypercerts-org/hypercert-nextjs-chakra-starter), a repo with minimal [demo apps](https://github.com/hypercerts-org/demo-apps) for JS, TS on both server and client side, and of course, the [hypercerts SDK v1](https://www.npmjs.com/package/@hypercerts-org/sdk). The SDK provides methods and utilities for minting and claiming hypercerts, validating datasets, and uploading to and fetching from IPFS. + +All of this work is supported by GG19, the first Octant epoch, Optimism’s retroPGF and of course Protocol Labs. A big thank you to all supporters. + +In the next months, we’ll work with close collaborators to build out the evaluation functionalities and provide support to projects that want to integrate hypercerts into their funding systems (similar to how we are integrating hypercerts with Gitcoin) or want to build new applications using hypercerts. If you want to build on top of the hypercerts protocol, please get in contact with us. + +Excited and grateful, + +The hypercerts team diff --git a/docs/docs/developer/api/sdk/classes/ClientError.md b/docs/docs/developer/api/sdk/classes/ClientError.md index bc8fdf6c..ac6d4599 100644 --- a/docs/docs/developer/api/sdk/classes/ClientError.md +++ b/docs/docs/developer/api/sdk/classes/ClientError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:27](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L27) +[sdk/src/types/errors.ts:27](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L27) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:20](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L20) +[sdk/src/types/errors.ts:20](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L20) --- diff --git a/docs/docs/developer/api/sdk/classes/ConfigurationError.md b/docs/docs/developer/api/sdk/classes/ConfigurationError.md index 6e480b06..f84cce18 100644 --- a/docs/docs/developer/api/sdk/classes/ConfigurationError.md +++ b/docs/docs/developer/api/sdk/classes/ConfigurationError.md @@ -41,7 +41,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:188](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L188) +[sdk/src/types/errors.ts:188](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L188) ## Properties @@ -103,7 +103,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:187](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L187) +[sdk/src/types/errors.ts:187](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L187) --- diff --git a/docs/docs/developer/api/sdk/classes/ContractError.md b/docs/docs/developer/api/sdk/classes/ContractError.md index 13f5c6a7..396816f5 100644 --- a/docs/docs/developer/api/sdk/classes/ContractError.md +++ b/docs/docs/developer/api/sdk/classes/ContractError.md @@ -42,7 +42,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:43](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L43) +[sdk/src/types/errors.ts:43](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L43) ## Properties @@ -104,7 +104,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:41](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L41) +[sdk/src/types/errors.ts:41](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L41) --- diff --git a/docs/docs/developer/api/sdk/classes/FetchError.md b/docs/docs/developer/api/sdk/classes/FetchError.md index 59db0099..11455b94 100644 --- a/docs/docs/developer/api/sdk/classes/FetchError.md +++ b/docs/docs/developer/api/sdk/classes/FetchError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:65](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L65) +[sdk/src/types/errors.ts:65](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L65) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:58](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L58) +[sdk/src/types/errors.ts:58](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L58) --- diff --git a/docs/docs/developer/api/sdk/classes/HypercertClient.md b/docs/docs/developer/api/sdk/classes/HypercertClient.md index 5c0e700b..8b72082f 100644 --- a/docs/docs/developer/api/sdk/classes/HypercertClient.md +++ b/docs/docs/developer/api/sdk/classes/HypercertClient.md @@ -54,7 +54,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:58](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L58) +[sdk/src/client.ts:58](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L58) ## Properties @@ -64,7 +64,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:41](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L41) +[sdk/src/client.ts:41](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L41) --- @@ -74,7 +74,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:44](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L44) +[sdk/src/client.ts:44](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L44) --- @@ -84,7 +84,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:45](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L45) +[sdk/src/client.ts:45](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L45) --- @@ -158,7 +158,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:46](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L46) +[sdk/src/client.ts:46](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L46) --- @@ -168,7 +168,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:42](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L42) +[sdk/src/client.ts:42](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L42) --- @@ -212,7 +212,7 @@ Will throw a `ClientError` if the public client cannot be connected. #### Defined in -[sdk/src/client.ts:47](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L47) +[sdk/src/client.ts:47](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L47) --- @@ -228,7 +228,7 @@ Whether the client is in read-only mode. #### Defined in -[sdk/src/client.ts:48](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L48) +[sdk/src/client.ts:48](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L48) ## Accessors @@ -246,7 +246,7 @@ The client config. #### Defined in -[sdk/src/client.ts:82](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L82) +[sdk/src/client.ts:82](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L82) --- @@ -272,7 +272,7 @@ Use getDeployments instead. #### Defined in -[sdk/src/client.ts:107](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L107) +[sdk/src/client.ts:107](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L107) --- @@ -294,7 +294,7 @@ The indexer. #### Defined in -[sdk/src/client.ts:98](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L98) +[sdk/src/client.ts:98](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L98) --- @@ -316,7 +316,7 @@ The storage layer. #### Defined in -[sdk/src/client.ts:90](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L90) +[sdk/src/client.ts:90](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L90) ## Methods @@ -355,7 +355,7 @@ Will throw an `InvalidOrMissingError` if any of the proofs are invalid. #### Defined in -[sdk/src/client.ts:454](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L454) +[sdk/src/client.ts:454](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L454) --- @@ -388,7 +388,7 @@ A promise that resolves to the transaction hash. #### Defined in -[sdk/src/client.ts:216](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L216) +[sdk/src/client.ts:216](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L216) --- @@ -425,7 +425,7 @@ Will throw a `ClientError` if the claim is not owned by the account. #### Defined in -[sdk/src/client.ts:377](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L377) +[sdk/src/client.ts:377](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L377) --- @@ -466,7 +466,7 @@ Will throw a `MalformedDataError` if the provided allowlist or metadata is inval #### Defined in -[sdk/src/client.ts:249](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L249) +[sdk/src/client.ts:249](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L249) --- @@ -486,7 +486,7 @@ Will throw a `MalformedDataError` if the provided allowlist or metadata is inval #### Defined in -[sdk/src/client.ts:485](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L485) +[sdk/src/client.ts:485](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L485) --- @@ -506,7 +506,7 @@ Will throw a `MalformedDataError` if the provided allowlist or metadata is inval #### Defined in -[sdk/src/client.ts:502](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L502) +[sdk/src/client.ts:502](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L502) --- @@ -520,7 +520,7 @@ Will throw a `MalformedDataError` if the provided allowlist or metadata is inval #### Defined in -[sdk/src/client.ts:491](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L491) +[sdk/src/client.ts:491](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L491) --- @@ -552,7 +552,7 @@ Use getDeployments instead. #### Defined in -[sdk/src/client.ts:120](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L120) +[sdk/src/client.ts:120](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L120) --- @@ -582,7 +582,7 @@ a Promise that resolves to the applicable transfer restrictions. #### Defined in -[sdk/src/client.ts:168](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L168) +[sdk/src/client.ts:168](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L168) --- @@ -630,7 +630,7 @@ a Promise that resolves to the applicable transfer restrictions. #### Defined in -[sdk/src/client.ts:512](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L512) +[sdk/src/client.ts:512](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L512) --- @@ -667,7 +667,7 @@ Will throw a `ClientError` if any of the fractions are not owned by the account. #### Defined in -[sdk/src/client.ts:336](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L336) +[sdk/src/client.ts:336](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L336) --- @@ -707,7 +707,7 @@ Will throw a `MalformedDataError` if the provided metadata is invalid. #### Defined in -[sdk/src/client.ts:139](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L139) +[sdk/src/client.ts:139](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L139) --- @@ -746,7 +746,7 @@ Will throw an `InvalidOrMissingError` if the proof is invalid. #### Defined in -[sdk/src/client.ts:410](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L410) +[sdk/src/client.ts:410](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L410) --- @@ -769,7 +769,7 @@ Will throw an `InvalidOrMissingError` if the proof is invalid. #### Defined in -[sdk/src/client.ts:522](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L522) +[sdk/src/client.ts:522](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L522) --- @@ -808,7 +808,7 @@ Will throw a `ClientError` if the fraction is not owned by the account or if the #### Defined in -[sdk/src/client.ts:291](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L291) +[sdk/src/client.ts:291](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L291) --- @@ -838,7 +838,7 @@ Will throw a `ClientError` if the request fails. #### Defined in -[sdk/src/client.ts:553](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L553) +[sdk/src/client.ts:553](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L553) --- @@ -871,4 +871,4 @@ A promise that resolves to the transaction hash. #### Defined in -[sdk/src/client.ts:188](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/client.ts#L188) +[sdk/src/client.ts:188](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/client.ts#L188) diff --git a/docs/docs/developer/api/sdk/classes/HypercertsStorage.md b/docs/docs/developer/api/sdk/classes/HypercertsStorage.md index 6729be6f..8e12f2c9 100644 --- a/docs/docs/developer/api/sdk/classes/HypercertsStorage.md +++ b/docs/docs/developer/api/sdk/classes/HypercertsStorage.md @@ -71,7 +71,7 @@ Note: The original implementation using the Web3 Storage client is currently com #### Defined in -[sdk/src/storage.ts:128](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/storage.ts#L128) +[sdk/src/storage.ts:128](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/storage.ts#L128) --- @@ -106,7 +106,7 @@ Will throw a `MalformedDataError` if the retrieved data is invalid. #### Defined in -[sdk/src/storage.ts:105](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/storage.ts#L105) +[sdk/src/storage.ts:105](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/storage.ts#L105) --- @@ -147,7 +147,7 @@ Will throw a `MalformedDataError` if the provided metadata is invalid. #### Defined in -[sdk/src/storage.ts:34](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/storage.ts#L34) +[sdk/src/storage.ts:34](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/storage.ts#L34) --- @@ -187,4 +187,4 @@ Will throw a `MalformedDataError` if the provided metadata is invalid. #### Defined in -[sdk/src/storage.ts:74](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/storage.ts#L74) +[sdk/src/storage.ts:74](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/storage.ts#L74) diff --git a/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md b/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md index e487ebfe..ac9104a1 100644 --- a/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md +++ b/docs/docs/developer/api/sdk/classes/InvalidOrMissingError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:83](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L83) +[sdk/src/types/errors.ts:83](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L83) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:76](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L76) +[sdk/src/types/errors.ts:76](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L76) --- diff --git a/docs/docs/developer/api/sdk/classes/MalformedDataError.md b/docs/docs/developer/api/sdk/classes/MalformedDataError.md index c4f094c7..e5a07e8a 100644 --- a/docs/docs/developer/api/sdk/classes/MalformedDataError.md +++ b/docs/docs/developer/api/sdk/classes/MalformedDataError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:155](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L155) +[sdk/src/types/errors.ts:155](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L155) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:148](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L148) +[sdk/src/types/errors.ts:148](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L148) --- diff --git a/docs/docs/developer/api/sdk/classes/MintingError.md b/docs/docs/developer/api/sdk/classes/MintingError.md index ae67a9ab..ec509c3a 100644 --- a/docs/docs/developer/api/sdk/classes/MintingError.md +++ b/docs/docs/developer/api/sdk/classes/MintingError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:101](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L101) +[sdk/src/types/errors.ts:101](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L101) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:94](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L94) +[sdk/src/types/errors.ts:94](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L94) --- diff --git a/docs/docs/developer/api/sdk/classes/StorageError.md b/docs/docs/developer/api/sdk/classes/StorageError.md index 4cfc9f73..979453a2 100644 --- a/docs/docs/developer/api/sdk/classes/StorageError.md +++ b/docs/docs/developer/api/sdk/classes/StorageError.md @@ -43,7 +43,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:119](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L119) +[sdk/src/types/errors.ts:119](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L119) ## Properties @@ -105,7 +105,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:112](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L112) +[sdk/src/types/errors.ts:112](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L112) --- diff --git a/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md b/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md index 35d2d426..b3f45e3d 100644 --- a/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md +++ b/docs/docs/developer/api/sdk/classes/UnknownSchemaError.md @@ -44,7 +44,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:137](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L137) +[sdk/src/types/errors.ts:137](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L137) ## Properties @@ -108,7 +108,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:130](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L130) +[sdk/src/types/errors.ts:130](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L130) --- diff --git a/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md b/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md index e54388fe..07bcb6cb 100644 --- a/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md +++ b/docs/docs/developer/api/sdk/classes/UnsupportedChainError.md @@ -45,7 +45,7 @@ Error.constructor #### Defined in -[sdk/src/types/errors.ts:174](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L174) +[sdk/src/types/errors.ts:174](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L174) ## Properties @@ -109,7 +109,7 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:167](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L167) +[sdk/src/types/errors.ts:167](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L167) --- diff --git a/docs/docs/developer/api/sdk/interfaces/CustomError.md b/docs/docs/developer/api/sdk/interfaces/CustomError.md index 3be7a437..55d889d5 100644 --- a/docs/docs/developer/api/sdk/interfaces/CustomError.md +++ b/docs/docs/developer/api/sdk/interfaces/CustomError.md @@ -35,4 +35,4 @@ Additional error payload. #### Defined in -[sdk/src/types/errors.ts:10](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L10) +[sdk/src/types/errors.ts:10](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L10) diff --git a/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md b/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md index 35b87c49..2768984f 100644 --- a/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/DuplicateEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:22](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L22) +[sdk/src/types/evaluation.d.ts:22](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L22) --- @@ -28,7 +28,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:24](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L24) +[sdk/src/types/evaluation.d.ts:24](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L24) --- @@ -38,7 +38,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L23) +[sdk/src/types/evaluation.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L23) --- @@ -48,4 +48,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:21](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L21) +[sdk/src/types/evaluation.d.ts:21](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L21) diff --git a/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md b/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md index 97886bf6..66298540 100644 --- a/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/EASEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:41](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L41) +[sdk/src/types/evaluation.d.ts:41](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L41) --- @@ -28,7 +28,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:42](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L42) +[sdk/src/types/evaluation.d.ts:42](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L42) --- @@ -38,7 +38,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L40) +[sdk/src/types/evaluation.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L40) --- @@ -48,4 +48,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:43](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L43) +[sdk/src/types/evaluation.d.ts:43](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L43) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md b/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md index f4940137..7f297084 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClaimdata.md @@ -34,7 +34,7 @@ Contributors #### Defined in -[sdk/src/types/claimdata.d.ts:53](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L53) +[sdk/src/types/claimdata.d.ts:53](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/claimdata.d.ts#L53) --- @@ -59,7 +59,7 @@ Scopes of impact #### Defined in -[sdk/src/types/claimdata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L15) +[sdk/src/types/claimdata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/claimdata.d.ts#L15) --- @@ -83,7 +83,7 @@ Impact time period. The value is UNIX time in seconds from epoch. #### Defined in -[sdk/src/types/claimdata.d.ts:44](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L44) +[sdk/src/types/claimdata.d.ts:44](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/claimdata.d.ts#L44) --- @@ -108,7 +108,7 @@ Rights #### Defined in -[sdk/src/types/claimdata.d.ts:62](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L62) +[sdk/src/types/claimdata.d.ts:62](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/claimdata.d.ts#L62) --- @@ -133,7 +133,7 @@ Scopes of work #### Defined in -[sdk/src/types/claimdata.d.ts:25](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L25) +[sdk/src/types/claimdata.d.ts:25](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/claimdata.d.ts#L25) --- @@ -157,4 +157,4 @@ Work time period. The value is UNIX time in seconds from epoch. #### Defined in -[sdk/src/types/claimdata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/claimdata.d.ts#L35) +[sdk/src/types/claimdata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/claimdata.d.ts#L35) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md index 4443f615..206f1717 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientInterface.md @@ -62,7 +62,7 @@ The order of the arrays must be equal. #### Defined in -[sdk/src/types/client.ts:253](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L253) +[sdk/src/types/client.ts:253](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L253) --- @@ -96,7 +96,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:187](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L187) +[sdk/src/types/client.ts:187](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L187) --- @@ -128,7 +128,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:228](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L228) +[sdk/src/types/client.ts:228](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L228) --- @@ -142,7 +142,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:134](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L134) +[sdk/src/types/client.ts:134](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L134) --- @@ -177,7 +177,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:201](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L201) +[sdk/src/types/client.ts:201](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L201) --- @@ -209,7 +209,7 @@ The addresses, graph name and graph url. #### Defined in -[sdk/src/types/client.ts:145](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L145) +[sdk/src/types/client.ts:145](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L145) --- @@ -241,7 +241,7 @@ A Promise that resolves to the applicable transfer restrictions. #### Defined in -[sdk/src/types/client.ts:165](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L165) +[sdk/src/types/client.ts:165](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L165) --- @@ -257,7 +257,7 @@ The indexer used by the client. #### Defined in -[sdk/src/types/client.ts:133](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L133) +[sdk/src/types/client.ts:133](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L133) --- @@ -289,7 +289,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:221](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L221) +[sdk/src/types/client.ts:221](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L221) --- @@ -323,7 +323,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:154](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L154) +[sdk/src/types/client.ts:154](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L154) --- @@ -357,7 +357,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:237](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L237) +[sdk/src/types/client.ts:237](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L237) --- @@ -373,7 +373,7 @@ Whether the client is in read-only mode. #### Defined in -[sdk/src/types/client.ts:129](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L129) +[sdk/src/types/client.ts:129](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L129) --- @@ -406,7 +406,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:214](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L214) +[sdk/src/types/client.ts:214](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L214) --- @@ -422,7 +422,7 @@ The storage layer used by the client. #### Defined in -[sdk/src/types/client.ts:131](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L131) +[sdk/src/types/client.ts:131](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L131) --- @@ -456,4 +456,4 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:174](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L174) +[sdk/src/types/client.ts:174](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L174) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md index 07e47e33..5c179e25 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientMethods.md @@ -52,7 +52,7 @@ The order of the arrays must be equal. #### Defined in -[sdk/src/types/client.ts:253](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L253) +[sdk/src/types/client.ts:253](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L253) --- @@ -82,7 +82,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:187](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L187) +[sdk/src/types/client.ts:187](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L187) --- @@ -110,7 +110,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:228](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L228) +[sdk/src/types/client.ts:228](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L228) --- @@ -141,7 +141,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:201](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L201) +[sdk/src/types/client.ts:201](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L201) --- @@ -169,7 +169,7 @@ The addresses, graph name and graph url. #### Defined in -[sdk/src/types/client.ts:145](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L145) +[sdk/src/types/client.ts:145](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L145) --- @@ -197,7 +197,7 @@ A Promise that resolves to the applicable transfer restrictions. #### Defined in -[sdk/src/types/client.ts:165](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L165) +[sdk/src/types/client.ts:165](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L165) --- @@ -225,7 +225,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:221](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L221) +[sdk/src/types/client.ts:221](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L221) --- @@ -255,7 +255,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:154](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L154) +[sdk/src/types/client.ts:154](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L154) --- @@ -285,7 +285,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:237](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L237) +[sdk/src/types/client.ts:237](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L237) --- @@ -314,7 +314,7 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:214](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L214) +[sdk/src/types/client.ts:214](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L214) --- @@ -344,4 +344,4 @@ A Promise that resolves to the transaction hash #### Defined in -[sdk/src/types/client.ts:174](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L174) +[sdk/src/types/client.ts:174](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L174) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md b/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md index 03e2c6fb..acf56f89 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertClientState.md @@ -22,7 +22,7 @@ The state of the Hypercert client. #### Defined in -[sdk/src/types/client.ts:134](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L134) +[sdk/src/types/client.ts:134](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L134) --- @@ -34,7 +34,7 @@ The indexer used by the client. #### Defined in -[sdk/src/types/client.ts:133](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L133) +[sdk/src/types/client.ts:133](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L133) --- @@ -46,7 +46,7 @@ Whether the client is in read-only mode. #### Defined in -[sdk/src/types/client.ts:129](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L129) +[sdk/src/types/client.ts:129](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L129) --- @@ -58,4 +58,4 @@ The storage layer used by the client. #### Defined in -[sdk/src/types/client.ts:131](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L131) +[sdk/src/types/client.ts:131](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L131) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md b/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md index 73316c03..3d3314eb 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertEvaluationSchema.md @@ -20,7 +20,7 @@ Schema for evaluating Hypercerts across different sources and evaluation types #### Defined in -[sdk/src/types/evaluation.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L15) +[sdk/src/types/evaluation.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L15) --- @@ -30,7 +30,7 @@ Schema for evaluating Hypercerts across different sources and evaluation types #### Defined in -[sdk/src/types/evaluation.d.ts:16](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L16) +[sdk/src/types/evaluation.d.ts:16](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L16) --- @@ -40,4 +40,4 @@ Schema for evaluating Hypercerts across different sources and evaluation types #### Defined in -[sdk/src/types/evaluation.d.ts:17](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L17) +[sdk/src/types/evaluation.d.ts:17](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L17) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md index 8d4f8430..4148157f 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertIndexerInterface.md @@ -28,7 +28,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:20](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L20) +[sdk/src/types/indexer.ts:20](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/indexer.ts#L20) --- @@ -53,7 +53,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:19](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L19) +[sdk/src/types/indexer.ts:19](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/indexer.ts#L19) --- @@ -77,7 +77,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:21](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L21) +[sdk/src/types/indexer.ts:21](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/indexer.ts#L21) --- @@ -101,7 +101,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:24](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L24) +[sdk/src/types/indexer.ts:24](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/indexer.ts#L24) --- @@ -126,7 +126,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:23](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L23) +[sdk/src/types/indexer.ts:23](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/indexer.ts#L23) --- @@ -151,7 +151,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:22](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L22) +[sdk/src/types/indexer.ts:22](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/indexer.ts#L22) --- @@ -161,4 +161,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/indexer.ts:18](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L18) +[sdk/src/types/indexer.ts:18](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/indexer.ts#L18) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md b/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md index d65901c4..d12d5c5d 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertMetadata.md @@ -18,7 +18,7 @@ A CID pointer to the merke tree proof json on ipfs #### Defined in -[sdk/src/types/metadata.d.ts:39](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L39) +[sdk/src/types/metadata.d.ts:39](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/metadata.d.ts#L39) --- @@ -30,7 +30,7 @@ Describes the asset to which this token represents #### Defined in -[sdk/src/types/metadata.d.ts:19](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L19) +[sdk/src/types/metadata.d.ts:19](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/metadata.d.ts#L19) --- @@ -42,7 +42,7 @@ An url pointing to the external website of the project #### Defined in -[sdk/src/types/metadata.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L23) +[sdk/src/types/metadata.d.ts:23](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/metadata.d.ts#L23) --- @@ -52,7 +52,7 @@ An url pointing to the external website of the project #### Defined in -[sdk/src/types/metadata.d.ts:45](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L45) +[sdk/src/types/metadata.d.ts:45](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/metadata.d.ts#L45) --- @@ -64,7 +64,7 @@ A URI pointing to a resource with mime type image/\* representing the asset to w #### Defined in -[sdk/src/types/metadata.d.ts:27](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L27) +[sdk/src/types/metadata.d.ts:27](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/metadata.d.ts#L27) --- @@ -76,7 +76,7 @@ Identifies the asset to which this token represents #### Defined in -[sdk/src/types/metadata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L15) +[sdk/src/types/metadata.d.ts:15](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/metadata.d.ts#L15) --- @@ -86,7 +86,7 @@ Identifies the asset to which this token represents #### Defined in -[sdk/src/types/metadata.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L40) +[sdk/src/types/metadata.d.ts:40](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/metadata.d.ts#L40) --- @@ -98,7 +98,7 @@ Describes the asset to which this token represents #### Defined in -[sdk/src/types/metadata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L35) +[sdk/src/types/metadata.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/metadata.d.ts#L35) --- @@ -110,4 +110,4 @@ The version of Hypercert schema used to describe this hypercert #### Defined in -[sdk/src/types/metadata.d.ts:31](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/metadata.d.ts#L31) +[sdk/src/types/metadata.d.ts:31](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/metadata.d.ts#L31) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md b/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md index 09435a74..0a4fc717 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertPointer.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:28](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L28) +[sdk/src/types/evaluation.d.ts:28](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L28) --- @@ -28,7 +28,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:30](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L30) +[sdk/src/types/evaluation.d.ts:30](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L30) --- @@ -38,4 +38,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:29](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L29) +[sdk/src/types/evaluation.d.ts:29](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L29) diff --git a/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md b/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md index 05c148bd..f8241e45 100644 --- a/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md +++ b/docs/docs/developer/api/sdk/interfaces/HypercertStorageInterface.md @@ -38,7 +38,7 @@ A Promise that resolves to the retrieved data. #### Defined in -[sdk/src/types/client.ts:108](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L108) +[sdk/src/types/client.ts:108](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L108) --- @@ -66,7 +66,7 @@ A Promise that resolves to the retrieved metadata. #### Defined in -[sdk/src/types/client.ts:101](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L101) +[sdk/src/types/client.ts:101](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L101) --- @@ -95,7 +95,7 @@ A Promise that resolves to the CID of the stored metadata. #### Defined in -[sdk/src/types/client.ts:87](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L87) +[sdk/src/types/client.ts:87](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L87) --- @@ -123,4 +123,4 @@ A Promise that resolves to the CID of the stored metadata. #### Defined in -[sdk/src/types/client.ts:94](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L94) +[sdk/src/types/client.ts:94](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L94) diff --git a/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md b/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md index 57e8d6aa..91e39e35 100644 --- a/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/IPFSEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:48](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L48) +[sdk/src/types/evaluation.d.ts:48](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L48) --- @@ -28,4 +28,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:47](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L47) +[sdk/src/types/evaluation.d.ts:47](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L47) diff --git a/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md b/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md index 705077f0..bdac63b3 100644 --- a/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md +++ b/docs/docs/developer/api/sdk/interfaces/SimpleTextEvaluation.md @@ -18,7 +18,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L35) +[sdk/src/types/evaluation.d.ts:35](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L35) --- @@ -28,7 +28,7 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:36](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L36) +[sdk/src/types/evaluation.d.ts:36](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L36) --- @@ -38,4 +38,4 @@ custom_edit_url: null #### Defined in -[sdk/src/types/evaluation.d.ts:34](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L34) +[sdk/src/types/evaluation.d.ts:34](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L34) diff --git a/docs/docs/developer/api/sdk/modules.md b/docs/docs/developer/api/sdk/modules.md index 2b9037b7..552b20b3 100644 --- a/docs/docs/developer/api/sdk/modules.md +++ b/docs/docs/developer/api/sdk/modules.md @@ -55,7 +55,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/types/hypercerts.ts:24](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/hypercerts.ts#L24) +[sdk/src/types/hypercerts.ts:24](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/hypercerts.ts#L24) --- @@ -80,7 +80,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:195](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L195) +[sdk/src/indexer/gql/graphql.ts:195](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/graphql.ts#L195) --- @@ -97,7 +97,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:1156](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1156) +[sdk/src/indexer/gql/graphql.ts:1156](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/graphql.ts#L1156) --- @@ -119,7 +119,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:208](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L208) +[sdk/src/indexer/gql/graphql.ts:208](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/graphql.ts#L208) --- @@ -136,7 +136,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:1205](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1205) +[sdk/src/indexer/gql/graphql.ts:1205](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/graphql.ts#L1205) --- @@ -153,7 +153,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:1196](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1196) +[sdk/src/indexer/gql/graphql.ts:1196](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/graphql.ts#L1196) --- @@ -170,7 +170,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:1177](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1177) +[sdk/src/indexer/gql/graphql.ts:1177](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/graphql.ts#L1177) --- @@ -187,7 +187,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/indexer/gql/graphql.ts:1118](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1118) +[sdk/src/indexer/gql/graphql.ts:1118](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/graphql.ts#L1118) --- @@ -197,7 +197,7 @@ Represents an entry in an allowlist. #### Defined in -[sdk/src/types/client.ts:17](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L17) +[sdk/src/types/client.ts:17](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L17) --- @@ -218,7 +218,7 @@ Represents a deployment of a contract on a specific network. #### Defined in -[sdk/src/types/client.ts:35](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L35) +[sdk/src/types/client.ts:35](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L35) --- @@ -234,7 +234,7 @@ Represents a deployment of a contract on a specific network. #### Defined in -[sdk/src/indexer/gql/gql.ts:53](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/gql.ts#L53) +[sdk/src/indexer/gql/gql.ts:53](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/gql.ts#L53) --- @@ -248,7 +248,7 @@ and run json-schema-to-typescript to regenerate this file. #### Defined in -[sdk/src/types/evaluation.d.ts:8](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L8) +[sdk/src/types/evaluation.d.ts:8](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L8) --- @@ -258,7 +258,7 @@ and run json-schema-to-typescript to regenerate this file. #### Defined in -[sdk/src/types/evaluation.d.ts:9](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/evaluation.d.ts#L9) +[sdk/src/types/evaluation.d.ts:9](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/evaluation.d.ts#L9) --- @@ -274,7 +274,7 @@ and run json-schema-to-typescript to regenerate this file. #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:5](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L5) +[sdk/src/indexer/gql/fragment-masking.ts:5](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/fragment-masking.ts#L5) --- @@ -286,7 +286,7 @@ Configuration options for the Hypercert client. #### Defined in -[sdk/src/types/client.ts:47](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L47) +[sdk/src/types/client.ts:47](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L47) --- @@ -304,7 +304,7 @@ The props for the Hypercert client. #### Defined in -[sdk/src/types/client.ts:114](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L114) +[sdk/src/types/client.ts:114](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L114) --- @@ -320,7 +320,7 @@ The signer is required for submitting evaluations. #### Defined in -[sdk/src/types/client.ts:74](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L74) +[sdk/src/types/client.ts:74](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L74) --- @@ -342,7 +342,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/client.ts:65](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L65) +[sdk/src/types/client.ts:65](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L65) --- @@ -352,7 +352,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/errors.ts:195](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/errors.ts#L195) +[sdk/src/types/errors.ts:195](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/errors.ts#L195) --- @@ -374,7 +374,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/indexer.ts:10](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/indexer.ts#L10) +[sdk/src/types/indexer.ts:10](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/indexer.ts#L10) --- @@ -391,7 +391,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/indexer/gql/graphql.ts:1138](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/graphql.ts#L1138) +[sdk/src/indexer/gql/graphql.ts:1138](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/graphql.ts#L1138) --- @@ -401,7 +401,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/client.ts:10](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L10) +[sdk/src/types/client.ts:10](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L10) --- @@ -419,7 +419,7 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/client.ts:11](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/client.ts#L11) +[sdk/src/types/client.ts:11](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/client.ts#L11) --- @@ -429,9 +429,9 @@ The API tokens are optional, but required for storing data on NFT.storage and We #### Defined in -[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/hypercerts.ts#L9) +[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/hypercerts.ts#L9) -[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/hypercerts.ts#L15) +[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/hypercerts.ts#L15) ## Variables @@ -581,9 +581,9 @@ Represents the possible transfer restrictions of a claim matching the hypercerts #### Defined in -[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/hypercerts.ts#L9) +[sdk/src/types/hypercerts.ts:9](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/hypercerts.ts#L9) -[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/types/hypercerts.ts#L15) +[sdk/src/types/hypercerts.ts:15](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/types/hypercerts.ts#L15) --- @@ -597,7 +597,7 @@ Represents the possible transfer restrictions of a claim matching the hypercerts #### Defined in -[sdk/src/constants.ts:12](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/constants.ts#L12) +[sdk/src/constants.ts:12](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/constants.ts#L12) --- @@ -607,7 +607,7 @@ Represents the possible transfer restrictions of a claim matching the hypercerts #### Defined in -[sdk/src/constants.ts:18](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/constants.ts#L18) +[sdk/src/constants.ts:18](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/constants.ts#L18) --- @@ -626,7 +626,7 @@ Represents the possible transfer restrictions of a claim matching the hypercerts #### Defined in -[sdk/src/utils/logger.ts:24](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/logger.ts#L24) +[sdk/src/utils/logger.ts:24](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/logger.ts#L24) ## Functions @@ -665,7 +665,7 @@ Formats input data to an object containing HypercertMetadata including appropria #### Defined in -[sdk/src/utils/formatter.ts:27](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/formatter.ts#L27) +[sdk/src/utils/formatter.ts:27](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/formatter.ts#L27) --- @@ -753,7 +753,7 @@ This method is a wrapper around basic viem utilties to parse ClaimStored(uint256 #### Defined in -[sdk/src/utils/txParser.ts:26](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/txParser.ts#L26) +[sdk/src/utils/txParser.ts:26](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/txParser.ts#L26) --- @@ -787,7 +787,7 @@ Will throw a `StoragjeError` if the data cannot be fetched from either gateway. #### Defined in -[sdk/src/utils/fetchers.ts:17](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/fetchers.ts#L17) +[sdk/src/utils/fetchers.ts:17](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/fetchers.ts#L17) --- @@ -822,7 +822,7 @@ Will throw an error if the Merkle tree cannot be fetched. #### Defined in -[sdk/src/utils/allowlist.ts:43](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/allowlist.ts#L43) +[sdk/src/utils/allowlist.ts:43](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/allowlist.ts#L43) --- @@ -861,7 +861,7 @@ Please regenerate the types. #### Defined in -[sdk/src/indexer/gql/gql.ts:34](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/gql.ts#L34) +[sdk/src/indexer/gql/gql.ts:34](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/gql.ts#L34) ▸ **graphql**(`source`): typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery RecentClaims($orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claims(orderDirection: $orderDirection, orderBy: creation, first: $first) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}\n\nquery ClaimById($id: ID!) {\n claim(id: $id) {\n contract\n tokenID\n creator\n id\n owner\n totalUnits\n uri\n }\n}"``] @@ -879,7 +879,7 @@ typeof `documents`[``"query ClaimsByOwner($owner: Bytes = \"\", $orderDirection: #### Defined in -[sdk/src/indexer/gql/gql.ts:39](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/gql.ts#L39) +[sdk/src/indexer/gql/gql.ts:39](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/gql.ts#L39) ▸ **graphql**(`source`): typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {owner: $owner}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}\n\nquery ClaimTokensByClaim($claimId: String!, $orderDirection: OrderDirection, $first: Int, $skip: Int) {\n claimTokens(\n where: {claim: $claimId}\n skip: $skip\n first: $first\n orderDirection: $orderDirection\n ) {\n id\n owner\n tokenID\n units\n }\n}\n\nquery ClaimTokenById($claimTokenId: ID!) {\n claimToken(id: $claimTokenId) {\n id\n owner\n tokenID\n units\n claim {\n id\n creation\n uri\n totalUnits\n }\n }\n}"``] @@ -897,7 +897,7 @@ typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirec #### Defined in -[sdk/src/indexer/gql/gql.ts:45](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/gql.ts#L45) +[sdk/src/indexer/gql/gql.ts:45](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/gql.ts#L45) --- @@ -917,7 +917,7 @@ typeof `documents`[``"query ClaimTokensByOwner($owner: Bytes = \"\", $orderDirec #### Defined in -[sdk/src/utils/errors.ts:39](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/errors.ts#L39) +[sdk/src/utils/errors.ts:39](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/errors.ts#L39) --- @@ -939,7 +939,7 @@ Method to catch errors and log them #### Defined in -[sdk/src/utils/errors.ts:22](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/errors.ts#L22) +[sdk/src/utils/errors.ts:22](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/errors.ts#L22) --- @@ -968,7 +968,7 @@ data is [TFrag] extends [Object] ? TKey extends string ? Object : never : never #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:51](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L51) +[sdk/src/indexer/gql/fragment-masking.ts:51](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/fragment-masking.ts#L51) --- @@ -996,7 +996,7 @@ data is [TFrag] extends [Object] ? TKey extends string ? Object : never : never #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:45](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L45) +[sdk/src/indexer/gql/fragment-masking.ts:45](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/fragment-masking.ts#L45) --- @@ -1016,7 +1016,7 @@ data is [TFrag] extends [Object] ? TKey extends string ? Object : never : never #### Defined in -[sdk/src/utils/allowlist.ts:6](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/allowlist.ts#L6) +[sdk/src/utils/allowlist.ts:6](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/allowlist.ts#L6) --- @@ -1106,7 +1106,7 @@ An ethers.js `Provider` instance, or `undefined` if no chain is found in the `Pu #### Defined in -[sdk/src/utils/adapters.ts:19](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/adapters.ts#L19) +[sdk/src/utils/adapters.ts:19](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/adapters.ts#L19) --- @@ -1130,7 +1130,7 @@ The response data from the API. #### Defined in -[sdk/src/utils/apis.ts:49](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/apis.ts#L49) +[sdk/src/utils/apis.ts:49](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/apis.ts#L49) --- @@ -1154,7 +1154,7 @@ The response data from the API. #### Defined in -[sdk/src/utils/apis.ts:33](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/apis.ts#L33) +[sdk/src/utils/apis.ts:33](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/apis.ts#L33) --- @@ -1181,7 +1181,7 @@ The response data from the API. #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:15](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L15) +[sdk/src/indexer/gql/fragment-masking.ts:15](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/fragment-masking.ts#L15) ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `TType` \| `null` \| `undefined` @@ -1204,7 +1204,7 @@ The response data from the API. #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:20](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L20) +[sdk/src/indexer/gql/fragment-masking.ts:20](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/fragment-masking.ts#L20) ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> @@ -1227,7 +1227,7 @@ The response data from the API. #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:25](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L25) +[sdk/src/indexer/gql/fragment-masking.ts:25](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/fragment-masking.ts#L25) ▸ **useFragment**<`TType`\>(`_documentNode`, `fragmentType`): `ReadonlyArray`<`TType`\> \| `null` \| `undefined` @@ -1250,7 +1250,7 @@ The response data from the API. #### Defined in -[sdk/src/indexer/gql/fragment-masking.ts:30](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/indexer/gql/fragment-masking.ts#L30) +[sdk/src/indexer/gql/fragment-masking.ts:30](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/indexer/gql/fragment-masking.ts#L30) --- @@ -1278,7 +1278,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -[sdk/src/validator/index.ts:108](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L108) +[sdk/src/validator/index.ts:108](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/validator/index.ts#L108) --- @@ -1306,7 +1306,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -[sdk/src/validator/index.ts:77](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L77) +[sdk/src/validator/index.ts:77](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/validator/index.ts#L77) --- @@ -1334,7 +1334,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -[sdk/src/validator/index.ts:143](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L143) +[sdk/src/validator/index.ts:143](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/validator/index.ts#L143) --- @@ -1362,7 +1362,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -[sdk/src/validator/index.ts:46](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L46) +[sdk/src/validator/index.ts:46](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/validator/index.ts#L46) --- @@ -1390,7 +1390,7 @@ An object that includes a validity flag and any errors that occurred during vali #### Defined in -[sdk/src/validator/index.ts:173](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L173) +[sdk/src/validator/index.ts:173](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/validator/index.ts#L173) --- @@ -1422,7 +1422,7 @@ Will throw a `MintingError` if the signer address is invalid or if the Merkle pr #### Defined in -[sdk/src/validator/index.ts:205](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L205) +[sdk/src/validator/index.ts:205](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/validator/index.ts#L205) --- @@ -1454,7 +1454,7 @@ Will throw a `MintingError` if the lengths of the input arrays are not equal or #### Defined in -[sdk/src/validator/index.ts:228](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/validator/index.ts#L228) +[sdk/src/validator/index.ts:228](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/validator/index.ts#L228) --- @@ -1513,4 +1513,4 @@ An ethers.js `Signer` instance, or `undefined` if no chain is found in the `Wall #### Defined in -[sdk/src/utils/adapters.ts:51](https://github.com/hypercerts-org/hypercerts/blob/d4ff8ba/sdk/src/utils/adapters.ts#L51) +[sdk/src/utils/adapters.ts:51](https://github.com/hypercerts-org/hypercerts/blob/15d38fc/sdk/src/utils/adapters.ts#L51) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 810246db..6d4c8bec 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -54,6 +54,13 @@ export default async function createConfigAsync() { { blog: false, // Optional: disable the blog plugin docs: { + lastVersion: "current", //https://docusaurus.io/docs/versioning + versions: { + current: { + label: "1.4.1", + path: "1.4.1", + }, + }, routeBasePath: "/", // Serve the docs at the site's root sidebarPath: "./sidebars.js", // Please change this to your repo. diff --git a/docs/sidebars.js b/docs/sidebars.js index fe6dec32..9b098caa 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -14,6 +14,17 @@ /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ const sidebars = { mySidebar: [ + { + type: "category", + label: "Announcements", + collapsed: true, + items: [ + { + type: "autogenerated", + dirName: "announcements", + }, + ], + }, { type: "doc", id: "intro", diff --git a/docs/versioned_docs/static b/docs/versioned_docs/static deleted file mode 120000 index 4dab1644..00000000 --- a/docs/versioned_docs/static +++ /dev/null @@ -1 +0,0 @@ -../static \ No newline at end of file diff --git a/docs/versioned_docs/static/.nojekyll b/docs/versioned_docs/static/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/docs/versioned_docs/static/img/creating.png b/docs/versioned_docs/static/img/creating.png new file mode 100644 index 0000000000000000000000000000000000000000..17807cd3c2541cc4dbfa780c4ed9476b62eff03d GIT binary patch literal 6616 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 literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/static/img/docusaurus.png b/docs/versioned_docs/static/img/docusaurus.png new file mode 100644 index 0000000000000000000000000000000000000000..f458149e3c8f53335f28fbc162ae67f55575c881 GIT binary patch literal 5142 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 F{0H{b<4^zq literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/static/img/favicon.ico b/docs/versioned_docs/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..576d606a2afa84404d8fbc627efe115c31950ac1 GIT binary patch literal 15086 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 H4}Jd!<{(Qx literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/static/img/hypercert_data_layer.png b/docs/versioned_docs/static/img/hypercert_data_layer.png new file mode 100644 index 0000000000000000000000000000000000000000..6978885fb12df9bcdc87ea6017a3f5f7d3a23ffd GIT binary patch literal 140253 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 z

      JrX_jhZ7>mDIqlan=51pm^`f`9cRIz|&D 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/static/img/hypercert_example.png b/docs/versioned_docs/static/img/hypercert_example.png new file mode 100644 index 0000000000000000000000000000000000000000..be9b915510146686c2247c8e264fc8baa6940904 GIT binary patch literal 166342 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ν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
    1. 948bLPL(g{K@#uJ=#5ZOz5aa&%MwrOw4 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%0D$#=`w%^KoB&ABu+ls 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

      Szo`-pj2UyLw673i#~*%x*fRC{{AYke;Tjk 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 MI7`#BCX0Oj4`!HZd;kCd literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/static/img/icons/beige.svg b/docs/versioned_docs/static/img/icons/beige.svg new file mode 100644 index 00000000..65376c72 --- /dev/null +++ b/docs/versioned_docs/static/img/icons/beige.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/versioned_docs/static/img/icons/github-mark.png b/docs/versioned_docs/static/img/icons/github-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb3b705d018006a2bd4200ea94c9d5fb98b6f76 GIT binary patch literal 6393 zcmVt<80drDELIAGL9O(c600d`2O+f$vv5yP-FqK~#7F?VZ1K z8%LJM-y1+@%G#>M+FpAVnW`o4Nbi;iWtR!eHnW`VMWV9HBxRS0%r2Ak7l_I(6B%A4 zD7(xpP8tI` zdHy`?5l{yN>>KPGsz|ZXCE-ZDiK)^X8v1-3TH^jQySG$v&`|AtmZg`gi-nX%J z7Zy5SAmAKW`E$ENgXn!GzMm+=lnn~af|8xilo%}x&loDj(xH!snajcMPvf9w#*g3!jy z56`}%yzuW&oq*jr?(5NQGQ3ToIb=y8%A^_qcYvnI*yz@@$>%af^f0AO< zy3oTc^Ar29O#q}Pv{~v8w7S$P1? zQff=eP!$79vdX^NQdNa`7i7(nwZwn5$*pfSCAZWFcxCPCJ!1ZM0w7=h^2XcmkWFqq zBL%1s@KC(l1VABhM~jHP7qB}fV*WP*pip#(*lPi=zPItnzL5V)0F(lE-hBHH%T~nu zQF|k(yMz$IFjem(P zZv+hS0v-4zVlMcs(-OzD>y&c}9|4+#KWoN&OKN1ueH zw&^MLGK1VIk}etqfIeEXcHJ5-kS9h#vP(DU5qmv$DP+ z0`5?m6ci8VE?}R|d;2f>cWKV+&d0XU9qVqt4|lr=xXS@OKKqXL(!5_Q>+L%>IJ!?I zQq=iy?gAd(?e$>T81GxRW}&vBZZle<8`hNHgH_HLYi*6;$82ct`1xX%Yq@Phq94pR zR5pQmaQw+fcPU456|hf7MoHY~IIOO_+9$|;|JegjZSAj?77T6xSY?;WP*jM0y zua$A}T83rWbL9K6LkWostx)Zo5?V1G*yr`86)Y5i%er5pWqTgJ%}&CX^#u1QL$Vj}`o52uyou~H@imYvSm zIYusH3u=jEqRB^$xt&!ryi5cv)|UYA5KoJ1T3KmkVFCMWeF5+l(M%Rrcwqs<`T~%S zGhRFvUP!>Oz5t|$$=qD@qQgQ0hV=ztAr{U^rxvjD-;D?NE$3ixsi4+)e_z{Xq!+Qm zsRcY}P)EaM_JHZP1Zs)gNFx7P$O@--p(7pcv!VEf_n=x__)bT+6gKH^t)&vM+_KTq zN`~P=*OsWMV~vWIT>GgMq!KV^c+WL&5$zDD1#*#J8ts!#T1njK*aFt-K0EOm-Yly% zD<}uogW9mlO*@Gj9p8mk>OMyUz63nWo0UQw2OPc=m<{g#1#B8h&VTjwIs%^I zTF@$3M`u$)+KB?@hMKvmJpy1sG_0c_NMeDFlHuJA!uc;)7$*LbJZG9FrwLev3*GF) z0)xeg$bUmHO_RZtFRBpm=_xEQSR7{m*HOUq+lgPF^hJAc{4OZ~C6pi&j0y|9Jn8F+ z2YdriH8@b<$+3y=LbK8-gaA|(P7(tH0CX@p24)>eECA|)p(GYq$uSZDS)ioup?WTK zoY^q|R2kI*o>t%uKwUr*3)CJhm4}m1E#Q6=$6a7?v{W8WLbZU+04_9G94(cHlTa<- zX;-WONQB~J)5!u>P~0tOx%LRWXPNwGq9!MoQYt9!7MMt_>jOMOK@y9T2v`f&0{@Nx zSO6{k-=;CGlv0TWR?@o~c#D?)Z-%%x>Fd)$0j(KwXsEGpB&?9IJ)jKFC7cD0lk)dxVeSNY8RuTgXQ3L^lh3Jq1rfG7T zfP16_>jGUT08+5B*6xrJlDW{4A{W|F8;LBC3PlMllSIH5jINQL&ELR{25Hday-h2w znkeAYC0+fN&46wY07+pT@vm_7NjTA{P86_~flnh42ZN-z_*c(8;Hd_6YAL0bYAgrh zV2}{Iz7=_GJT;`9DquFOYW8mPB5e@>F$u`LPfD0I2RoSYBvpwlQuKy^auN60C>mZc zE1aDr;2!Csv-&69H%mY{T~dZI$VP)07(Ll%q5pp=1T2|oEuA@j z!kF7gW`S8)FKtVk`#ft3=j;ppMx7OIHD9MY1i&;RbB`2ZXm&Drj(~M#q6Id};u}yH z+N`gGXD5^Awbbd7GUN@CH;Mpw6=l}f5zN-$Oab?ov>hd#Vua?)D}g1FUjP%-CdznD(Sy{V!PowpXqrEt7WxJ%4 zR-ery0=33%;>_EmlkU84m@8n71s!8_R@U2arEAQ9%~Mj!;AI8^c5$#?D{L|MP-0n6 zR@SfH*XTN*!`*rDuMlrCgVs3soR&>sJV92vUaYQPy=_IH+56g$^G$I_t8_^*vI{pa znkNKmfp}a-Z`|wPAfD!!VzTny#y5&O7)&NG4~{?i=q`cEB1tQWd-b}`=k?D=hX+^U zd~fXGW;Uh$n6wk|ot5{l>N^hvv8aN09n9Uh-x^!MY-o?FfZ=V3xO!AZycQEsY-1VQ zg%&E|Mvs6yT^ZadgH2RcLA*)aXCcvi;7YjBBgCCv-}n&KTDtk;di#bk)v&yd1n#qt zNWhhGqkpC?ZWlzX6Dg5ovZo7G@d_!K`z$1Kp@r4;jV~&*+l|9!`}ot3b_jTnY`DWR z*$!2Rr0%nj$N~$Ma-+wQoAEXkW|GTa17UrH{hM4Pr_XSrQwc;0&~xpsyFWE z{o}(haaYyE7TA%()N4cHd=r^R67!=)Pw|LwSKr%sBpy-q#YEdjxVpTxA-#?in4b32Bm7Bbt7iYYK571jz0~zlRRa0&APV*3V9r7m6^IG;K#=whg|}( zaYsQ7x?wj(nQ7Ibnj&lH>?L1|bN6@3^V74k*51z83U`kW4>lzrGn_V%xvn@X`x|Q0AhLqxj{OpvERfhN-aYy>yhSNlNWjht|6snMELotS zLaea~%zYn@8DwX56CMM8Cfx<4J!slpRwFLVX;8;R(FO!Nou=U{i{w-m60oqk-rhBo z@ic@5MC|#k6tT)y#3tk*I512-&B7L|y0k>CGp05NHo<7jhRqna?W$U?>RD};ENXq- z-$4s9ENlCMvL-MO`ridRX%@HAt7UurmwZcunB@WiODQ8nx)6(6U!g$@^3_)_PTu_e zWl4c&>mnKc=f(y4>+ddK{_>mudGS2SQ{{Jh`>o6S*22lbxc7@p+->`2{>$-k_<|Jh z%~vm;zwzefi}n}q5J-hs-_H)ih0Br`w!lJeR(J?A?KUFbNxECP-bltg_1aR{E>|93nl#jp2ooFm=NfD@Bx< zQOQiet^s_MuTVxJPTJ#n@S22YNyU_q>K-a<*! zfQ4a!f0yz`n$pS5l?3>cbm8jVXo3}<1MeL@&;D+C<^mR)1-Yv{FprYN!@juE zY?3uD)48@C))tT#b{PfD3h32g$EAT1&iLhKQxp2vrp2!{GBF z;14KAaucv1?rK3r6rD7Et4b1amnw>E+NjL>8Cm;z-wV%Gz(P?)6ecqF(+u$*ig>fA zg%<=>U*M{T!Doi7r@>3wrku%Lzy-R}t>){LY9hOM3JoXXypu58t$L>px#LWLWIYve zH8ght3x#EVjk%r13Ja20Iywxu953aIRVBU;QX5kYXCb z^W7{i2#h*kT8nZsX&YO+0rVoGeHjMVKdo0Q9e3HEl9jqv3+@)VQKxS!o92gESK7_B z$@PA&>vFiTfQLKiu6($LY)h_HjC{20uJ`UQej?GAL(3DMeMh}I3HDWjKJ`qYtI8kF z+agn;g+hf|U}0sgE&ZIIQl2!dyNWiirI2@X2cIzm{^0Y^itQC%NDMrVi-+?*x*25K za2|lU*toZ7@d||tSa3%-`Q8lbB(2T@AT`W;c~)D^q7(rOx!(+e6$S+$Yq zr3qNhha348P;^$-+o{fl0f@tBmRFfc%hCiaxJ<9qisp6=&D@784RXV--LfyHlqz6B zDw8e~m+i|$VI#Ao#7Q*^!~ zn&_v$=amOQ4RTcEVa)p~-X*anQC0^@P*Xh2Hcvx^fCVSwk{hyvI>2|eh*wY}U}4yh zeG?-*K;}sAGQ+pD&1+UAU_lxJG$X!-{=*JlY`0nS2;T`QAMAZve zkmMHPVh{%x?*@ELTe4~zl@PEXZqV6le665iYN?RwECS`hym$7JuT^QhO{H3JOP?+K z>CWm}JCw?;VMP@vkiL(vxrA576=zh!>W)(x3p|b-2NW}`4EPVbW5=qv%&$_}AsEBV z;+D0>U0CB9GP1fA74C>iTHtYDjq6CYt?oFr7()eXToYC| z4_B1&JzuGlc!gRCc!U&xWIo6nlmyGLyv-^UWu&2&0v5!rmTn8&=WD2`)`u(FvBH&M z+HT@yO{uMbM;sl6q105%RWej^DPVZ*PeP$O3wK2A1w3LDA4ABVGE7iOoU8HLUtZKA z3!Q}F;@Gtr>n+1{)22r{1WMz)!Js6lXt$0r?mQsiDU5`?vexb})0QE#aC=*hs&Co* zOB6PLpbU`Y6v+&tE`h0d-&WQaq+RNOY1>-l>uJxCCG%Z}2J$QG8&B=04khK>O%~xk zM0^_$2sj0)+-pUh4i`nd7Gm=>{xdkVqTTPG(gV23$$)?tK& zNi|~SpW1gQF!!f^gSEEC@MAW#2Wy)i2sk6e>R78Rjo{Bazq=nlQEO zPIhAR2|W|hV{2_gSX%%900000000000000000000;FtVA#ht2v8mJ-W00000NkvXX Hu0mjfZ$b4` literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/static/img/icons/green.svg b/docs/versioned_docs/static/img/icons/green.svg new file mode 100644 index 00000000..d23f2ee0 --- /dev/null +++ b/docs/versioned_docs/static/img/icons/green.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/versioned_docs/static/img/icons/hypercerts_logo_beige.png b/docs/versioned_docs/static/img/icons/hypercerts_logo_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..eac7eefb785c1c8dc18d285e0cfef2349b7e6958 GIT binary patch literal 26553 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 Dw2)Cc literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/static/img/icons/hypercerts_logo_yellow.png b/docs/versioned_docs/static/img/icons/hypercerts_logo_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..c83726fb771e8aff3ac8a909536fd38d5c751d82 GIT binary patch literal 27098 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 z + + diff --git a/docs/versioned_docs/static/img/icons/yellow.svg b/docs/versioned_docs/static/img/icons/yellow.svg new file mode 100644 index 00000000..cbe666e7 --- /dev/null +++ b/docs/versioned_docs/static/img/icons/yellow.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/versioned_docs/static/img/increasing_rewards.png b/docs/versioned_docs/static/img/increasing_rewards.png new file mode 100644 index 0000000000000000000000000000000000000000..6d6e6ca0ecb09bb5e0926ce438689b04a7664b78 GIT binary patch literal 9721 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 literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/static/img/logo.svg b/docs/versioned_docs/static/img/logo.svg new file mode 100644 index 00000000..9db6d0d0 --- /dev/null +++ b/docs/versioned_docs/static/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/versioned_docs/static/img/merging.png b/docs/versioned_docs/static/img/merging.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae1679f7790fdab68900e077d9a2a1c9ba53855 GIT binary patch literal 7467 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 literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/static/img/splitting.png b/docs/versioned_docs/static/img/splitting.png new file mode 100644 index 0000000000000000000000000000000000000000..19c15a313569e73f6a52ed80a3fe78be49afcee4 GIT binary patch literal 11673 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 + Easy to Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/versioned_docs/static/img/undraw_docusaurus_react.svg b/docs/versioned_docs/static/img/undraw_docusaurus_react.svg new file mode 100644 index 00000000..94b5cf08 --- /dev/null +++ b/docs/versioned_docs/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,170 @@ + + Powered by React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/versioned_docs/static/img/undraw_docusaurus_tree.svg b/docs/versioned_docs/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 00000000..d9161d33 --- /dev/null +++ b/docs/versioned_docs/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1,40 @@ + + Focus on What Matters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/versioned_docs/static/pdf/hypercerts_Tech_Report_draft.pdf b/docs/versioned_docs/static/pdf/hypercerts_Tech_Report_draft.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3f5f6fc349c17e4841c3ab835e16221c32004dfd GIT binary patch literal 209344 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 literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/static/pdf/hypercerts_slides_FtC202203.pdf b/docs/versioned_docs/static/pdf/hypercerts_slides_FtC202203.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0ea059ce0f1a5e1a50aeda026e32e5070675fbd4 GIT binary patch literal 599063 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 z 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 foE-dFuY?hp9C3kKGI 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%0AE?bUkRuxH6^@h}|oppX9Sxb`+sY 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∋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

    M(Vh4`nG!y+H(|BdL{ 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�u7Gy3W1y|GM5E&X4yvQ#Z%-bM(5ID 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